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

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 (237) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/DateCalendar/DateCalendar.js +4 -8
  3. package/DateCalendar/DayCalendar.d.ts +3 -7
  4. package/DateCalendar/DayCalendar.js +18 -10
  5. package/DateCalendar/index.d.ts +0 -1
  6. package/DateField/useDateField.d.ts +1 -1
  7. package/DateField/useDateField.js +2 -16
  8. package/DatePicker/DatePicker.js +1 -0
  9. package/DatePicker/shared.js +3 -9
  10. package/DateTimeField/useDateTimeField.d.ts +1 -1
  11. package/DateTimeField/useDateTimeField.js +2 -16
  12. package/DateTimePicker/DateTimePicker.js +1 -0
  13. package/DateTimePicker/shared.js +3 -13
  14. package/DesktopDatePicker/DesktopDatePicker.js +1 -0
  15. package/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  16. package/DesktopTimePicker/DesktopTimePicker.js +1 -0
  17. package/MobileDatePicker/MobileDatePicker.js +1 -0
  18. package/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  19. package/MobileTimePicker/MobileTimePicker.js +1 -0
  20. package/MonthCalendar/MonthCalendar.js +4 -9
  21. package/PickersDay/PickersDay.d.ts +1 -72
  22. package/PickersDay/PickersDay.js +30 -28
  23. package/PickersDay/PickersDay.types.d.ts +114 -0
  24. package/PickersDay/PickersDay.types.js +5 -0
  25. package/PickersDay/index.d.ts +1 -1
  26. package/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  27. package/PickersDay/usePickerDayOwnerState.js +40 -0
  28. package/PickersSectionList/PickersSectionList.d.ts +1 -1
  29. package/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  30. package/TimeField/useTimeField.d.ts +1 -1
  31. package/TimeField/useTimeField.js +2 -16
  32. package/TimePicker/TimePicker.js +1 -0
  33. package/TimePicker/shared.js +3 -3
  34. package/YearCalendar/YearCalendar.js +4 -10
  35. package/esm/DateCalendar/DateCalendar.js +6 -10
  36. package/esm/DateCalendar/DayCalendar.d.ts +3 -7
  37. package/esm/DateCalendar/DayCalendar.js +18 -10
  38. package/esm/DateCalendar/index.d.ts +0 -1
  39. package/esm/DateField/useDateField.d.ts +1 -1
  40. package/esm/DateField/useDateField.js +3 -17
  41. package/esm/DatePicker/DatePicker.js +1 -0
  42. package/esm/DatePicker/shared.js +3 -9
  43. package/esm/DateTimeField/useDateTimeField.d.ts +1 -1
  44. package/esm/DateTimeField/useDateTimeField.js +3 -17
  45. package/esm/DateTimePicker/DateTimePicker.js +1 -0
  46. package/esm/DateTimePicker/shared.js +4 -14
  47. package/esm/DesktopDatePicker/DesktopDatePicker.js +1 -0
  48. package/esm/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  49. package/esm/DesktopTimePicker/DesktopTimePicker.js +1 -0
  50. package/esm/MobileDatePicker/MobileDatePicker.js +1 -0
  51. package/esm/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  52. package/esm/MobileTimePicker/MobileTimePicker.js +1 -0
  53. package/esm/MonthCalendar/MonthCalendar.js +6 -11
  54. package/esm/PickersDay/PickersDay.d.ts +1 -72
  55. package/esm/PickersDay/PickersDay.js +30 -28
  56. package/esm/PickersDay/PickersDay.types.d.ts +114 -0
  57. package/esm/PickersDay/PickersDay.types.js +1 -0
  58. package/esm/PickersDay/index.d.ts +1 -1
  59. package/esm/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  60. package/esm/PickersDay/usePickerDayOwnerState.js +32 -0
  61. package/esm/PickersSectionList/PickersSectionList.d.ts +1 -1
  62. package/esm/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  63. package/esm/TimeField/useTimeField.d.ts +1 -1
  64. package/esm/TimeField/useTimeField.js +3 -17
  65. package/esm/TimePicker/TimePicker.js +1 -0
  66. package/esm/TimePicker/shared.js +3 -3
  67. package/esm/YearCalendar/YearCalendar.js +5 -11
  68. package/esm/hooks/useSplitFieldProps.d.ts +1 -1
  69. package/esm/index.js +1 -1
  70. package/esm/internals/components/PickerFieldUI.d.ts +5 -5
  71. package/esm/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  72. package/esm/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  73. package/esm/internals/hooks/useField/index.d.ts +1 -1
  74. package/esm/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  75. package/esm/internals/hooks/useField/syncSelectionToDOM.js +50 -0
  76. package/esm/internals/hooks/useField/useField.d.ts +2 -4
  77. package/esm/internals/hooks/useField/useField.js +5 -229
  78. package/esm/internals/hooks/useField/useField.types.d.ts +55 -68
  79. package/esm/internals/hooks/useField/useField.utils.d.ts +3 -8
  80. package/esm/internals/hooks/useField/useField.utils.js +7 -149
  81. package/esm/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  82. package/esm/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  83. package/esm/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  84. package/esm/internals/hooks/useField/useFieldHiddenInputProps.js +31 -0
  85. package/esm/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  86. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  87. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.js +205 -0
  88. package/esm/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  89. package/esm/internals/hooks/useField/useFieldRootProps.js +150 -0
  90. package/esm/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  91. package/esm/internals/hooks/useField/useFieldSectionContainerProps.js +29 -0
  92. package/esm/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  93. package/esm/internals/hooks/useField/useFieldSectionContentProps.js +226 -0
  94. package/esm/internals/hooks/useField/useFieldState.d.ts +23 -13
  95. package/esm/internals/hooks/useField/useFieldState.js +103 -30
  96. package/esm/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  97. package/esm/internals/hooks/useField/useFieldV6TextField.js +202 -135
  98. package/esm/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  99. package/esm/internals/hooks/useField/useFieldV7TextField.js +200 -367
  100. package/esm/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  101. package/esm/internals/index.d.ts +6 -5
  102. package/esm/internals/index.js +4 -3
  103. package/esm/locales/deDE.js +2 -3
  104. package/esm/managers/useDateManager.d.ts +4 -13
  105. package/esm/managers/useDateManager.js +21 -31
  106. package/esm/managers/useDateTimeManager.d.ts +4 -13
  107. package/esm/managers/useDateTimeManager.js +26 -36
  108. package/esm/managers/useTimeManager.d.ts +4 -13
  109. package/esm/managers/useTimeManager.js +17 -27
  110. package/esm/models/fields.d.ts +2 -2
  111. package/esm/models/manager.d.ts +6 -10
  112. package/esm/validation/validateDate.js +3 -4
  113. package/hooks/useSplitFieldProps.d.ts +1 -1
  114. package/index.js +1 -1
  115. package/internals/components/PickerFieldUI.d.ts +5 -5
  116. package/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  117. package/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  118. package/internals/hooks/useField/index.d.ts +1 -1
  119. package/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  120. package/internals/hooks/useField/syncSelectionToDOM.js +56 -0
  121. package/internals/hooks/useField/useField.d.ts +2 -4
  122. package/internals/hooks/useField/useField.js +5 -231
  123. package/internals/hooks/useField/useField.types.d.ts +55 -68
  124. package/internals/hooks/useField/useField.utils.d.ts +3 -8
  125. package/internals/hooks/useField/useField.utils.js +9 -154
  126. package/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  127. package/internals/hooks/useField/useFieldCharacterEditing.js +41 -59
  128. package/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  129. package/internals/hooks/useField/useFieldHiddenInputProps.js +39 -0
  130. package/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  131. package/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  132. package/internals/hooks/useField/useFieldRootHandleKeyDown.js +211 -0
  133. package/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  134. package/internals/hooks/useField/useFieldRootProps.js +156 -0
  135. package/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  136. package/internals/hooks/useField/useFieldSectionContainerProps.js +37 -0
  137. package/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  138. package/internals/hooks/useField/useFieldSectionContentProps.js +234 -0
  139. package/internals/hooks/useField/useFieldState.d.ts +23 -13
  140. package/internals/hooks/useField/useFieldState.js +102 -29
  141. package/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  142. package/internals/hooks/useField/useFieldV6TextField.js +202 -135
  143. package/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  144. package/internals/hooks/useField/useFieldV7TextField.js +200 -367
  145. package/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  146. package/internals/index.d.ts +6 -5
  147. package/internals/index.js +25 -18
  148. package/locales/deDE.js +2 -3
  149. package/managers/useDateManager.d.ts +4 -13
  150. package/managers/useDateManager.js +21 -31
  151. package/managers/useDateTimeManager.d.ts +4 -13
  152. package/managers/useDateTimeManager.js +26 -36
  153. package/managers/useTimeManager.d.ts +4 -13
  154. package/managers/useTimeManager.js +18 -28
  155. package/models/fields.d.ts +2 -2
  156. package/models/manager.d.ts +6 -10
  157. package/modern/DateCalendar/DateCalendar.js +6 -10
  158. package/modern/DateCalendar/DayCalendar.d.ts +3 -7
  159. package/modern/DateCalendar/DayCalendar.js +18 -10
  160. package/modern/DateCalendar/index.d.ts +0 -1
  161. package/modern/DateField/useDateField.d.ts +1 -1
  162. package/modern/DateField/useDateField.js +3 -17
  163. package/modern/DatePicker/DatePicker.js +1 -0
  164. package/modern/DatePicker/shared.js +3 -9
  165. package/modern/DateTimeField/useDateTimeField.d.ts +1 -1
  166. package/modern/DateTimeField/useDateTimeField.js +3 -17
  167. package/modern/DateTimePicker/DateTimePicker.js +1 -0
  168. package/modern/DateTimePicker/shared.js +4 -14
  169. package/modern/DesktopDatePicker/DesktopDatePicker.js +1 -0
  170. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  171. package/modern/DesktopTimePicker/DesktopTimePicker.js +1 -0
  172. package/modern/MobileDatePicker/MobileDatePicker.js +1 -0
  173. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  174. package/modern/MobileTimePicker/MobileTimePicker.js +1 -0
  175. package/modern/MonthCalendar/MonthCalendar.js +6 -11
  176. package/modern/PickersDay/PickersDay.d.ts +1 -72
  177. package/modern/PickersDay/PickersDay.js +30 -28
  178. package/modern/PickersDay/PickersDay.types.d.ts +114 -0
  179. package/modern/PickersDay/PickersDay.types.js +1 -0
  180. package/modern/PickersDay/index.d.ts +1 -1
  181. package/modern/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  182. package/modern/PickersDay/usePickerDayOwnerState.js +32 -0
  183. package/modern/PickersSectionList/PickersSectionList.d.ts +1 -1
  184. package/modern/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  185. package/modern/TimeField/useTimeField.d.ts +1 -1
  186. package/modern/TimeField/useTimeField.js +3 -17
  187. package/modern/TimePicker/TimePicker.js +1 -0
  188. package/modern/TimePicker/shared.js +3 -3
  189. package/modern/YearCalendar/YearCalendar.js +5 -11
  190. package/modern/hooks/useSplitFieldProps.d.ts +1 -1
  191. package/modern/index.js +1 -1
  192. package/modern/internals/components/PickerFieldUI.d.ts +5 -5
  193. package/modern/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  194. package/modern/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  195. package/modern/internals/hooks/useField/index.d.ts +1 -1
  196. package/modern/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  197. package/modern/internals/hooks/useField/syncSelectionToDOM.js +50 -0
  198. package/modern/internals/hooks/useField/useField.d.ts +2 -4
  199. package/modern/internals/hooks/useField/useField.js +5 -229
  200. package/modern/internals/hooks/useField/useField.types.d.ts +55 -68
  201. package/modern/internals/hooks/useField/useField.utils.d.ts +3 -8
  202. package/modern/internals/hooks/useField/useField.utils.js +7 -149
  203. package/modern/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  204. package/modern/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  205. package/modern/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  206. package/modern/internals/hooks/useField/useFieldHiddenInputProps.js +31 -0
  207. package/modern/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  208. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  209. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.js +205 -0
  210. package/modern/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  211. package/modern/internals/hooks/useField/useFieldRootProps.js +150 -0
  212. package/modern/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  213. package/modern/internals/hooks/useField/useFieldSectionContainerProps.js +29 -0
  214. package/modern/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  215. package/modern/internals/hooks/useField/useFieldSectionContentProps.js +226 -0
  216. package/modern/internals/hooks/useField/useFieldState.d.ts +23 -13
  217. package/modern/internals/hooks/useField/useFieldState.js +103 -30
  218. package/modern/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  219. package/modern/internals/hooks/useField/useFieldV6TextField.js +202 -135
  220. package/modern/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  221. package/modern/internals/hooks/useField/useFieldV7TextField.js +200 -367
  222. package/modern/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  223. package/modern/internals/index.d.ts +6 -5
  224. package/modern/internals/index.js +4 -3
  225. package/modern/locales/deDE.js +2 -3
  226. package/modern/managers/useDateManager.d.ts +4 -13
  227. package/modern/managers/useDateManager.js +21 -31
  228. package/modern/managers/useDateTimeManager.d.ts +4 -13
  229. package/modern/managers/useDateTimeManager.js +26 -36
  230. package/modern/managers/useTimeManager.d.ts +4 -13
  231. package/modern/managers/useTimeManager.js +17 -27
  232. package/modern/models/fields.d.ts +2 -2
  233. package/modern/models/manager.d.ts +6 -10
  234. package/modern/validation/validateDate.js +3 -4
  235. package/package.json +2 -2
  236. package/tsconfig.build.tsbuildinfo +1 -1
  237. package/validation/validateDate.js +3 -4
