@mui/x-date-pickers-pro 8.0.0-alpha.0 → 8.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +429 -5
- package/DateRangeCalendar/DateRangeCalendar.js +3 -1
- package/DateRangePicker/DateRangePickerToolbar.js +0 -12
- package/DateTimeRangePicker/DateTimeRangePickerToolbar.d.ts +2 -2
- package/DateTimeRangePicker/DateTimeRangePickerToolbar.js +6 -16
- package/README.md +2 -2
- package/index.js +1 -1
- package/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -2
- package/internals/hooks/useEnrichedRangePickerFieldProps.d.ts +2 -2
- package/internals/hooks/useEnrichedRangePickerFieldProps.js +9 -9
- package/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +2 -2
- package/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +2 -0
- package/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +2 -0
- package/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +3 -1
- package/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +1 -1
- package/internals/utils/date-range-manager.d.ts +2 -1
- package/internals/utils/date-range-manager.js +11 -9
- package/internals/utils/releaseInfo.js +1 -1
- package/modern/DateRangeCalendar/DateRangeCalendar.js +3 -1
- package/modern/DateRangePicker/DateRangePickerToolbar.js +0 -12
- package/modern/DateTimeRangePicker/DateTimeRangePickerToolbar.js +6 -16
- package/modern/index.js +1 -1
- package/modern/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -2
- package/modern/internals/hooks/useEnrichedRangePickerFieldProps.js +9 -9
- package/modern/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +2 -2
- package/modern/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +2 -0
- package/modern/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +2 -0
- package/modern/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +3 -1
- package/modern/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +1 -1
- package/modern/internals/utils/date-range-manager.js +11 -9
- package/modern/internals/utils/releaseInfo.js +1 -1
- package/node/DateRangeCalendar/DateRangeCalendar.js +3 -1
- package/node/DateRangePicker/DateRangePickerToolbar.js +0 -12
- package/node/DateTimeRangePicker/DateTimeRangePickerToolbar.js +5 -15
- package/node/index.js +1 -1
- package/node/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +2 -2
- package/node/internals/hooks/useEnrichedRangePickerFieldProps.js +9 -9
- package/node/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +2 -2
- package/node/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +2 -0
- package/node/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +2 -0
- package/node/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +3 -1
- package/node/internals/hooks/useStaticRangePicker/useStaticRangePicker.js +1 -1
- package/node/internals/utils/date-range-manager.js +11 -9
- package/node/internals/utils/releaseInfo.js +1 -1
- package/package.json +6 -6
|
@@ -8,7 +8,7 @@ import useForkRef from '@mui/utils/useForkRef';
|
|
|
8
8
|
import { usePickerTranslations } from '@mui/x-date-pickers/hooks';
|
|
9
9
|
import { onSpaceOrEnter } from '@mui/x-date-pickers/internals';
|
|
10
10
|
const useMultiInputFieldSlotProps = ({
|
|
11
|
-
|
|
11
|
+
variant,
|
|
12
12
|
open,
|
|
13
13
|
actions,
|
|
14
14
|
readOnly,
|
|
@@ -33,7 +33,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
33
33
|
const handleEndFieldRef = useForkRef(fieldProps.unstableEndFieldRef, endFieldRef);
|
|
34
34
|
const previousRangePosition = React.useRef(rangePosition);
|
|
35
35
|
React.useEffect(() => {
|
|
36
|
-
if (!open) {
|
|
36
|
+
if (!open || variant === 'mobile') {
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
const currentFieldRef = rangePosition === 'start' ? startFieldRef : endFieldRef;
|
|
@@ -49,7 +49,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
49
49
|
// use the current view or `0` when the range position has just been swapped
|
|
50
50
|
previousRangePosition.current === rangePosition ? currentView : 0);
|
|
51
51
|
previousRangePosition.current = rangePosition;
|
|
52
|
-
}, [rangePosition, open, currentView, startFieldRef, endFieldRef]);
|
|
52
|
+
}, [rangePosition, open, currentView, startFieldRef, endFieldRef, variant]);
|
|
53
53
|
const openRangeStartSelection = event => {
|
|
54
54
|
event.stopPropagation();
|
|
55
55
|
onRangePositionChange('start');
|
|
@@ -98,7 +98,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
98
98
|
focused: open ? rangePosition === 'start' : undefined
|
|
99
99
|
}, !readOnly && !fieldProps.disabled && {
|
|
100
100
|
onClick: openRangeStartSelection
|
|
101
|
-
},
|
|
101
|
+
}, variant === 'mobile' && {
|
|
102
102
|
readOnly: true
|
|
103
103
|
});
|
|
104
104
|
if (anchorRef) {
|
|
@@ -114,7 +114,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
114
114
|
focused: open ? rangePosition === 'end' : undefined
|
|
115
115
|
}, !readOnly && !fieldProps.disabled && {
|
|
116
116
|
onClick: openRangeEndSelection
|
|
117
|
-
},
|
|
117
|
+
}, variant === 'mobile' && {
|
|
118
118
|
readOnly: true
|
|
119
119
|
});
|
|
120
120
|
InputProps = resolvedComponentProps?.InputProps;
|
|
@@ -146,7 +146,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
146
146
|
return enrichedFieldProps;
|
|
147
147
|
};
|
|
148
148
|
const useSingleInputFieldSlotProps = ({
|
|
149
|
-
|
|
149
|
+
variant,
|
|
150
150
|
open,
|
|
151
151
|
actions,
|
|
152
152
|
readOnly,
|
|
@@ -166,7 +166,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
166
166
|
}) => {
|
|
167
167
|
const handleFieldRef = useForkRef(fieldProps.unstableFieldRef, startFieldRef, endFieldRef);
|
|
168
168
|
React.useEffect(() => {
|
|
169
|
-
if (!open || !startFieldRef.current) {
|
|
169
|
+
if (!open || !startFieldRef.current || variant === 'mobile') {
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
172
|
if (startFieldRef.current.isFieldFocused()) {
|
|
@@ -179,7 +179,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
179
179
|
const newSelectedSection = rangePosition === 'start' ? sections.indexOf(currentView) : sections.lastIndexOf(currentView);
|
|
180
180
|
startFieldRef.current?.focusField(newSelectedSection);
|
|
181
181
|
}
|
|
182
|
-
}, [rangePosition, open, currentView, startFieldRef]);
|
|
182
|
+
}, [rangePosition, open, currentView, startFieldRef, variant]);
|
|
183
183
|
const updateRangePosition = () => {
|
|
184
184
|
if (!startFieldRef.current?.isFieldFocused()) {
|
|
185
185
|
return;
|
|
@@ -225,7 +225,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
225
225
|
focused: open ? true : undefined
|
|
226
226
|
}, labelId != null && {
|
|
227
227
|
id: labelId
|
|
228
|
-
},
|
|
228
|
+
}, variant === 'mobile' && {
|
|
229
229
|
readOnly: true
|
|
230
230
|
}, !readOnly && !fieldProps.disabled && {
|
|
231
231
|
onClick: openPicker
|
|
@@ -57,7 +57,7 @@ export const useMobileRangePicker = _ref => {
|
|
|
57
57
|
ownerState
|
|
58
58
|
} = usePicker(_extends({}, pickerParams, {
|
|
59
59
|
props,
|
|
60
|
-
|
|
60
|
+
variant: 'mobile',
|
|
61
61
|
autoFocusView: true,
|
|
62
62
|
fieldRef: rangePosition === 'start' ? startFieldRef : endFieldRef,
|
|
63
63
|
localeText,
|
|
@@ -95,7 +95,7 @@ export const useMobileRangePicker = _ref => {
|
|
|
95
95
|
});
|
|
96
96
|
const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false;
|
|
97
97
|
const enrichedFieldProps = useEnrichedRangePickerFieldProps({
|
|
98
|
-
|
|
98
|
+
variant: 'mobile',
|
|
99
99
|
fieldType,
|
|
100
100
|
open,
|
|
101
101
|
actions,
|
|
@@ -18,6 +18,7 @@ export const useMultiInputDateRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -39,6 +40,7 @@ export const useMultiInputDateRangeField = ({
|
|
|
39
40
|
timezone: timezoneProp,
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
43
|
+
referenceDate,
|
|
42
44
|
onChange,
|
|
43
45
|
valueManager: rangeValueManager
|
|
44
46
|
});
|
|
@@ -18,6 +18,7 @@ export const useMultiInputDateTimeRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -39,6 +40,7 @@ export const useMultiInputDateTimeRangeField = ({
|
|
|
39
40
|
timezone: timezoneProp,
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
43
|
+
referenceDate,
|
|
42
44
|
onChange,
|
|
43
45
|
valueManager: rangeValueManager
|
|
44
46
|
});
|
|
@@ -18,6 +18,7 @@ export const useMultiInputTimeRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -40,7 +41,8 @@ export const useMultiInputTimeRangeField = ({
|
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
42
43
|
onChange,
|
|
43
|
-
valueManager: rangeValueManager
|
|
44
|
+
valueManager: rangeValueManager,
|
|
45
|
+
referenceDate
|
|
44
46
|
});
|
|
45
47
|
const {
|
|
46
48
|
validationError,
|
|
@@ -52,7 +52,7 @@ export const useStaticRangePicker = _ref => {
|
|
|
52
52
|
rangePosition,
|
|
53
53
|
onRangePositionChange
|
|
54
54
|
},
|
|
55
|
-
|
|
55
|
+
variant: displayStaticWrapperAs
|
|
56
56
|
}));
|
|
57
57
|
const Layout = slots?.layout ?? PickerStaticLayout;
|
|
58
58
|
const slotPropsForLayout = _extends({}, slotProps, {
|
|
@@ -13,11 +13,12 @@ interface CalculateRangeChangeOptions {
|
|
|
13
13
|
*/
|
|
14
14
|
allowRangeFlip?: boolean;
|
|
15
15
|
shouldMergeDateAndTime?: boolean;
|
|
16
|
+
referenceDate?: PickerValidDate;
|
|
16
17
|
}
|
|
17
18
|
interface CalculateRangeChangeResponse {
|
|
18
19
|
nextSelection: RangePosition;
|
|
19
20
|
newRange: PickerRangeValue;
|
|
20
21
|
}
|
|
21
|
-
export declare function calculateRangeChange({ utils, range, newDate: selectedDate, rangePosition, allowRangeFlip, shouldMergeDateAndTime, }: CalculateRangeChangeOptions): CalculateRangeChangeResponse;
|
|
22
|
+
export declare function calculateRangeChange({ utils, range, newDate: selectedDate, rangePosition, allowRangeFlip, shouldMergeDateAndTime, referenceDate, }: CalculateRangeChangeOptions): CalculateRangeChangeResponse;
|
|
22
23
|
export declare function calculateRangePreview(options: CalculateRangeChangeOptions): PickerRangeValue;
|
|
23
24
|
export {};
|
|
@@ -5,7 +5,8 @@ export function calculateRangeChange({
|
|
|
5
5
|
newDate: selectedDate,
|
|
6
6
|
rangePosition,
|
|
7
7
|
allowRangeFlip = false,
|
|
8
|
-
shouldMergeDateAndTime = false
|
|
8
|
+
shouldMergeDateAndTime = false,
|
|
9
|
+
referenceDate
|
|
9
10
|
}) {
|
|
10
11
|
const [start, end] = range;
|
|
11
12
|
if (shouldMergeDateAndTime && selectedDate) {
|
|
@@ -17,29 +18,30 @@ export function calculateRangeChange({
|
|
|
17
18
|
selectedDate = mergeDateAndTime(utils, selectedDate, end);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
21
|
+
const newSelectedDate = referenceDate && selectedDate && shouldMergeDateAndTime ? mergeDateAndTime(utils, selectedDate, referenceDate) : selectedDate;
|
|
20
22
|
if (rangePosition === 'start') {
|
|
21
23
|
const truthyResult = allowRangeFlip ? {
|
|
22
24
|
nextSelection: 'start',
|
|
23
|
-
newRange: [end,
|
|
25
|
+
newRange: [end, newSelectedDate]
|
|
24
26
|
} : {
|
|
25
27
|
nextSelection: 'end',
|
|
26
|
-
newRange: [
|
|
28
|
+
newRange: [newSelectedDate, null]
|
|
27
29
|
};
|
|
28
|
-
return Boolean(end) && utils.isAfter(
|
|
30
|
+
return Boolean(end) && utils.isAfter(newSelectedDate, end) ? truthyResult : {
|
|
29
31
|
nextSelection: 'end',
|
|
30
|
-
newRange: [
|
|
32
|
+
newRange: [newSelectedDate, end]
|
|
31
33
|
};
|
|
32
34
|
}
|
|
33
35
|
const truthyResult = allowRangeFlip ? {
|
|
34
36
|
nextSelection: 'end',
|
|
35
|
-
newRange: [
|
|
37
|
+
newRange: [newSelectedDate, start]
|
|
36
38
|
} : {
|
|
37
39
|
nextSelection: 'end',
|
|
38
|
-
newRange: [
|
|
40
|
+
newRange: [newSelectedDate, null]
|
|
39
41
|
};
|
|
40
|
-
return Boolean(start) && utils.isBeforeDay(
|
|
42
|
+
return Boolean(start) && utils.isBeforeDay(newSelectedDate, start) ? truthyResult : {
|
|
41
43
|
nextSelection: 'start',
|
|
42
|
-
newRange: [start,
|
|
44
|
+
newRange: [start, newSelectedDate]
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
export function calculateRangePreview(options) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ponyfillGlobal } from '@mui/utils';
|
|
2
2
|
export const getReleaseInfo = () => {
|
|
3
|
-
const releaseInfo = "
|
|
3
|
+
const releaseInfo = "MTczMjIzMDAwMDAwMA==";
|
|
4
4
|
if (process.env.NODE_ENV !== 'production') {
|
|
5
5
|
// A simple hack to set the value in the test environment (has no build step).
|
|
6
6
|
// eslint-disable-next-line no-useless-concat
|
|
@@ -169,6 +169,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
|
|
|
169
169
|
name: 'DateRangeCalendar',
|
|
170
170
|
timezone: timezoneProp,
|
|
171
171
|
value: valueProp,
|
|
172
|
+
referenceDate,
|
|
172
173
|
defaultValue,
|
|
173
174
|
onChange,
|
|
174
175
|
valueManager: rangeValueManager
|
|
@@ -210,7 +211,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
|
|
|
210
211
|
range: value,
|
|
211
212
|
rangePosition,
|
|
212
213
|
allowRangeFlip,
|
|
213
|
-
shouldMergeDateAndTime: true
|
|
214
|
+
shouldMergeDateAndTime: true,
|
|
215
|
+
referenceDate
|
|
214
216
|
});
|
|
215
217
|
const isNextSectionAvailable = availableRangePositions.includes(nextSelection);
|
|
216
218
|
if (isNextSectionAvailable) {
|
|
@@ -99,12 +99,6 @@ process.env.NODE_ENV !== "production" ? DateRangePickerToolbar.propTypes = {
|
|
|
99
99
|
*/
|
|
100
100
|
classes: PropTypes.object,
|
|
101
101
|
className: PropTypes.string,
|
|
102
|
-
/**
|
|
103
|
-
* If `true`, the component is disabled.
|
|
104
|
-
* When disabled, the value cannot be changed and no interaction is possible.
|
|
105
|
-
* @default false
|
|
106
|
-
*/
|
|
107
|
-
disabled: PropTypes.bool,
|
|
108
102
|
/**
|
|
109
103
|
* If `true`, show the toolbar even in desktop mode.
|
|
110
104
|
* @default `true` for Desktop, `false` for Mobile.
|
|
@@ -118,12 +112,6 @@ process.env.NODE_ENV !== "production" ? DateRangePickerToolbar.propTypes = {
|
|
|
118
112
|
*/
|
|
119
113
|
onViewChange: PropTypes.func.isRequired,
|
|
120
114
|
rangePosition: PropTypes.oneOf(['end', 'start']).isRequired,
|
|
121
|
-
/**
|
|
122
|
-
* If `true`, the component is read-only.
|
|
123
|
-
* When read-only, the value cannot be changed but the user can interact with the interface.
|
|
124
|
-
* @default false
|
|
125
|
-
*/
|
|
126
|
-
readOnly: PropTypes.bool,
|
|
127
115
|
/**
|
|
128
116
|
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
129
117
|
*/
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
4
4
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
5
|
-
const _excluded = ["value", "rangePosition", "onRangePositionChange", "className", "onViewChange", "toolbarVariant", "onChange", "classes", "view", "isLandscape", "views", "ampm", "
|
|
5
|
+
const _excluded = ["value", "rangePosition", "onRangePositionChange", "className", "onViewChange", "toolbarVariant", "onChange", "classes", "view", "isLandscape", "views", "ampm", "hidden", "toolbarFormat", "toolbarPlaceholder", "titleId", "sx"];
|
|
6
6
|
import * as React from 'react';
|
|
7
7
|
import PropTypes from 'prop-types';
|
|
8
8
|
import clsx from 'clsx';
|
|
9
9
|
import { styled, useThemeProps } from '@mui/material/styles';
|
|
10
10
|
import composeClasses from '@mui/utils/composeClasses';
|
|
11
11
|
import { useUtils } from '@mui/x-date-pickers/internals';
|
|
12
|
-
import { usePickerTranslations } from '@mui/x-date-pickers/hooks';
|
|
12
|
+
import { usePickerContext, usePickerTranslations } from '@mui/x-date-pickers/hooks';
|
|
13
13
|
import { DateTimePickerToolbar } from '@mui/x-date-pickers/DateTimePicker';
|
|
14
14
|
import { getDateTimeRangePickerToolbarUtilityClass } from "./dateTimeRangePickerToolbarClasses.js";
|
|
15
15
|
import { calculateRangeChange } from "../internals/utils/date-range-manager.js";
|
|
@@ -86,8 +86,6 @@ const DateTimeRangePickerToolbar = /*#__PURE__*/React.forwardRef(function DateTi
|
|
|
86
86
|
isLandscape,
|
|
87
87
|
views,
|
|
88
88
|
ampm,
|
|
89
|
-
disabled,
|
|
90
|
-
readOnly,
|
|
91
89
|
hidden,
|
|
92
90
|
toolbarFormat,
|
|
93
91
|
toolbarPlaceholder,
|
|
@@ -95,6 +93,10 @@ const DateTimeRangePickerToolbar = /*#__PURE__*/React.forwardRef(function DateTi
|
|
|
95
93
|
sx
|
|
96
94
|
} = props,
|
|
97
95
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
96
|
+
const {
|
|
97
|
+
disabled,
|
|
98
|
+
readOnly
|
|
99
|
+
} = usePickerContext();
|
|
98
100
|
const commonToolbarProps = {
|
|
99
101
|
isLandscape,
|
|
100
102
|
views,
|
|
@@ -183,12 +185,6 @@ process.env.NODE_ENV !== "production" ? DateTimeRangePickerToolbar.propTypes = {
|
|
|
183
185
|
*/
|
|
184
186
|
classes: PropTypes.object,
|
|
185
187
|
className: PropTypes.string,
|
|
186
|
-
/**
|
|
187
|
-
* If `true`, the component is disabled.
|
|
188
|
-
* When disabled, the value cannot be changed and no interaction is possible.
|
|
189
|
-
* @default false
|
|
190
|
-
*/
|
|
191
|
-
disabled: PropTypes.bool,
|
|
192
188
|
/**
|
|
193
189
|
* If `true`, show the toolbar even in desktop mode.
|
|
194
190
|
* @default `true` for Desktop, `false` for Mobile.
|
|
@@ -204,12 +200,6 @@ process.env.NODE_ENV !== "production" ? DateTimeRangePickerToolbar.propTypes = {
|
|
|
204
200
|
*/
|
|
205
201
|
onViewChange: PropTypes.func.isRequired,
|
|
206
202
|
rangePosition: PropTypes.oneOf(['end', 'start']).isRequired,
|
|
207
|
-
/**
|
|
208
|
-
* If `true`, the component is read-only.
|
|
209
|
-
* When read-only, the value cannot be changed but the user can interact with the interface.
|
|
210
|
-
* @default false
|
|
211
|
-
*/
|
|
212
|
-
readOnly: PropTypes.bool,
|
|
213
203
|
/**
|
|
214
204
|
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
215
205
|
*/
|
package/modern/index.js
CHANGED
|
@@ -60,7 +60,7 @@ export const useDesktopRangePicker = _ref => {
|
|
|
60
60
|
ownerState
|
|
61
61
|
} = usePicker(_extends({}, pickerParams, {
|
|
62
62
|
props,
|
|
63
|
-
|
|
63
|
+
variant: 'desktop',
|
|
64
64
|
autoFocusView: false,
|
|
65
65
|
fieldRef: rangePosition === 'start' ? startFieldRef : endFieldRef,
|
|
66
66
|
localeText,
|
|
@@ -113,7 +113,7 @@ export const useDesktopRangePicker = _ref => {
|
|
|
113
113
|
ownerState
|
|
114
114
|
});
|
|
115
115
|
const enrichedFieldProps = useEnrichedRangePickerFieldProps({
|
|
116
|
-
|
|
116
|
+
variant: 'desktop',
|
|
117
117
|
fieldType,
|
|
118
118
|
open,
|
|
119
119
|
actions,
|
|
@@ -8,7 +8,7 @@ import useForkRef from '@mui/utils/useForkRef';
|
|
|
8
8
|
import { usePickerTranslations } from '@mui/x-date-pickers/hooks';
|
|
9
9
|
import { onSpaceOrEnter } from '@mui/x-date-pickers/internals';
|
|
10
10
|
const useMultiInputFieldSlotProps = ({
|
|
11
|
-
|
|
11
|
+
variant,
|
|
12
12
|
open,
|
|
13
13
|
actions,
|
|
14
14
|
readOnly,
|
|
@@ -33,7 +33,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
33
33
|
const handleEndFieldRef = useForkRef(fieldProps.unstableEndFieldRef, endFieldRef);
|
|
34
34
|
const previousRangePosition = React.useRef(rangePosition);
|
|
35
35
|
React.useEffect(() => {
|
|
36
|
-
if (!open) {
|
|
36
|
+
if (!open || variant === 'mobile') {
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
const currentFieldRef = rangePosition === 'start' ? startFieldRef : endFieldRef;
|
|
@@ -49,7 +49,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
49
49
|
// use the current view or `0` when the range position has just been swapped
|
|
50
50
|
previousRangePosition.current === rangePosition ? currentView : 0);
|
|
51
51
|
previousRangePosition.current = rangePosition;
|
|
52
|
-
}, [rangePosition, open, currentView, startFieldRef, endFieldRef]);
|
|
52
|
+
}, [rangePosition, open, currentView, startFieldRef, endFieldRef, variant]);
|
|
53
53
|
const openRangeStartSelection = event => {
|
|
54
54
|
event.stopPropagation();
|
|
55
55
|
onRangePositionChange('start');
|
|
@@ -98,7 +98,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
98
98
|
focused: open ? rangePosition === 'start' : undefined
|
|
99
99
|
}, !readOnly && !fieldProps.disabled && {
|
|
100
100
|
onClick: openRangeStartSelection
|
|
101
|
-
},
|
|
101
|
+
}, variant === 'mobile' && {
|
|
102
102
|
readOnly: true
|
|
103
103
|
});
|
|
104
104
|
if (anchorRef) {
|
|
@@ -114,7 +114,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
114
114
|
focused: open ? rangePosition === 'end' : undefined
|
|
115
115
|
}, !readOnly && !fieldProps.disabled && {
|
|
116
116
|
onClick: openRangeEndSelection
|
|
117
|
-
},
|
|
117
|
+
}, variant === 'mobile' && {
|
|
118
118
|
readOnly: true
|
|
119
119
|
});
|
|
120
120
|
InputProps = resolvedComponentProps?.InputProps;
|
|
@@ -146,7 +146,7 @@ const useMultiInputFieldSlotProps = ({
|
|
|
146
146
|
return enrichedFieldProps;
|
|
147
147
|
};
|
|
148
148
|
const useSingleInputFieldSlotProps = ({
|
|
149
|
-
|
|
149
|
+
variant,
|
|
150
150
|
open,
|
|
151
151
|
actions,
|
|
152
152
|
readOnly,
|
|
@@ -166,7 +166,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
166
166
|
}) => {
|
|
167
167
|
const handleFieldRef = useForkRef(fieldProps.unstableFieldRef, startFieldRef, endFieldRef);
|
|
168
168
|
React.useEffect(() => {
|
|
169
|
-
if (!open || !startFieldRef.current) {
|
|
169
|
+
if (!open || !startFieldRef.current || variant === 'mobile') {
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
172
|
if (startFieldRef.current.isFieldFocused()) {
|
|
@@ -179,7 +179,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
179
179
|
const newSelectedSection = rangePosition === 'start' ? sections.indexOf(currentView) : sections.lastIndexOf(currentView);
|
|
180
180
|
startFieldRef.current?.focusField(newSelectedSection);
|
|
181
181
|
}
|
|
182
|
-
}, [rangePosition, open, currentView, startFieldRef]);
|
|
182
|
+
}, [rangePosition, open, currentView, startFieldRef, variant]);
|
|
183
183
|
const updateRangePosition = () => {
|
|
184
184
|
if (!startFieldRef.current?.isFieldFocused()) {
|
|
185
185
|
return;
|
|
@@ -225,7 +225,7 @@ const useSingleInputFieldSlotProps = ({
|
|
|
225
225
|
focused: open ? true : undefined
|
|
226
226
|
}, labelId != null && {
|
|
227
227
|
id: labelId
|
|
228
|
-
},
|
|
228
|
+
}, variant === 'mobile' && {
|
|
229
229
|
readOnly: true
|
|
230
230
|
}, !readOnly && !fieldProps.disabled && {
|
|
231
231
|
onClick: openPicker
|
|
@@ -57,7 +57,7 @@ export const useMobileRangePicker = _ref => {
|
|
|
57
57
|
ownerState
|
|
58
58
|
} = usePicker(_extends({}, pickerParams, {
|
|
59
59
|
props,
|
|
60
|
-
|
|
60
|
+
variant: 'mobile',
|
|
61
61
|
autoFocusView: true,
|
|
62
62
|
fieldRef: rangePosition === 'start' ? startFieldRef : endFieldRef,
|
|
63
63
|
localeText,
|
|
@@ -95,7 +95,7 @@ export const useMobileRangePicker = _ref => {
|
|
|
95
95
|
});
|
|
96
96
|
const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false;
|
|
97
97
|
const enrichedFieldProps = useEnrichedRangePickerFieldProps({
|
|
98
|
-
|
|
98
|
+
variant: 'mobile',
|
|
99
99
|
fieldType,
|
|
100
100
|
open,
|
|
101
101
|
actions,
|
|
@@ -18,6 +18,7 @@ export const useMultiInputDateRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -39,6 +40,7 @@ export const useMultiInputDateRangeField = ({
|
|
|
39
40
|
timezone: timezoneProp,
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
43
|
+
referenceDate,
|
|
42
44
|
onChange,
|
|
43
45
|
valueManager: rangeValueManager
|
|
44
46
|
});
|
|
@@ -18,6 +18,7 @@ export const useMultiInputDateTimeRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -39,6 +40,7 @@ export const useMultiInputDateTimeRangeField = ({
|
|
|
39
40
|
timezone: timezoneProp,
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
43
|
+
referenceDate,
|
|
42
44
|
onChange,
|
|
43
45
|
valueManager: rangeValueManager
|
|
44
46
|
});
|
|
@@ -18,6 +18,7 @@ export const useMultiInputTimeRangeField = ({
|
|
|
18
18
|
const {
|
|
19
19
|
value: valueProp,
|
|
20
20
|
defaultValue,
|
|
21
|
+
referenceDate,
|
|
21
22
|
format,
|
|
22
23
|
formatDensity,
|
|
23
24
|
shouldRespectLeadingZeros,
|
|
@@ -40,7 +41,8 @@ export const useMultiInputTimeRangeField = ({
|
|
|
40
41
|
value: valueProp,
|
|
41
42
|
defaultValue,
|
|
42
43
|
onChange,
|
|
43
|
-
valueManager: rangeValueManager
|
|
44
|
+
valueManager: rangeValueManager,
|
|
45
|
+
referenceDate
|
|
44
46
|
});
|
|
45
47
|
const {
|
|
46
48
|
validationError,
|
|
@@ -52,7 +52,7 @@ export const useStaticRangePicker = _ref => {
|
|
|
52
52
|
rangePosition,
|
|
53
53
|
onRangePositionChange
|
|
54
54
|
},
|
|
55
|
-
|
|
55
|
+
variant: displayStaticWrapperAs
|
|
56
56
|
}));
|
|
57
57
|
const Layout = slots?.layout ?? PickerStaticLayout;
|
|
58
58
|
const slotPropsForLayout = _extends({}, slotProps, {
|
|
@@ -5,7 +5,8 @@ export function calculateRangeChange({
|
|
|
5
5
|
newDate: selectedDate,
|
|
6
6
|
rangePosition,
|
|
7
7
|
allowRangeFlip = false,
|
|
8
|
-
shouldMergeDateAndTime = false
|
|
8
|
+
shouldMergeDateAndTime = false,
|
|
9
|
+
referenceDate
|
|
9
10
|
}) {
|
|
10
11
|
const [start, end] = range;
|
|
11
12
|
if (shouldMergeDateAndTime && selectedDate) {
|
|
@@ -17,29 +18,30 @@ export function calculateRangeChange({
|
|
|
17
18
|
selectedDate = mergeDateAndTime(utils, selectedDate, end);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
21
|
+
const newSelectedDate = referenceDate && selectedDate && shouldMergeDateAndTime ? mergeDateAndTime(utils, selectedDate, referenceDate) : selectedDate;
|
|
20
22
|
if (rangePosition === 'start') {
|
|
21
23
|
const truthyResult = allowRangeFlip ? {
|
|
22
24
|
nextSelection: 'start',
|
|
23
|
-
newRange: [end,
|
|
25
|
+
newRange: [end, newSelectedDate]
|
|
24
26
|
} : {
|
|
25
27
|
nextSelection: 'end',
|
|
26
|
-
newRange: [
|
|
28
|
+
newRange: [newSelectedDate, null]
|
|
27
29
|
};
|
|
28
|
-
return Boolean(end) && utils.isAfter(
|
|
30
|
+
return Boolean(end) && utils.isAfter(newSelectedDate, end) ? truthyResult : {
|
|
29
31
|
nextSelection: 'end',
|
|
30
|
-
newRange: [
|
|
32
|
+
newRange: [newSelectedDate, end]
|
|
31
33
|
};
|
|
32
34
|
}
|
|
33
35
|
const truthyResult = allowRangeFlip ? {
|
|
34
36
|
nextSelection: 'end',
|
|
35
|
-
newRange: [
|
|
37
|
+
newRange: [newSelectedDate, start]
|
|
36
38
|
} : {
|
|
37
39
|
nextSelection: 'end',
|
|
38
|
-
newRange: [
|
|
40
|
+
newRange: [newSelectedDate, null]
|
|
39
41
|
};
|
|
40
|
-
return Boolean(start) && utils.isBeforeDay(
|
|
42
|
+
return Boolean(start) && utils.isBeforeDay(newSelectedDate, start) ? truthyResult : {
|
|
41
43
|
nextSelection: 'start',
|
|
42
|
-
newRange: [start,
|
|
44
|
+
newRange: [start, newSelectedDate]
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
export function calculateRangePreview(options) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ponyfillGlobal } from '@mui/utils';
|
|
2
2
|
export const getReleaseInfo = () => {
|
|
3
|
-
const releaseInfo = "
|
|
3
|
+
const releaseInfo = "MTczMjIzMDAwMDAwMA==";
|
|
4
4
|
if (process.env.NODE_ENV !== 'production') {
|
|
5
5
|
// A simple hack to set the value in the test environment (has no build step).
|
|
6
6
|
// eslint-disable-next-line no-useless-concat
|
|
@@ -176,6 +176,7 @@ const DateRangeCalendar = exports.DateRangeCalendar = /*#__PURE__*/React.forward
|
|
|
176
176
|
name: 'DateRangeCalendar',
|
|
177
177
|
timezone: timezoneProp,
|
|
178
178
|
value: valueProp,
|
|
179
|
+
referenceDate,
|
|
179
180
|
defaultValue,
|
|
180
181
|
onChange,
|
|
181
182
|
valueManager: _valueManagers.rangeValueManager
|
|
@@ -217,7 +218,8 @@ const DateRangeCalendar = exports.DateRangeCalendar = /*#__PURE__*/React.forward
|
|
|
217
218
|
range: value,
|
|
218
219
|
rangePosition,
|
|
219
220
|
allowRangeFlip,
|
|
220
|
-
shouldMergeDateAndTime: true
|
|
221
|
+
shouldMergeDateAndTime: true,
|
|
222
|
+
referenceDate
|
|
221
223
|
});
|
|
222
224
|
const isNextSectionAvailable = availableRangePositions.includes(nextSelection);
|
|
223
225
|
if (isNextSectionAvailable) {
|
|
@@ -106,12 +106,6 @@ process.env.NODE_ENV !== "production" ? DateRangePickerToolbar.propTypes = {
|
|
|
106
106
|
*/
|
|
107
107
|
classes: _propTypes.default.object,
|
|
108
108
|
className: _propTypes.default.string,
|
|
109
|
-
/**
|
|
110
|
-
* If `true`, the component is disabled.
|
|
111
|
-
* When disabled, the value cannot be changed and no interaction is possible.
|
|
112
|
-
* @default false
|
|
113
|
-
*/
|
|
114
|
-
disabled: _propTypes.default.bool,
|
|
115
109
|
/**
|
|
116
110
|
* If `true`, show the toolbar even in desktop mode.
|
|
117
111
|
* @default `true` for Desktop, `false` for Mobile.
|
|
@@ -125,12 +119,6 @@ process.env.NODE_ENV !== "production" ? DateRangePickerToolbar.propTypes = {
|
|
|
125
119
|
*/
|
|
126
120
|
onViewChange: _propTypes.default.func.isRequired,
|
|
127
121
|
rangePosition: _propTypes.default.oneOf(['end', 'start']).isRequired,
|
|
128
|
-
/**
|
|
129
|
-
* If `true`, the component is read-only.
|
|
130
|
-
* When read-only, the value cannot be changed but the user can interact with the interface.
|
|
131
|
-
* @default false
|
|
132
|
-
*/
|
|
133
|
-
readOnly: _propTypes.default.bool,
|
|
134
122
|
/**
|
|
135
123
|
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
136
124
|
*/
|