@mui/x-date-pickers 6.10.2 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/AdapterDayjs/AdapterDayjs.d.ts +8 -1
  2. package/AdapterDayjs/AdapterDayjs.js +66 -38
  3. package/CHANGELOG.md +92 -0
  4. package/DateCalendar/DateCalendar.d.ts +1 -1
  5. package/DateCalendar/DateCalendar.js +48 -38
  6. package/DateCalendar/DateCalendar.types.d.ts +9 -1
  7. package/DateCalendar/index.d.ts +1 -2
  8. package/DateCalendar/index.js +3 -2
  9. package/DateCalendar/useCalendarState.d.ts +1 -1
  10. package/DateField/DateField.d.ts +1 -1
  11. package/DateField/DateField.js +2 -2
  12. package/DatePicker/DatePicker.d.ts +1 -1
  13. package/DatePicker/DatePickerToolbar.d.ts +1 -1
  14. package/DateTimeField/DateTimeField.d.ts +1 -1
  15. package/DateTimeField/DateTimeField.js +2 -2
  16. package/DateTimePicker/DateTimePicker.d.ts +1 -1
  17. package/DayCalendarSkeleton/DayCalendarSkeleton.d.ts +1 -1
  18. package/DesktopDatePicker/DesktopDatePicker.d.ts +1 -1
  19. package/DesktopDatePicker/DesktopDatePicker.js +2 -2
  20. package/DesktopDateTimePicker/DesktopDateTimePicker.d.ts +1 -1
  21. package/DesktopDateTimePicker/DesktopDateTimePicker.js +2 -2
  22. package/DesktopTimePicker/DesktopTimePicker.d.ts +1 -1
  23. package/DesktopTimePicker/DesktopTimePicker.js +2 -2
  24. package/DigitalClock/DigitalClock.d.ts +1 -1
  25. package/LocalizationProvider/LocalizationProvider.d.ts +1 -1
  26. package/MobileDatePicker/MobileDatePicker.d.ts +1 -1
  27. package/MobileDatePicker/MobileDatePicker.js +2 -2
  28. package/MobileDateTimePicker/MobileDateTimePicker.d.ts +1 -1
  29. package/MobileDateTimePicker/MobileDateTimePicker.js +2 -2
  30. package/MobileTimePicker/MobileTimePicker.d.ts +1 -1
  31. package/MobileTimePicker/MobileTimePicker.js +2 -2
  32. package/MonthCalendar/MonthCalendar.d.ts +1 -1
  33. package/MultiSectionDigitalClock/MultiSectionDigitalClock.d.ts +1 -1
  34. package/MultiSectionDigitalClock/MultiSectionDigitalClockSection.d.ts +1 -1
  35. package/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.d.ts +21 -9
  36. package/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +72 -28
  37. package/PickersCalendarHeader/index.d.ts +4 -0
  38. package/PickersCalendarHeader/index.js +2 -0
  39. package/PickersCalendarHeader/package.json +6 -0
  40. package/PickersDay/PickersDay.d.ts +1 -1
  41. package/StaticDatePicker/StaticDatePicker.d.ts +1 -1
  42. package/StaticDateTimePicker/StaticDateTimePicker.d.ts +1 -1
  43. package/StaticTimePicker/StaticTimePicker.d.ts +1 -1
  44. package/TimeClock/ClockNumbers.d.ts +1 -1
  45. package/TimeClock/TimeClock.d.ts +1 -1
  46. package/TimeField/TimeField.d.ts +1 -1
  47. package/TimeField/TimeField.js +2 -2
  48. package/TimePicker/TimePicker.d.ts +1 -1
  49. package/YearCalendar/YearCalendar.d.ts +2 -2
  50. package/index.js +1 -1
  51. package/internals/components/PickersModalDialog.d.ts +2 -2
  52. package/internals/components/PickersPopper.d.ts +3 -3
  53. package/internals/components/PickersToolbar.d.ts +1 -1
  54. package/internals/hooks/date-helpers-hooks.d.ts +1 -2
  55. package/internals/hooks/useDefaultReduceAnimations.d.ts +2 -0
  56. package/internals/hooks/useDefaultReduceAnimations.js +9 -0
  57. package/internals/hooks/useField/useField.js +9 -4
  58. package/internals/hooks/useField/useField.utils.d.ts +1 -1
  59. package/internals/hooks/useField/useField.utils.js +6 -5
  60. package/internals/index.d.ts +1 -3
  61. package/internals/index.js +1 -2
  62. package/internals/utils/valueManagers.js +1 -1
  63. package/legacy/AdapterDayjs/AdapterDayjs.js +64 -38
  64. package/legacy/DateCalendar/DateCalendar.js +50 -40
  65. package/legacy/DateCalendar/index.js +3 -2
  66. package/legacy/DateField/DateField.js +2 -2
  67. package/legacy/DateTimeField/DateTimeField.js +2 -2
  68. package/legacy/DesktopDatePicker/DesktopDatePicker.js +2 -2
  69. package/legacy/DesktopDateTimePicker/DesktopDateTimePicker.js +2 -2
  70. package/legacy/DesktopTimePicker/DesktopTimePicker.js +2 -2
  71. package/legacy/MobileDatePicker/MobileDatePicker.js +2 -2
  72. package/legacy/MobileDateTimePicker/MobileDateTimePicker.js +2 -2
  73. package/legacy/MobileTimePicker/MobileTimePicker.js +2 -2
  74. package/legacy/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +57 -13
  75. package/legacy/PickersCalendarHeader/index.js +2 -0
  76. package/legacy/TimeField/TimeField.js +2 -2
  77. package/legacy/index.js +1 -1
  78. package/legacy/internals/hooks/useDefaultReduceAnimations.js +9 -0
  79. package/legacy/internals/hooks/useField/useField.js +9 -4
  80. package/legacy/internals/hooks/useField/useField.utils.js +6 -5
  81. package/legacy/internals/index.js +1 -2
  82. package/legacy/internals/utils/valueManagers.js +1 -1
  83. package/legacy/tests/describeGregorianAdapter/testCalculations.js +63 -16
  84. package/modern/AdapterDayjs/AdapterDayjs.js +65 -38
  85. package/modern/DateCalendar/DateCalendar.js +46 -38
  86. package/modern/DateCalendar/index.js +3 -2
  87. package/modern/DateField/DateField.js +2 -2
  88. package/modern/DateTimeField/DateTimeField.js +2 -2
  89. package/modern/DesktopDatePicker/DesktopDatePicker.js +1 -1
  90. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -1
  91. package/modern/DesktopTimePicker/DesktopTimePicker.js +1 -1
  92. package/modern/MobileDatePicker/MobileDatePicker.js +1 -1
  93. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +1 -1
  94. package/modern/MobileTimePicker/MobileTimePicker.js +1 -1
  95. package/modern/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +72 -28
  96. package/modern/PickersCalendarHeader/index.js +2 -0
  97. package/modern/TimeField/TimeField.js +2 -2
  98. package/modern/index.js +1 -1
  99. package/modern/internals/hooks/useDefaultReduceAnimations.js +9 -0
  100. package/modern/internals/hooks/useField/useField.js +9 -4
  101. package/modern/internals/hooks/useField/useField.utils.js +6 -5
  102. package/modern/internals/index.js +1 -2
  103. package/modern/internals/utils/valueManagers.js +1 -1
  104. package/modern/tests/describeGregorianAdapter/testCalculations.js +63 -16
  105. package/node/AdapterDayjs/AdapterDayjs.js +65 -38
  106. package/node/DateCalendar/DateCalendar.js +52 -44
  107. package/node/DateCalendar/index.js +21 -8
  108. package/node/DateField/DateField.js +2 -2
  109. package/node/DateTimeField/DateTimeField.js +2 -2
  110. package/node/DesktopDatePicker/DesktopDatePicker.js +1 -1
  111. package/node/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -1
  112. package/node/DesktopTimePicker/DesktopTimePicker.js +1 -1
  113. package/node/MobileDatePicker/MobileDatePicker.js +1 -1
  114. package/node/MobileDateTimePicker/MobileDateTimePicker.js +1 -1
  115. package/node/MobileTimePicker/MobileTimePicker.js +1 -1
  116. package/node/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +73 -29
  117. package/node/PickersCalendarHeader/index.js +19 -0
  118. package/node/TimeField/TimeField.js +2 -2
  119. package/node/index.js +1 -1
  120. package/node/internals/hooks/useDefaultReduceAnimations.js +18 -0
  121. package/node/internals/hooks/useField/useField.js +9 -4
  122. package/node/internals/hooks/useField/useField.utils.js +6 -5
  123. package/node/internals/index.js +7 -14
  124. package/node/internals/utils/valueManagers.js +1 -1
  125. package/node/tests/describeGregorianAdapter/testCalculations.js +61 -16
  126. package/package.json +2 -2
  127. package/tests/describeGregorianAdapter/testCalculations.js +63 -16
  128. package/themeAugmentation/props.d.ts +2 -2
  129. package/internals/utils/defaultReduceAnimations.d.ts +0 -1
  130. package/internals/utils/defaultReduceAnimations.js +0 -1
  131. package/legacy/internals/utils/defaultReduceAnimations.js +0 -1
  132. package/modern/internals/utils/defaultReduceAnimations.js +0 -1
  133. package/node/internals/utils/defaultReduceAnimations.js +0 -8
  134. /package/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.d.ts +0 -0
  135. /package/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  136. /package/legacy/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  137. /package/modern/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  138. /package/node/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