@@ -1,23 +1,5 @@
1
- import { PickersTimezone, InferFieldSection } from "../../../models/index.js";
2
- import { FieldSectionsValueBoundaries } from "./useField.types.js";
3
- import { UpdateSectionValueParams } from "./useFieldState.js";
1
+ import { UseFieldStateReturnValue } from "./useFieldState.js";
4
2
  import { PickerValidValue } from "../../models/index.js";
5
- export interface ApplyCharacterEditingParams {
6
- keyPressed: string;
7
- sectionIndex: number;
8
- }
9
- interface UseFieldCharacterEditingParams<TValue extends PickerValidValue> {
10
- sections: InferFieldSection<TValue>[];
11
- updateSectionValue: (params: UpdateSectionValueParams<TValue>) => void;
12
- sectionsValueBoundaries: FieldSectionsValueBoundaries;
13
- localizedDigits: string[];
14
- setTempAndroidValueStr: (newValue: string | null) => void;
15
- timezone: PickersTimezone;
16
- }
17
- export interface UseFieldCharacterEditingResponse {
18
- applyCharacterEditing: (params: ApplyCharacterEditingParams) => void;
19
- resetCharacterQuery: () => void;
20
- }
21
3
  /**
22
4
  * Update the active section value when the user pressed a key that is not a navigation key (arrow key for example).
23
5
  * This hook has two main editing behaviors
@@ -26,11 +8,22 @@ export interface UseFieldCharacterEditingResponse {
26
8
  * 2. The letter editing when the user presses another key
27
9
  */
