@mui/x-date-pickers 7.17.0 → 7.18.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 (55) hide show
  1. package/AdapterDateFns/AdapterDateFns.js +1 -1
  2. package/AdapterDateFnsV3/AdapterDateFnsV3.js +1 -1
  3. package/CHANGELOG.md +98 -5
  4. package/DateCalendar/DateCalendar.js +9 -1
  5. package/DatePicker/DatePicker.js +6 -0
  6. package/DatePicker/DatePicker.types.d.ts +5 -5
  7. package/DateTimePicker/DateTimePicker.js +6 -0
  8. package/DateTimePicker/DateTimePicker.types.d.ts +7 -6
  9. package/DesktopDatePicker/DesktopDatePicker.js +6 -0
  10. package/DesktopDatePicker/DesktopDatePicker.types.d.ts +7 -6
  11. package/DesktopDateTimePicker/DesktopDateTimePicker.js +6 -0
  12. package/DesktopDateTimePicker/DesktopDateTimePicker.types.d.ts +11 -10
  13. package/MobileDatePicker/MobileDatePicker.js +6 -0
  14. package/MobileDatePicker/MobileDatePicker.types.d.ts +5 -0
  15. package/MobileDateTimePicker/MobileDateTimePicker.js +6 -0
  16. package/MonthCalendar/MonthCalendar.types.d.ts +1 -1
  17. package/PickersCalendarHeader/PickersCalendarHeader.types.d.ts +1 -1
  18. package/StaticDatePicker/StaticDatePicker.js +7 -1
  19. package/StaticDatePicker/StaticDatePicker.types.d.ts +5 -0
  20. package/StaticDateTimePicker/StaticDateTimePicker.js +7 -1
  21. package/StaticDateTimePicker/StaticDateTimePicker.types.d.ts +5 -0
  22. package/YearCalendar/YearCalendar.js +19 -6
  23. package/YearCalendar/YearCalendar.types.d.ts +7 -1
  24. package/dateViewRenderers/dateViewRenderers.d.ts +1 -1
  25. package/dateViewRenderers/dateViewRenderers.js +2 -0
  26. package/index.js +1 -1
  27. package/modern/AdapterDateFns/AdapterDateFns.js +1 -1
  28. package/modern/AdapterDateFnsV3/AdapterDateFnsV3.js +1 -1
  29. package/modern/DateCalendar/DateCalendar.js +9 -1
  30. package/modern/DatePicker/DatePicker.js +6 -0
  31. package/modern/DateTimePicker/DateTimePicker.js +6 -0
  32. package/modern/DesktopDatePicker/DesktopDatePicker.js +6 -0
  33. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +6 -0
  34. package/modern/MobileDatePicker/MobileDatePicker.js +6 -0
  35. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +6 -0
  36. package/modern/StaticDatePicker/StaticDatePicker.js +7 -1
  37. package/modern/StaticDateTimePicker/StaticDateTimePicker.js +7 -1
  38. package/modern/YearCalendar/YearCalendar.js +19 -6
  39. package/modern/dateViewRenderers/dateViewRenderers.js +2 -0
  40. package/modern/index.js +1 -1
  41. package/node/AdapterDateFns/AdapterDateFns.js +1 -1
  42. package/node/AdapterDateFnsV3/AdapterDateFnsV3.js +1 -1
  43. package/node/DateCalendar/DateCalendar.js +9 -1
  44. package/node/DatePicker/DatePicker.js +6 -0
  45. package/node/DateTimePicker/DateTimePicker.js +6 -0
  46. package/node/DesktopDatePicker/DesktopDatePicker.js +6 -0
  47. package/node/DesktopDateTimePicker/DesktopDateTimePicker.js +6 -0
  48. package/node/MobileDatePicker/MobileDatePicker.js +6 -0
  49. package/node/MobileDateTimePicker/MobileDateTimePicker.js +6 -0
  50. package/node/StaticDatePicker/StaticDatePicker.js +7 -1
  51. package/node/StaticDateTimePicker/StaticDateTimePicker.js +7 -1
  52. package/node/YearCalendar/YearCalendar.js +19 -6
  53. package/node/dateViewRenderers/dateViewRenderers.js +2 -0
  54. package/node/index.js +1 -1
  55. package/package.json +4 -4
