@mui/x-date-pickers 6.10.2 → 6.11.1

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 (190) hide show
  1. package/AdapterDayjs/AdapterDayjs.d.ts +8 -1
  2. package/AdapterDayjs/AdapterDayjs.js +66 -38
  3. package/CHANGELOG.md +154 -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 +3 -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 +3 -2
  16. package/DateTimePicker/DateTimePicker.d.ts +1 -1
  17. package/DateTimePicker/DateTimePickerToolbar.js +4 -3
  18. package/DayCalendarSkeleton/DayCalendarSkeleton.d.ts +1 -1
  19. package/DesktopDatePicker/DesktopDatePicker.d.ts +1 -1
  20. package/DesktopDatePicker/DesktopDatePicker.js +2 -2
  21. package/DesktopDateTimePicker/DesktopDateTimePicker.d.ts +1 -1
  22. package/DesktopDateTimePicker/DesktopDateTimePicker.js +2 -2
  23. package/DesktopTimePicker/DesktopTimePicker.d.ts +1 -1
  24. package/DesktopTimePicker/DesktopTimePicker.js +2 -2
  25. package/DigitalClock/DigitalClock.d.ts +1 -1
  26. package/LocalizationProvider/LocalizationProvider.d.ts +1 -1
  27. package/MobileDatePicker/MobileDatePicker.d.ts +1 -1
  28. package/MobileDatePicker/MobileDatePicker.js +2 -2
  29. package/MobileDateTimePicker/MobileDateTimePicker.d.ts +1 -1
  30. package/MobileDateTimePicker/MobileDateTimePicker.js +2 -2
  31. package/MobileTimePicker/MobileTimePicker.d.ts +1 -1
  32. package/MobileTimePicker/MobileTimePicker.js +2 -2
  33. package/MonthCalendar/MonthCalendar.d.ts +1 -1
  34. package/MultiSectionDigitalClock/MultiSectionDigitalClock.d.ts +1 -1
  35. package/MultiSectionDigitalClock/MultiSectionDigitalClock.js +3 -2
  36. package/MultiSectionDigitalClock/MultiSectionDigitalClockSection.d.ts +1 -1
  37. package/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.d.ts +21 -9
  38. package/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +72 -28
  39. package/PickersCalendarHeader/index.d.ts +4 -0
  40. package/PickersCalendarHeader/index.js +2 -0
  41. package/PickersCalendarHeader/package.json +6 -0
  42. package/PickersDay/PickersDay.d.ts +1 -1
  43. package/PickersDay/PickersDay.js +1 -0
  44. package/PickersShortcuts/PickersShortcuts.js +1 -0
  45. package/StaticDatePicker/StaticDatePicker.d.ts +1 -1
  46. package/StaticDateTimePicker/StaticDateTimePicker.d.ts +1 -1
  47. package/StaticTimePicker/StaticTimePicker.d.ts +1 -1
  48. package/TimeClock/ClockNumbers.d.ts +1 -1
  49. package/TimeClock/TimeClock.d.ts +1 -1
  50. package/TimeField/TimeField.d.ts +1 -1
  51. package/TimeField/TimeField.js +3 -2
  52. package/TimePicker/TimePicker.d.ts +1 -1
  53. package/TimePicker/TimePickerToolbar.js +3 -2
  54. package/YearCalendar/YearCalendar.d.ts +2 -2
  55. package/index.js +1 -1
  56. package/internals/components/PickersModalDialog.d.ts +2 -2
  57. package/internals/components/PickersPopper.d.ts +3 -3
  58. package/internals/components/PickersToolbar.d.ts +1 -1
  59. package/internals/hooks/date-helpers-hooks.d.ts +1 -2
  60. package/internals/hooks/useDefaultReduceAnimations.d.ts +2 -0
  61. package/internals/hooks/useDefaultReduceAnimations.js +9 -0
  62. package/internals/hooks/useField/useField.js +10 -5
  63. package/internals/hooks/useField/useField.utils.d.ts +1 -1
  64. package/internals/hooks/useField/useField.utils.js +6 -5
  65. package/internals/hooks/usePicker/usePickerValue.js +1 -1
  66. package/internals/index.d.ts +1 -3
  67. package/internals/index.js +1 -2
  68. package/internals/utils/date-utils.d.ts +1 -0
  69. package/internals/utils/date-utils.js +4 -0
  70. package/internals/utils/valueManagers.js +1 -1
  71. package/legacy/AdapterDayjs/AdapterDayjs.js +64 -38
  72. package/legacy/DateCalendar/DateCalendar.js +50 -40
  73. package/legacy/DateCalendar/index.js +3 -2
  74. package/legacy/DateField/DateField.js +3 -2
  75. package/legacy/DateTimeField/DateTimeField.js +3 -2
  76. package/legacy/DateTimePicker/DateTimePickerToolbar.js +4 -3
  77. package/legacy/DesktopDatePicker/DesktopDatePicker.js +2 -2
  78. package/legacy/DesktopDateTimePicker/DesktopDateTimePicker.js +2 -2
  79. package/legacy/DesktopTimePicker/DesktopTimePicker.js +2 -2
  80. package/legacy/MobileDatePicker/MobileDatePicker.js +2 -2
  81. package/legacy/MobileDateTimePicker/MobileDateTimePicker.js +2 -2
  82. package/legacy/MobileTimePicker/MobileTimePicker.js +2 -2
  83. package/legacy/MultiSectionDigitalClock/MultiSectionDigitalClock.js +3 -2
  84. package/legacy/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +57 -13
  85. package/legacy/PickersCalendarHeader/index.js +2 -0
  86. package/legacy/PickersDay/PickersDay.js +1 -0
  87. package/legacy/PickersShortcuts/PickersShortcuts.js +1 -0
  88. package/legacy/TimeField/TimeField.js +3 -2
  89. package/legacy/TimePicker/TimePickerToolbar.js +3 -2
  90. package/legacy/index.js +1 -1
  91. package/legacy/internals/hooks/useDefaultReduceAnimations.js +9 -0
  92. package/legacy/internals/hooks/useField/useField.js +10 -5
  93. package/legacy/internals/hooks/useField/useField.utils.js +6 -5
  94. package/legacy/internals/hooks/usePicker/usePickerValue.js +1 -1
  95. package/legacy/internals/index.js +1 -2
  96. package/legacy/internals/utils/date-utils.js +4 -0
  97. package/legacy/internals/utils/valueManagers.js +1 -1
  98. package/legacy/locales/fiFI.js +8 -5
  99. package/legacy/locales/isIS.js +33 -16
  100. package/legacy/tests/describeGregorianAdapter/testCalculations.js +63 -16
  101. package/legacy/tests/describeValue/describeValue.js +2 -1
  102. package/legacy/tests/describeValue/testPickerActionBar.js +12 -28
  103. package/legacy/tests/describeValue/testShortcuts.js +119 -0
  104. package/locales/fiFI.js +4 -5
  105. package/locales/isIS.js +13 -16
  106. package/models/adapters.d.ts +1 -0
  107. package/modern/AdapterDayjs/AdapterDayjs.js +65 -38
  108. package/modern/DateCalendar/DateCalendar.js +46 -38
  109. package/modern/DateCalendar/index.js +3 -2
  110. package/modern/DateField/DateField.js +3 -2
  111. package/modern/DateTimeField/DateTimeField.js +3 -2
  112. package/modern/DateTimePicker/DateTimePickerToolbar.js +4 -3
  113. package/modern/DesktopDatePicker/DesktopDatePicker.js +1 -1
  114. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -1
  115. package/modern/DesktopTimePicker/DesktopTimePicker.js +1 -1
  116. package/modern/MobileDatePicker/MobileDatePicker.js +1 -1
  117. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +1 -1
  118. package/modern/MobileTimePicker/MobileTimePicker.js +1 -1
  119. package/modern/MultiSectionDigitalClock/MultiSectionDigitalClock.js +3 -2
  120. package/modern/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +72 -28
  121. package/modern/PickersCalendarHeader/index.js +2 -0
  122. package/modern/PickersDay/PickersDay.js +1 -0
  123. package/modern/PickersShortcuts/PickersShortcuts.js +1 -0
  124. package/modern/TimeField/TimeField.js +3 -2
  125. package/modern/TimePicker/TimePickerToolbar.js +3 -2
  126. package/modern/index.js +1 -1
  127. package/modern/internals/hooks/useDefaultReduceAnimations.js +9 -0
  128. package/modern/internals/hooks/useField/useField.js +10 -5
  129. package/modern/internals/hooks/useField/useField.utils.js +6 -5
  130. package/modern/internals/hooks/usePicker/usePickerValue.js +1 -1
  131. package/modern/internals/index.js +1 -2
  132. package/modern/internals/utils/date-utils.js +4 -0
  133. package/modern/internals/utils/valueManagers.js +1 -1
  134. package/modern/locales/fiFI.js +4 -5
  135. package/modern/locales/isIS.js +13 -16
  136. package/modern/tests/describeGregorianAdapter/testCalculations.js +63 -16
  137. package/modern/tests/describeValue/describeValue.js +2 -1
  138. package/modern/tests/describeValue/testPickerActionBar.js +12 -28
  139. package/modern/tests/describeValue/testShortcuts.js +112 -0
  140. package/node/AdapterDayjs/AdapterDayjs.js +65 -38
  141. package/node/DateCalendar/DateCalendar.js +52 -44
  142. package/node/DateCalendar/index.js +21 -8
  143. package/node/DateField/DateField.js +3 -2
  144. package/node/DateTimeField/DateTimeField.js +3 -2
  145. package/node/DateTimePicker/DateTimePickerToolbar.js +4 -3
  146. package/node/DesktopDatePicker/DesktopDatePicker.js +1 -1
  147. package/node/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -1
  148. package/node/DesktopTimePicker/DesktopTimePicker.js +1 -1
  149. package/node/MobileDatePicker/MobileDatePicker.js +1 -1
  150. package/node/MobileDateTimePicker/MobileDateTimePicker.js +1 -1
  151. package/node/MobileTimePicker/MobileTimePicker.js +1 -1
  152. package/node/MultiSectionDigitalClock/MultiSectionDigitalClock.js +3 -2
  153. package/node/{DateCalendar → PickersCalendarHeader}/PickersCalendarHeader.js +73 -29
  154. package/node/PickersCalendarHeader/index.js +19 -0
  155. package/node/PickersDay/PickersDay.js +1 -0
  156. package/node/PickersShortcuts/PickersShortcuts.js +1 -0
  157. package/node/TimeField/TimeField.js +3 -2
  158. package/node/TimePicker/TimePickerToolbar.js +3 -2
  159. package/node/index.js +1 -1
  160. package/node/internals/hooks/useDefaultReduceAnimations.js +18 -0
  161. package/node/internals/hooks/useField/useField.js +10 -5
  162. package/node/internals/hooks/useField/useField.utils.js +6 -5
  163. package/node/internals/hooks/usePicker/usePickerValue.js +1 -1
  164. package/node/internals/index.js +7 -14
  165. package/node/internals/utils/date-utils.js +6 -1
  166. package/node/internals/utils/valueManagers.js +1 -1
  167. package/node/locales/fiFI.js +4 -5
  168. package/node/locales/isIS.js +13 -16
  169. package/node/tests/describeGregorianAdapter/testCalculations.js +61 -16
  170. package/node/tests/describeValue/describeValue.js +2 -1
  171. package/node/tests/describeValue/testPickerActionBar.js +12 -28
  172. package/node/tests/describeValue/testShortcuts.js +122 -0
  173. package/package.json +3 -3
  174. package/tests/describeGregorianAdapter/testCalculations.js +63 -16
  175. package/tests/describeValue/describeValue.js +2 -1
  176. package/tests/describeValue/testPickerActionBar.js +12 -28
  177. package/tests/describeValue/testShortcuts.js +112 -0
  178. package/themeAugmentation/components.d.ts +6 -14
  179. package/themeAugmentation/overrides.d.ts +0 -20
  180. package/themeAugmentation/props.d.ts +6 -2
  181. package/internals/utils/defaultReduceAnimations.d.ts +0 -1
  182. package/internals/utils/defaultReduceAnimations.js +0 -1
  183. package/legacy/internals/utils/defaultReduceAnimations.js +0 -1
  184. package/modern/internals/utils/defaultReduceAnimations.js +0 -1
  185. package/node/internals/utils/defaultReduceAnimations.js +0 -8
  186. /package/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.d.ts +0 -0
  187. /package/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  188. /package/legacy/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  189. /package/modern/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
  190. /package/node/{DateCalendar → PickersCalendarHeader}/pickersCalendarHeaderClasses.js +0 -0
