@mui/x-date-pickers-pro 5.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +3785 -0
  2. package/DateRangePicker/DateRangePicker.d.ts +66 -0
  3. package/DateRangePicker/DateRangePicker.js +519 -0
  4. package/DateRangePicker/DateRangePickerInput.d.ts +37 -0
  5. package/DateRangePicker/DateRangePickerInput.js +128 -0
  6. package/DateRangePicker/DateRangePickerToolbar.d.ts +15 -0
  7. package/DateRangePicker/DateRangePickerToolbar.js +59 -0
  8. package/DateRangePicker/DateRangePickerView.d.ts +41 -0
  9. package/DateRangePicker/DateRangePickerView.js +179 -0
  10. package/DateRangePicker/DateRangePickerViewDesktop.d.ts +30 -0
  11. package/DateRangePicker/DateRangePickerViewDesktop.js +154 -0
  12. package/DateRangePicker/DateRangePickerViewMobile.d.ts +15 -0
  13. package/DateRangePicker/DateRangePickerViewMobile.js +60 -0
  14. package/DateRangePicker/date-range-manager.d.ts +14 -0
  15. package/DateRangePicker/date-range-manager.js +43 -0
  16. package/DateRangePicker/index.d.ts +3 -0
  17. package/DateRangePicker/index.js +1 -0
  18. package/DateRangePicker/package.json +6 -0
  19. package/DateRangePickerDay/DateRangePickerDay.d.ts +52 -0
  20. package/DateRangePickerDay/DateRangePickerDay.js +290 -0
  21. package/DateRangePickerDay/dateRangePickerDayClasses.d.ts +29 -0
  22. package/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
  23. package/DateRangePickerDay/index.d.ts +4 -0
  24. package/DateRangePickerDay/index.js +2 -0
  25. package/DateRangePickerDay/package.json +6 -0
  26. package/DesktopDateRangePicker/DesktopDateRangePicker.d.ts +66 -0
  27. package/DesktopDateRangePicker/DesktopDateRangePicker.js +485 -0
  28. package/DesktopDateRangePicker/index.d.ts +2 -0
  29. package/DesktopDateRangePicker/index.js +1 -0
  30. package/DesktopDateRangePicker/package.json +6 -0
  31. package/MobileDateRangePicker/MobileDateRangePicker.d.ts +66 -0
  32. package/MobileDateRangePicker/MobileDateRangePicker.js +495 -0
  33. package/MobileDateRangePicker/index.d.ts +2 -0
  34. package/MobileDateRangePicker/index.js +1 -0
  35. package/MobileDateRangePicker/package.json +6 -0
  36. package/README.md +29 -0
  37. package/StaticDateRangePicker/StaticDateRangePicker.d.ts +69 -0
  38. package/StaticDateRangePicker/StaticDateRangePicker.js +455 -0
  39. package/StaticDateRangePicker/index.d.ts +2 -0
  40. package/StaticDateRangePicker/index.js +1 -0
  41. package/StaticDateRangePicker/package.json +6 -0
  42. package/index.d.ts +7 -0
  43. package/index.js +12 -0
  44. package/internal/hooks/validation/useDateRangeValidation.d.ts +12 -0
  45. package/internal/hooks/validation/useDateRangeValidation.js +27 -0
  46. package/internal/models/dateRange.d.ts +8 -0
  47. package/internal/models/dateRange.js +1 -0
  48. package/internal/models/index.d.ts +1 -0
  49. package/internal/models/index.js +1 -0
  50. package/internal/utils/date-utils.d.ts +7 -0
  51. package/internal/utils/date-utils.js +19 -0
  52. package/internal/utils/releaseInfo.d.ts +1 -0
  53. package/internal/utils/releaseInfo.js +15 -0
  54. package/internal/utils/utils.d.ts +1 -0
  55. package/internal/utils/utils.js +1 -0
  56. package/legacy/DateRangePicker/DateRangePicker.js +528 -0
  57. package/legacy/DateRangePicker/DateRangePickerInput.js +141 -0
  58. package/legacy/DateRangePicker/DateRangePickerToolbar.js +66 -0
  59. package/legacy/DateRangePicker/DateRangePickerView.js +184 -0
  60. package/legacy/DateRangePicker/DateRangePickerViewDesktop.js +172 -0
  61. package/legacy/DateRangePicker/DateRangePickerViewMobile.js +63 -0
  62. package/legacy/DateRangePicker/date-range-manager.js +51 -0
  63. package/legacy/DateRangePicker/index.js +1 -0
  64. package/legacy/DateRangePickerDay/DateRangePickerDay.js +296 -0
  65. package/legacy/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
  66. package/legacy/DateRangePickerDay/index.js +2 -0
  67. package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +494 -0
  68. package/legacy/DesktopDateRangePicker/index.js +1 -0
  69. package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +504 -0
  70. package/legacy/MobileDateRangePicker/index.js +1 -0
  71. package/legacy/StaticDateRangePicker/StaticDateRangePicker.js +465 -0
  72. package/legacy/StaticDateRangePicker/index.js +1 -0
  73. package/legacy/index.js +12 -0
  74. package/legacy/internal/hooks/validation/useDateRangeValidation.js +33 -0
  75. package/legacy/internal/models/dateRange.js +1 -0
  76. package/legacy/internal/models/index.js +1 -0
  77. package/legacy/internal/utils/date-utils.js +22 -0
  78. package/legacy/internal/utils/releaseInfo.js +15 -0
  79. package/legacy/internal/utils/utils.js +1 -0
  80. package/legacy/themeAugmentation/index.js +3 -0
  81. package/modern/DateRangePicker/DateRangePicker.js +519 -0
  82. package/modern/DateRangePicker/DateRangePickerInput.js +124 -0
  83. package/modern/DateRangePicker/DateRangePickerToolbar.js +59 -0
  84. package/modern/DateRangePicker/DateRangePickerView.js +179 -0
  85. package/modern/DateRangePicker/DateRangePickerViewDesktop.js +154 -0
  86. package/modern/DateRangePicker/DateRangePickerViewMobile.js +60 -0
  87. package/modern/DateRangePicker/date-range-manager.js +43 -0
  88. package/modern/DateRangePicker/index.js +1 -0
  89. package/modern/DateRangePickerDay/DateRangePickerDay.js +290 -0
  90. package/modern/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
  91. package/modern/DateRangePickerDay/index.js +2 -0
  92. package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +485 -0
  93. package/modern/DesktopDateRangePicker/index.js +1 -0
  94. package/modern/MobileDateRangePicker/MobileDateRangePicker.js +495 -0
  95. package/modern/MobileDateRangePicker/index.js +1 -0
  96. package/modern/StaticDateRangePicker/StaticDateRangePicker.js +455 -0
  97. package/modern/StaticDateRangePicker/index.js +1 -0
  98. package/modern/index.js +12 -0
  99. package/modern/internal/hooks/validation/useDateRangeValidation.js +27 -0
  100. package/modern/internal/models/dateRange.js +1 -0
  101. package/modern/internal/models/index.js +1 -0
  102. package/modern/internal/utils/date-utils.js +19 -0
  103. package/modern/internal/utils/releaseInfo.js +15 -0
  104. package/modern/internal/utils/utils.js +1 -0
  105. package/modern/themeAugmentation/index.js +3 -0
  106. package/node/DateRangePicker/DateRangePicker.js +540 -0
  107. package/node/DateRangePicker/DateRangePickerInput.js +148 -0
  108. package/node/DateRangePicker/DateRangePickerToolbar.js +79 -0
  109. package/node/DateRangePicker/DateRangePickerView.js +206 -0
  110. package/node/DateRangePicker/DateRangePickerViewDesktop.js +175 -0
  111. package/node/DateRangePicker/DateRangePickerViewMobile.js +80 -0
  112. package/node/DateRangePicker/date-range-manager.js +52 -0
  113. package/node/DateRangePicker/index.js +13 -0
  114. package/node/DateRangePickerDay/DateRangePickerDay.js +315 -0
  115. package/node/DateRangePickerDay/dateRangePickerDayClasses.js +16 -0
  116. package/node/DateRangePickerDay/index.js +27 -0
  117. package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +506 -0
  118. package/node/DesktopDateRangePicker/index.js +13 -0
  119. package/node/MobileDateRangePicker/MobileDateRangePicker.js +516 -0
  120. package/node/MobileDateRangePicker/index.js +13 -0
  121. package/node/StaticDateRangePicker/StaticDateRangePicker.js +475 -0
  122. package/node/StaticDateRangePicker/index.js +13 -0
  123. package/node/index.js +105 -0
  124. package/node/internal/hooks/validation/useDateRangeValidation.js +40 -0
  125. package/node/internal/models/dateRange.js +5 -0
  126. package/node/internal/models/index.js +18 -0
  127. package/node/internal/utils/date-utils.js +40 -0
  128. package/node/internal/utils/releaseInfo.js +25 -0
  129. package/node/internal/utils/utils.js +10 -0
  130. package/node/themeAugmentation/index.js +44 -0
  131. package/package.json +77 -0
  132. package/themeAugmentation/components.d.ts +13 -0
  133. package/themeAugmentation/index.d.ts +3 -0
  134. package/themeAugmentation/index.js +3 -0
  135. package/themeAugmentation/overrides.d.ts +13 -0
  136. package/themeAugmentation/package.json +6 -0
  137. package/themeAugmentation/props.d.ts +12 -0
