Skip to content

Commit eda127a

Browse files
authored
Merge pull request #11069 from marmelab/fix-data-grid-select-all
Fix `<Datagrid>` does not show the correct number of selected items
2 parents 9ff0c5d + 62cbd46 commit eda127a

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

packages/ra-ui-materialui/src/list/datagrid/Datagrid.spec.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import * as React from 'react';
2-
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
2+
import {
3+
render,
4+
screen,
5+
fireEvent,
6+
waitFor,
7+
within,
8+
} from '@testing-library/react';
39
import {
410
CoreAdminContext,
511
testDataProvider,
@@ -10,7 +16,12 @@ import {
1016
import { ThemeProvider, createTheme } from '@mui/material';
1117

1218
import { Datagrid } from './Datagrid';
13-
import { AccessControl, FullApp, SelectAllButton } from './Datagrid.stories';
19+
import {
20+
AccessControl,
21+
FullApp,
22+
SelectAllButton,
23+
Standalone,
24+
} from './Datagrid.stories';
1425

1526
const TitleField = () => {
1627
const record = useRecordContext();
@@ -347,4 +358,24 @@ describe('<Datagrid />', () => {
347358
);
348359
});
349360
});
361+
it('should correctly select items after initial item selection followed by whole page selection', async () => {
362+
render(<Standalone />);
363+
await waitFor(() =>
364+
expect(screen.getAllByText('The Lord of the Rings').length).toEqual(
365+
2
366+
)
367+
);
368+
fireEvent.click(
369+
await within(
370+
(
371+
await screen.findAllByText('The Lord of the Rings')
372+
)[1].closest('tr')
373+
).findByLabelText('Select this row')
374+
);
375+
await screen.findByText('1 item selected');
376+
expect(screen.queryByText('Select all')).toBeNull();
377+
fireEvent.click(await screen.findByLabelText('Select all'));
378+
await screen.findByText('7 items selected');
379+
expect(screen.queryByText('Select all')).toBeNull();
380+
});
350381
});

packages/ra-ui-materialui/src/list/datagrid/Datagrid.stories.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,10 @@ const MyCustomListInteractive = () => {
439439

440440
export const Standalone = () => (
441441
<ThemeProvider theme={theme}>
442-
<CoreAdminContext dataProvider={dataProvider}>
442+
<CoreAdminContext
443+
dataProvider={dataProvider}
444+
i18nProvider={polyglotI18nProvider(() => defaultMessages, 'en')}
445+
>
443446
<h1>Static</h1>
444447
<MyCustomList />
445448
<h1>Dynamic (with useList)</h1>

packages/ra-ui-materialui/src/list/datagrid/DatagridHeader.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ export const DatagridHeader = (props: DatagridHeaderProps) => {
5858
event.target.checked
5959
? selectedIds.concat(
6060
data
61-
.filter(record =>
62-
!selectedIds.includes(record.id) &&
63-
isRowSelectable
64-
? isRowSelectable(record)
65-
: true
61+
.filter(
62+
record =>
63+
!selectedIds.includes(record.id) &&
64+
(!isRowSelectable ||
65+
isRowSelectable(record))
6666
)
6767
.map(record => record.id)
6868
)

0 commit comments

Comments
 (0)