@mui/x-date-pickers-pro 6.0.3 → 6.0.4

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 (94) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/DateRangePicker/DateRangePicker.js +12 -0
  3. package/DateRangePicker/DateRangePickerToolbar.d.ts +1 -1
  4. package/DateRangePicker/shared.d.ts +1 -1
  5. package/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  6. package/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  7. package/MultiInputDateRangeField/MultiInputDateRangeField.types.d.ts +1 -1
  8. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.d.ts +1 -1
  9. package/MultiInputTimeRangeField/MultiInputTimeRangeField.types.d.ts +1 -1
  10. package/SingleInputDateRangeField/SingleInputDateRangeField.d.ts +1 -0
  11. package/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -0
  12. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.d.ts +1 -0
  13. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +1 -0
  14. package/SingleInputTimeRangeField/SingleInputTimeRangeField.d.ts +1 -0
  15. package/SingleInputTimeRangeField/SingleInputTimeRangeField.js +1 -0
  16. package/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +1 -1
  17. package/index.js +1 -1
  18. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.d.ts +1 -1
  19. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +32 -40
  20. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +9 -29
  21. package/internal/hooks/useEnrichedRangePickerFieldProps.d.ts +53 -0
  22. package/internal/hooks/useEnrichedRangePickerFieldProps.js +202 -0
  23. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.d.ts +1 -1
  24. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +36 -39
  25. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +9 -28
  26. package/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.d.ts +1 -1
  27. package/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.d.ts +1 -1
  28. package/internal/hooks/useMultiInputRangeField/useMultiInputRangeField.types.d.ts +3 -3
  29. package/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.d.ts +1 -1
  30. package/internal/hooks/useRangePosition.d.ts +4 -0
  31. package/internal/hooks/useRangePosition.js +16 -1
  32. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.d.ts +1 -1
  33. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.d.ts +3 -2
  34. package/internal/hooks/validation/useDateRangeValidation.d.ts +2 -1
  35. package/internal/hooks/validation/useDateTimeRangeValidation.d.ts +2 -1
  36. package/internal/hooks/validation/useTimeRangeValidation.d.ts +2 -1
  37. package/internal/models/fields.d.ts +7 -2
  38. package/internal/models/index.d.ts +1 -0
  39. package/internal/models/index.js +2 -1
  40. package/internal/models/rangePickerProps.d.ts +17 -0
  41. package/internal/models/rangePickerProps.js +1 -0
  42. package/internal/utils/releaseInfo.js +1 -1
  43. package/internal/utils/valueManagers.js +21 -19
  44. package/legacy/DateRangePicker/DateRangePicker.js +12 -0
  45. package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  46. package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  47. package/legacy/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -0
  48. package/legacy/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +1 -0
  49. package/legacy/SingleInputTimeRangeField/SingleInputTimeRangeField.js +1 -0
  50. package/legacy/index.js +1 -1
  51. package/legacy/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +32 -40
  52. package/legacy/internal/hooks/useEnrichedRangePickerFieldProps.js +200 -0
  53. package/legacy/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +36 -39
  54. package/legacy/internal/hooks/useRangePosition.js +16 -1
  55. package/legacy/internal/models/index.js +2 -1
  56. package/legacy/internal/models/rangePickerProps.js +1 -0
  57. package/legacy/internal/utils/releaseInfo.js +1 -1
  58. package/legacy/internal/utils/valueManagers.js +21 -19
  59. package/modern/DateRangePicker/DateRangePicker.js +12 -0
  60. package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  61. package/modern/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  62. package/modern/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -0
  63. package/modern/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +1 -0
  64. package/modern/SingleInputTimeRangeField/SingleInputTimeRangeField.js +1 -0
  65. package/modern/index.js +1 -1
  66. package/modern/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +30 -38
  67. package/modern/internal/hooks/useEnrichedRangePickerFieldProps.js +195 -0
  68. package/modern/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +35 -38
  69. package/modern/internal/hooks/useRangePosition.js +16 -1
  70. package/modern/internal/models/index.js +2 -1
  71. package/modern/internal/models/rangePickerProps.js +1 -0
  72. package/modern/internal/utils/releaseInfo.js +1 -1
  73. package/modern/internal/utils/valueManagers.js +21 -19
  74. package/node/DateRangePicker/DateRangePicker.js +12 -0
  75. package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  76. package/node/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  77. package/node/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -0
  78. package/node/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +1 -0
  79. package/node/SingleInputTimeRangeField/SingleInputTimeRangeField.js +1 -0
  80. package/node/index.js +1 -1
  81. package/node/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +29 -37
  82. package/node/internal/hooks/useEnrichedRangePickerFieldProps.js +205 -0
  83. package/node/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +34 -37
  84. package/node/internal/hooks/useRangePosition.js +18 -1
  85. package/node/internal/models/index.js +11 -0
  86. package/node/internal/models/rangePickerProps.js +5 -0
  87. package/node/internal/utils/releaseInfo.js +1 -1
  88. package/node/internal/utils/valueManagers.js +20 -18
  89. package/package.json +2 -2
  90. package/internal/hooks/useRangePickerInputProps.d.ts +0 -19
  91. package/internal/hooks/useRangePickerInputProps.js +0 -89
  92. package/legacy/internal/hooks/useRangePickerInputProps.js +0 -88
  93. package/modern/internal/hooks/useRangePickerInputProps.js +0 -86
  94. package/node/internal/hooks/useRangePickerInputProps.js +0 -96
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { replaceInvalidDateByNull, splitFormatIntoSections, addPositionPropertiesToSections, createDateStrForInputFromSections, areDatesEqual } from '@mui/x-date-pickers/internals';
2
+ import { replaceInvalidDateByNull, addPositionPropertiesToSections, createDateStrForInputFromSections, areDatesEqual } from '@mui/x-date-pickers/internals';
3
3
  import { splitDateRangeSections, removeLastSeparator } from './date-fields-utils';