@@ -82,7 +82,7 @@ export class AdapterDateFns extends AdapterDateFnsBase {
82
82
  /* istanbul ignore next */
83
83
  if (process.env.NODE_ENV !== 'production') {
84
84
  if (typeof addDays !== 'function') {
85
- throw new Error([`MUI: The \`date-fns\` package v2.x is not compatible with this adapter.`, 'Please, install v3.x of the package or use the `AdapterDateFns` instead.'].join('\n'));
85
+ throw new Error([`MUI: The \`date-fns\` package v2.x is not compatible with this adapter.`, 'Please, install v3.x or v4.x of the package or use the `AdapterDateFns` instead.'].join('\n'));
86
86
  }
87
87
  if (!longFormatters) {
88
88
  throw new Error('MUI: The minimum supported `date-fns` package version compatible with this adapter is `3.2.x`.');
@@ -2,7 +2,7 @@
2
2
 
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
4
  import _extends from "@babel/runtime/helpers/esm/extends";
5
- const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "referenceDate", "disableFuture", "disablePast", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsPerRow", "monthsPerRow", "timezone"];
5
+ const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "referenceDate", "disableFuture", "disablePast", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsOrder", "yearsPerRow", "monthsPerRow", "timezone"];
6
6
  import * as React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import clsx from 'clsx';
@@ -120,6 +120,7 @@ export const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(
120
120
  loading,
121
121
  renderLoading,
122
122
  displayWeekNumber,
123
+ yearsOrder,
123
124
  yearsPerRow,
124
125
  monthsPerRow,
125
126
  timezone: timezoneProp
@@ -311,6 +312,7 @@ export const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(
311
312
  shouldDisableYear: shouldDisableYear,
312
313
  hasFocus: hasFocus,
313
314
  onFocusedViewChange: isViewFocused => setFocusedView('year', isViewFocused),
315
+ yearsOrder: yearsOrder,
314
316
  yearsPerRow: yearsPerRow,
315
317
  referenceDate: referenceDate
316
318
  })), view === 'month' && /*#__PURE__*/_jsx(MonthCalendar, _extends({}, baseDateValidationProps, commonViewProps, {
@@ -560,6 +562,12 @@ process.env.NODE_ENV !== "production" ? DateCalendar.propTypes = {
560
562
  * Available views.
561
563
  */
562
564
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired),
565
+ /**
566
+ * Years are displayed in ascending (chronological) order by default.
567
+ * If `desc`, years are displayed in descending order.
568
+ * @default 'asc'
569
+ */
570
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
563
571
  /**
564
572
  * Years rendered per row.
565
573
  * @default 3
@@ -351,6 +351,12 @@ process.env.NODE_ENV !== "production" ? DatePicker.propTypes = {
351
351
  * Available views.
352
352
  */
353
353
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired),
354
+ /**
355
+ * Years are displayed in ascending (chronological) order by default.
356
+ * If `desc`, years are displayed in descending order.
357
+ * @default 'asc'
358
+ */
359
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
354
360
  /**
355
361
  * Years rendered per row.
356
362
  * @default 4 on desktop, 3 on mobile
@@ -422,6 +422,12 @@ process.env.NODE_ENV !== "production" ? DateTimePicker.propTypes = {
422
422
  * Available views.
423
423
  */
424
424
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
425
+ /**
426
+ * Years are displayed in ascending (chronological) order by default.
427
+ * If `desc`, years are displayed in descending order.
428
+ * @default 'asc'
429
+ */
430
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
425
431
  /**
426
432
  * Years rendered per row.
427
433
  * @default 4 on desktop, 3 on mobile
@@ -372,6 +372,12 @@ DesktopDatePicker.propTypes = {
372
372
  * Available views.
373
373
  */
374
374
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired),
375
+ /**
376
+ * Years are displayed in ascending (chronological) order by default.
377
+ * If `desc`, years are displayed in descending order.
378
+ * @default 'asc'
379
+ */
380
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
375
381
  /**
376
382
  * Years rendered per row.
377
383
  * @default 4
@@ -530,6 +530,12 @@ DesktopDateTimePicker.propTypes = {
530
530
  * Available views.
531
531
  */
532
532
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
533
+ /**
534
+ * Years are displayed in ascending (chronological) order by default.
535
+ * If `desc`, years are displayed in descending order.
536
+ * @default 'asc'
537
+ */
538
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
533
539
  /**
534
540
  * Years rendered per row.
535
541
  * @default 4
@@ -369,6 +369,12 @@ MobileDatePicker.propTypes = {
369
369
  * Available views.
370
370
  */
371
371
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired),
372
+ /**
373
+ * Years are displayed in ascending (chronological) order by default.
374
+ * If `desc`, years are displayed in descending order.
375
+ * @default 'asc'
376
+ */
377
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
372
378
  /**
373
379
  * Years rendered per row.
374
380
  * @default 3
@@ -428,6 +428,12 @@ MobileDateTimePicker.propTypes = {
428
428
  * Available views.
429
429
  */
430
430
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
431
+ /**
432
+ * Years are displayed in ascending (chronological) order by default.
433
+ * If `desc`, years are displayed in descending order.
434
+ * @default 'asc'
435
+ */
436
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
431
437
  /**
432
438
  * Years rendered per row.
433
439
  * @default 3
@@ -293,9 +293,15 @@ StaticDatePicker.propTypes = {
293
293
  * Available views.
294
294
  */
295
295
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'month', 'year']).isRequired),
296
+ /**
297
+ * Years are displayed in ascending (chronological) order by default.
298
+ * If `desc`, years are displayed in descending order.
299
+ * @default 'asc'
300
+ */
301
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
296
302
  /**
297
303
  * Years rendered per row.
298
- * @default 3
304
+ * @default `4` when `displayStaticWrapperAs === 'desktop'`, `3` otherwise.
299
305
  */
