@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
@@ -252,6 +252,14 @@ StaticDateRangePicker.propTypes = {
252
252
  * The system prop that allows defining system overrides as well as additional CSS styles.
253
253
  */
254
254
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
255
+ /**
256
+ * Choose which timezone to use for the value.
257
+ * Example: "default", "system", "UTC", "America/New_York".
258
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
259
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
260
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
261
+ */
262
+ timezone: PropTypes.string,
255
263
  /**
256
264
  * The selected value.
257
265
  * Used when the component is controlled.
@@ -40,7 +40,8 @@ export var renderDateRangeViewCalendar = function renderDateRangeViewCalendar(_r
40
40
  autoFocus = _ref.autoFocus,
41
41
  fixedWeekNumber = _ref.fixedWeekNumber,
42
42
  disableDragEditing = _ref.disableDragEditing,
43
- displayWeekNumber = _ref.displayWeekNumber;
43
+ displayWeekNumber = _ref.displayWeekNumber,
44
+ timezone = _ref.timezone;
44
45
  return /*#__PURE__*/_jsx(DateRangeCalendar, {
45
46
  value: value,
46
47
  defaultValue: defaultValue,
@@ -76,6 +77,7 @@ export var renderDateRangeViewCalendar = function renderDateRangeViewCalendar(_r
76
77
  autoFocus: autoFocus,
77
78
  fixedWeekNumber: fixedWeekNumber,
78
79
  disableDragEditing: disableDragEditing,
79
- displayWeekNumber: displayWeekNumber
80
+ displayWeekNumber: displayWeekNumber,
81
+ timezone: timezone
80
82
  });
81
83
  };
package/legacy/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
@@ -24,6 +24,7 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
24
24
  sx = props.sx,
25
25
  format = props.format,
26
26
  formatDensity = props.formatDensity,
27
+ timezone = props.timezone,
27
28
  label = props.label,
28
29
  inputRef = props.inputRef,
29
30
  readOnly = props.readOnly,
@@ -73,6 +74,7 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
73
74
  sx: sx,
74
75
  format: format,
75
76
  formatDensity: formatDensity,
77
+ timezone: timezone,
76
78
  autoFocus: autoFocus && !props.open,
77
79
  ref: fieldContainerRef
78
80
  }, fieldType === 'single-input' && {
@@ -25,6 +25,7 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
25
25
  sx = props.sx,
26
26
  format = props.format,
27
27
  formatDensity = props.formatDensity,
28
+ timezone = props.timezone,
28
29
  label = props.label,
29
30
  inputRef = props.inputRef,
30
31
  readOnly = props.readOnly,
@@ -62,7 +63,8 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
62
63
  className: className,
63
64
  sx: sx,
64
65
  format: format,
65
- formatDensity: formatDensity
66
+ formatDensity: formatDensity,
67
+ timezone: timezone
66
68
  }, fieldType === 'single-input' && {
67
69
  inputRef: inputRef
68
70
  }),
@@ -1,15 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
- import * as React from 'react';
4
2
  import useEventCallback from '@mui/utils/useEventCallback';
5
3
  import { unstable_useDateField as useDateField } from '@mui/x-date-pickers/DateField';
6
- import { useLocalizationContext, useValidation } from '@mui/x-date-pickers/internals';
7
- import useControlled from '@mui/utils/useControlled';
4
+ import { useLocalizationContext, useValidation, useControlledValueWithTimezone } from '@mui/x-date-pickers/internals';
8
5
  import { useDefaultizedDateRangeFieldProps } from '../../../SingleInputDateRangeField/useSingleInputDateRangeField';
9
6
  import { validateDateRange } from '../../utils/validation/validateDateRange';
10
7
  import { rangeValueManager } from '../../utils/valueManagers';