@@ -4,6 +4,7 @@ const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "refere
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import clsx from 'clsx';
7
+ import { useSlotProps } from '@mui/base/utils';
7
8
  import { styled, useThemeProps } from '@mui/material/styles';
8
9
  import { unstable_composeClasses as composeClasses, unstable_useId as useId, unstable_useEventCallback as useEventCallback } from '@mui/utils';
9
10
  import { useCalendarState } from './useCalendarState';
@@ -13,10 +14,10 @@ import { DayCalendar } from './DayCalendar';
13
14
  import { MonthCalendar } from '../MonthCalendar';
14
15
  import { YearCalendar } from '../YearCalendar';
15
16
  import { useViews } from '../internals/hooks/useViews';
16
- import { PickersCalendarHeader } from './PickersCalendarHeader';
17
+ import { PickersCalendarHeader } from '../PickersCalendarHeader';
17
18
  import { findClosestEnabledDate, applyDefaultDate, mergeDateAndTime } from '../internals/utils/date-utils';
18
19
  import { PickerViewRoot } from '../internals/components/PickerViewRoot';
19
- import { defaultReduceAnimations } from '../internals/utils/defaultReduceAnimations';
20
+ import { useDefaultReduceAnimations } from '../internals/hooks/useDefaultReduceAnimations';
20
21
  import { getDateCalendarUtilityClass } from './dateCalendarClasses';
21
22
  import { useControlledValueWithTimezone } from '../internals/hooks/useValueWithTimezone';
22
23
  import { singleItemValueManager } from '../internals/utils/valueManagers';
