@mui/x-date-pickers-pro 6.8.0 → 6.9.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 (95) hide show
  1. package/CHANGELOG.md +76 -5534
  2. package/DateRangeCalendar/DateRangeCalendar.js +41 -22
  3. package/DateRangeCalendar/DateRangeCalendar.types.d.ts +2 -1
  4. package/DateRangeCalendar/useDragRange.d.ts +3 -2
  5. package/DateRangeCalendar/useDragRange.js +14 -11
  6. package/DateRangePicker/DateRangePicker.js +8 -0
  7. package/DesktopDateRangePicker/DesktopDateRangePicker.js +8 -0
  8. package/MobileDateRangePicker/MobileDateRangePicker.js +8 -0
  9. package/MultiInputDateRangeField/MultiInputDateRangeField.js +8 -0
  10. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +8 -0
  11. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.d.ts +1 -1
  12. package/MultiInputTimeRangeField/MultiInputTimeRangeField.js +8 -0
  13. package/MultiInputTimeRangeField/MultiInputTimeRangeField.types.d.ts +1 -1
  14. package/SingleInputDateRangeField/SingleInputDateRangeField.js +8 -0
  15. package/SingleInputDateRangeField/SingleInputDateRangeField.types.d.ts +1 -1
  16. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +8 -0
  17. package/SingleInputTimeRangeField/SingleInputTimeRangeField.js +8 -0
  18. package/StaticDateRangePicker/StaticDateRangePicker.js +8 -0
  19. package/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +1 -1
  20. package/dateRangeViewRenderers/dateRangeViewRenderers.js +4 -2
  21. package/index.js +1 -1
  22. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -0
  23. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +3 -1
  24. package/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +21 -14
  25. package/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +21 -14
  26. package/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +21 -14
  27. package/internal/utils/releaseInfo.js +1 -1
  28. package/internal/utils/validation/validateDateRange.d.ts +3 -2
  29. package/internal/utils/validation/validateDateTimeRange.d.ts +3 -2
  30. package/internal/utils/validation/validateTimeRange.d.ts +3 -2
  31. package/internal/utils/valueManagers.js +3 -2
  32. package/legacy/DateRangeCalendar/DateRangeCalendar.js +39 -24
  33. package/legacy/DateRangeCalendar/useDragRange.js +14 -11
  34. package/legacy/DateRangePicker/DateRangePicker.js +8 -0
  35. package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +8 -0
  36. package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +8 -0
  37. package/legacy/MultiInputDateRangeField/MultiInputDateRangeField.js +8 -0
  38. package/legacy/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +8 -0
  39. package/legacy/MultiInputTimeRangeField/MultiInputTimeRangeField.js +8 -0
  40. package/legacy/SingleInputDateRangeField/SingleInputDateRangeField.js +8 -0
  41. package/legacy/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +8 -0
  42. package/legacy/SingleInputTimeRangeField/SingleInputTimeRangeField.js +8 -0
  43. package/legacy/StaticDateRangePicker/StaticDateRangePicker.js +8 -0
  44. package/legacy/dateRangeViewRenderers/dateRangeViewRenderers.js +4 -2
  45. package/legacy/index.js +1 -1
  46. package/legacy/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -0
  47. package/legacy/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +3 -1
  48. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +20 -18
  49. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +20 -18
  50. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +20 -18
  51. package/legacy/internal/utils/releaseInfo.js +1 -1
  52. package/legacy/internal/utils/valueManagers.js +5 -2
  53. package/modern/DateRangeCalendar/DateRangeCalendar.js +41 -22
  54. package/modern/DateRangeCalendar/useDragRange.js +14 -11
  55. package/modern/DateRangePicker/DateRangePicker.js +8 -0
  56. package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +8 -0
  57. package/modern/MobileDateRangePicker/MobileDateRangePicker.js +8 -0
  58. package/modern/MultiInputDateRangeField/MultiInputDateRangeField.js +8 -0
  59. package/modern/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +8 -0
  60. package/modern/MultiInputTimeRangeField/MultiInputTimeRangeField.js +8 -0
  61. package/modern/SingleInputDateRangeField/SingleInputDateRangeField.js +8 -0
  62. package/modern/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +8 -0
  63. package/modern/SingleInputTimeRangeField/SingleInputTimeRangeField.js +8 -0
  64. package/modern/StaticDateRangePicker/StaticDateRangePicker.js +8 -0
  65. package/modern/dateRangeViewRenderers/dateRangeViewRenderers.js +4 -2
  66. package/modern/index.js +1 -1
  67. package/modern/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -0
  68. package/modern/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +3 -1
  69. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +21 -13
  70. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +21 -13
  71. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +21 -13
  72. package/modern/internal/utils/releaseInfo.js +1 -1
  73. package/modern/internal/utils/valueManagers.js +3 -2
  74. package/node/DateRangeCalendar/DateRangeCalendar.js +40 -21
  75. package/node/DateRangeCalendar/useDragRange.js +14 -11
  76. package/node/DateRangePicker/DateRangePicker.js +8 -0
  77. package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +8 -0
  78. package/node/MobileDateRangePicker/MobileDateRangePicker.js +8 -0
  79. package/node/MultiInputDateRangeField/MultiInputDateRangeField.js +8 -0
  80. package/node/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +8 -0
  81. package/node/MultiInputTimeRangeField/MultiInputTimeRangeField.js +8 -0
  82. package/node/SingleInputDateRangeField/SingleInputDateRangeField.js +8 -0
  83. package/node/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +8 -0
  84. package/node/SingleInputTimeRangeField/SingleInputTimeRangeField.js +8 -0
  85. package/node/StaticDateRangePicker/StaticDateRangePicker.js +8 -0
  86. package/node/dateRangeViewRenderers/dateRangeViewRenderers.js +4 -2
  87. package/node/index.js +1 -1
  88. package/node/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -0
  89. package/node/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +3 -1
  90. package/node/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +20 -14
  91. package/node/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +20 -14
  92. package/node/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +20 -14
  93. package/node/internal/utils/releaseInfo.js +1 -1
  94. package/node/internal/utils/valueManagers.js +3 -2
  95. package/package.json +4 -4