300
306
  yearsPerRow: PropTypes.oneOf([3, 4])
301
307
  };
@@ -352,9 +352,15 @@ StaticDateTimePicker.propTypes = {
352
352
  * Available views.
353
353
  */
354
354
  views: PropTypes.arrayOf(PropTypes.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
355
+ /**
356
+ * Years are displayed in ascending (chronological) order by default.
357
+ * If `desc`, years are displayed in descending order.
358
+ * @default 'asc'
359
+ */
360
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
355
361
  /**
356
362
  * Years rendered per row.
357
- * @default 3
363
+ * @default `4` when `displayStaticWrapperAs === 'desktop'`, `3` otherwise.
358
364
  */
359
365
  yearsPerRow: PropTypes.oneOf([3, 4])
360
366
  };
@@ -2,7 +2,7 @@
2
2
 
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
4
  import _extends from "@babel/runtime/helpers/esm/extends";
5
- const _excluded = ["autoFocus", "className", "value", "defaultValue", "referenceDate", "disabled", "disableFuture", "disablePast", "maxDate", "minDate", "onChange", "readOnly", "shouldDisableYear", "disableHighlightToday", "onYearFocus", "hasFocus", "onFocusedViewChange", "yearsPerRow", "timezone", "gridLabelId", "slots", "slotProps"];
5
+ const _excluded = ["autoFocus", "className", "value", "defaultValue", "referenceDate", "disabled", "disableFuture", "disablePast", "maxDate", "minDate", "onChange", "readOnly", "shouldDisableYear", "disableHighlightToday", "onYearFocus", "hasFocus", "onFocusedViewChange", "yearsOrder", "yearsPerRow", "timezone", "gridLabelId", "slots", "slotProps"];
6
6
  import * as React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import clsx from 'clsx';
@@ -88,6 +88,7 @@ export const YearCalendar = /*#__PURE__*/React.forwardRef(function YearCalendar(
88
88
  onYearFocus,
89
89
  hasFocus,
90
90
  onFocusedViewChange,
91
+ yearsOrder = 'asc',
91
92
  yearsPerRow,
92
93
  timezone: timezoneProp,
93
94
  gridLabelId,
@@ -177,22 +178,24 @@ export const YearCalendar = /*#__PURE__*/React.forwardRef(function YearCalendar(
177
178
  React.useEffect(() => {
178
179
  setFocusedYear(prevFocusedYear => selectedYear !== null && prevFocusedYear !== selectedYear ? selectedYear : prevFocusedYear);
179
180
  }, [selectedYear]);
181
+ const verticalDirection = yearsOrder !== 'desc' ? yearsPerRow * 1 : yearsPerRow * -1;
182
+ const horizontalDirection = isRtl || yearsOrder === 'desc' ? -1 : 1;
180
183
  const handleKeyDown = useEventCallback((event, year) => {
181
184
  switch (event.key) {
182
185
  case 'ArrowUp':
183
- focusYear(year - yearsPerRow);
186
+ focusYear(year - verticalDirection);
184
187
  event.preventDefault();
185
188
  break;
186
189
  case 'ArrowDown':
187
- focusYear(year + yearsPerRow);
190
+ focusYear(year + verticalDirection);
188
191
  event.preventDefault();
189
192
  break;
190
193
  case 'ArrowLeft':
191
- focusYear(year + (isRtl ? 1 : -1));
194
+ focusYear(year - horizontalDirection);
192
195
  event.preventDefault();
193
196
  break;
194
197
  case 'ArrowRight':
195
- focusYear(year + (isRtl ? -1 : 1));
198
+ focusYear(year + horizontalDirection);
196
199
  event.preventDefault();
197
200
  break;
198
201
  default:
@@ -230,6 +233,10 @@ export const YearCalendar = /*#__PURE__*/React.forwardRef(function YearCalendar(
230
233
  }
231
234
  scrollerRef.current.scrollTop = elementBottom - clientHeight / 2 - offsetHeight / 2;
232
235
  }, [autoFocus]);
236
+ const yearRange = utils.getYearRange([minDate, maxDate]);
237
+ if (yearsOrder === 'desc') {
238
+ yearRange.reverse();
239
+ }
233
240
  return /*#__PURE__*/_jsx(YearCalendarRoot, _extends({
234
241
  ref: handleRef,
235
242
  className: clsx(classes.root, className),
@@ -237,7 +244,7 @@ export const YearCalendar = /*#__PURE__*/React.forwardRef(function YearCalendar(
237
244
  role: "radiogroup",
238
245
  "aria-labelledby": gridLabelId
239
246
  }, other, {
240
- children: utils.getYearRange([minDate, maxDate]).map(year => {
247
+ children: yearRange.map(year => {
241
248
  const yearNumber = utils.getYear(year);
242
249
  const isSelected = yearNumber === selectedYear;
243
250
  const isDisabled = disabled || isYearDisabled(year);
@@ -358,6 +365,12 @@ process.env.NODE_ENV !== "production" ? YearCalendar.propTypes = {
358
365
  * Used when the component is controlled.
359
366
  */
360
367
  value: PropTypes.object,
368
+ /**
369
+ * Years are displayed in ascending (chronological) order by default.
370
+ * If `desc`, years are displayed in descending order.
371
+ * @default 'asc'
372
+ */
373
+ yearsOrder: PropTypes.oneOf(['asc', 'desc']),
361
374
  /**
362
375
  * Years rendered per row.
363
376
  * @default 3
@@ -25,6 +25,7 @@ export const renderDateViewCalendar = ({
25
25
  onMonthChange,
26
26
  monthsPerRow,
27
27
  onYearChange,
28
+ yearsOrder,
28
29
  yearsPerRow,
29
30
  slots,
30
31
  slotProps,
@@ -63,6 +64,7 @@ export const renderDateViewCalendar = ({
63
64
  onMonthChange: onMonthChange,
64
65
  monthsPerRow: monthsPerRow,
65
66
  onYearChange: onYearChange,
67
+ yearsOrder: yearsOrder,
66
68
  yearsPerRow: yearsPerRow,
67
69
  slots: slots,
68
70
  slotProps: slotProps,
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v7.17.0
2
+ * @mui/x-date-pickers v7.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -87,7 +87,7 @@ class AdapterDateFns extends _AdapterDateFnsBase.AdapterDateFnsBase {
87
87
  /* istanbul ignore next */
88
88
  if (process.env.NODE_ENV !== 'production') {
89
89
  if (typeof _addDays.default !== 'function') {
90
- throw new Error(['MUI: The `date-fns` package v3.x is not compatible with this adapter.', 'Please, install v2.x of the package or use the `AdapterDateFnsV3` instead.'].join('\n'));
90
+ throw new Error(['MUI: This adapter is only compatible with `date-fns` v2.x package versions.', 'Please, install v2.x of the package or use the `AdapterDateFnsV3` instead.'].join('\n'));
91
91
  }
92
92
  }
93
93
  super({
@@ -90,7 +90,7 @@ class AdapterDateFns extends _AdapterDateFnsBase.AdapterDateFnsBase {
90
90
  /* istanbul ignore next */
91
91
  if (process.env.NODE_ENV !== 'production') {
92
92
  if (typeof _addDays.addDays !== 'function') {
93
- throw new Error([`MUI: The \`date-fns\` package v2.x is not compatible with this adapter.`, 'Please, install v3.x of the package or use the `AdapterDateFns` instead.'].join('\n'));
93
+ throw new Error([`MUI: The \`date-fns\` package v2.x is not compatible with this adapter.`, 'Please, install v3.x or v4.x of the package or use the `AdapterDateFns` instead.'].join('\n'));
94
94
  }
95
95
  if (!_format.longFormatters) {
96
96
  throw new Error('MUI: The minimum supported `date-fns` package version compatible with this adapter is `3.2.x`.');
@@ -31,7 +31,7 @@ var _useValueWithTimezone = require("../internals/hooks/useValueWithTimezone");
31
31
  var _valueManagers = require("../internals/utils/valueManagers");
32
32
  var _dimensions = require("../internals/constants/dimensions");
33
33
  var _jsxRuntime = require("react/jsx-runtime");
34
- const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "referenceDate", "disableFuture", "disablePast", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsPerRow", "monthsPerRow", "timezone"];
34
+ const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "referenceDate", "disableFuture", "disablePast", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsOrder", "yearsPerRow", "monthsPerRow", "timezone"];
35
35
  const useUtilityClasses = ownerState => {
36
36
  const {
37
37
  classes
@@ -127,6 +127,7 @@ const DateCalendar = exports.DateCalendar = /*#__PURE__*/React.forwardRef(functi
127
127
  loading,
128
128
  renderLoading,
129
129
  displayWeekNumber,
130
+ yearsOrder,
130
131
  yearsPerRow,
131
132
  monthsPerRow,
132
133
  timezone: timezoneProp
@@ -318,6 +319,7 @@ const DateCalendar = exports.DateCalendar = /*#__PURE__*/React.forwardRef(functi
318
319
  shouldDisableYear: shouldDisableYear,
319
320
  hasFocus: hasFocus,
320
321
  onFocusedViewChange: isViewFocused => setFocusedView('year', isViewFocused),
322
+ yearsOrder: yearsOrder,
321
323
  yearsPerRow: yearsPerRow,
322
324
  referenceDate: referenceDate
323
325
  })), view === 'month' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MonthCalendar.MonthCalendar, (0, _extends2.default)({}, baseDateValidationProps, commonViewProps, {
@@ -567,6 +569,12 @@ process.env.NODE_ENV !== "production" ? DateCalendar.propTypes = {
567
569
  * Available views.
568
570
  */
569
571
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'month', 'year']).isRequired),
572
+ /**
573
+ * Years are displayed in ascending (chronological) order by default.
574
+ * If `desc`, years are displayed in descending order.
575
+ * @default 'asc'
576
+ */
577
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
570
578
  /**
571
579
  * Years rendered per row.
572
580
  * @default 3
@@ -358,6 +358,12 @@ process.env.NODE_ENV !== "production" ? DatePicker.propTypes = {
358
358
  * Available views.
359
359
  */
360
360
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'month', 'year']).isRequired),
361
+ /**
362
+ * Years are displayed in ascending (chronological) order by default.
363
+ * If `desc`, years are displayed in descending order.
364
+ * @default 'asc'
365
+ */
366
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
361
367
  /**
362
368
  * Years rendered per row.
363
369
  * @default 4 on desktop, 3 on mobile
@@ -429,6 +429,12 @@ process.env.NODE_ENV !== "production" ? DateTimePicker.propTypes = {
429
429
  * Available views.
430
430
  */
431
431
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
432
+ /**
433
+ * Years are displayed in ascending (chronological) order by default.
434
+ * If `desc`, years are displayed in descending order.
435
+ * @default 'asc'
436
+ */
437
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
432
438
  /**
433
439
  * Years rendered per row.
434
440
  * @default 4 on desktop, 3 on mobile
@@ -379,6 +379,12 @@ DesktopDatePicker.propTypes = {
379
379
  * Available views.
380
380
  */
381
381
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'month', 'year']).isRequired),
382
+ /**
383
+ * Years are displayed in ascending (chronological) order by default.
384
+ * If `desc`, years are displayed in descending order.
385
+ * @default 'asc'
386
+ */
387
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
382
388
  /**
383
389
  * Years rendered per row.
384
390
  * @default 4
@@ -537,6 +537,12 @@ DesktopDateTimePicker.propTypes = {
537
537
  * Available views.
538
538
  */
539
539
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
540
+ /**
541
+ * Years are displayed in ascending (chronological) order by default.
542
+ * If `desc`, years are displayed in descending order.
543
+ * @default 'asc'
544
+ */
545
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
540
546
  /**
541
547
  * Years rendered per row.
542
548
  * @default 4
@@ -376,6 +376,12 @@ MobileDatePicker.propTypes = {
376
376
  * Available views.
377
377
  */
378
378
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'month', 'year']).isRequired),
379
+ /**
380
+ * Years are displayed in ascending (chronological) order by default.
381
+ * If `desc`, years are displayed in descending order.
382
+ * @default 'asc'
383
+ */
384
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
379
385
  /**
380
386
  * Years rendered per row.
381
387
  * @default 3
@@ -435,6 +435,12 @@ MobileDateTimePicker.propTypes = {
435
435
  * Available views.
436
436
  */
437
437
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
438
+ /**
439
+ * Years are displayed in ascending (chronological) order by default.
440
+ * If `desc`, years are displayed in descending order.
441
+ * @default 'asc'
442
+ */
443
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
438
444
  /**
439
445
  * Years rendered per row.
440
446
  * @default 3
@@ -300,9 +300,15 @@ StaticDatePicker.propTypes = {
300
300
  * Available views.
301
301
  */
302
302
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'month', 'year']).isRequired),
303
+ /**
304
+ * Years are displayed in ascending (chronological) order by default.
305
+ * If `desc`, years are displayed in descending order.
306
+ * @default 'asc'
307
+ */
308
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
303
309
  /**
304
310
  * Years rendered per row.
305
- * @default 3
311
+ * @default `4` when `displayStaticWrapperAs === 'desktop'`, `3` otherwise.
306
312
  */
307
313
  yearsPerRow: _propTypes.default.oneOf([3, 4])
308
314
  };
@@ -359,9 +359,15 @@ StaticDateTimePicker.propTypes = {
359
359
  * Available views.
360
360
  */
361
361
  views: _propTypes.default.arrayOf(_propTypes.default.oneOf(['day', 'hours', 'minutes', 'month', 'seconds', 'year']).isRequired),
362
+ /**
363
+ * Years are displayed in ascending (chronological) order by default.
364
+ * If `desc`, years are displayed in descending order.
365
+ * @default 'asc'
366
+ */
367
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
362
368
  /**
363
369
  * Years rendered per row.
364
- * @default 3
370
+ * @default `4` when `displayStaticWrapperAs === 'desktop'`, `3` otherwise.
365
371
  */
366
372
  yearsPerRow: _propTypes.default.oneOf([3, 4])
367
373
  };
@@ -24,7 +24,7 @@ var _getDefaultReferenceDate = require("../internals/utils/getDefaultReferenceDa
24
24
  var _useValueWithTimezone = require("../internals/hooks/useValueWithTimezone");
25
25
  var _dimensions = require("../internals/constants/dimensions");
26
26
  var _jsxRuntime = require("react/jsx-runtime");
27
- const _excluded = ["autoFocus", "className", "value", "defaultValue", "referenceDate", "disabled", "disableFuture", "disablePast", "maxDate", "minDate", "onChange", "readOnly", "shouldDisableYear", "disableHighlightToday", "onYearFocus", "hasFocus", "onFocusedViewChange", "yearsPerRow", "timezone", "gridLabelId", "slots", "slotProps"];
27
+ const _excluded = ["autoFocus", "className", "value", "defaultValue", "referenceDate", "disabled", "disableFuture", "disablePast", "maxDate", "minDate", "onChange", "readOnly", "shouldDisableYear", "disableHighlightToday", "onYearFocus", "hasFocus", "onFocusedViewChange", "yearsOrder", "yearsPerRow", "timezone", "gridLabelId", "slots", "slotProps"];
28
28
  const useUtilityClasses = ownerState => {
29
29
  const {
30
30
  classes
@@ -95,6 +95,7 @@ const YearCalendar = exports.YearCalendar = /*#__PURE__*/React.forwardRef(functi
95
95
  onYearFocus,
96
96
  hasFocus,
97
97
  onFocusedViewChange,
98
+ yearsOrder = 'asc',
98
99
  yearsPerRow,
99
100
  timezone: timezoneProp,
100
101
  gridLabelId,
@@ -184,22 +185,24 @@ const YearCalendar = exports.YearCalendar = /*#__PURE__*/React.forwardRef(functi
184
185
  React.useEffect(() => {
185
186
  setFocusedYear(prevFocusedYear => selectedYear !== null && prevFocusedYear !== selectedYear ? selectedYear : prevFocusedYear);
186
187
  }, [selectedYear]);
188
+ const verticalDirection = yearsOrder !== 'desc' ? yearsPerRow * 1 : yearsPerRow * -1;
189
+ const horizontalDirection = isRtl || yearsOrder === 'desc' ? -1 : 1;
187
190
  const handleKeyDown = (0, _utils.unstable_useEventCallback)((event, year) => {
188
191
  switch (event.key) {
189
192
  case 'ArrowUp':
190
- focusYear(year - yearsPerRow);
193
+ focusYear(year - verticalDirection);
191
194
  event.preventDefault();
192
195
  break;
193
196
  case 'ArrowDown':
194
- focusYear(year + yearsPerRow);
197
+ focusYear(year + verticalDirection);
195
198
  event.preventDefault();
196
199
  break;
197
200
  case 'ArrowLeft':
198
- focusYear(year + (isRtl ? 1 : -1));
201
+ focusYear(year - horizontalDirection);
199
202
  event.preventDefault();
200
203
  break;
201
204
  case 'ArrowRight':
202
- focusYear(year + (isRtl ? -1 : 1));
205
+ focusYear(year + horizontalDirection);
203
206
  event.preventDefault();
204
207
  break;
205
208
  default:
@@ -237,6 +240,10 @@ const YearCalendar = exports.YearCalendar = /*#__PURE__*/React.forwardRef(functi
237
240
  }
238
241
  scrollerRef.current.scrollTop = elementBottom - clientHeight / 2 - offsetHeight / 2;
239
242
  }, [autoFocus]);
243
+ const yearRange = utils.getYearRange([minDate, maxDate]);
244
+ if (yearsOrder === 'desc') {
245
+ yearRange.reverse();
246
+ }
240
247
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(YearCalendarRoot, (0, _extends2.default)({
241
248
  ref: handleRef,
242
249
  className: (0, _clsx.default)(classes.root, className),
@@ -244,7 +251,7 @@ const YearCalendar = exports.YearCalendar = /*#__PURE__*/React.forwardRef(functi
244
251
  role: "radiogroup",
245
252
  "aria-labelledby": gridLabelId
246
253
  }, other, {
247
- children: utils.getYearRange([minDate, maxDate]).map(year => {
254
+ children: yearRange.map(year => {
248
255
  const yearNumber = utils.getYear(year);
249
256
  const isSelected = yearNumber === selectedYear;
250
257
  const isDisabled = disabled || isYearDisabled(year);
@@ -365,6 +372,12 @@ process.env.NODE_ENV !== "production" ? YearCalendar.propTypes = {
365
372
  * Used when the component is controlled.
366
373
  */
367
374
  value: _propTypes.default.object,
375
+ /**
376
+ * Years are displayed in ascending (chronological) order by default.
377
+ * If `desc`, years are displayed in descending order.
378
+ * @default 'asc'
379
+ */
380
+ yearsOrder: _propTypes.default.oneOf(['asc', 'desc']),
368
381
  /**
369
382
  * Years rendered per row.
370
383
  * @default 3
@@ -32,6 +32,7 @@ const renderDateViewCalendar = ({
32
32
  onMonthChange,
33
33
  monthsPerRow,
34
34
  onYearChange,
35
+ yearsOrder,
35
36
  yearsPerRow,
36
37
  slots,
37
38
  slotProps,
@@ -70,6 +71,7 @@ const renderDateViewCalendar = ({
70
71
  onMonthChange: onMonthChange,
71
72
  monthsPerRow: monthsPerRow,
72
73
  onYearChange: onYearChange,
74
+ yearsOrder: yearsOrder,
73
75
  yearsPerRow: yearsPerRow,
74
76
  slots: slots,
75
77
  slotProps: slotProps,
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v7.17.0
2
+ * @mui/x-date-pickers v7.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-date-pickers",
3
- "version": "7.17.0",
3
+ "version": "7.18.0",
4
4
  "description": "The community edition of the Date and Time Picker components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -31,7 +31,7 @@
31
31
  ],
32
32
  "repository": {
33
33
  "type": "git",
34
- "url": "https://github.com/mui/mui-x.git",
34
+ "url": "git+https://github.com/mui/mui-x.git",
35
35
  "directory": "packages/x-date-pickers"
36
36
  },
37
37
  "dependencies": {
@@ -41,14 +41,14 @@
41
41
  "clsx": "^2.1.1",
42
42
  "prop-types": "^15.8.1",
43
43
  "react-transition-group": "^4.4.5",
44
- "@mui/x-internals": "7.17.0"
44
+ "@mui/x-internals": "7.18.0"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@emotion/react": "^11.9.0",
48
48
  "@emotion/styled": "^11.8.1",
49
49
  "@mui/material": "^5.15.14 || ^6.0.0",
50
50
  "@mui/system": "^5.15.14 || ^6.0.0",
51
- "date-fns": "^2.25.0 || ^3.2.0",
51
+ "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0",
52
52
  "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0",
53
53
  "dayjs": "^1.10.7",
54
54
  "luxon": "^3.0.2",