@mui/x-date-pickers-pro 8.0.0-alpha.12 → 8.0.0-alpha.13
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.
- package/CHANGELOG.md +299 -0
- package/DateRangePicker/DateRangePicker.types.d.ts +2 -2
- package/DateTimeRangePicker/DateTimeRangePicker.types.d.ts +2 -2
- package/DesktopDateRangePicker/DesktopDateRangePicker.js +2 -2
- package/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.js +2 -2
- package/MobileDateRangePicker/MobileDateRangePicker.js +2 -2
- package/MobileDateTimeRangePicker/MobileDateTimeRangePicker.js +2 -2
- package/SingleInputDateRangeField/useSingleInputDateRangeField.d.ts +1 -1
- package/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.d.ts +1 -1
- package/SingleInputTimeRangeField/useSingleInputTimeRangeField.d.ts +1 -1
- package/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +6 -4
- package/dateRangeViewRenderers/dateRangeViewRenderers.js +13 -8
- package/esm/DateRangePicker/DateRangePicker.types.d.ts +2 -2
- package/esm/DateTimeRangePicker/DateTimeRangePicker.types.d.ts +2 -2
- package/esm/DesktopDateRangePicker/DesktopDateRangePicker.js +2 -2
- package/esm/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.js +2 -2
- package/esm/MobileDateRangePicker/MobileDateRangePicker.js +2 -2
- package/esm/MobileDateTimeRangePicker/MobileDateTimeRangePicker.js +2 -2
- package/esm/SingleInputDateRangeField/useSingleInputDateRangeField.d.ts +1 -1
- package/esm/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.d.ts +1 -1
- package/esm/SingleInputTimeRangeField/useSingleInputTimeRangeField.d.ts +1 -1
- package/esm/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +6 -4
- package/esm/dateRangeViewRenderers/dateRangeViewRenderers.js +13 -8
- package/esm/hooks/index.d.ts +2 -1
- package/esm/hooks/useMultiInputRangeField/index.d.ts +2 -1
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeField.d.ts +37 -18
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeField.js +41 -50
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.d.ts +11 -0
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.js +25 -0
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.d.ts +4 -1
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.js +3 -2
- package/esm/hooks/useMultiInputRangeField/useTextFieldProps.d.ts +30 -0
- package/esm/hooks/useMultiInputRangeField/useTextFieldProps.js +141 -0
- package/esm/index.js +1 -1
- package/esm/internals/hooks/models/index.d.ts +1 -1
- package/esm/internals/hooks/models/useRangePicker.d.ts +1 -8
- package/esm/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +8 -75
- package/esm/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +16 -4
- package/esm/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -47
- package/esm/internals/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +17 -4
- package/esm/internals/hooks/useRangePosition.d.ts +1 -4
- package/esm/internals/hooks/useRangePosition.js +1 -18
- package/esm/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +3 -3
- package/esm/internals/utils/createMultiInputRangeField/createMultiInputRangeField.js +26 -32
- package/esm/internals/utils/createMultiInputRangeField/createMultiInputRangeField.types.d.ts +1 -1
- package/esm/internals/utils/createMultiInputRangeField/useTextFieldProps.d.ts +12 -0
- package/esm/internals/utils/createMultiInputRangeField/useTextFieldProps.js +36 -0
- package/esm/internals/utils/date-fields-utils.d.ts +4 -1
- package/esm/internals/utils/date-fields-utils.js +5 -1
- package/esm/internals/utils/releaseInfo.js +1 -1
- package/esm/managers/useDateRangeManager.js +8 -1
- package/esm/managers/useDateTimeRangeManager.js +8 -1
- package/esm/managers/useTimeRangeManager.js +10 -1
- package/esm/models/fields.d.ts +5 -18
- package/hooks/index.d.ts +2 -1
- package/hooks/useMultiInputRangeField/index.d.ts +2 -1
- package/hooks/useMultiInputRangeField/useMultiInputRangeField.d.ts +37 -18
- package/hooks/useMultiInputRangeField/useMultiInputRangeField.js +40 -51
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.d.ts +11 -0
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.js +31 -0
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.d.ts +4 -1
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.js +3 -1
- package/hooks/useMultiInputRangeField/useTextFieldProps.d.ts +30 -0
- package/hooks/useMultiInputRangeField/useTextFieldProps.js +149 -0
- package/index.js +1 -1
- package/internals/hooks/models/index.d.ts +1 -1
- package/internals/hooks/models/useRangePicker.d.ts +1 -8
- package/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +7 -74
- package/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +16 -4
- package/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -47
- package/internals/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +17 -4
- package/internals/hooks/useRangePosition.d.ts +1 -4
- package/internals/hooks/useRangePosition.js +1 -18
- package/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +3 -3
- package/internals/utils/createMultiInputRangeField/createMultiInputRangeField.js +25 -31
- package/internals/utils/createMultiInputRangeField/createMultiInputRangeField.types.d.ts +1 -1
- package/internals/utils/createMultiInputRangeField/useTextFieldProps.d.ts +12 -0
- package/internals/utils/createMultiInputRangeField/useTextFieldProps.js +44 -0
- package/internals/utils/date-fields-utils.d.ts +4 -1
- package/internals/utils/date-fields-utils.js +6 -1
- package/internals/utils/releaseInfo.js +1 -1
- package/managers/useDateRangeManager.js +8 -1
- package/managers/useDateTimeRangeManager.js +8 -1
- package/managers/useTimeRangeManager.js +10 -1
- package/models/fields.d.ts +5 -18
- package/modern/DateRangePicker/DateRangePicker.types.d.ts +2 -2
- package/modern/DateTimeRangePicker/DateTimeRangePicker.types.d.ts +2 -2
- package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +2 -2
- package/modern/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.js +2 -2
- package/modern/MobileDateRangePicker/MobileDateRangePicker.js +2 -2
- package/modern/MobileDateTimeRangePicker/MobileDateTimeRangePicker.js +2 -2
- package/modern/SingleInputDateRangeField/useSingleInputDateRangeField.d.ts +1 -1
- package/modern/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.d.ts +1 -1
- package/modern/SingleInputTimeRangeField/useSingleInputTimeRangeField.d.ts +1 -1
- package/modern/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +6 -4
- package/modern/dateRangeViewRenderers/dateRangeViewRenderers.js +13 -8
- package/modern/hooks/index.d.ts +2 -1
- package/modern/hooks/useMultiInputRangeField/index.d.ts +2 -1
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeField.d.ts +37 -18
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeField.js +41 -50
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.d.ts +11 -0
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldRootProps.js +25 -0
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.d.ts +4 -1
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.js +3 -2
- package/modern/hooks/useMultiInputRangeField/useTextFieldProps.d.ts +30 -0
- package/modern/hooks/useMultiInputRangeField/useTextFieldProps.js +141 -0
- package/modern/index.js +1 -1
- package/modern/internals/hooks/models/index.d.ts +1 -1
- package/modern/internals/hooks/models/useRangePicker.d.ts +1 -8
- package/modern/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +8 -75
- package/modern/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +16 -4
- package/modern/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -47
- package/modern/internals/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +17 -4
- package/modern/internals/hooks/useRangePosition.d.ts +1 -4
- package/modern/internals/hooks/useRangePosition.js +1 -18
- package/modern/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +3 -3
- package/modern/internals/utils/createMultiInputRangeField/createMultiInputRangeField.js +26 -32
- package/modern/internals/utils/createMultiInputRangeField/createMultiInputRangeField.types.d.ts +1 -1
- package/modern/internals/utils/createMultiInputRangeField/useTextFieldProps.d.ts +12 -0
- package/modern/internals/utils/createMultiInputRangeField/useTextFieldProps.js +36 -0
- package/modern/internals/utils/date-fields-utils.d.ts +4 -1
- package/modern/internals/utils/date-fields-utils.js +5 -1
- package/modern/internals/utils/releaseInfo.js +1 -1
- package/modern/managers/useDateRangeManager.js +8 -1
- package/modern/managers/useDateTimeRangeManager.js +8 -1
- package/modern/managers/useTimeRangeManager.js +10 -1
- package/modern/models/fields.d.ts +5 -18
- package/package.json +4 -4
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.d.ts +0 -17
- package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.js +0 -59
- package/esm/internals/hooks/useEnrichedRangePickerField.d.ts +0 -70
- package/esm/internals/hooks/useEnrichedRangePickerField.js +0 -236
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.d.ts +0 -17
- package/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.js +0 -66
- package/internals/hooks/useEnrichedRangePickerField.d.ts +0 -70
- package/internals/hooks/useEnrichedRangePickerField.js +0 -245
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.d.ts +0 -17
- package/modern/hooks/useMultiInputRangeField/useMultiInputRangeFieldTextFieldProps.js +0 -59
- package/modern/internals/hooks/useEnrichedRangePickerField.d.ts +0 -70
- package/modern/internals/hooks/useEnrichedRangePickerField.js +0 -236
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
2
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
+
const _excluded = ["clearable", "onClear", "openPickerAriaLabel"];
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import useEventCallback from '@mui/utils/useEventCallback';
|
|
6
|
+
import { useDateManager, useDateTimeManager, useTimeManager } from '@mui/x-date-pickers/managers';
|
|
7
|
+
import { useSplitFieldProps } from '@mui/x-date-pickers/hooks';
|
|
8
|
+
import { useField, useFieldInternalPropsWithDefaults, useNullableFieldPrivateContext, useNullablePickerContext, usePickerPrivateContext } from '@mui/x-date-pickers/internals';
|
|
9
|
+
import { useNullablePickerRangePositionContext } from "../../internals/hooks/useNullablePickerRangePositionContext.js";
|
|
10
|
+
/**
|
|
11
|
+
* @ignore - internal hook.
|
|
12
|
+
*/
|
|
13
|
+
export function useTextFieldProps(parameters) {
|
|
14
|
+
const pickerContext = useNullablePickerContext();
|
|
15
|
+
const fieldPrivateContext = useNullableFieldPrivateContext();
|
|
16
|
+
const pickerPrivateContext = usePickerPrivateContext();
|
|
17
|
+
const rangePositionContext = useNullablePickerRangePositionContext();
|
|
18
|
+
const rangePosition = rangePositionContext?.rangePosition ?? 'start';
|
|
19
|
+
const setRangePosition = rangePositionContext?.setRangePosition;
|
|
20
|
+
const previousRangePosition = React.useRef(rangePosition);
|
|
21
|
+
const {
|
|
22
|
+
forwardedProps,
|
|
23
|
+
sharedInternalProps,
|
|
24
|
+
selectedSectionProps,
|
|
25
|
+
valueType,
|
|
26
|
+
position,
|
|
27
|
+
value,
|
|
28
|
+
onChange,
|
|
29
|
+
autoFocus,
|
|
30
|
+
validation
|
|
31
|
+
} = parameters;
|
|
32
|
+
let useManager;
|
|
33
|
+
switch (valueType) {
|
|
34
|
+
case 'date':
|
|
35
|
+
{
|
|
36
|
+
useManager = useDateManager;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'time':
|
|
40
|
+
{
|
|
41
|
+
useManager = useTimeManager;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'date-time':
|
|
45
|
+
{
|
|
46
|
+
useManager = useDateTimeManager;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
{
|
|
51
|
+
throw new Error(`Unknown valueType: ${valueType}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const manager = useManager({
|
|
55
|
+
enableAccessibleFieldDOMStructure: sharedInternalProps.enableAccessibleFieldDOMStructure
|
|
56
|
+
});
|
|
57
|
+
const openPickerIfPossible = event => {
|
|
58
|
+
if (!pickerContext) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
setRangePosition?.(position);
|
|
62
|
+
if (pickerContext.triggerStatus === 'enabled') {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
pickerContext.setOpen(true);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const handleKeyDown = useEventCallback(event => {
|
|
68
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
69
|
+
openPickerIfPossible(event);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Registering `onClick` listener on the root element as well to correctly handle cases where user is clicking on `label`
|
|
74
|
+
// which has `pointer-events: none` and due to DOM structure the `input` does not catch the click event
|
|
75
|
+
const handleClick = useEventCallback(event => {
|
|
76
|
+
openPickerIfPossible(event);
|
|
77
|
+
});
|
|
78
|
+
const handleFocus = useEventCallback(event => {
|
|
79
|
+
forwardedProps.onFocus?.(event);
|
|
80
|
+
if (pickerContext?.open) {
|
|
81
|
+
setRangePosition?.(position);
|
|
82
|
+
if (previousRangePosition.current !== position && pickerContext.initialView) {
|
|
83
|
+
pickerContext.setView?.(pickerContext.initialView);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const handleChange = useEventCallback((newSingleValue, rawContext) => {
|
|
88
|
+
const newRange = position === 'start' ? [newSingleValue, value[1]] : [value[0], newSingleValue];
|
|
89
|
+
const context = _extends({}, rawContext, {
|
|
90
|
+
validationError: validation.getValidationErrorForNewValue(newRange)
|
|
91
|
+
});
|
|
92
|
+
onChange(newRange, context);
|
|
93
|
+
});
|
|
94
|
+
const allProps = _extends({
|
|
95
|
+
value: position === 'start' ? value[0] : value[1],
|
|
96
|
+
error: position === 'start' ? !!validation.validationError[0] : !!validation.validationError[1],
|
|
97
|
+
id: `${pickerPrivateContext.labelId}-${position}`,
|
|
98
|
+
autoFocus: position === 'start' ? autoFocus : undefined
|
|
99
|
+
}, forwardedProps, sharedInternalProps, selectedSectionProps, {
|
|
100
|
+
onClick: handleClick,
|
|
101
|
+
onFocus: handleFocus,
|
|
102
|
+
onKeyDown: handleKeyDown,
|
|
103
|
+
onChange: handleChange
|
|
104
|
+
});
|
|
105
|
+
const splittedProps = useSplitFieldProps(allProps, valueType);
|
|
106
|
+
const internalPropsWithDefaults = useFieldInternalPropsWithDefaults({
|
|
107
|
+
manager,
|
|
108
|
+
internalProps: splittedProps.internalProps,
|
|
109
|
+
skipContextFieldRefAssignment: rangePosition !== position
|
|
110
|
+
});
|
|
111
|
+
const _ref = useField({
|
|
112
|
+
forwardedProps: splittedProps.forwardedProps,
|
|
113
|
+
internalProps: internalPropsWithDefaults,
|
|
114
|
+
valueManager: manager.internal_valueManager,
|
|
115
|
+
fieldValueManager: manager.internal_fieldValueManager,
|
|
116
|
+
validator: manager.validator,
|
|
117
|
+
valueType: manager.valueType,
|
|
118
|
+
// TODO v8: Add a real aria label before moving the opening logic to the field on range pickers.
|
|
119
|
+
getOpenPickerButtonAriaLabel: () => ''
|
|
120
|
+
}),
|
|
121
|
+
fieldResponse = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
122
|
+
React.useEffect(() => {
|
|
123
|
+
if (!pickerContext?.open || pickerContext?.variant === 'mobile') {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
fieldPrivateContext?.fieldRef.current?.focusField();
|
|
127
|
+
if (!fieldPrivateContext?.fieldRef.current || pickerContext.view === pickerContext.initialView) {
|
|
128
|
+
// could happen when the user is switching between the inputs
|
|
129
|
+
previousRangePosition.current = rangePosition;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// bring back focus to the field
|
|
134
|
+
// currentView is present on DateTimeRangePicker
|
|
135
|
+
fieldPrivateContext?.fieldRef.current.setSelectedSections(
|
|
136
|
+
// use the current view or `0` when the range position has just been swapped
|
|
137
|
+
previousRangePosition.current === rangePosition ? pickerContext.view : 0);
|
|
138
|
+
previousRangePosition.current = rangePosition;
|
|
139
|
+
}, [rangePosition, pickerContext?.open, pickerContext?.variant, pickerContext?.initialView, pickerContext?.view, fieldPrivateContext?.fieldRef]);
|
|
140
|
+
return fieldResponse;
|
|
141
|
+
}
|
package/modern/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type { RangeOnlyPickerProps, UseRangePickerProps, UseRangePickerParams } from './useRangePicker';
|
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
import { UsePickerParams, BasePickerProps,
|
|
2
|
-
import { ExportedPickersLayoutSlots, ExportedPickersLayoutSlotProps } from '@mui/x-date-pickers/PickersLayout';
|
|
1
|
+
import { UsePickerParams, BasePickerProps, UsePickerViewsProps, UsePickerValueNonStaticProps, UsePickerProviderNonStaticProps, DateOrTimeViewWithMeridiem, PickerRangeValue } from '@mui/x-date-pickers/internals';
|
|
3
2
|
import { BaseRangeNonStaticPickerProps } from "../../models/index.js";
|
|
4
3
|
import { UseRangePositionProps } from "../useRangePosition.js";
|
|
5
|
-
import { RangePickerFieldSlots, RangePickerFieldSlotProps } from "../useEnrichedRangePickerField.js";
|
|
6
|
-
export interface UseRangePickerSlots extends ExportedPickersLayoutSlots<PickerRangeValue>, RangePickerFieldSlots {}
|
|
7
|
-
export interface UseRangePickerSlotProps<TEnableAccessibleFieldDOMStructure extends boolean> extends ExportedPickersLayoutSlotProps<PickerRangeValue>, RangePickerFieldSlotProps<TEnableAccessibleFieldDOMStructure> {
|
|
8
|
-
tabs?: ExportedBaseTabsProps;
|
|
9
|
-
toolbar?: ExportedBaseToolbarProps;
|
|
10
|
-
}
|
|
11
4
|
export interface RangeOnlyPickerProps extends UsePickerValueNonStaticProps, UsePickerProviderNonStaticProps, BaseRangeNonStaticPickerProps, UseRangePositionProps {}
|
|
12
5
|
export interface UseRangePickerProps<TView extends DateOrTimeViewWithMeridiem, TError, TExternalProps extends UsePickerViewsProps<any, TView, any>> extends RangeOnlyPickerProps, BasePickerProps<PickerRangeValue, TView, TError, TExternalProps> {}
|
|
13
6
|
export interface UseRangePickerParams<TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UseRangePickerProps<TView, any, TExternalProps>> extends Pick<UsePickerParams<PickerRangeValue, TView, TExternalProps>, 'valueManager' | 'valueType' | 'validator' | 'rendererInterceptor' | 'ref'> {
|
|
@@ -6,11 +6,11 @@ import * as React from 'react';
|
|
|
6
6
|
import useSlotProps from '@mui/utils/useSlotProps';
|
|
7
7
|
import { useLicenseVerifier } from '@mui/x-license';
|
|
8
8
|
import { PickersLayout } from '@mui/x-date-pickers/PickersLayout';
|
|
9
|
-
import {
|
|
10
|
-
import { useEnrichedRangePickerField } from "../useEnrichedRangePickerField.js";
|
|
9
|
+
import { usePicker, PickerPopper, PickerProvider, PickerFieldUIContextProvider } from '@mui/x-date-pickers/internals';
|
|
11
10
|
import { getReleaseInfo } from "../../utils/releaseInfo.js";
|
|
12
11
|
import { useRangePosition } from "../useRangePosition.js";
|
|
13
12
|
import { PickerRangePositionContext } from "../../../hooks/usePickerRangePositionContext.js";
|
|
13
|
+
import { getRangeFieldType } from "../../utils/date-fields-utils.js";
|
|
14
14
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
15
|
const releaseInfo = getReleaseInfo();
|
|
16
16
|
export const useDesktopRangePicker = _ref => {
|
|
@@ -23,27 +23,11 @@ export const useDesktopRangePicker = _ref => {
|
|
|
23
23
|
slots,
|
|
24
24
|
slotProps,
|
|
25
25
|
inputRef,
|
|
26
|
-
readOnly,
|
|
27
|
-
autoFocus,
|
|
28
|
-
disableOpenPicker,
|
|
29
26
|
localeText
|
|
30
27
|
} = props;
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const endFieldRef = React.useRef(null);
|
|
35
|
-
const singleInputFieldRef = React.useRef(null);
|
|
36
|
-
const initialView = React.useRef(props.openTo ?? null);
|
|
37
|
-
const fieldType = slots.field.fieldType ?? 'multi-input';
|
|
38
|
-
const rangePositionResponse = useRangePosition(props, fieldType === 'single-input' ? singleInputFieldRef : undefined);
|
|
39
|
-
let fieldRef;
|
|
40
|
-
if (fieldType === 'single-input') {
|
|
41
|
-
fieldRef = singleInputFieldRef;
|
|
42
|
-
} else if (rangePositionResponse.rangePosition === 'start') {
|
|
43
|
-
fieldRef = startFieldRef;
|
|
44
|
-
} else {
|
|
45
|
-
fieldRef = endFieldRef;
|
|
46
|
-
}
|
|
28
|
+
const fieldType = getRangeFieldType(slots.field);
|
|
29
|
+
const viewContainerRole = fieldType === 'single-input' ? 'dialog' : 'tooltip';
|
|
30
|
+
const rangePositionResponse = useRangePosition(props);
|
|
47
31
|
const {
|
|
48
32
|
providerProps,
|
|
49
33
|
renderCurrentView,
|
|
@@ -51,77 +35,26 @@ export const useDesktopRangePicker = _ref => {
|
|
|
51
35
|
} = usePicker(_extends({}, pickerParams, {
|
|
52
36
|
props,
|
|
53
37
|
variant: 'desktop',
|
|
54
|
-
autoFocusView:
|
|
55
|
-
|
|
38
|
+
autoFocusView: viewContainerRole === 'dialog',
|
|
39
|
+
viewContainerRole,
|
|
56
40
|
localeText
|
|
57
41
|
}));
|
|
58
|
-
|
|
59
|
-
// Temporary hack to hide the opening button on the range pickers until we have migrate them to the new opening logic.
|
|
60
|
-
providerProps.contextValue.triggerStatus = 'hidden';
|
|
61
|
-
React.useEffect(() => {
|
|
62
|
-
if (providerProps.contextValue.view) {
|
|
63
|
-
initialView.current = providerProps.contextValue.view;
|
|
64
|
-
}
|
|
65
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
-
}, []);
|
|
67
|
-
const handleBlur = () => {
|
|
68
|
-
executeInTheNextEventLoopTick(() => {
|
|
69
|
-
if (fieldContainerRef.current?.contains(getActiveElement(document)) || popperRef.current?.contains(getActiveElement(document))) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// This direct access to `providerProps` will go away once the range fields stop having their views in a tooltip.
|
|
74
|
-
providerProps.privateContextValue.dismissViews();
|
|
75
|
-
});
|
|
76
|
-
};
|
|
77
42
|
const Field = slots.field;
|
|
78
43
|
const _useSlotProps = useSlotProps({
|
|
79
44
|
elementType: Field,
|
|
80
45
|
externalSlotProps: slotProps?.field,
|
|
81
|
-
additionalProps: {
|
|
82
|
-
// Internal props
|
|
83
|
-
readOnly,
|
|
84
|
-
autoFocus: autoFocus && !props.open,
|
|
85
|
-
// Forwarded props
|
|
86
|
-
ref: fieldContainerRef
|
|
87
|
-
},
|
|
88
46
|
ownerState
|
|
89
47
|
}),
|
|
90
48
|
fieldProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
|
|
91
|
-
const enrichedFieldResponse = useEnrichedRangePickerField(_extends({
|
|
92
|
-
variant: 'desktop',
|
|
93
|
-
fieldType,
|
|
94
|
-
// These direct access to `providerProps` will go away once the range fields handle the picker opening
|
|
95
|
-
contextValue: providerProps.contextValue,
|
|
96
|
-
fieldPrivateContextValue: providerProps.fieldPrivateContextValue,
|
|
97
|
-
readOnly,
|
|
98
|
-
disableOpenPicker,
|
|
99
|
-
localeText,
|
|
100
|
-
onBlur: handleBlur,
|
|
101
|
-
pickerSlotProps: slotProps,
|
|
102
|
-
pickerSlots: slots,
|
|
103
|
-
fieldProps,
|
|
104
|
-
anchorRef: providerProps.contextValue.triggerRef,
|
|
105
|
-
startFieldRef,
|
|
106
|
-
endFieldRef,
|
|
107
|
-
singleInputFieldRef,
|
|
108
|
-
currentView: providerProps.contextValue.view !== props.openTo ? providerProps.contextValue.view : undefined,
|
|
109
|
-
initialView: initialView.current ?? undefined
|
|
110
|
-
}, rangePositionResponse));
|
|
111
49
|
const Layout = slots?.layout ?? PickersLayout;
|
|
112
50
|
const renderPicker = () => /*#__PURE__*/_jsx(PickerProvider, _extends({}, providerProps, {
|
|
113
|
-
// This override will go away once the range fields handle the picker opening
|
|
114
|
-
fieldPrivateContextValue: _extends({}, providerProps.fieldPrivateContextValue, enrichedFieldResponse.fieldPrivateContextValue),
|
|
115
51
|
children: /*#__PURE__*/_jsx(PickerFieldUIContextProvider, {
|
|
116
52
|
slots: slots,
|
|
117
53
|
slotProps: slotProps,
|
|
118
54
|
inputRef: inputRef,
|
|
119
55
|
children: /*#__PURE__*/_jsxs(PickerRangePositionContext.Provider, {
|
|
120
56
|
value: rangePositionResponse,
|
|
121
|
-
children: [/*#__PURE__*/_jsx(Field, _extends({},
|
|
122
|
-
role: "tooltip",
|
|
123
|
-
containerRef: popperRef,
|
|
124
|
-
onBlur: handleBlur,
|
|
57
|
+
children: [/*#__PURE__*/_jsx(Field, _extends({}, fieldProps)), /*#__PURE__*/_jsx(PickerPopper, {
|
|
125
58
|
slots: slots,
|
|
126
59
|
slotProps: slotProps,
|
|
127
60
|
children: /*#__PURE__*/_jsx(Layout, _extends({}, slotProps?.layout, {
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { SlotComponentPropsFromProps } from '@mui/x-internals/types';
|
|
2
|
+
import { PickerFieldSlotProps, PickerOwnerState } from '@mui/x-date-pickers/models';
|
|
3
|
+
import { PickerPopperSlots, PickerPopperSlotProps, UsePickerViewsProps, DateOrTimeViewWithMeridiem, PickerRangeValue, PickerFieldUISlotsFromContext, PickerFieldUISlotPropsFromContext } from '@mui/x-date-pickers/internals';
|
|
4
|
+
import { ExportedPickersLayoutSlotProps, ExportedPickersLayoutSlots } from '@mui/x-date-pickers/PickersLayout';
|
|
5
|
+
import { RangeOnlyPickerProps, UseRangePickerParams, UseRangePickerProps } from "../models/useRangePicker.js";
|
|
6
|
+
export interface UseDesktopRangePickerSlots extends PickerPopperSlots, ExportedPickersLayoutSlots<PickerRangeValue>, PickerFieldUISlotsFromContext {
|
|
7
|
+
/**
|
|
8
|
+
* Component used to enter the date with the keyboard.
|
|
9
|
+
*/
|
|
10
|
+
field: React.ElementType;
|
|
11
|
+
}
|
|
12
|
+
export interface UseDesktopRangePickerSlotProps<TEnableAccessibleFieldDOMStructure extends boolean> extends PickerPopperSlotProps, ExportedPickersLayoutSlotProps<PickerRangeValue>, PickerFieldUISlotPropsFromContext {
|
|
13
|
+
field?: SlotComponentPropsFromProps<PickerFieldSlotProps<PickerRangeValue, TEnableAccessibleFieldDOMStructure> & {
|
|
14
|
+
dateSeparator?: string;
|
|
15
|
+
}, {}, PickerOwnerState>;
|
|
16
|
+
}
|
|
5
17
|
export interface DesktopRangeOnlyPickerProps extends RangeOnlyPickerProps {
|
|
6
18
|
/**
|
|
7
19
|
* If `true`, the start `input` element is focused during the first mount.
|
|
@@ -4,15 +4,15 @@ const _excluded = ["props"],
|
|
|
4
4
|
_excluded2 = ["ownerState"];
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
import useSlotProps from '@mui/utils/useSlotProps';
|
|
7
|
+
import resolveComponentProps from '@mui/utils/resolveComponentProps';
|
|
7
8
|
import { useLicenseVerifier } from '@mui/x-license';
|
|
8
9
|
import { PickersLayout } from '@mui/x-date-pickers/PickersLayout';
|
|
9
10
|
import { usePicker, PickersModalDialog, PickerProvider, PickerFieldUIContextProvider } from '@mui/x-date-pickers/internals';
|
|
10
11
|
import { usePickerTranslations } from '@mui/x-date-pickers/hooks';
|
|
11
|
-
import useId from '@mui/utils/useId';
|
|
12
|
-
import { useEnrichedRangePickerField } from "../useEnrichedRangePickerField.js";
|
|
13
12
|
import { getReleaseInfo } from "../../utils/releaseInfo.js";
|
|
14
13
|
import { useRangePosition } from "../useRangePosition.js";
|
|
15
14
|
import { PickerRangePositionContext } from "../../../hooks/usePickerRangePositionContext.js";
|
|
15
|
+
import { getRangeFieldType } from "../../utils/date-fields-utils.js";
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
17
|
const releaseInfo = getReleaseInfo();
|
|
18
18
|
export const useMobileRangePicker = _ref => {
|
|
@@ -26,25 +26,11 @@ export const useMobileRangePicker = _ref => {
|
|
|
26
26
|
slotProps: innerSlotProps,
|
|
27
27
|
label,
|
|
28
28
|
inputRef,
|
|
29
|
-
readOnly,
|
|
30
|
-
disableOpenPicker,
|
|
31
29
|
localeText
|
|
32
30
|
} = props;
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const singleInputFieldRef = React.useRef(null);
|
|
36
|
-
const fieldType = slots.field.fieldType ?? 'multi-input';
|
|
37
|
-
const rangePositionResponse = useRangePosition(props, fieldType === 'single-input' ? singleInputFieldRef : undefined);
|
|
38
|
-
const labelId = useId();
|
|
31
|
+
const fieldType = getRangeFieldType(slots.field);
|
|
32
|
+
const rangePositionResponse = useRangePosition(props);
|
|
39
33
|
const contextTranslations = usePickerTranslations();
|
|
40
|
-
let fieldRef;
|
|
41
|
-
if (fieldType === 'single-input') {
|
|
42
|
-
fieldRef = singleInputFieldRef;
|
|
43
|
-
} else if (rangePositionResponse.rangePosition === 'start') {
|
|
44
|
-
fieldRef = startFieldRef;
|
|
45
|
-
} else {
|
|
46
|
-
fieldRef = endFieldRef;
|
|
47
|
-
}
|
|
48
34
|
const {
|
|
49
35
|
providerProps,
|
|
50
36
|
renderCurrentView,
|
|
@@ -53,41 +39,21 @@ export const useMobileRangePicker = _ref => {
|
|
|
53
39
|
props,
|
|
54
40
|
variant: 'mobile',
|
|
55
41
|
autoFocusView: true,
|
|
56
|
-
|
|
42
|
+
viewContainerRole: 'dialog',
|
|
57
43
|
localeText
|
|
58
44
|
}));
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
providerProps.contextValue.triggerStatus = 'hidden';
|
|
45
|
+
const labelId = providerProps.privateContextValue.labelId;
|
|
46
|
+
const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false;
|
|
62
47
|
const Field = slots.field;
|
|
63
48
|
const _useSlotProps = useSlotProps({
|
|
64
49
|
elementType: Field,
|
|
65
50
|
externalSlotProps: innerSlotProps?.field,
|
|
66
|
-
additionalProps: {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
},
|
|
51
|
+
additionalProps: _extends({}, fieldType === 'single-input' && isToolbarHidden && {
|
|
52
|
+
id: labelId
|
|
53
|
+
}),
|
|
70
54
|
ownerState
|
|
71
55
|
}),
|
|
72
56
|
fieldProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
|
|
73
|
-
const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false;
|
|
74
|
-
const enrichedFieldResponse = useEnrichedRangePickerField(_extends({
|
|
75
|
-
variant: 'mobile',
|
|
76
|
-
fieldType,
|
|
77
|
-
// These direct access to `providerProps` will go away once the range fields handle the picker opening
|
|
78
|
-
contextValue: providerProps.contextValue,
|
|
79
|
-
fieldPrivateContextValue: providerProps.fieldPrivateContextValue,
|
|
80
|
-
readOnly,
|
|
81
|
-
labelId,
|
|
82
|
-
disableOpenPicker,
|
|
83
|
-
localeText,
|
|
84
|
-
pickerSlots: slots,
|
|
85
|
-
pickerSlotProps: innerSlotProps,
|
|
86
|
-
fieldProps,
|
|
87
|
-
startFieldRef,
|
|
88
|
-
endFieldRef,
|
|
89
|
-
singleInputFieldRef
|
|
90
|
-
}, rangePositionResponse));
|
|
91
57
|
const Layout = slots?.layout ?? PickersLayout;
|
|
92
58
|
const finalLocaleText = _extends({}, contextTranslations, localeText);
|
|
93
59
|
let labelledById = pickerParams.valueType === 'date-time' ? `${labelId}-start-toolbar ${labelId}-end-toolbar` : labelId;
|
|
@@ -112,17 +78,21 @@ export const useMobileRangePicker = _ref => {
|
|
|
112
78
|
mobilePaper: _extends({
|
|
113
79
|
'aria-labelledby': labelledById
|
|
114
80
|
}, innerSlotProps?.mobilePaper)
|
|
81
|
+
}, fieldType === 'multi-input' && {
|
|
82
|
+
textField: slotOwnerState => {
|
|
83
|
+
return _extends({}, resolveComponentProps(innerSlotProps?.textField, slotOwnerState), {
|
|
84
|
+
id: `${labelId}-${slotOwnerState.position}`
|
|
85
|
+
});
|
|
86
|
+
}
|
|
115
87
|
});
|
|
116
88
|
const renderPicker = () => /*#__PURE__*/_jsx(PickerProvider, _extends({}, providerProps, {
|
|
117
|
-
// This override will go away once the range fields handle the picker opening
|
|
118
|
-
fieldPrivateContextValue: _extends({}, providerProps.fieldPrivateContextValue, enrichedFieldResponse.fieldPrivateContextValue),
|
|
119
89
|
children: /*#__PURE__*/_jsx(PickerFieldUIContextProvider, {
|
|
120
90
|
slots: slots,
|
|
121
91
|
slotProps: slotProps,
|
|
122
92
|
inputRef: inputRef,
|
|
123
93
|
children: /*#__PURE__*/_jsxs(PickerRangePositionContext.Provider, {
|
|
124
94
|
value: rangePositionResponse,
|
|
125
|
-
children: [/*#__PURE__*/_jsx(Field, _extends({},
|
|
95
|
+
children: [/*#__PURE__*/_jsx(Field, _extends({}, fieldProps)), /*#__PURE__*/_jsx(PickersModalDialog, {
|
|
126
96
|
slots: slots,
|
|
127
97
|
slotProps: slotProps,
|
|
128
98
|
children: /*#__PURE__*/_jsx(Layout, _extends({}, slotProps?.layout, {
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { SlotComponentPropsFromProps } from '@mui/x-internals/types';
|
|
2
|
+
import { PickerFieldSlotProps, PickerOwnerState } from '@mui/x-date-pickers/models';
|
|
3
|
+
import { PickersModalDialogSlots, PickersModalDialogSlotProps, UsePickerViewsProps, DateOrTimeViewWithMeridiem, PickerRangeValue, PickerFieldUISlotsFromContext, PickerFieldUISlotPropsFromContext } from '@mui/x-date-pickers/internals';
|
|
4
|
+
import { ExportedPickersLayoutSlotProps, ExportedPickersLayoutSlots, PickersLayoutSlotProps } from '@mui/x-date-pickers/PickersLayout';
|
|
5
|
+
import { RangeOnlyPickerProps, UseRangePickerParams, UseRangePickerProps } from "../models/useRangePicker.js";
|
|
6
|
+
export interface UseMobileRangePickerSlots extends PickersModalDialogSlots, ExportedPickersLayoutSlots<PickerRangeValue>, PickerFieldUISlotsFromContext {
|
|
7
|
+
/**
|
|
8
|
+
* Component used to enter the date with the keyboard.
|
|
9
|
+
*/
|
|
10
|
+
field: React.ElementType;
|
|
11
|
+
}
|
|
12
|
+
export interface ExportedUseMobileRangePickerSlotProps<TEnableAccessibleFieldDOMStructure extends boolean> extends PickersModalDialogSlotProps, ExportedPickersLayoutSlotProps<PickerRangeValue>, PickerFieldUISlotPropsFromContext {
|
|
13
|
+
field?: SlotComponentPropsFromProps<PickerFieldSlotProps<PickerRangeValue, TEnableAccessibleFieldDOMStructure> & {
|
|
14
|
+
dateSeparator?: string;
|
|
15
|
+
}, {}, PickerOwnerState>;
|
|
16
|
+
}
|
|
17
|
+
export interface UseMobileRangePickerSlotProps<TEnableAccessibleFieldDOMStructure extends boolean> extends ExportedUseMobileRangePickerSlotProps<TEnableAccessibleFieldDOMStructure>, Pick<PickersLayoutSlotProps<PickerRangeValue>, 'toolbar'> {}
|
|
5
18
|
export interface MobileRangeOnlyPickerProps extends RangeOnlyPickerProps {}
|
|
6
19
|
export interface UseMobileRangePickerProps<TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, TError, TExternalProps extends UsePickerViewsProps<any, TView, any>> extends UseRangePickerProps<TView, TError, TExternalProps> {
|
|
7
20
|
/**
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { FieldRef } from '@mui/x-date-pickers/models';
|
|
3
|
-
import { PickerRangeValue } from '@mui/x-date-pickers/internals';
|
|
4
1
|
import { RangePosition } from "../../models/index.js";
|
|
5
2
|
export interface UseRangePositionProps {
|
|
6
3
|
/**
|
|
@@ -24,4 +21,4 @@ export interface UseRangePositionResponse {
|
|
|
24
21
|
rangePosition: RangePosition;
|
|
25
22
|
setRangePosition: (newPosition: RangePosition) => void;
|
|
26
23
|
}
|
|
27
|
-
export declare const useRangePosition: (props: UseRangePositionProps
|
|
24
|
+
export declare const useRangePosition: (props: UseRangePositionProps) => UseRangePositionResponse;
|
|
@@ -1,32 +1,15 @@
|
|
|
1
1
|
import useControlled from '@mui/utils/useControlled';
|
|
2
2
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
3
|
-
export const useRangePosition =
|
|
3
|
+
export const useRangePosition = props => {
|
|
4
4
|
const [rangePosition, setRangePosition] = useControlled({
|
|
5
5
|
name: 'useRangePosition',
|
|
6
6
|
state: 'rangePosition',
|
|
7
7
|
controlled: props.rangePosition,
|
|
8
8
|
default: props.defaultRangePosition ?? 'start'
|
|
9
9
|
});
|
|
10
|
-
|
|
11
|
-
// When using a single input field,
|
|
12
|
-
// we want to select the 1st section of the edited date when updating the range position.
|
|
13
|
-
const syncRangePositionWithSingleInputField = newRangePosition => {
|
|
14
|
-
if (singleInputFieldRef?.current == null) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const sections = singleInputFieldRef.current.getSections();
|
|
18
|
-
const targetActiveSectionIndex = newRangePosition === 'start' ? 0 : sections.length / 2;
|
|
19
|
-
const activeSectionIndex = singleInputFieldRef.current.getActiveSectionIndex();
|
|
20
|
-
// if the active section is already within the target range, we don't need to update it.
|
|
21
|
-
if (activeSectionIndex && activeSectionIndex >= targetActiveSectionIndex && activeSectionIndex < targetActiveSectionIndex + sections.length / 2) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
singleInputFieldRef.current.setSelectedSections(targetActiveSectionIndex);
|
|
25
|
-
};
|
|
26
10
|
const handleRangePositionChange = useEventCallback(newRangePosition => {
|
|
27
11
|
setRangePosition(newRangePosition);
|
|
28
12
|
props.onRangePositionChange?.(newRangePosition);
|
|
29
|
-
syncRangePositionWithSingleInputField(newRangePosition);
|
|
30
13
|
});
|
|
31
14
|
return {
|
|
32
15
|
rangePosition,
|
|
@@ -39,10 +39,10 @@ export const useStaticRangePicker = _ref => {
|
|
|
39
39
|
renderCurrentView
|
|
40
40
|
} = usePicker(_extends({}, pickerParams, {
|
|
41
41
|
props,
|
|
42
|
+
variant: displayStaticWrapperAs,
|
|
42
43
|
autoFocusView: autoFocus ?? false,
|
|
43
|
-
|
|
44
|
-
localeText
|
|
45
|
-
variant: displayStaticWrapperAs
|
|
44
|
+
viewContainerRole: null,
|
|
45
|
+
localeText
|
|
46
46
|
}));
|
|
47
47
|
const Layout = slots?.layout ?? PickerStaticLayout;
|
|
48
48
|
const renderPicker = () => /*#__PURE__*/_jsx(PickerRangePositionContext.Provider, {
|
|
@@ -12,10 +12,11 @@ import { styled, useThemeProps } from '@mui/material/styles';
|
|
|
12
12
|
import composeClasses from '@mui/utils/composeClasses';
|
|
13
13
|
import useSlotProps from '@mui/utils/useSlotProps';
|
|
14
14
|
import useForkRef from '@mui/utils/useForkRef';
|
|
15
|
-
import { cleanFieldResponse, useFieldOwnerState, useNullablePickerContext } from '@mui/x-date-pickers/internals';
|
|
15
|
+
import { cleanFieldResponse, useFieldOwnerState, PickerFieldUIContext, useNullablePickerContext } from '@mui/x-date-pickers/internals';
|
|
16
16
|
import { useSplitFieldProps } from '@mui/x-date-pickers/hooks';
|
|
17
17
|
import { PickersTextField } from '@mui/x-date-pickers/PickersTextField';
|
|
18
18
|
import { useMultiInputRangeField } from "../../../hooks/useMultiInputRangeField/index.js";
|
|
19
|
+
import { useTextFieldProps } from "./useTextFieldProps.js";
|
|
19
20
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
20
21
|
export function createMultiInputRangeField({
|
|
21
22
|
useManager,
|
|
@@ -52,14 +53,19 @@ export function createMultiInputRangeField({
|
|
|
52
53
|
// eslint-disable-next-line material-ui/mui-name-matches-component-name
|
|
53
54
|
name
|
|
54
55
|
});
|
|
56
|
+
const pickerFieldUIContext = React.useContext(PickerFieldUIContext);
|
|
57
|
+
const pickerContext = useNullablePickerContext();
|
|
55
58
|
const manager = useManager({
|
|
56
59
|
enableAccessibleFieldDOMStructure: props.enableAccessibleFieldDOMStructure,
|
|
57
60
|
dateSeparator: props.dateSeparator
|
|
58
61
|
});
|
|
59
62
|
const {
|
|
60
|
-
internalProps,
|
|
63
|
+
internalProps: rawInternalProps,
|
|
61
64
|
forwardedProps
|
|
62
65
|
} = useSplitFieldProps(themeProps, manager.valueType);
|
|
66
|
+
const internalProps = pickerContext?.variant === 'mobile' ? _extends({}, rawInternalProps, {
|
|
67
|
+
readOnly: true
|
|
68
|
+
}) : rawInternalProps;
|
|
63
69
|
const {
|
|
64
70
|
slots,
|
|
65
71
|
slotProps,
|
|
@@ -69,7 +75,6 @@ export function createMultiInputRangeField({
|
|
|
69
75
|
otherForwardedProps = _objectWithoutPropertiesLoose(forwardedProps, _excluded);
|
|
70
76
|
const classes = useUtilityClasses(classesProp);
|
|
71
77
|
const ownerState = useFieldOwnerState(internalProps);
|
|
72
|
-
const pickerContext = useNullablePickerContext();
|
|
73
78
|
const handleRef = useForkRef(ref, pickerContext?.rootRef);
|
|
74
79
|
const Root = slots?.root ?? MultiInputRangeFieldRoot;
|
|
75
80
|
const rootProps = useSlotProps({
|
|
@@ -82,29 +87,22 @@ export function createMultiInputRangeField({
|
|
|
82
87
|
ownerState,
|
|
83
88
|
className: clsx(className, classes.root)
|
|
84
89
|
});
|
|
85
|
-
const startTextFieldProps =
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
position: 'start'
|
|
90
|
-
})
|
|
90
|
+
const startTextFieldProps = useTextFieldProps({
|
|
91
|
+
slotProps,
|
|
92
|
+
ownerState,
|
|
93
|
+
position: 'start'
|
|
91
94
|
});
|
|
92
|
-
const endTextFieldProps =
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
position: 'end'
|
|
97
|
-
})
|
|
95
|
+
const endTextFieldProps = useTextFieldProps({
|
|
96
|
+
slotProps,
|
|
97
|
+
ownerState,
|
|
98
|
+
position: 'end'
|
|
98
99
|
});
|
|
99
|
-
const {
|
|
100
|
-
startDate,
|
|
101
|
-
endDate,
|
|
102
|
-
enableAccessibleFieldDOMStructure
|
|
103
|
-
} = useMultiInputRangeField({
|
|
100
|
+
const fieldResponse = useMultiInputRangeField({
|
|
104
101
|
manager,
|
|
105
102
|
internalProps,
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
rootProps,
|
|
104
|
+
startTextFieldProps,
|
|
105
|
+
endTextFieldProps
|
|
108
106
|
});
|
|
109
107
|
const Separator = slots?.separator ?? MultiInputRangeFieldSeparator;
|
|
110
108
|
const separatorProps = useSlotProps({
|
|
@@ -116,19 +114,15 @@ export function createMultiInputRangeField({
|
|
|
116
114
|
ownerState,
|
|
117
115
|
className: classes.separator
|
|
118
116
|
});
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
textFieldProps: endDateProps
|
|
124
|
-
} = cleanFieldResponse(endDate);
|
|
125
|
-
const TextField = slots?.textField ?? (enableAccessibleFieldDOMStructure === false ? MuiTextField : PickersTextField);
|
|
126
|
-
return /*#__PURE__*/_jsxs(Root, _extends({}, rootProps, {
|
|
117
|
+
const cleanStartTextFieldResponse = cleanFieldResponse(fieldResponse.startTextField);
|
|
118
|
+
const cleanEndTextFieldResponse = cleanFieldResponse(fieldResponse.endTextField);
|
|
119
|
+
const TextField = slots?.textField ?? pickerFieldUIContext.slots.textField ?? (fieldResponse.enableAccessibleFieldDOMStructure === false ? MuiTextField : PickersTextField);
|
|
120
|
+
return /*#__PURE__*/_jsxs(Root, _extends({}, fieldResponse.root, {
|
|
127
121
|
children: [/*#__PURE__*/_jsx(TextField, _extends({
|
|
128
122
|
fullWidth: true
|
|
129
|
-
},
|
|
123
|
+
}, cleanStartTextFieldResponse.textFieldProps)), /*#__PURE__*/_jsx(Separator, _extends({}, separatorProps)), /*#__PURE__*/_jsx(TextField, _extends({
|
|
130
124
|
fullWidth: true
|
|
131
|
-
},
|
|
125
|
+
}, cleanEndTextFieldResponse.textFieldProps))]
|
|
132
126
|
}));
|
|
133
127
|
});
|
|
134
128
|
MultiInputRangeField.fieldType = 'multi-input';
|
package/modern/internals/utils/createMultiInputRangeField/createMultiInputRangeField.types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { FieldOwnerState } from '@mui/x-date-pickers/models';
|
|
|
7
7
|
import { PickerManagerEnableAccessibleFieldDOMStructure, PickerManagerFieldInternalProps } from '@mui/x-date-pickers/internals';
|
|
8
8
|
import { FieldType, MultiInputFieldRefs, RangeFieldSeparatorProps, RangePosition } from "../../../models/index.js";
|
|
9
9
|
import { PickerAnyRangeManager } from "../../models/managers.js";
|
|
10
|
-
export type MultiInputRangeFieldProps<TManager extends PickerAnyRangeManager> = MultiInputFieldRefs & RangeFieldSeparatorProps & Omit<PickerManagerFieldInternalProps<TManager>, 'unstableFieldRef' | 'clearable' | 'onClear'> & Omit<StackProps, 'position' | keyof PickerManagerFieldInternalProps<TManager>> & {
|
|
10
|
+
export type MultiInputRangeFieldProps<TManager extends PickerAnyRangeManager> = MultiInputFieldRefs & RangeFieldSeparatorProps & Omit<PickerManagerFieldInternalProps<TManager>, 'unstableFieldRef' | 'clearable' | 'onClear' | 'focused'> & Omit<StackProps, 'position' | keyof PickerManagerFieldInternalProps<TManager>> & {
|
|
11
11
|
/**
|
|
12
12
|
* If `true`, the field is focused during the first mount.
|
|
13
13
|
* @default false
|