Skip to content

Commit 6065878

Browse files
authored
Merge pull request marmelab#11088 from marmelab/Fic-ColumnsSelector-cannot-hide-DataTable-cols-with-no-source
Fix ColumnsSelector cannot hide DataTable.Col items with no source
2 parents f7d5ca2 + af4e6a8 commit 6065878

File tree

6 files changed

+41
-11
lines changed

6 files changed

+41
-11
lines changed

packages/ra-ui-materialui/src/list/datatable/ColumnsButton.spec.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import * as React from 'react';
22
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3-
import { Basic, FewColumns, LabelTypes } from './ColumnsButton.stories';
3+
import {
4+
Basic,
5+
FewColumns,
6+
LabelTypes,
7+
NoSource,
8+
} from './ColumnsButton.stories';
49

510
describe('ColumnsButton', () => {
611
it('should render one row per column unless they are hidden', async () => {
@@ -56,4 +61,11 @@ describe('ColumnsButton', () => {
5661
).toHaveLength(8);
5762
});
5863
});
64+
it('should work with columns that have no source', async () => {
65+
render(<NoSource />);
66+
await screen.findByText('c0 value');
67+
fireEvent.click(await screen.findByText('ra.action.select_columns'));
68+
fireEvent.click(await screen.findByLabelText('c_0'));
69+
expect(screen.queryByText('c0 value')).toBeNull();
70+
});
5971
});

packages/ra-ui-materialui/src/list/datatable/ColumnsButton.stories.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,15 @@ export const LabelTypes = () => (
101101
</DataTable>
102102
</Wrapper>
103103
);
104+
105+
export const NoSource = () => (
106+
<Wrapper aside={<ColumnsButton />} actions={null}>
107+
<DataTable bulkActionButtons={false}>
108+
<DataTable.Col label="c_0">c0 value</DataTable.Col>
109+
<DataTable.Col label="c_1">c1 value</DataTable.Col>
110+
<DataTable.Col label="c_2">c2 value</DataTable.Col>
111+
<DataTable.Col label="c_3">c3 value</DataTable.Col>
112+
<DataTable.Col label="c_4">c4 value</DataTable.Col>
113+
</DataTable>
114+
</Wrapper>
115+
);

packages/ra-ui-materialui/src/list/datatable/ColumnsSelector.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,10 @@ export const ColumnsSelector = ({ children }: ColumnsSelectorProps) => {
121121
setColumnRanks(undefined);
122122
setHiddenColumns(defaultHiddenColumns);
123123
}}
124-
>
125-
{translate('ra.action.reset', {
124+
label={translate('ra.action.reset', {
126125
_: 'Reset',
127126
})}
128-
</Button>
127+
/>
129128
</Box>
130129
</MenuList>,
131130
container

packages/ra-ui-materialui/src/list/datatable/ColumnsSelectorItem.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ export const ColumnsSelectorItem = ({
2828
);
2929
const columnFilter = useDataTableColumnFilterContext();
3030
const translateLabel = useTranslateLabel();
31-
if (!source && !label) return null;
31+
if (!source && (!label || typeof label !== 'string')) return null;
32+
const sourceOrLabel = source || (label as string);
3233
const fieldLabel = translateLabel({
3334
label: typeof label === 'string' ? label : undefined,
3435
resource,
3536
source,
3637
}) as string;
37-
const isColumnHidden = hiddenColumns.includes(source!);
38+
const isColumnHidden = hiddenColumns.includes(sourceOrLabel!);
3839
const isColumnFiltered = fieldLabelMatchesFilter(fieldLabel, columnFilter);
3940

4041
const handleMove = (index1, index2) => {
@@ -76,16 +77,18 @@ export const ColumnsSelectorItem = ({
7677
return isColumnFiltered ? (
7778
<FieldToggle
7879
key={columnRank}
79-
source={source!}
80+
source={sourceOrLabel}
8081
label={fieldLabel}
8182
index={String(columnRank)}
8283
selected={!isColumnHidden}
8384
onToggle={() =>
8485
isColumnHidden
8586
? setHiddenColumns(
86-
hiddenColumns.filter(column => column !== source!)
87+
hiddenColumns.filter(
88+
column => column !== sourceOrLabel!
89+
)
8790
)
88-
: setHiddenColumns([...hiddenColumns, source!])
91+
: setHiddenColumns([...hiddenColumns, sourceOrLabel!])
8992
}
9093
onMove={handleMove}
9194
/>

packages/ra-ui-materialui/src/list/datatable/DataTableCell.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ export const DataTableCell = React.memo(
3939
defaultHiddenColumns
4040
);
4141
const record = useRecordContext();
42-
const isColumnHidden = hiddenColumns.includes(source!);
42+
const isColumnHidden = hiddenColumns.includes(
43+
source ?? (label as string)
44+
);
4345
if (isColumnHidden) return null;
4446
if (!render && !field && !children && !source) {
4547
throw new Error(

packages/ra-ui-materialui/src/list/datatable/DataTableHeadCell.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ export const DataTableHeadCell = React.memo(
6060
const resource = useResourceContext();
6161
const translate = useTranslate();
6262
const translateLabel = useTranslateLabel();
63-
const isColumnHidden = hiddenColumns.includes(source!);
63+
const isColumnHidden = hiddenColumns.includes(
64+
source ?? (label as string)
65+
);
6466
if (isColumnHidden) return null;
6567
const nextSortOrder =
6668
sort && sort.field === source

0 commit comments

Comments
 (0)