diff --git a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.spec.tsx b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.spec.tsx index e1531e0c3b0..e20bd9793cc 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.spec.tsx +++ b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.spec.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { render, screen } from '@testing-library/react'; import expect from 'expect'; -import { Basic } from './SelectColumnsButton.stories'; +import { Basic, WithPreferenceKey } from './SelectColumnsButton.stories'; describe('', () => { it('should render a datagrid with configurable columns', async () => { @@ -14,4 +14,14 @@ describe('', () => { screen.getByLabelText('Year').click(); expect(screen.queryByText('1869')).not.toBeNull(); }); + + it('should render a datagrid with columns using the given preference key', async () => { + render(); + screen.getByText('Columns').click(); + expect(screen.queryByText('1869')).not.toBeNull(); + screen.getByLabelText('Year').click(); + expect(screen.queryByText('1869')).toBeNull(); + screen.getByLabelText('Year').click(); + expect(screen.queryByText('1869')).not.toBeNull(); + }); }); diff --git a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.stories.tsx b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.stories.tsx index 1f06fe7a522..938c84da611 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.stories.tsx +++ b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.stories.tsx @@ -66,3 +66,28 @@ export const Basic = () => ( ); + +export const WithPreferenceKey = () => ( + + + + + + + + + + + + + + + + + +); diff --git a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.tsx b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.tsx index afcd272a31e..5dbfcc1aa83 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.tsx +++ b/packages/ra-ui-materialui/src/list/datagrid/SelectColumnsButton.tsx @@ -38,17 +38,22 @@ import { styled } from '@mui/material/styles'; * * ); */ -export const SelectColumnsButton = props => { +export const SelectColumnsButton = (props: SelectColumnsButtonProps) => { + const { preferenceKey } = props; + const resource = useResourceContext(props); - const preferenceKey = - props.preferenceKey || `preferences.${resource}.datagrid`; + const finalPreferenceKey = preferenceKey || `${resource}.datagrid`; + const [anchorEl, setAnchorEl] = React.useState(null); const [availableColumns, setAvailableColumns] = useStore< ConfigurableDatagridColumn[] - >(`${preferenceKey}.availableColumns`, []); - const [omit] = useStore(`${preferenceKey}.omit`, []); + >(`preferences.${finalPreferenceKey}.availableColumns`, []); + const [omit] = useStore( + `preferences.${finalPreferenceKey}.omit`, + [] + ); const [columns, setColumns] = useStore( - `${preferenceKey}.columns`, + `preferences.${finalPreferenceKey}.columns`, availableColumns .filter(column => !omit?.includes(column.source)) .map(column => column.index) @@ -130,6 +135,7 @@ export const SelectColumnsButton = props => { color="primary" onClick={handleClick} size="large" + {...sanitizeRestProps(props)} > @@ -139,6 +145,7 @@ export const SelectColumnsButton = props => { size="small" onClick={handleClick} startIcon={} + {...sanitizeRestProps(props)} > {title} @@ -184,6 +191,14 @@ const StyledButton = styled(Button, { }, }); -export interface SelectColumnsButtonProps { - preferenceKey: string; +const sanitizeRestProps = ({ + resource = null, + preferenceKey = null, + ...rest +}) => rest; + +export interface SelectColumnsButtonProps + extends React.HtmlHTMLAttributes { + resource?: string; + preferenceKey?: string; }