Skip to content

Commit a431d43

Browse files
committed
Customizable number field and add basic story to test it.
1 parent 971c731 commit a431d43

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Paper, Stack } from '@mui/material';
2+
import * as React from 'react';
3+
4+
import { NumberField, NumberFieldProps } from './NumberField';
5+
import { AdminContext } from '../AdminContext';
6+
import { defaultDarkTheme, defaultLightTheme } from '../theme';
7+
8+
export default { title: 'ra-ui-materialui/fields/NumberField' };
9+
10+
export const Basic = ({
11+
value,
12+
theme,
13+
...props
14+
}: Partial<NumberFieldProps> & { value?: number; theme?: string }) => {
15+
return (
16+
<AdminContext
17+
theme={theme === 'light' ? defaultLightTheme : defaultDarkTheme}
18+
>
19+
<Paper sx={{ p: 2 }}>
20+
<Stack direction="row">
21+
<NumberField record={{ value }} source="value" {...props} />
22+
</Stack>
23+
</Paper>
24+
</AdminContext>
25+
);
26+
};
27+
28+
Basic.argTypes = {
29+
value: {
30+
options: ['integer', 'float', 'zero', 'undefined'],
31+
mapping: {
32+
integer: 5,
33+
float: 75.21,
34+
zero: 0,
35+
undefined: undefined,
36+
},
37+
control: { type: 'select' },
38+
},
39+
theme: {
40+
options: ['light', 'dark'],
41+
control: { type: 'select' },
42+
},
43+
};
44+
Basic.args = {
45+
theme: 'light',
46+
value: 'integer',
47+
};

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

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

510
import { sanitizeFieldRestProps } from './sanitizeFieldRestProps';
@@ -37,8 +42,13 @@ import { genericMemo } from './genericMemo';
3742
const NumberFieldImpl = <
3843
RecordType extends Record<string, any> = Record<string, any>,
3944
>(
40-
props: NumberFieldProps<RecordType>
45+
inProps: NumberFieldProps<RecordType>
4146
) => {
47+
const props = useThemeProps({
48+
props: inProps,
49+
name: PREFIX,
50+
});
51+
4252
const {
4353
className,
4454
emptyText,
@@ -70,7 +80,7 @@ const NumberFieldImpl = <
7080
}
7181

7282
return (
73-
<Typography
83+
<StyledTypography
7484
variant="body2"
7585
component="span"
7686
className={className}
@@ -79,7 +89,7 @@ const NumberFieldImpl = <
7989
{hasNumberFormat && typeof value === 'number'
8090
? value.toLocaleString(locales, options)
8191
: value}
82-
</Typography>
92+
</StyledTypography>
8393
);
8494
};
8595

@@ -107,3 +117,29 @@ const hasNumberFormat = !!(
107117
Intl &&
108118
typeof Intl.NumberFormat === 'function'
109119
);
120+
121+
const PREFIX = 'RaNumberField';
122+
123+
const StyledTypography = styled(Typography, {
124+
name: PREFIX,
125+
overridesResolver: (props, styles) => styles.root,
126+
})({});
127+
128+
declare module '@mui/material/styles' {
129+
interface ComponentNameToClassKey {
130+
[PREFIX]: 'root';
131+
}
132+
133+
interface ComponentsPropsList {
134+
[PREFIX]: Partial<NumberFieldProps>;
135+
}
136+
137+
interface Components {
138+
[PREFIX]?: {
139+
defaultProps?: ComponentsPropsList[typeof PREFIX];
140+
styleOverrides?: ComponentsOverrides<
141+
Omit<Theme, 'components'>
142+
>[typeof PREFIX];
143+
};
144+
}
145+
}

0 commit comments

Comments
 (0)