Skip to content

Commit dd9c7e0

Browse files
committed
Customizable select field and improve stories to test it.
1 parent 6f45456 commit dd9c7e0

File tree

2 files changed

+77
-34
lines changed

2 files changed

+77
-34
lines changed

packages/ra-ui-materialui/src/field/SelectField.stories.tsx

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,70 +35,77 @@ const genderChoices = [
3535
];
3636

3737
export const Basic = () => (
38-
<RecordContextProvider value={record}>
38+
<Wrapper record={record}>
3939
<SelectField source="gender" choices={genderChoices} />
40-
</RecordContextProvider>
40+
</Wrapper>
4141
);
4242

4343
const languages = [
4444
{ id: 'am', name: 'Amharic', nativeName: 'አማርኛ' },
4545
{ id: 'ar', name: 'Arabic', nativeName: 'العربية' },
4646
];
4747
export const OptionText = () => (
48-
<RecordContextProvider value={record}>
48+
<Wrapper record={record}>
4949
<SelectField
5050
source="language"
5151
choices={languages}
5252
optionText="nativeName"
5353
/>
54-
</RecordContextProvider>
54+
</Wrapper>
5555
);
5656

5757
const countries = [{ name: 'Arabic', code: 'ar' }];
5858
export const OptionValue = () => (
59-
<RecordContextProvider value={record}>
59+
<Wrapper record={record}>
6060
<SelectField source="language" choices={countries} optionValue="code" />
61-
</RecordContextProvider>
61+
</Wrapper>
6262
);
6363

6464
const optionRenderer = choice => `${choice.first_name} ${choice.last_name}`;
6565
const authors = [{ id: 1, first_name: 'John', last_name: 'Doe' }];
6666
export const OptionTextFunction = () => (
67-
<RecordContextProvider value={{ id: 1 }}>
67+
<Wrapper record={{ id: 1 }}>
6868
<SelectField
6969
source="id"
7070
choices={authors}
7171
optionText={optionRenderer}
7272
/>
73-
</RecordContextProvider>
73+
</Wrapper>
7474
);
7575

7676
const translateChoice = [
7777
{ id: 'no results', name: 'ra.navigation.no_results' },
7878
];
7979
export const TranslateChoice = () => (
80-
<AdminContext i18nProvider={i18nProvider}>
81-
<RecordContextProvider value={record}>
82-
<Labeled
83-
label="translateChoice={true}"
84-
sx={{ border: '1px solid', margin: '1rem', padding: '1rem' }}
85-
>
86-
<SelectField
87-
source="data"
88-
choices={translateChoice}
89-
// translateChoice={true} is set by default
90-
/>
91-
</Labeled>
92-
<Labeled
93-
label="translateChoice={false}"
94-
sx={{ border: '1px solid', margin: '1rem', padding: '1rem' }}
95-
>
96-
<SelectField
97-
source="data"
98-
choices={translateChoice}
99-
translateChoice={false}
100-
/>
101-
</Labeled>
102-
</RecordContextProvider>
80+
<Wrapper record={record}>
81+
<Labeled
82+
label="translateChoice={true}"
83+
sx={{ border: '1px solid', margin: '1rem', padding: '1rem' }}
84+
>
85+
<SelectField
86+
source="data"
87+
choices={translateChoice}
88+
// translateChoice={true} is set by default
89+
/>
90+
</Labeled>
91+
<Labeled
92+
label="translateChoice={false}"
93+
sx={{ border: '1px solid', margin: '1rem', padding: '1rem' }}
94+
>
95+
<SelectField
96+
source="data"
97+
choices={translateChoice}
98+
translateChoice={false}
99+
/>
100+
</Labeled>
101+
</Wrapper>
102+
);
103+
104+
const Wrapper = ({ children, record, defaultTheme = 'light' }) => (
105+
<AdminContext
106+
i18nProvider={i18nProvider}
107+
defaultTheme={defaultTheme as any}
108+
>
109+
<RecordContextProvider value={record}>{children}</RecordContextProvider>
103110
</AdminContext>
104111
);

packages/ra-ui-materialui/src/field/SelectField.tsx

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import * as React from 'react';
22
import { ChoicesProps, useChoices, useFieldValue, useTranslate } from 'ra-core';
33
import { Typography, TypographyProps } from '@mui/material';
4+
import {
5+
ComponentsOverrides,
6+
styled,
7+
useThemeProps,
8+
} from '@mui/material/styles';
49

510
import { sanitizeFieldRestProps } from './sanitizeFieldRestProps';
611
import { FieldProps } from './types';
@@ -71,8 +76,13 @@ import { genericMemo } from './genericMemo';
7176
const SelectFieldImpl = <
7277
RecordType extends Record<string, any> = Record<string, any>,
7378
>(
74-
props: SelectFieldProps<RecordType>
79+
inProps: SelectFieldProps<RecordType>
7580
) => {
81+
const props = useThemeProps({
82+
props: inProps,
83+
name: PREFIX,
84+
});
85+
7686
const {
7787
className,
7888
emptyText,
@@ -111,14 +121,14 @@ const SelectFieldImpl = <
111121
const choiceText = getChoiceText(choice);
112122

113123
return (
114-
<Typography
124+
<StyledTypography
115125
component="span"
116126
variant="body2"
117127
className={className}
118128
{...sanitizeFieldRestProps(rest)}
119129
>
120130
{choiceText}
121-
</Typography>
131+
</StyledTypography>
122132
);
123133
};
124134

@@ -131,3 +141,29 @@ export interface SelectFieldProps<
131141
> extends ChoicesProps,
132142
FieldProps<RecordType>,
133143
Omit<TypographyProps, 'textAlign'> {}
144+
145+
const PREFIX = 'RaSelectField';
146+
147+
const StyledTypography = styled(Typography, {
148+
name: PREFIX,
149+
overridesResolver: (props, styles) => styles.root,
150+
})({});
151+
152+
declare module '@mui/material/styles' {
153+
interface ComponentNameToClassKey {
154+
[PREFIX]: 'root';
155+
}
156+
157+
interface ComponentsPropsList {
158+
[PREFIX]: Partial<SelectFieldProps>;
159+
}
160+
161+
interface Components {
162+
[PREFIX]?: {
163+
defaultProps?: ComponentsPropsList[typeof PREFIX];
164+
styleOverrides?: ComponentsOverrides<
165+
Omit<Theme, 'components'>
166+
>[typeof PREFIX];
167+
};
168+
}
169+
}

0 commit comments

Comments
 (0)