Skip to content

Commit b599ca5

Browse files
authored
Merge pull request #8376 from marmelab/fix-dc-columns
Fix `<DatagridConfigurable>` ignores children without label or source
2 parents 4ad05e6 + 8482a7a commit b599ca5

File tree

5 files changed

+57
-26
lines changed

5 files changed

+57
-26
lines changed

packages/ra-core/src/i18n/TranslationMessages.ts

+3
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ export interface TranslationMessages extends StringMap {
179179
configurable?: {
180180
customize: string;
181181
configureMode: string;
182+
Datagrid: {
183+
unlabeled: string;
184+
};
182185
inspector: {
183186
title: string;
184187
content: string;

packages/ra-language-english/src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ const englishMessages: TranslationMessages = {
180180
configurable: {
181181
customize: 'Customize',
182182
configureMode: 'Configure this page',
183+
Datagrid: {
184+
unlabeled: 'Unlabeled column #%{column}',
185+
},
183186
inspector: {
184187
title: 'Inspector',
185188
content: 'Hover the application UI elements to configure them',

packages/ra-language-french/src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ const frenchMessages: TranslationMessages = {
186186
configurable: {
187187
customize: 'Personnaliser',
188188
configureMode: 'Configurer cette page',
189+
Datagrid: {
190+
unlabeled: 'Colonne sans label #%{column}',
191+
},
189192
inspector: {
190193
title: 'Inspecteur',
191194
content: 'Sélectionner un composant pour le configurer',

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

+28-21
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { Box } from '@mui/material';
66
import { DatagridConfigurable } from './DatagridConfigurable';
77
import { Inspector, InspectorButton } from '../../preferences';
88
import { TextField } from '../../field';
9+
import { EditButton } from '../../button';
10+
import { createTheme, ThemeProvider } from '@mui/material/styles';
911

1012
export default { title: 'ra-ui-materialui/list/DatagridConfigurable' };
1113

@@ -39,28 +41,33 @@ const data = [
3941
const AuthorField = () => <TextField source="author" />;
4042
AuthorField.defaultProps = { label: 'Author' };
4143

44+
const theme = createTheme();
45+
4246
export const Basic = () => (
43-
<PreferencesEditorContextProvider>
44-
<MemoryRouter>
45-
<Inspector />
46-
<Box display="flex" justifyContent="flex-end">
47-
<InspectorButton />
48-
</Box>
49-
<Box p={2}>
50-
<DatagridConfigurable
51-
resource="books1"
52-
data={data}
53-
sort={{ field: 'title', order: 'ASC' }}
54-
bulkActionButtons={false}
55-
>
56-
<TextField source="id" />
57-
<TextField source="title" label="Original title" />
58-
<TextField source="author" />
59-
<TextField source="year" />
60-
</DatagridConfigurable>
61-
</Box>
62-
</MemoryRouter>
63-
</PreferencesEditorContextProvider>
47+
<ThemeProvider theme={theme}>
48+
<PreferencesEditorContextProvider>
49+
<MemoryRouter>
50+
<Inspector />
51+
<Box display="flex" justifyContent="flex-end">
52+
<InspectorButton />
53+
</Box>
54+
<Box p={2}>
55+
<DatagridConfigurable
56+
resource="books1"
57+
data={data}
58+
sort={{ field: 'title', order: 'ASC' }}
59+
bulkActionButtons={false}
60+
>
61+
<TextField source="id" />
62+
<TextField source="title" label="Original title" />
63+
<TextField source="author" />
64+
<TextField source="year" />
65+
<EditButton />
66+
</DatagridConfigurable>
67+
</Box>
68+
</MemoryRouter>
69+
</PreferencesEditorContextProvider>
70+
</ThemeProvider>
6471
);
6572

6673
export const Omit = () => (

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

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import * as React from 'react';
2-
import { useResourceContext, usePreference, useStore } from 'ra-core';
2+
import {
3+
useResourceContext,
4+
usePreference,
5+
useStore,
6+
useTranslate,
7+
} from 'ra-core';
38

49
import { Configurable } from '../../preferences';
510
import { Datagrid, DatagridProps } from './Datagrid';
@@ -39,6 +44,8 @@ export const DatagridConfigurable = ({
3944
const resource = useResourceContext(props);
4045
const finalPreferenceKey = preferenceKey || `${resource}.datagrid`;
4146

47+
const translate = useTranslate();
48+
4249
const [availableColumns, setAvailableColumns] = useStore<
4350
ConfigurableDatagridColumn[]
4451
>(`preferences.${finalPreferenceKey}.availableColumns`, []);
@@ -52,12 +59,20 @@ export const DatagridConfigurable = ({
5259
React.useEffect(() => {
5360
// first render, or the preference have been cleared
5461
const columns = React.Children.map(props.children, (child, index) =>
55-
React.isValidElement(child) &&
56-
(child.props.source || child.props.label)
62+
React.isValidElement(child)
5763
? {
5864
index: String(index),
5965
source: child.props.source,
60-
label: child.props.label,
66+
label:
67+
child.props.source || child.props.label
68+
? child.props.label
69+
: translate(
70+
'ra.configurable.Datagrid.unlabeled',
71+
{
72+
column: index,
73+
_: `Unlabeled column #%{column}`,
74+
}
75+
),
6176
}
6277
: null
6378
).filter(column => column != null);
@@ -114,7 +129,7 @@ export interface DatagridConfigurableProps extends DatagridProps {
114129

115130
export interface ConfigurableDatagridColumn {
116131
index: string;
117-
source: string;
132+
source?: string;
118133
label?: string;
119134
}
120135

0 commit comments

Comments
 (0)