28
10
  export declare const useFieldCharacterEditing: <TValue extends PickerValidValue>({
29
- sections,
30
- updateSectionValue,
31
- sectionsValueBoundaries,
32
- localizedDigits,
33
- setTempAndroidValueStr,
34
- timezone
35
- }: UseFieldCharacterEditingParams<TValue>) => UseFieldCharacterEditingResponse;
11
+ stateResponse: {
12
+ localizedDigits,
13
+ sectionsValueBoundaries,
14
+ state,
15
+ timezone,
16
+ setCharacterQuery,
17
+ setTempAndroidValueStr,
18
+ updateSectionValue
19
+ }
20
+ }: UseFieldCharacterEditingParameters<TValue>) => UseFieldCharacterEditingReturnValue;
21
+ export interface ApplyCharacterEditingParameters {
22
+ keyPressed: string;
23
+ sectionIndex: number;
24
+ }
25
+ interface UseFieldCharacterEditingParameters<TValue extends PickerValidValue> {
26
+ stateResponse: UseFieldStateReturnValue<TValue>;
27
+ }
28
+ export type UseFieldCharacterEditingReturnValue = (params: ApplyCharacterEditingParameters) => void;
36
29
  export {};
@@ -1,39 +1,14 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.useFieldCharacterEditing = void 0;
9
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var React = _interopRequireWildcard(require("react"));
11
9
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
12
10
  var _useUtils = require("../useUtils");
