diff --git a/packages/table-core/src/features/global-filtering/globalFilteringFeature.ts b/packages/table-core/src/features/global-filtering/globalFilteringFeature.ts index ea182fe0cb..4ac7f4fc03 100644 --- a/packages/table-core/src/features/global-filtering/globalFilteringFeature.ts +++ b/packages/table-core/src/features/global-filtering/globalFilteringFeature.ts @@ -35,10 +35,12 @@ export const globalFilteringFeature: TableFeature = { return true } - const value = table + const row = table .getCoreRowModel() - .flatRows[0]?.getAllCellsByColumnId() - [column.id]?.getValue() + .flatRows.find( + (row) => row.getAllCellsByColumnId()[column.id]?.getValue() != null, + ) + const value = row?.getAllCellsByColumnId()[column.id]?.getValue() return typeof value === 'string' || typeof value === 'number' }, diff --git a/packages/table-core/tests/implementation/features/column-filtering/createFilteredRowModel.test.ts b/packages/table-core/tests/implementation/features/column-filtering/createFilteredRowModel.test.ts index ee8c937a23..146063fa2d 100644 --- a/packages/table-core/tests/implementation/features/column-filtering/createFilteredRowModel.test.ts +++ b/packages/table-core/tests/implementation/features/column-filtering/createFilteredRowModel.test.ts @@ -528,6 +528,26 @@ describe('createFilteredRowModel', () => { }) describe('global filtering edge cases', () => { + it('should filter a column when its first row value is undefined', () => { + type NullableNameRow = { name?: string } + const nullableColumns: Array< + ColumnDef + > = [{ accessorKey: 'name', id: 'name' }] + + const table = constructTable({ + features, + columns: nullableColumns, + data: [{ name: undefined }, { name: 'hello' }, { name: 'world' }], + initialState: { + globalFilter: 'hello', + }, + }) + + expect( + table.getFilteredRowModel().rows.map((row) => row.original.name), + ).toEqual(['hello']) + }) + it('should globally filter an object-valued column that explicitly opts in', () => { interface ObjectValueRow { value: { label: string }