diff --git a/packages/ra-ui-materialui/src/list/datatable/DataTable.spec.tsx b/packages/ra-ui-materialui/src/list/datatable/DataTable.spec.tsx index 0277f304871..837c04a8f59 100644 --- a/packages/ra-ui-materialui/src/list/datatable/DataTable.spec.tsx +++ b/packages/ra-ui-materialui/src/list/datatable/DataTable.spec.tsx @@ -1,5 +1,11 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { QueryClient } from '@tanstack/react-query'; import * as React from 'react'; +import { + ResourceContextProvider, + TestMemoryRouter, + type AuthProvider, +} from 'ra-core'; import { Basic, Columns, @@ -12,6 +18,8 @@ import { StandaloneDynamic, StandaloneStatic, } from './DataTable.stories'; +import { DataTable } from './DataTable'; +import { AdminContext } from '../../AdminContext'; describe('DataTable', () => { it('should render one row per record in the list', async () => { @@ -218,6 +226,71 @@ describe('DataTable', () => { }); }); describe('bulkActionButtons', () => { + it('should not enable delete permission queries without an auth provider', async () => { + const queryClient = new QueryClient(); + + render( + + + + } + data={[{ id: 1 }]} + isPending={false} + onSelect={jest.fn()} + onToggleItem={jest.fn()} + selectedIds={[]} + total={1} + > + + + + + + ); + + await waitFor(() => { + const [query] = queryClient.getQueryCache().findAll({ + queryKey: ['auth', 'canAccess'], + }); + expect(query.state.fetchStatus).toBe('idle'); + expect(query.state.data).toBeUndefined(); + }); + }); + + it('should not check delete permissions when bulk actions are disabled', () => { + const authProvider: AuthProvider = { + canAccess: jest.fn().mockResolvedValue(true), + checkAuth: jest.fn().mockResolvedValue(undefined), + checkError: jest.fn().mockResolvedValue(undefined), + getPermissions: jest.fn().mockResolvedValue(undefined), + login: jest.fn().mockResolvedValue(undefined), + logout: jest.fn().mockResolvedValue(undefined), + }; + + render( + + + + + + + + + + ); + + expect(authProvider.canAccess).not.toHaveBeenCalled(); + }); + it('should reveal bulk delete button by default on row selection', async () => { render(); const checkboxes = await screen.findAllByRole('checkbox'); diff --git a/packages/ra-ui-materialui/src/list/datatable/DataTable.tsx b/packages/ra-ui-materialui/src/list/datatable/DataTable.tsx index 8ccbfdf3927..35ce814a0f5 100644 --- a/packages/ra-ui-materialui/src/list/datatable/DataTable.tsx +++ b/packages/ra-ui-materialui/src/list/datatable/DataTable.tsx @@ -139,6 +139,7 @@ export const DataTable = React.forwardRef(function DataTable< const { canAccess: canDelete } = useCanAccess({ resource: resourceFromContext, action: 'delete', + ...(props.bulkActionButtons === false ? { enabled: false } : {}), }); const {