@mui/x-date-pickers 8.0.0-beta.0 → 8.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/DateCalendar/DayCalendar.d.ts +3 -7
  3. package/DateCalendar/DayCalendar.js +16 -8
  4. package/DateCalendar/index.d.ts +0 -1
  5. package/DateField/useDateField.d.ts +1 -1
  6. package/DateField/useDateField.js +2 -16
  7. package/DatePicker/DatePicker.js +1 -0
  8. package/DateTimeField/useDateTimeField.d.ts +1 -1
  9. package/DateTimeField/useDateTimeField.js +2 -16
  10. package/DateTimePicker/DateTimePicker.js +1 -0
  11. package/DesktopDatePicker/DesktopDatePicker.js +1 -0
  12. package/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  13. package/DesktopTimePicker/DesktopTimePicker.js +1 -0
  14. package/MobileDatePicker/MobileDatePicker.js +1 -0
  15. package/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  16. package/MobileTimePicker/MobileTimePicker.js +1 -0
  17. package/PickersDay/PickersDay.d.ts +1 -72
  18. package/PickersDay/PickersDay.js +30 -28
  19. package/PickersDay/PickersDay.types.d.ts +114 -0
  20. package/PickersDay/PickersDay.types.js +5 -0
  21. package/PickersDay/index.d.ts +1 -1
  22. package/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  23. package/PickersDay/usePickerDayOwnerState.js +40 -0
  24. package/TimeField/useTimeField.d.ts +1 -1
  25. package/TimeField/useTimeField.js +2 -16
  26. package/TimePicker/TimePicker.js +1 -0
  27. package/esm/DateCalendar/DayCalendar.d.ts +3 -7
  28. package/esm/DateCalendar/DayCalendar.js +16 -8
  29. package/esm/DateCalendar/index.d.ts +0 -1
  30. package/esm/DateField/useDateField.d.ts +1 -1
  31. package/esm/DateField/useDateField.js +3 -17
  32. package/esm/DatePicker/DatePicker.js +1 -0
  33. package/esm/DateTimeField/useDateTimeField.d.ts +1 -1
  34. package/esm/DateTimeField/useDateTimeField.js +3 -17
  35. package/esm/DateTimePicker/DateTimePicker.js +1 -0
  36. package/esm/DesktopDatePicker/DesktopDatePicker.js +1 -0
  37. package/esm/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  38. package/esm/DesktopTimePicker/DesktopTimePicker.js +1 -0
  39. package/esm/MobileDatePicker/MobileDatePicker.js +1 -0
  40. package/esm/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  41. package/esm/MobileTimePicker/MobileTimePicker.js +1 -0
  42. package/esm/PickersDay/PickersDay.d.ts +1 -72
  43. package/esm/PickersDay/PickersDay.js +30 -28
  44. package/esm/PickersDay/PickersDay.types.d.ts +114 -0
  45. package/esm/PickersDay/PickersDay.types.js +1 -0
  46. package/esm/PickersDay/index.d.ts +1 -1
  47. package/esm/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  48. package/esm/PickersDay/usePickerDayOwnerState.js +32 -0
  49. package/esm/TimeField/useTimeField.d.ts +1 -1
  50. package/esm/TimeField/useTimeField.js +3 -17
  51. package/esm/TimePicker/TimePicker.js +1 -0
  52. package/esm/hooks/useSplitFieldProps.d.ts +1 -1
  53. package/esm/index.js +1 -1
  54. package/esm/internals/components/PickerFieldUI.d.ts +5 -5
  55. package/esm/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  56. package/esm/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  57. package/esm/internals/hooks/useField/index.d.ts +1 -1
  58. package/esm/internals/hooks/useField/useField.d.ts +2 -4
  59. package/esm/internals/hooks/useField/useField.js +5 -229
  60. package/esm/internals/hooks/useField/useField.types.d.ts +48 -68
  61. package/esm/internals/hooks/useField/useField.utils.d.ts +2 -5
  62. package/esm/internals/hooks/useField/useField.utils.js +7 -92
  63. package/esm/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  64. package/esm/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  65. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  66. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.js +204 -0
  67. package/esm/internals/hooks/useField/useFieldState.d.ts +23 -13
  68. package/esm/internals/hooks/useField/useFieldState.js +103 -30
  69. package/esm/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  70. package/esm/internals/hooks/useField/useFieldV6TextField.js +202 -135
  71. package/esm/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  72. package/esm/internals/hooks/useField/useFieldV7TextField.js +217 -153
  73. package/esm/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  74. package/esm/internals/index.d.ts +2 -1
  75. package/esm/internals/index.js +1 -0
  76. package/esm/managers/useDateManager.js +3 -3
  77. package/esm/managers/useDateTimeManager.js +3 -3
  78. package/esm/managers/useTimeManager.js +3 -3
  79. package/esm/models/fields.d.ts +2 -2
  80. package/esm/models/manager.d.ts +3 -2
  81. package/hooks/useSplitFieldProps.d.ts +1 -1
  82. package/index.js +1 -1
  83. package/internals/components/PickerFieldUI.d.ts +5 -5
  84. package/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  85. package/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  86. package/internals/hooks/useField/index.d.ts +1 -1
  87. package/internals/hooks/useField/useField.d.ts +2 -4
  88. package/internals/hooks/useField/useField.js +5 -231
  89. package/internals/hooks/useField/useField.types.d.ts +48 -68
  90. package/internals/hooks/useField/useField.utils.d.ts +2 -5
  91. package/internals/hooks/useField/useField.utils.js +8 -94
  92. package/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  93. package/internals/hooks/useField/useFieldCharacterEditing.js +41 -59
  94. package/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  95. package/internals/hooks/useField/useFieldRootHandleKeyDown.js +210 -0
  96. package/internals/hooks/useField/useFieldState.d.ts +23 -13
  97. package/internals/hooks/useField/useFieldState.js +102 -29
  98. package/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  99. package/internals/hooks/useField/useFieldV6TextField.js +202 -135
  100. package/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  101. package/internals/hooks/useField/useFieldV7TextField.js +218 -154
  102. package/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  103. package/internals/index.d.ts +2 -1
  104. package/internals/index.js +7 -0
  105. package/managers/useDateManager.js +3 -3
  106. package/managers/useDateTimeManager.js +3 -3
  107. package/managers/useTimeManager.js +3 -3
  108. package/models/fields.d.ts +2 -2
  109. package/models/manager.d.ts +3 -2
  110. package/modern/DateCalendar/DayCalendar.d.ts +3 -7
  111. package/modern/DateCalendar/DayCalendar.js +16 -8
  112. package/modern/DateCalendar/index.d.ts +0 -1
  113. package/modern/DateField/useDateField.d.ts +1 -1
  114. package/modern/DateField/useDateField.js +3 -17
  115. package/modern/DatePicker/DatePicker.js +1 -0
  116. package/modern/DateTimeField/useDateTimeField.d.ts +1 -1
  117. package/modern/DateTimeField/useDateTimeField.js +3 -17
  118. package/modern/DateTimePicker/DateTimePicker.js +1 -0
  119. package/modern/DesktopDatePicker/DesktopDatePicker.js +1 -0
  120. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  121. package/modern/DesktopTimePicker/DesktopTimePicker.js +1 -0
  122. package/modern/MobileDatePicker/MobileDatePicker.js +1 -0
  123. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  124. package/modern/MobileTimePicker/MobileTimePicker.js +1 -0
  125. package/modern/PickersDay/PickersDay.d.ts +1 -72
  126. package/modern/PickersDay/PickersDay.js +30 -28
  127. package/modern/PickersDay/PickersDay.types.d.ts +114 -0
  128. package/modern/PickersDay/PickersDay.types.js +1 -0
  129. package/modern/PickersDay/index.d.ts +1 -1
  130. package/modern/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  131. package/modern/PickersDay/usePickerDayOwnerState.js +32 -0
  132. package/modern/TimeField/useTimeField.d.ts +1 -1
  133. package/modern/TimeField/useTimeField.js +3 -17
  134. package/modern/TimePicker/TimePicker.js +1 -0
  135. package/modern/hooks/useSplitFieldProps.d.ts +1 -1
  136. package/modern/index.js +1 -1
  137. package/modern/internals/components/PickerFieldUI.d.ts +5 -5
  138. package/modern/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  139. package/modern/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  140. package/modern/internals/hooks/useField/index.d.ts +1 -1
  141. package/modern/internals/hooks/useField/useField.d.ts +2 -4
  142. package/modern/internals/hooks/useField/useField.js +5 -229
  143. package/modern/internals/hooks/useField/useField.types.d.ts +48 -68
  144. package/modern/internals/hooks/useField/useField.utils.d.ts +2 -5
  145. package/modern/internals/hooks/useField/useField.utils.js +7 -92
  146. package/modern/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  147. package/modern/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  148. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  149. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.js +204 -0
  150. package/modern/internals/hooks/useField/useFieldState.d.ts +23 -13
  151. package/modern/internals/hooks/useField/useFieldState.js +103 -30
  152. package/modern/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  153. package/modern/internals/hooks/useField/useFieldV6TextField.js +202 -135
  154. package/modern/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  155. package/modern/internals/hooks/useField/useFieldV7TextField.js +217 -153
  156. package/modern/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  157. package/modern/internals/index.d.ts +2 -1
  158. package/modern/internals/index.js +1 -0
  159. package/modern/managers/useDateManager.js +3 -3
  160. package/modern/managers/useDateTimeManager.js +3 -3
  161. package/modern/managers/useTimeManager.js +3 -3
  162. package/modern/models/fields.d.ts +2 -2
  163. package/modern/models/manager.d.ts +3 -2
  164. package/package.json +1 -1
  165. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1,128 +1,147 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
