@mui/x-date-pickers 8.29.0 → 8.29.3

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 (36) hide show
  1. package/CHANGELOG.md +176 -1
  2. package/PickersTextField/PickersFilledInput/PickersFilledInput.js +1 -0
  3. package/PickersTextField/PickersFilledInput/PickersFilledInput.mjs +1 -0
  4. package/PickersTextField/PickersInput/PickersInput.js +1 -0
  5. package/PickersTextField/PickersInput/PickersInput.mjs +1 -0
  6. package/PickersTextField/PickersInputBase/PickersInputBase.js +20 -20
  7. package/PickersTextField/PickersInputBase/PickersInputBase.mjs +20 -20
  8. package/PickersTextField/PickersInputBase/PickersInputBase.types.d.mts +1 -0
  9. package/PickersTextField/PickersInputBase/PickersInputBase.types.d.ts +1 -0
  10. package/PickersTextField/PickersInputBase/pickersInputBaseClasses.js +1 -1
  11. package/PickersTextField/PickersInputBase/pickersInputBaseClasses.mjs +1 -1
  12. package/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.js +12 -8
  13. package/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.mjs +12 -8
  14. package/PickersTextField/PickersTextField.js +4 -1
  15. package/PickersTextField/PickersTextField.mjs +4 -1
  16. package/index.js +1 -1
  17. package/index.mjs +1 -1
  18. package/internals/hooks/useField/useField.types.d.mts +1 -0
  19. package/internals/hooks/useField/useField.types.d.ts +1 -0
  20. package/internals/hooks/useField/useField.utils.d.mts +0 -1
  21. package/internals/hooks/useField/useField.utils.d.ts +0 -1
  22. package/internals/hooks/useField/useField.utils.js +2 -2
  23. package/internals/hooks/useField/useField.utils.mjs +1 -1
  24. package/internals/hooks/useField/useFieldRootProps.d.mts +1 -0
  25. package/internals/hooks/useField/useFieldRootProps.d.ts +1 -0
  26. package/internals/hooks/useField/useFieldRootProps.js +135 -8
  27. package/internals/hooks/useField/useFieldRootProps.mjs +135 -8
  28. package/internals/hooks/useField/useFieldSectionContainerProps.js +23 -4
  29. package/internals/hooks/useField/useFieldSectionContainerProps.mjs +22 -4
  30. package/internals/hooks/useField/useFieldSectionContentProps.d.mts +2 -2
  31. package/internals/hooks/useField/useFieldSectionContentProps.d.ts +2 -2
  32. package/internals/hooks/useField/useFieldSectionContentProps.js +14 -11
  33. package/internals/hooks/useField/useFieldSectionContentProps.mjs +14 -11
  34. package/internals/hooks/useField/useFieldV7TextField.js +13 -0
  35. package/internals/hooks/useField/useFieldV7TextField.mjs +13 -0
  36. package/package.json +182 -182
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import useEventCallback from '@mui/utils/useEventCallback';
3
3
  import { usePickerAdapter, usePickerTranslations } from "../../../hooks/index.mjs";
4
4
  import { syncSelectionToDOM } from "./syncSelectionToDOM.mjs";
