Skip to content

Commit 50ba45c

Browse files
authored
Merge pull request #5411 from marmelab/sppedup-show-hide-filter
Speed up show & hide filter
2 parents 6f990c8 + 3bf25e0 commit 50ba45c

File tree

3 files changed

+62
-41
lines changed

3 files changed

+62
-41
lines changed

packages/ra-core/src/controller/useListController.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ export interface ListControllerProps<RecordType extends Record = Record> {
7373
perPage: number;
7474
resource: string;
7575
selectedIds: Identifier[];
76-
setFilters: (filters: any, displayedFilters: any) => void;
76+
setFilters: (
77+
filters: any,
78+
displayedFilters: any,
79+
debounce?: boolean
80+
) => void;
7781
setPage: (page: number) => void;
7882
setPerPage: (page: number) => void;
7983
setSort: (sort: string, order?: string) => void;

packages/ra-core/src/controller/useListParams.ts

+45-34
Original file line numberDiff line numberDiff line change
@@ -197,52 +197,63 @@ const useListParams = ({
197197
);
198198
const displayedFilterValues = query.displayedFilters || emptyObject;
199199

200-
const debouncedSetFilters = lodashDebounce(
201-
(newFilters, newDisplayedFilters) => {
202-
let payload = {
203-
filter: removeEmpty(newFilters),
204-
displayedFilters: undefined,
205-
};
206-
if (newDisplayedFilters) {
207-
payload.displayedFilters = Object.keys(
208-
newDisplayedFilters
209-
).reduce((filters, filter) => {
210-
return newDisplayedFilters[filter]
211-
? { ...filters, [filter]: true }
212-
: filters;
213-
}, {});
214-
}
215-
changeParams({
216-
type: SET_FILTER,
217-
payload,
218-
});
219-
},
220-
debounce
221-
);
200+
const debouncedSetFilters = lodashDebounce((filter, displayedFilters) => {
201+
changeParams({
202+
type: SET_FILTER,
203+
payload: {
204+
filter: removeEmpty(filter),
205+
displayedFilters,
206+
},
207+
});
208+
}, debounce);
222209

223210
const setFilters = useCallback(
224-
(filters, displayedFilters) =>
225-
debouncedSetFilters(filters, displayedFilters),
211+
(filter, displayedFilters, debounce = true) =>
212+
debounce
213+
? debouncedSetFilters(filter, displayedFilters)
214+
: changeParams({
215+
type: SET_FILTER,
216+
payload: {
217+
filter: removeEmpty(filter),
218+
displayedFilters,
219+
},
220+
}),
226221
requestSignature // eslint-disable-line react-hooks/exhaustive-deps
227222
);
228223

229224
const hideFilter = useCallback((filterName: string) => {
230-
const newFilters = removeKey(filterValues, filterName);
231-
const newDisplayedFilters = {
232-
...displayedFilterValues,
233-
[filterName]: undefined,
234-
};
235-
236-
setFilters(newFilters, newDisplayedFilters);
225+
// we don't use lodash.set() for displayed filters
226+
// to avoid problems with compound filter names (e.g. 'author.name')
227+
const displayedFilters = Object.keys(displayedFilterValues).reduce(
228+
(filters, filter) => {
229+
return filter !== filterName
230+
? { ...filters, [filter]: true }
231+
: filters;
232+
},
233+
{}
234+
);
235+
const filter = removeEmpty(removeKey(filterValues, filterName));
236+
changeParams({
237+
type: SET_FILTER,
238+
payload: { filter, displayedFilters },
239+
});
237240
}, requestSignature); // eslint-disable-line react-hooks/exhaustive-deps
238241

239242
const showFilter = useCallback((filterName: string, defaultValue: any) => {
240-
const newFilters = set(filterValues, filterName, defaultValue);
241-
const newDisplayedFilters = {
243+
// we don't use lodash.set() for displayed filters
244+
// to avoid problems with compound filter names (e.g. 'author.name')
245+
const displayedFilters = {
242246
...displayedFilterValues,
243247
[filterName]: true,
244248
};
245-
setFilters(newFilters, newDisplayedFilters);
249+
const filter = set(filterValues, filterName, defaultValue);
250+
changeParams({
251+
type: SET_FILTER,
252+
payload: {
253+
filter,
254+
displayedFilters,
255+
},
256+
});
246257
}, requestSignature); // eslint-disable-line react-hooks/exhaustive-deps
247258

248259
return [

packages/ra-ui-materialui/src/list/filter/FilterListItem.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,20 @@ const FilterListItem: FC<{ label: string; value: any }> = props => {
153153
);
154154

155155
const addFilter = () => {
156-
setFilters({ ...filterValues, ...value }, null);
156+
setFilters({ ...filterValues, ...value }, null, false);
157157
};
158+
158159
const removeFilter = () => {
159-
const inverseValue = Object.keys(value).reduce((acc, key) => {
160-
acc[key] = undefined;
161-
return acc;
162-
}, {} as any);
163-
setFilters({ ...filterValues, ...inverseValue }, null);
160+
const keysToRemove = Object.keys(value);
161+
const filters = Object.keys(filterValues).reduce(
162+
(acc, key) =>
163+
keysToRemove.includes(key)
164+
? acc
165+
: { ...acc, [key]: filterValues[key] },
166+
{}
167+
);
168+
169+
setFilters(filters, null, false);
164170
};
165171

166172
const toggleFilter = () => (isSelected ? removeFilter() : addFilter());

0 commit comments

Comments
 (0)