Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fix-should-auto-remove-filter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/table-core': patch
---

fix(table-core): respect custom `autoRemove` in `shouldAutoRemoveFilter`
12 changes: 5 additions & 7 deletions packages/table-core/src/features/ColumnFiltering.ts
Original file line number Diff line number Diff line change
Expand Up @@ -418,11 +418,9 @@ export function shouldAutoRemoveFilter<TData extends RowData>(
value?: any,
column?: Column<TData, unknown>,
) {
return (
(filterFn && filterFn.autoRemove
? filterFn.autoRemove(value, column)
: false) ||
typeof value === 'undefined' ||
(typeof value === 'string' && !value)
)
if (filterFn?.autoRemove) {
return filterFn.autoRemove(value, column)
}

return typeof value === 'undefined' || (typeof value === 'string' && !value)
}
73 changes: 73 additions & 0 deletions packages/table-core/tests/shouldAutoRemoveFilter.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { describe, it, expect } from 'vitest'
import { FilterFn } from '../src'
import { shouldAutoRemoveFilter } from '../src/features/ColumnFiltering'

const customAutoRemove: FilterFn<any> = (row, columnId, filterValue) => {
return filterValue === row.getValue(columnId)
}
customAutoRemove.autoRemove = (val) => val === undefined

const neverAutoRemove: FilterFn<any> = (row, columnId, filterValue) => {
return filterValue === row.getValue(columnId)
}
neverAutoRemove.autoRemove = () => false

const noAutoRemove: FilterFn<any> = (row, columnId, filterValue) => {
return filterValue === row.getValue(columnId)
}

describe('shouldAutoRemoveFilter', () => {
describe('with custom autoRemove defined', () => {
it('should use custom autoRemove result for empty string', () => {
expect(shouldAutoRemoveFilter(customAutoRemove, '')).toBe(false)
})

it('should use custom autoRemove result for undefined', () => {
expect(shouldAutoRemoveFilter(customAutoRemove, undefined)).toBe(true)
})

it('should use custom autoRemove result for null', () => {
expect(shouldAutoRemoveFilter(customAutoRemove, null)).toBe(false)
})

it('should use custom autoRemove result for zero', () => {
expect(shouldAutoRemoveFilter(customAutoRemove, 0)).toBe(false)
})

it('should use custom autoRemove result for false', () => {
expect(shouldAutoRemoveFilter(customAutoRemove, false)).toBe(false)
})

it('should keep undefined filter when custom autoRemove returns false for it', () => {
expect(shouldAutoRemoveFilter(neverAutoRemove, undefined)).toBe(false)
})
})

describe('without autoRemove defined', () => {
it('should remove undefined filter', () => {
expect(shouldAutoRemoveFilter(noAutoRemove, undefined)).toBe(true)
})

it('should remove empty string filter', () => {
expect(shouldAutoRemoveFilter(noAutoRemove, '')).toBe(true)
})

it('should keep null filter', () => {
expect(shouldAutoRemoveFilter(noAutoRemove, null)).toBe(false)
})
})

describe('without filterFn', () => {
it('should remove undefined filter', () => {
expect(shouldAutoRemoveFilter(undefined, undefined)).toBe(true)
})

it('should remove empty string filter', () => {
expect(shouldAutoRemoveFilter(undefined, '')).toBe(true)
})

it('should keep null filter', () => {
expect(shouldAutoRemoveFilter(undefined, null)).toBe(false)
})
})
})