3
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.useFieldV7TextField = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10
  var React = _interopRequireWildcard(require("react"));
10
11
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
11
12
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
12
13
  var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
14
+ var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
13
15
  var _useId = _interopRequireDefault(require("@mui/utils/useId"));
14
16
  var _useField = require("./useField.utils");
15
17
  var _utils = require("../../utils/utils");
18
+ var _hooks = require("../../../hooks");
16
19
  var _usePickerTranslations = require("../../../hooks/usePickerTranslations");
17
20
  var _useUtils = require("../useUtils");
18
- const useFieldV7TextField = params => {
21
+ var _useFieldCharacterEditing = require("./useFieldCharacterEditing");
22
+ var _useFieldRootHandleKeyDown = require("./useFieldRootHandleKeyDown");
23
+ var _useFieldState = require("./useFieldState");
24
+ var _useFieldInternalPropsWithDefaults = require("./useFieldInternalPropsWithDefaults");
25
+ const useFieldV7TextField = parameters => {
26
+ const translations = (0, _usePickerTranslations.usePickerTranslations)();
27
+ const utils = (0, _useUtils.useUtils)();
28
+ const id = (0, _useId.default)();
19
29
  const {
20
- internalProps: {
21
- disabled,
22
- readOnly = false,
23
- autoFocus = false,
24
- focused: focusedProp
25
- },
26
- forwardedProps: {
27
- sectionListRef: inSectionListRef,
28
- onBlur,
29
- onClick,
30
- onFocus,
31
- onInput,
32
- onPaste
33
- },
34
- fieldValueManager,
35
- applyCharacterEditing,
36
- resetCharacterQuery,
37
- setSelectedSections,
30
+ props,
31
+ manager,
32
+ skipContextFieldRefAssignment,
33
+ manager: {
34
+ valueType,
35
+ internal_fieldValueManager: fieldValueManager,
36
+ internal_useOpenPickerButtonAriaLabel: useOpenPickerButtonAriaLabel
37
+ }
38
+ } = parameters;
39
+ const {
40
+ internalProps,
41
+ forwardedProps
42
+ } = (0, _hooks.useSplitFieldProps)(props, valueType);
43
+ const internalPropsWithDefaults = (0, _useFieldInternalPropsWithDefaults.useFieldInternalPropsWithDefaults)({
44
+ manager,
45
+ internalProps,
46
+ skipContextFieldRefAssignment
47
+ });
48
+ const {
49
+ sectionListRef: sectionListRefProp,
50
+ onBlur,
51
+ onClick,
52
+ onFocus,
53
+ onInput,
54
+ onPaste,
55
+ onKeyDown,
56
+ onClear,
57
+ clearable
58
+ } = forwardedProps;
59
+ const {
60
+ disabled = false,
61
+ readOnly = false,
62
+ autoFocus = false,
63
+ focused: focusedProp,
64
+ unstableFieldRef
65
+ } = internalPropsWithDefaults;
66
+ const sectionListRef = React.useRef(null);
67
+ const handleSectionListRef = (0, _useForkRef.default)(sectionListRefProp, sectionListRef);
68
+ const stateResponse = (0, _useFieldState.useFieldState)({
69
+ manager,
70
+ internalPropsWithDefaults,
71
+ forwardedProps
72
+ });
73
+ const {
74
+ // States and derived states
75
+ areAllSectionsEmpty,
76
+ error,
38
77
  parsedSelectedSections,
78
+ sectionOrder,
79
+ sectionsValueBoundaries,
39
80
  state,
40
- clearActiveSection,
81
+ value,
82
+ // Methods to update the states
41
83
  clearValue,
84
+ clearActiveSection,
85
+ setCharacterQuery,
86
+ setSelectedSections,
42
87
  updateSectionValue,
43
- updateValueFromValueStr,
44
- sectionOrder,
45
- areAllSectionsEmpty,
46
- sectionsValueBoundaries
47
- } = params;
48
- const sectionListRef = React.useRef(null);
49
- const handleSectionListRef = (0, _useForkRef.default)(inSectionListRef, sectionListRef);
50
- const translations = (0, _usePickerTranslations.usePickerTranslations)();
51
- const utils = (0, _useUtils.useUtils)();
52
- const id = (0, _useId.default)();
88
+ updateValueFromValueStr
89
+ } = stateResponse;
90
+ const applyCharacterEditing = (0, _useFieldCharacterEditing.useFieldCharacterEditing)({
91
+ stateResponse
92
+ });
93
+ const openPickerAriaLabel = useOpenPickerButtonAriaLabel(value);
53
94
  const [focused, setFocused] = React.useState(false);
54
- const interactions = React.useMemo(() => ({
55
- syncSelectionToDOM: () => {
56
- if (!sectionListRef.current) {
57
- return;
95
+ function syncSelectionToDOM() {
96
+ if (!sectionListRef.current) {
97
+ return;
98
+ }
99
+ const selection = document.getSelection();
100
+ if (!selection) {
101
+ return;
102
+ }
103
+ if (parsedSelectedSections == null) {
104
+ // If the selection contains an element inside the field, we reset it.
105
+ if (selection.rangeCount > 0 && sectionListRef.current.getRoot().contains(selection.getRangeAt(0).startContainer)) {
106
+ selection.removeAllRanges();
58
107
  }
59
- const selection = document.getSelection();
60
- if (!selection) {
61
- return;
62
- }
63
- if (parsedSelectedSections == null) {
64
- // If the selection contains an element inside the field, we reset it.
65
- if (selection.rangeCount > 0 && sectionListRef.current.getRoot().contains(selection.getRangeAt(0).startContainer)) {
66
- selection.removeAllRanges();
67
- }
68
- if (focused) {
69
- sectionListRef.current.getRoot().blur();
70
- }
71
- return;
108
+ if (focused) {
109
+ sectionListRef.current.getRoot().blur();
72
110
  }
111
+ return;
112
+ }
73
113
 
74
- // On multi input range pickers we want to update selection range only for the active input
75
- if (!sectionListRef.current.getRoot().contains((0, _utils.getActiveElement)(document))) {
76
- return;
77
- }
78
- const range = new window.Range();
79
- let target;
80
- if (parsedSelectedSections === 'all') {
81
- target = sectionListRef.current.getRoot();
114
+ // On multi input range pickers we want to update selection range only for the active input
115
+ if (!sectionListRef.current.getRoot().contains((0, _utils.getActiveElement)(document))) {
116
+ return;
117
+ }
118
+ const range = new window.Range();
119
+ let target;
120
+ if (parsedSelectedSections === 'all') {
121
+ target = sectionListRef.current.getRoot();
122
+ } else {
123
+ const section = state.sections[parsedSelectedSections];
124
+ if (section.type === 'empty') {
125
+ target = sectionListRef.current.getSectionContainer(parsedSelectedSections);
82
126
  } else {
83
- const section = state.sections[parsedSelectedSections];
84
- if (section.type === 'empty') {
85
- target = sectionListRef.current.getSectionContainer(parsedSelectedSections);
86
- } else {
87
- target = sectionListRef.current.getSectionContent(parsedSelectedSections);
88
- }
89
- }
90
- range.selectNodeContents(target);
91
- target.focus();
92
- selection.removeAllRanges();
93
- selection.addRange(range);
94
- },
95
- getActiveSectionIndexFromDOM: () => {
96
- const activeElement = (0, _utils.getActiveElement)(document);
97
- if (!activeElement || !sectionListRef.current || !sectionListRef.current.getRoot().contains(activeElement)) {
98
- return null;
99
- }
100
- return sectionListRef.current.getSectionIndexFromDOMElement(activeElement);
101
- },
102
- focusField: (newSelectedSections = 0) => {
103
- if (!sectionListRef.current ||
104
- // if the field is already focused, we don't need to focus it again
105
- interactions.getActiveSectionIndexFromDOM() != null) {
106
- return;
127
+ target = sectionListRef.current.getSectionContent(parsedSelectedSections);
107
128
  }
108
- const newParsedSelectedSections = (0, _useField.parseSelectedSections)(newSelectedSections, state.sections);
109
- setFocused(true);
110
- sectionListRef.current.getSectionContent(newParsedSelectedSections).focus();
111
- },
112
- setSelectedSections: newSelectedSections => {
113
- if (!sectionListRef.current) {
114
- return;
115
- }
116
- const newParsedSelectedSections = (0, _useField.parseSelectedSections)(newSelectedSections, state.sections);
117
- const newActiveSectionIndex = newParsedSelectedSections === 'all' ? 0 : newParsedSelectedSections;
118
- setFocused(newActiveSectionIndex !== null);
119
- setSelectedSections(newSelectedSections);
120
- },
121
- isFieldFocused: () => {
122
- const activeElement = (0, _utils.getActiveElement)(document);
123
- return !!sectionListRef.current && sectionListRef.current.getRoot().contains(activeElement);
124
129
  }
125
- }), [parsedSelectedSections, setSelectedSections, state.sections, focused]);
130
+ range.selectNodeContents(target);
131
+ target.focus();
132
+ selection.removeAllRanges();
133
+ selection.addRange(range);
134
+ }
135
+ function focusField(newSelectedSections = 0) {
136
+ if (!sectionListRef.current ||
137
+ // if the field is already focused, we don't need to focus it again
138
+ getActiveSectionIndex(sectionListRef) != null) {
139
+ return;
140
+ }
141
+ const newParsedSelectedSections = (0, _useField.parseSelectedSections)(newSelectedSections, state.sections);
142
+ setFocused(true);
143
+ sectionListRef.current.getSectionContent(newParsedSelectedSections).focus();
144
+ }
126
145
 
127
146
  /**
128
147
  * If a section content has been updated with a value we don't want to keep,
@@ -134,8 +153,9 @@ const useFieldV7TextField = params => {
134
153
  }
135
154
  const section = state.sections[sectionIndex];
136
155
  sectionListRef.current.getSectionContent(sectionIndex).innerHTML = section.value || section.placeholder;
137
- interactions.syncSelectionToDOM();
156
+ syncSelectionToDOM();
138
157
  });
158
+ const containerClickTimeout = (0, _useTimeout.default)();
139
159
  const handleContainerClick = (0, _useEventCallback.default)((event, ...args) => {
140
160
  // The click event on the clear button would propagate to the input, trigger this handler and result in a wrong section selection.
141
161
  // We avoid this by checking if the call of `handleContainerClick` is actually intended, or a side effect.
@@ -145,7 +165,7 @@ const useFieldV7TextField = params => {
145
165
  setFocused(true);
146
166
  onClick?.(event, ...args);
147
167
  if (parsedSelectedSections === 'all') {
148
- setTimeout(() => {
168
+ containerClickTimeout.start(0, () => {
149
169
  const cursorPosition = document.getSelection().getRangeAt(0).startOffset;
150
170
  if (cursorPosition === 0) {
151
171
  setSelectedSections(sectionOrder.startIndex);
@@ -178,9 +198,8 @@ const useFieldV7TextField = params => {
178
198
  const target = event.target;
179
199
  const keyPressed = target.textContent ?? '';
180
200
  sectionListRef.current.getRoot().innerHTML = state.sections.map(section => `${section.startSeparator}${section.value || section.placeholder}${section.endSeparator}`).join('');
181
- interactions.syncSelectionToDOM();
201
+ syncSelectionToDOM();
182
202
  if (keyPressed.length === 0 || keyPressed.charCodeAt(0) === 10) {
183
- resetCharacterQuery();
184
203
  clearValue();
185
204
  setSelectedSections('all');
186
205
  } else if (keyPressed.length > 1) {
@@ -203,7 +222,7 @@ const useFieldV7TextField = params => {
203
222
  }
204
223
  const pastedValue = event.clipboardData.getData('text');
205
224
  event.preventDefault();
206
- resetCharacterQuery();
225
+ setCharacterQuery(null);
207
226
  updateValueFromValueStr(pastedValue);
208
227
  });
209
228
  const handleContainerFocus = (0, _useEventCallback.default)(event => {
@@ -260,7 +279,7 @@ const useFieldV7TextField = params => {
260
279
  const digitsAndLetterOnly = /^(([a-zA-Z]+)|)([0-9]+)(([a-zA-Z]+)|)$/.test(pastedValue);
261
280
  const isValidPastedValue = activeSection.contentType === 'letter' && lettersOnly || activeSection.contentType === 'digit' && digitsOnly || activeSection.contentType === 'digit-with-letter' && digitsAndLetterOnly;
262
281
  if (isValidPastedValue) {
263
- resetCharacterQuery();
282
+ setCharacterQuery(null);
264
283
  updateSectionValue({
265
284
  section: activeSection,
266
285
  newSectionValue: pastedValue,
@@ -269,7 +288,7 @@ const useFieldV7TextField = params => {
269
288
  }
270
289
  // If the pasted value corresponds to a single section, but not the expected type, we skip the modification
271
290
  else if (!lettersOnly && !digitsOnly) {
272
- resetCharacterQuery();
291
+ setCharacterQuery(null);
273
292
  updateValueFromValueStr(pastedValue);
274
293
  }
275
294
  });
@@ -299,7 +318,6 @@ const useFieldV7TextField = params => {
299
318
  revertDOMSectionChange(sectionIndex);
300
319
  return;
301
320
  }
302
- resetCharacterQuery();
303
321
  revertDOMSectionChange(sectionIndex);
304
322
  clearActiveSection();
305
323
  return;
@@ -312,33 +330,35 @@ const useFieldV7TextField = params => {
312
330
  // The DOM value needs to remain the one React is expecting.
313
331
  revertDOMSectionChange(sectionIndex);
314
332
  });
315
- (0, _useEnhancedEffect.default)(() => {
316
- if (!focused || !sectionListRef.current) {
317
- return;
318
- }
319
- if (parsedSelectedSections === 'all') {
320
- sectionListRef.current.getRoot().focus();
321
- } else if (typeof parsedSelectedSections === 'number') {
322
- const domElement = sectionListRef.current.getSectionContent(parsedSelectedSections);
323
- if (domElement) {
324
- domElement.focus();
325
- }
333
+ const handleClear = (0, _useEventCallback.default)((event, ...args) => {
334
+ event.preventDefault();
335
+ onClear?.(event, ...args);
336
+ clearValue();
337
+ if (!isFieldFocused(sectionListRef)) {
338
+ // setSelectedSections is called internally
339
+ focusField(0);
340
+ } else {
341
+ setSelectedSections(sectionOrder.startIndex);
326
342
  }
327
- }, [parsedSelectedSections, focused]);
328
- const sectionBoundaries = React.useMemo(() => {
329
- return state.sections.reduce((acc, next) => {
330
- acc[next.type] = sectionsValueBoundaries[next.type]({
331
- currentDate: null,
332
- contentType: next.contentType,
333
- format: next.format
334
- });
335
- return acc;
336
- }, {});
337
- }, [sectionsValueBoundaries, state.sections]);
343
+ });
344
+ const handleContainerKeyDown = (0, _useFieldRootHandleKeyDown.useFieldRootHandleKeyDown)({
345
+ manager,
346
+ internalPropsWithDefaults,
347
+ stateResponse
348
+ });
349
+ const wrappedHandleContainerKeyDown = (0, _useEventCallback.default)(event => {
350
+ onKeyDown?.(event);
351
+ handleContainerKeyDown(event);
352
+ });
338
353
  const isContainerEditable = parsedSelectedSections === 'all';
339
354
  const elements = React.useMemo(() => {
340
355
  return state.sections.map((section, index) => {
341
356
  const isEditable = !isContainerEditable && !disabled && !readOnly;
357
+ const sectionBoundaries = sectionsValueBoundaries[section.type]({
358
+ currentDate: fieldValueManager.getDateFromSection(value, section),
359
+ contentType: section.contentType,
360
+ format: section.format
361
+ });
342
362
  return {
343
363
  container: {
344
364
  'data-sectionindex': index,
@@ -352,8 +372,8 @@ const useFieldV7TextField = params => {
352
372
  'aria-labelledby': `${id}-${section.type}`,
353
373
  'aria-readonly': readOnly,
354
374
  'aria-valuenow': (0, _useField.getSectionValueNow)(section, utils),
355
- 'aria-valuemin': sectionBoundaries[section.type].minimum,
356
- 'aria-valuemax': sectionBoundaries[section.type].maximum,
375
+ 'aria-valuemin': sectionBoundaries.minimum,
376
+ 'aria-valuemax': sectionBoundaries.maximum,
357
377
  'aria-valuetext': section.value ? (0, _useField.getSectionValueText)(section, utils) : translations.empty,
358
378
  'aria-label': translations[section.type],
359
379
  'aria-disabled': disabled,
@@ -377,7 +397,7 @@ const useFieldV7TextField = params => {
377
397
  }
378
398
  };
379
399
  });
380
- }, [state.sections, getInputContentFocusHandler, handleInputContentPaste, handleInputContentDragOver, handleInputContentInput, getInputContainerClickHandler, handleInputContentMouseUp, disabled, readOnly, isContainerEditable, translations, utils, sectionBoundaries, id]);
400
+ }, [disabled, fieldValueManager, getInputContainerClickHandler, getInputContentFocusHandler, handleInputContentDragOver, handleInputContentInput, handleInputContentMouseUp, handleInputContentPaste, id, isContainerEditable, readOnly, sectionsValueBoundaries, state.sections, translations, utils, value]);
381
401
  const handleValueStrChange = (0, _useEventCallback.default)(event => {
382
402
  updateValueFromValueStr(event.target.value);
383
403
  });
@@ -391,29 +411,73 @@ const useFieldV7TextField = params => {
391
411
  }
392
412
  }, []); // eslint-disable-line react-hooks/exhaustive-deps
393
413
 
394
- return {
395
- interactions,
396
- returnedValue: {
397
- // Forwarded
398
- autoFocus,
399
- readOnly,
400
- focused: focusedProp ?? focused,
401
- sectionListRef: handleSectionListRef,
402
- onBlur: handleContainerBlur,
403
- onClick: handleContainerClick,
404
- onFocus: handleContainerFocus,
405
- onInput: handleContainerInput,
406
- onPaste: handleContainerPaste,
407
- // Additional
408
- enableAccessibleFieldDOMStructure: true,
409
- elements,
410
- // TODO v7: Try to set to undefined when there is a section selected.
411
- tabIndex: parsedSelectedSections === 0 ? -1 : 0,
412
- contentEditable: isContainerEditable,
413
- value: valueStr,
414
- onChange: handleValueStrChange,
415
- areAllSectionsEmpty
414
+ (0, _useEnhancedEffect.default)(() => {
415
+ if (!focused || !sectionListRef.current) {
416
+ return;
417
+ }
418
+ if (parsedSelectedSections === 'all') {
419
+ sectionListRef.current.getRoot().focus();
420
+ } else if (typeof parsedSelectedSections === 'number') {
421
+ const domElement = sectionListRef.current.getSectionContent(parsedSelectedSections);
422
+ if (domElement) {
423
+ domElement.focus();
424
+ }
416
425
  }
417
- };
426
+ }, [parsedSelectedSections, focused]);
427
+ (0, _useEnhancedEffect.default)(() => {
428
+ syncSelectionToDOM();
429
+ });
430
+ React.useImperativeHandle(unstableFieldRef, () => ({
431
+ getSections: () => state.sections,
432
+ getActiveSectionIndex: () => getActiveSectionIndex(sectionListRef),
433
+ setSelectedSections: newSelectedSections => {
434
+ if (!sectionListRef.current) {
435
+ return;
436
+ }
437
+ const newParsedSelectedSections = (0, _useField.parseSelectedSections)(newSelectedSections, state.sections);
438
+ const newActiveSectionIndex = newParsedSelectedSections === 'all' ? 0 : newParsedSelectedSections;
439
+ setFocused(newActiveSectionIndex !== null);
440
+ setSelectedSections(newSelectedSections);
441
+ },
442
+ focusField,
443
+ isFieldFocused: () => isFieldFocused(sectionListRef)
444
+ }));
445
+ return (0, _extends2.default)({}, forwardedProps, {
446
+ error,
447
+ clearable: Boolean(clearable && !areAllSectionsEmpty && !readOnly && !disabled),
448
+ focused: focusedProp ?? focused,
449
+ sectionListRef: handleSectionListRef,
450
+ onBlur: handleContainerBlur,
451
+ onClick: handleContainerClick,
452
+ onFocus: handleContainerFocus,
453
+ onInput: handleContainerInput,
454
+ onPaste: handleContainerPaste,
455
+ onKeyDown: wrappedHandleContainerKeyDown,
456
+ onClear: handleClear,
457
+ // Additional
458
+ enableAccessibleFieldDOMStructure: true,
459
+ elements,
460
+ // TODO v7: Try to set to undefined when there is a section selected.
461
+ tabIndex: parsedSelectedSections === 0 ? -1 : 0,
462
+ contentEditable: isContainerEditable,
463
+ value: valueStr,
464
+ onChange: handleValueStrChange,
465
+ areAllSectionsEmpty,
466
+ disabled,
467
+ readOnly,
468
+ autoFocus,
469
+ openPickerAriaLabel
470
+ });
418
471
  };
419
- exports.useFieldV7TextField = useFieldV7TextField;
472
+ exports.useFieldV7TextField = useFieldV7TextField;
473
+ function getActiveSectionIndex(sectionListRef) {
474
+ const activeElement = (0, _utils.getActiveElement)(document);
475
+ if (!activeElement || !sectionListRef.current || !sectionListRef.current.getRoot().contains(activeElement)) {
476
+ return null;
477
+ }
478
+ return sectionListRef.current.getSectionIndexFromDOMElement(activeElement);
479
+ }
480
+ function isFieldFocused(sectionListRef) {
481
+ const activeElement = (0, _utils.getActiveElement)(document);
482
+ return !!sectionListRef.current && sectionListRef.current.getRoot().contains(activeElement);
483
+ }
@@ -89,6 +89,7 @@ export interface UsePickerNonStaticProps extends Omit<PickerFieldPrivateContextV
89
89
  format?: string;
90
90
  /**
91
91
  * If `true`, the button to open the Picker will not be rendered (it will only render the field).
92
+ * @deprecated Use the [field component](https://next.mui.com/x/react-date-pickers/fields/) instead.
92
93
  * @default false
93
94
  */
94
95
  disableOpenPicker?: boolean;
@@ -26,7 +26,7 @@ export { DAY_MARGIN, DIALOG_WIDTH, VIEW_HEIGHT, MULTI_SECTION_CLOCK_SECTION_WIDT
26
26
  export { useControlledValue } from "./hooks/useControlledValue.js";
27
27
  export type { DesktopOnlyPickerProps } from './hooks/useDesktopPicker';
28
28
  export { useField, useFieldInternalPropsWithDefaults, createDateStrForV7HiddenInputFromSections, createDateStrForV6InputFromSections } from "./hooks/useField/index.js";
29
- export type { UseFieldInternalProps, UseFieldParams, UseFieldResponse, FieldValueManager, FieldChangeHandler, FieldChangeHandlerContext } from './hooks/useField';
29
+ export type { UseFieldInternalProps, UseFieldParameters, UseFieldReturnValue, FieldValueManager, FieldChangeHandler, FieldChangeHandlerContext } from './hooks/useField';
30
30
  export { useFieldOwnerState } from "./hooks/useFieldOwnerState.js";
31
31
  export type { MobileOnlyPickerProps } from './hooks/useMobilePicker';
32
32
  export { useNullableFieldPrivateContext } from "./hooks/useNullableFieldPrivateContext.js";
@@ -65,6 +65,7 @@ export type { DayCalendarProps, DayCalendarSlots, DayCalendarSlotProps, Exported
65
65
  export type { ExportedDateCalendarProps } from '../DateCalendar/DateCalendar.types';
66
66
  export { useCalendarState } from "../DateCalendar/useCalendarState.js";
67
67
  export { DateTimePickerToolbarOverrideContext } from "../DateTimePicker/DateTimePickerToolbar.js";
68
+ export { usePickerDayOwnerState } from "../PickersDay/usePickerDayOwnerState.js";
68
69
  export { getDateFieldInternalPropsDefaults } from "../managers/useDateManager.js";
69
70
  export { getTimeFieldInternalPropsDefaults } from "../managers/useTimeManager.js";
70
71
  export { getDateTimeFieldInternalPropsDefaults } from "../managers/useDateTimeManager.js";
@@ -363,6 +363,12 @@ Object.defineProperty(exports, "usePicker", {
363
363
  return _usePicker.usePicker;
364
364
  }
365
365
  });
366
+ Object.defineProperty(exports, "usePickerDayOwnerState", {
367
+ enumerable: true,
368
+ get: function () {
369
+ return _usePickerDayOwnerState.usePickerDayOwnerState;
370
+ }
371
+ });
366
372
  Object.defineProperty(exports, "usePickerPrivateContext", {
367
373
  enumerable: true,
368
374
  get: function () {
@@ -440,6 +446,7 @@ var _views = require("./utils/views");
440
446
  var _DayCalendar = require("../DateCalendar/DayCalendar");
441
447
  var _useCalendarState = require("../DateCalendar/useCalendarState");
442
448
  var _DateTimePickerToolbar = require("../DateTimePicker/DateTimePickerToolbar");
449
+ var _usePickerDayOwnerState = require("../PickersDay/usePickerDayOwnerState");
443
450
  var _useDateManager = require("../managers/useDateManager");
444
451
  var _useTimeManager = require("../managers/useTimeManager");
445
452
  var _useDateTimeManager = require("../managers/useDateTimeManager");
@@ -37,13 +37,13 @@ function useDateManager(parameters = {}) {
37
37
  internal_useOpenPickerButtonAriaLabel: useOpenPickerButtonAriaLabel
38
38
  }), [enableAccessibleFieldDOMStructure]);
39
39
  }
40
- function useOpenPickerButtonAriaLabel() {
40
+ function useOpenPickerButtonAriaLabel(value) {
41
41
  const utils = (0, _useUtils.useUtils)();
42
42
  const translations = (0, _usePickerTranslations.usePickerTranslations)();
43
- return React.useCallback(value => {
43
+ return React.useMemo(() => {
44
44
  const formattedValue = utils.isValid(value) ? utils.format(value, 'fullDate') : null;
45
45
  return translations.openDatePickerDialogue(formattedValue);
46
- }, [translations, utils]);
46
+ }, [value, translations, utils]);
47
47
  }
48
48
 
49
49
  /**
@@ -37,13 +37,13 @@ function useDateTimeManager(parameters = {}) {
37
37
  internal_useOpenPickerButtonAriaLabel: useOpenPickerButtonAriaLabel
38
38
  }), [enableAccessibleFieldDOMStructure]);
39
39
  }
40
- function useOpenPickerButtonAriaLabel() {
40
+ function useOpenPickerButtonAriaLabel(value) {
41
41
  const utils = (0, _useUtils.useUtils)();
42
42
  const translations = (0, _usePickerTranslations.usePickerTranslations)();
43
- return React.useCallback(value => {
43
+ return React.useMemo(() => {
44
44
  const formattedValue = utils.isValid(value) ? utils.format(value, 'fullDate') : null;
45
45
  return translations.openDatePickerDialogue(formattedValue);
46
- }, [translations, utils]);
46
+ }, [value, translations, utils]);
47
47
  }
48
48
 
49
49
  /**
@@ -36,14 +36,14 @@ function useTimeManager(parameters = {}) {
36
36
  }), [ampm, enableAccessibleFieldDOMStructure]);
37
37
  }
38
38
  function createUseOpenPickerButtonAriaLabel(ampm) {
39
- return function useOpenPickerButtonAriaLabel() {
39
+ return function useOpenPickerButtonAriaLabel(value) {
40
40
  const utils = (0, _useUtils.useUtils)();
41
41
  const translations = (0, _usePickerTranslations.usePickerTranslations)();
42
- return React.useCallback(value => {
42
+ return React.useMemo(() => {
43
43
  const formatKey = ampm ?? utils.is12HourCycleInCurrentLocale() ? 'fullTime12h' : 'fullTime24h';
44
44
  const formattedValue = utils.isValid(value) ? utils.format(value, formatKey) : null;
45
45
  return translations.openTimePickerDialogue(formattedValue);
46
- }, [translations, utils]);
46
+ }, [value, translations, utils]);
47
47
  };
48
48
  }
49
49
 
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { TextFieldProps } from '@mui/material/TextField';
3
3
  import type { ExportedPickersSectionListProps } from '../PickersSectionList';
4
- import type { UseFieldInternalProps, UseFieldResponse } from '../internals/hooks/useField';
4
+ import type { UseFieldInternalProps, UseFieldReturnValue } from '../internals/hooks/useField';
5
5
  import type { PickersTextFieldProps } from '../PickersTextField';
6
6
  import { BaseSingleInputFieldProps, FieldRangeSection, PickerRangeValue, PickerValidValue } from "../internals/models/index.js";
7
7
  import { PickerOwnerState } from "./pickers.js";
@@ -131,7 +131,7 @@ export type PickerFieldSlotProps<TValue extends PickerValidValue, TEnableAccessi
131
131
  * Props the text field receives when used inside a single input Picker.
132
132
  * Only contains what the MUI components are passing to the text field, not what users can pass using the `props.slotProps.field` and `props.slotProps.textField`.
133
133
  */
134
- export type BaseSingleInputPickersTextFieldProps<TEnableAccessibleFieldDOMStructure extends boolean> = Omit<UseFieldResponse<TEnableAccessibleFieldDOMStructure, BaseSingleInputFieldProps>, 'slots' | 'slotProps' | 'clearable' | 'onClear' | 'openPickerButtonPosition' | 'clearButtonPosition' | 'openPickerAriaLabel'>;
134
+ export type BaseSingleInputPickersTextFieldProps<TEnableAccessibleFieldDOMStructure extends boolean> = Omit<UseFieldReturnValue<TEnableAccessibleFieldDOMStructure, BaseSingleInputFieldProps>, 'slots' | 'slotProps' | 'clearable' | 'onClear' | 'openPickerButtonPosition' | 'clearButtonPosition' | 'openPickerAriaLabel'>;
135
135
  /**
136
136
  * Props the built-in text field component can receive.
137
137
  */
@@ -72,9 +72,10 @@ export interface PickerManager<TValue extends PickerValidValue, TEnableAccessibl
72
72
  internal_applyDefaultsToFieldInternalProps: (parameters: ApplyDefaultsToFieldInternalPropsParameters<TFieldInternalProps>) => UseFieldInternalProps<TValue, TEnableAccessibleFieldDOMStructure, TError> & TValidationProps;
73
73
  /**
74
74
  * Returns a hook that creates the aria-label to apply on the button that opens the Picker.
75
- * @returns {(value: TValue) => string} The method to create the aria-label to apply on the button that opens the Picker.
75
+ * @param {TValue} value The value of the Picker.
76
+ * @returns {string} The aria-label to apply on the button that opens the Picker.
76
77
  */
77
- internal_useOpenPickerButtonAriaLabel: () => (value: TValue) => string;
78
+ internal_useOpenPickerButtonAriaLabel: (value: TValue) => string;
78
79
  }
79
80
  interface ApplyDefaultsToFieldInternalPropsParameters<TFieldInternalProps extends {}> extends UseLocalizationContextReturnValue {
80
81
  internalProps: TFieldInternalProps;
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { DefaultizedProps, SlotComponentPropsFromProps } from '@mui/x-internals/types';
3
- import { PickersDayProps, ExportedPickersDayProps } from "../PickersDay/PickersDay.js";
3
+ import { PickerDayOwnerState, PickersDayProps } from "../PickersDay/index.js";
4
+ import { ExportedPickersDayProps } from "../PickersDay/PickersDay.types.js";
4
5
  import { PickerOnChangeFn } from "../internals/hooks/useViews.js";
5
6
  import { SlideDirection, SlideTransitionProps } from "./PickersSlideTransition.js";
6
7
  import { BaseDateValidationProps, DayValidationProps, MonthValidationProps, YearValidationProps } from "../internals/models/validation.js";
7
8
  import { DayCalendarClasses } from "./dayCalendarClasses.js";
8
- import { PickerOwnerState, PickerValidDate, TimezoneProps } from "../models/index.js";
9
+ import { PickerValidDate, TimezoneProps } from "../models/index.js";
9
10
  import { FormProps } from "../internals/models/formProps.js";
10
11
  export interface DayCalendarSlots {
11
12
  /**
@@ -18,11 +19,6 @@ export interface DayCalendarSlots {
18
19
  export interface DayCalendarSlotProps {
19
20
  day?: SlotComponentPropsFromProps<PickersDayProps, {}, PickerDayOwnerState>;
20
21
  }
21
- export interface PickerDayOwnerState extends PickerOwnerState {
22
- isDaySelected: boolean;
23
- isDayDisabled: boolean;
24
- day: PickerValidDate;
25
- }
26
22
  export interface ExportedDayCalendarProps extends ExportedPickersDayProps {
27
23
  /**
28
24
  * If `true`, calls `renderLoading` instead of rendering the day calendar.