Skip to content

Commit 71613b2

Browse files
WIP: feat: use separate store for record selection storeKeys
1 parent 4438f95 commit 71613b2

File tree

5 files changed

+179
-149
lines changed

5 files changed

+179
-149
lines changed

packages/ra-core/src/controller/button/useDeleteWithConfirmController.spec.tsx

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,22 @@ describe('useDeleteWithConfirmController', () => {
125125
<TestMemoryRouter>
126126
<CoreAdminContext store={store} dataProvider={dataProvider}>
127127
<StoreSetter
128-
name="posts.selectedIds"
129-
value={{ ['']: [123, 456], ['bar']: [456] }}
128+
name="posts.selectedIds.storeKeys"
129+
value={['bar.selectedIds']}
130130
>
131-
<Routes>
132-
<Route path="/" element={<MockComponent />} />
133-
</Routes>
131+
<StoreSetter
132+
name="posts.selectedIds"
133+
value={[123, 456]}
134+
>
135+
<StoreSetter name="bar.selectedIds" value={[456]}>
136+
<Routes>
137+
<Route
138+
path="/"
139+
element={<MockComponent />}
140+
/>
141+
</Routes>
142+
</StoreSetter>
143+
</StoreSetter>
134144
</StoreSetter>
135145
</CoreAdminContext>
136146
</TestMemoryRouter>
@@ -139,11 +149,10 @@ describe('useDeleteWithConfirmController', () => {
139149
const button = await screen.findByText('Delete');
140150
fireEvent.click(button);
141151
await waitFor(
142-
() =>
143-
expect(store.getItem('posts.selectedIds')).toEqual({
144-
['']: [123],
145-
['bar']: [],
146-
}),
152+
() => {
153+
expect(store.getItem('posts.selectedIds')).toEqual([123]);
154+
expect(store.getItem('bar.selectedIds')).toEqual([]);
155+
},
147156
{
148157
timeout: 1000,
149158
}

packages/ra-core/src/controller/field/useReferenceManyFieldController.spec.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -362,9 +362,10 @@ describe('useReferenceManyFieldController', () => {
362362

363363
fireEvent.click(await screen.findByText('Toggle'));
364364
await waitFor(() => {
365-
expect(setStore).toHaveBeenCalledWith('books.selectedIds', {
366-
['authors.123']: [456],
367-
});
365+
expect(setStore).toHaveBeenCalledWith(
366+
'authors.123.books.selectedIds',
367+
[456]
368+
);
368369
});
369370
});
370371

@@ -399,9 +400,9 @@ describe('useReferenceManyFieldController', () => {
399400

400401
fireEvent.click(await screen.findByText('Toggle'));
401402
await waitFor(() => {
402-
expect(setStore).toHaveBeenCalledWith('books.selectedIds', {
403-
['customKey']: [456],
404-
});
403+
expect(setStore).toHaveBeenCalledWith('customKey.selectedIds', [
404+
456,
405+
]);
405406
});
406407
});
407408

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export const useReferenceManyFieldController = <
9393
// selection logic
9494
const [selectedIds, selectionModifiers] = useRecordSelection({
9595
resource: reference,
96-
storeKey: props.storeKey ?? `${resource}.${record?.id}`,
96+
storeKey: props.storeKey ?? `${resource}.${record?.id}.${reference}`,
9797
});
9898

9999
const onUnselectItems = useCallback(

packages/ra-core/src/controller/list/useRecordSelection.spec.tsx

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,6 @@ describe('useRecordSelection', () => {
2323
});
2424

2525
it('should use the stored value', () => {
26-
const { result } = renderHook(
27-
() => useRecordSelection({ resource: 'foo' }),
28-
{
29-
wrapper: ({ children }) => (
30-
<StoreContextProvider value={memoryStore()}>
31-
<StoreSetter
32-
name="foo.selectedIds"
33-
value={{ ['']: [123, 456] }}
34-
>
35-
{children}
36-
</StoreSetter>
37-
</StoreContextProvider>
38-
),
39-
}
40-
);
41-
const [selected] = result.current;
42-
expect(selected).toEqual([123, 456]);
43-
});
44-
45-
it('should use the stored value in previous format', () => {
4626
const { result } = renderHook(
4727
() => useRecordSelection({ resource: 'foo' }),
4828
{
@@ -78,9 +58,7 @@ describe('useRecordSelection', () => {
7858
select([123, 456, 7]);
7959
await waitFor(() => {
8060
const stored = store.getItem('foo.selectedIds');
81-
expect(stored).toEqual({
82-
['']: [123, 456, 7],
83-
});
61+
expect(stored).toEqual([123, 456, 7]);
8462
});
8563
});
8664

@@ -444,8 +422,8 @@ describe('useRecordSelection', () => {
444422
wrapper: ({ children }) => (
445423
<StoreContextProvider value={memoryStore()}>
446424
<StoreSetter
447-
name="foo.selectedIds"
448-
value={{ bar: [123, 456] }}
425+
name="bar.selectedIds"
426+
value={[123, 456]}
449427
>
450428
{children}
451429
</StoreSetter>
@@ -533,5 +511,74 @@ describe('useRecordSelection', () => {
533511
expect(selected2).toEqual([]);
534512
});
535513
});
514+
515+
describe('using stored storeKeys', () => {
516+
it('should keep final storeKey in the store', async () => {
517+
const store = memoryStore();
518+
renderHook(
519+
() =>
520+
useRecordSelection({
521+
resource: 'foo',
522+
storeKey: 'bar',
523+
}),
524+
{
525+
wrapper: ({ children }) => (
526+
<StoreContextProvider value={store}>
527+
{children}
528+
</StoreContextProvider>
529+
),
530+
}
531+
);
532+
533+
await waitFor(() => {
534+
const storeKeys = store.getItem(
535+
'foo.selectedIds.storeKeys'
536+
);
537+
expect(storeKeys).toEqual(['bar.selectedIds']);
538+
});
539+
});
540+
541+
it('should check all storeKeys listed in store when `fromAllStoreKeys` is `true`', async () => {
542+
const store = memoryStore();
543+
const { result } = renderHook(
544+
() => {
545+
return useRecordSelection({
546+
resource: 'foo',
547+
storeKey: 'bar1',
548+
});
549+
},
550+
{
551+
wrapper: ({ children }) => (
552+
<StoreContextProvider value={store}>
553+
<StoreSetter
554+
name={'foo.selectedIds.storeKeys'}
555+
value={['bar2.selectedIds']}
556+
>
557+
<StoreSetter
558+
name={'bar1.selectedIds'}
559+
value={[123]}
560+
>
561+
<StoreSetter
562+
name={'bar2.selectedIds'}
563+
value={[123]}
564+
>
565+
{children}
566+
</StoreSetter>
567+
</StoreSetter>
568+
</StoreSetter>
569+
</StoreContextProvider>
570+
),
571+
}
572+
);
573+
574+
const [, { clearSelection }] = result.current;
575+
clearSelection(true);
576+
577+
await waitFor(() => {
578+
expect(store.getItem('bar1.selectedIds')).toEqual([]);
579+
expect(store.getItem('bar2.selectedIds')).toEqual([]);
580+
});
581+
});
582+
});
536583
});
537584
});

0 commit comments

Comments
 (0)