Skip to content

Commit 82a46fc

Browse files
authored
Merge pull request #6378 from marmelab/use-list-review
Apply review on useList
2 parents 25047ac + 142be5b commit 82a46fc

File tree

3 files changed

+69
-74
lines changed

3 files changed

+69
-74
lines changed

packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ const useReferenceArrayFieldController = (
5454
const {
5555
basePath,
5656
filter = defaultFilter,
57-
page: initialPage = 1,
58-
perPage: initialPerPage = 1000,
57+
page = 1,
58+
perPage = 1000,
5959
record,
6060
reference,
61-
sort: initialSort = defaultSort,
61+
sort = defaultSort,
6262
source,
6363
} = props;
6464
const resource = useResourceContext(props);
@@ -87,15 +87,15 @@ const useReferenceArrayFieldController = (
8787
);
8888

8989
const listProps = useList({
90+
data,
9091
error,
9192
filter,
92-
initialData: data,
93-
initialIds: ids,
94-
initialPage,
95-
initialPerPage,
96-
initialSort,
97-
loading,
93+
ids,
9894
loaded,
95+
loading,
96+
page,
97+
perPage,
98+
sort,
9999
});
100100

101101
return {

packages/ra-core/src/controller/useList.spec.tsx

+14-14
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ describe('<useList />', () => {
2424

2525
render(
2626
<UseList
27-
initialData={data}
28-
initialIds={ids}
27+
data={data}
28+
ids={ids}
2929
loaded
3030
loading
3131
filter={{ title: 'world' }}
32-
initialSort={{ field: 'id', order: 'ASC' }}
32+
sort={{ field: 'id', order: 'ASC' }}
3333
callback={callback}
3434
/>
3535
);
@@ -60,12 +60,12 @@ describe('<useList />', () => {
6060

6161
render(
6262
<UseList
63-
initialData={data}
64-
initialIds={ids}
63+
data={data}
64+
ids={ids}
6565
loaded
6666
loading
6767
filter={{ items: ['two', 'four', 'five'] }}
68-
initialSort={{ field: 'id', order: 'ASC' }}
68+
sort={{ field: 'id', order: 'ASC' }}
6969
callback={callback}
7070
/>
7171
);
@@ -98,11 +98,11 @@ describe('<useList />', () => {
9898

9999
render(
100100
<UseList
101-
initialData={data}
102-
initialIds={ids}
101+
data={data}
102+
ids={ids}
103103
loaded
104104
loading
105-
initialSort={{ field: 'title', order: 'DESC' }}
105+
sort={{ field: 'title', order: 'DESC' }}
106106
callback={callback}
107107
/>
108108
);
@@ -139,13 +139,13 @@ describe('<useList />', () => {
139139

140140
render(
141141
<UseList
142-
initialData={data}
143-
initialIds={ids}
142+
data={data}
143+
ids={ids}
144144
loaded
145145
loading
146-
initialSort={{ field: 'id', order: 'ASC' }}
147-
initialPage={2}
148-
initialPerPage={5}
146+
sort={{ field: 'id', order: 'ASC' }}
147+
page={2}
148+
perPage={5}
149149
callback={callback}
150150
/>
151151
);

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

+46-51
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import { useCallback, useEffect, useRef } from 'react';
22
import get from 'lodash/get';
33
import isEqual from 'lodash/isEqual';
44
import { indexById, removeEmpty, useSafeSetState } from '../util';
5-
import { Identifier, Record, RecordMap, SortPayload } from '../types';
5+
import {
6+
FilterPayload,
7+
Identifier,
8+
Record,
9+
RecordMap,
10+
SortPayload,
11+
} from '../types';
612
import usePaginationState from './usePaginationState';
713
import useSortState from './useSortState';
814
import useSelectionState from './useSelectionState';
@@ -38,31 +44,28 @@ import { ListControllerProps } from '.';
3844
* );
3945
* };
4046
*
41-
* @param {UseListOptions} props Also optionally accepts all the ListController props
42-
* @param {Record[]} props.initialData An array of records
43-
* @param {Identifier[]} props.initialIds An array of the record identifiers
47+
* @param {UseListOptions} props
48+
* @param {Record[]} props.data An array of records
49+
* @param {Identifier[]} props.ids An array of the record identifiers
4450
* @param {Boolean} props.loaded: A boolean indicating whether the data has been loaded at least once
4551
* @param {Boolean} props.loading: A boolean indicating whether the data is being loaded
4652
* @param {Error | String} props.error: Optional. The error if any occured while loading the data
4753
* @param {Object} props.filter: Optional. An object containing the filters applied on the data
48-
* @param {Number} props.initialPage: Optional. The initial page index
49-
* @param {Number} props.initialPerPage: Optional. The initial page size
50-
* @param {SortPayload} props.initialSort: Optional. The initial sort (field and order)
54+
* @param {Number} props.page: Optional. The initial page index
55+
* @param {Number} props.perPage: Optional. The initial page size
56+
* @param {SortPayload} props.sort: Optional. The initial sort (field and order)
5157
*/
5258
export const useList = (props: UseListOptions): UseListValue => {
5359
const {
5460
data,
5561
error,
5662
filter = defaultFilter,
5763
ids,
58-
initialData,
59-
initialIds,
6064
loaded,
6165
loading,
62-
initialPage = 1,
63-
initialPerPage = 1000,
64-
initialSort = defaultSort,
65-
total,
66+
page: initialPage = 1,
67+
perPage: initialPerPage = 1000,
68+
sort: initialSort = defaultSort,
6669
} = props;
6770
const [loadingState, setLoadingState] = useSafeSetState<boolean>(loading);
6871
const [loadedState, setLoadedState] = useSafeSetState<boolean>(loaded);
@@ -71,8 +74,8 @@ export const useList = (props: UseListOptions): UseListValue => {
7174
data: RecordMap;
7275
ids: Identifier[];
7376
}>(() => ({
74-
data: indexById(initialData),
75-
ids: initialIds,
77+
data: indexById(data),
78+
ids,
7679
}));
7780

7881
// pagination logic
@@ -156,13 +159,9 @@ export const useList = (props: UseListOptions): UseListValue => {
156159
// We do all the data processing (filtering, sorting, paginating) client-side
157160
useEffect(() => {
158161
if (!loaded) return;
159-
// Assume that if setFilters is provided then so are methods for pagination and sorting
160-
if (props.setFilters) {
161-
return;
162-
}
163162

164163
// 1. filter
165-
let tempData = initialData.filter(record =>
164+
let tempData = data.filter(record =>
166165
Object.entries(filterValues).every(([filterName, filterValue]) => {
167166
const recordValue = get(record, filterName);
168167
const result = Array.isArray(recordValue)
@@ -199,12 +198,11 @@ export const useList = (props: UseListOptions): UseListValue => {
199198
ids: finalIds,
200199
});
201200
}, [
202-
initialData,
201+
data,
203202
filterValues,
204203
loaded,
205204
page,
206205
perPage,
207-
props.setFilters,
208206
setFinalItems,
209207
sort.field,
210208
sort.order,
@@ -223,43 +221,40 @@ export const useList = (props: UseListOptions): UseListValue => {
223221
}, [loading, loadingState, setLoadingState]);
224222

225223
return {
226-
currentSort: props.currentSort || sort,
227-
data: data || finalItems.data,
224+
currentSort: sort,
225+
data: finalItems.data,
228226
error,
229-
displayedFilters: props.displayedFilters || displayedFilters,
230-
filterValues: props.filterValues || filterValues,
231-
hideFilter: props.hideFilter || hideFilter,
232-
ids: ids || finalItems.ids,
227+
displayedFilters,
228+
filterValues,
229+
hideFilter,
230+
ids: finalItems.ids,
233231
loaded: loadedState,
234232
loading: loadingState,
235-
onSelect: props.onSelect || onSelect,
236-
onToggleItem: props.onToggleItem || onToggleItem,
237-
onUnselectItems: props.onUnselectItems || onUnselectItems,
238-
page: props.page || page,
239-
perPage: props.perPage || perPage,
240-
selectedIds: props.selectedIds || selectedIds,
241-
setFilters: props.setFilters || setFilters,
242-
setPage: props.setPage || setPage,
243-
setPerPage: props.setPerPage || setPerPage,
244-
setSort: props.setSort || setSort,
245-
showFilter: props.showFilter || showFilter,
246-
total: total || finalItems.ids.length,
233+
onSelect,
234+
onToggleItem,
235+
onUnselectItems,
236+
page,
237+
perPage,
238+
selectedIds,
239+
setFilters,
240+
setPage,
241+
setPerPage,
242+
setSort,
243+
showFilter,
244+
total: finalItems.ids.length,
247245
};
248246
};
249247

250-
export interface UseListOptions
251-
extends Partial<
252-
Omit<ListControllerProps, 'resource' | 'basePath' | 'refetch'>
253-
> {
248+
export interface UseListOptions<RecordType extends Record = Record> {
249+
data: RecordType[];
250+
ids: Identifier[];
254251
error?: any;
255-
filter?: any;
256-
initialPage?: number;
257-
initialPerPage?: number;
258-
initialSort?: SortPayload;
259-
initialData: Record[];
260-
initialIds: Identifier[];
261-
loaded: boolean;
252+
filter?: FilterPayload;
262253
loading: boolean;
254+
loaded: boolean;
255+
page?: number;
256+
perPage?: number;
257+
sort?: SortPayload;
263258
}
264259

265260
export type UseListValue = Omit<

0 commit comments

Comments
 (0)