@@ -184,9 +184,24 @@ export class AdapterDayjs {
184
184
  return value.format(comparisonTemplate) === comparingInValueTimezone.format(comparisonTemplate);
185
185
  };
186
186
  /**
187
- * Replace "default" by undefined before passing it to `dayjs
187
+ * Replaces "default" by undefined and "system" by the system timezone before passing it to `dayjs`.
188
188
  */
189
- this.cleanTimezone = timezone => timezone === 'default' ? undefined : timezone;
189
+ this.cleanTimezone = timezone => {
190
+ switch (timezone) {
191
+ case 'default':
192
+ {
193
+ return undefined;
194
+ }
195
+ case 'system':
196
+ {
197
+ return defaultDayjs.tz.guess();
198
+ }
199
+ default:
200
+ {
201
+ return timezone;
202
+ }
203
+ }
204
+ };
190
205
  this.createSystemDate = value => {
191
206
  // TODO v7: Stop using `this.rawDayJsInstance` (drop the `instance` param on the adapters)
192
207
  /* istanbul ignore next */
@@ -235,6 +250,27 @@ export class AdapterDayjs {
235
250
  }
236
251
  return localeObject.formats;
237
252
  };
253
+ /**
254
+ * If the new day does not have the same offset as the old one (when switching to summer day time for example),
255
+ * Then dayjs will not automatically adjust the offset (moment does).
256
+ * We have to parse again the value to make sure the `fixOffset` method is applied.
257
+ * See https://github.com/iamkun/dayjs/blob/b3624de619d6e734cd0ffdbbd3502185041c1b60/src/plugin/timezone/index.js#L72
258
+ */
259
+ this.adjustOffset = value => {
260
+ if (!this.hasTimezonePlugin()) {
261
+ return value;
262
+ }
263
+ const timezone = this.getTimezone(value);
264
+ if (timezone !== 'UTC') {
265
+ const fixedValue = value.tz(this.cleanTimezone(timezone), true);
266
+ // @ts-ignore
267
+ if ((fixedValue.$offset ?? 0) === (value.$offset ?? 0)) {
268
+ return value;
269
+ }
270
+ return fixedValue;
271
+ }
272
+ return value;
273
+ };
238
274
  this.date = value => {
239
275
  if (value === null) {
240
276
  return null;
@@ -402,49 +438,49 @@ export class AdapterDayjs {
402
438
  return value >= start && value <= end;
403
439
  };
404
440
  this.startOfYear = value => {
405
- return value.startOf('year');
441
+ return this.adjustOffset(value.startOf('year'));
406
442
  };
407
443
  this.startOfMonth = value => {
408
- return value.startOf('month');
444
+ return this.adjustOffset(value.startOf('month'));
409
445
  };
410
446
  this.startOfWeek = value => {
411
- return value.startOf('week');
447
+ return this.adjustOffset(value.startOf('week'));
412
448
  };
413
449
  this.startOfDay = value => {
414
- return value.startOf('day');
450
+ return this.adjustOffset(value.startOf('day'));
415
451
  };
416
452
  this.endOfYear = value => {
417
- return value.endOf('year');
453
+ return this.adjustOffset(value.endOf('year'));
418
454
  };
419
455
  this.endOfMonth = value => {
420
- return value.endOf('month');
456
+ return this.adjustOffset(value.endOf('month'));
421
457
  };
422
458
  this.endOfWeek = value => {
423
- return value.endOf('week');
459
+ return this.adjustOffset(value.endOf('week'));
424
460
  };
425
461
  this.endOfDay = value => {
426
- return value.endOf('day');
462
+ return this.adjustOffset(value.endOf('day'));
427
463
  };
428
464
  this.addYears = (value, amount) => {
429
- return amount < 0 ? value.subtract(Math.abs(amount), 'year') : value.add(amount, 'year');
465
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'year') : value.add(amount, 'year'));
430
466
  };
