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,27 @@ 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+ const x = 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+ return x ;
199+ } , [ data , filteringEnabled , columnFilters ] ) ;
200+
177201 const table = useReactTable ( {
178- data,
202+ data : filteredData ,
179203 columns : tableColumns ,
180204 getRowId,
181205 getCoreRowModel : getCoreRowModel ( ) ,
@@ -207,19 +231,32 @@ export function Table<TableData>({
207231 ) ;
208232
209233 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- />
234+ < >
235+ { filteringEnabled && (
236+ < TableFilter
237+ columnFilters = { columnFilters }
238+ setColumnFilters = { setColumnFilters }
239+ columns = { columns }
240+ width = { width }
241+ defaultColumnWidth = { defaultColumnWidth }
242+ data = { data }
243+ />
244+ ) }
245+ < VirtualizedTable
246+ { ...otherProps }
247+ width = { width }
248+ density = { density }
249+ defaultColumnWidth = { defaultColumnWidth }
250+ defaultColumnHeight = { defaultColumnHeight }
251+ onRowClick = { handleRowClick }
252+ rows = { table . getRowModel ( ) . rows }
253+ columns = { table . getAllFlatColumns ( ) }
254+ headers = { table . getHeaderGroups ( ) }
255+ cellConfigs = { cellConfigs }
256+ pagination = { pagination }
257+ onPaginationChange = { onPaginationChange }
258+ rowCount = { table . getRowCount ( ) }
259+ />
260+ </ >
224261 ) ;
225262}
0 commit comments