5
+ import { removeLocalizedDigits } from "./useField.utils.mjs";
5
6
  /**
6
7
  * Generate the props to pass to the content element of each section of the field.
7
8
  * It is not used by the non-accessible DOM structure (with an <input /> element for editing).
@@ -26,6 +27,7 @@ export function useFieldSectionContentProps(parameters) {
26
27
  sectionsValueBoundaries,
27
28
  state,
28
29
  value,
30
+ localizedDigits,
29
31
  // Methods to update the states
30
32
  clearActiveSection,
31
33
  setCharacterQuery,
@@ -146,10 +148,10 @@ export function useFieldSectionContentProps(parameters) {
146
148
  onFocus: createFocusHandler(sectionIndex),
147
149
  // Aria attributes
148
150
  'aria-readonly': readOnly,
149
- 'aria-valuenow': getSectionValueNow(section, adapter),
151
+ 'aria-valuenow': getSectionValueNow(section, adapter, localizedDigits),
150
152
  'aria-valuemin': sectionBoundaries.minimum,
151
153
  'aria-valuemax': sectionBoundaries.maximum,
152
- 'aria-valuetext': section.value ? getSectionValueText(section, adapter) : translations.empty,
154
+ 'aria-valuetext': section.value ? getSectionValueText(section, adapter, localizedDigits) : translations.empty,
153
155
  'aria-label': translations[section.type],
154
156
  'aria-disabled': disabled,
155
157
  // Other
@@ -165,9 +167,9 @@ export function useFieldSectionContentProps(parameters) {
165
167
  children: section.value || section.placeholder,
166
168
  inputMode: section.contentType === 'letter' ? 'text' : 'numeric'
167
169
  };
168
- }, [sectionsValueBoundaries, isContainerEditable, disabled, readOnly, isEditable, translations, adapter, handleInput, handlePaste, handleMouseUp, handleDragOver, createFocusHandler, fieldValueManager, value]);
170
+ }, [sectionsValueBoundaries, isContainerEditable, disabled, readOnly, isEditable, translations, adapter, localizedDigits, handleInput, handlePaste, handleMouseUp, handleDragOver, createFocusHandler, fieldValueManager, value]);
169
171
  }
170
- function getSectionValueText(section, adapter) {
172
+ function getSectionValueText(section, adapter, localizedDigits) {
171
173
  if (!section.value) {
172
174
  return undefined;
173
175
  }
@@ -175,7 +177,7 @@ function getSectionValueText(section, adapter) {
175
177
  case 'month':
176
178
  {
177
179
  if (section.contentType === 'digit') {
178
- const dateWithMonth = adapter.setMonth(adapter.date(), Number(section.value) - 1);
180
+ const dateWithMonth = adapter.setMonth(adapter.date(), Number(removeLocalizedDigits(section.value, localizedDigits)) - 1);
179
181
  return adapter.isValid(dateWithMonth) ? adapter.format(dateWithMonth, 'month') : '';
180
182
  }
181
183
  const parsedDate = adapter.parse(section.value, section.format);
@@ -183,7 +185,7 @@ function getSectionValueText(section, adapter) {
183
185
  }
184
186
  case 'day':
185
187
  if (section.contentType === 'digit') {
186
- const dateWithDay = adapter.setDate(adapter.startOfYear(adapter.date()), Number(section.value));
188
+ const dateWithDay = adapter.setDate(adapter.startOfYear(adapter.date()), Number(removeLocalizedDigits(section.value, localizedDigits)));
187
189
  return adapter.isValid(dateWithDay) ? adapter.format(dateWithDay, 'dayOfMonthFull') : '';
188
190
  }
189
191
  return section.value;
@@ -194,10 +196,11 @@ function getSectionValueText(section, adapter) {
194
196
  return undefined;
195
197
  }
196
198
  }
197
- function getSectionValueNow(section, adapter) {
199
+ function getSectionValueNow(section, adapter, localizedDigits) {
198
200
  if (!section.value) {
199
201
  return undefined;
200
202
  }
203
+ const nonLocalizedValue = removeLocalizedDigits(section.value, localizedDigits);
201
204
  switch (section.type) {
202
205
  case 'weekDay':
203
206
  {
@@ -205,7 +208,7 @@ function getSectionValueNow(section, adapter) {
205
208
  // TODO: improve by resolving the week day number from a letter week day
206
209
  return undefined;
207
210
  }
208
- return Number(section.value);
211
+ return Number(nonLocalizedValue);
209
212
  }
210
213
  case 'meridiem':
211
214
  {
@@ -216,16 +219,16 @@ function getSectionValueNow(section, adapter) {
216
219
  return undefined;
217
220
  }
218
221
  case 'day':
219
- return section.contentType === 'digit-with-letter' ? parseInt(section.value, 10) : Number(section.value);
222
+ return section.contentType === 'digit-with-letter' ? parseInt(nonLocalizedValue, 10) : Number(nonLocalizedValue);
220
223
  case 'month':
221
224
  {
222
225
  if (section.contentType === 'digit') {
223
- return Number(section.value);
226
+ return Number(nonLocalizedValue);
224
227
  }
225
228
  const parsedDate = adapter.parse(section.value, section.format);
226
229
  return parsedDate ? adapter.getMonth(parsedDate) + 1 : undefined;
227
230
  }
228
231
  default:
229
- return section.contentType !== 'letter' ? Number(section.value) : undefined;
232
+ return section.contentType !== 'letter' ? Number(nonLocalizedValue) : undefined;
230
233
  }
231
234
  }
@@ -46,6 +46,7 @@ const useFieldV7TextField = parameters => {
46
46
  sectionListRef: sectionListRefProp,
47
47
  onBlur,
48
48
  onClick,
49
+ onMouseDown,
49
50
  onFocus,
50
51
  onInput,
51
52
  onPaste,
@@ -147,6 +148,17 @@ const useFieldV7TextField = parameters => {
147
148
  onClick?.(event);
148
149
  rootProps.onClick(event);
149
150
  });
151
+ const handleRootMouseDown = (0, _useEventCallback.default)(event => {
152
+ // The `isDefaultPrevented` check skips mousedowns that have already been
153
+ // suppressed before this handler runs -- in particular, propagated events
154
+ // from the clear / open buttons whose own handlers `preventDefault`, and
155
+ // capture-phase parents that intentionally block field interactions.
156
+ if (event.isDefaultPrevented()) {
157
+ return;
158
+ }
159
+ onMouseDown?.(event);
160
+ rootProps.onMouseDown(event);
161
+ });
150
162
  const handleRootPaste = (0, _useEventCallback.default)(event => {
151
163
  onPaste?.(event);
152
164
  rootProps.onPaste(event);
@@ -229,6 +241,7 @@ const useFieldV7TextField = parameters => {
229
241
  return (0, _extends2.default)({}, forwardedProps, rootProps, {
230
242
  onBlur: handleRootBlur,
231
243
  onClick: handleRootClick,
244
+ onMouseDown: handleRootMouseDown,
232
245
  onFocus: handleRootFocus,
233
246
  onInput: handleRootInput,
234
247
  onPaste: handleRootPaste,
@@ -39,6 +39,7 @@ export const useFieldV7TextField = parameters => {
39
39
  sectionListRef: sectionListRefProp,
40
40
  onBlur,
41
41
  onClick,
42
+ onMouseDown,
42
43
  onFocus,
43
44
  onInput,
44
45
  onPaste,
@@ -140,6 +141,17 @@ export const useFieldV7TextField = parameters => {
140
141
  onClick?.(event);
141
142
  rootProps.onClick(event);
142
143
  });
144
+ const handleRootMouseDown = useEventCallback(event => {
145
+ // The `isDefaultPrevented` check skips mousedowns that have already been
146
+ // suppressed before this handler runs -- in particular, propagated events
147
+ // from the clear / open buttons whose own handlers `preventDefault`, and
148
+ // capture-phase parents that intentionally block field interactions.
149
+ if (event.isDefaultPrevented()) {
150
+ return;
151
+ }
152
+ onMouseDown?.(event);
153
+ rootProps.onMouseDown(event);
154
+ });
143
155
  const handleRootPaste = useEventCallback(event => {
144
156
  onPaste?.(event);
145
157
  rootProps.onPaste(event);
@@ -222,6 +234,7 @@ export const useFieldV7TextField = parameters => {
222
234
  return _extends({}, forwardedProps, rootProps, {
223
235
  onBlur: handleRootBlur,
224
236
  onClick: handleRootClick,
237
+ onMouseDown: handleRootMouseDown,
225
238
  onFocus: handleRootFocus,
226
239
  onInput: handleRootInput,
227
240
  onPaste: handleRootPaste,