@@ -1,18 +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 = ["value", "defaultValue", "onChange", "className", "disableFuture", "disablePast", "minDate", "maxDate", "shouldDisableDate", "reduceAnimations", "onMonthChange", "defaultCalendarMonth", "rangePosition", "defaultRangePosition", "onRangePositionChange", "calendars", "currentMonthCalendarPosition", "components", "componentsProps", "slots", "slotProps", "loading", "renderLoading", "disableHighlightToday", "readOnly", "disabled", "showDaysOutsideCurrentMonth", "dayOfWeekFormatter", "disableAutoMonthSwitching", "autoFocus", "fixedWeekNumber", "disableDragEditing", "displayWeekNumber"],
3
+ const _excluded = ["value", "defaultValue", "onChange", "className", "disableFuture", "disablePast", "minDate", "maxDate", "shouldDisableDate", "reduceAnimations", "onMonthChange", "defaultCalendarMonth", "rangePosition", "defaultRangePosition", "onRangePositionChange", "calendars", "currentMonthCalendarPosition", "components", "componentsProps", "slots", "slotProps", "loading", "renderLoading", "disableHighlightToday", "readOnly", "disabled", "showDaysOutsideCurrentMonth", "dayOfWeekFormatter", "disableAutoMonthSwitching", "autoFocus", "fixedWeekNumber", "disableDragEditing", "displayWeekNumber", "timezone"],
4
4
  _excluded2 = ["isDragging", "rangeDragDay", "draggingDatePosition"];
5
5
  import * as React from 'react';
6
6
  import PropTypes from 'prop-types';
7
7
  import clsx from 'clsx';
8
8
  import useEventCallback from '@mui/utils/useEventCallback';
9
- import useControlled from '@mui/utils/useControlled';
10
9
  import useMediaQuery from '@mui/material/useMediaQuery';
11
10
  import { resolveComponentProps } from '@mui/base/utils';
12
11
  import { styled, useThemeProps } from '@mui/material/styles';
13
12
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
14
13
  import { Watermark } from '@mui/x-license-pro';
15
- import { applyDefaultDate, DAY_MARGIN, DayCalendar, defaultReduceAnimations, PickersArrowSwitcher, PickersCalendarHeader, useCalendarState, useDefaultDates, useLocaleText, useNextMonthDisabled, usePreviousMonthDisabled, useUtils, useNow, uncapitalizeObjectKeys, DEFAULT_DESKTOP_MODE_MEDIA_QUERY, buildWarning } from '@mui/x-date-pickers/internals';
14
+ import { applyDefaultDate, DAY_MARGIN, DayCalendar, defaultReduceAnimations, PickersArrowSwitcher, PickersCalendarHeader, useCalendarState, useDefaultDates, useLocaleText, useNextMonthDisabled, usePreviousMonthDisabled, useUtils, useNow, uncapitalizeObjectKeys, DEFAULT_DESKTOP_MODE_MEDIA_QUERY, buildWarning, useControlledValueWithTimezone } from '@mui/x-date-pickers/internals';
16
15
  import { getReleaseInfo } from '../internal/utils/releaseInfo';
17
16
  import { dateRangeCalendarClasses, getDateRangeCalendarUtilityClass } from './dateRangeCalendarClasses';
18
17
  import { isEndOfRange, isRangeValid, isStartOfRange, isWithinRange } from '../internal/utils/date-utils';
@@ -40,7 +39,7 @@ const DateRangeCalendarMonthContainer = styled('div', {
40
39
  theme
41
40
  }) => ({
42
41
  '&:not(:last-of-type)': {
43
- borderRight: `2px solid ${(theme.vars || theme).palette.divider}`
42
+ borderRight: `1px solid ${(theme.vars || theme).palette.divider}`
44
43
  }
45
44
  }));