431
467
  this.addMonths = (value, amount) => {
432
- return amount < 0 ? value.subtract(Math.abs(amount), 'month') : value.add(amount, 'month');
468
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'month') : value.add(amount, 'month'));
433
469
  };
434
470
  this.addWeeks = (value, amount) => {
435
- return amount < 0 ? value.subtract(Math.abs(amount), 'week') : value.add(amount, 'week');
471
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'week') : value.add(amount, 'week'));
436
472
  };
437
473
  this.addDays = (value, amount) => {
438
- return amount < 0 ? value.subtract(Math.abs(amount), 'day') : value.add(amount, 'day');
474
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'day') : value.add(amount, 'day'));
439
475
  };
440
476
  this.addHours = (value, amount) => {
441
- return amount < 0 ? value.subtract(Math.abs(amount), 'hour') : value.add(amount, 'hour');
477
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'hour') : value.add(amount, 'hour'));
442
478
  };
443
479
  this.addMinutes = (value, amount) => {
444
- return amount < 0 ? value.subtract(Math.abs(amount), 'minute') : value.add(amount, 'minute');
480
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'minute') : value.add(amount, 'minute'));
445
481
  };
446
482
  this.addSeconds = (value, amount) => {
447
- return amount < 0 ? value.subtract(Math.abs(amount), 'second') : value.add(amount, 'second');
483
+ return this.adjustOffset(amount < 0 ? value.subtract(Math.abs(amount), 'second') : value.add(amount, 'second'));
448
484
  };