@@ -35,21 +36,21 @@ const useUtilityClasses = ownerState => {
35
36
  function useDateCalendarDefaultizedProps(props, name) {
36
37
  const utils = useUtils();
37
38
  const defaultDates = useDefaultDates();
39
+ const defaultReduceAnimations = useDefaultReduceAnimations();
38
40
  const themeProps = useThemeProps({
39
41
  props,
40
42
  name
41
43
  });
42
- return _extends({
43
- loading: false,
44
- disablePast: false,
45
- disableFuture: false,
46
- openTo: 'day',
47
- views: ['year', 'day'],
48
- reduceAnimations: defaultReduceAnimations,
49
- renderLoading: () => /*#__PURE__*/_jsx("span", {
44
+ return _extends({}, themeProps, {
45
+ loading: themeProps.loading ?? false,
46
+ disablePast: themeProps.disablePast ?? false,
47
+ disableFuture: themeProps.disableFuture ?? false,
48
+ openTo: themeProps.openTo ?? 'day',
49
+ views: themeProps.views ?? ['year', 'day'],
50
+ reduceAnimations: themeProps.reduceAnimations ?? defaultReduceAnimations,
51
+ renderLoading: themeProps.renderLoading ?? (() => /*#__PURE__*/_jsx("span", {
50
52
  children: "..."
51
- })
52
- }, themeProps, {
53
+ })),
53
54
  minDate: applyDefaultDate(utils, themeProps.minDate, defaultDates.minDate),
54
55
  maxDate: applyDefaultDate(utils, themeProps.maxDate, defaultDates.maxDate)
55
56
  });
@@ -173,6 +174,38 @@ export const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(
173
174
  disableFuture,
174
175
  timezone
175
176
  });
177
+
178
+ // When disabled, limit the view to the selected date
179
+ const minDateWithDisabled = disabled && value || minDate;
180
+ const maxDateWithDisabled = disabled && value || maxDate;
181
+ const gridLabelId = `${id}-grid-label`;
182
+ const hasFocus = focusedView !== null;
183
+ const CalendarHeader = slots?.calendarHeader ?? components?.CalendarHeader ?? PickersCalendarHeader;
184
+ const calendarHeaderProps = useSlotProps({
185
+ elementType: CalendarHeader,
186
+ externalSlotProps: slotProps?.calendarHeader ?? componentsProps?.calendarHeader,
187
+ additionalProps: {
188
+ views,
189
+ view,
190
+ currentMonth: calendarState.currentMonth,
191
+ onViewChange: setView,
192
+ onMonthChange: (newMonth, direction) => handleChangeMonth({
193
+ newMonth,
194
+ direction
195
+ }),
196
+ minDate: minDateWithDisabled,
197
+ maxDate: maxDateWithDisabled,
198
+ disabled,
199
+ disablePast,
200
+ disableFuture,
201
+ reduceAnimations,
202
+ timezone,
203
+ labelId: gridLabelId,
204
+ slots,
205
+ slotProps
206
+ },
207
+ ownerState: props
208
+ });
176
209
  const handleDateMonthChange = useEventCallback(newDate => {
177
210
  const startOfMonth = utils.startOfMonth(newDate);
178
211
  const endOfMonth = utils.endOfMonth(newDate);
@@ -238,18 +271,12 @@ export const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(
238
271
  maxDate,
239
272
  minDate
240
273
  };
241
-
242
- // When disabled, limit the view to the selected date
243
- const minDateWithDisabled = disabled && value || minDate;
244
- const maxDateWithDisabled = disabled && value || maxDate;
245
274
  const commonViewProps = {
246
275
  disableHighlightToday,
247
276
  readOnly,
248
277
  disabled,
249
278
  timezone
250
279
  };
251
- const gridLabelId = `${id}-grid-label`;
252
- const hasFocus = focusedView !== null;
253
280
  const prevOpenViewRef = React.useRef(view);
254
281
  React.useEffect(() => {
255
282
  // If the view change and the focus was on the previous view
@@ -268,26 +295,7 @@ export const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(
268
295
  className: clsx(classes.root, className),
269
296
  ownerState: ownerState
270
297
  }, other, {
271
- children: [/*#__PURE__*/_jsx(PickersCalendarHeader, {
272
- views: views,
273
- view: view,
274
- currentMonth: calendarState.currentMonth,
275
- onViewChange: setView,
276
- onMonthChange: (newMonth, direction) => handleChangeMonth({
277
- newMonth,
278
- direction
279
- }),
280
- minDate: minDateWithDisabled,
281
- maxDate: maxDateWithDisabled,
282
- disabled: disabled,
283
- disablePast: disablePast,
284
- disableFuture: disableFuture,
285
- reduceAnimations: reduceAnimations,
286
- labelId: gridLabelId,
287
- slots: slots,
288
- slotProps: slotProps,
289
- timezone: timezone
290
- }), /*#__PURE__*/_jsx(DateCalendarViewTransitionContainer, {
298
+ children: [/*#__PURE__*/_jsx(CalendarHeader, _extends({}, calendarHeaderProps)), /*#__PURE__*/_jsx(DateCalendarViewTransitionContainer, {
291
299
  reduceAnimations: reduceAnimations,
292
300
  className: classes.viewTransitionContainer,
293
301
  transKey: view,
@@ -1,6 +1,7 @@
1
1
  export { DateCalendar } from './DateCalendar';
2
2
  export { getDateCalendarUtilityClass, dateCalendarClasses } from './dateCalendarClasses';
3
3
  export { dayPickerClasses } from './dayCalendarClasses';
4
- export { pickersCalendarHeaderClasses } from './pickersCalendarHeaderClasses';
5
4
  export { pickersFadeTransitionGroupClasses } from './pickersFadeTransitionGroupClasses';
6
- export { pickersSlideTransitionClasses } from './pickersSlideTransitionClasses';
5
+ export { pickersSlideTransitionClasses } from './pickersSlideTransitionClasses';
6
+ // TODO v7: Remove and export the `PickersCalendarHeader` folder from the root instead.
7
+ export * from '../PickersCalendarHeader';
@@ -38,8 +38,8 @@ const DateField = /*#__PURE__*/React.forwardRef(function DateField(inProps, ref)
38
38
  textFieldProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
39
39
 
40
40
  // TODO: Remove when mui/material-ui#35088 will be merged
41
- textFieldProps.inputProps = _extends({}, textFieldProps.inputProps, inputProps);
42
- textFieldProps.InputProps = _extends({}, textFieldProps.InputProps, InputProps);
41
+ textFieldProps.inputProps = _extends({}, inputProps, textFieldProps.inputProps);
42
+ textFieldProps.InputProps = _extends({}, InputProps, textFieldProps.InputProps);
43
43
  const _useDateField = useDateField({
44
44
  props: textFieldProps,
45
45
  inputRef: externalInputRef
@@ -38,8 +38,8 @@ const DateTimeField = /*#__PURE__*/React.forwardRef(function DateTimeField(inPro
38
38
  textFieldProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
39
39
 
40
40
  // TODO: Remove when mui/material-ui#35088 will be merged
41
- textFieldProps.inputProps = _extends({}, textFieldProps.inputProps, inputProps);
42
- textFieldProps.InputProps = _extends({}, textFieldProps.InputProps, InputProps);
41
+ textFieldProps.inputProps = _extends({}, inputProps, textFieldProps.inputProps);
42
+ textFieldProps.InputProps = _extends({}, InputProps, textFieldProps.InputProps);
43
43
  const _useDateTimeField = useDateTimeField({
44
44
  props: textFieldProps,
45
45
  inputRef: externalInputRef
@@ -47,7 +47,7 @@ const DesktopDatePicker = /*#__PURE__*/React.forwardRef(function DesktopDatePick
47
47
  props,
48
48
  valueManager: singleItemValueManager,
49
49
  valueType: 'date',
50
- getOpenDialogAriaText: localeText.openDatePickerDialogue,
50
+ getOpenDialogAriaText: props.localeText?.openDatePickerDialogue ?? localeText.openDatePickerDialogue,
51
51
  validator: validateDate
52
52
  });
53
53
  return renderPicker();
@@ -83,7 +83,7 @@ const DesktopDateTimePicker = /*#__PURE__*/React.forwardRef(function DesktopDate
83
83
  props,
84
84
  valueManager: singleItemValueManager,
85
85
  valueType: 'date-time',
86
- getOpenDialogAriaText: localeText.openDatePickerDialogue,
86
+ getOpenDialogAriaText: props.localeText?.openDatePickerDialogue ?? localeText.openDatePickerDialogue,
87
87
  validator: validateDateTime
88
88
  });
89
89
  return renderPicker();
@@ -70,7 +70,7 @@ const DesktopTimePicker = /*#__PURE__*/React.forwardRef(function DesktopTimePick
70
70
  props,
71
71
  valueManager: singleItemValueManager,
72
72
  valueType: 'time',
73
- getOpenDialogAriaText: localeText.openTimePickerDialogue,
73
+ getOpenDialogAriaText: props.localeText?.openTimePickerDialogue ?? localeText.openTimePickerDialogue,
74
74
  validator: validateTime
75
75
  });
76
76
  return renderPicker();
@@ -44,7 +44,7 @@ const MobileDatePicker = /*#__PURE__*/React.forwardRef(function MobileDatePicker
44
44
  props,
45
45
  valueManager: singleItemValueManager,
46
46
  valueType: 'date',
47
- getOpenDialogAriaText: localeText.openDatePickerDialogue,
47
+ getOpenDialogAriaText: props.localeText?.openDatePickerDialogue ?? localeText.openDatePickerDialogue,
48
48
  validator: validateDate
49
49
  });
50
50
  return renderPicker();
@@ -55,7 +55,7 @@ const MobileDateTimePicker = /*#__PURE__*/React.forwardRef(function MobileDateTi
55
55
  props,
56
56
  valueManager: singleItemValueManager,
57
57
  valueType: 'date-time',
58
- getOpenDialogAriaText: localeText.openDatePickerDialogue,
58
+ getOpenDialogAriaText: props.localeText?.openDatePickerDialogue ?? localeText.openDatePickerDialogue,
59
59
  validator: validateDateTime
60
60
  });
61
61
  return renderPicker();
@@ -48,7 +48,7 @@ const MobileTimePicker = /*#__PURE__*/React.forwardRef(function MobileTimePicker
48
48
  props,
49
49
  valueManager: singleItemValueManager,
50
50
  valueType: 'time',
51
- getOpenDialogAriaText: localeText.openTimePickerDialogue,
51
+ getOpenDialogAriaText: props.localeText?.openTimePickerDialogue ?? localeText.openTimePickerDialogue,
52
52
  validator: validateTime
53
53
  });
54
54
  return renderPicker();
@@ -1,14 +1,17 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["ownerState"];
3
+ const _excluded = ["slots", "slotProps", "currentMonth", "disabled", "disableFuture", "disablePast", "maxDate", "minDate", "onMonthChange", "onViewChange", "view", "reduceAnimations", "views", "labelId", "className", "timezone"],
4
+ _excluded2 = ["ownerState"];
4
5
  import * as React from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import clsx from 'clsx';
5
8
  import Fade from '@mui/material/Fade';
6
9
  import { styled, useThemeProps } from '@mui/material/styles';
7
10
  import { useSlotProps } from '@mui/base/utils';
8
11
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
9
12
  import IconButton from '@mui/material/IconButton';
10
13
  import { useLocaleText, useUtils } from '../internals/hooks/useUtils';
11
- import { PickersFadeTransitionGroup } from './PickersFadeTransitionGroup';
14
+ import { PickersFadeTransitionGroup } from '../DateCalendar/PickersFadeTransitionGroup';
12
15
  import { ArrowDropDownIcon } from '../icons';
13
16
  import { PickersArrowSwitcher } from '../internals/components/PickersArrowSwitcher';
14
17
  import { usePreviousMonthDisabled, useNextMonthDisabled } from '../internals/hooks/date-helpers-hooks';
@@ -91,11 +94,7 @@ const PickersCalendarHeaderSwitchViewIcon = styled(ArrowDropDownIcon, {
91
94
  transition: theme.transitions.create('transform'),
92
95
  transform: 'rotate(0deg)'
93
96
  }));
94
-
95
- /**
96
- * @ignore - do not document.
97
- */
98
- export function PickersCalendarHeader(inProps) {
97
+ const PickersCalendarHeader = /*#__PURE__*/React.forwardRef(function PickersCalendarHeader(inProps, ref) {
99
98
  const localeText = useLocaleText();
100
99
  const utils = useUtils();
101
100
  const props = useThemeProps({
@@ -103,22 +102,24 @@ export function PickersCalendarHeader(inProps) {
103
102
  name: 'MuiPickersCalendarHeader'
104
103
  });
105
104
  const {
106
- slots,
107
- slotProps,
108
- currentMonth: month,
109
- disabled,
110
- disableFuture,
111
- disablePast,
112
- maxDate,
113
- minDate,
114
- onMonthChange,
115
- onViewChange,
116
- view,
117
- reduceAnimations,
118
- views,
119
- labelId,
120
- timezone
121
- } = props;
105
+ slots,
106
+ slotProps,
107
+ currentMonth: month,
108
+ disabled,
109
+ disableFuture,
110
+ disablePast,
111
+ maxDate,
112
+ minDate,
113
+ onMonthChange,
114
+ onViewChange,
115
+ view,
116
+ reduceAnimations,
117
+ views,
118
+ labelId,
119
+ className,
120
+ timezone
121
+ } = props,
122
+ other = _objectWithoutPropertiesLoose(props, _excluded);
122
123
  const ownerState = props;
123
124
  const classes = useUtilityClasses(props);
124
125
  const SwitchViewButton = slots?.switchViewButton ?? PickersCalendarHeaderSwitchViewButton;
@@ -140,7 +141,7 @@ export function PickersCalendarHeader(inProps) {
140
141
  ownerState: undefined,
141
142
  className: classes.switchViewIcon
142
143
  }),
143
- switchViewIconProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded);
144
+ switchViewIconProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
144
145
  const selectNextMonth = () => onMonthChange(utils.addMonths(month, 1), 'left');
145
146
  const selectPreviousMonth = () => onMonthChange(utils.addMonths(month, -1), 'right');
146
147
  const isNextMonthDisabled = useNextMonthDisabled(month, {
@@ -170,9 +171,10 @@ export function PickersCalendarHeader(inProps) {
170
171
  if (views.length === 1 && views[0] === 'year') {
171
172
  return null;
172
173
  }
173
- return /*#__PURE__*/_jsxs(PickersCalendarHeaderRoot, {
174
+ return /*#__PURE__*/_jsxs(PickersCalendarHeaderRoot, _extends({}, other, {
174
175
  ownerState: ownerState,
175
- className: classes.root,
176
+ className: clsx(className, classes.root),
177
+ ref: ref,
176
178
  children: [/*#__PURE__*/_jsxs(PickersCalendarHeaderLabelContainer, {
177
179
  role: "presentation",
178
180
  onClick: handleToggleView,
@@ -206,5 +208,47 @@ export function PickersCalendarHeader(inProps) {
206
208
  nextLabel: localeText.nextMonth
207
209
  })
208
210
  })]
209
- });
210
- }
211
+ }));
212
+ });
213
+ process.env.NODE_ENV !== "production" ? PickersCalendarHeader.propTypes = {
214
+ // ----------------------------- Warning --------------------------------
215
+ // | These PropTypes are generated from the TypeScript type definitions |
216
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
217
+ // ----------------------------------------------------------------------
218
+ /**
219
+ * Override or extend the styles applied to the component.
220
+ */
221
+ classes: PropTypes.object,
222
+ /**
223
+ * className applied to the root element.
224
+ */
225
+ className: PropTypes.string,
226
+ currentMonth: PropTypes.any.isRequired,
227
+ disabled: PropTypes.bool,
228
+ disableFuture: PropTypes.bool,
229
+ disablePast: PropTypes.bool,
230
+ labelId: PropTypes.string,
231
+ maxDate: PropTypes.any.isRequired,
232
+ minDate: PropTypes.any.isRequired,
233
+ onMonthChange: PropTypes.func.isRequired,
234
+ onViewChange: PropTypes.func,
235
+ reduceAnimations: PropTypes.bool.isRequired,
236
+ /**
237
+ * The props used for each component slot.
238
+ * @default {}
239
+ */
240
+ slotProps: PropTypes.object,
241
+ /**
242
+ * Overridable component slots.
243
+ * @default {}
244
+ */
245
+ slots: PropTypes.object,
246
+ /**
247
+ * The system prop that allows defining system overrides as well as additional CSS styles.
248
+ */
249
+ sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
250
+ timezone: PropTypes.string.isRequired,
251
+ view: PropTypes.oneOf(['day', 'month', 'year']).isRequired,
252
+ views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired).isRequired
253
+ } : void 0;
254
+ export { PickersCalendarHeader };
@@ -0,0 +1,2 @@
1
+ export { pickersCalendarHeaderClasses } from './pickersCalendarHeaderClasses';
2
+ export { PickersCalendarHeader } from './PickersCalendarHeader';
@@ -38,8 +38,8 @@ const TimeField = /*#__PURE__*/React.forwardRef(function TimeField(inProps, ref)
38
38
  textFieldProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
39
39
 
40
40
  // TODO: Remove when mui/material-ui#35088 will be merged
41
- textFieldProps.inputProps = _extends({}, textFieldProps.inputProps, inputProps);
42
- textFieldProps.InputProps = _extends({}, textFieldProps.InputProps, InputProps);
41
+ textFieldProps.inputProps = _extends({}, inputProps, textFieldProps.inputProps);
42
+ textFieldProps.InputProps = _extends({}, InputProps, textFieldProps.InputProps);
43
43
  const _useTimeField = useTimeField({
44
44
  props: textFieldProps,
45
45
  inputRef: externalInputRef
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v6.10.2
2
+ * @mui/x-date-pickers v6.11.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -0,0 +1,9 @@
1
+ import useMediaQuery from '@mui/material/useMediaQuery';
2
+ const PREFERS_REDUCED_MOTION = '@media (prefers-reduced-motion: reduce)';
3
+ export const defaultReduceAnimations = typeof navigator !== 'undefined' && /(android)/i.test(navigator.userAgent);
4
+ export const useDefaultReduceAnimations = () => {
5
+ const prefersReduced = useMediaQuery(PREFERS_REDUCED_MOTION, {
6
+ defaultMatches: false
7
+ });
8
+ return prefersReduced || defaultReduceAnimations;
9
+ };
@@ -152,13 +152,18 @@ export const useField = params => {
152
152
  if (readOnly) {
153
153
  return;
154
154
  }
155
- const valueStr = event.target.value;
155
+ const targetValue = event.target.value;
156
+ const eventData = event.nativeEvent.data;
157
+ // Calling `.fill(04/11/2022)` in playwright will trigger a change event with the requested content to insert in `event.nativeEvent.data`
158
+ // usual changes have only the currently typed character in the `event.nativeEvent.data`
159
+ const shouldUseEventData = eventData && eventData.length > 1;
160
+ const valueStr = shouldUseEventData ? eventData : targetValue;
156
161
  const cleanValueStr = cleanString(valueStr);
157
162
 
158
- // If no section is selected, we just try to parse the new value
163
+ // If no section is selected or eventData should be used, we just try to parse the new value
159
164
  // This line is mostly triggered by imperative code / application tests.
160
- if (selectedSectionIndexes == null) {
161
- updateValueFromValueStr(cleanValueStr);
165
+ if (selectedSectionIndexes == null || shouldUseEventData) {
166
+ updateValueFromValueStr(shouldUseEventData ? eventData : cleanValueStr);
162
167
  return;
163
168
  }
164
169
  let keyPressed;
@@ -96,7 +96,7 @@ export const cleanDigitSectionValue = (utils, timezone, value, sectionBoundaries
96
96
  }
97
97
  return valueStr;
98
98
  };
99
- export const adjustSectionValue = (utils, timezone, section, keyCode, sectionsValueBoundaries, activeDate, stepsAttribues) => {
99
+ export const adjustSectionValue = (utils, timezone, section, keyCode, sectionsValueBoundaries, activeDate, stepsAttributes) => {
100
100
  const delta = getDeltaFromKeyCode(keyCode);
101
101
  const isStart = keyCode === 'Home';
102
102
  const isEnd = keyCode === 'End';
@@ -108,7 +108,7 @@ export const adjustSectionValue = (utils, timezone, section, keyCode, sectionsVa
108
108
  contentType: section.contentType
109
109
  });
110
110
  const getCleanValue = value => cleanDigitSectionValue(utils, timezone, value, sectionBoundaries, section);
111
- const step = section.type === 'minutes' && stepsAttribues?.minutesStep ? stepsAttribues.minutesStep : 1;
111
+ const step = section.type === 'minutes' && stepsAttributes?.minutesStep ? stepsAttributes.minutesStep : 1;
112
112
  const currentSectionValue = parseInt(section.value, 10);
113
113
  let newSectionValueNumber = currentSectionValue + delta * step;
114
114
  if (shouldSetAbsolute) {
@@ -470,6 +470,7 @@ export const createDateStrForInputFromSections = (sections, isRTL) => {
470
470
  export const getSectionsBoundaries = (utils, timezone) => {
471
471
  const today = utils.dateWithTimezone(undefined, timezone);
472
472
  const endOfYear = utils.endOfYear(today);
473
+ const endOfDay = utils.endOfDay(today);
473
474
  const {
474
475
  maxDaysInMonth,
475
476
  longestMonth
@@ -524,7 +525,7 @@ export const getSectionsBoundaries = (utils, timezone) => {
524
525
  hours: ({
525
526
  format
526
527
  }) => {
527
- const lastHourInDay = utils.getHours(endOfYear);
528
+ const lastHourInDay = utils.getHours(endOfDay);
528
529
  const hasMeridiem = utils.formatByString(utils.endOfDay(today), format) !== lastHourInDay.toString();
529
530
  if (hasMeridiem) {
530
531
  return {
@@ -540,12 +541,12 @@ export const getSectionsBoundaries = (utils, timezone) => {
540
541
  minutes: () => ({
541
542
  minimum: 0,
542
543
  // Assumption: All years have the same amount of minutes
543
- maximum: utils.getMinutes(endOfYear)
544
+ maximum: utils.getMinutes(endOfDay)
544
545
  }),
545
546
  seconds: () => ({
546
547
  minimum: 0,
547
548
  // Assumption: All years have the same amount of seconds
548
- maximum: utils.getSeconds(endOfYear)
549
+ maximum: utils.getSeconds(endOfDay)
549
550
  }),
550
551
  meridiem: () => ({
551
552
  minimum: 0,
@@ -20,13 +20,12 @@ export { applyDefaultDate, replaceInvalidDateByNull, areDatesEqual, getTodayDate
20
20
  export { splitFieldInternalAndForwardedProps } from './utils/fields';
21
21
  export { getDefaultReferenceDate } from './utils/getDefaultReferenceDate';
22
22
  export { executeInTheNextEventLoopTick, getActiveElement, onSpaceOrEnter, DEFAULT_DESKTOP_MODE_MEDIA_QUERY } from './utils/utils';
23
- export { defaultReduceAnimations } from './utils/defaultReduceAnimations';
23
+ export { useDefaultReduceAnimations } from './hooks/useDefaultReduceAnimations';
24
24
  export { extractValidationProps } from './utils/validation/extractValidationProps';
25
25
  export { validateDate } from './utils/validation/validateDate';
26
26
  export { validateDateTime } from './utils/validation/validateDateTime';
27
27
  export { validateTime } from './utils/validation/validateTime';
28
28
  export { buildDeprecatedPropsWarning, buildWarning } from './utils/warning';
29
29
  export { uncapitalizeObjectKeys } from './utils/slots-migration';
30
- export { PickersCalendarHeader } from '../DateCalendar/PickersCalendarHeader';
31
30
  export { DayCalendar } from '../DateCalendar/DayCalendar';
32
31
  export { useCalendarState } from '../DateCalendar/useCalendarState';
@@ -25,7 +25,7 @@ export const singleItemValueManager = {
25
25
  isSameError: (a, b) => a === b,
26
26
  hasError: error => error != null,
27
27
  defaultErrorState: null,
28
- getTimezone: (utils, value) => value == null ? null : utils.getTimezone(value),
28
+ getTimezone: (utils, value) => value == null || !utils.isValid(value) ? null : utils.getTimezone(value),
29
29
  setTimezone: (utils, timezone, value) => value == null ? null : utils.setTimezone(value, timezone)
30
30
  };
31
31
  export const singleItemFieldValueManager = {
@@ -1,6 +1,17 @@
1
1
  import { expect } from 'chai';
2
2
  import { getDateOffset } from 'test/utils/pickers-utils';
3
3
  import { TEST_DATE_ISO_STRING, TEST_DATE_LOCALE_STRING } from './describeGregorianAdapter.utils';
4
+
5
+ /**
6
+ * To check if the date has the right offset even after changing it's date parts,
7
+ * we convert it to a different timezone that always has the same offset,
8
+ * then we check that both dates have the same hour value.
9
+ */
10
+ // We change to
11
+ const expectSameTimeInMonacoTZ = (adapter, value) => {
12
+ const valueInMonacoTz = adapter.setTimezone(value, 'Europe/Monaco');
13
+ expect(adapter.getHours(value)).to.equal(adapter.getHours(valueInMonacoTz));
14
+ };
4
15
  export const testCalculations = ({
5
16
  adapter,
6
17
  adapterTZ,
@@ -9,6 +20,7 @@ export const testCalculations = ({
9
20
  getLocaleFromDate
10
21
  }) => {
11
22
  const testDateIso = adapter.date(TEST_DATE_ISO_STRING);
23
+ const testDateLastNonDSTDay = adapterTZ.isTimezoneCompatible ? adapterTZ.dateWithTimezone('2022-03-27', 'Europe/Paris') : adapterTZ.date('2022-03-27');
12
24
  const testDateLocale = adapter.date(TEST_DATE_LOCALE_STRING);
13
25
  describe('Method: date', () => {
14
26
  it('should parse strings', () => {
@@ -484,10 +496,19 @@ export const testCalculations = ({
484
496
  expect(adapter.endOfYear(testDateIso)).toEqualDateTime(expected);
485
497
  expect(adapter.endOfYear(testDateLocale)).toEqualDateTime(expected);
486
498
  });
487
- it('Method: endOfMonth', () => {
488
- const expected = '2018-10-31T23:59:59.999Z';
489
- expect(adapter.endOfMonth(testDateIso)).toEqualDateTime(expected);
490
- expect(adapter.endOfMonth(testDateLocale)).toEqualDateTime(expected);
499
+ describe('Method: endOfMonth', () => {
500
+ it('should handle basic usecases', () => {
501
+ const expected = '2018-10-31T23:59:59.999Z';
502
+ expect(adapter.endOfMonth(testDateIso)).toEqualDateTime(expected);
503
+ expect(adapter.endOfMonth(testDateLocale)).toEqualDateTime(expected);
504
+ });
505
+ it('should update the offset when entering DST', function test() {
506
+ if (!adapterTZ.isTimezoneCompatible) {
507
+ this.skip();
508
+ }
509
+ expectSameTimeInMonacoTZ(adapterTZ, testDateLastNonDSTDay);
510
+ expectSameTimeInMonacoTZ(adapterTZ, adapterTZ.endOfMonth(testDateLastNonDSTDay));
511
+ });
491
512
  });
492
513
  it('Method: endOfWeek', () => {
493
514
  const expected = adapter.lib === 'luxon' ? '2018-11-04T23:59:59.999Z' : '2018-11-03T23:59:59.999Z';
@@ -503,18 +524,45 @@ export const testCalculations = ({
503
524
  expect(adapter.addYears(testDateIso, 2)).toEqualDateTime('2020-10-30T11:44:00.000Z');
504
525
  expect(adapter.addYears(testDateIso, -2)).toEqualDateTime('2016-10-30T11:44:00.000Z');
505
526
  });
506
- it('Method: addMonths', () => {
507
- expect(adapter.addMonths(testDateIso, 2)).toEqualDateTime('2018-12-30T11:44:00.000Z');
508
- expect(adapter.addMonths(testDateIso, -2)).toEqualDateTime('2018-08-30T11:44:00.000Z');
509
- expect(adapter.addMonths(testDateIso, 3)).toEqualDateTime('2019-01-30T11:44:00.000Z');
527
+ describe('Method: addMonths', () => {
528
+ it('should handle basic usecases', () => {
529
+ expect(adapter.addMonths(testDateIso, 2)).toEqualDateTime('2018-12-30T11:44:00.000Z');
530
+ expect(adapter.addMonths(testDateIso, -2)).toEqualDateTime('2018-08-30T11:44:00.000Z');
531
+ expect(adapter.addMonths(testDateIso, 3)).toEqualDateTime('2019-01-30T11:44:00.000Z');
532
+ });
533
+ it('should update the offset when entering DST', function test() {
534
+ if (!adapterTZ.isTimezoneCompatible) {
535
+ this.skip();
536
+ }
537
+ expectSameTimeInMonacoTZ(adapterTZ, testDateLastNonDSTDay);
538
+ expectSameTimeInMonacoTZ(adapterTZ, adapterTZ.addMonths(testDateLastNonDSTDay, 1));
539
+ });
510
540
  });
511
- it('Method: addWeeks', () => {
512
- expect(adapter.addWeeks(testDateIso, 2)).toEqualDateTime('2018-11-13T11:44:00.000Z');
513
- expect(adapter.addWeeks(testDateIso, -2)).toEqualDateTime('2018-10-16T11:44:00.000Z');
541
+ describe('Method: addWeeks', () => {
542
+ it('should handle basic usecases', () => {
543
+ expect(adapter.addWeeks(testDateIso, 2)).toEqualDateTime('2018-11-13T11:44:00.000Z');
544
+ expect(adapter.addWeeks(testDateIso, -2)).toEqualDateTime('2018-10-16T11:44:00.000Z');
545
+ });
546
+ it('should update the offset when entering DST', function test() {
547
+ if (!adapterTZ.isTimezoneCompatible) {
548
+ this.skip();
549
+ }
550
+ expectSameTimeInMonacoTZ(adapterTZ, testDateLastNonDSTDay);
551
+ expectSameTimeInMonacoTZ(adapterTZ, adapterTZ.addWeeks(testDateLastNonDSTDay, 1));
552
+ });
514
553
  });
515
- it('Method: addDays', () => {
516
- expect(adapter.addDays(testDateIso, 2)).toEqualDateTime('2018-11-01T11:44:00.000Z');
517
- expect(adapter.addDays(testDateIso, -2)).toEqualDateTime('2018-10-28T11:44:00.000Z');
554
+ describe('Method: addWeeks', () => {
555
+ it('should handle basic usecases', () => {
556
+ expect(adapter.addDays(testDateIso, 2)).toEqualDateTime('2018-11-01T11:44:00.000Z');
557
+ expect(adapter.addDays(testDateIso, -2)).toEqualDateTime('2018-10-28T11:44:00.000Z');
558
+ });
559
+ it('should update the offset when entering DST', function test() {
560
+ if (!adapterTZ.isTimezoneCompatible) {
561
+ this.skip();
562
+ }
563
+ expectSameTimeInMonacoTZ(adapterTZ, testDateLastNonDSTDay);
564
+ expectSameTimeInMonacoTZ(adapterTZ, adapterTZ.addDays(testDateLastNonDSTDay, 1));
565
+ });
518
566
  });
519
567
  it('Method: addHours', () => {
520
568
  expect(adapter.addHours(testDateIso, 2)).toEqualDateTime('2018-10-30T13:44:00.000Z');
@@ -624,14 +672,13 @@ export const testCalculations = ({
624
672
  const referenceDate = adapterTZ.dateWithTimezone('2022-03-17', 'Europe/Paris');
625
673
  const weekArray = adapterTZ.getWeekArray(referenceDate);
626
674
  let expectedDate = adapter.startOfWeek(adapter.startOfMonth(referenceDate));
627
- const lastNonDSTDay = adapterTZ.dateWithTimezone('2022-03-27', 'Europe/Paris');
628
675
  expect(weekArray).to.have.length(5);
629
676
  weekArray.forEach(week => {
630
677
  expect(week).to.have.length(7);
631
678
  week.forEach(day => {
632
679
  expect(adapterTZ.startOfDay(day)).toEqualDateTime(adapterTZ.startOfDay(expectedDate));
633
680
  expectedDate = adapterTZ.addDays(expectedDate, 1);
634
- expect(getDateOffset(adapterTZ, day)).to.equal(adapterTZ.isAfter(day, lastNonDSTDay) ? 120 : 60);
681
+ expect(getDateOffset(adapterTZ, day)).to.equal(adapterTZ.isAfter(day, testDateLastNonDSTDay) ? 120 : 60);
635
682
  });
636
683
  });
637
684
  });