46
45
  const DateRangeCalendarArrowSwitcher = styled(PickersArrowSwitcher)({
@@ -109,9 +108,6 @@ const useUtilityClasses = ownerState => {
109
108
  return composeClasses(slots, getDateRangeCalendarUtilityClass, classes);
110
109
  };
111
110
  const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalendar(inProps, ref) {
112
- const utils = useUtils();
113
- const localeText = useLocaleText();
114
- const now = useNow();
115
111
  const props = useDateRangeCalendarDefaultizedProps(inProps, 'MuiDateRangeCalendar');
116
112
  const shouldHavePreview = useMediaQuery(DEFAULT_DESKTOP_MODE_MEDIA_QUERY, {
117
113
  defaultMatches: false
@@ -149,17 +145,27 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
149
145
  autoFocus,
150
146
  fixedWeekNumber,
151
147
  disableDragEditing,
152
- displayWeekNumber
148
+ displayWeekNumber,
149
+ timezone: timezoneProp
153
150
  } = props,
154
151
  other = _objectWithoutPropertiesLoose(props, _excluded);
155
- const slots = innerSlots != null ? innerSlots : uncapitalizeObjectKeys(components);
156
- const slotProps = innerSlotProps != null ? innerSlotProps : componentsProps;
157
- const [value, setValue] = useControlled({
158
- controlled: valueProp,
159
- default: defaultValue != null ? defaultValue : rangeValueManager.emptyValue,
152
+ const {
153
+ value,
154
+ handleValueChange,
155
+ timezone
156
+ } = useControlledValueWithTimezone({
160
157
  name: 'DateRangeCalendar',
161
- state: 'value'
158
+ timezone: timezoneProp,
159
+ value: valueProp,
160
+ defaultValue,
161
+ onChange,
162
+ valueManager: rangeValueManager
162
163
  });
164
+ const utils = useUtils();
165
+ const localeText = useLocaleText();
166
+ const now = useNow(timezone);
167
+ const slots = innerSlots != null ? innerSlots : uncapitalizeObjectKeys(components);
168
+ const slotProps = innerSlotProps != null ? innerSlotProps : componentsProps;
163
169
  const {
164
170
  rangePosition,
165
171
  onRangePositionChange
@@ -186,8 +192,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
186
192
  });
187
193
  onRangePositionChange(nextSelection);
188
194
  const isFullRangeSelected = rangePosition === 'end' && isRangeValid(utils, newRange);
189
- setValue(newRange);
190
- onChange == null ? void 0 : onChange(newRange, isFullRangeSelected ? 'finish' : 'partial');
195
+ handleValueChange(newRange, isFullRangeSelected ? 'finish' : 'partial');
191
196
  });
192
197
  const handleDrop = useEventCallback(newDate => {
193
198
  handleSelectedDayChange(newDate, undefined, true);
@@ -202,7 +207,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
202
207
  onDrop: handleDrop,
203
208
  onDatePositionChange: handleDatePositionChange,
204
209
  utils,
205
- dateRange: valueDayRange
210
+ dateRange: valueDayRange,
211
+ timezone
206
212
  }),
207
213
  {
208
214
  isDragging,
@@ -249,7 +255,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
249
255
  minDate,
250
256
  onMonthChange,
251
257
  reduceAnimations,
252
- shouldDisableDate: wrappedShouldDisableDate
258
+ shouldDisableDate: wrappedShouldDisableDate,
259
+ timezone
253
260
  });
254
261
  const prevValue = React.useRef(null);
255
262
  React.useEffect(() => {
@@ -285,11 +292,13 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
285
292
  }, [changeMonth, calendarState.currentMonth, utils]);
286
293
  const isNextMonthDisabled = useNextMonthDisabled(calendarState.currentMonth, {
287
294
  disableFuture,
288
- maxDate
295
+ maxDate,
296
+ timezone
289
297
  });
290
298
  const isPreviousMonthDisabled = usePreviousMonthDisabled(calendarState.currentMonth, {
291
299
  disablePast,
292
- minDate
300
+ minDate,
301
+ timezone
293
302
  });
294
303
  const baseDateValidationProps = {
295
304
  disablePast,
@@ -419,7 +428,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
419
428
  disableFuture: disableFuture,
420
429
  reduceAnimations: reduceAnimations,
421
430
  slots: slots,
422
- slotProps: slotProps
431
+ slotProps: slotProps,
432
+ timezone: timezone
423
433
  }) : /*#__PURE__*/_jsx(DateRangeCalendarArrowSwitcher, {
424
434
  onGoToPrevious: selectPreviousMonth,
425
435
  onGoToNext: selectNextMonth,
@@ -451,7 +461,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
451
461
  slotProps: slotPropsForDayCalendar,
452
462
  autoFocus: month === focusedMonth,
453
463
  fixedWeekNumber: fixedWeekNumber,
454
- displayWeekNumber: displayWeekNumber
464
+ displayWeekNumber: displayWeekNumber,
465
+ timezone: timezone
455
466
  }), index)]
