diff --git a/packages/vuetify/src/composables/__tests__/filter.spec.ts b/packages/vuetify/src/composables/__tests__/filter.spec.ts index 4a458bb4480..6640d1e9398 100644 --- a/packages/vuetify/src/composables/__tests__/filter.spec.ts +++ b/packages/vuetify/src/composables/__tests__/filter.spec.ts @@ -115,6 +115,60 @@ describe('filter', () => { filterMode: 'every', })).toHaveLength(1) }) + + it('should filter by mode using customKeyFilter without query', () => { + const customKeyFilter = { + title: (s: string) => s.length < 5, + value: (s: string) => s === '1', + } + const items = [ + { + title: 'foo', + subtitle: 'bar', + value: '1', + }, + { + title: 'fizz', + subtitle: 'buzz', + value: '1', + }, + { + title: 'foobar', + subtitle: 'fizzbuzz', + value: '2', + }, + { + title: 'buzz', + subtitle: 'buzz', + value: '2', + }, + ] as any + const filterKeys = ['title', 'value'] + + expect(filterItems(items, '', { + filterKeys, + customKeyFilter, + filterMode: 'some', + })).toHaveLength(3) + + expect(filterItems(items, '', { + filterKeys, + customKeyFilter, + filterMode: 'union', + })).toHaveLength(2) + + expect(filterItems(items, '', { + filterKeys, + customKeyFilter, + filterMode: 'intersection', + })).toHaveLength(0) + + expect(filterItems(items, '', { + filterKeys, + customKeyFilter, + filterMode: 'every', + })).toHaveLength(2) + }) }) describe('useFilter', () => { diff --git a/packages/vuetify/src/composables/filter.ts b/packages/vuetify/src/composables/filter.ts index 9ba2d6213ea..43d83e90237 100644 --- a/packages/vuetify/src/composables/filter.ts +++ b/packages/vuetify/src/composables/filter.ts @@ -78,7 +78,7 @@ export function filterItems ( const defaultMatches: Record = {} let match: FilterMatch = -1 - if (query && !options?.noFilter) { + if ((query || customFiltersLength > 0) && !options?.noFilter) { if (typeof item === 'object') { const filterKeys = keys || Object.keys(transformed)