449
485
  this.getYear = value => {
450
486
  return value.year();
@@ -468,34 +504,34 @@ export class AdapterDayjs {
468
504
  return value.millisecond();
469
505
  };
470
506
  this.setYear = (value, year) => {
471
- return value.set('year', year);
507
+ return this.adjustOffset(value.set('year', year));
472
508
  };
473
509
  this.setMonth = (value, month) => {
474
- return value.set('month', month);
510
+ return this.adjustOffset(value.set('month', month));
475
511
  };
476
512
  this.setDate = (value, date) => {
477
- return value.set('date', date);
513
+ return this.adjustOffset(value.set('date', date));
478
514
  };
479
515
  this.setHours = (value, hours) => {
480
- return value.set('hour', hours);
516
+ return this.adjustOffset(value.set('hour', hours));
481
517
  };
482
518
  this.setMinutes = (value, minutes) => {
483
- return value.set('minute', minutes);
519
+ return this.adjustOffset(value.set('minute', minutes));
484
520
  };
485
521
  this.setSeconds = (value, seconds) => {
486
- return value.set('second', seconds);
522
+ return this.adjustOffset(value.set('second', seconds));
487
523
  };
488
524
  this.setMilliseconds = (value, milliseconds) => {
489
- return value.set('millisecond', milliseconds);
525
+ return this.adjustOffset(value.set('millisecond', milliseconds));
490
526
  };
491
527
  this.getDaysInMonth = value => {
492
528
  return value.daysInMonth();
493
529
  };
494
530
  this.getNextMonth = value => {
495
- return value.add(1, 'month');
531
+ return this.addMonths(value, 1);
496
532
  };
497
533
  this.getPreviousMonth = value => {
498
- return value.subtract(1, 'month');
534
+ return this.addMonths(value, -1);
499
535
  };
500
536
  this.getMonthArray = value => {
501
537
  const firstMonth = value.startOf('year');
@@ -511,10 +547,9 @@ export class AdapterDayjs {
511
547
  };
512
548
  this.getWeekdays = () => {
513
549
  const start = this.dayjs().startOf('week');
514
- return [0, 1, 2, 3, 4, 5, 6].map(diff => this.formatByString(start.add(diff, 'day'), 'dd'));
550
+ return [0, 1, 2, 3, 4, 5, 6].map(diff => this.formatByString(this.addDays(start, diff), 'dd'));
515
551
  };
516
552
  this.getWeekArray = value => {
517
- const timezone = this.getTimezone(value);
518
553
  const cleanValue = this.setLocaleToValue(value);
519
554
  const start = cleanValue.startOf('month').startOf('week');
520
555
  const end = cleanValue.endOf('month').endOf('week');
@@ -525,15 +560,7 @@ export class AdapterDayjs {
525
560
  const weekNumber = Math.floor(count / 7);
526
561
  nestedWeeks[weekNumber] = nestedWeeks[weekNumber] || [];
527
562
  nestedWeeks[weekNumber].push(current);
528
- current = current.add(1, 'day');
529
-
530
- // If the new day does not have the same offset as the old one (when switching to summer day time for example),
531
- // Then dayjs will not automatically adjust the offset (moment does)
532
- // We have to parse again the value to make sure the `fixOffset` method is applied
533
- // See https://github.com/iamkun/dayjs/blob/b3624de619d6e734cd0ffdbbd3502185041c1b60/src/plugin/timezone/index.js#L72
534
- if (this.hasTimezonePlugin() && timezone !== 'UTC' && timezone !== 'system') {
535
- current = current.tz(this.cleanTimezone(timezone), true);
536
- }
563
+ current = this.addDays(current, 1);
537
564
  count += 1;
538
565
  }
539
566
  return nestedWeeks;
@@ -548,7 +575,7 @@ export class AdapterDayjs {
548
575
  let current = startDate;
549
576
  while (current < endDate) {
550
577
  years.push(current);
551
- current = current.add(1, 'year');
578
+ current = this.addYears(current, 1);
552
579
  }
553
580
  return years;
554
581
  };
@@ -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
@@ -84,6 +84,7 @@ process.env.NODE_ENV !== "production" ? DateField.propTypes = {
84
84
  * @default 'primary'
85
85
  */
86
86
  color: PropTypes.oneOf(['error', 'info', 'primary', 'secondary', 'success', 'warning']),
87
+ component: PropTypes.elementType,
87
88
  /**
88
89
  * Overridable components.
89
90
  * @default {}
@@ -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
@@ -89,6 +89,7 @@ process.env.NODE_ENV !== "production" ? DateTimeField.propTypes = {
89
89
  * @default 'primary'
90
90
  */
91
91
  color: PropTypes.oneOf(['error', 'info', 'primary', 'secondary', 'success', 'warning']),
92
+ component: PropTypes.elementType,
92
93
  /**
93
94
  * Overridable components.
94
95
  * @default {}
@@ -12,6 +12,7 @@ import { useLocaleText, useUtils } from '../internals/hooks/useUtils';
12
12
  import { dateTimePickerToolbarClasses, getDateTimePickerToolbarUtilityClass } from './dateTimePickerToolbarClasses';
13
13
  import { useMeridiemMode } from '../internals/hooks/date-helpers-hooks';
14
14
  import { MULTI_SECTION_CLOCK_SECTION_WIDTH } from '../internals/constants/dimensions';
15
+ import { formatMeridiem } from '../internals/utils/date-utils';
15
16
  import { jsx as _jsx } from "react/jsx-runtime";
16
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
17
18
  const useUtilityClasses = ownerState => {
@@ -264,14 +265,14 @@ function DateTimePickerToolbar(inProps) {
264
265
  variant: "subtitle2",
265
266
  selected: meridiemMode === 'am',
266
267
  typographyClassName: classes.ampmLabel,
267
- value: utils.getMeridiemText('am'),
268
+ value: formatMeridiem(utils, 'am'),
268
269
  onClick: readOnly ? undefined : () => handleMeridiemChange('am'),
269
270
  disabled: disabled
270
271
  }), /*#__PURE__*/_jsx(PickersToolbarButton, {
271
272
  variant: "subtitle2",
272
273
  selected: meridiemMode === 'pm',
273
274
  typographyClassName: classes.ampmLabel,
274
- value: utils.getMeridiemText('pm'),
275
+ value: formatMeridiem(utils, 'pm'),
275
276
  onClick: readOnly ? undefined : () => handleMeridiemChange('pm'),
276
277
  disabled: disabled
277
278
  })]
@@ -279,7 +280,7 @@ function DateTimePickerToolbar(inProps) {
279
280
  variant: "h5",
280
281
  onClick: () => onViewChange('meridiem'),
281
282
  selected: view === 'meridiem',
282
- value: value && meridiemMode ? utils.getMeridiemText(meridiemMode) : '--',
283
+ value: value && meridiemMode ? formatMeridiem(utils, meridiemMode) : '--',
283
284
  width: MULTI_SECTION_CLOCK_SECTION_WIDTH
284
285
  })]
285
286
  })]
@@ -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();
@@ -18,6 +18,7 @@ import { getHourSectionOptions, getTimeSectionOptions } from './MultiSectionDigi
18
18
  import { useControlledValueWithTimezone } from '../internals/hooks/useValueWithTimezone';
19
19
  import { singleItemValueManager } from '../internals/utils/valueManagers';
20
20
  import { useClockReferenceDate } from '../internals/hooks/useClockReferenceDate';
21
+ import { formatMeridiem } from '../internals/utils/date-utils';
21
22
  import { jsx as _jsx } from "react/jsx-runtime";
22
23
  const useUtilityClasses = ownerState => {
23
24
  const {
@@ -269,8 +270,8 @@ export const MultiSectionDigitalClock = /*#__PURE__*/React.forwardRef(function M
269
270
  }
270
271
  case 'meridiem':
271
272
  {
272
- const amLabel = utils.getMeridiemText('am');
273
- const pmLabel = utils.getMeridiemText('pm');
273
+ const amLabel = formatMeridiem(utils, 'am');
274
+ const pmLabel = formatMeridiem(utils, 'pm');
274
275
  return {
275
276
  onChange: handleMeridiemChange,
276
277
  items: [{
@@ -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';