Fix filtering on grouped table view (#12029)

# Fix filtering on grouped table view

Fixes #11776 
This PR fixes the filtering issue on the grouped by column in the table.
State filters were overwritten by group filters.

- Implemented a new `combineFilters` utility function that properly
merges multiple filter objects using AND logic
- Added tests
- Modified `useFindManyRecordIndexTableParams` to use the new utility
instead of directly merging filter objects

## Before


https://github.com/user-attachments/assets/45d51535-ecbc-4cfd-b523-37e72aafc723


## After


https://github.com/user-attachments/assets/70416779-9a9c-4972-82ed-73ad98b0234f
This commit is contained in:
Raphaël Bosi
2025-05-14 13:30:37 +02:00
committed by GitHub
parent 2aa5db580b
commit 0766e73fc4
3 changed files with 52 additions and 4 deletions

View File

@ -0,0 +1,29 @@
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
import { combineFilters } from '../combineFilters';
describe('combineFilters', () => {
it('should return empty object when all filters are empty', () => {
const result = combineFilters([{}, {}, {}]);
expect(result).toEqual({});
});
it('should return the single non-empty filter directly', () => {
const filter: RecordGqlOperationFilter = { field1: { eq: 'Test' } };
const result = combineFilters([{}, filter, {}]);
expect(result).toEqual(filter);
});
it('should combine multiple non-empty filters with AND logic', () => {
const filter1: RecordGqlOperationFilter = { field1: { eq: 'Test' } };
const filter2: RecordGqlOperationFilter = { field2: { eq: 'Active' } };
const result = combineFilters([filter1, filter2]);
expect(result).toEqual({
and: [filter1, filter2],
});
});
it('should handle an empty array by returning an empty object', () => {
const result = combineFilters([]);
expect(result).toEqual({});
});
});

View File

@ -0,0 +1,21 @@
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
export const combineFilters = (
filters: RecordGqlOperationFilter[],
): RecordGqlOperationFilter => {
const nonEmptyFilters = filters.filter(
(filter) => Object.keys(filter).length > 0,
);
if (nonEmptyFilters.length === 0) {
return {};
}
if (nonEmptyFilters.length === 1) {
return nonEmptyFilters[0];
}
return {
and: nonEmptyFilters,
};
};

View File

@ -3,6 +3,7 @@ import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils
import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { combineFilters } from '@/object-record/record-filter/utils/combineFilters';
import { computeRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeRecordGqlOperationFilter';
import { useCurrentRecordGroupDefinition } from '@/object-record/record-group/hooks/useCurrentRecordGroupDefinition';
import { useRecordGroupFilter } from '@/object-record/record-group/hooks/useRecordGroupFilter';
@ -47,10 +48,7 @@ export const useFindManyRecordIndexTableParams = (
return {
objectNameSingular,
filter: {
...stateFilter,
...recordGroupFilter,
},
filter: combineFilters([stateFilter, recordGroupFilter]),
orderBy,
// If we have a current record group definition, we only want to fetch 8 records by page
...(currentRecordGroupDefinition ? { limit: 8 } : {}),