data-table-context.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. 'use client';
  2. import { useUserSettings } from '@/vdb/hooks/use-user-settings.js';
  3. import { ColumnFiltersState, SortingState, Table } from '@tanstack/react-table';
  4. import React, { createContext, ReactNode, useContext } from 'react';
  5. export type ColumnConfig = { columnOrder: string[]; columnVisibility: Record<string, boolean> };
  6. interface DataTableContextValue {
  7. columnFilters: ColumnFiltersState;
  8. setColumnFilters: React.Dispatch<React.SetStateAction<ColumnFiltersState>>;
  9. searchTerm: string;
  10. setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
  11. sorting: SortingState;
  12. setSorting: React.Dispatch<React.SetStateAction<SortingState>>;
  13. pageId?: string;
  14. onFilterChange?: (table: Table<any>, filters: ColumnFiltersState) => void;
  15. onSearchTermChange?: (searchTerm: string) => void;
  16. onRefresh?: () => void;
  17. isLoading?: boolean;
  18. table?: Table<any>;
  19. handleApplyView: (filters: ColumnFiltersState, columnConfig: ColumnConfig, searchTerm?: string) => void;
  20. }
  21. const DataTableContext = createContext<DataTableContextValue | undefined>(undefined);
  22. export interface DataTableProviderProps {
  23. children: ReactNode;
  24. columnFilters: ColumnFiltersState;
  25. setColumnFilters: React.Dispatch<React.SetStateAction<ColumnFiltersState>>;
  26. searchTerm: string;
  27. setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
  28. sorting: SortingState;
  29. setSorting: React.Dispatch<React.SetStateAction<SortingState>>;
  30. pageId?: string;
  31. onFilterChange?: (table: Table<any>, filters: ColumnFiltersState) => void;
  32. onSearchTermChange?: (searchTerm: string) => void;
  33. onRefresh?: () => void;
  34. isLoading?: boolean;
  35. table?: Table<any>;
  36. }
  37. export function DataTableProvider({
  38. children,
  39. columnFilters,
  40. setColumnFilters,
  41. searchTerm,
  42. setSearchTerm,
  43. sorting,
  44. setSorting,
  45. pageId,
  46. onFilterChange,
  47. onSearchTermChange,
  48. onRefresh,
  49. isLoading,
  50. table,
  51. }: DataTableProviderProps) {
  52. const { setTableSettings } = useUserSettings();
  53. const handleApplyView = (
  54. filters: ColumnFiltersState,
  55. columnConfig: ColumnConfig,
  56. viewSearchTerm?: string,
  57. ) => {
  58. setColumnFilters(filters);
  59. if (viewSearchTerm !== undefined && onSearchTermChange) {
  60. setSearchTerm(viewSearchTerm);
  61. onSearchTermChange(viewSearchTerm);
  62. }
  63. if (onFilterChange && table) {
  64. onFilterChange(table, filters);
  65. }
  66. if (pageId && columnConfig.columnOrder) {
  67. setTableSettings(pageId, 'columnOrder', columnConfig.columnOrder);
  68. }
  69. if (pageId && columnConfig.columnVisibility) {
  70. setTableSettings(pageId, 'columnVisibility', columnConfig.columnVisibility);
  71. }
  72. };
  73. const value: DataTableContextValue = {
  74. columnFilters,
  75. setColumnFilters,
  76. searchTerm,
  77. setSearchTerm,
  78. sorting,
  79. setSorting,
  80. pageId,
  81. onFilterChange,
  82. onSearchTermChange,
  83. onRefresh,
  84. isLoading,
  85. table,
  86. handleApplyView,
  87. };
  88. return <DataTableContext.Provider value={value}>{children}</DataTableContext.Provider>;
  89. }
  90. export function useDataTableContext() {
  91. const context = useContext(DataTableContext);
  92. if (context === undefined) {
  93. throw new Error('useDataTableContext must be used within a DataTableProvider');
  94. }
  95. return context;
  96. }