@@ -0,0 +1,128 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["currentlySelectingRangeEnd", "disableOpenPicker", "endText", "onBlur", "onChange", "open", "openPicker", "rawValue", "rawValue", "readOnly", "renderInput", "setCurrentlySelectingRangeEnd", "startText", "TextFieldProps", "validationError"];
4
+ import * as React from 'react';
5
+ import { styled } from '@mui/material/styles';
6
+ import { useUtils, executeInTheNextEventLoopTick, WrapperVariantContext, useMaskedInput } from '@mui/x-date-pickers/internals';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ const DateRangePickerInputRoot = styled('div')(({
9
+ theme
10
+ }) => ({
11
+ display: 'flex',
12
+ alignItems: 'baseline',
13
+ [theme.breakpoints.down('xs')]: {
14
+ flexDirection: 'column',
15
+ alignItems: 'center'
16
+ }
17
+ }));
18
+
19
+ /**
20
+ * @ignore - internal component.
21
+ */
22
+ export const DateRangePickerInput = /*#__PURE__*/React.forwardRef(function DateRangePickerInput(props, ref) {
23
+ const {
24
+ currentlySelectingRangeEnd,
25
+ disableOpenPicker,
26
+ endText,
27
+ onBlur,
28
+ onChange,
29
+ open,
30
+ openPicker,
31
+ rawValue: [start, end],
32
+ readOnly,
33
+ renderInput,
34
+ setCurrentlySelectingRangeEnd,
35
+ startText,
36
+ TextFieldProps,
37
+ validationError: [startValidationError, endValidationError]
38
+ } = props,
39
+ other = _objectWithoutPropertiesLoose(props, _excluded);
40
+
41
+ const utils = useUtils();
42
+ const startRef = React.useRef(null);
43
+ const endRef = React.useRef(null);
44
+ const wrapperVariant = React.useContext(WrapperVariantContext);
45
+ React.useEffect(() => {
46
+ if (!open) {
47
+ return;
48
+ }
49
+
50
+ if (currentlySelectingRangeEnd === 'start') {
51
+ var _startRef$current;
52
+
53
+ (_startRef$current = startRef.current) == null ? void 0 : _startRef$current.focus();
54
+ } else if (currentlySelectingRangeEnd === 'end') {
55
+ var _endRef$current;
56
+
57
+ (_endRef$current = endRef.current) == null ? void 0 : _endRef$current.focus();
58
+ }
59
+ }, [currentlySelectingRangeEnd, open]); // TODO: rethink this approach. We do not need to wait for calendar to be updated to rerender input (looks like freezing)
60
+ // 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
61
+
62
+ const lazyHandleChangeCallback = React.useCallback((...args) => executeInTheNextEventLoopTick(() => onChange(...args)), [onChange]);
63
+
64
+ const handleStartChange = (date, inputString) => {
65
+ lazyHandleChangeCallback([date, utils.date(end)], inputString);
66
+ };
67
+
68
+ const handleEndChange = (date, inputString) => {
69
+ lazyHandleChangeCallback([utils.date(start), date], inputString);
70
+ };
71
+
72
+ const openRangeStartSelection = () => {
73
+ if (setCurrentlySelectingRangeEnd) {
74
+ setCurrentlySelectingRangeEnd('start');
75
+ }
76
+
77
+ if (!readOnly && !disableOpenPicker) {
78
+ openPicker();
79
+ }
80
+ };
81
+
82
+ const openRangeEndSelection = () => {
83
+ if (setCurrentlySelectingRangeEnd) {
84
+ setCurrentlySelectingRangeEnd('end');
85
+ }
86
+
87
+ if (!readOnly && !disableOpenPicker) {
88
+ openPicker();
89
+ }
90
+ };
91
+
92
+ const openOnFocus = wrapperVariant === 'desktop';
93
+ const startInputProps = useMaskedInput(_extends({}, other, {
94
+ readOnly,
95
+ rawValue: start,
96
+ onChange: handleStartChange,
97
+ label: startText,
98
+ validationError: startValidationError !== null,
99
+ TextFieldProps: _extends({}, TextFieldProps, {
100
+ ref: startRef,
101
+ focused: open && currentlySelectingRangeEnd === 'start'
102
+ }),
103
+ inputProps: {
104
+ onClick: !openOnFocus ? openRangeStartSelection : undefined,
105
+ onFocus: openOnFocus ? openRangeStartSelection : undefined
106
+ }
107
+ }));
108
+ const endInputProps = useMaskedInput(_extends({}, other, {
109
+ readOnly,
110
+ label: endText,
111
+ rawValue: end,
112
+ onChange: handleEndChange,
113
+ validationError: endValidationError !== null,
114
+ TextFieldProps: _extends({}, TextFieldProps, {
115
+ ref: endRef,
116
+ focused: open && currentlySelectingRangeEnd === 'end'
117
+ }),
118
+ inputProps: {
119
+ onClick: !openOnFocus ? openRangeEndSelection : undefined,
120
+ onFocus: openOnFocus ? openRangeEndSelection : undefined
121
+ }
122
+ }));
123
+ return /*#__PURE__*/_jsx(DateRangePickerInputRoot, {
124
+ onBlur: onBlur,
125
+ ref: ref,
126
+ children: renderInput(startInputProps, endInputProps)
127
+ });
128
+ });
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { BaseToolbarProps } from '@mui/x-date-pickers/internals';
3
+ import { DateRange, CurrentlySelectingRangeEndProps } from '../internal/models';
4
+ interface DateRangePickerToolbarProps<TDate> extends CurrentlySelectingRangeEndProps, Pick<BaseToolbarProps<TDate>, 'isMobileKeyboardViewOpen' | 'toggleMobileKeyboardView' | 'toolbarTitle' | 'toolbarFormat'> {
5
+ date: DateRange<TDate>;
6
+ startText: React.ReactNode;
7
+ endText: React.ReactNode;
8
+ currentlySelectingRangeEnd: 'start' | 'end';
9
+ setCurrentlySelectingRangeEnd: (newSelectingEnd: 'start' | 'end') => void;
10
+ }
11
+ /**
12
+ * @ignore - internal component.
13
+ */
14
+ export declare const DateRangePickerToolbar: <TDate extends unknown>({ currentlySelectingRangeEnd, date: [start, end], endText, isMobileKeyboardViewOpen, setCurrentlySelectingRangeEnd, startText, toggleMobileKeyboardView, toolbarFormat, toolbarTitle, }: DateRangePickerToolbarProps<TDate>) => JSX.Element;
15
+ export {};
@@ -0,0 +1,59 @@
1
+ import * as React from 'react';
2
+ import Typography from '@mui/material/Typography';
3
+ import { styled } from '@mui/material/styles';
4
+ import { generateUtilityClasses } from '@mui/material';
5
+ import { PickersToolbar, PickersToolbarButton, useUtils } from '@mui/x-date-pickers/internals';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
8
+ const classes = generateUtilityClasses('PrivateDateRangePickerToolbar', ['penIcon']);
9
+ const DateRangePickerToolbarRoot = styled(PickersToolbar)({
10
+ [`& .${classes.penIcon}`]: {
11
+ position: 'relative',
12
+ top: 4
13
+ }
14
+ });
15
+ const DateRangePickerToolbarContainer = styled('div')({
16
+ display: 'flex'
17
+ });
18
+ /**
19
+ * @ignore - internal component.
20
+ */
21
+
22
+ export const DateRangePickerToolbar = ({
23
+ currentlySelectingRangeEnd,
24
+ date: [start, end],
25
+ endText,
26
+ isMobileKeyboardViewOpen,
27
+ setCurrentlySelectingRangeEnd,
28
+ startText,
29
+ toggleMobileKeyboardView,
30
+ toolbarFormat,
31
+ toolbarTitle = 'Select date range'
32
+ }) => {
33
+ const utils = useUtils();
34
+ const startDateValue = start ? utils.formatByString(start, toolbarFormat || utils.formats.shortDate) : startText;
35
+ const endDateValue = end ? utils.formatByString(end, toolbarFormat || utils.formats.shortDate) : endText;
36
+ return /*#__PURE__*/_jsx(DateRangePickerToolbarRoot, {
37
+ toolbarTitle: toolbarTitle,
38
+ isMobileKeyboardViewOpen: isMobileKeyboardViewOpen,
39
+ toggleMobileKeyboardView: toggleMobileKeyboardView,
40
+ isLandscape: false,
41
+ penIconClassName: classes.penIcon,
42
+ children: /*#__PURE__*/_jsxs(DateRangePickerToolbarContainer, {
43
+ children: [/*#__PURE__*/_jsx(PickersToolbarButton, {
44
+ variant: start !== null ? 'h5' : 'h6',
45
+ value: startDateValue,
46
+ selected: currentlySelectingRangeEnd === 'start',
47
+ onClick: () => setCurrentlySelectingRangeEnd('start')
48
+ }), /*#__PURE__*/_jsxs(Typography, {
49
+ variant: "h5",
50
+ children: ["\xA0", '–', "\xA0"]
51
+ }), /*#__PURE__*/_jsx(PickersToolbarButton, {
52
+ variant: end !== null ? 'h5' : 'h6',
53
+ value: endDateValue,
54
+ selected: currentlySelectingRangeEnd === 'end',
55
+ onClick: () => setCurrentlySelectingRangeEnd('end')
56
+ })]
57
+ })
58
+ });
59
+ };
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { BasePickerProps, WrapperVariant, PickerSelectionState, ExportedCalendarPickerProps } from '@mui/x-date-pickers/internals';
4
+ import { DateRange, CurrentlySelectingRangeEndProps, RangeInput } from '../internal/models/dateRange';
5
+ import { DateRangeInputProps } from './DateRangePickerInput';
6
+ import { ExportedDesktopDateRangeCalendarProps } from './DateRangePickerViewDesktop';
7
+ declare type BaseCalendarPropsToReuse<TDate> = Omit<ExportedCalendarPickerProps<TDate>, 'onYearChange' | 'renderDay'>;
8
+ export interface ExportedDateRangePickerViewProps<TDate> extends BaseCalendarPropsToReuse<TDate>, ExportedDesktopDateRangeCalendarProps<TDate>, Omit<BasePickerProps<RangeInput<TDate>, DateRange<TDate>>, 'value' | 'onChange'> {
9
+ /**
10
+ * If `true`, after selecting `start` date calendar will not automatically switch to the month of `end` date.
11
+ * @default false
12
+ */
13
+ disableAutoMonthSwitching?: boolean;
14
+ /**
15
+ * Mobile picker title, displaying in the toolbar.
16
+ * @default 'Select date range'
17
+ */
18
+ toolbarTitle?: React.ReactNode;
19
+ }
20
+ interface DateRangePickerViewProps<TDate> extends CurrentlySelectingRangeEndProps, ExportedDateRangePickerViewProps<TDate> {
21
+ calendars: 1 | 2 | 3;
22
+ open: boolean;
23
+ startText: React.ReactNode;
24
+ endText: React.ReactNode;
25
+ isMobileKeyboardViewOpen: boolean;
26
+ toggleMobileKeyboardView: () => void;
27
+ DateInputProps: DateRangeInputProps;
28
+ date: DateRange<TDate>;
29
+ onDateChange: (date: DateRange<TDate>, currentWrapperVariant: WrapperVariant, isFinish?: PickerSelectionState) => void;
30
+ }
31
+ /**
32
+ * @ignore - internal component.
33
+ */
34
+ export declare function DateRangePickerView<TDate>(props: DateRangePickerViewProps<TDate>): JSX.Element;
35
+ export declare namespace DateRangePickerView {
36
+ var propTypes: {
37
+ calendars: PropTypes.Requireable<number>;
38
+ disableAutoMonthSwitching: PropTypes.Requireable<boolean>;
39
+ };
40
+ }
41
+ export {};
@@ -0,0 +1,179 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["calendars", "className", "currentlySelectingRangeEnd", "date", "DateInputProps", "defaultCalendarMonth", "disableAutoMonthSwitching", "disableFuture", "disableHighlightToday", "disablePast", "endText", "isMobileKeyboardViewOpen", "maxDate", "minDate", "onDateChange", "onMonthChange", "open", "reduceAnimations", "setCurrentlySelectingRangeEnd", "shouldDisableDate", "showToolbar", "startText", "toggleMobileKeyboardView", "toolbarFormat", "toolbarTitle"];
4
+ import * as React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { Watermark } from '@mui/x-license-pro';
7
+ import { useUtils, WrapperVariantContext, MobileKeyboardInputView, defaultReduceAnimations, useCalendarState } from '@mui/x-date-pickers/internals';
8
+ import { isRangeValid } from '../internal/utils/date-utils';
9
+ import { calculateRangeChange } from './date-range-manager';
10
+ import { DateRangePickerToolbar } from './DateRangePickerToolbar';
11
+ import { DateRangePickerViewMobile } from './DateRangePickerViewMobile';
12
+ import { DateRangePickerInput } from './DateRangePickerInput';
13
+ import { DateRangePickerViewDesktop } from './DateRangePickerViewDesktop';
14
+ import { getReleaseInfo } from '../internal/utils/releaseInfo';
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ import { jsxs as _jsxs } from "react/jsx-runtime";
17
+ const releaseInfo = getReleaseInfo();
18
+
19
+ /**
20
+ * @ignore - internal component.
21
+ */
22
+ export function DateRangePickerView(props) {
23
+ const {
24
+ calendars,
25
+ className,
26
+ currentlySelectingRangeEnd,
27
+ date,
28
+ DateInputProps,
29
+ defaultCalendarMonth,
30
+ disableAutoMonthSwitching = false,
31
+ disableFuture,
32
+ disableHighlightToday,
33
+ disablePast,
34
+ endText,
35
+ isMobileKeyboardViewOpen,
36
+ maxDate,
37
+ minDate,
38
+ onDateChange,
39
+ onMonthChange,
40
+ open,
41
+ reduceAnimations = defaultReduceAnimations,
42
+ setCurrentlySelectingRangeEnd,
43
+ shouldDisableDate,
44
+ showToolbar,
45
+ startText,
46
+ toggleMobileKeyboardView,
47
+ toolbarFormat,
48
+ toolbarTitle
49
+ } = props,
50
+ other = _objectWithoutPropertiesLoose(props, _excluded);
51
+
52
+ const utils = useUtils();
53
+ const wrapperVariant = React.useContext(WrapperVariantContext);
54
+ const [start, end] = date;
55
+ const {
56
+ changeMonth,
57
+ calendarState,
58
+ isDateDisabled,
59
+ onMonthSwitchingAnimationEnd,
60
+ changeFocusedDay
61
+ } = useCalendarState({
62
+ date: start || end,
63
+ defaultCalendarMonth,
64
+ disableFuture,
65
+ disablePast,
66
+ disableSwitchToMonthOnDayFocus: true,
67
+ maxDate,
68
+ minDate,
69
+ onMonthChange,
70
+ reduceAnimations,
71
+ shouldDisableDate
72
+ });
73
+ const toShowToolbar = showToolbar != null ? showToolbar : wrapperVariant !== 'desktop';
74
+
75
+ const scrollToDayIfNeeded = day => {
76
+ if (!day || !utils.isValid(day) || isDateDisabled(day)) {
77
+ return;
78
+ }
79
+
80
+ const currentlySelectedDate = currentlySelectingRangeEnd === 'start' ? start : end;
81
+
82
+ if (currentlySelectedDate === null) {
83
+ // do not scroll if one of ages is not selected
84
+ return;
85
+ }
86
+
87
+ const displayingMonthRange = wrapperVariant === 'mobile' ? 0 : calendars - 1;
88
+ const currentMonthNumber = utils.getMonth(calendarState.currentMonth);
89
+ const requestedMonthNumber = utils.getMonth(day);
90
+
91
+ if (!utils.isSameYear(calendarState.currentMonth, day) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) {
92
+ const newMonth = currentlySelectingRangeEnd === 'start' ? currentlySelectedDate : // If need to focus end, scroll to the state when "end" is displaying in the last calendar
93
+ utils.addMonths(currentlySelectedDate, -displayingMonthRange);
94
+ changeMonth(newMonth);
95
+ }
96
+ };
97
+
98
+ React.useEffect(() => {
99
+ if (disableAutoMonthSwitching || !open) {
100
+ return;
101
+ }
102
+
103
+ scrollToDayIfNeeded(currentlySelectingRangeEnd === 'start' ? start : end);
104
+ }, [currentlySelectingRangeEnd, date]); // eslint-disable-line
105
+
106
+ const handleChange = React.useCallback(newDate => {
107
+ const {
108
+ nextSelection,
109
+ newRange
110
+ } = calculateRangeChange({
111
+ newDate,
112
+ utils,
113
+ range: date,
114
+ currentlySelectingRangeEnd
115
+ });
116
+ setCurrentlySelectingRangeEnd(nextSelection);
117
+ const isFullRangeSelected = currentlySelectingRangeEnd === 'end' && isRangeValid(utils, newRange);
118
+ onDateChange(newRange, wrapperVariant, isFullRangeSelected ? 'finish' : 'partial');
119
+ }, [currentlySelectingRangeEnd, date, onDateChange, setCurrentlySelectingRangeEnd, utils, wrapperVariant]);
120
+
121
+ const renderView = () => {
122
+ const sharedCalendarProps = _extends({
123
+ date,
124
+ isDateDisabled,
125
+ changeFocusedDay,
126
+ onChange: handleChange,
127
+ reduceAnimations,
128
+ disableHighlightToday,
129
+ onMonthSwitchingAnimationEnd,
130
+ changeMonth,
131
+ currentlySelectingRangeEnd,
132
+ disableFuture,
133
+ disablePast,
134
+ minDate,
135
+ maxDate
136
+ }, calendarState, other);
137
+
138
+ switch (wrapperVariant) {
139
+ case 'desktop':
140
+ {
141
+ return /*#__PURE__*/_jsx(DateRangePickerViewDesktop, _extends({
142
+ calendars: calendars
143
+ }, sharedCalendarProps));
144
+ }
145
+
146
+ default:
147
+ {
148
+ return /*#__PURE__*/_jsx(DateRangePickerViewMobile, _extends({}, sharedCalendarProps));
149
+ }
150
+ }
151
+ };
152
+
153
+ return /*#__PURE__*/_jsxs("div", {
154
+ className: className,
155
+ children: [/*#__PURE__*/_jsx(Watermark, {
156
+ packageName: "x-date-pickers-pro",
157
+ releaseInfo: releaseInfo
158
+ }), toShowToolbar && /*#__PURE__*/_jsx(DateRangePickerToolbar, {
159
+ date: date,
160
+ isMobileKeyboardViewOpen: isMobileKeyboardViewOpen,
161
+ toggleMobileKeyboardView: toggleMobileKeyboardView,
162
+ currentlySelectingRangeEnd: currentlySelectingRangeEnd,
163
+ setCurrentlySelectingRangeEnd: setCurrentlySelectingRangeEnd,
164
+ startText: startText,
165
+ endText: endText,
166
+ toolbarTitle: toolbarTitle,
167
+ toolbarFormat: toolbarFormat
168
+ }), isMobileKeyboardViewOpen ? /*#__PURE__*/_jsx(MobileKeyboardInputView, {
169
+ children: /*#__PURE__*/_jsx(DateRangePickerInput, _extends({
170
+ disableOpenPicker: true,
171
+ ignoreInvalidInputs: true
172
+ }, DateInputProps))
173
+ }) : renderView()]
174
+ });
175
+ }
176
+ process.env.NODE_ENV !== "production" ? DateRangePickerView.propTypes = {
177
+ calendars: PropTypes.oneOf([1, 2, 3]),
178
+ disableAutoMonthSwitching: PropTypes.bool
179
+ } : void 0;
@@ -0,0 +1,30 @@
1
+ /// <reference types="react" />
2
+ import { ExportedDateValidationProps, ExportedArrowSwitcherProps, PickersCalendarProps } from '@mui/x-date-pickers/internals';
3
+ import { DateRange } from '../internal/models';
4
+ import { DateRangePickerDayProps } from '../DateRangePickerDay';
5
+ export interface ExportedDesktopDateRangeCalendarProps<TDate> {
6
+ /**
7
+ * The number of calendars that render on **desktop**.
8
+ * @default 2
9
+ */
10
+ calendars?: 1 | 2 | 3;
11
+ /**
12
+ * Custom renderer for `<DateRangePicker />` days. @DateIOType
13
+ * @example (date, dateRangePickerDayProps) => <DateRangePickerDay {...dateRangePickerDayProps} />
14
+ * @param {TDate} day The day to render.
15
+ * @param {DateRangePickerDayProps<TDate>} dateRangePickerDayProps The props of the day to render.
16
+ * @returns {JSX.Element} The element representing the day.
17
+ */
18
+ renderDay?: (day: TDate, dateRangePickerDayProps: DateRangePickerDayProps<TDate>) => JSX.Element;
19
+ }
20
+ interface DesktopDateRangeCalendarProps<TDate> extends ExportedDesktopDateRangeCalendarProps<TDate>, Omit<PickersCalendarProps<TDate>, 'renderDay' | 'onFocusedDayChange'>, ExportedDateValidationProps<TDate>, ExportedArrowSwitcherProps {
21
+ calendars: 1 | 2 | 3;
22
+ date: DateRange<TDate | null>;
23
+ changeMonth: (date: TDate) => void;
24
+ currentlySelectingRangeEnd: 'start' | 'end';
25
+ }
26
+ /**
27
+ * @ignore - internal component.
28
+ */
29
+ export declare function DateRangePickerViewDesktop<TDate>(props: DesktopDateRangeCalendarProps<TDate>): JSX.Element;
30
+ export {};
@@ -0,0 +1,154 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["calendars", "changeMonth", "components", "componentsProps", "currentlySelectingRangeEnd", "currentMonth", "date", "disableFuture", "disablePast", "leftArrowButtonText", "maxDate", "minDate", "onChange", "renderDay", "rightArrowButtonText"];
4
+ import * as React from 'react';
5
+ import { styled } from '@mui/material/styles';
6
+ import { useDefaultDates, useUtils, PickersArrowSwitcher, usePreviousMonthDisabled, useNextMonthDisabled, DayPicker } from '@mui/x-date-pickers/internals';
7
+ import { calculateRangePreview } from './date-range-manager';
8
+ import { DateRangePickerDay } from '../DateRangePickerDay';
9
+ import { isWithinRange, isStartOfRange, isEndOfRange } from '../internal/utils/date-utils';
10
+ import { doNothing } from '../internal/utils/utils';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { createElement as _createElement } from "react";
13
+ import { jsxs as _jsxs } from "react/jsx-runtime";
14
+ const DateRangePickerViewDesktopRoot = styled('div')({
15
+ display: 'flex',
16
+ flexDirection: 'row'
17
+ });
18
+ const DateRangePickerViewDesktopContainer = styled('div')(({
19
+ theme
20
+ }) => ({
21
+ '&:not(:last-of-type)': {
22
+ borderRight: `2px solid ${theme.palette.divider}`
23
+ }
24
+ }));
25
+ const DateRangePickerViewDesktopCalendar = styled(DayPicker)({
26
+ minWidth: 312,
27
+ minHeight: 288
28
+ });
29
+ const DateRangePickerViewDesktopArrowSwitcher = styled(PickersArrowSwitcher)({
30
+ padding: '16px 16px 8px 16px',
31
+ display: 'flex',
32
+ alignItems: 'center',
33
+ justifyContent: 'space-between'
34
+ });
35
+
36
+ function getCalendarsArray(calendars) {
37
+ switch (calendars) {
38
+ case 1:
39
+ return [0];
40
+
41
+ case 2:
42
+ return [0, 0];
43
+
44
+ case 3:
45
+ return [0, 0, 0];
46
+ // this will not work in IE11, but allows to support any amount of calendars
47
+
48
+ default:
49
+ return new Array(calendars).fill(0);
50
+ }
51
+ }
52
+ /**
53
+ * @ignore - internal component.
54
+ */
55
+
56
+
57
+ export function DateRangePickerViewDesktop(props) {
58
+ const {
59
+ calendars,
60
+ changeMonth,
61
+ components,
62
+ componentsProps,
63
+ currentlySelectingRangeEnd,
64
+ currentMonth,
65
+ date,
66
+ disableFuture,
67
+ disablePast,
68
+ leftArrowButtonText = 'Previous month',
69
+ maxDate: maxDateProp,
70
+ minDate: minDateProp,
71
+ onChange,
72
+ renderDay = (_, dateRangeProps) => /*#__PURE__*/_jsx(DateRangePickerDay, _extends({}, dateRangeProps)),
73
+ rightArrowButtonText = 'Next month'
74
+ } = props,
75
+ other = _objectWithoutPropertiesLoose(props, _excluded);
76
+
77
+ const utils = useUtils();
78
+ const defaultDates = useDefaultDates();
79
+ const minDate = minDateProp != null ? minDateProp : defaultDates.minDate;
80
+ const maxDate = maxDateProp != null ? maxDateProp : defaultDates.maxDate;
81
+ const [rangePreviewDay, setRangePreviewDay] = React.useState(null);
82
+ const isNextMonthDisabled = useNextMonthDisabled(currentMonth, {
83
+ disableFuture,
84
+ maxDate
85
+ });
86
+ const isPreviousMonthDisabled = usePreviousMonthDisabled(currentMonth, {
87
+ disablePast,
88
+ minDate
89
+ });
90
+ const previewingRange = calculateRangePreview({
91
+ utils,
92
+ range: date,
93
+ newDate: rangePreviewDay,
94
+ currentlySelectingRangeEnd
95
+ });
96
+ const handleDayChange = React.useCallback(day => {
97
+ setRangePreviewDay(null);
98
+ onChange(day);
99
+ }, [onChange]);
100
+
101
+ const handlePreviewDayChange = newPreviewRequest => {
102
+ if (!isWithinRange(utils, newPreviewRequest, date)) {
103
+ setRangePreviewDay(newPreviewRequest);
104
+ } else {
105
+ setRangePreviewDay(null);
106
+ }
107
+ };
108
+
109
+ const CalendarTransitionProps = React.useMemo(() => ({
110
+ onMouseLeave: () => setRangePreviewDay(null)
111
+ }), []);
112
+ const selectNextMonth = React.useCallback(() => {
113
+ changeMonth(utils.getNextMonth(currentMonth));
114
+ }, [changeMonth, currentMonth, utils]);
115
+ const selectPreviousMonth = React.useCallback(() => {
116
+ changeMonth(utils.getPreviousMonth(currentMonth));
117
+ }, [changeMonth, currentMonth, utils]);
118
+ return /*#__PURE__*/_jsx(DateRangePickerViewDesktopRoot, {
119
+ children: getCalendarsArray(calendars).map((_, index) => {
120
+ const monthOnIteration = utils.setMonth(currentMonth, utils.getMonth(currentMonth) + index);
121
+ return /*#__PURE__*/_jsxs(DateRangePickerViewDesktopContainer, {
122
+ children: [/*#__PURE__*/_jsx(DateRangePickerViewDesktopArrowSwitcher, {
123
+ onLeftClick: selectPreviousMonth,
124
+ onRightClick: selectNextMonth,
125
+ isLeftHidden: index !== 0,
126
+ isRightHidden: index !== calendars - 1,
127
+ isLeftDisabled: isPreviousMonthDisabled,
128
+ isRightDisabled: isNextMonthDisabled,
129
+ leftArrowButtonText: leftArrowButtonText,
130
+ components: components,
131
+ componentsProps: componentsProps,
132
+ rightArrowButtonText: rightArrowButtonText,
133
+ children: utils.format(monthOnIteration, 'monthAndYear')
134
+ }), /*#__PURE__*/_createElement(DateRangePickerViewDesktopCalendar, _extends({}, other, {
135
+ key: index,
136
+ date: date,
137
+ onFocusedDayChange: doNothing,
138
+ onChange: handleDayChange,
139
+ currentMonth: monthOnIteration,
140
+ TransitionProps: CalendarTransitionProps,
141
+ renderDay: (day, __, DayProps) => renderDay(day, _extends({
142
+ isPreviewing: isWithinRange(utils, day, previewingRange),
143
+ isStartOfPreviewing: isStartOfRange(utils, day, previewingRange),
144
+ isEndOfPreviewing: isEndOfRange(utils, day, previewingRange),
145
+ isHighlighting: isWithinRange(utils, day, date),
146
+ isStartOfHighlighting: isStartOfRange(utils, day, date),
147
+ isEndOfHighlighting: isEndOfRange(utils, day, date),
148
+ onMouseEnter: () => handlePreviewDayChange(day)
149
+ }, DayProps))
150
+ }))]
151
+ }, index);
152
+ })
153
+ });
154
+ }
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { ExportedCalendarHeaderProps, ExportedDateValidationProps, PickersCalendarProps } from '@mui/x-date-pickers/internals';
3
+ import { DateRange } from '../internal/models/dateRange';
4
+ import { ExportedDesktopDateRangeCalendarProps } from './DateRangePickerViewDesktop';
5
+ export interface ExportedMobileDateRangeCalendarProps<TDate> extends Pick<ExportedDesktopDateRangeCalendarProps<TDate>, 'renderDay'> {
6
+ }
7
+ interface DesktopDateRangeCalendarProps<TDate> extends ExportedMobileDateRangeCalendarProps<TDate>, Omit<PickersCalendarProps<TDate>, 'date' | 'renderDay' | 'onFocusedDayChange'>, ExportedDateValidationProps<TDate>, ExportedCalendarHeaderProps<TDate> {
8
+ date: DateRange<TDate>;
9
+ changeMonth: (date: TDate) => void;
10
+ }
11
+ /**
12
+ * @ignore - internal component.
13
+ */
14
+ export declare function DateRangePickerViewMobile<TDate>(props: DesktopDateRangeCalendarProps<TDate>): JSX.Element;
15
+ export {};