456
467
  }, month))]
457
468
  }));
@@ -640,6 +651,14 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
640
651
  * The system prop that allows defining system overrides as well as additional CSS styles.
641
652
  */
642
653
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
654
+ /**
655
+ * Choose which timezone to use for the value.
656
+ * Example: "default", "system", "UTC", "America/New_York".
657
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
658
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
659
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
660
+ */
661
+ timezone: PropTypes.string,
643
662
  /**
644
663
  * The selected value.
645
664
  * Used when the component is controlled.
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import { SxProps } from '@mui/system';
3
3
  import { SlotComponentProps } from '@mui/base';
4
4
  import { Theme } from '@mui/material/styles';
5
+ import { TimezoneProps } from '@mui/x-date-pickers/models';
5
6
  import { BaseDateValidationProps, DefaultizedProps, ExportedDayCalendarProps, DayCalendarSlotsComponent, DayCalendarSlotsComponentsProps, PickersArrowSwitcherSlotsComponent, PickersArrowSwitcherSlotsComponentsProps, PickerSelectionState, PickersCalendarHeaderSlotsComponent, PickersCalendarHeaderSlotsComponentsProps, DayCalendarProps, ExportedUseViewsOptions, UncapitalizeObjectKeys } from '@mui/x-date-pickers/internals';
6
7
  import { DateRange, DayRangeValidationProps } from '../internal/models';
7
8
  import { DateRangeCalendarClasses } from './dateRangeCalendarClasses';
@@ -22,7 +23,7 @@ export interface DateRangeCalendarSlotsComponentsProps<TDate> extends PickersArr
22
23
  selected: boolean;
23
24
  }>;
24
25
  }
25
- export interface ExportedDateRangeCalendarProps<TDate> extends ExportedDayCalendarProps, BaseDateValidationProps<TDate>, DayRangeValidationProps<TDate>, Pick<ExportedUseViewsOptions<'day'>, 'autoFocus'> {
26
+ export interface ExportedDateRangeCalendarProps<TDate> extends ExportedDayCalendarProps, BaseDateValidationProps<TDate>, DayRangeValidationProps<TDate>, TimezoneProps, Pick<ExportedUseViewsOptions<'day'>, 'autoFocus'> {
26
27
  /**
27
28
  * If `true`, after selecting `start` date calendar will not automatically switch to the month of `end` date.
28
29
  * @default false
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { MuiPickersAdapter } from '@mui/x-date-pickers/models';
2
+ import { MuiPickersAdapter, PickersTimezone } from '@mui/x-date-pickers/models';
3
3
  import { DateRangePosition } from './DateRangeCalendar.types';
4
4
  import { DateRange } from '../internal/models';
5
5
  interface UseDragRangeParams<TDate> {
@@ -11,6 +11,7 @@ interface UseDragRangeParams<TDate> {
11
11
  onDatePositionChange: (position: DateRangePosition) => void;
12
12
  onDrop: (newDate: TDate) => void;
13
13
  dateRange: DateRange<TDate>;
14
+ timezone: PickersTimezone;
14
15
  }
15
16
  interface UseDragRangeEvents {
16
17
  onDragStart?: React.DragEventHandler<HTMLButtonElement>;
@@ -28,5 +29,5 @@ interface UseDragRangeResponse<TDate> extends UseDragRangeEvents {
28
29
  rangeDragDay: TDate | null;
29
30
  draggingDatePosition: DateRangePosition | null;
30
31
  }
31
- export declare const useDragRange: <TDate>({ disableDragEditing, utils, onDatePositionChange, onDrop, dateRange, }: Omit<UseDragRangeParams<TDate>, "isDragging" | "setRangeDragDay" | "setIsDragging">) => UseDragRangeResponse<TDate>;
32
+ export declare const useDragRange: <TDate>({ disableDragEditing, utils, onDatePositionChange, onDrop, dateRange, timezone, }: Omit<UseDragRangeParams<TDate>, "isDragging" | "setRangeDragDay" | "setIsDragging">) => UseDragRangeResponse<TDate>;
32
33
  export {};
@@ -2,13 +2,13 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import { isEndOfRange, isStartOfRange } from '../internal/utils/date-utils';
5
- const resolveDateFromTarget = (target, utils) => {
5
+ const resolveDateFromTarget = (target, utils, timezone) => {
6
6
  const timestampString = target.dataset.timestamp;
7
7
  if (!timestampString) {
8
8
  return null;
9
9
  }
10
10
  const timestamp = +timestampString;
11
- return utils.date(new Date(timestamp));
11
+ return utils.dateWithTimezone(new Date(timestamp).toISOString(), timezone);
12
12
  };
13
13
  const isSameAsDraggingDate = event => {
14
14
  const timestampString = event.target.dataset.timestamp;
@@ -49,7 +49,8 @@ const useDragRangeEvents = ({
49
49
  onDatePositionChange,
50
50
  onDrop,
51
51
  disableDragEditing,
52
- dateRange
52
+ dateRange,
53
+ timezone
53
54
  }) => {
54
55
  const emptyDragImgRef = React.useRef(null);
55
56
  React.useEffect(() => {
@@ -67,7 +68,7 @@ const useDragRangeEvents = ({
67
68
  return shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
68
69
  };
69
70
  const handleDragStart = useEventCallback(event => {
70
- const newDate = resolveDateFromTarget(event.target, utils);
71
+ const newDate = resolveDateFromTarget(event.target, utils, timezone);
71
72
  if (!isElementDraggable(newDate)) {
72
73
  return;
73
74
  }
@@ -91,7 +92,7 @@ const useDragRangeEvents = ({
91
92
  if (!target) {
92
93
  return;
93
94
  }
94
- const newDate = resolveDateFromTarget(target, utils);
95
+ const newDate = resolveDateFromTarget(target, utils, timezone);
95
96
  if (!isElementDraggable(newDate)) {
96
97
  return;
97
98
  }
@@ -110,14 +111,14 @@ const useDragRangeEvents = ({
110
111
  event.preventDefault();
111
112
  event.stopPropagation();
112
113
  event.dataTransfer.dropEffect = 'move';
113
- setRangeDragDay(resolveDateFromTarget(event.target, utils));
114
+ setRangeDragDay(resolveDateFromTarget(event.target, utils, timezone));
114
115
  });
115
116
  const handleTouchMove = useEventCallback(event => {
116
117
  const target = resolveElementFromTouch(event);
117
118
  if (!isDragging || !target) {
118
119
  return;
119
120
  }
120
- const newDate = resolveDateFromTarget(target, utils);
121
+ const newDate = resolveDateFromTarget(target, utils, timezone);
121
122
  if (newDate) {
122
123
  setRangeDragDay(newDate);
123
124
  }
@@ -150,7 +151,7 @@ const useDragRangeEvents = ({
150
151
 
151
152
  // make sure the focused element is the element where touch ended
152
153
  target.focus();
153
- const newDate = resolveDateFromTarget(target, utils);
154
+ const newDate = resolveDateFromTarget(target, utils, timezone);
154
155
  if (newDate) {
155
156
  onDrop(newDate);
156
157
  }
@@ -177,7 +178,7 @@ const useDragRangeEvents = ({
177
178
  if (isSameAsDraggingDate(event)) {
178
179
  return;
179
180
  }
180
- const newDate = resolveDateFromTarget(event.target, utils);
181
+ const newDate = resolveDateFromTarget(event.target, utils, timezone);
181
182
  if (newDate) {
182
183
  onDrop(newDate);
183
184
  }
@@ -199,7 +200,8 @@ export const useDragRange = ({
199
200
  utils,
200
201
  onDatePositionChange,
201
202
  onDrop,
202
- dateRange
203
+ dateRange,
204
+ timezone
203
205
  }) => {
204
206
  const [isDragging, setIsDragging] = React.useState(false);
205
207
  const [rangeDragDay, setRangeDragDay] = React.useState(null);
@@ -228,7 +230,8 @@ export const useDragRange = ({
228
230
  isDragging,
229
231
  setRangeDragDay: handleRangeDragDayChange,
230
232
  disableDragEditing,
231
- dateRange
233
+ dateRange,
234
+ timezone
232
235
  });
233
236
  return React.useMemo(() => _extends({
234
237
  isDragging,
@@ -307,6 +307,14 @@ process.env.NODE_ENV !== "production" ? DateRangePicker.propTypes = {
307
307
  * The system prop that allows defining system overrides as well as additional CSS styles.
308
308
  */
