11import { getCoreRowModel , getFilteredRowModel , getPaginationRowModel , getSortedRowModel , useReactTable } from "@tanstack/react-table" ;
2- import { useReactDataTableState } from "../useReactDataTableState/useReactDataTableState" ;
2+ import { useReactDataTableState , useReactDataTableStateProps } from "../useReactDataTableState/useReactDataTableState" ;
33import Skeleton from "react-loading-skeleton" ;
44import { useReactDataTableProps } from "./useReactDataTableProps" ;
55import { useReactDataTableResult } from "./useReactDataTableResult" ;
6+ import { getColumnFilterFromModel } from "../utils/getColumnFilterFromModel" ;
7+ import { FilterModel } from "../types/TableState" ;
8+ import { getModelFromColumnFilter } from "../utils/getModelFromColumnFilter" ;
9+ import { getSortingStateFromModel } from "../utils/getSortingStateFromModel" ;
10+ import { getModelFromSortingState } from "../utils/getModelFromSortingState" ;
11+ import { OptionalNullable } from "../types/NullableTypes" ;
612
713/**
814 * A react hook that returns a react table instance and the state of the table
915 */
10- const useReactDataTable = < TData , > ( props : useReactDataTableProps < TData > ) : useReactDataTableResult < TData > => {
16+ const useReactDataTable = < TData , TFilter extends FilterModel = Record < string , never > > (
17+ props : useReactDataTableProps < TData , TFilter > ,
18+ ) : useReactDataTableResult < TData , TFilter > => {
1119 const {
1220 data = [ ] ,
1321 columns,
@@ -32,11 +40,11 @@ const useReactDataTable = <TData,>(props: useReactDataTableProps<TData>): useRea
3240 setColumnFilters : setColumnFiltersInternal ,
3341 setPagination : setPaginationInternal ,
3442 setSorting : setSortingInternal ,
35- } = useReactDataTableState ( {
36- initialColumnFilters : columnFiltersInitial ,
43+ } = useReactDataTableState < TData , TFilter > ( {
44+ initialColumnFilters : columnFiltersInitial as TFilter ,
3745 initialPagination : paginationInitial ,
3846 initialSorting : sortingInitial ,
39- } ) ;
47+ } as unknown as OptionalNullable < useReactDataTableStateProps < TData , TFilter > > ) ;
4048
4149 const effectiveColumnFilters = columnFiltersExternal ?? columnFiltersInternal ;
4250 const effectivePagination = paginationExternal ?? paginationInternal ;
@@ -45,7 +53,7 @@ const useReactDataTable = <TData,>(props: useReactDataTableProps<TData>): useRea
4553 const effectiveOnPaginationChange = onPaginationChange ?? setPaginationInternal ;
4654 const effectiveOnSortingChange = onSortingChange ?? setSortingInternal ;
4755
48- // If we active the manual filtering, we have to unset the filterfunction , else it still does automatic filtering
56+ // If we active the manual filtering, we have to unset the filter function , else it still does automatic filtering
4957 if ( manualFiltering ) columns . forEach ( ( x ) => ( x . filterFn = undefined ) ) ;
5058
5159 const internalColumns = columns . filter ( ( x ) => x . meta ?. isHidden !== true ) ;
@@ -60,22 +68,32 @@ const useReactDataTable = <TData,>(props: useReactDataTableProps<TData>): useRea
6068 columns : isLoading ? skeletonColumns : internalColumns ,
6169
6270 onColumnFiltersChange : ( filtersOrUpdaterFn ) => {
63- const newFilter = typeof filtersOrUpdaterFn !== "function" ? filtersOrUpdaterFn : filtersOrUpdaterFn ( effectiveColumnFilters ) ;
64- return effectiveOnColumnFiltersChange ( newFilter ) ;
71+ const newFilter =
72+ typeof filtersOrUpdaterFn !== "function"
73+ ? filtersOrUpdaterFn
74+ : filtersOrUpdaterFn ( getColumnFilterFromModel ( effectiveColumnFilters ) ) ;
75+ return effectiveOnColumnFiltersChange ( getModelFromColumnFilter ( newFilter ) ) ;
6576 } ,
6677 onPaginationChange : ( paginationOrUpdaterFn ) => {
6778 const newFilter = typeof paginationOrUpdaterFn !== "function" ? paginationOrUpdaterFn : paginationOrUpdaterFn ( effectivePagination ) ;
6879 return effectiveOnPaginationChange ( newFilter ) ;
6980 } ,
7081 onSortingChange : ( sortingOrUpdaterFn ) => {
71- const newFilter = typeof sortingOrUpdaterFn !== "function" ? sortingOrUpdaterFn : sortingOrUpdaterFn ( effectiveSorting ) ;
72- return effectiveOnSortingChange ( newFilter ) ;
82+ const newFilter =
83+ typeof sortingOrUpdaterFn !== "function" ? sortingOrUpdaterFn : sortingOrUpdaterFn ( getSortingStateFromModel ( effectiveSorting ) ) ;
84+ return effectiveOnSortingChange ( getModelFromSortingState ( newFilter ) ) ;
7385 } ,
7486
7587 state : {
76- columnFilters : effectiveColumnFilters ,
88+ columnFilters : getColumnFilterFromModel ( effectiveColumnFilters ) ,
7789 pagination : effectivePagination ,
78- sorting : effectiveSorting ,
90+ sorting : getSortingStateFromModel ( effectiveSorting ) ,
91+ } ,
92+
93+ initialState : {
94+ columnFilters : getColumnFilterFromModel ( columnFiltersInitial ?? columnFiltersExternal ?? { } ) ,
95+ pagination : paginationInitial ?? paginationExternal ,
96+ sorting : getSortingStateFromModel ( sortingInitial ?? sortingExternal ) ,
7997 } ,
8098
8199 getCoreRowModel : getCoreRowModel ( ) ,
@@ -99,7 +117,7 @@ const useReactDataTable = <TData,>(props: useReactDataTableProps<TData>): useRea
99117
100118 return {
101119 table,
102- columnFilters : effectiveColumnFilters ,
120+ columnFilters : effectiveColumnFilters as TFilter ,
103121 pagination : effectivePagination ,
104122 sorting : effectiveSorting ,
105123 setColumnFilters : effectiveOnColumnFiltersChange ,
0 commit comments