4
4
  export const rangeValueManager = {
5
5
  emptyValue: [null, null],
@@ -24,17 +24,17 @@ export const rangeFieldValueManager = {
24
24
  }
25
25
  return [prevReferenceValue[1], value[1]];
26
26
  },
27
- getSectionsFromValue: (utils, localeText, prevSections, [start, end], format) => {
28
- const prevDateRangeSections = prevSections == null ? {
27
+ getSectionsFromValue: (utils, [start, end], fallbackSections, isRTL, getSectionsFromDate) => {
28
+ const separatedFallbackSections = fallbackSections == null ? {
29
29
  startDate: null,
30
30
  endDate: null
31
- } : splitDateRangeSections(prevSections);
32
- const getSections = (newDate, prevDateSections, position) => {
33
- const shouldReUsePrevDateSections = !utils.isValid(newDate) && !!prevDateSections;
31
+ } : splitDateRangeSections(fallbackSections);
32
+ const getSections = (newDate, fallbackDateSections, position) => {
33
+ const shouldReUsePrevDateSections = !utils.isValid(newDate) && !!fallbackDateSections;
34
34
  if (shouldReUsePrevDateSections) {
35
- return prevDateSections;
35
+ return fallbackDateSections;
36
36
  }
37
- const sections = splitFormatIntoSections(utils, localeText, format, newDate);
37
+ const sections = getSectionsFromDate(newDate);
38
38
  return sections.map((section, sectionIndex) => {
39
39
  if (sectionIndex === sections.length - 1 && position === 'start') {
40
40
  return _extends({}, section, {
@@ -47,16 +47,11 @@ export const rangeFieldValueManager = {
47
47
  });
48
48
  });
49
49
  };
50
- return addPositionPropertiesToSections([...getSections(start, prevDateRangeSections.startDate, 'start'), ...getSections(end, prevDateRangeSections.endDate, 'end')]);
50
+ return addPositionPropertiesToSections([...getSections(start, separatedFallbackSections.startDate, 'start'), ...getSections(end, separatedFallbackSections.endDate, 'end')], isRTL);
51
51
  },
52
- getValueStrFromSections: sections => {
52
+ getValueStrFromSections: (sections, isRTL) => {
53
53
  const dateRangeSections = splitDateRangeSections(sections);
54
- return createDateStrForInputFromSections([...dateRangeSections.startDate, ...dateRangeSections.endDate]);
55
- },
56
- getActiveDateSections: (sections, activeSection) => {
57
- const index = activeSection.dateName === 'start' ? 0 : 1;
58
- const dateRangeSections = splitDateRangeSections(sections);
59
- return index === 0 ? removeLastSeparator(dateRangeSections.startDate) : dateRangeSections.endDate;
54
+ return createDateStrForInputFromSections([...dateRangeSections.startDate, ...dateRangeSections.endDate], isRTL);
60
55
  },
61
56
  parseValueStr: (valueStr, referenceValue, parseDate) => {
62
57
  // TODO: Improve because it would not work if the date format has `–` as a separator.
@@ -72,9 +67,16 @@ export const rangeFieldValueManager = {
72
67
  const index = activeSection.dateName === 'start' ? 0 : 1;
73
68
  const updateDateInRange = (newDate, prevDateRange) => index === 0 ? [newDate, prevDateRange[1]] : [prevDateRange[0], newDate];
74
69
  return {
75
- activeDate: state.value[index],
76
- referenceActiveDate: state.referenceValue[index],
77
- getNewValueFromNewActiveDate: newActiveDate => ({
70
+ date: state.value[index],
71
+ referenceDate: state.referenceValue[index],
72
+ getSections: sections => {
73
+ const dateRangeSections = splitDateRangeSections(sections);
74
+ if (index === 0) {
75
+ return removeLastSeparator(dateRangeSections.startDate);
76
+ }
77
+ return dateRangeSections.endDate;
78
+ },
79
+ getNewValuesFromNewActiveDate: newActiveDate => ({
78
80
  value: updateDateInRange(newActiveDate, state.value),
79
81
  referenceValue: newActiveDate == null || !utils.isValid(newActiveDate) ? state.referenceValue : updateDateInRange(newActiveDate, state.referenceValue)
80
82
  })
@@ -146,6 +146,18 @@ process.env.NODE_ENV !== "production" ? DateRangePicker.propTypes = {
146
146
  * Defaults to localized format based on the used `views`.
147
147
  */
148
148
  format: PropTypes.string,
149
+ /**
150
+ * Pass a ref to the `input` element.
151
+ * Ignored if the field has several inputs.
152
+ */
153
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
154
+ current: PropTypes.object
155
+ })]),
156
+ /**
157
+ * The label content.
158
+ * Ignored if the field has several inputs.
159
+ */
160
+ label: PropTypes.node,
149
161
  /**
150
162
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
151
163
  * Can be used to preload information and show it in calendar.
@@ -154,6 +154,18 @@ DesktopDateRangePicker.propTypes = {
154
154
  * Defaults to localized format based on the used `views`.
155
155
  */
156
156
  format: PropTypes.string,
157
+ /**
158
+ * Pass a ref to the `input` element.
159
+ * Ignored if the field has several inputs.
160
+ */
161
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
162
+ current: PropTypes.object
163
+ })]),
164
+ /**
165
+ * The label content.
166
+ * Ignored if the field has several inputs.
167
+ */
168
+ label: PropTypes.node,
157
169
  /**
158
170
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
159
171
  * Can be used to preload information and show it in calendar.
@@ -159,6 +159,18 @@ MobileDateRangePicker.propTypes = {
159
159
  * Defaults to localized format based on the used `views`.
160
160
  */
161
161
  format: PropTypes.string,
162
+ /**
163
+ * Pass a ref to the `input` element.
164
+ * Ignored if the field has several inputs.
165
+ */
166
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
167
+ current: PropTypes.object
168
+ })]),
169
+ /**
170
+ * The label content.
171
+ * Ignored if the field has several inputs.
172
+ */
173
+ label: PropTypes.node,
162
174
  /**
163
175
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
164
176
  * Can be used to preload information and show it in calendar.
@@ -48,6 +48,7 @@ var SingleInputDateRangeField = /*#__PURE__*/React.forwardRef(function SingleInp
48
48
  })