309
309
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
310
+ /**
311
+ * Choose which timezone to use for the value.
312
+ * Example: "default", "system", "UTC", "America/New_York".
313
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
314
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
315
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
316
+ */
317
+ timezone: PropTypes.string,
310
318
  /**
311
319
  * The selected value.
312
320
  * Used when the component is controlled.
@@ -316,6 +316,14 @@ DesktopDateRangePicker.propTypes = {
316
316
  * The system prop that allows defining system overrides as well as additional CSS styles.
317
317
  */
318
318
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
319
+ /**
320
+ * Choose which timezone to use for the value.
321
+ * Example: "default", "system", "UTC", "America/New_York".
322
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
323
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
324
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
325
+ */
326
+ timezone: PropTypes.string,
319
327
  /**
320
328
  * The selected value.
321
329
  * Used when the component is controlled.
@@ -319,6 +319,14 @@ MobileDateRangePicker.propTypes = {
319
319
  * The system prop that allows defining system overrides as well as additional CSS styles.
320
320
  */
321
321
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
322
+ /**
323
+ * Choose which timezone to use for the value.
324
+ * Example: "default", "system", "UTC", "America/New_York".
325
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
326
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
327
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
328
+ */
329
+ timezone: PropTypes.string,
322
330
  /**
323
331
  * The selected value.
324
332
  * Used when the component is controlled.
@@ -301,6 +301,14 @@ process.env.NODE_ENV !== "production" ? MultiInputDateRangeField.propTypes = {
301
301
  * The system prop, which allows defining system overrides as well as additional CSS styles.
302
302
  */
