@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.
- package/CHANGELOG.md +3785 -0
- package/DateRangePicker/DateRangePicker.d.ts +66 -0
- package/DateRangePicker/DateRangePicker.js +519 -0
- package/DateRangePicker/DateRangePickerInput.d.ts +37 -0
- package/DateRangePicker/DateRangePickerInput.js +128 -0
- package/DateRangePicker/DateRangePickerToolbar.d.ts +15 -0
- package/DateRangePicker/DateRangePickerToolbar.js +59 -0
- package/DateRangePicker/DateRangePickerView.d.ts +41 -0
- package/DateRangePicker/DateRangePickerView.js +179 -0
- package/DateRangePicker/DateRangePickerViewDesktop.d.ts +30 -0
- package/DateRangePicker/DateRangePickerViewDesktop.js +154 -0
- package/DateRangePicker/DateRangePickerViewMobile.d.ts +15 -0
- package/DateRangePicker/DateRangePickerViewMobile.js +60 -0
- package/DateRangePicker/date-range-manager.d.ts +14 -0
- package/DateRangePicker/date-range-manager.js +43 -0
- package/DateRangePicker/index.d.ts +3 -0
- package/DateRangePicker/index.js +1 -0
- package/DateRangePicker/package.json +6 -0
- package/DateRangePickerDay/DateRangePickerDay.d.ts +52 -0
- package/DateRangePickerDay/DateRangePickerDay.js +290 -0
- package/DateRangePickerDay/dateRangePickerDayClasses.d.ts +29 -0
- package/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
- package/DateRangePickerDay/index.d.ts +4 -0
- package/DateRangePickerDay/index.js +2 -0
- package/DateRangePickerDay/package.json +6 -0
- package/DesktopDateRangePicker/DesktopDateRangePicker.d.ts +66 -0
- package/DesktopDateRangePicker/DesktopDateRangePicker.js +485 -0
- package/DesktopDateRangePicker/index.d.ts +2 -0
- package/DesktopDateRangePicker/index.js +1 -0
- package/DesktopDateRangePicker/package.json +6 -0
- package/MobileDateRangePicker/MobileDateRangePicker.d.ts +66 -0
- package/MobileDateRangePicker/MobileDateRangePicker.js +495 -0
- package/MobileDateRangePicker/index.d.ts +2 -0
- package/MobileDateRangePicker/index.js +1 -0
- package/MobileDateRangePicker/package.json +6 -0
- package/README.md +29 -0
- package/StaticDateRangePicker/StaticDateRangePicker.d.ts +69 -0
- package/StaticDateRangePicker/StaticDateRangePicker.js +455 -0
- package/StaticDateRangePicker/index.d.ts +2 -0
- package/StaticDateRangePicker/index.js +1 -0
- package/StaticDateRangePicker/package.json +6 -0
- package/index.d.ts +7 -0
- package/index.js +12 -0
- package/internal/hooks/validation/useDateRangeValidation.d.ts +12 -0
- package/internal/hooks/validation/useDateRangeValidation.js +27 -0
- package/internal/models/dateRange.d.ts +8 -0
- package/internal/models/dateRange.js +1 -0
- package/internal/models/index.d.ts +1 -0
- package/internal/models/index.js +1 -0
- package/internal/utils/date-utils.d.ts +7 -0
- package/internal/utils/date-utils.js +19 -0
- package/internal/utils/releaseInfo.d.ts +1 -0
- package/internal/utils/releaseInfo.js +15 -0
- package/internal/utils/utils.d.ts +1 -0
- package/internal/utils/utils.js +1 -0
- package/legacy/DateRangePicker/DateRangePicker.js +528 -0
- package/legacy/DateRangePicker/DateRangePickerInput.js +141 -0
- package/legacy/DateRangePicker/DateRangePickerToolbar.js +66 -0
- package/legacy/DateRangePicker/DateRangePickerView.js +184 -0
- package/legacy/DateRangePicker/DateRangePickerViewDesktop.js +172 -0
- package/legacy/DateRangePicker/DateRangePickerViewMobile.js +63 -0
- package/legacy/DateRangePicker/date-range-manager.js +51 -0
- package/legacy/DateRangePicker/index.js +1 -0
- package/legacy/DateRangePickerDay/DateRangePickerDay.js +296 -0
- package/legacy/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
- package/legacy/DateRangePickerDay/index.js +2 -0
- package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +494 -0
- package/legacy/DesktopDateRangePicker/index.js +1 -0
- package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +504 -0
- package/legacy/MobileDateRangePicker/index.js +1 -0
- package/legacy/StaticDateRangePicker/StaticDateRangePicker.js +465 -0
- package/legacy/StaticDateRangePicker/index.js +1 -0
- package/legacy/index.js +12 -0
- package/legacy/internal/hooks/validation/useDateRangeValidation.js +33 -0
- package/legacy/internal/models/dateRange.js +1 -0
- package/legacy/internal/models/index.js +1 -0
- package/legacy/internal/utils/date-utils.js +22 -0
- package/legacy/internal/utils/releaseInfo.js +15 -0
- package/legacy/internal/utils/utils.js +1 -0
- package/legacy/themeAugmentation/index.js +3 -0
- package/modern/DateRangePicker/DateRangePicker.js +519 -0
- package/modern/DateRangePicker/DateRangePickerInput.js +124 -0
- package/modern/DateRangePicker/DateRangePickerToolbar.js +59 -0
- package/modern/DateRangePicker/DateRangePickerView.js +179 -0
- package/modern/DateRangePicker/DateRangePickerViewDesktop.js +154 -0
- package/modern/DateRangePicker/DateRangePickerViewMobile.js +60 -0
- package/modern/DateRangePicker/date-range-manager.js +43 -0
- package/modern/DateRangePicker/index.js +1 -0
- package/modern/DateRangePickerDay/DateRangePickerDay.js +290 -0
- package/modern/DateRangePickerDay/dateRangePickerDayClasses.js +5 -0
- package/modern/DateRangePickerDay/index.js +2 -0
- package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +485 -0
- package/modern/DesktopDateRangePicker/index.js +1 -0
- package/modern/MobileDateRangePicker/MobileDateRangePicker.js +495 -0
- package/modern/MobileDateRangePicker/index.js +1 -0
- package/modern/StaticDateRangePicker/StaticDateRangePicker.js +455 -0
- package/modern/StaticDateRangePicker/index.js +1 -0
- package/modern/index.js +12 -0
- package/modern/internal/hooks/validation/useDateRangeValidation.js +27 -0
- package/modern/internal/models/dateRange.js +1 -0
- package/modern/internal/models/index.js +1 -0
- package/modern/internal/utils/date-utils.js +19 -0
- package/modern/internal/utils/releaseInfo.js +15 -0
- package/modern/internal/utils/utils.js +1 -0
- package/modern/themeAugmentation/index.js +3 -0
- package/node/DateRangePicker/DateRangePicker.js +540 -0
- package/node/DateRangePicker/DateRangePickerInput.js +148 -0
- package/node/DateRangePicker/DateRangePickerToolbar.js +79 -0
- package/node/DateRangePicker/DateRangePickerView.js +206 -0
- package/node/DateRangePicker/DateRangePickerViewDesktop.js +175 -0
- package/node/DateRangePicker/DateRangePickerViewMobile.js +80 -0
- package/node/DateRangePicker/date-range-manager.js +52 -0
- package/node/DateRangePicker/index.js +13 -0
- package/node/DateRangePickerDay/DateRangePickerDay.js +315 -0
- package/node/DateRangePickerDay/dateRangePickerDayClasses.js +16 -0
- package/node/DateRangePickerDay/index.js +27 -0
- package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +506 -0
- package/node/DesktopDateRangePicker/index.js +13 -0
- package/node/MobileDateRangePicker/MobileDateRangePicker.js +516 -0
- package/node/MobileDateRangePicker/index.js +13 -0
- package/node/StaticDateRangePicker/StaticDateRangePicker.js +475 -0
- package/node/StaticDateRangePicker/index.js +13 -0
- package/node/index.js +105 -0
- package/node/internal/hooks/validation/useDateRangeValidation.js +40 -0
- package/node/internal/models/dateRange.js +5 -0
- package/node/internal/models/index.js +18 -0
- package/node/internal/utils/date-utils.js +40 -0
- package/node/internal/utils/releaseInfo.js +25 -0
- package/node/internal/utils/utils.js +10 -0
- package/node/themeAugmentation/index.js +44 -0
- package/package.json +77 -0
- package/themeAugmentation/components.d.ts +13 -0
- package/themeAugmentation/index.d.ts +3 -0
- package/themeAugmentation/index.js +3 -0
- package/themeAugmentation/overrides.d.ts +13 -0
- package/themeAugmentation/package.json +6 -0
- 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 {};
|