49
49
  }));
50
50
  });
51
+ SingleInputDateRangeField.fieldType = 'single-input';
51
52
  process.env.NODE_ENV !== "production" ? SingleInputDateRangeField.propTypes = {
52
53
  // ----------------------------- Warning --------------------------------
53
54
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -48,6 +48,7 @@ var SingleInputDateTimeRangeField = /*#__PURE__*/React.forwardRef(function Singl
48
48
  })
49
49
  }));
50
50
  });
51
+ SingleInputDateTimeRangeField.fieldType = 'single-input';
51
52
  process.env.NODE_ENV !== "production" ? SingleInputDateTimeRangeField.propTypes = {
52
53
  // ----------------------------- Warning --------------------------------
53
54
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -48,6 +48,7 @@ var SingleInputTimeRangeField = /*#__PURE__*/React.forwardRef(function SingleInp
48
48
  })
49
49
  }));
50
50
  });
51
+ SingleInputTimeRangeField.fieldType = 'single-input';
51
52
  process.env.NODE_ENV !== "production" ? SingleInputTimeRangeField.propTypes = {
52
53
  // ----------------------------- Warning --------------------------------
53
54
  // | These PropTypes are generated from the TypeScript type definitions |
package/legacy/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers-pro v6.0.3
2
+ * @mui/x-date-pickers-pro v6.0.4
3
3
  *
4
4
  * @license MUI X Commercial
5
5
  * This source code is licensed under the commercial license found in the
@@ -1,18 +1,18 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
3
+ import { useSlotProps } from '@mui/base/utils';
4
4
  import { useLicenseVerifier } from '@mui/x-license-pro';
5
5
  import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
6
6
  import { PickersLayout } from '@mui/x-date-pickers/PickersLayout';
7
7
  import { executeInTheNextEventLoopTick, getActiveElement, usePicker, PickersPopper } from '@mui/x-date-pickers/internals';
8
- import { useRangePickerInputProps } from '../useRangePickerInputProps';
8
+ import { useEnrichedRangePickerFieldProps } from '../useEnrichedRangePickerFieldProps';
9
9
  import { getReleaseInfo } from '../../utils/releaseInfo';
10
10
  import { useRangePosition } from '../useRangePosition';
11
11
  import { jsx as _jsx } from "react/jsx-runtime";
12
12
  import { jsxs as _jsxs } from "react/jsx-runtime";
13
13
  var releaseInfo = getReleaseInfo();
14
14
  export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
15
- var _slots$layout;
15
+ var _fieldType, _slots$layout;
16
16
  var props = _ref.props,
17
17
  valueManager = _ref.valueManager,
18
18
  validator = _ref.validator;
@@ -22,16 +22,19 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
22
22
  className = props.className,
23
23
  sx = props.sx,
24
24
  format = props.format,
25
+ label = props.label,
26
+ inputRef = props.inputRef,
25
27
  readOnly = props.readOnly,
26
28
  disabled = props.disabled,
27
29
  autoFocus = props.autoFocus,
28
30
  disableOpenPicker = props.disableOpenPicker,
29
31
  localeText = props.localeText;
30
- var fieldRef = React.useRef(null);
32
+ var fieldContainerRef = React.useRef(null);
31
33
  var popperRef = React.useRef(null);
32
34
  var _useRangePosition = useRangePosition(props),
33
35
  rangePosition = _useRangePosition.rangePosition,
34
- onRangePositionChange = _useRangePosition.onRangePositionChange;
36
+ onRangePositionChange = _useRangePosition.onRangePositionChange,
37
+ singleInputFieldRef = _useRangePosition.singleInputFieldRef;
35
38
  var _usePicker = usePicker({
36
39
  props: props,
37
40
  valueManager: valueManager,
@@ -51,26 +54,15 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
51
54
  pickerFieldProps = _usePicker.fieldProps;
52
55
  var handleBlur = function handleBlur() {
53
56
  executeInTheNextEventLoopTick(function () {
54
- var _fieldRef$current, _popperRef$current;
55
- if ((_fieldRef$current = fieldRef.current) != null && _fieldRef$current.contains(getActiveElement(document)) || (_popperRef$current = popperRef.current) != null && _popperRef$current.contains(getActiveElement(document))) {
57
+ var _fieldContainerRef$cu, _popperRef$current;
58
+ if ((_fieldContainerRef$cu = fieldContainerRef.current) != null && _fieldContainerRef$cu.contains(getActiveElement(document)) || (_popperRef$current = popperRef.current) != null && _popperRef$current.contains(getActiveElement(document))) {
56
59
  return;
57
60
  }
58
61
  actions.onDismiss();
59
62
  });
60
63
  };
61
- var fieldSlotProps = useRangePickerInputProps({
62
- wrapperVariant: 'desktop',
63
- open: open,
64
- actions: actions,
65
- readOnly: readOnly,
66
- disabled: disabled,
67
- disableOpenPicker: disableOpenPicker,
68
- localeText: localeText,
69
- onBlur: handleBlur,
70
- rangePosition: rangePosition,
71
- onRangePositionChange: onRangePositionChange
72
- });
73
64
  var Field = slots.field;
65
+ var fieldType = (_fieldType = Field.fieldType) != null ? _fieldType : 'multi-input';
74
66
  var fieldProps = useSlotProps({
75
67
  elementType: Field,
76
68
  externalSlotProps: slotProps == null ? void 0 : slotProps.field,
@@ -81,25 +73,28 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
81
73
  sx: sx,
82
74
  format: format,
83
75
  autoFocus: autoFocus && !props.open,
84
- ref: fieldRef
76
+ ref: fieldContainerRef
77
+ }, fieldType === 'single-input' && {
78
+ inputRef: inputRef
85
79
  }),
86
80
  ownerState: props
87
81
  });
88
- var slotsForField = _extends({
89
- textField: slots.textField,
90
- root: slots.fieldRoot,
91
- separator: slots.fieldSeparator
92
- }, fieldProps.slots);
93
- var slotPropsForField = _extends({}, fieldProps.slotProps, {
94
- textField: function textField(ownerState) {
95
- var externalInputProps = resolveComponentProps(slotProps == null ? void 0 : slotProps.textField, ownerState);
96
- return _extends({}, ownerState.position === 'start' ? fieldSlotProps.startInput : fieldSlotProps.endInput, externalInputProps);
97
- },
98
- root: function root(ownerState) {
99
- var externalRootProps = resolveComponentProps(slotProps == null ? void 0 : slotProps.fieldRoot, ownerState);
100
- return _extends({}, externalRootProps, fieldSlotProps.root);
101
- },
102
- separator: slotProps == null ? void 0 : slotProps.fieldSeparator
82
+ var enrichedFieldProps = useEnrichedRangePickerFieldProps({
83
+ wrapperVariant: 'desktop',
84
+ fieldType: fieldType,
85
+ open: open,
86
+ actions: actions,
87
+ readOnly: readOnly,
88
+ disableOpenPicker: disableOpenPicker,
89
+ label: label,
90
+ localeText: localeText,
91
+ onBlur: handleBlur,
92
+ rangePosition: rangePosition,
93
+ onRangePositionChange: onRangePositionChange,
94
+ singleInputFieldRef: singleInputFieldRef,
95
+ pickerSlotProps: slotProps,
96
+ pickerSlots: slots,
97
+ fieldProps: fieldProps
103
98
  });
104
99
  var slotPropsForLayout = _extends({}, slotProps, {
105
100
  toolbar: _extends({}, slotProps == null ? void 0 : slotProps.toolbar, {
@@ -111,13 +106,10 @@ export var useDesktopRangePicker = function useDesktopRangePicker(_ref) {
111
106
  var renderPicker = function renderPicker() {
112
107
  return /*#__PURE__*/_jsxs(LocalizationProvider, {
113
108
  localeText: localeText,
114
- children: [/*#__PURE__*/_jsx(Field, _extends({}, fieldProps, {
115
- slots: slotsForField,
116
- slotProps: slotPropsForField
117
- })), /*#__PURE__*/_jsx(PickersPopper, _extends({
109
+ children: [/*#__PURE__*/_jsx(Field, _extends({}, enrichedFieldProps)), /*#__PURE__*/_jsx(PickersPopper, _extends({
118
110
  role: "tooltip",
119
111
  containerRef: popperRef,
120
- anchorEl: fieldRef.current,
112
+ anchorEl: fieldContainerRef.current,
121
113
  onBlur: handleBlur
122
114
  }, actions, {
123
115
  open: open,
@@ -0,0 +1,200 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { resolveComponentProps } from '@mui/base/utils';
4
+ import useEventCallback from '@mui/utils/useEventCallback';
5
+ import useForkRef from '@mui/utils/useForkRef';
6
+ import { onSpaceOrEnter, useLocaleText, getActiveElement } from '@mui/x-date-pickers/internals';
7
+ var useMultiInputFieldSlotProps = function useMultiInputFieldSlotProps(_ref) {
8
+ var wrapperVariant = _ref.wrapperVariant,
9
+ open = _ref.open,
10
+ actions = _ref.actions,
11
+ readOnly = _ref.readOnly,
12
+ labelId = _ref.labelId,
13
+ disableOpenPicker = _ref.disableOpenPicker,
14
+ onBlur = _ref.onBlur,
15
+ rangePosition = _ref.rangePosition,
16
+ onRangePositionChange = _ref.onRangePositionChange,
17
+ inLocaleText = _ref.localeText,
18
+ pickerSlotProps = _ref.pickerSlotProps,
19
+ pickerSlots = _ref.pickerSlots,
20
+ fieldProps = _ref.fieldProps;
21
+ var localeText = useLocaleText();
22
+ var startRef = React.useRef(null);
23
+ var endRef = React.useRef(null);
24
+ React.useEffect(function () {
25
+ if (!open) {
26
+ return;
27
+ }
28
+ if (rangePosition === 'start') {
29
+ var _startRef$current;
30
+ (_startRef$current = startRef.current) == null ? void 0 : _startRef$current.focus();
31
+ } else if (rangePosition === 'end') {
32
+ var _endRef$current;
33
+ (_endRef$current = endRef.current) == null ? void 0 : _endRef$current.focus();
34
+ }
35
+ }, [rangePosition, open]);
36
+ var openRangeStartSelection = function openRangeStartSelection(event) {
37
+ event.stopPropagation();
38
+ onRangePositionChange('start');
39
+ if (!readOnly && !disableOpenPicker) {
40
+ actions.onOpen();
41
+ }
42
+ };
43
+ var openRangeEndSelection = function openRangeEndSelection(event) {
44
+ event.stopPropagation();
45
+ onRangePositionChange('end');
46
+ if (!readOnly && !disableOpenPicker) {
47
+ actions.onOpen();
48
+ }
49
+ };
50
+ var handleFocusStart = function handleFocusStart() {
51
+ if (open) {
52
+ onRangePositionChange('start');
53
+ }
54
+ };
55
+ var handleFocusEnd = function handleFocusEnd() {
56
+ if (open) {
57
+ onRangePositionChange('end');
58
+ }
59
+ };
60
+ var slots = _extends({
61
+ textField: pickerSlots == null ? void 0 : pickerSlots.textField,
62
+ root: pickerSlots == null ? void 0 : pickerSlots.fieldRoot,
63
+ separator: pickerSlots == null ? void 0 : pickerSlots.fieldSeparator
64
+ }, fieldProps.slots);
65
+ var slotProps = _extends({}, fieldProps.slotProps, {
66
+ textField: function textField(ownerState) {
67
+ var inputProps;
68
+ if (ownerState.position === 'start') {
69
+ var _inLocaleText$start;
70
+ inputProps = _extends({
71
+ inputRef: startRef,
72
+ label: (_inLocaleText$start = inLocaleText == null ? void 0 : inLocaleText.start) != null ? _inLocaleText$start : localeText.start,
73
+ onKeyDown: onSpaceOrEnter(openRangeStartSelection),
74
+ onFocus: handleFocusStart,
75
+ focused: open ? rangePosition === 'start' : undefined
76
+ }, !readOnly && !fieldProps.disabled && {
77
+ onClick: openRangeStartSelection
78
+ }, wrapperVariant === 'mobile' && {
79
+ readOnly: true
80
+ });
81
+ } else {
82
+ var _inLocaleText$end;
83
+ inputProps = _extends({
84
+ inputRef: endRef,
85
+ label: (_inLocaleText$end = inLocaleText == null ? void 0 : inLocaleText.end) != null ? _inLocaleText$end : localeText.end,
86
+ onKeyDown: onSpaceOrEnter(openRangeEndSelection),
87
+ onFocus: handleFocusEnd,
88
+ focused: open ? rangePosition === 'end' : undefined
89
+ }, !readOnly && !fieldProps.disabled && {
90
+ onClick: openRangeEndSelection
91
+ }, wrapperVariant === 'mobile' && {
92
+ readOnly: true
93
+ });
94
+ }
95
+ return _extends({}, labelId != null && {
96
+ id: "".concat(labelId, "-").concat(ownerState.position)
97
+ }, inputProps, resolveComponentProps(pickerSlotProps == null ? void 0 : pickerSlotProps.textField, ownerState));
98
+ },
99
+ root: function root(ownerState) {
100
+ var rootProps = {
101
+ onBlur: onBlur
102
+ };
103
+ return _extends({}, rootProps, resolveComponentProps(pickerSlotProps == null ? void 0 : pickerSlotProps.fieldRoot, ownerState));
104
+ },
105
+ separator: pickerSlotProps == null ? void 0 : pickerSlotProps.fieldSeparator
106
+ });
107
+ var enrichedFieldProps = _extends({}, fieldProps, {
108
+ slots: slots,
109
+ slotProps: slotProps
110
+ });
111
+ return enrichedFieldProps;
112
+ };
113
+ var useSingleInputFieldSlotProps = function useSingleInputFieldSlotProps(_ref2) {
114
+ var wrapperVariant = _ref2.wrapperVariant,
115
+ open = _ref2.open,
116
+ actions = _ref2.actions,
117
+ readOnly = _ref2.readOnly,
118
+ inInputRef = _ref2.inputRef,
119
+ labelId = _ref2.labelId,
120
+ disableOpenPicker = _ref2.disableOpenPicker,
121
+ label = _ref2.label,
122
+ onBlur = _ref2.onBlur,
123
+ rangePosition = _ref2.rangePosition,
124
+ onRangePositionChange = _ref2.onRangePositionChange,
125
+ singleInputFieldRef = _ref2.singleInputFieldRef,
126
+ pickerSlots = _ref2.pickerSlots,
127
+ pickerSlotProps = _ref2.pickerSlotProps,
128
+ fieldProps = _ref2.fieldProps;
129
+ var inputRef = React.useRef(null);
130
+ var handleInputRef = useForkRef(inInputRef, inputRef);
131
+ var handleFieldRef = useForkRef(fieldProps.unstableFieldRef, singleInputFieldRef);
132
+ React.useEffect(function () {
133
+ var _inputRef$current;
134
+ if (!open) {
135
+ return;
136
+ }
137
+ (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
138
+ }, [rangePosition, open]);
139
+ var updateRangePosition = function updateRangePosition() {
140
+ var _singleInputFieldRef$;
141
+ if (!singleInputFieldRef.current || inputRef.current !== getActiveElement(document)) {
142
+ return;
143
+ }
144
+ var sections = singleInputFieldRef.current.getSections();
145
+ var activeSectionIndex = (_singleInputFieldRef$ = singleInputFieldRef.current) == null ? void 0 : _singleInputFieldRef$.getActiveSectionIndex();
146
+ var domRangePosition = activeSectionIndex == null || activeSectionIndex < sections.length / 2 ? 'start' : 'end';
147
+ if (domRangePosition != null && domRangePosition !== rangePosition) {
148
+ onRangePositionChange(domRangePosition);
149
+ }
150
+ };
151
+ var handleSelectedSectionsChange = useEventCallback(function (selectedSections) {
152
+ var _fieldProps$onSelecte;
153
+ setTimeout(updateRangePosition);
154
+ (_fieldProps$onSelecte = fieldProps.onSelectedSectionsChange) == null ? void 0 : _fieldProps$onSelecte.call(fieldProps, selectedSections);
155
+ });
156
+ var openPicker = function openPicker(event) {
157
+ event.stopPropagation();
158
+ if (!readOnly && !disableOpenPicker) {
159
+ actions.onOpen();
160
+ }
161
+ };
162
+ var slots = _extends({}, fieldProps.slots, {
163
+ textField: pickerSlots == null ? void 0 : pickerSlots.textField
164
+ });
165
+ var slotProps = _extends({}, fieldProps.slotProps, {
166
+ textField: pickerSlotProps == null ? void 0 : pickerSlotProps.textField
167
+ });
168
+ var enrichedFieldProps = _extends({}, fieldProps, {
169
+ slots: slots,
170
+ slotProps: slotProps,
171
+ label: label,
172
+ unstableFieldRef: handleFieldRef,
173
+ inputRef: handleInputRef,
174
+ onKeyDown: onSpaceOrEnter(openPicker, fieldProps.onKeyDown),
175
+ onSelectedSectionsChange: handleSelectedSectionsChange,
176
+ onBlur: onBlur,
177
+ focused: open
178
+ }, labelId != null && {
179
+ id: labelId
180
+ }, wrapperVariant === 'mobile' && {
181
+ readOnly: true
182
+ }, !readOnly && !fieldProps.disabled && {
183
+ onClick: openPicker
184
+ });
185
+ return enrichedFieldProps;
186
+ };
187
+ export var useEnrichedRangePickerFieldProps = function useEnrichedRangePickerFieldProps(params) {
188
+ /* eslint-disable react-hooks/rules-of-hooks */
189
+ if (process.env.NODE_ENV !== 'production') {
190
+ var fieldTypeRef = React.useRef(params.fieldType);
191
+ if (params.fieldType !== fieldTypeRef.current) {
192
+ console.error('Should not switch between a multi input field and a single input field on a range picker.');
193
+ }
194
+ }
195
+ if (params.fieldType === 'multi-input') {
196
+ return useMultiInputFieldSlotProps(params);
197
+ }
198
+ return useSingleInputFieldSlotProps(params);
199
+ /* eslint-enable react-hooks/rules-of-hooks */
200
+ };
@@ -1,19 +1,19 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
3
+ import { useSlotProps } from '@mui/base/utils';
4
4
  import { useLicenseVerifier } from '@mui/x-license-pro';
5
5
  import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
6
6
  import { PickersLayout } from '@mui/x-date-pickers/PickersLayout';
7
7
  import { usePicker, PickersModalDialog, useLocaleText } from '@mui/x-date-pickers/internals';
8
8
  import useId from '@mui/utils/useId';
9
- import { useRangePickerInputProps } from '../useRangePickerInputProps';
9
+ import { useEnrichedRangePickerFieldProps } from '../useEnrichedRangePickerFieldProps';
10
10
  import { getReleaseInfo } from '../../utils/releaseInfo';
11
11
  import { useRangePosition } from '../useRangePosition';
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import { jsxs as _jsxs } from "react/jsx-runtime";
14
14
  var releaseInfo = getReleaseInfo();
15
15
  export var useMobileRangePicker = function useMobileRangePicker(_ref) {
16
- var _innerSlotProps$toolb, _innerSlotProps$toolb2, _slots$layout;
16
+ var _fieldType, _innerSlotProps$toolb, _innerSlotProps$toolb2, _slots$layout;
17
17
  var props = _ref.props,
18
18
  valueManager = _ref.valueManager,
19
19
  validator = _ref.validator;
@@ -23,13 +23,16 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
23
23
  className = props.className,
24
24
  sx = props.sx,
25
25
  format = props.format,
26
+ label = props.label,
27
+ inputRef = props.inputRef,
26
28
  readOnly = props.readOnly,
27
29
  disabled = props.disabled,
28
30
  disableOpenPicker = props.disableOpenPicker,
29
31
  localeText = props.localeText;
30
32
  var _useRangePosition = useRangePosition(props),
31
33
  rangePosition = _useRangePosition.rangePosition,
32
- onRangePositionChange = _useRangePosition.onRangePositionChange;
34
+ onRangePositionChange = _useRangePosition.onRangePositionChange,
35
+ singleInputFieldRef = _useRangePosition.singleInputFieldRef;
33
36
  var labelId = useId();
34
37
  var contextLocaleText = useLocaleText();
35
38
  var _usePicker = usePicker({
@@ -48,18 +51,8 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
48
51
  layoutProps = _usePicker.layoutProps,
49
52
  renderCurrentView = _usePicker.renderCurrentView,
50
53
  pickerFieldProps = _usePicker.fieldProps;
51
- var fieldSlotProps = useRangePickerInputProps({
52
- wrapperVariant: 'mobile',
53
- open: open,
54
- actions: actions,
55
- readOnly: readOnly,
56
- disabled: disabled,
57
- disableOpenPicker: disableOpenPicker,
58
- localeText: localeText,
59
- rangePosition: rangePosition,
60
- onRangePositionChange: onRangePositionChange
61
- });
62
54
  var Field = slots.field;
55
+ var fieldType = (_fieldType = Field.fieldType) != null ? _fieldType : 'multi-input';
63
56
  var fieldProps = useSlotProps({
64
57
  elementType: Field,
65
58
  externalSlotProps: innerSlotProps == null ? void 0 : innerSlotProps.field,
@@ -69,25 +62,28 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
69
62
  className: className,
70
63
  sx: sx,
71
64
  format: format
65
+ }, fieldType === 'single-input' && {
66
+ inputRef: inputRef
72
67
  }),
73
68
  ownerState: props
74
69
  });
75
- var slotsForField = _extends({
76
- textField: slots.textField
77
- }, fieldProps.slots);
78
70
  var isToolbarHidden = (_innerSlotProps$toolb = innerSlotProps == null ? void 0 : (_innerSlotProps$toolb2 = innerSlotProps.toolbar) == null ? void 0 : _innerSlotProps$toolb2.hidden) != null ? _innerSlotProps$toolb : false;
79
- var slotPropsForField = _extends({}, fieldProps.slotProps, {
80
- textField: function textField(ownerState) {
81
- var externalInputProps = resolveComponentProps(innerSlotProps == null ? void 0 : innerSlotProps.textField, ownerState);
82
- return _extends({}, isToolbarHidden && {
83
- id: "".concat(labelId, "-").concat(ownerState.position)
84
- }, ownerState.position === 'start' ? fieldSlotProps.startInput : fieldSlotProps.endInput, externalInputProps);
85
- },
86
- root: function root(ownerState) {
87
- var externalRootProps = resolveComponentProps(innerSlotProps == null ? void 0 : innerSlotProps.fieldRoot, ownerState);
88
- return _extends({}, externalRootProps, fieldSlotProps.root);
89
- },
90
- separator: innerSlotProps == null ? void 0 : innerSlotProps.fieldSeparator
71
+ var enrichedFieldProps = useEnrichedRangePickerFieldProps({
72
+ wrapperVariant: 'mobile',
73
+ fieldType: fieldType,
74
+ open: open,
75
+ actions: actions,
76
+ readOnly: readOnly,
77
+ labelId: labelId,
78
+ disableOpenPicker: disableOpenPicker,
79
+ label: label,
80
+ localeText: localeText,
81
+ rangePosition: rangePosition,
82
+ onRangePositionChange: onRangePositionChange,
83
+ singleInputFieldRef: singleInputFieldRef,
84
+ pickerSlots: slots,
85
+ pickerSlotProps: innerSlotProps,
86
+ fieldProps: fieldProps
91
87
  });
92
88
  var slotPropsForLayout = _extends({}, innerSlotProps, {
93
89
  toolbar: _extends({}, innerSlotProps == null ? void 0 : innerSlotProps.toolbar, {
@@ -101,11 +97,15 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
101
97
  var labelledById = labelId;
102
98
  if (isToolbarHidden) {
103
99
  var labels = [];
104
- if (finalLocaleText.start) {
105
- labels.push("".concat(labelId, "-start-label"));
106
- }
107
- if (finalLocaleText.end) {
108
- labels.push("".concat(labelId, "-end-label"));
100
+ if (fieldType === 'multi-input') {
101
+ if (finalLocaleText.start) {
102
+ labels.push("".concat(labelId, "-start-label"));
103
+ }
104
+ if (finalLocaleText.end) {
105
+ labels.push("".concat(labelId, "-end-label"));
106
+ }
107
+ } else if (label != null) {
108
+ labels.push("".concat(labelId, "-label"));
109
109
  }
110
110
  labelledById = labels.length > 0 ? labels.join(' ') : undefined;
111
111
  }
@@ -117,10 +117,7 @@ export var useMobileRangePicker = function useMobileRangePicker(_ref) {
117
117
  var renderPicker = function renderPicker() {
118
118
  return /*#__PURE__*/_jsxs(LocalizationProvider, {
119
119
  localeText: localeText,
120
- children: [/*#__PURE__*/_jsx(Field, _extends({}, fieldProps, {
121
- slots: slotsForField,
122
- slotProps: slotPropsForField
123
- })), /*#__PURE__*/_jsx(PickersModalDialog, _extends({}, actions, {
120
+ children: [/*#__PURE__*/_jsx(Field, _extends({}, enrichedFieldProps)), /*#__PURE__*/_jsx(PickersModalDialog, _extends({}, actions, {
124
121
  open: open,
125
122
  slots: slots,
126
123
  slotProps: slotProps,