1414import { Stack , useTheme } from '@mui/material' ;
1515import {
1616 ColumnDef ,
17+ ColumnFiltersState ,
1718 OnChangeFn ,
1819 Row ,
1920 RowSelectionState ,
@@ -24,11 +25,14 @@ import {
2425 getSortedRowModel ,
2526 useReactTable ,
2627} from '@tanstack/react-table' ;
27- import { ReactElement , useCallback , useMemo } from 'react' ;
28+ import { ReactElement , useCallback , useMemo , useState } from 'react' ;
29+
2830import { TableCheckbox } from './TableCheckbox' ;
2931import { VirtualizedTable } from './VirtualizedTable' ;
3032import { DEFAULT_COLUMN_WIDTH , TableProps , persesColumnsToTanstackColumns } from './model/table-model' ;
3133
34+ import { TableFilter } from './TableFilter' ;
35+
3236const DEFAULT_GET_ROW_ID = ( data : unknown , index : number ) : string => {
3337 return `${ index } ` ;
3438} ;
@@ -64,10 +68,11 @@ export function Table<TableData>({
6468 pagination,
6569 onPaginationChange,
6670 rowSelectionVariant = 'standard' ,
71+ filteringEnabled = false ,
72+ width,
6773 ...otherProps
6874} : TableProps < TableData > ) : ReactElement {
6975 const theme = useTheme ( ) ;
70-
7176 const handleRowSelectionChange : OnChangeFn < RowSelectionState > = ( rowSelectionUpdater ) => {
7277 const newRowSelection =
7378 typeof rowSelectionUpdater === 'function' ? rowSelectionUpdater ( rowSelection ) : rowSelectionUpdater ;
@@ -102,8 +107,8 @@ export function Table<TableData>({
102107 e . nativeEvent && ( e . nativeEvent instanceof MouseEvent || e . nativeEvent instanceof KeyboardEvent )
103108 ? ( e . nativeEvent as PointerEvent )
104109 : undefined ;
105- const isModifed = ! ! nativePointerEvent ?. metaKey || ! ! nativePointerEvent ?. shiftKey ;
106- handleRowSelectionEvent ( table , row , isModifed ) ;
110+ const isModified = ! ! nativePointerEvent ?. metaKey || ! ! nativePointerEvent ?. shiftKey ;
111+ handleRowSelectionEvent ( table , row , isModified ) ;
107112 } ,
108113 [ handleRowSelectionEvent ]
109114 ) ;
@@ -174,8 +179,26 @@ export function Table<TableData>({
174179 return initTableColumns ;
175180 } , [ checkboxColumn , checkboxSelection , columns , hasItemActions , actionsColumn ] ) ;
176181
182+ const [ columnFilters , setColumnFilters ] = useState < ColumnFiltersState > ( [ ] ) ;
183+
184+ const filteredData = useMemo ( ( ) => {
185+ if ( ! filteringEnabled || ! columnFilters . length ) {
186+ return [ ...data ] ;
187+ }
188+
189+ return data . filter ( ( row ) =>
190+ columnFilters . every ( ( { id, value } ) => {
191+ const rowValue = ( row as Record < string , unknown > ) [ id ] ;
192+ const filterValues = value as Array < string | number > ;
193+ // Use optional chaining and early return for clarity
194+ if ( ! filterValues ?. length ) return true ;
195+ return filterValues . includes ( rowValue as string | number ) ;
196+ } )
197+ ) ;
198+ } , [ data , filteringEnabled , columnFilters ] ) ;
199+
177200 const table = useReactTable ( {
178- data,
201+ data : filteredData ,
179202 columns : tableColumns ,
180203 getRowId,
181204 getCoreRowModel : getCoreRowModel ( ) ,
@@ -207,19 +230,32 @@ export function Table<TableData>({
207230 ) ;
208231
209232 return (
210- < VirtualizedTable
211- { ...otherProps }
212- density = { density }
213- defaultColumnWidth = { defaultColumnWidth }
214- defaultColumnHeight = { defaultColumnHeight }
215- onRowClick = { handleRowClick }
216- rows = { table . getRowModel ( ) . rows }
217- columns = { table . getAllFlatColumns ( ) }
218- headers = { table . getHeaderGroups ( ) }
219- cellConfigs = { cellConfigs }
220- pagination = { pagination }
221- onPaginationChange = { onPaginationChange }
222- rowCount = { table . getRowCount ( ) }
223- />
233+ < >
234+ { filteringEnabled && (
235+ < TableFilter
236+ columnFilters = { columnFilters }
237+ setColumnFilters = { setColumnFilters }
238+ columns = { columns }
239+ width = { width }
240+ defaultColumnWidth = { defaultColumnWidth }
241+ data = { data }
242+ />
243+ ) }
244+ < VirtualizedTable
245+ { ...otherProps }
246+ width = { width }
247+ density = { density }
248+ defaultColumnWidth = { defaultColumnWidth }
249+ defaultColumnHeight = { defaultColumnHeight }
250+ onRowClick = { handleRowClick }
251+ rows = { table . getRowModel ( ) . rows }
252+ columns = { table . getAllFlatColumns ( ) }
253+ headers = { table . getHeaderGroups ( ) }
254+ cellConfigs = { cellConfigs }
255+ pagination = { pagination }
256+ onPaginationChange = { onPaginationChange }
257+ rowCount = { table . getRowCount ( ) }
258+ />
259+ </ >
224260 ) ;
225261}
0 commit comments