11
8
  export var useMultiInputDateRangeField = function useMultiInputDateRangeField(_ref) {
12
- var _firstDefaultValue$cu;
13
9
  var inSharedProps = _ref.sharedProps,
14
10
  startTextFieldProps = _ref.startTextFieldProps,
15
11
  startInputRef = _ref.startInputRef,
@@ -28,37 +24,41 @@ export var useMultiInputDateRangeField = function useMultiInputDateRangeField(_r
28
24
  disabled = sharedProps.disabled,
29
25
  readOnly = sharedProps.readOnly,
30
26
  selectedSections = sharedProps.selectedSections,
31
- onSelectedSectionsChange = sharedProps.onSelectedSectionsChange;
32
- var firstDefaultValue = React.useRef(defaultValue);
33
- var _useControlled = useControlled({
27
+ onSelectedSectionsChange = sharedProps.onSelectedSectionsChange,
28
+ timezoneProp = sharedProps.timezone;
29
+ var _useControlledValueWi = useControlledValueWithTimezone({
34
30
  name: 'useMultiInputDateRangeField',
35
- state: 'value',
36
- controlled: valueProp,
37
- default: (_firstDefaultValue$cu = firstDefaultValue.current) != null ? _firstDefaultValue$cu : rangeValueManager.emptyValue
31
+ timezone: timezoneProp,
32
+ value: valueProp,
33
+ defaultValue: defaultValue,
34
+ onChange: onChange,
35
+ valueManager: rangeValueManager
38
36
  }),
39
- _useControlled2 = _slicedToArray(_useControlled, 2),
40
- value = _useControlled2[0],
41
- setValue = _useControlled2[1];
37
+ value = _useControlledValueWi.value,
38
+ handleValueChange = _useControlledValueWi.handleValueChange,
39
+ timezone = _useControlledValueWi.timezone;
42
40
 
43
41
  // TODO: Maybe export utility from `useField` instead of copy/pasting the logic
44
42
  var buildChangeHandler = function buildChangeHandler(index) {
45
43
  return function (newDate, rawContext) {
46
44
  var newDateRange = index === 0 ? [newDate, value[1]] : [value[0], newDate];
47
- setValue(newDateRange);
48
45
  var context = _extends({}, rawContext, {
49
46
  validationError: validateDateRange({
50
47
  adapter: adapter,
51
48
  value: newDateRange,
52
- props: sharedProps
49
+ props: _extends({}, sharedProps, {
50
+ timezone: timezone
51
+ })
53
52
  })
54
53
  });
55
- onChange == null ? void 0 : onChange(newDateRange, context);
54
+ handleValueChange(newDateRange, context);
56
55
  };
57
56
  };
58
57
  var handleStartDateChange = useEventCallback(buildChangeHandler(0));
59
58
  var handleEndDateChange = useEventCallback(buildChangeHandler(1));
60
59
  var validationError = useValidation(_extends({}, sharedProps, {
61
- value: value
60
+ value: value,
61
+ timezone: timezone
62
62
  }), validateDateRange, rangeValueManager.isSameError, rangeValueManager.defaultErrorState);
63
63
  var startFieldProps = _extends({
64
64
  error: !!validationError[0]
@@ -68,6 +68,7 @@ export var useMultiInputDateRangeField = function useMultiInputDateRangeField(_r
68
68
  format: format,
69
69
  formatDensity: formatDensity,
70
70
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
71
+ timezone: timezone,
71
72
  unstableFieldRef: unstableStartFieldRef,
72
73
  value: valueProp === undefined ? undefined : valueProp[0],
73
74
  defaultValue: defaultValue === undefined ? undefined : defaultValue[0],
@@ -83,6 +84,7 @@ export var useMultiInputDateRangeField = function useMultiInputDateRangeField(_r
83
84
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
84
85
  disabled: disabled,
85
86
  readOnly: readOnly,
87
+ timezone: timezone,
86
88
  unstableFieldRef: unstableEndFieldRef,
87
89
  value: valueProp === undefined ? undefined : valueProp[1],
88
90
  defaultValue: defaultValue === undefined ? undefined : defaultValue[1],
@@ -1,10 +1,7 @@
1
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
1
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- import * as React from 'react';
4
2
  import useEventCallback from '@mui/utils/useEventCallback';
5
3
  import { unstable_useDateTimeField as useDateTimeField } from '@mui/x-date-pickers/DateTimeField';
6
- import { applyDefaultDate, useDefaultDates, useLocalizationContext, useUtils, useValidation } from '@mui/x-date-pickers/internals';
7
- import useControlled from '@mui/utils/useControlled';
4
+ import { applyDefaultDate, useDefaultDates, useLocalizationContext, useUtils, useValidation, useControlledValueWithTimezone } from '@mui/x-date-pickers/internals';
8
5
  import { validateDateTimeRange } from '../../utils/validation/validateDateTimeRange';
9
6
  import { rangeValueManager } from '../../utils/valueManagers';
10
7
  export var useDefaultizedDateTimeRangeFieldProps = function useDefaultizedDateTimeRangeFieldProps(props) {
@@ -25,7 +22,6 @@ export var useDefaultizedDateTimeRangeFieldProps = function useDefaultizedDateTi
25
22
  });
26
23
  };
27
24
  export var useMultiInputDateTimeRangeField = function useMultiInputDateTimeRangeField(_ref) {
28
- var _firstDefaultValue$cu;
29
25
  var inSharedProps = _ref.sharedProps,
30
26
  startTextFieldProps = _ref.startTextFieldProps,
31
27
  startInputRef = _ref.startInputRef,
@@ -39,39 +35,43 @@ export var useMultiInputDateTimeRangeField = function useMultiInputDateTimeRange
39
35
  defaultValue = sharedProps.defaultValue,
40
36
  format = sharedProps.format,
41
37
  shouldRespectLeadingZeros = sharedProps.shouldRespectLeadingZeros,
38
+ timezoneProp = sharedProps.timezone,
42
39
  onChange = sharedProps.onChange,
43
40
  disabled = sharedProps.disabled,
44
41
  readOnly = sharedProps.readOnly;
45
- var firstDefaultValue = React.useRef(defaultValue);
46
- var _useControlled = useControlled({
47
- name: 'useMultiInputDateTimeRangeField',
48
- state: 'value',
49
- controlled: valueProp,
50
- default: (_firstDefaultValue$cu = firstDefaultValue.current) != null ? _firstDefaultValue$cu : rangeValueManager.emptyValue
42
+ var _useControlledValueWi = useControlledValueWithTimezone({
43
+ name: 'useMultiInputDateRangeField',
44
+ timezone: timezoneProp,
45
+ value: valueProp,
46
+ defaultValue: defaultValue,
47
+ onChange: onChange,
48
+ valueManager: rangeValueManager
51
49
  }),
52
- _useControlled2 = _slicedToArray(_useControlled, 2),
53
- value = _useControlled2[0],
54
- setValue = _useControlled2[1];
50
+ value = _useControlledValueWi.value,
51
+ handleValueChange = _useControlledValueWi.handleValueChange,
52
+ timezone = _useControlledValueWi.timezone;
55
53
 
56
54
  // TODO: Maybe export utility from `useField` instead of copy/pasting the logic
57
55
  var buildChangeHandler = function buildChangeHandler(index) {
58
56
  return function (newDate, rawContext) {
59
57
  var newDateRange = index === 0 ? [newDate, value[1]] : [value[0], newDate];
60
- setValue(newDateRange);
61
58
  var context = _extends({}, rawContext, {
62
59
  validationError: validateDateTimeRange({
63
60
  adapter: adapter,
64
61
  value: newDateRange,
65
- props: sharedProps
62
+ props: _extends({}, sharedProps, {
63
+ timezone: timezone
64
+ })
66
65
  })
67
66
  });
68
- onChange == null ? void 0 : onChange(newDateRange, context);
67
+ handleValueChange(newDateRange, context);
69
68
  };
70
69
  };
71
70
  var handleStartDateChange = useEventCallback(buildChangeHandler(0));
72
71
  var handleEndDateChange = useEventCallback(buildChangeHandler(1));
73
72
  var validationError = useValidation(_extends({}, sharedProps, {
74
- value: value
73
+ value: value,
74
+ timezone: timezone
75
75
  }), validateDateTimeRange, rangeValueManager.isSameError, rangeValueManager.defaultErrorState);
76
76
  var startFieldProps = _extends({
77
77
  error: !!validationError[0]
@@ -80,6 +80,7 @@ export var useMultiInputDateTimeRangeField = function useMultiInputDateTimeRange
80
80
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
81
81
  disabled: disabled,
82
82
  readOnly: readOnly,
83
+ timezone: timezone,
83
84
  unstableFieldRef: unstableStartFieldRef,
84
85
  value: valueProp === undefined ? undefined : valueProp[0],
85
86
  defaultValue: defaultValue === undefined ? undefined : defaultValue[0],
@@ -92,6 +93,7 @@ export var useMultiInputDateTimeRangeField = function useMultiInputDateTimeRange
92
93
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
93
94
  disabled: disabled,
94
95
  readOnly: readOnly,
96
+ timezone: timezone,
95
97
  unstableFieldRef: unstableEndFieldRef,
96
98
  value: valueProp === undefined ? undefined : valueProp[1],
97
99
  defaultValue: defaultValue === undefined ? undefined : defaultValue[1],
@@ -1,10 +1,7 @@
1
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
1
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- import * as React from 'react';
4
2
  import useEventCallback from '@mui/utils/useEventCallback';
5
3
  import { unstable_useTimeField as useTimeField } from '@mui/x-date-pickers/TimeField';
6
- import { useLocalizationContext, useUtils, useValidation } from '@mui/x-date-pickers/internals';
7
- import useControlled from '@mui/utils/useControlled';
4
+ import { useLocalizationContext, useUtils, useValidation, useControlledValueWithTimezone } from '@mui/x-date-pickers/internals';
8
5
  import { validateTimeRange } from '../../utils/validation/validateTimeRange';
9
6
  import { rangeValueManager } from '../../utils/valueManagers';
10
7
  export var useDefaultizedTimeRangeFieldProps = function useDefaultizedTimeRangeFieldProps(props) {
@@ -19,7 +16,6 @@ export var useDefaultizedTimeRangeFieldProps = function useDefaultizedTimeRangeF
19
16
  });
20
17
  };
21
18
  export var useMultiInputTimeRangeField = function useMultiInputTimeRangeField(_ref) {
22
- var _firstDefaultValue$cu;
23
19
  var inSharedProps = _ref.sharedProps,
24
20
  startTextFieldProps = _ref.startTextFieldProps,
25
21
  startInputRef = _ref.startInputRef,
@@ -33,39 +29,43 @@ export var useMultiInputTimeRangeField = function useMultiInputTimeRangeField(_r
33
29
  defaultValue = sharedProps.defaultValue,
34
30
  format = sharedProps.format,
35
31
  shouldRespectLeadingZeros = sharedProps.shouldRespectLeadingZeros,
32
+ timezoneProp = sharedProps.timezone,
36
33
  onChange = sharedProps.onChange,
37
34
  disabled = sharedProps.disabled,
38
35
  readOnly = sharedProps.readOnly;
39
- var firstDefaultValue = React.useRef(defaultValue);
40
- var _useControlled = useControlled({
41
- name: 'useMultiInputTimeRangeField',
42
- state: 'value',
43
- controlled: valueProp,
44
- default: (_firstDefaultValue$cu = firstDefaultValue.current) != null ? _firstDefaultValue$cu : rangeValueManager.emptyValue
36
+ var _useControlledValueWi = useControlledValueWithTimezone({
37
+ name: 'useMultiInputDateRangeField',
38
+ timezone: timezoneProp,
39
+ value: valueProp,
40
+ defaultValue: defaultValue,
41
+ onChange: onChange,
42
+ valueManager: rangeValueManager
45
43
  }),
46
- _useControlled2 = _slicedToArray(_useControlled, 2),
47
- value = _useControlled2[0],
48
- setValue = _useControlled2[1];
44
+ value = _useControlledValueWi.value,
45
+ handleValueChange = _useControlledValueWi.handleValueChange,
46
+ timezone = _useControlledValueWi.timezone;
49
47
 
50
48
  // TODO: Maybe export utility from `useField` instead of copy/pasting the logic
51
49
  var buildChangeHandler = function buildChangeHandler(index) {
52
50
  return function (newDate, rawContext) {
53
51
  var newDateRange = index === 0 ? [newDate, value[1]] : [value[0], newDate];
54
- setValue(newDateRange);
55
52
  var context = _extends({}, rawContext, {
56
53
  validationError: validateTimeRange({
57
54
  adapter: adapter,
58
55
  value: newDateRange,
59
- props: sharedProps
56
+ props: _extends({}, sharedProps, {
57
+ timezone: timezone
58
+ })
60
59
  })
61
60
  });
62
- onChange == null ? void 0 : onChange(newDateRange, context);
61
+ handleValueChange(newDateRange, context);
63
62
  };
64
63
  };
65
64
  var handleStartDateChange = useEventCallback(buildChangeHandler(0));
66
65
  var handleEndDateChange = useEventCallback(buildChangeHandler(1));
67
66
  var validationError = useValidation(_extends({}, sharedProps, {
68
- value: value
67
+ value: value,
68
+ timezone: timezone
69
69
  }), validateTimeRange, rangeValueManager.isSameError, rangeValueManager.defaultErrorState);
70
70
  var startFieldProps = _extends({
71
71
  error: !!validationError[0]
@@ -74,6 +74,7 @@ export var useMultiInputTimeRangeField = function useMultiInputTimeRangeField(_r
74
74
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
75
75
  disabled: disabled,
76
76
  readOnly: readOnly,
77
+ timezone: timezone,
77
78
  unstableFieldRef: unstableStartFieldRef,
78
79
  value: valueProp === undefined ? undefined : valueProp[0],
79
80
  defaultValue: defaultValue === undefined ? undefined : defaultValue[0],
@@ -86,6 +87,7 @@ export var useMultiInputTimeRangeField = function useMultiInputTimeRangeField(_r
86
87
  shouldRespectLeadingZeros: shouldRespectLeadingZeros,
87
88
  disabled: disabled,
88
89
  readOnly: readOnly,
90
+ timezone: timezone,
89
91
  unstableFieldRef: unstableEndFieldRef,
90
92
  value: valueProp === undefined ? undefined : valueProp[1],
91
93
  defaultValue: defaultValue === undefined ? undefined : defaultValue[1],
@@ -1,6 +1,6 @@
1
1
  import { ponyfillGlobal } from '@mui/utils';
2
2
  export var getReleaseInfo = function getReleaseInfo() {
3
- var releaseInfo = "MTY4Njg2MjgwMDAwMA==";
3
+ var releaseInfo = "MTY4NzM4MTIwMDAwMA==";
4
4
  if (process.env.NODE_ENV !== 'production') {
5
5
  // A simple hack to set the value in the test environment (has no build step).
6
6
  // eslint-disable-next-line no-useless-concat
@@ -7,8 +7,8 @@ import { replaceInvalidDateByNull, addPositionPropertiesToSections, createDateSt
7
7
  import { splitDateRangeSections, removeLastSeparator } from './date-fields-utils';
8
8
  export var rangeValueManager = {
9
9
  emptyValue: [null, null],
10
- getTodayValue: function getTodayValue(utils, valueType) {
11
- return [getTodayDate(utils, valueType), getTodayDate(utils, valueType)];
10
+ getTodayValue: function getTodayValue(utils, timezone, valueType) {
11
+ return [getTodayDate(utils, timezone, valueType), getTodayDate(utils, timezone, valueType)];
12
12
  },
13
13
  getInitialReferenceValue: function getInitialReferenceValue(_ref) {
14
14
  var value = _ref.value,
@@ -44,6 +44,9 @@ export var rangeValueManager = {
44
44
  throw new Error('MUI: The timezone of the start and the end date should be the same');
45
45
  }
46
46
  return timezoneStart != null ? timezoneStart : timezoneEnd;
47
+ },
48
+ setTimezone: function setTimezone(utils, timezone, value) {
49
+ return [value[0] == null ? null : utils.setTimezone(value[0], timezone), value[1] == null ? null : utils.setTimezone(value[1], timezone)];
47
50
  }
48
51
  };
49
52
  export var rangeFieldValueManager = {
@@ -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)({
@@ -108,9 +107,6 @@ const useUtilityClasses = ownerState => {
108
107
  return composeClasses(slots, getDateRangeCalendarUtilityClass, classes);
109
108
  };
110
109
  const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalendar(inProps, ref) {
111
- const utils = useUtils();
112
- const localeText = useLocaleText();
113
- const now = useNow();
114
110
  const props = useDateRangeCalendarDefaultizedProps(inProps, 'MuiDateRangeCalendar');
115
111
  const shouldHavePreview = useMediaQuery(DEFAULT_DESKTOP_MODE_MEDIA_QUERY, {
116
112
  defaultMatches: false
@@ -148,17 +144,27 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
148
144
  autoFocus,
149
145
  fixedWeekNumber,
150
146
  disableDragEditing,
151
- displayWeekNumber
147
+ displayWeekNumber,
148
+ timezone: timezoneProp
152
149
  } = props,
153
150
  other = _objectWithoutPropertiesLoose(props, _excluded);
154
- const slots = innerSlots ?? uncapitalizeObjectKeys(components);
155
- const slotProps = innerSlotProps ?? componentsProps;
156
- const [value, setValue] = useControlled({
157
- controlled: valueProp,
158
- default: defaultValue ?? rangeValueManager.emptyValue,
151
+ const {
152
+ value,
153
+ handleValueChange,
154
+ timezone
155
+ } = useControlledValueWithTimezone({
159
156
  name: 'DateRangeCalendar',
160
- state: 'value'
157
+ timezone: timezoneProp,
158
+ value: valueProp,
159
+ defaultValue,
160
+ onChange,
161
+ valueManager: rangeValueManager
161
162
  });
163
+ const utils = useUtils();
164
+ const localeText = useLocaleText();
165
+ const now = useNow(timezone);
166
+ const slots = innerSlots ?? uncapitalizeObjectKeys(components);
167
+ const slotProps = innerSlotProps ?? componentsProps;
162
168
  const {
163
169
  rangePosition,
164
170
  onRangePositionChange
@@ -185,8 +191,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
185
191
  });
186
192
  onRangePositionChange(nextSelection);
187
193
  const isFullRangeSelected = rangePosition === 'end' && isRangeValid(utils, newRange);
188
- setValue(newRange);
189
- onChange?.(newRange, isFullRangeSelected ? 'finish' : 'partial');
194
+ handleValueChange(newRange, isFullRangeSelected ? 'finish' : 'partial');
190
195
  });
191
196
  const handleDrop = useEventCallback(newDate => {
192
197
  handleSelectedDayChange(newDate, undefined, true);
@@ -201,7 +206,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
201
206
  onDrop: handleDrop,
202
207
  onDatePositionChange: handleDatePositionChange,
203
208
  utils,
204
- dateRange: valueDayRange
209
+ dateRange: valueDayRange,
210
+ timezone
205
211
  }),
206
212
  {
207
213
  isDragging,
@@ -248,7 +254,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
248
254
  minDate,
249
255
  onMonthChange,
250
256
  reduceAnimations,
251
- shouldDisableDate: wrappedShouldDisableDate
257
+ shouldDisableDate: wrappedShouldDisableDate,
258
+ timezone
252
259
  });
253
260
  const prevValue = React.useRef(null);
254
261
  React.useEffect(() => {
@@ -283,11 +290,13 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
283
290
  }, [changeMonth, calendarState.currentMonth, utils]);
284
291
  const isNextMonthDisabled = useNextMonthDisabled(calendarState.currentMonth, {
285
292
  disableFuture,
286
- maxDate
293
+ maxDate,
294
+ timezone
287
295
  });
288
296
  const isPreviousMonthDisabled = usePreviousMonthDisabled(calendarState.currentMonth, {
289
297
  disablePast,
290
- minDate
298
+ minDate,
299
+ timezone
291
300
  });
292
301
  const baseDateValidationProps = {
293
302
  disablePast,
@@ -415,7 +424,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
415
424
  disableFuture: disableFuture,
416
425
  reduceAnimations: reduceAnimations,
417
426
  slots: slots,
418
- slotProps: slotProps
427
+ slotProps: slotProps,
428
+ timezone: timezone
419
429
  }) : /*#__PURE__*/_jsx(DateRangeCalendarArrowSwitcher, {
420
430
  onGoToPrevious: selectPreviousMonth,
421
431
  onGoToNext: selectNextMonth,
@@ -447,7 +457,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
447
457
  slotProps: slotPropsForDayCalendar,
448
458
  autoFocus: month === focusedMonth,
449
459
  fixedWeekNumber: fixedWeekNumber,
450
- displayWeekNumber: displayWeekNumber
460
+ displayWeekNumber: displayWeekNumber,
461
+ timezone: timezone
451
462
  }), index)]
452
463
  }, month))]
453
464
  }));
@@ -636,6 +647,14 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
636
647
  * The system prop that allows defining system overrides as well as additional CSS styles.
637
648
  */
638
649
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
650
+ /**
651
+ * Choose which timezone to use for the value.
652
+ * Example: "default", "system", "UTC", "America/New_York".
653
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
654
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
655
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
656
+ */
657
+ timezone: PropTypes.string,
639
658
  /**
640
659
  * The selected value.
641
660
  * Used when the component is controlled.
@@ -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;
@@ -48,7 +48,8 @@ const useDragRangeEvents = ({
48
48
  onDatePositionChange,
49
49
  onDrop,
50
50
  disableDragEditing,
51
- dateRange
51
+ dateRange,
52
+ timezone
52
53
  }) => {
53
54
  const emptyDragImgRef = React.useRef(null);
54
55
  React.useEffect(() => {
@@ -66,7 +67,7 @@ const useDragRangeEvents = ({
66
67
  return shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
67
68
  };
68
69
  const handleDragStart = useEventCallback(event => {
69
- const newDate = resolveDateFromTarget(event.target, utils);
70
+ const newDate = resolveDateFromTarget(event.target, utils, timezone);
70
71
  if (!isElementDraggable(newDate)) {
71
72
  return;
72
73
  }
@@ -90,7 +91,7 @@ const useDragRangeEvents = ({
90
91
  if (!target) {
91
92
  return;
92
93
  }
93
- const newDate = resolveDateFromTarget(target, utils);
94
+ const newDate = resolveDateFromTarget(target, utils, timezone);
94
95
  if (!isElementDraggable(newDate)) {
95
96
  return;
96
97
  }
@@ -109,14 +110,14 @@ const useDragRangeEvents = ({
109
110
  event.preventDefault();
110
111
  event.stopPropagation();
111
112
  event.dataTransfer.dropEffect = 'move';
112
- setRangeDragDay(resolveDateFromTarget(event.target, utils));
113
+ setRangeDragDay(resolveDateFromTarget(event.target, utils, timezone));
113
114
  });
114
115
  const handleTouchMove = useEventCallback(event => {
115
116
  const target = resolveElementFromTouch(event);
116
117
  if (!isDragging || !target) {
117
118
  return;
118
119
  }
119
- const newDate = resolveDateFromTarget(target, utils);
120
+ const newDate = resolveDateFromTarget(target, utils, timezone);
120
121
  if (newDate) {
121
122
  setRangeDragDay(newDate);
122
123
  }
@@ -149,7 +150,7 @@ const useDragRangeEvents = ({
149
150
 
150
151
  // make sure the focused element is the element where touch ended
151
152
  target.focus();
152
- const newDate = resolveDateFromTarget(target, utils);
153
+ const newDate = resolveDateFromTarget(target, utils, timezone);
153
154
  if (newDate) {
154
155
  onDrop(newDate);
155
156
  }
@@ -176,7 +177,7 @@ const useDragRangeEvents = ({
176
177
  if (isSameAsDraggingDate(event)) {
177
178
  return;
178
179
  }
179
- const newDate = resolveDateFromTarget(event.target, utils);
180
+ const newDate = resolveDateFromTarget(event.target, utils, timezone);
180
181
  if (newDate) {
181
182
  onDrop(newDate);
182
183
  }
@@ -198,7 +199,8 @@ export const useDragRange = ({
198
199
  utils,
199
200
  onDatePositionChange,
200
201
  onDrop,
201
- dateRange
202
+ dateRange,
203
+ timezone
202
204
  }) => {
203
205
  const [isDragging, setIsDragging] = React.useState(false);
204
206
  const [rangeDragDay, setRangeDragDay] = React.useState(null);
@@ -227,7 +229,8 @@ export const useDragRange = ({
227
229
  isDragging,
228
230
  setRangeDragDay: handleRangeDragDayChange,
229
231
  disableDragEditing,
230
- dateRange
232
+ dateRange,
233
+ timezone
231
234
  });
232
235
  return React.useMemo(() => _extends({
233
236
  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.