303
303
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
304
+ /**
305
+ * Choose which timezone to use for the value.
306
+ * Example: "default", "system", "UTC", "America/New_York".
307
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
308
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
309
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
310
+ */
311
+ timezone: PropTypes.string,
304
312
  unstableEndFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
305
313
  unstableStartFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
306
314
  /**
@@ -350,6 +350,14 @@ process.env.NODE_ENV !== "production" ? MultiInputDateTimeRangeField.propTypes =
350
350
  * The system prop, which allows defining system overrides as well as additional CSS styles.
351
351
  */
352
352
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
353
+ /**
354
+ * Choose which timezone to use for the value.
355
+ * Example: "default", "system", "UTC", "America/New_York".
356
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
357
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
358
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
359
+ */
360
+ timezone: PropTypes.string,
353
361
  unstableEndFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
354
362
  unstableStartFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
355
363
  /**
@@ -67,4 +67,4 @@ export interface MultiInputDateTimeRangeFieldSlotsComponentsProps<TDate> {
67
67
  }>;
68
68
  separator?: SlotComponentProps<typeof Typography, {}, MultiInputDateTimeRangeFieldOwnerState<TDate>>;
69
69
  }
70
- export type UseMultiInputDateTimeRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseDateTimeRangeFieldDefaultizedProps<TDate> & AdditionalProps;
70
+ export type UseMultiInputDateTimeRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseDateTimeRangeFieldDefaultizedProps<TDate> & Omit<AdditionalProps, 'value' | 'defaultValue' | 'onChange'>;
@@ -326,6 +326,14 @@ process.env.NODE_ENV !== "production" ? MultiInputTimeRangeField.propTypes = {
326
326
  * The system prop, which allows defining system overrides as well as additional CSS styles.
327
327
  */
328
328
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
329
+ /**
330
+ * Choose which timezone to use for the value.
331
+ * Example: "default", "system", "UTC", "America/New_York".
332
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
333
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
334
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
335
+ */
336
+ timezone: PropTypes.string,
329
337
  unstableEndFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
330
338
  unstableStartFieldRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
331
339
  /**
@@ -67,4 +67,4 @@ export interface MultiInputTimeRangeFieldSlotsComponentsProps<TDate> {
67
67
  }>;
68
68
  separator?: SlotComponentProps<typeof Typography, {}, MultiInputTimeRangeFieldOwnerState<TDate>>;
69
69
  }
70
- export type UseMultiInputTimeRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseTimeRangeFieldDefaultizedProps<TDate> & AdditionalProps;
70
+ export type UseMultiInputTimeRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseTimeRangeFieldDefaultizedProps<TDate> & Omit<AdditionalProps, 'value' | 'defaultValue' | 'onChange'>;
@@ -296,6 +296,14 @@ process.env.NODE_ENV !== "production" ? SingleInputDateRangeField.propTypes = {
296
296
  * The system prop that allows defining system overrides as well as additional CSS styles.
297
297
  */
298
298
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
299
+ /**
300
+ * Choose which timezone to use for the value.
301
+ * Example: "default", "system", "UTC", "America/New_York".
302
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
303
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
304
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
305
+ */
306
+ timezone: PropTypes.string,
299
307
  /**
300
308
  * The ref object used to imperatively interact with the field.
301
309
  */
@@ -9,7 +9,7 @@ export interface UseSingleInputDateRangeFieldParams<TDate, TChildProps extends {
9
9
  }
10
10
  export interface UseSingleInputDateRangeFieldProps<TDate> extends UseDateRangeFieldProps<TDate> {
11
11
  }
12
- export type UseSingleInputDateRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseDateRangeFieldDefaultizedProps<TDate> & AdditionalProps;
12
+ export type UseSingleInputDateRangeFieldDefaultizedProps<TDate, AdditionalProps extends {}> = UseDateRangeFieldDefaultizedProps<TDate> & Omit<AdditionalProps, 'value' | 'defaultValue' | 'onChange'>;
13
13
  export type UseSingleInputDateRangeFieldComponentProps<TDate, TChildProps extends {}> = Omit<TChildProps, keyof UseSingleInputDateRangeFieldProps<TDate>> & UseSingleInputDateRangeFieldProps<TDate>;
