@mui/x-date-pickers-pro 6.0.0-alpha.10 → 6.0.0-alpha.11
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 +113 -0
- package/DateRangeCalendar/DateRangeCalendar.d.ts +1 -1
- package/DateRangeCalendar/DateRangeCalendar.js +198 -107
- package/DateRangeCalendar/DateRangeCalendar.types.d.ts +21 -10
- package/DateRangeCalendar/dateRangeCalendarClasses.d.ts +3 -1
- package/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
- package/DateRangeCalendar/useDragRange.d.ts +32 -0
- package/DateRangeCalendar/useDragRange.js +238 -0
- package/DateRangePicker/DateRangePicker.d.ts +1 -1
- package/DateRangePicker/DateRangePickerInput.d.ts +3 -3
- package/DateRangePicker/DateRangePickerInput.js +16 -16
- package/DateRangePicker/DateRangePickerToolbar.d.ts +2 -2
- package/DateRangePicker/DateRangePickerToolbar.js +6 -6
- package/DateRangePicker/DateRangePickerView.d.ts +3 -3
- package/DateRangePicker/DateRangePickerView.js +16 -16
- package/DateRangePicker/DateRangePickerViewDesktop.d.ts +2 -2
- package/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
- package/DateRangePicker/date-range-manager.d.ts +12 -5
- package/DateRangePicker/date-range-manager.js +16 -7
- package/DateRangePicker/dateRangePickerInputClasses.d.ts +1 -1
- package/DateRangePicker/dateRangePickerToolbarClasses.d.ts +1 -1
- package/DateRangePicker/dateRangePickerViewDesktopClasses.d.ts +1 -1
- package/DateRangePickerDay/DateRangePickerDay.d.ts +7 -3
- package/DateRangePickerDay/DateRangePickerDay.js +24 -24
- package/DateRangePickerDay/dateRangePickerDayClasses.d.ts +3 -3
- package/DesktopDateRangePicker/DesktopDateRangePicker.d.ts +1 -1
- package/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -5
- package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.d.ts +1 -1
- package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -1
- package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.types.d.ts +1 -1
- package/MobileDateRangePicker/MobileDateRangePicker.d.ts +1 -1
- package/MobileDateRangePicker/MobileDateRangePicker.js +5 -5
- package/MobileNextDateRangePicker/MobileNextDateRangePicker.d.ts +1 -1
- package/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -1
- package/MobileNextDateRangePicker/MobileNextDateRangePicker.types.d.ts +1 -1
- package/MultiInputDateRangeField/MultiInputDateRangeField.d.ts +1 -1
- package/MultiInputDateRangeField/MultiInputDateRangeField.types.d.ts +4 -3
- package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.d.ts +1 -1
- package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.d.ts +5 -4
- package/MultiInputTimeRangeField/MultiInputTimeRangeField.d.ts +1 -1
- package/MultiInputTimeRangeField/MultiInputTimeRangeField.types.d.ts +5 -4
- package/NextDateRangePicker/NextDateRangePicker.d.ts +1 -1
- package/NextDateRangePicker/NextDateRangePicker.js +5 -0
- package/NextDateRangePicker/shared.d.ts +1 -1
- package/SingleInputDateRangeField/SingleInputDateRangeField.d.ts +1 -1
- package/SingleInputDateRangeField/SingleInputDateRangeField.interfaces.d.ts +2 -2
- package/SingleInputDateRangeField/SingleInputDateRangeField.types.d.ts +3 -3
- package/SingleInputDateRangeField/useSingleInputDateRangeField.d.ts +1 -1
- package/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
- package/StaticDateRangePicker/StaticDateRangePicker.d.ts +1 -1
- package/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
- package/StaticNextDateRangePicker/StaticNextDateRangePicker.d.ts +1 -1
- package/StaticNextDateRangePicker/StaticNextDateRangePicker.js +8 -3
- package/StaticNextDateRangePicker/StaticNextDateRangePicker.types.d.ts +5 -4
- package/index.js +1 -1
- package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +15 -7
- package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +7 -8
- package/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +15 -7
- package/internal/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +7 -8
- package/internal/hooks/useMultiInputRangeField/useMultiInputRangeField.types.d.ts +1 -1
- package/internal/hooks/useRangePickerInputProps.d.ts +4 -4
- package/internal/hooks/useRangePickerInputProps.js +11 -11
- package/internal/hooks/useStaticRangePicker/index.d.ts +2 -0
- package/internal/hooks/useStaticRangePicker/index.js +1 -0
- package/internal/hooks/useStaticRangePicker/useStaticRangePicker.d.ts +10 -0
- package/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +65 -0
- package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.d.ts +29 -0
- package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
- package/internal/hooks/validation/useDateRangeValidation.d.ts +2 -3
- package/internal/hooks/validation/useDateRangeValidation.js +0 -1
- package/internal/hooks/validation/useDateTimeRangeValidation.d.ts +2 -3
- package/internal/hooks/validation/useDateTimeRangeValidation.js +0 -1
- package/internal/hooks/validation/useTimeRangeValidation.d.ts +2 -3
- package/internal/hooks/validation/useTimeRangeValidation.js +0 -1
- package/internal/models/dateRange.d.ts +2 -3
- package/internal/models/dateTimeRange.d.ts +2 -3
- package/internal/models/range.d.ts +7 -6
- package/internal/models/timeRange.d.ts +2 -3
- package/internal/utils/releaseInfo.js +1 -1
- package/internal/utils/valueManagers.d.ts +2 -3
- package/internal/utils/valueManagers.js +1 -2
- package/internal/utils/{views.d.ts → viewRenderers.d.ts} +1 -1
- package/{modern/internal/utils/views.js → internal/utils/viewRenderers.js} +10 -6
- package/legacy/DateRangeCalendar/DateRangeCalendar.js +159 -67
- package/legacy/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
- package/legacy/DateRangeCalendar/useDragRange.js +247 -0
- package/legacy/DateRangePicker/DateRangePickerInput.js +16 -16
- package/legacy/DateRangePicker/DateRangePickerToolbar.js +7 -7
- package/legacy/DateRangePicker/DateRangePickerView.js +16 -16
- package/legacy/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
- package/legacy/DateRangePicker/date-range-manager.js +17 -7
- package/legacy/DateRangePickerDay/DateRangePickerDay.js +23 -23
- package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +6 -6
- package/legacy/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -1
- package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +6 -6
- package/legacy/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -1
- package/legacy/NextDateRangePicker/NextDateRangePicker.js +5 -0
- package/legacy/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
- package/legacy/StaticDateRangePicker/StaticDateRangePicker.js +6 -6
- package/legacy/StaticNextDateRangePicker/StaticNextDateRangePicker.js +9 -4
- package/legacy/index.js +1 -1
- package/legacy/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +16 -8
- package/legacy/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +16 -8
- package/legacy/internal/hooks/useRangePickerInputProps.js +11 -11
- package/legacy/internal/hooks/useStaticRangePicker/index.js +1 -0
- package/legacy/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +68 -0
- package/legacy/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
- package/legacy/internal/hooks/validation/useDateRangeValidation.js +0 -3
- package/legacy/internal/hooks/validation/useDateTimeRangeValidation.js +0 -3
- package/legacy/internal/hooks/validation/useTimeRangeValidation.js +0 -3
- package/legacy/internal/utils/releaseInfo.js +1 -1
- package/legacy/internal/utils/valueManagers.js +1 -2
- package/legacy/internal/utils/{views.js → viewRenderers.js} +10 -6
- package/modern/DateRangeCalendar/DateRangeCalendar.js +197 -106
- package/modern/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
- package/modern/DateRangeCalendar/useDragRange.js +237 -0
- package/modern/DateRangePicker/DateRangePickerInput.js +16 -16
- package/modern/DateRangePicker/DateRangePickerToolbar.js +6 -6
- package/modern/DateRangePicker/DateRangePickerView.js +16 -16
- package/modern/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
- package/modern/DateRangePicker/date-range-manager.js +16 -7
- package/modern/DateRangePickerDay/DateRangePickerDay.js +24 -24
- package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -5
- package/modern/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -1
- package/modern/MobileDateRangePicker/MobileDateRangePicker.js +5 -5
- package/modern/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -1
- package/modern/NextDateRangePicker/NextDateRangePicker.js +5 -0
- package/modern/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
- package/modern/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
- package/modern/StaticNextDateRangePicker/StaticNextDateRangePicker.js +8 -3
- package/modern/index.js +1 -1
- package/modern/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +15 -7
- package/modern/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +15 -7
- package/modern/internal/hooks/useRangePickerInputProps.js +11 -11
- package/modern/internal/hooks/useStaticRangePicker/index.js +1 -0
- package/modern/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +65 -0
- package/modern/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
- package/modern/internal/hooks/validation/useDateRangeValidation.js +0 -1
- package/modern/internal/hooks/validation/useDateTimeRangeValidation.js +0 -1
- package/modern/internal/hooks/validation/useTimeRangeValidation.js +0 -1
- package/modern/internal/utils/releaseInfo.js +1 -1
- package/modern/internal/utils/valueManagers.js +1 -2
- package/{internal/utils/views.js → modern/internal/utils/viewRenderers.js} +10 -6
- package/node/DateRangeCalendar/DateRangeCalendar.js +195 -104
- package/node/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
- package/node/DateRangeCalendar/useDragRange.js +247 -0
- package/node/DateRangePicker/DateRangePickerInput.js +16 -16
- package/node/DateRangePicker/DateRangePickerToolbar.js +6 -6
- package/node/DateRangePicker/DateRangePickerView.js +16 -16
- package/node/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
- package/node/DateRangePicker/date-range-manager.js +16 -7
- package/node/DateRangePickerDay/DateRangePickerDay.js +23 -23
- package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -5
- package/node/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +7 -2
- package/node/MobileDateRangePicker/MobileDateRangePicker.js +5 -5
- package/node/MobileNextDateRangePicker/MobileNextDateRangePicker.js +7 -2
- package/node/NextDateRangePicker/NextDateRangePicker.js +5 -0
- package/node/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
- package/node/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
- package/node/StaticNextDateRangePicker/StaticNextDateRangePicker.js +9 -4
- package/node/index.js +1 -1
- package/node/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +15 -7
- package/node/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +15 -7
- package/node/internal/hooks/useRangePickerInputProps.js +11 -11
- package/node/internal/hooks/useStaticRangePicker/index.js +12 -0
- package/node/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +75 -0
- package/node/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +5 -0
- package/node/internal/hooks/validation/useDateRangeValidation.js +1 -3
- package/node/internal/hooks/validation/useDateTimeRangeValidation.js +1 -3
- package/node/internal/hooks/validation/useTimeRangeValidation.js +1 -3
- package/node/internal/utils/releaseInfo.js +1 -1
- package/node/internal/utils/valueManagers.js +4 -5
- package/node/internal/utils/{views.js → viewRenderers.js} +10 -6
- package/package.json +3 -3
- package/SingleInputDateRangeField/SingleInputDateRangeField.utils.d.ts +0 -6
- package/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -24
- package/legacy/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -26
- package/modern/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -24
- package/node/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -33
|
@@ -3,7 +3,9 @@ export interface DateRangeCalendarClasses {
|
|
|
3
3
|
root: string;
|
|
4
4
|
/** Styles applied to the container of a month. */
|
|
5
5
|
monthContainer: string;
|
|
6
|
+
/** Styles applied to the day calendar container when dragging */
|
|
7
|
+
dayDragging: string;
|
|
6
8
|
}
|
|
7
|
-
export
|
|
9
|
+
export type DateRangeCalendarClassKey = keyof DateRangeCalendarClasses;
|
|
8
10
|
export declare const getDateRangeCalendarUtilityClass: (slot: string) => string;
|
|
9
11
|
export declare const dateRangeCalendarClasses: DateRangeCalendarClasses;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { unstable_generateUtilityClass as generateUtilityClass, unstable_generateUtilityClasses as generateUtilityClasses } from '@mui/utils';
|
|
2
2
|
export const getDateRangeCalendarUtilityClass = slot => generateUtilityClass('MuiDateRangeCalendar', slot);
|
|
3
|
-
export const dateRangeCalendarClasses = generateUtilityClasses('MuiDateRangeCalendar', ['root', 'monthContainer']);
|
|
3
|
+
export const dateRangeCalendarClasses = generateUtilityClasses('MuiDateRangeCalendar', ['root', 'monthContainer', 'dayDragging']);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { MuiPickersAdapter } from '@mui/x-date-pickers/internals';
|
|
3
|
+
import { DateRangePosition } from './DateRangeCalendar.types';
|
|
4
|
+
import { DateRange } from '../internal/models';
|
|
5
|
+
interface UseDragRangeParams<TDate> {
|
|
6
|
+
disableDragEditing?: boolean;
|
|
7
|
+
utils: MuiPickersAdapter<TDate>;
|
|
8
|
+
setRangeDragDay: (value: TDate | null) => void;
|
|
9
|
+
setIsDragging: (value: boolean) => void;
|
|
10
|
+
isDragging: boolean;
|
|
11
|
+
onDatePositionChange: (position: DateRangePosition) => void;
|
|
12
|
+
onDrop: (newDate: TDate) => void;
|
|
13
|
+
dateRange: DateRange<TDate>;
|
|
14
|
+
}
|
|
15
|
+
interface UseDragRangeEvents {
|
|
16
|
+
onDragStart?: React.DragEventHandler<HTMLButtonElement>;
|
|
17
|
+
onDragEnter?: React.DragEventHandler<HTMLButtonElement>;
|
|
18
|
+
onDragLeave?: React.DragEventHandler<HTMLButtonElement>;
|
|
19
|
+
onDragOver?: React.DragEventHandler<HTMLButtonElement>;
|
|
20
|
+
onDragEnd?: React.DragEventHandler<HTMLButtonElement>;
|
|
21
|
+
onDrop?: React.DragEventHandler<HTMLButtonElement>;
|
|
22
|
+
onTouchStart?: React.TouchEventHandler<HTMLButtonElement>;
|
|
23
|
+
onTouchMove?: React.TouchEventHandler<HTMLButtonElement>;
|
|
24
|
+
onTouchEnd?: React.TouchEventHandler<HTMLButtonElement>;
|
|
25
|
+
}
|
|
26
|
+
interface UseDragRangeResponse<TDate> extends UseDragRangeEvents {
|
|
27
|
+
isDragging: boolean;
|
|
28
|
+
rangeDragDay: TDate | null;
|
|
29
|
+
draggingDatePosition: DateRangePosition | null;
|
|
30
|
+
}
|
|
31
|
+
export declare const useDragRange: <TDate>({ disableDragEditing, utils, onDatePositionChange, onDrop, dateRange, }: Omit<UseDragRangeParams<TDate>, "isDragging" | "setRangeDragDay" | "setIsDragging">) => UseDragRangeResponse<TDate>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
|
+
import { isEndOfRange, isStartOfRange } from '../internal/utils/date-utils';
|
|
5
|
+
const resolveDateFromTarget = (target, utils) => {
|
|
6
|
+
const timestampString = target.dataset.timestamp;
|
|
7
|
+
if (!timestampString) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const timestamp = +timestampString;
|
|
11
|
+
return utils.date(new Date(timestamp));
|
|
12
|
+
};
|
|
13
|
+
const isSameAsDraggingDate = event => {
|
|
14
|
+
const timestampString = event.target.dataset.timestamp;
|
|
15
|
+
return timestampString === event.dataTransfer.getData('draggingDate');
|
|
16
|
+
};
|
|
17
|
+
const resolveButtonElement = element => {
|
|
18
|
+
if (element) {
|
|
19
|
+
if (element instanceof HTMLButtonElement && !element.disabled) {
|
|
20
|
+
return element;
|
|
21
|
+
}
|
|
22
|
+
if (element.children.length) {
|
|
23
|
+
return resolveButtonElement(element.children[0]);
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return element;
|
|
28
|
+
};
|
|
29
|
+
const resolveElementFromTouch = (event, ignoreTouchTarget) => {
|
|
30
|
+
var _event$changedTouches;
|
|
31
|
+
// don't parse multi-touch result
|
|
32
|
+
if (((_event$changedTouches = event.changedTouches) == null ? void 0 : _event$changedTouches.length) === 1 && event.touches.length <= 1) {
|
|
33
|
+
const element = document.elementFromPoint(event.changedTouches[0].clientX, event.changedTouches[0].clientY);
|
|
34
|
+
// `elementFromPoint` could have resolved preview div or wrapping div
|
|
35
|
+
// might need to recursively find the nested button
|
|
36
|
+
const buttonElement = resolveButtonElement(element);
|
|
37
|
+
if (ignoreTouchTarget && buttonElement === event.changedTouches[0].target) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return buttonElement;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
};
|
|
44
|
+
const useDragRangeEvents = ({
|
|
45
|
+
utils,
|
|
46
|
+
setRangeDragDay,
|
|
47
|
+
setIsDragging,
|
|
48
|
+
isDragging,
|
|
49
|
+
onDatePositionChange,
|
|
50
|
+
onDrop,
|
|
51
|
+
disableDragEditing,
|
|
52
|
+
dateRange
|
|
53
|
+
}) => {
|
|
54
|
+
const emptyDragImgRef = React.useRef(null);
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
// Preload the image - required for Safari support: https://stackoverflow.com/a/40923520/3303436
|
|
57
|
+
emptyDragImgRef.current = document.createElement('img');
|
|
58
|
+
emptyDragImgRef.current.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
|
59
|
+
}, []);
|
|
60
|
+
const isElementDraggable = day => {
|
|
61
|
+
if (day == null) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const shouldInitDragging = !disableDragEditing && !!dateRange[0] && !!dateRange[1];
|
|
65
|
+
const isSelectedStartDate = isStartOfRange(utils, day, dateRange);
|
|
66
|
+
const isSelectedEndDate = isEndOfRange(utils, day, dateRange);
|
|
67
|
+
return shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
|
|
68
|
+
};
|
|
69
|
+
const handleDragStart = useEventCallback(event => {
|
|
70
|
+
const newDate = resolveDateFromTarget(event.target, utils);
|
|
71
|
+
if (!isElementDraggable(newDate)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
event.stopPropagation();
|
|
75
|
+
if (emptyDragImgRef.current) {
|
|
76
|
+
event.dataTransfer.setDragImage(emptyDragImgRef.current, 0, 0);
|
|
77
|
+
}
|
|
78
|
+
setRangeDragDay(newDate);
|
|
79
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
80
|
+
setIsDragging(true);
|
|
81
|
+
const buttonDataset = event.target.dataset;
|
|
82
|
+
if (buttonDataset.timestamp) {
|
|
83
|
+
event.dataTransfer.setData('draggingDate', buttonDataset.timestamp);
|
|
84
|
+
}
|
|
85
|
+
if (buttonDataset.position) {
|
|
86
|
+
onDatePositionChange(buttonDataset.position);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const handleTouchStart = useEventCallback(event => {
|
|
90
|
+
const target = resolveElementFromTouch(event);
|
|
91
|
+
if (!target) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const newDate = resolveDateFromTarget(target, utils);
|
|
95
|
+
if (!isElementDraggable(newDate)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
setRangeDragDay(newDate);
|
|
99
|
+
setIsDragging(true);
|
|
100
|
+
const button = event.target;
|
|
101
|
+
const buttonDataset = button.dataset;
|
|
102
|
+
if (buttonDataset.position) {
|
|
103
|
+
onDatePositionChange(buttonDataset.position);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const handleDragEnter = useEventCallback(event => {
|
|
107
|
+
if (!isDragging) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
event.stopPropagation();
|
|
112
|
+
event.dataTransfer.dropEffect = 'move';
|
|
113
|
+
setRangeDragDay(resolveDateFromTarget(event.target, utils));
|
|
114
|
+
});
|
|
115
|
+
const handleTouchMove = useEventCallback(event => {
|
|
116
|
+
const target = resolveElementFromTouch(event);
|
|
117
|
+
if (!isDragging || !target) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const newDate = resolveDateFromTarget(target, utils);
|
|
121
|
+
if (newDate) {
|
|
122
|
+
setRangeDragDay(newDate);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const handleDragLeave = useEventCallback(event => {
|
|
126
|
+
if (!isDragging) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
});
|
|
132
|
+
const handleDragOver = useEventCallback(event => {
|
|
133
|
+
if (!isDragging) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
event.stopPropagation();
|
|
138
|
+
event.dataTransfer.dropEffect = 'move';
|
|
139
|
+
});
|
|
140
|
+
const handleTouchEnd = useEventCallback(event => {
|
|
141
|
+
if (!isDragging) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
setRangeDragDay(null);
|
|
145
|
+
setIsDragging(false);
|
|
146
|
+
const target = resolveElementFromTouch(event, true);
|
|
147
|
+
if (!target) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// make sure the focused element is the element where touch ended
|
|
152
|
+
target.focus();
|
|
153
|
+
const newDate = resolveDateFromTarget(target, utils);
|
|
154
|
+
if (newDate) {
|
|
155
|
+
onDrop(newDate);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
const handleDragEnd = useEventCallback(event => {
|
|
159
|
+
if (!isDragging) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
event.preventDefault();
|
|
163
|
+
event.stopPropagation();
|
|
164
|
+
setIsDragging(false);
|
|
165
|
+
setRangeDragDay(null);
|
|
166
|
+
});
|
|
167
|
+
const handleDrop = useEventCallback(event => {
|
|
168
|
+
if (!isDragging) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
event.preventDefault();
|
|
172
|
+
event.stopPropagation();
|
|
173
|
+
setIsDragging(false);
|
|
174
|
+
setRangeDragDay(null);
|
|
175
|
+
// make sure the focused element is the element where drop ended
|
|
176
|
+
event.currentTarget.focus();
|
|
177
|
+
if (isSameAsDraggingDate(event)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const newDate = resolveDateFromTarget(event.target, utils);
|
|
181
|
+
if (newDate) {
|
|
182
|
+
onDrop(newDate);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
onDragStart: handleDragStart,
|
|
187
|
+
onDragEnter: handleDragEnter,
|
|
188
|
+
onDragLeave: handleDragLeave,
|
|
189
|
+
onDragOver: handleDragOver,
|
|
190
|
+
onDragEnd: handleDragEnd,
|
|
191
|
+
onDrop: handleDrop,
|
|
192
|
+
onTouchStart: handleTouchStart,
|
|
193
|
+
onTouchMove: handleTouchMove,
|
|
194
|
+
onTouchEnd: handleTouchEnd
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
export const useDragRange = ({
|
|
198
|
+
disableDragEditing,
|
|
199
|
+
utils,
|
|
200
|
+
onDatePositionChange,
|
|
201
|
+
onDrop,
|
|
202
|
+
dateRange
|
|
203
|
+
}) => {
|
|
204
|
+
const [isDragging, setIsDragging] = React.useState(false);
|
|
205
|
+
const [rangeDragDay, setRangeDragDay] = React.useState(null);
|
|
206
|
+
const handleRangeDragDayChange = useEventCallback(val => {
|
|
207
|
+
if (!utils.isEqual(val, rangeDragDay)) {
|
|
208
|
+
setRangeDragDay(val);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
const draggingDatePosition = React.useMemo(() => {
|
|
212
|
+
const [start, end] = dateRange;
|
|
213
|
+
if (rangeDragDay) {
|
|
214
|
+
if (start && utils.isBefore(rangeDragDay, start)) {
|
|
215
|
+
return 'start';
|
|
216
|
+
}
|
|
217
|
+
if (end && utils.isAfter(rangeDragDay, end)) {
|
|
218
|
+
return 'end';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}, [dateRange, rangeDragDay, utils]);
|
|
223
|
+
const dragRangeEvents = useDragRangeEvents({
|
|
224
|
+
utils,
|
|
225
|
+
onDatePositionChange,
|
|
226
|
+
onDrop,
|
|
227
|
+
setIsDragging,
|
|
228
|
+
isDragging,
|
|
229
|
+
setRangeDragDay: handleRangeDragDayChange,
|
|
230
|
+
disableDragEditing,
|
|
231
|
+
dateRange
|
|
232
|
+
});
|
|
233
|
+
return React.useMemo(() => _extends({
|
|
234
|
+
isDragging,
|
|
235
|
+
rangeDragDay,
|
|
236
|
+
draggingDatePosition
|
|
237
|
+
}, !disableDragEditing ? dragRangeEvents : {}), [isDragging, rangeDragDay, draggingDatePosition, disableDragEditing, dragRangeEvents]);
|
|
238
|
+
};
|
|
@@ -23,7 +23,7 @@ export interface DateRangePickerProps<TDate> extends Omit<DesktopDateRangePicker
|
|
|
23
23
|
*/
|
|
24
24
|
componentsProps?: DateRangePickerSlotsComponentsProps<TDate>;
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
type DateRangePickerComponent = (<TDate>(props: DateRangePickerProps<TDate> & React.RefAttributes<HTMLDivElement>) => JSX.Element) & {
|
|
27
27
|
propTypes?: any;
|
|
28
28
|
};
|
|
29
29
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { DateInputProps, ExportedDateInputProps, MuiTextFieldProps } from '@mui/x-date-pickers/internals';
|
|
3
|
-
import {
|
|
3
|
+
import { RangePositionProps, DateRange } from '../internal/models/range';
|
|
4
4
|
import { DateRangeValidationError } from '../internal/hooks/validation/useDateRangeValidation';
|
|
5
5
|
import { DateRangePickerInputClasses } from './dateRangePickerInputClasses';
|
|
6
6
|
export interface ExportedDateRangePickerInputProps<TDate> extends Omit<ExportedDateInputProps<TDate>, 'renderInput'> {
|
|
@@ -28,13 +28,13 @@ export interface ExportedDateRangePickerInputProps<TDate> extends Omit<ExportedD
|
|
|
28
28
|
renderInput: (startProps: MuiTextFieldProps, endProps: MuiTextFieldProps) => React.ReactElement;
|
|
29
29
|
onChange: (date: DateRange<TDate>, keyboardInputValue?: string) => void;
|
|
30
30
|
}
|
|
31
|
-
export interface DateRangePickerInputProps<TDate> extends Omit<ExportedDateRangePickerInputProps<TDate>, 'value'>, Omit<DateInputProps<TDate>, keyof ExportedDateRangePickerInputProps<TDate> | 'value' | 'validationError'>,
|
|
31
|
+
export interface DateRangePickerInputProps<TDate> extends Omit<ExportedDateRangePickerInputProps<TDate>, 'value'>, Omit<DateInputProps<TDate>, keyof ExportedDateRangePickerInputProps<TDate> | 'value' | 'validationError'>, RangePositionProps {
|
|
32
32
|
validationError: DateRangeValidationError;
|
|
33
33
|
value: DateRange<TDate>;
|
|
34
34
|
classes?: Partial<DateRangePickerInputClasses>;
|
|
35
35
|
mobile?: boolean;
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
type DatePickerInputComponent = <TDate>(props: DateRangePickerInputProps<TDate> & React.RefAttributes<HTMLDivElement>) => JSX.Element;
|
|
38
38
|
/**
|
|
39
39
|
* @ignore - internal component.
|
|
40
40
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["
|
|
3
|
+
const _excluded = ["rangePosition", "onRangePositionChange", "disableOpenPicker", "onBlur", "onChange", "open", "openPicker", "value", "value", "readOnly", "renderInput", "TextFieldProps", "validationError", "className", "mobile"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import clsx from 'clsx';
|
|
6
6
|
import { styled, useThemeProps } from '@mui/material/styles';
|
|
@@ -40,7 +40,8 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
40
40
|
name: 'MuiDateRangePickerInput'
|
|
41
41
|
});
|
|
42
42
|
const {
|
|
43
|
-
|
|
43
|
+
rangePosition,
|
|
44
|
+
onRangePositionChange,
|
|
44
45
|
disableOpenPicker,
|
|
45
46
|
onBlur,
|
|
46
47
|
onChange,
|
|
@@ -49,7 +50,6 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
49
50
|
value: [start, end],
|
|
50
51
|
readOnly,
|
|
51
52
|
renderInput,
|
|
52
|
-
setCurrentlySelectingRangeEnd,
|
|
53
53
|
TextFieldProps,
|
|
54
54
|
validationError: [startValidationError, endValidationError],
|
|
55
55
|
className,
|
|
@@ -64,14 +64,14 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
64
64
|
if (!open) {
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
|
-
if (
|
|
67
|
+
if (rangePosition === 'start') {
|
|
68
68
|
var _startRef$current;
|
|
69
69
|
(_startRef$current = startRef.current) == null ? void 0 : _startRef$current.focus();
|
|
70
|
-
} else if (
|
|
70
|
+
} else if (rangePosition === 'end') {
|
|
71
71
|
var _endRef$current;
|
|
72
72
|
(_endRef$current = endRef.current) == null ? void 0 : _endRef$current.focus();
|
|
73
73
|
}
|
|
74
|
-
}, [
|
|
74
|
+
}, [rangePosition, open]);
|
|
75
75
|
|
|
76
76
|
// TODO: rethink this approach. We do not need to wait for calendar to be updated to rerender input (looks like freezing)
|
|
77
77
|
// TODO: so simply break 1 react's commit phase in 2 (first for input and second for calendars) by executing onChange in the next tick
|
|
@@ -84,8 +84,8 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
84
84
|
};
|
|
85
85
|
const openRangeStartSelection = event => {
|
|
86
86
|
event.stopPropagation();
|
|
87
|
-
if (
|
|
88
|
-
|
|
87
|
+
if (onRangePositionChange) {
|
|
88
|
+
onRangePositionChange('start');
|
|
89
89
|
}
|
|
90
90
|
if (!readOnly && !disableOpenPicker) {
|
|
91
91
|
openPicker();
|
|
@@ -93,21 +93,21 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
93
93
|
};
|
|
94
94
|
const openRangeEndSelection = event => {
|
|
95
95
|
event.stopPropagation();
|
|
96
|
-
if (
|
|
97
|
-
|
|
96
|
+
if (onRangePositionChange) {
|
|
97
|
+
onRangePositionChange('end');
|
|
98
98
|
}
|
|
99
99
|
if (!readOnly && !disableOpenPicker) {
|
|
100
100
|
openPicker();
|
|
101
101
|
}
|
|
102
102
|
};
|
|
103
103
|
const focusOnRangeEnd = () => {
|
|
104
|
-
if (open &&
|
|
105
|
-
|
|
104
|
+
if (open && onRangePositionChange) {
|
|
105
|
+
onRangePositionChange('end');
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
108
|
const focusOnRangeStart = () => {
|
|
109
|
-
if (open &&
|
|
110
|
-
|
|
109
|
+
if (open && onRangePositionChange) {
|
|
110
|
+
onRangePositionChange('start');
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
113
|
const startInputProps = useMaskedInput(_extends({}, other, {
|
|
@@ -118,7 +118,7 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
118
118
|
validationError: startValidationError !== null,
|
|
119
119
|
TextFieldProps: _extends({}, TextFieldProps, {
|
|
120
120
|
inputRef: startRef,
|
|
121
|
-
focused: open ?
|
|
121
|
+
focused: open ? rangePosition === 'start' : undefined
|
|
122
122
|
}, !readOnly && !other.disabled && {
|
|
123
123
|
onClick: openRangeStartSelection
|
|
124
124
|
}),
|
|
@@ -137,7 +137,7 @@ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateR
|
|
|
137
137
|
validationError: endValidationError !== null,
|
|
138
138
|
TextFieldProps: _extends({}, TextFieldProps, {
|
|
139
139
|
inputRef: endRef,
|
|
140
|
-
focused: open ?
|
|
140
|
+
focused: open ? rangePosition === 'end' : undefined
|
|
141
141
|
}, !readOnly && !other.disabled && {
|
|
142
142
|
onClick: openRangeEndSelection
|
|
143
143
|
}),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { BaseToolbarProps, ExportedBaseToolbarProps } from '@mui/x-date-pickers/internals';
|
|
3
|
-
import { DateRange,
|
|
3
|
+
import { DateRange, RangePositionProps } from '../internal/models';
|
|
4
4
|
import { DateRangePickerToolbarClasses } from './dateRangePickerToolbarClasses';
|
|
5
|
-
export interface DateRangePickerToolbarProps<TDate> extends Omit<BaseToolbarProps<DateRange<TDate>, 'day'>, 'views' | 'view' | 'onViewChange' | 'onChange' | 'isLandscape'>,
|
|
5
|
+
export interface DateRangePickerToolbarProps<TDate> extends Omit<BaseToolbarProps<DateRange<TDate>, 'day'>, 'views' | 'view' | 'onViewChange' | 'onChange' | 'isLandscape'>, RangePositionProps {
|
|
6
6
|
classes?: Partial<DateRangePickerToolbarClasses>;
|
|
7
7
|
}
|
|
8
8
|
export interface ExportedDateRangePickerToolbarProps extends ExportedBaseToolbarProps {
|
|
@@ -44,11 +44,11 @@ export const DateRangePickerToolbar = /*#__PURE__*/React.forwardRef(function Dat
|
|
|
44
44
|
name: 'MuiDateRangePickerToolbar'
|
|
45
45
|
});
|
|
46
46
|
const {
|
|
47
|
-
currentlySelectingRangeEnd,
|
|
48
47
|
value: [start, end],
|
|
49
48
|
isMobileKeyboardViewOpen,
|
|
50
|
-
setCurrentlySelectingRangeEnd,
|
|
51
49
|
toggleMobileKeyboardView,
|
|
50
|
+
rangePosition,
|
|
51
|
+
onRangePositionChange,
|
|
52
52
|
toolbarFormat
|
|
53
53
|
} = props;
|
|
54
54
|
const localeText = useLocaleText();
|
|
@@ -69,16 +69,16 @@ export const DateRangePickerToolbar = /*#__PURE__*/React.forwardRef(function Dat
|
|
|
69
69
|
children: [/*#__PURE__*/_jsx(PickersToolbarButton, {
|
|
70
70
|
variant: start !== null ? 'h5' : 'h6',
|
|
71
71
|
value: startDateValue,
|
|
72
|
-
selected:
|
|
73
|
-
onClick: () =>
|
|
72
|
+
selected: rangePosition === 'start',
|
|
73
|
+
onClick: () => onRangePositionChange('start')
|
|
74
74
|
}), /*#__PURE__*/_jsxs(Typography, {
|
|
75
75
|
variant: "h5",
|
|
76
76
|
children: ["\xA0", '–', "\xA0"]
|
|
77
77
|
}), /*#__PURE__*/_jsx(PickersToolbarButton, {
|
|
78
78
|
variant: end !== null ? 'h5' : 'h6',
|
|
79
79
|
value: endDateValue,
|
|
80
|
-
selected:
|
|
81
|
-
onClick: () =>
|
|
80
|
+
selected: rangePosition === 'end',
|
|
81
|
+
onClick: () => onRangePositionChange('end')
|
|
82
82
|
})]
|
|
83
83
|
})
|
|
84
84
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { ExportedDateCalendarProps, PickerStatePickerProps, BaseDateValidationProps, DayValidationProps, ExportedBaseToolbarProps } from '@mui/x-date-pickers/internals';
|
|
3
|
-
import { DateRange,
|
|
3
|
+
import { DateRange, RangePositionProps } from '../internal/models/range';
|
|
4
4
|
import { DayRangeValidationProps } from '../internal/models/dateRange';
|
|
5
5
|
import { DateRangePickerViewMobileSlotsComponent, DateRangePickerViewMobileSlotsComponentsProps } from './DateRangePickerViewMobile';
|
|
6
6
|
import { DateRangePickerInputProps } from './DateRangePickerInput';
|
|
@@ -41,12 +41,12 @@ export interface ExportedDateRangePickerViewProps<TDate> extends ExportedDateRan
|
|
|
41
41
|
*/
|
|
42
42
|
className?: string;
|
|
43
43
|
}
|
|
44
|
-
interface DateRangePickerViewProps<TDate> extends
|
|
44
|
+
interface DateRangePickerViewProps<TDate> extends RangePositionProps, ExportedDateRangePickerViewProps<TDate>, PickerStatePickerProps<DateRange<TDate>>, Required<BaseDateValidationProps<TDate>> {
|
|
45
45
|
calendars: 1 | 2 | 3;
|
|
46
46
|
open: boolean;
|
|
47
47
|
DateInputProps: DateRangePickerInputProps<TDate>;
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
type DateRangePickerViewComponent = (<TDate>(props: DateRangePickerViewProps<TDate>) => JSX.Element) & {
|
|
50
50
|
propTypes?: any;
|
|
51
51
|
};
|
|
52
52
|
export declare const DateRangePickerView: DateRangePickerViewComponent;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["calendars", "className", "
|
|
3
|
+
const _excluded = ["calendars", "className", "value", "DateInputProps", "defaultCalendarMonth", "disableAutoMonthSwitching", "disableFuture", "disableHighlightToday", "disablePast", "isMobileKeyboardViewOpen", "maxDate", "minDate", "onDateChange", "onMonthChange", "open", "reduceAnimations", "rangePosition", "onRangePositionChange", "shouldDisableDate", "showToolbar", "toggleMobileKeyboardView", "components", "componentsProps"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { Watermark } from '@mui/x-license-pro';
|
|
@@ -21,7 +21,6 @@ function DateRangePickerViewRaw(props) {
|
|
|
21
21
|
const {
|
|
22
22
|
calendars,
|
|
23
23
|
className,
|
|
24
|
-
currentlySelectingRangeEnd,
|
|
25
24
|
value,
|
|
26
25
|
DateInputProps,
|
|
27
26
|
defaultCalendarMonth,
|
|
@@ -35,7 +34,8 @@ function DateRangePickerViewRaw(props) {
|
|
|
35
34
|
onDateChange,
|
|
36
35
|
onMonthChange,
|
|
37
36
|
reduceAnimations = defaultReduceAnimations,
|
|
38
|
-
|
|
37
|
+
rangePosition,
|
|
38
|
+
onRangePositionChange,
|
|
39
39
|
shouldDisableDate,
|
|
40
40
|
showToolbar,
|
|
41
41
|
toggleMobileKeyboardView,
|
|
@@ -45,7 +45,7 @@ function DateRangePickerViewRaw(props) {
|
|
|
45
45
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
46
46
|
const utils = useUtils();
|
|
47
47
|
const wrapperVariant = React.useContext(WrapperVariantContext);
|
|
48
|
-
const wrappedShouldDisableDate = shouldDisableDate && (dayToTest => shouldDisableDate == null ? void 0 : shouldDisableDate(dayToTest,
|
|
48
|
+
const wrappedShouldDisableDate = shouldDisableDate && (dayToTest => shouldDisableDate == null ? void 0 : shouldDisableDate(dayToTest, rangePosition));
|
|
49
49
|
const [start, end] = value;
|
|
50
50
|
const {
|
|
51
51
|
changeMonth,
|
|
@@ -67,14 +67,14 @@ function DateRangePickerViewRaw(props) {
|
|
|
67
67
|
const prevValue = React.useRef(null);
|
|
68
68
|
React.useEffect(() => {
|
|
69
69
|
var _prevValue$current, _prevValue$current2;
|
|
70
|
-
const date =
|
|
70
|
+
const date = rangePosition === 'start' ? start : end;
|
|
71
71
|
if (!date || !utils.isValid(date)) {
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
|
-
const prevDate =
|
|
74
|
+
const prevDate = rangePosition === 'start' ? (_prevValue$current = prevValue.current) == null ? void 0 : _prevValue$current[0] : (_prevValue$current2 = prevValue.current) == null ? void 0 : _prevValue$current2[1];
|
|
75
75
|
prevValue.current = value;
|
|
76
76
|
|
|
77
|
-
// The current date did not change, this call comes either from a `
|
|
77
|
+
// The current date did not change, this call comes either from a `rangePosition` change or a change in the other date.
|
|
78
78
|
// In both cases, we don't want to change the visible month(s).
|
|
79
79
|
if (disableAutoMonthSwitching && prevDate && utils.isEqual(prevDate, date)) {
|
|
80
80
|
return;
|
|
@@ -83,12 +83,12 @@ function DateRangePickerViewRaw(props) {
|
|
|
83
83
|
const currentMonthNumber = utils.getMonth(calendarState.currentMonth);
|
|
84
84
|
const requestedMonthNumber = utils.getMonth(date);
|
|
85
85
|
if (!utils.isSameYear(calendarState.currentMonth, date) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) {
|
|
86
|
-
const newMonth =
|
|
86
|
+
const newMonth = rangePosition === 'start' ? date :
|
|
87
87
|
// If need to focus end, scroll to the state when "end" is displaying in the last calendar
|
|
88
88
|
utils.addMonths(date, -displayingMonthRange);
|
|
89
89
|
changeMonth(newMonth);
|
|
90
90
|
}
|
|
91
|
-
}, [
|
|
91
|
+
}, [rangePosition, value]); // eslint-disable-line
|
|
92
92
|
|
|
93
93
|
const handleSelectedDayChange = React.useCallback(newDate => {
|
|
94
94
|
const {
|
|
@@ -98,12 +98,12 @@ function DateRangePickerViewRaw(props) {
|
|
|
98
98
|
newDate,
|
|
99
99
|
utils,
|
|
100
100
|
range: value,
|
|
101
|
-
|
|
101
|
+
rangePosition
|
|
102
102
|
});
|
|
103
|
-
|
|
104
|
-
const isFullRangeSelected =
|
|
103
|
+
onRangePositionChange(nextSelection);
|
|
104
|
+
const isFullRangeSelected = rangePosition === 'end' && isRangeValid(utils, newRange);
|
|
105
105
|
onDateChange(newRange, wrapperVariant, isFullRangeSelected ? 'finish' : 'partial');
|
|
106
|
-
}, [
|
|
106
|
+
}, [rangePosition, value, onDateChange, onRangePositionChange, utils, wrapperVariant]);
|
|
107
107
|
const shouldRenderToolbar = showToolbar != null ? showToolbar : wrapperVariant !== 'desktop';
|
|
108
108
|
const Toolbar = components == null ? void 0 : components.Toolbar;
|
|
109
109
|
const renderView = () => {
|
|
@@ -115,7 +115,7 @@ function DateRangePickerViewRaw(props) {
|
|
|
115
115
|
disableHighlightToday,
|
|
116
116
|
onMonthSwitchingAnimationEnd,
|
|
117
117
|
changeMonth,
|
|
118
|
-
|
|
118
|
+
rangePosition,
|
|
119
119
|
disableFuture,
|
|
120
120
|
disablePast,
|
|
121
121
|
minDate,
|
|
@@ -146,8 +146,8 @@ function DateRangePickerViewRaw(props) {
|
|
|
146
146
|
value: value,
|
|
147
147
|
isMobileKeyboardViewOpen: isMobileKeyboardViewOpen,
|
|
148
148
|
toggleMobileKeyboardView: toggleMobileKeyboardView,
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
rangePosition: rangePosition,
|
|
150
|
+
onRangePositionChange: onRangePositionChange
|
|
151
151
|
})), isMobileKeyboardViewOpen ? /*#__PURE__*/_jsx(MobileKeyboardInputView, {
|
|
152
152
|
children: /*#__PURE__*/_jsx(DateRangePickerInput, _extends({
|
|
153
153
|
disableOpenPicker: true,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { SlotComponentProps } from '@mui/base/utils';
|
|
3
3
|
import { DayCalendarProps, DayValidationProps, ExportedPickersArrowSwitcherProps, PickersArrowSwitcherSlotsComponent, PickersArrowSwitcherSlotsComponentsProps, DayCalendarSlotsComponent, DayCalendarSlotsComponentsProps } from '@mui/x-date-pickers/internals';
|
|
4
|
-
import { DateRange } from '../internal/models/range';
|
|
4
|
+
import { DateRange, RangePosition } from '../internal/models/range';
|
|
5
5
|
import { DateRangePickerDay, DateRangePickerDayProps } from '../DateRangePickerDay';
|
|
6
6
|
import { DateRangePickerViewDesktopClasses } from './dateRangePickerViewDesktopClasses';
|
|
7
7
|
export interface ExportedDateRangePickerViewDesktopProps {
|
|
@@ -38,7 +38,7 @@ export interface DateRangePickerViewDesktopProps<TDate> extends ExportedDateRang
|
|
|
38
38
|
calendars: 1 | 2 | 3;
|
|
39
39
|
value: DateRange<TDate>;
|
|
40
40
|
changeMonth: (date: TDate) => void;
|
|
41
|
-
|
|
41
|
+
rangePosition: RangePosition;
|
|
42
42
|
classes?: Partial<DateRangePickerViewDesktopClasses>;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["calendars", "changeMonth", "components", "componentsProps", "
|
|
3
|
+
const _excluded = ["calendars", "changeMonth", "components", "componentsProps", "rangePosition", "currentMonth", "value", "disableFuture", "disablePast", "maxDate", "minDate", "onSelectedDaysChange", "className", "classes"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import clsx from 'clsx';
|
|
6
6
|
import { styled, useThemeProps } from '@mui/material/styles';
|
|
@@ -83,7 +83,7 @@ export function DateRangePickerViewDesktop(inProps) {
|
|
|
83
83
|
changeMonth,
|
|
84
84
|
components,
|
|
85
85
|
componentsProps,
|
|
86
|
-
|
|
86
|
+
rangePosition,
|
|
87
87
|
currentMonth,
|
|
88
88
|
value,
|
|
89
89
|
disableFuture,
|
|
@@ -117,7 +117,7 @@ export function DateRangePickerViewDesktop(inProps) {
|
|
|
117
117
|
utils,
|
|
118
118
|
range: valueDayRange,
|
|
119
119
|
newDate: rangePreviewDay,
|
|
120
|
-
|
|
120
|
+
rangePosition
|
|
121
121
|
});
|
|
122
122
|
const handleSelectedDayChange = React.useCallback(day => {
|
|
123
123
|
setRangePreviewDay(null);
|