13
11
  var _useField = require("./useField.utils");
14
- /**
15
- * The letter editing and the numeric editing each define a `CharacterEditingApplier`.
16
- * This function decides what the new section value should be and if the focus should switch to the next section.
17
- *
18
- * If it returns `null`, then the section value is not updated and the focus does not move.
19
- */
20
-
21
- /**
22
- * Function called by `applyQuery` which decides:
23
- * - what is the new section value ?
24
- * - should the query used to get this value be stored for the next key press ?
25
- *
26
- * If it returns `{ sectionValue: string; shouldGoToNextSection: boolean }`,
27
- * Then we store the query and update the section with the new value.
28
- *
29
- * If it returns `{ saveQuery: true` },
30
- * Then we store the query and don't update the section.
31
- *
32
- * If it returns `{ saveQuery: false },
33
- * Then we do nothing.
34
- */
35
-
36
- const QUERY_LIFE_DURATION_MS = 5000;
37
12
  const isQueryResponseWithoutValue = response => response.saveQuery != null;
38
13
 
39
14
  /**
@@ -44,44 +19,33 @@ const isQueryResponseWithoutValue = response => response.saveQuery != null;
44
19
  * 2. The letter editing when the user presses another key
45
20
  */
46
21
  const useFieldCharacterEditing = ({
47
- sections,
48
- updateSectionValue,
49
- sectionsValueBoundaries,
50
- localizedDigits,
51
- setTempAndroidValueStr,
52
- timezone
22
+ stateResponse: {
23
+ // States and derived states
24
+ localizedDigits,
25
+ sectionsValueBoundaries,
26
+ state,
27
+ timezone,
28
+ // Methods to update the states
29
+ setCharacterQuery,
30
+ setTempAndroidValueStr,
31
+ updateSectionValue
32
+ }
53
33
  }) => {
54
34
  const utils = (0, _useUtils.useUtils)();
55
- const [query, setQuery] = React.useState(null);
56
- const resetQuery = (0, _useEventCallback.default)(() => setQuery(null));
57
- React.useEffect(() => {
58
- if (query != null && sections[query.sectionIndex]?.type !== query.sectionType) {
59
- resetQuery();
60
- }
61
- }, [sections, query, resetQuery]);
62
- React.useEffect(() => {
63
- if (query != null) {
64
- const timeout = setTimeout(() => resetQuery(), QUERY_LIFE_DURATION_MS);
65
- return () => {
66
- clearTimeout(timeout);
67
- };
68
- }
69
- return () => {};
70
- }, [query, resetQuery]);
71
35
  const applyQuery = ({
72
36
  keyPressed,
73
37
  sectionIndex
74
38
  }, getFirstSectionValueMatchingWithQuery, isValidQueryValue) => {
75
39
  const cleanKeyPressed = keyPressed.toLowerCase();
76
- const activeSection = sections[sectionIndex];
40
+ const activeSection = state.sections[sectionIndex];
77
41
 
78
42
  // The current query targets the section being editing
79
43
  // We can try to concatenate the value
80
- if (query != null && (!isValidQueryValue || isValidQueryValue(query.value)) && query.sectionIndex === sectionIndex) {
81
- const concatenatedQueryValue = `${query.value}${cleanKeyPressed}`;
44
+ if (state.characterQuery != null && (!isValidQueryValue || isValidQueryValue(state.characterQuery.value)) && state.characterQuery.sectionIndex === sectionIndex) {
45
+ const concatenatedQueryValue = `${state.characterQuery.value}${cleanKeyPressed}`;
82
46
  const queryResponse = getFirstSectionValueMatchingWithQuery(concatenatedQueryValue, activeSection);
83
47
  if (!isQueryResponseWithoutValue(queryResponse)) {
84
- setQuery({
48
+ setCharacterQuery({
85
49
  sectionIndex,
86
50
  value: concatenatedQueryValue,
87
51
  sectionType: activeSection.type
@@ -91,10 +55,10 @@ const useFieldCharacterEditing = ({
91
55
  }
92
56
  const queryResponse = getFirstSectionValueMatchingWithQuery(cleanKeyPressed, activeSection);
93
57
  if (isQueryResponseWithoutValue(queryResponse) && !queryResponse.saveQuery) {
94
- resetQuery();
58
+ setCharacterQuery(null);
95
59
  return null;
96
60
  }
97
- setQuery({
61
+ setCharacterQuery({
98
62
  sectionIndex,
99
63
  value: cleanKeyPressed,
100
64
  sectionType: activeSection.type
@@ -242,8 +206,8 @@ const useFieldCharacterEditing = ({
242
206
  };
243
207
  return applyQuery(params, getFirstSectionValueMatchingWithQuery, queryValue => (0, _useField.isStringNumber)(queryValue, localizedDigits));
244
208
  };
245
- const applyCharacterEditing = (0, _useEventCallback.default)(params => {
246
- const section = sections[params.sectionIndex];
209
+ return (0, _useEventCallback.default)(params => {
210
+ const section = state.sections[params.sectionIndex];
247
211
  const isNumericEditing = (0, _useField.isStringNumber)(params.keyPressed, localizedDigits);
248
212
  const response = isNumericEditing ? applyNumericEditing((0, _extends2.default)({}, params, {
249
213
  keyPressed: (0, _useField.applyLocalizedDigits)(params.keyPressed, localizedDigits)
@@ -258,9 +222,27 @@ const useFieldCharacterEditing = ({
258
222
  shouldGoToNextSection: response.shouldGoToNextSection
259
223
  });
260
224
  });
261
- return {
262
- applyCharacterEditing,
263
- resetCharacterQuery: resetQuery
264
- };
265
225
  };
226
+
227
+ /**
228
+ * The letter editing and the numeric editing each define a `CharacterEditingApplier`.
229
+ * This function decides what the new section value should be and if the focus should switch to the next section.
230
+ *
231
+ * If it returns `null`, then the section value is not updated and the focus does not move.
232
+ */
233
+
234
+ /**
235
+ * Function called by `applyQuery` which decides:
236
+ * - what is the new section value ?
237
+ * - should the query used to get this value be stored for the next key press ?
238
+ *
239
+ * If it returns `{ sectionValue: string; shouldGoToNextSection: boolean }`,
240
+ * Then we store the query and update the section with the new value.
241
+ *
242
+ * If it returns `{ saveQuery: true` },
243
+ * Then we store the query and don't update the section.
244
+ *
245
+ * If it returns `{ saveQuery: false },
246
+ * Then we do nothing.
247
+ */
266
248
  exports.useFieldCharacterEditing = useFieldCharacterEditing;
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { PickerManager } from "../../../models/index.js";
3
+ import { UseFieldStateReturnValue } from "./useFieldState.js";
4
+ /**
5
+ * Generate the props to pass to the hidden input element of the field.
6
+ * It is not used by the non-accessible DOM structure (with an <input /> element for editing).
7
+ * It should be used in the MUI accessible DOM structure and the Base UI implementation.
8
+ * @param {UseFieldHiddenInputPropsParameters} parameters The parameters of the hook.
9
+ * @returns {UseFieldHiddenInputPropsReturnValue} The props to forward to the hidden input element of the field.
10
+ */
11
+ export declare function useFieldHiddenInputProps(parameters: UseFieldHiddenInputPropsParameters): UseFieldHiddenInputPropsReturnValue;
12
+ interface UseFieldHiddenInputPropsParameters {
13
+ manager: PickerManager<any, any, any, any, any>;
14
+ stateResponse: UseFieldStateReturnValue<any>;
15
+ }
16
+ interface UseFieldHiddenInputPropsReturnValue {
17
+ value: string;
18
+ onChange: React.ChangeEventHandler<HTMLInputElement>;
19
+ }
20
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useFieldHiddenInputProps = useFieldHiddenInputProps;
9
+ var React = _interopRequireWildcard(require("react"));
10
+ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
+ /**
12
+ * Generate the props to pass to the hidden input element of the field.
13
+ * It is not used by the non-accessible DOM structure (with an <input /> element for editing).
14
+ * It should be used in the MUI accessible DOM structure and the Base UI implementation.
15
+ * @param {UseFieldHiddenInputPropsParameters} parameters The parameters of the hook.
16
+ * @returns {UseFieldHiddenInputPropsReturnValue} The props to forward to the hidden input element of the field.
17
+ */
18
+ function useFieldHiddenInputProps(parameters) {
19
+ const {
20
+ manager: {
21
+ internal_fieldValueManager: fieldValueManager
22
+ },
23
+ stateResponse: {
24
+ // States and derived states
25
+ areAllSectionsEmpty,
26
+ state,
27
+ // Methods to update the states
28
+ updateValueFromValueStr
29
+ }
30
+ } = parameters;
31
+ const handleChange = (0, _useEventCallback.default)(event => {
32
+ updateValueFromValueStr(event.target.value);
33
+ });
34
+ const valueStr = React.useMemo(() => areAllSectionsEmpty ? '' : fieldValueManager.getV7HiddenInputValueFromSections(state.sections), [areAllSectionsEmpty, state.sections, fieldValueManager]);
35
+ return {
36
+ value: valueStr,
37
+ onChange: handleChange
38
+ };
39
+ }
@@ -9,7 +9,6 @@ exports.useFieldInternalPropsWithDefaults = useFieldInternalPropsWithDefaults;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
12
- var _useUtils = require("../useUtils");
13
12
  var _useNullablePickerContext = require("../useNullablePickerContext");
14
13
  var _useNullableFieldPrivateContext = require("../useNullableFieldPrivateContext");
15
14
  /**
@@ -19,11 +18,12 @@ var _useNullableFieldPrivateContext = require("../useNullableFieldPrivateContext
19
18
  */
20
19
  function useFieldInternalPropsWithDefaults(parameters) {
21
20
  const {
22
- manager,
21
+ manager: {
22
+ internal_useApplyDefaultValuesToFieldInternalProps: useApplyDefaultValuesToFieldInternalProps
23
+ },
23
24
  internalProps,
24
25
  skipContextFieldRefAssignment
25
26
  } = parameters;
26
- const localizationContext = (0, _useUtils.useLocalizationContext)();
27
27
  const pickerContext = (0, _useNullablePickerContext.useNullablePickerContext)();
28
28
  const fieldPrivateContext = (0, _useNullableFieldPrivateContext.useNullableFieldPrivateContext)();
29
29
  const handleFieldRef = (0, _useForkRef.default)(internalProps.unstableFieldRef, skipContextFieldRefAssignment ? null : fieldPrivateContext?.fieldRef);
@@ -34,12 +34,11 @@ function useFieldInternalPropsWithDefaults(parameters) {
34
34
  shouldClose: false
35
35
  });
36
36
  }, [setValue]);
37
- return React.useMemo(() => {
38
- let internalPropsWithDefaultsFromContext = internalProps;
37
+ const internalPropsWithDefaultsFromContext = React.useMemo(() => {
39
38
  // If one of the context is null,
40
39
  // Then the field is used as a standalone component and the other context will be null as well.
41
40
  if (fieldPrivateContext != null && pickerContext != null) {
42
- internalPropsWithDefaultsFromContext = (0, _extends2.default)({
41
+ return (0, _extends2.default)({
43
42
  value: pickerContext.value,
44
43
  onChange: handleChangeFromPicker,
45
44
  timezone: pickerContext.timezone,
@@ -55,8 +54,7 @@ function useFieldInternalPropsWithDefaults(parameters) {
55
54
  unstableFieldRef: handleFieldRef
56
55
  }, internalProps);
57
56
  }
58
- return manager.internal_applyDefaultsToFieldInternalProps((0, _extends2.default)({}, localizationContext, {
59
- internalProps: internalPropsWithDefaultsFromContext
60
- }));
61
- }, [manager, localizationContext, pickerContext, fieldPrivateContext, internalProps, handleChangeFromPicker, handleFieldRef]);
57
+ return internalProps;
58
+ }, [pickerContext, fieldPrivateContext, internalProps, handleChangeFromPicker, handleFieldRef]);
59
+ return useApplyDefaultValuesToFieldInternalProps(internalPropsWithDefaultsFromContext);
62
60
  }
@@ -0,0 +1,16 @@
1
+ import { PickerManager } from "../../../models/index.js";
2
+ import { PickerValidValue } from "../../models/index.js";
3
+ import { UseFieldStateReturnValue } from "./useFieldState.js";
4
+ import { UseFieldInternalProps } from "./useField.types.js";
5
+ /**
6
+ * Returns the `onKeyDown` handler to pass to the root element of the field.
7
+ */
8
+ export declare function useFieldRootHandleKeyDown<TValue extends PickerValidValue>(parameters: UseFieldRootHandleKeyDownParameters<TValue>): (event: React.KeyboardEvent<HTMLSpanElement>) => void;
9
+ interface UseFieldRootHandleKeyDownParameters<TValue extends PickerValidValue> {
10
+ manager: PickerManager<TValue, any, any, any, any>;
11
+ stateResponse: UseFieldStateReturnValue<TValue>;
12
+ internalPropsWithDefaults: UseFieldInternalProps<TValue, any, any> & {
13
+ minutesStep?: number;
14
+ };
15
+ }
16
+ export {};
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useFieldRootHandleKeyDown = useFieldRootHandleKeyDown;
8
+ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
9
+ var _useUtils = require("../useUtils");
10
+ var _useField = require("./useField.utils");
11
+ /**
12
+ * Returns the `onKeyDown` handler to pass to the root element of the field.
13
+ */
14
+ function useFieldRootHandleKeyDown(parameters) {
15
+ const utils = (0, _useUtils.useUtils)();
16
+ const {
17
+ manager: {
18
+ internal_fieldValueManager: fieldValueManager
19
+ },
20
+ internalPropsWithDefaults: {
21
+ minutesStep,
22
+ disabled,
23
+ readOnly
24
+ },
25
+ stateResponse: {
26
+ // States and derived states
27
+ state,
28
+ value,
29
+ activeSectionIndex,
30
+ parsedSelectedSections,
31
+ sectionsValueBoundaries,
32
+ localizedDigits,
33
+ timezone,
34
+ sectionOrder,
35
+ // Methods to update the states
36
+ clearValue,
37
+ clearActiveSection,
38
+ setSelectedSections,
39
+ updateSectionValue
40
+ }
41
+ } = parameters;
42
+ return (0, _useEventCallback.default)(event => {
43
+ if (disabled) {
44
+ return;
45
+ }
46
+
47
+ // eslint-disable-next-line default-case
48
+ switch (true) {
49
+ // Select all
50
+ case (event.ctrlKey || event.metaKey) && String.fromCharCode(event.keyCode) === 'A' && !event.shiftKey && !event.altKey:
51
+ {
52
+ // prevent default to make sure that the next line "select all" while updating
53
+ // the internal state at the same time.
54
+ event.preventDefault();
55
+ setSelectedSections('all');
56
+ break;
57
+ }
58
+
59
+ // Move selection to next section
60
+ case event.key === 'ArrowRight':
61
+ {
62
+ event.preventDefault();
63
+ if (parsedSelectedSections == null) {
64
+ setSelectedSections(sectionOrder.startIndex);
65
+ } else if (parsedSelectedSections === 'all') {
66
+ setSelectedSections(sectionOrder.endIndex);
67
+ } else {
68
+ const nextSectionIndex = sectionOrder.neighbors[parsedSelectedSections].rightIndex;
69
+ if (nextSectionIndex !== null) {
70
+ setSelectedSections(nextSectionIndex);
71
+ }
72
+ }
73
+ break;
74
+ }
75
+
76
+ // Move selection to previous section
77
+ case event.key === 'ArrowLeft':
78
+ {
79
+ event.preventDefault();
80
+ if (parsedSelectedSections == null) {
81
+ setSelectedSections(sectionOrder.endIndex);
82
+ } else if (parsedSelectedSections === 'all') {
83
+ setSelectedSections(sectionOrder.startIndex);
84
+ } else {
85
+ const nextSectionIndex = sectionOrder.neighbors[parsedSelectedSections].leftIndex;
86
+ if (nextSectionIndex !== null) {
87
+ setSelectedSections(nextSectionIndex);
88
+ }
89
+ }
90
+ break;
91
+ }
92
+
93
+ // Reset the value of the selected section
94
+ case event.key === 'Delete':
95
+ {
96
+ event.preventDefault();
97
+ if (readOnly) {
98
+ break;
99
+ }
100
+ if (parsedSelectedSections == null || parsedSelectedSections === 'all') {
101
+ clearValue();
102
+ } else {
103
+ clearActiveSection();
104
+ }
105
+ break;
106
+ }
107
+
108
+ // Increment / decrement the selected section value
109
+ case ['ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'].includes(event.key):
110
+ {
111
+ event.preventDefault();
112
+ if (readOnly || activeSectionIndex == null) {
113
+ break;
114
+ }
115
+
116
+ // if all sections are selected, mark the currently editing one as selected
117
+ if (parsedSelectedSections === 'all') {
118
+ setSelectedSections(activeSectionIndex);
119
+ }
120
+ const activeSection = state.sections[activeSectionIndex];
121
+ const newSectionValue = adjustSectionValue(utils, timezone, activeSection, event.key, sectionsValueBoundaries, localizedDigits, fieldValueManager.getDateFromSection(value, activeSection), {
122
+ minutesStep
123
+ });
124
+ updateSectionValue({
125
+ section: activeSection,
126
+ newSectionValue,
127
+ shouldGoToNextSection: false
128
+ });
129
+ break;
130
+ }
131
+ }
132
+ });
133
+ }
134
+ function getDeltaFromKeyCode(keyCode) {
135
+ switch (keyCode) {
136
+ case 'ArrowUp':
137
+ return 1;
138
+ case 'ArrowDown':
139
+ return -1;
140
+ case 'PageUp':
141
+ return 5;
142
+ case 'PageDown':
143
+ return -5;
144
+ default:
145
+ return 0;
146
+ }
147
+ }
148
+ function adjustSectionValue(utils, timezone, section, keyCode, sectionsValueBoundaries, localizedDigits, activeDate, stepsAttributes) {
149
+ const delta = getDeltaFromKeyCode(keyCode);
150
+ const isStart = keyCode === 'Home';
151
+ const isEnd = keyCode === 'End';
152
+ const shouldSetAbsolute = section.value === '' || isStart || isEnd;
153
+ const adjustDigitSection = () => {
154
+ const sectionBoundaries = sectionsValueBoundaries[section.type]({
155
+ currentDate: activeDate,
156
+ format: section.format,
157
+ contentType: section.contentType
158
+ });
159
+ const getCleanValue = value => (0, _useField.cleanDigitSectionValue)(utils, value, sectionBoundaries, localizedDigits, section);
160
+ const step = section.type === 'minutes' && stepsAttributes?.minutesStep ? stepsAttributes.minutesStep : 1;
161
+ let newSectionValueNumber;
162
+ if (shouldSetAbsolute) {
163
+ if (section.type === 'year' && !isEnd && !isStart) {
164
+ return utils.formatByString(utils.date(undefined, timezone), section.format);
165
+ }
166
+ if (delta > 0 || isStart) {
167
+ newSectionValueNumber = sectionBoundaries.minimum;
168
+ } else {
169
+ newSectionValueNumber = sectionBoundaries.maximum;
170
+ }
171
+ } else {
172
+ const currentSectionValue = parseInt((0, _useField.removeLocalizedDigits)(section.value, localizedDigits), 10);
173
+ newSectionValueNumber = currentSectionValue + delta * step;
174
+ }
175
+ if (newSectionValueNumber % step !== 0) {
176
+ if (delta < 0 || isStart) {
177
+ newSectionValueNumber += step - (step + newSectionValueNumber) % step; // for JS -3 % 5 = -3 (should be 2)
178
+ }
179
+ if (delta > 0 || isEnd) {
180
+ newSectionValueNumber -= newSectionValueNumber % step;
181
+ }
182
+ }
183
+ if (newSectionValueNumber > sectionBoundaries.maximum) {
184
+ return getCleanValue(sectionBoundaries.minimum + (newSectionValueNumber - sectionBoundaries.maximum - 1) % (sectionBoundaries.maximum - sectionBoundaries.minimum + 1));
185
+ }
186
+ if (newSectionValueNumber < sectionBoundaries.minimum) {
187
+ return getCleanValue(sectionBoundaries.maximum - (sectionBoundaries.minimum - newSectionValueNumber - 1) % (sectionBoundaries.maximum - sectionBoundaries.minimum + 1));
188
+ }
189
+ return getCleanValue(newSectionValueNumber);
190
+ };
191
+ const adjustLetterSection = () => {
192
+ const options = (0, _useField.getLetterEditingOptions)(utils, timezone, section.type, section.format);
193
+ if (options.length === 0) {
194
+ return section.value;
195
+ }
196
+ if (shouldSetAbsolute) {
197
+ if (delta > 0 || isStart) {
198
+ return options[0];
199
+ }
200
+ return options[options.length - 1];
201
+ }
202
+ const currentOptionIndex = options.indexOf(section.value);
203
+ const newOptionIndex = (currentOptionIndex + delta) % options.length;
204
+ const clampedIndex = (newOptionIndex + options.length) % options.length;
205
+ return options[clampedIndex];
206
+ };
207
+ if (section.contentType === 'digit' || section.contentType === 'digit-with-letter') {
208
+ return adjustDigitSection();
209
+ }
210
+ return adjustLetterSection();
211
+ }
@@ -0,0 +1,32 @@
1
+ import { PickerManager } from "../../../models/index.js";
2
+ import { UseFieldDOMGetters, UseFieldInternalProps } from "./useField.types.js";
3
+ import { UseFieldStateReturnValue } from "./useFieldState.js";
4
+ import { UseFieldCharacterEditingReturnValue } from "./useFieldCharacterEditing.js";
5
+ /**
6
+ * Generate the props to pass to the root element of the field.
7
+ * It is not used by the non-accessible DOM structure (with an <input /> element for editing).
8
+ * It should be used in the MUI accessible DOM structure and the Base UI implementation.
9
+ * @param {UseFieldRootPropsParameters} parameters The parameters of the hook.
10
+ * @returns {UseFieldRootPropsReturnValue} The props to forward to the root element of the field.
11
+ */
12
+ export declare function useFieldRootProps(parameters: UseFieldRootPropsParameters): UseFieldRootPropsReturnValue;
13
+ interface UseFieldRootPropsParameters {
14
+ manager: PickerManager<any, any, any, any, any>;
15
+ stateResponse: UseFieldStateReturnValue<any>;
16
+ applyCharacterEditing: UseFieldCharacterEditingReturnValue;
17
+ internalPropsWithDefaults: UseFieldInternalProps<any, any, any>;
18
+ domGetters: UseFieldDOMGetters;
19
+ focused: boolean;
20
+ setFocused: (focused: boolean) => void;
21
+ }
22
+ interface UseFieldRootPropsReturnValue {
23
+ onKeyDown: React.KeyboardEventHandler<HTMLDivElement>;
24
+ onBlur: React.FocusEventHandler<HTMLDivElement>;
25
+ onFocus: React.FocusEventHandler<HTMLDivElement>;
26
+ onClick: React.MouseEventHandler<HTMLDivElement>;
27
+ onPaste: React.ClipboardEventHandler<HTMLDivElement>;
28
+ onInput: React.FormEventHandler<HTMLDivElement>;
29
+ contentEditable: boolean;
30
+ tabIndex: number;
31
+ }
32
+ export {};