14
14
  export type SingleInputDateRangeFieldProps<TDate, TChildProps extends {} = FieldsTextFieldProps> = UseSingleInputDateRangeFieldComponentProps<TDate, TChildProps> & {
15
15
  /**
@@ -345,6 +345,14 @@ process.env.NODE_ENV !== "production" ? SingleInputDateTimeRangeField.propTypes
345
345
  * The system prop that allows defining system overrides as well as additional CSS styles.
346
346
  */
347
347
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
348
+ /**
349
+ * Choose which timezone to use for the value.
350
+ * Example: "default", "system", "UTC", "America/New_York".
351
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
352
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
353
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
354
+ */
355
+ timezone: PropTypes.string,
348
356
  /**
349
357
  * The ref object used to imperatively interact with the field.
350
358
  */
@@ -321,6 +321,14 @@ process.env.NODE_ENV !== "production" ? SingleInputTimeRangeField.propTypes = {
321
321
  * The system prop that allows defining system overrides as well as additional CSS styles.
322
322
  */
323
323
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
324
+ /**
325
+ * Choose which timezone to use for the value.
326
+ * Example: "default", "system", "UTC", "America/New_York".
327
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
328
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
329
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
330
+ */
331
+ timezone: PropTypes.string,
324
332
  /**
325
333
  * The ref object used to imperatively interact with the field.
326
334
  */
@@ -253,6 +253,14 @@ StaticDateRangePicker.propTypes = {
253
253
  * The system prop that allows defining system overrides as well as additional CSS styles.
254
254
  */
255
255
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
256
+ /**
257
+ * Choose which timezone to use for the value.
258
+ * Example: "default", "system", "UTC", "America/New_York".
259
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
260
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
261
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
262
+ */
263
+ timezone: PropTypes.string,
256
264
  /**
257
265
  * The selected value.
258
266
  * Used when the component is controlled.
@@ -10,4 +10,4 @@ export interface DateRangeViewRendererProps<TDate, TView extends DateOrTimeViewW
10
10
  * We don't pass all the props down to `DateRangeCalendar`,
11
11
  * because otherwise some unwanted props would be passed to the HTML element.
12
12
  */
13
- export declare const renderDateRangeViewCalendar: <TDate extends unknown>({ value, defaultValue, onChange, className, classes, disableFuture, disablePast, minDate, maxDate, shouldDisableDate, reduceAnimations, onMonthChange, defaultCalendarMonth, rangePosition, defaultRangePosition, onRangePositionChange, calendars, currentMonthCalendarPosition, components, componentsProps, slots, slotProps, loading, renderLoading, disableHighlightToday, readOnly, disabled, showDaysOutsideCurrentMonth, dayOfWeekFormatter, disableAutoMonthSwitching, sx, autoFocus, fixedWeekNumber, disableDragEditing, displayWeekNumber, }: DateRangeViewRendererProps<TDate, any>) => React.JSX.Element;
13
+ export declare const renderDateRangeViewCalendar: <TDate extends unknown>({ value, defaultValue, onChange, className, classes, disableFuture, disablePast, minDate, maxDate, shouldDisableDate, reduceAnimations, onMonthChange, defaultCalendarMonth, rangePosition, defaultRangePosition, onRangePositionChange, calendars, currentMonthCalendarPosition, components, componentsProps, slots, slotProps, loading, renderLoading, disableHighlightToday, readOnly, disabled, showDaysOutsideCurrentMonth, dayOfWeekFormatter, disableAutoMonthSwitching, sx, autoFocus, fixedWeekNumber, disableDragEditing, displayWeekNumber, timezone, }: DateRangeViewRendererProps<TDate, any>) => React.JSX.Element;
@@ -40,7 +40,8 @@ export const renderDateRangeViewCalendar = ({
40
40
  autoFocus,
41
41
  fixedWeekNumber,
42
42
  disableDragEditing,
43
- displayWeekNumber
43
+ displayWeekNumber,
44
+ timezone
44
45
  }) => /*#__PURE__*/_jsx(DateRangeCalendar, {
45
46
  value: value,
46
47
  defaultValue: defaultValue,
@@ -76,5 +77,6 @@ export const renderDateRangeViewCalendar = ({
76
77
  autoFocus: autoFocus,
77
78
  fixedWeekNumber: fixedWeekNumber,
78
79
  disableDragEditing: disableDragEditing,
79
- displayWeekNumber: displayWeekNumber
80
+ displayWeekNumber: displayWeekNumber,
81
+ timezone: timezone
80
82
  });
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers-pro v6.8.0
2
+ * @mui/x-date-pickers-pro v6.9.0
3
3
  *
4
4
  * @license MUI X Commercial
5
5
  * This source code is licensed under the commercial license found in the
@@ -27,6 +27,7 @@ export const useDesktopRangePicker = _ref => {
27
27
  sx,
28
28
  format,
29
29
  formatDensity,
30
+ timezone,
30
31
  label,
31
32
  inputRef,
32
33
  readOnly,
@@ -79,6 +80,7 @@ export const useDesktopRangePicker = _ref => {
79
80
  sx,
80
81
  format,
81
82
  formatDensity,
83
+ timezone,
82
84
  autoFocus: autoFocus && !props.open,
83
85
  ref: fieldContainerRef
84
86
  }, fieldType === 'single-input' && {
@@ -28,6 +28,7 @@ export const useMobileRangePicker = _ref => {
28
28
  sx,
29
29
  format,
30
30
  formatDensity,
31
+ timezone,
31
32
  label,
32
33
  inputRef,
33
34
  readOnly,
@@ -68,7 +69,8 @@ export const useMobileRangePicker = _ref => {
68
69
  className,
69
70
  sx,
70
71
  format,
71
- formatDensity
72
+ formatDensity,
73
+ timezone
72
74
  }, fieldType === 'single-input' && {
73
75
  inputRef
74
76
  }),
@@ -1,9 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import * as React from 'react';
3
2
  import useEventCallback from '@mui/utils/useEventCallback';
4
3
  import { unstable_useDateField as useDateField } from '@mui/x-date-pickers/DateField';
5
- import { useLocalizationContext, useValidation } from '@mui/x-date-pickers/internals';
6
- import useControlled from '@mui/utils/useControlled';
4
+ import { useLocalizationContext, useValidation, useControlledValueWithTimezone } from '@mui/x-date-pickers/internals';
7
5
  import { useDefaultizedDateRangeFieldProps } from '../../../SingleInputDateRangeField/useSingleInputDateRangeField';
8
6
  import { validateDateRange } from '../../utils/validation/validateDateRange';
9
7
  import { rangeValueManager } from '../../utils/valueManagers';
@@ -16,7 +14,6 @@ export const useMultiInputDateRangeField = ({
16
14
  endInputRef,
17
15
  unstableEndFieldRef
18
16
  }) => {
19
- var _firstDefaultValue$cu;
20
17
  const sharedProps = useDefaultizedDateRangeFieldProps(inSharedProps);
21
18
  const adapter = useLocalizationContext();
22
19
  const {
@@ -29,35 +26,43 @@ export const useMultiInputDateRangeField = ({
29
26
  disabled,
30
27
  readOnly,
31
28
  selectedSections,
32
- onSelectedSectionsChange
29
+ onSelectedSectionsChange,
30
+ timezone: timezoneProp
33
31
  } = sharedProps;
34
- const firstDefaultValue = React.useRef(defaultValue);
35
- const [value, setValue] = useControlled({
32
+ const {
33
+ value,
34
+ handleValueChange,
35
+ timezone
36
+ } = useControlledValueWithTimezone({
36
37
  name: 'useMultiInputDateRangeField',
37
- state: 'value',
38
- controlled: valueProp,
39
- default: (_firstDefaultValue$cu = firstDefaultValue.current) != null ? _firstDefaultValue$cu : rangeValueManager.emptyValue
38
+ timezone: timezoneProp,
39
+ value: valueProp,
40
+ defaultValue,
41
+ onChange,
42
+ valueManager: rangeValueManager
40
43
  });
41
44
 
42
45
  // TODO: Maybe export utility from `useField` instead of copy/pasting the logic
43
46
  const buildChangeHandler = index => {
44
47
  return (newDate, rawContext) => {
45
48
  const newDateRange = index === 0 ? [newDate, value[1]] : [value[0], newDate];
46
- setValue(newDateRange);
47
49
  const context = _extends({}, rawContext, {
48
50
  validationError: validateDateRange({
49
51
  adapter,
50
52
  value: newDateRange,
51
- props: sharedProps
53
+ props: _extends({}, sharedProps, {
54
+ timezone
55
+ })
52
56
  })
53
57
  });
54
- onChange == null ? void 0 : onChange(newDateRange, context);
58
+ handleValueChange(newDateRange, context);
55
59
  };
56
60
  };
57
61
  const handleStartDateChange = useEventCallback(buildChangeHandler(0));
58
62
  const handleEndDateChange = useEventCallback(buildChangeHandler(1));
59
63
  const validationError = useValidation(_extends({}, sharedProps, {
60
- value
64
+ value,
65
+ timezone
61
66
  }), validateDateRange, rangeValueManager.isSameError, rangeValueManager.defaultErrorState);
62
67
  const startFieldProps = _extends({
63
68
  error: !!validationError[0]
@@ -67,6 +72,7 @@ export const useMultiInputDateRangeField = ({
67
72
  format,
68
73
  formatDensity,
69
74
  shouldRespectLeadingZeros,
75
+ timezone,
70
76
  unstableFieldRef: unstableStartFieldRef,
71
77
  value: valueProp === undefined ? undefined : valueProp[0],
72
78
  defaultValue: defaultValue === undefined ? undefined : defaultValue[0],
@@ -82,6 +88,7 @@ export const useMultiInputDateRangeField = ({
82
88
  shouldRespectLeadingZeros,
83
89
  disabled,
84
90
  readOnly,
91
+ timezone,
85
92
  unstableFieldRef: unstableEndFieldRef,
86
93
  value: valueProp === undefined ? undefined : valueProp[1],
87
94
  defaultValue: defaultValue === undefined ? undefined : defaultValue[1],