| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 'use client';
- import { useUserSettings } from '@/vdb/hooks/use-user-settings.js';
- import { ColumnFiltersState, SortingState, Table } from '@tanstack/react-table';
- import React, { createContext, ReactNode, useContext } from 'react';
- export type ColumnConfig = { columnOrder: string[]; columnVisibility: Record<string, boolean> };
- interface DataTableContextValue {
- columnFilters: ColumnFiltersState;
- setColumnFilters: React.Dispatch<React.SetStateAction<ColumnFiltersState>>;
- searchTerm: string;
- setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
- sorting: SortingState;
- setSorting: React.Dispatch<React.SetStateAction<SortingState>>;
- pageId?: string;
- onFilterChange?: (table: Table<any>, filters: ColumnFiltersState) => void;
- onSearchTermChange?: (searchTerm: string) => void;
- onRefresh?: () => void;
- isLoading?: boolean;
- table?: Table<any>;
- handleApplyView: (filters: ColumnFiltersState, columnConfig: ColumnConfig, searchTerm?: string) => void;
- }
- const DataTableContext = createContext<DataTableContextValue | undefined>(undefined);
- export interface DataTableProviderProps {
- children: ReactNode;
- columnFilters: ColumnFiltersState;
- setColumnFilters: React.Dispatch<React.SetStateAction<ColumnFiltersState>>;
- searchTerm: string;
- setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
- sorting: SortingState;
- setSorting: React.Dispatch<React.SetStateAction<SortingState>>;
- pageId?: string;
- onFilterChange?: (table: Table<any>, filters: ColumnFiltersState) => void;
- onSearchTermChange?: (searchTerm: string) => void;
- onRefresh?: () => void;
- isLoading?: boolean;
- table?: Table<any>;
- }
- export function DataTableProvider({
- children,
- columnFilters,
- setColumnFilters,
- searchTerm,
- setSearchTerm,
- sorting,
- setSorting,
- pageId,
- onFilterChange,
- onSearchTermChange,
- onRefresh,
- isLoading,
- table,
- }: DataTableProviderProps) {
- const { setTableSettings } = useUserSettings();
- const handleApplyView = (
- filters: ColumnFiltersState,
- columnConfig: ColumnConfig,
- viewSearchTerm?: string,
- ) => {
- setColumnFilters(filters);
- if (viewSearchTerm !== undefined && onSearchTermChange) {
- setSearchTerm(viewSearchTerm);
- onSearchTermChange(viewSearchTerm);
- }
- if (onFilterChange && table) {
- onFilterChange(table, filters);
- }
- if (pageId && columnConfig.columnOrder) {
- setTableSettings(pageId, 'columnOrder', columnConfig.columnOrder);
- }
- if (pageId && columnConfig.columnVisibility) {
- setTableSettings(pageId, 'columnVisibility', columnConfig.columnVisibility);
- }
- };
- const value: DataTableContextValue = {
- columnFilters,
- setColumnFilters,
- searchTerm,
- setSearchTerm,
- sorting,
- setSorting,
- pageId,
- onFilterChange,
- onSearchTermChange,
- onRefresh,
- isLoading,
- table,
- handleApplyView,
- };
- return <DataTableContext.Provider value={value}>{children}</DataTableContext.Provider>;
- }
- export function useDataTableContext() {
- const context = useContext(DataTableContext);
- if (context === undefined) {
- throw new Error('useDataTableContext must be used within a DataTableProvider');
- }
- return context;
- }
|