Skip to content

Commit cfd1cb3

Browse files
authored
[pickers] Refactor owner state typing (#17517)
1 parent 322abed commit cfd1cb3

File tree

20 files changed

+161
-58
lines changed

20 files changed

+161
-58
lines changed

packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
openPicker,
1010
stubMatchMedia,
1111
} from 'test/utils/pickers';
12-
import { pickerPopperClasses } from '@mui/x-date-pickers/internals/components/PickerPopper';
12+
import { pickerPopperClasses } from '@mui/x-date-pickers/internals';
1313
import { MultiInputDateRangeField } from '../MultiInputDateRangeField';
1414

1515
describe('<DateRangePicker />', () => {

packages/x-date-pickers-pro/src/themeAugmentation/components.ts

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
1-
import { ComponentsProps, ComponentsOverrides } from '@mui/material/styles';
1+
import { ComponentsProps } from '@mui/material/styles';
2+
import { ComponentsOverrides, PickerToolbarOwnerState } from '@mui/x-date-pickers/internals';
3+
import { FieldOwnerState, PickerOwnerState } from '@mui/x-date-pickers/models';
4+
import { DateRangeCalendarOwnerState } from '../DateRangeCalendar/DateRangeCalendar.types';
5+
import { DateRangePickerDayOwnerState } from '../DateRangePickerDay/DateRangePickerDay.types';
26

37
export interface PickersProComponents<Theme = unknown> {
48
MuiDateRangeCalendar?: {
59
defaultProps?: ComponentsProps['MuiDateRangeCalendar'];
6-
styleOverrides?: ComponentsOverrides<Theme>['MuiDateRangeCalendar'];
10+
styleOverrides?: ComponentsOverrides<
11+
Theme,
12+
DateRangeCalendarOwnerState
13+
>['MuiDateRangeCalendar'];
714
};
815
MuiDateRangePickerDay?: {
916
defaultProps?: ComponentsProps['MuiDateRangePickerDay'];
10-
styleOverrides?: ComponentsOverrides<Theme>['MuiDateRangePickerDay'];
17+
styleOverrides?: ComponentsOverrides<
18+
Theme,
19+
DateRangePickerDayOwnerState
20+
>['MuiDateRangePickerDay'];
1121
};
1222
MuiDateTimeRangePickerTabs?: {
1323
defaultProps?: ComponentsProps['MuiDateTimeRangePickerTabs'];
14-
styleOverrides?: ComponentsOverrides<Theme>['MuiDateTimeRangePickerTabs'];
24+
styleOverrides?: ComponentsOverrides<Theme, PickerOwnerState>['MuiDateTimeRangePickerTabs'];
1525
};
1626
MuiDateRangePickerToolbar?: {
1727
defaultProps?: ComponentsProps['MuiDateRangePickerToolbar'];
18-
styleOverrides?: ComponentsOverrides<Theme>['MuiDateRangePickerToolbar'];
28+
styleOverrides?: ComponentsOverrides<
29+
Theme,
30+
PickerToolbarOwnerState
31+
>['MuiDateRangePickerToolbar'];
1932
};
2033
MuiDateTimeRangePickerToolbar?: {
2134
defaultProps?: ComponentsProps['MuiDateTimeRangePickerToolbar'];
22-
styleOverrides?: ComponentsOverrides<Theme>['MuiDateTimeRangePickerToolbar'];
35+
styleOverrides?: ComponentsOverrides<
36+
Theme,
37+
PickerToolbarOwnerState
38+
>['MuiDateTimeRangePickerToolbar'];
2339
};
2440
MuiPickersRangeCalendarHeader?: {
2541
defaultProps?: ComponentsProps['MuiPickersRangeCalendarHeader'];
@@ -28,15 +44,15 @@ export interface PickersProComponents<Theme = unknown> {
2844
// Multi input range fields
2945
MuiMultiInputDateRangeField?: {
3046
defaultProps?: ComponentsProps['MuiMultiInputDateRangeField'];
31-
styleOverrides?: ComponentsOverrides<Theme>['MuiMultiInputDateRangeField'];
47+
styleOverrides?: ComponentsOverrides<Theme, FieldOwnerState>['MuiMultiInputDateRangeField'];
3248
};
3349
MuiMultiInputDateTimeRangeField?: {
3450
defaultProps?: ComponentsProps['MuiMultiInputDateTimeRangeField'];
35-
styleOverrides?: ComponentsOverrides<Theme>['MuiMultiInputDateTimeRangeField'];
51+
styleOverrides?: ComponentsOverrides<Theme, FieldOwnerState>['MuiMultiInputDateTimeRangeField'];
3652
};
3753
MuiMultiInputTimeRangeField?: {
3854
defaultProps?: ComponentsProps['MuiMultiInputTimeRangeField'];
39-
styleOverrides?: ComponentsOverrides<Theme>['MuiMultiInputTimeRangeField'];
55+
styleOverrides?: ComponentsOverrides<Theme, FieldOwnerState>['MuiMultiInputTimeRangeField'];
4056
};
4157

4258
// Single input range fields

packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import {
99
PickersFadeTransitionGroupClasses,
1010
} from './pickersFadeTransitionGroupClasses';
1111

12-
export interface PickersFadeTransitionGroupProps {
13-
children: React.ReactElement<any>;
12+
export interface ExportedPickersFadeTransitionGroupProps {
1413
className?: string;
1514
reduceAnimations: boolean;
1615
transKey: React.Key;
@@ -20,6 +19,10 @@ export interface PickersFadeTransitionGroupProps {
2019
classes?: Partial<PickersFadeTransitionGroupClasses>;
2120
}
2221

22+
export interface PickersFadeTransitionGroupProps extends ExportedPickersFadeTransitionGroupProps {
23+
children: React.ReactElement<any>;
24+
}
25+
2326
const useUtilityClasses = (classes: Partial<PickersFadeTransitionGroupClasses> | undefined) => {
2427
const slots = {
2528
root: ['root'],
@@ -31,7 +34,7 @@ const useUtilityClasses = (classes: Partial<PickersFadeTransitionGroupClasses> |
3134
const PickersFadeTransitionGroupRoot = styled(TransitionGroup, {
3235
name: 'MuiPickersFadeTransitionGroup',
3336
slot: 'Root',
34-
})({
37+
})<{ ownerState: ExportedPickersFadeTransitionGroupProps }>({
3538
display: 'block',
3639
position: 'relative',
3740
});
@@ -41,16 +44,21 @@ const PickersFadeTransitionGroupRoot = styled(TransitionGroup, {
4144
*/
4245
export function PickersFadeTransitionGroup(inProps: PickersFadeTransitionGroupProps) {
4346
const props = useThemeProps({ props: inProps, name: 'MuiPickersFadeTransitionGroup' });
44-
const { children, className, reduceAnimations, transKey, classes: classesProp } = props;
47+
const { className, reduceAnimations, transKey, classes: classesProp } = props;
48+
const { children, ...other } = props;
4549
const classes = useUtilityClasses(classesProp);
4650
const theme = useTheme();
4751

4852
if (reduceAnimations) {
4953
return children;
5054
}
55+
const ownerState = { ...other };
5156

5257
return (
53-
<PickersFadeTransitionGroupRoot className={clsx(classes.root, className)}>
58+
<PickersFadeTransitionGroupRoot
59+
className={clsx(classes.root, className)}
60+
ownerState={ownerState}
61+
>
5462
<Fade
5563
appear={false}
5664
mountOnEnter

packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateCont
1515

1616
export type SlideDirection = 'right' | 'left';
1717

18-
interface PickerSlideTransitionOwnerState extends PickerOwnerState {
18+
export interface PickerSlideTransitionOwnerState extends PickerOwnerState {
1919
slideDirection: SlideDirection;
2020
}
2121

@@ -70,7 +70,7 @@ const PickersSlideTransitionRoot = styled(TransitionGroup, {
7070
styles['slideExitActiveLeft-right'],
7171
},
7272
],
73-
})<TransitionGroupProps>(({ theme }) => {
73+
})<TransitionGroupProps & { ownerState?: PickerSlideTransitionOwnerState }>(({ theme }) => {
7474
const slideTransition = theme.transitions.create('transform', {
7575
duration: theme.transitions.duration.complex,
7676
easing: 'cubic-bezier(0.35, 0.8, 0.4, 1)',
@@ -156,6 +156,7 @@ export function PickersSlideTransition(inProps: SlideTransitionProps) {
156156
})
157157
}
158158
role="presentation"
159+
ownerState={ownerState}
159160
>
160161
<CSSTransition
161162
mountOnEnter

packages/x-date-pickers/src/DateCalendar/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export { getDateCalendarUtilityClass, dateCalendarClasses } from './dateCalendar
99
export type { DateCalendarClassKey, DateCalendarClasses } from './dateCalendarClasses';
1010
export { dayCalendarClasses } from './dayCalendarClasses';
1111
export type { DayCalendarClassKey, DayCalendarClasses } from './dayCalendarClasses';
12-
export type { PickersFadeTransitionGroupProps } from './PickersFadeTransitionGroup';
12+
export type {
13+
PickersFadeTransitionGroupProps,
14+
ExportedPickersFadeTransitionGroupProps,
15+
} from './PickersFadeTransitionGroup';
1316
export { pickersFadeTransitionGroupClasses } from './pickersFadeTransitionGroupClasses';
1417
export type {
1518
PickersFadeTransitionGroupClassKey,

packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const useUtilityClasses = (classes: Partial<DayCalendarSkeletonClasses> | undefi
3939
const DayCalendarSkeletonRoot = styled('div', {
4040
name: 'MuiDayCalendarSkeleton',
4141
slot: 'Root',
42-
})({
42+
})<{ ownerState: DayCalendarSkeletonProps }>({
4343
alignSelf: 'start',
4444
});
4545

@@ -90,7 +90,11 @@ function DayCalendarSkeleton(inProps: DayCalendarSkeletonProps) {
9090
const classes = useUtilityClasses(classesProp);
9191

9292
return (
93-
<DayCalendarSkeletonRoot className={clsx(classes.root, className)} {...other}>
93+
<DayCalendarSkeletonRoot
94+
className={clsx(classes.root, className)}
95+
ownerState={props}
96+
{...other}
97+
>
9498
{monthMap.map((week, index) => (
9599
<DayCalendarSkeletonWeek key={index} className={classes.week}>
96100
{week.map((dayInMonth, index2) => (

packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClockSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface MultiSectionDigitalClockSectionProps<TSectionValue extends numb
4343
role?: string;
4444
}
4545

46-
interface MultiSectionDigitalClockSectionOwnerState extends PickerOwnerState {
46+
export interface MultiSectionDigitalClockSectionOwnerState extends PickerOwnerState {
4747
/**
4848
* `true` if this is not the initial render of the digital clock.
4949
*/

packages/x-date-pickers/src/PickersTextField/PickersInput/PickersInput.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface PickersInputProps extends PickersInputBaseProps {
1818
disableUnderline?: boolean;
1919
}
2020

21-
interface PickerInputOwnerState extends PickerTextFieldOwnerState {
21+
export interface PickerInputOwnerState extends PickerTextFieldOwnerState {
2222
/**
2323
* `true` if the input has an underline, `false` otherwise.
2424
*/

packages/x-date-pickers/src/TimeClock/Clock.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export interface ClockProps extends ReturnType<typeof useMeridiemMode>, FormProp
5050
classes?: Partial<ClockClasses>;
5151
}
5252

53-
interface ClockOwnerState extends PickerOwnerState {
53+
export interface ClockOwnerState extends PickerOwnerState {
5454
/**
5555
* `true` if the clock is disabled, `false` otherwise.
5656
*/

packages/x-date-pickers/src/TimeClock/ClockNumber.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export interface ClockNumberProps extends React.HTMLAttributes<HTMLSpanElement>
2525
classes?: Partial<ClockNumberClasses>;
2626
}
2727

28-
interface ClockNumberOwnerState extends PickerOwnerState {
28+
export interface ClockNumberOwnerState extends PickerOwnerState {
2929
/**
3030
* `true` if the clock number is in the inner clock ring.
3131
* When used with meridiem, all the hours are in the outer ring.

packages/x-date-pickers/src/TimeClock/ClockPointer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export interface ClockPointerProps extends React.HTMLAttributes<HTMLDivElement>
2121
classes?: Partial<ClockPointerClasses>;
2222
}
2323

24-
interface ClockPointerOwnerState extends PickerOwnerState {
24+
export interface ClockPointerOwnerState extends PickerOwnerState {
2525
/**
2626
* `true` if the clock pointer should animate.
2727
*/

packages/x-date-pickers/src/internals/components/PickerPopper/PickerPopper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { usePickerPrivateContext } from '../../hooks/usePickerPrivateContext';
2626
import { PickerOwnerState } from '../../../models';
2727
import { usePickerContext } from '../../../hooks';
2828

29-
interface PickerPopperOwnerState extends PickerOwnerState {
29+
export interface PickerPopperOwnerState extends PickerOwnerState {
3030
popperPlacement: PopperPlacementType;
3131
}
3232

packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const useUtilityClasses = (classes: Partial<PickersToolbarButtonClasses> | undef
3030
const PickersToolbarButtonRoot = styled(Button, {
3131
name: 'MuiPickersToolbarButton',
3232
slot: 'Root',
33-
})({
33+
})<{ ownerState: PickersToolbarButtonProps }>({
3434
padding: 0,
3535
minWidth: 16,
3636
textTransform: 'none',
@@ -61,6 +61,7 @@ export const PickersToolbarButton = React.forwardRef(function PickersToolbarButt
6161
variant="text"
6262
ref={ref}
6363
className={clsx(classes.root, className)}
64+
ownerState={props}
6465
{...(width ? { sx: { width } } : {})}
6566
{...other}
6667
>

packages/x-date-pickers/src/internals/components/PickersToolbarText.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const PickersToolbarTextRoot = styled(Typography, {
3333
slot: 'Root',
3434
})<{
3535
component?: React.ElementType;
36+
ownerState: PickersToolbarTextProps;
3637
}>(({ theme }) => ({
3738
transition: theme.transitions.create('color'),
3839
color: (theme.vars || theme).palette.text.secondary,
@@ -52,6 +53,7 @@ export const PickersToolbarText = React.forwardRef<HTMLSpanElement, PickersToolb
5253
ref={ref}
5354
className={clsx(classes.root, className)}
5455
component="span"
56+
ownerState={props}
5557
{...(selected && { 'data-selected': true })}
5658
{...other}
5759
>

packages/x-date-pickers/src/internals/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export type {
3131
PickerPopperSlots,
3232
PickerPopperSlotProps,
3333
} from './components/PickerPopper/PickerPopper';
34+
export { pickerPopperClasses } from './components/PickerPopper/pickerPopperClasses';
3435
export { PickersToolbar } from './components/PickersToolbar';
3536
export type { PickersToolbarProps } from './components/PickersToolbar';
3637
export { pickersToolbarClasses } from './components/pickersToolbarClasses';
@@ -154,6 +155,7 @@ export type {
154155
InferNonNullablePickerValue,
155156
PickerValidValue,
156157
} from './models/value';
158+
export type { ComponentsOverrides } from './models/helpers';
157159

158160
export { createStepNavigation } from './utils/createStepNavigation';
159161
export {

packages/x-date-pickers/src/internals/models/helpers.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ComponentNameToClassKey, ComponentsPropsList } from '@mui/material/styles';
2+
import { CSSObject, CSSInterpolation, Interpolation } from '@mui/system';
13
/**
24
* All standard components exposed by `material-ui` are `StyledComponents` with
35
* certain `classes`, on which one can also set a top-level `className` and inline
@@ -7,3 +9,35 @@ export type ExtendMui<C, Removals extends keyof C = never> = Omit<
79
C,
810
'classes' | 'theme' | Removals
911
>;
12+
13+
// This and `ComponentsOverrides` are extracted from the `@mui/material/styles` package
14+
// with the addition of supporting explicit `OwnerState` type.
15+
// https://github.com/mui/material-ui/blob/master/packages/mui-material/src/styles/overrides.ts
16+
type OverridesStyleRules<
17+
ClassKey extends string = string,
18+
ComponentName = keyof ComponentsPropsList,
19+
Theme = unknown,
20+
OwnerState = unknown,
21+
> = Record<
22+
ClassKey,
23+
Interpolation<
24+
(ComponentName extends keyof ComponentsPropsList
25+
? ComponentsPropsList[ComponentName] &
26+
Record<string, unknown> & {
27+
ownerState: OwnerState extends Object
28+
? OwnerState
29+
: ComponentsPropsList[ComponentName] & Record<string, unknown>;
30+
}
31+
: {}) & {
32+
theme: Theme;
33+
} & Record<string, unknown>
34+
>
35+
>;
36+
37+
export type ComponentsOverrides<Theme = unknown, OwnerState = unknown> = {
38+
[Name in keyof ComponentNameToClassKey]?: Partial<
39+
OverridesStyleRules<ComponentNameToClassKey[Name], Name, Theme, OwnerState>
40+
>;
41+
} & {
42+
MuiCssBaseline?: CSSObject | string | ((theme: Theme) => CSSInterpolation);
43+
};

0 commit comments

Comments
 (0)