UNPKG

@nuragic/pickers

Version:

React components, that implements material design pickers for material-ui v4

961 lines (873 loc) 43.5 kB
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties'; import { createElement, memo, Fragment, useRef, useContext, useEffect, useCallback, useState, useMemo, forwardRef } from 'react'; import { instanceOf, func, string, object, node, oneOf, bool, arrayOf } from 'prop-types'; export { default as LocalizationProvider, MuiPickersAdapterContext as MuiPickersContext } from './LocalizationProvider.js'; import { w as withDefaultProps, u as useUtils, D as DAY_MARGIN, a as useNow } from './dimensions-f39eca69.js'; export { u as useUtils } from './dimensions-f39eca69.js'; import _extends from '@babel/runtime/helpers/esm/extends'; import clsx from 'clsx'; import Typography from '@material-ui/core/Typography'; import { makeStyles, fade, styled } from '@material-ui/core/styles'; import '@material-ui/core/Grid'; import '@material-ui/core/IconButton'; import '@material-ui/core/Toolbar'; import '@material-ui/core/utils'; import { P as PickerToolbar, T as ToolbarButton, A as ArrowSwitcher } from './ClockView-cbc47796.js'; export { C as PickersClockView, a as TimePickerToolbar } from './ClockView-cbc47796.js'; import '@material-ui/styles/getThemeProps'; import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray'; import '@babel/runtime/helpers/esm/typeof'; import { e as executeInTheNextEventLoopTick, m as mergeRefs } from './useCanAutoFocus-1eacc580.js'; import { d as defaultMinDate, a as defaultMaxDate, C as CalendarHeader, i as isWithinRange, b as isStartOfRange, c as isEndOfRange, u as useMaskedInput, e as useNextMonthDisabled, f as usePreviousMonthDisabled, g as useParsedDate, h as useCalendarState, j as isRangeValid, M as MobileKeyboardInputView, k as defaultReduceAnimations, v as validateDateRange, l as date, p as parseRangeInputValue } from './Picker-9fd3de05.js'; export { P as PickersBasePickers, m as PickersCalendarView } from './Picker-9fd3de05.js'; export { a as DatePicker, D as DatePickerToolbar, b as DesktopDatePicker, M as MobileDatePicker, S as StaticDatePicker } from './DatePicker-24923e89.js'; import '@material-ui/core/useMediaQuery'; import { m as makeValidationHook, a as makeWrapperComponent, w as withDateAdapterProp, u as usePickerState, R as ResponsiveTooltipWrapper, D as DesktopTooltipWrapper, M as MobileWrapper, S as StaticWrapper } from './makePickerWithState-a4b8917f.js'; export { u as usePickerState } from './makePickerWithState-a4b8917f.js'; import { W as WrapperVariantContext } from './Clock-c2c3c22b.js'; export { C as PickersClock } from './Clock-c2c3c22b.js'; import '@material-ui/core/Button'; import '@material-ui/core/DialogActions'; import '@material-ui/core/DialogContent'; import '@material-ui/core/Dialog'; import '@material-ui/core/InputAdornment'; import 'rifm'; import '@material-ui/core/Grow'; import '@material-ui/core/Paper'; import '@material-ui/core/Popper'; import '@material-ui/core/Unstable_TrapFocus'; import './useKeyDown-5aaf69f9.js'; import '@babel/runtime/helpers/esm/classCallCheck'; import '@babel/runtime/helpers/esm/createClass'; import '@babel/runtime/helpers/esm/inherits'; import '@babel/runtime/helpers/esm/possibleConstructorReturn'; import '@babel/runtime/helpers/esm/getPrototypeOf'; import '@material-ui/core/ButtonBase'; import 'react-transition-group'; import { areDayPropsEqual, Day } from './Day.js'; export { Day as PickersDay } from './Day.js'; import { Calendar } from './Calendar.js'; export { Calendar as PickersCalendar } from './Calendar.js'; import '@material-ui/core/Fade'; export { D as DesktopTimePicker, M as MobileTimePicker, S as StaticTimePicker, T as TimePicker, g as getTextFieldAriaText } from './TimePicker-750cda33.js'; import '@material-ui/core/Tab'; import '@material-ui/core/Tabs'; export { a as DateTimePicker, D as DateTimePickerToolbar, b as DesktopDateTimePicker, M as MobileDateTimePicker, S as StaticDateTimePicker } from './DateTimePicker-16c7a543.js'; function calculateRangeChange(_ref) { var utils = _ref.utils, range = _ref.range, selectedDate = _ref.newDate, currentlySelectingRangeEnd = _ref.currentlySelectingRangeEnd; var _range = _slicedToArray(range, 2), start = _range[0], end = _range[1]; if (currentlySelectingRangeEnd === 'start') { return Boolean(end) && utils.isAfter(selectedDate, end) ? { nextSelection: 'end', newRange: [selectedDate, null] } : { nextSelection: 'end', newRange: [selectedDate, end] }; } return Boolean(start) && utils.isBefore(selectedDate, start) ? { nextSelection: 'end', newRange: [selectedDate, null] } : { nextSelection: 'start', newRange: [start, selectedDate] }; } function calculateRangePreview(options) { if (!options.newDate) { return [null, null]; } var _options$range = _slicedToArray(options.range, 2), start = _options$range[0], end = _options$range[1]; var _calculateRangeChange = calculateRangeChange(options), newRange = _calculateRangeChange.newRange; if (!start || !end) { return newRange; } var _newRange = _slicedToArray(newRange, 2), previewStart = _newRange[0], previewEnd = _newRange[1]; return options.currentlySelectingRangeEnd === 'end' ? [end, previewEnd] : [previewStart, start]; } var muiComponentConfig = { name: 'MuiPickersDateRangePickerToolbarProps' }; var useStyles = makeStyles({ root: {}, penIcon: { position: 'relative', top: 4 }, dateTextContainer: { display: 'flex' } }, muiComponentConfig); var DateRangePickerToolbar = withDefaultProps(muiComponentConfig, function (_ref) { var currentlySelectingRangeEnd = _ref.currentlySelectingRangeEnd, _ref$date = _slicedToArray(_ref.date, 2), start = _ref$date[0], end = _ref$date[1], endText = _ref.endText, isMobileKeyboardViewOpen = _ref.isMobileKeyboardViewOpen, setCurrentlySelectingRangeEnd = _ref.setCurrentlySelectingRangeEnd, startText = _ref.startText, toggleMobileKeyboardView = _ref.toggleMobileKeyboardView, toolbarFormat = _ref.toolbarFormat, _ref$toolbarTitle = _ref.toolbarTitle, toolbarTitle = _ref$toolbarTitle === void 0 ? 'SELECT DATE RANGE' : _ref$toolbarTitle; var utils = useUtils(); var classes = useStyles(); var startDateValue = start ? utils.formatByString(start, toolbarFormat || utils.formats.shortDate) : startText; var endDateValue = end ? utils.formatByString(end, toolbarFormat || utils.formats.shortDate) : endText; return /*#__PURE__*/createElement(PickerToolbar, { className: classes.root, toolbarTitle: toolbarTitle, isMobileKeyboardViewOpen: isMobileKeyboardViewOpen, toggleMobileKeyboardView: toggleMobileKeyboardView, isLandscape: false, penIconClassName: classes.penIcon }, /*#__PURE__*/createElement("div", { className: classes.dateTextContainer }, /*#__PURE__*/createElement(ToolbarButton, { variant: start !== null ? 'h5' : 'h6', value: startDateValue, selected: currentlySelectingRangeEnd === 'start', onClick: function onClick() { return setCurrentlySelectingRangeEnd('start'); } }), /*#__PURE__*/createElement(Typography, { variant: "h5" }, "\xA0", '–', "\xA0"), /*#__PURE__*/createElement(ToolbarButton, { variant: end !== null ? 'h5' : 'h6', value: endDateValue, selected: currentlySelectingRangeEnd === 'end', onClick: function onClick() { return setCurrentlySelectingRangeEnd('end'); } }))); }); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var endBorderStyle = { borderTopRightRadius: '50%', borderBottomRightRadius: '50%' }; var startBorderStyle = { borderTopLeftRadius: '50%', borderBottomLeftRadius: '50%' }; var useStyles$1 = makeStyles(function (theme) { return { root: { '&:first-child $rangeIntervalDayPreview': _objectSpread(_objectSpread({}, startBorderStyle), {}, { borderLeftColor: theme.palette.divider }), '&:last-child $rangeIntervalDayPreview': _objectSpread(_objectSpread({}, endBorderStyle), {}, { borderRightColor: theme.palette.divider }) }, rangeIntervalDayHighlight: { borderRadius: 0, color: theme.palette.primary.contrastText, backgroundColor: fade(theme.palette.primary.light, 0.6), '&:first-child': startBorderStyle, '&:last-child': endBorderStyle }, rangeIntervalDayHighlightStart: _objectSpread(_objectSpread({}, startBorderStyle), {}, { paddingLeft: 0, marginLeft: DAY_MARGIN / 2 }), rangeIntervalDayHighlightEnd: _objectSpread(_objectSpread({}, endBorderStyle), {}, { paddingRight: 0, marginRight: DAY_MARGIN / 2 }), day: { // Required to overlap preview border transform: 'scale(1.1)', '& > *': { transform: 'scale(0.9)' } }, dayOutsideRangeInterval: { '&:hover': { border: "1px solid ".concat(theme.palette.grey[500]) } }, dayInsideRangeInterval: { color: theme.palette.getContrastText(fade(theme.palette.primary.light, 0.6)) }, notSelectedDate: { backgroundColor: 'transparent' }, rangeIntervalPreview: { // replace default day component margin with transparent border to avoid jumping on preview border: '2px solid transparent' }, rangeIntervalDayPreview: { borderRadius: 0, border: "2px dashed ".concat(theme.palette.divider), borderLeftColor: 'transparent', borderRightColor: 'transparent', '&$rangeIntervalDayPreviewStart': _objectSpread({ borderLeftColor: theme.palette.divider }, startBorderStyle), '&$rangeIntervalDayPreviewEnd': _objectSpread({ borderRightColor: theme.palette.divider }, endBorderStyle) }, rangeIntervalDayPreviewStart: {}, rangeIntervalDayPreviewEnd: {} }; }, { name: 'MuiPickersDateRangeDay' }); function PureDateRangeDay(props) { var className = props.className, day = props.day, inCurrentMonth = props.inCurrentMonth, isEndOfHighlighting = props.isEndOfHighlighting, isEndOfPreviewing = props.isEndOfPreviewing, isHighlighting = props.isHighlighting, isPreviewing = props.isPreviewing, isStartOfHighlighting = props.isStartOfHighlighting, isStartOfPreviewing = props.isStartOfPreviewing, selected = props.selected, other = _objectWithoutProperties(props, ["className", "day", "inCurrentMonth", "isEndOfHighlighting", "isEndOfPreviewing", "isHighlighting", "isPreviewing", "isStartOfHighlighting", "isStartOfPreviewing", "selected"]); var utils = useUtils(); var classes = useStyles$1(); var isEndOfMonth = utils.isSameDay(day, utils.endOfMonth(day)); var isStartOfMonth = utils.isSameDay(day, utils.startOfMonth(day)); var shouldRenderHighlight = isHighlighting && inCurrentMonth; var shouldRenderPreview = isPreviewing && inCurrentMonth; return /*#__PURE__*/createElement("div", { "data-mui-test": shouldRenderHighlight ? 'DateRangeHighlight' : undefined, className: clsx(classes.root, (isEndOfHighlighting || isEndOfMonth) && classes.rangeIntervalDayHighlightEnd, (isStartOfHighlighting || isStartOfMonth) && classes.rangeIntervalDayHighlightStart, shouldRenderHighlight && classes.rangeIntervalDayHighlight) }, /*#__PURE__*/createElement("div", { "data-mui-test": shouldRenderPreview ? 'DateRangePreview' : undefined, className: clsx(classes.rangeIntervalPreview, (isEndOfPreviewing || isEndOfMonth) && classes.rangeIntervalDayPreviewEnd, (isStartOfPreviewing || isStartOfMonth) && classes.rangeIntervalDayPreviewStart, shouldRenderPreview && classes.rangeIntervalDayPreview) }, /*#__PURE__*/createElement(Day, _extends({}, other, { disableMargin: true, allowSameDateSelection: true, allowKeyboardControl: false, day: day, selected: selected, inCurrentMonth: inCurrentMonth, "data-mui-test": "DateRangeDay", className: clsx(classes.day, className, !selected && [classes.notSelectedDate, isHighlighting && classes.dayInsideRangeInterval], !isHighlighting && classes.dayOutsideRangeInterval) })))); } PureDateRangeDay.displayName = 'DateRangeDay'; var DateRangeDay = memo(PureDateRangeDay, function (prevProps, nextProps) { return prevProps.isHighlighting === nextProps.isHighlighting && prevProps.isEndOfHighlighting === nextProps.isEndOfHighlighting && prevProps.isStartOfHighlighting === nextProps.isStartOfHighlighting && prevProps.isPreviewing === nextProps.isPreviewing && prevProps.isEndOfPreviewing === nextProps.isEndOfPreviewing && prevProps.isStartOfPreviewing === nextProps.isStartOfPreviewing && areDayPropsEqual(prevProps, nextProps); }); function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var onlyDateView = ['date']; function DateRangePickerViewMobile(props) { var changeMonth = props.changeMonth, date = props.date, leftArrowButtonProps = props.leftArrowButtonProps, leftArrowButtonText = props.leftArrowButtonText, leftArrowIcon = props.leftArrowIcon, __minDate = props.minDate, __maxDate = props.maxDate, onChange = props.onChange, rightArrowButtonProps = props.rightArrowButtonProps, rightArrowButtonText = props.rightArrowButtonText, rightArrowIcon = props.rightArrowIcon, _props$renderDay = props.renderDay, _renderDay = _props$renderDay === void 0 ? function (_, props) { return /*#__PURE__*/createElement(DateRangeDay, props); } : _props$renderDay, other = _objectWithoutProperties(props, ["changeMonth", "date", "leftArrowButtonProps", "leftArrowButtonText", "leftArrowIcon", "minDate", "maxDate", "onChange", "rightArrowButtonProps", "rightArrowButtonText", "rightArrowIcon", "renderDay"]); var utils = useUtils(); var minDate = __minDate || utils.date(defaultMinDate); var maxDate = __maxDate || utils.date(defaultMaxDate); return /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement(CalendarHeader, _extends({ view: "date", views: onlyDateView, changeView: function changeView() { return {}; }, onMonthChange: changeMonth, leftArrowButtonText: leftArrowButtonText, leftArrowButtonProps: leftArrowButtonProps, leftArrowIcon: leftArrowIcon, rightArrowButtonProps: rightArrowButtonProps, rightArrowButtonText: rightArrowButtonText, rightArrowIcon: rightArrowIcon, minDate: minDate, maxDate: maxDate }, other)), /*#__PURE__*/createElement(Calendar, _extends({}, other, { date: date, onChange: onChange, renderDay: function renderDay(day, _, DayProps) { return _renderDay(day, _objectSpread$1({ isPreviewing: false, isStartOfPreviewing: false, isEndOfPreviewing: false, isHighlighting: isWithinRange(utils, day, date), isStartOfHighlighting: isStartOfRange(utils, day, date), isEndOfHighlighting: isEndOfRange(utils, day, date) }, DayProps)); } }))); } function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var useStyles$2 = makeStyles(function (theme) { return { root: _defineProperty({ display: 'flex', alignItems: 'baseline' }, theme.breakpoints.down('xs'), { flexDirection: 'column', alignItems: 'center' }), toLabelDelimiter: _defineProperty({ margin: '8px 0' }, theme.breakpoints.up('sm'), { margin: '0 16px' }) }; }, { name: 'MuiPickersDateRangePickerInput' }); var DateRangePickerInput = function DateRangePickerInput(_ref) { var containerRef = _ref.containerRef, currentlySelectingRangeEnd = _ref.currentlySelectingRangeEnd, disableOpenPicker = _ref.disableOpenPicker, endText = _ref.endText, forwardedRef = _ref.forwardedRef, onBlur = _ref.onBlur, onChange = _ref.onChange, open = _ref.open, openPicker = _ref.openPicker, rawValue = _ref.rawValue, _ref$rawValue = _slicedToArray(_ref.rawValue, 2), start = _ref$rawValue[0], end = _ref$rawValue[1], readOnly = _ref.readOnly, renderInput = _ref.renderInput, setCurrentlySelectingRangeEnd = _ref.setCurrentlySelectingRangeEnd, startText = _ref.startText, TextFieldProps = _ref.TextFieldProps, _ref$validationError = _slicedToArray(_ref.validationError, 2), startValidationError = _ref$validationError[0], endValidationError = _ref$validationError[1], other = _objectWithoutProperties(_ref, ["containerRef", "currentlySelectingRangeEnd", "disableOpenPicker", "endText", "forwardedRef", "onBlur", "onChange", "open", "openPicker", "rawValue", "rawValue", "readOnly", "renderInput", "setCurrentlySelectingRangeEnd", "startText", "TextFieldProps", "validationError"]); var utils = useUtils(); var classes = useStyles$2(); var startRef = useRef(null); var endRef = useRef(null); var wrapperVariant = useContext(WrapperVariantContext); useEffect(function () { if (!open) { return; } if (currentlySelectingRangeEnd === 'start') { var _startRef$current; (_startRef$current = startRef.current) === null || _startRef$current === void 0 ? void 0 : _startRef$current.focus(); } else if (currentlySelectingRangeEnd === 'end') { var _endRef$current; (_endRef$current = endRef.current) === null || _endRef$current === void 0 ? void 0 : _endRef$current.focus(); } }, [currentlySelectingRangeEnd, open]); // TODO: rethink this approach. We do not need to wait for calendar to be updated to rerender input (looks like freezing) // 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 var lazyHandleChangeCallback = useCallback(function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return executeInTheNextEventLoopTick(function () { return onChange.apply(void 0, args); }); }, [onChange]); var handleStartChange = function handleStartChange(date, inputString) { lazyHandleChangeCallback([date, utils.date(end)], inputString); }; var handleEndChange = function handleEndChange(date, inputString) { lazyHandleChangeCallback([utils.date(start), date], inputString); }; var openRangeStartSelection = function openRangeStartSelection() { if (setCurrentlySelectingRangeEnd) { setCurrentlySelectingRangeEnd('start'); } if (!disableOpenPicker) { openPicker(); } }; var openRangeEndSelection = function openRangeEndSelection() { if (setCurrentlySelectingRangeEnd) { setCurrentlySelectingRangeEnd('end'); } if (!disableOpenPicker) { openPicker(); } }; var openOnFocus = wrapperVariant === 'desktop'; var startInputProps = useMaskedInput(_objectSpread$2(_objectSpread$2({}, other), {}, { readOnly: readOnly, rawValue: start, onChange: handleStartChange, label: startText, validationError: startValidationError !== null, TextFieldProps: _objectSpread$2(_objectSpread$2({}, TextFieldProps), {}, { ref: startRef, variant: 'outlined', focused: open && currentlySelectingRangeEnd === 'start' }), inputProps: { onClick: !openOnFocus ? openRangeStartSelection : undefined, onFocus: openOnFocus ? openRangeStartSelection : undefined } })); var endInputProps = useMaskedInput(_objectSpread$2(_objectSpread$2({}, other), {}, { readOnly: readOnly, label: endText, rawValue: end, onChange: handleEndChange, validationError: endValidationError !== null, TextFieldProps: _objectSpread$2(_objectSpread$2({}, TextFieldProps), {}, { ref: endRef, variant: 'outlined', focused: open && currentlySelectingRangeEnd === 'end' }), inputProps: { onClick: !openOnFocus ? openRangeEndSelection : undefined, onFocus: openOnFocus ? openRangeEndSelection : undefined } })); return /*#__PURE__*/createElement("div", { onBlur: onBlur, className: classes.root, ref: mergeRefs([containerRef, forwardedRef]) }, renderInput(startInputProps, endInputProps)); }; process.env.NODE_ENV !== "production" ? DateRangePickerInput.propTypes = { acceptRegex: instanceOf(RegExp), getOpenDialogAriaText: func, mask: string, OpenPickerButtonProps: object, openPickerIcon: node, renderInput: func.isRequired, rifmFormatter: func } : void 0; function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var useStyles$3 = makeStyles(function (theme) { return { root: { display: 'flex', flexDirection: 'row' }, rangeCalendarContainer: { '&:not(:last-child)': { borderRight: "2px solid ".concat(theme.palette.divider) } }, calendar: { minWidth: 312, minHeight: 288 }, arrowSwitcher: { padding: '16px 16px 8px 16px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' } }; }, { name: 'MuiPickersDesktopDateRangeCalendar' }); function getCalendarsArray(calendars) { switch (calendars) { case 1: return [0]; case 2: return [0, 0]; case 3: return [0, 0, 0]; // this will not work in IE11, but allows to support any amount of calendars default: return new Array(calendars).fill(0); } } function DateRangePickerViewDesktop(props) { var date = props.date, _props$calendars = props.calendars, calendars = _props$calendars === void 0 ? 2 : _props$calendars, changeMonth = props.changeMonth, leftArrowButtonProps = props.leftArrowButtonProps, leftArrowButtonText = props.leftArrowButtonText, leftArrowIcon = props.leftArrowIcon, rightArrowButtonProps = props.rightArrowButtonProps, rightArrowButtonText = props.rightArrowButtonText, rightArrowIcon = props.rightArrowIcon, onChange = props.onChange, disableFuture = props.disableFuture, disablePast = props.disablePast, __minDate = props.minDate, __maxDate = props.maxDate, currentlySelectingRangeEnd = props.currentlySelectingRangeEnd, currentMonth = props.currentMonth, _props$renderDay = props.renderDay, _renderDay = _props$renderDay === void 0 ? function (_, dateRangeProps) { return /*#__PURE__*/createElement(DateRangeDay, dateRangeProps); } : _props$renderDay, other = _objectWithoutProperties(props, ["date", "calendars", "changeMonth", "leftArrowButtonProps", "leftArrowButtonText", "leftArrowIcon", "rightArrowButtonProps", "rightArrowButtonText", "rightArrowIcon", "onChange", "disableFuture", "disablePast", "minDate", "maxDate", "currentlySelectingRangeEnd", "currentMonth", "renderDay"]); var utils = useUtils(); var classes = useStyles$3(); var minDate = __minDate || utils.date(defaultMinDate); var maxDate = __maxDate || utils.date(defaultMaxDate); var _React$useState = useState(null), _React$useState2 = _slicedToArray(_React$useState, 2), rangePreviewDay = _React$useState2[0], setRangePreviewDay = _React$useState2[1]; var isNextMonthDisabled = useNextMonthDisabled(currentMonth, { disableFuture: disableFuture, maxDate: maxDate }); var isPreviousMonthDisabled = usePreviousMonthDisabled(currentMonth, { disablePast: disablePast, minDate: minDate }); var previewingRange = calculateRangePreview({ utils: utils, range: date, newDate: rangePreviewDay, currentlySelectingRangeEnd: currentlySelectingRangeEnd }); var handleDayChange = useCallback(function (day) { setRangePreviewDay(null); onChange(day); }, [onChange]); var handlePreviewDayChange = function handlePreviewDayChange(newPreviewRequest) { var _date = _slicedToArray(date, 2), start = _date[0], end = _date[1]; var hasRangeSelected = Boolean(start && end); if (hasRangeSelected) { setRangePreviewDay(null); } else if (!isWithinRange(utils, newPreviewRequest, date)) { setRangePreviewDay(newPreviewRequest); } else { setRangePreviewDay(null); } }; var CalendarTransitionProps = useMemo(function () { return { onMouseLeave: function onMouseLeave() { return setRangePreviewDay(null); } }; }, []); var selectNextMonth = useCallback(function () { changeMonth(utils.getNextMonth(currentMonth)); }, [changeMonth, currentMonth, utils]); var selectPreviousMonth = useCallback(function () { changeMonth(utils.getPreviousMonth(currentMonth)); }, [changeMonth, currentMonth, utils]); return /*#__PURE__*/createElement("div", { className: classes.root }, getCalendarsArray(calendars).map(function (_, index) { var monthOnIteration = utils.setMonth(currentMonth, utils.getMonth(currentMonth) + index); return /*#__PURE__*/createElement("div", { key: index, className: classes.rangeCalendarContainer }, /*#__PURE__*/createElement(ArrowSwitcher, { className: classes.arrowSwitcher, onLeftClick: selectPreviousMonth, onRightClick: selectNextMonth, isLeftHidden: index !== 0, isRightHidden: index !== calendars - 1, isLeftDisabled: isPreviousMonthDisabled, isRightDisabled: isNextMonthDisabled, leftArrowButtonProps: leftArrowButtonProps, leftArrowButtonText: leftArrowButtonText, leftArrowIcon: leftArrowIcon, rightArrowButtonProps: rightArrowButtonProps, rightArrowButtonText: rightArrowButtonText, rightArrowIcon: rightArrowIcon, text: utils.format(monthOnIteration, 'monthAndYear') }), /*#__PURE__*/createElement(Calendar, _extends({}, other, { key: index, date: date, className: classes.calendar, onChange: handleDayChange, currentMonth: monthOnIteration, TransitionProps: CalendarTransitionProps, renderDay: function renderDay(day, __, DayProps) { return _renderDay(day, _objectSpread$3({ isPreviewing: isWithinRange(utils, day, previewingRange), isStartOfPreviewing: isStartOfRange(utils, day, previewingRange), isEndOfPreviewing: isEndOfRange(utils, day, previewingRange), isHighlighting: isWithinRange(utils, day, date), isStartOfHighlighting: isStartOfRange(utils, day, date), isEndOfHighlighting: isEndOfRange(utils, day, date), onMouseEnter: function onMouseEnter() { return handlePreviewDayChange(day); } }, DayProps)); } }))); })); } function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function DateRangePickerView(props) { var _props$calendars = props.calendars, calendars = _props$calendars === void 0 ? 2 : _props$calendars, className = props.className, currentlySelectingRangeEnd = props.currentlySelectingRangeEnd, date = props.date, DateInputProps = props.DateInputProps, _props$disableAutoMon = props.disableAutoMonthSwitching, disableAutoMonthSwitching = _props$disableAutoMon === void 0 ? false : _props$disableAutoMon, disableFuture = props.disableFuture, disableHighlightToday = props.disableHighlightToday, disablePast = props.disablePast, endText = props.endText, isMobileKeyboardViewOpen = props.isMobileKeyboardViewOpen, _props$maxDate = props.maxDate, unparsedMaxDate = _props$maxDate === void 0 ? defaultMaxDate : _props$maxDate, _props$minDate = props.minDate, unparsedMinDate = _props$minDate === void 0 ? defaultMinDate : _props$minDate, onDateChange = props.onDateChange, onMonthChange = props.onMonthChange, open = props.open, _props$reduceAnimatio = props.reduceAnimations, reduceAnimations = _props$reduceAnimatio === void 0 ? defaultReduceAnimations : _props$reduceAnimatio, setCurrentlySelectingRangeEnd = props.setCurrentlySelectingRangeEnd, shouldDisableDate = props.shouldDisableDate, showToolbar = props.showToolbar, startText = props.startText, toggleMobileKeyboardView = props.toggleMobileKeyboardView, toolbarFormat = props.toolbarFormat, toolbarTitle = props.toolbarTitle, other = _objectWithoutProperties(props, ["calendars", "className", "currentlySelectingRangeEnd", "date", "DateInputProps", "disableAutoMonthSwitching", "disableFuture", "disableHighlightToday", "disablePast", "endText", "isMobileKeyboardViewOpen", "maxDate", "minDate", "onDateChange", "onMonthChange", "open", "reduceAnimations", "setCurrentlySelectingRangeEnd", "shouldDisableDate", "showToolbar", "startText", "toggleMobileKeyboardView", "toolbarFormat", "toolbarTitle"]); var now = useNow(); var utils = useUtils(); var wrapperVariant = useContext(WrapperVariantContext); var minDate = useParsedDate(unparsedMinDate); var maxDate = useParsedDate(unparsedMaxDate); var _date = _slicedToArray(date, 2), start = _date[0], end = _date[1]; var _useCalendarState = useCalendarState({ date: start || end || now, minDate: minDate, maxDate: maxDate, reduceAnimations: reduceAnimations, disablePast: disablePast, disableFuture: disableFuture, onMonthChange: onMonthChange, shouldDisableDate: shouldDisableDate, disableSwitchToMonthOnDayFocus: true }), changeMonth = _useCalendarState.changeMonth, calendarState = _useCalendarState.calendarState, isDateDisabled = _useCalendarState.isDateDisabled, onMonthSwitchingAnimationEnd = _useCalendarState.onMonthSwitchingAnimationEnd, changeFocusedDay = _useCalendarState.changeFocusedDay; var toShowToolbar = showToolbar !== null && showToolbar !== void 0 ? showToolbar : wrapperVariant !== 'desktop'; var scrollToDayIfNeeded = function scrollToDayIfNeeded(day) { if (!day || !utils.isValid(day) || isDateDisabled(day)) { return; } var currentlySelectedDate = currentlySelectingRangeEnd === 'start' ? start : end; if (currentlySelectedDate === null) { // do not scroll if one of ages is not selected return; } var displayingMonthRange = wrapperVariant === 'mobile' ? 0 : calendars - 1; var currentMonthNumber = utils.getMonth(calendarState.currentMonth); var requestedMonthNumber = utils.getMonth(day); if (!utils.isSameYear(calendarState.currentMonth, day) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) { var newMonth = currentlySelectingRangeEnd === 'start' ? currentlySelectedDate : // If need to focus end, scroll to the state when "end" is displaying in the last calendar utils.addMonths(currentlySelectedDate, -displayingMonthRange); changeMonth(newMonth); } }; useEffect(function () { if (disableAutoMonthSwitching || !open) { return; } scrollToDayIfNeeded(currentlySelectingRangeEnd === 'start' ? start : end); }, [currentlySelectingRangeEnd, date]); // eslint-disable-line var handleChange = useCallback(function (newDate) { var _calculateRangeChange = calculateRangeChange({ newDate: newDate, utils: utils, range: date, currentlySelectingRangeEnd: currentlySelectingRangeEnd }), nextSelection = _calculateRangeChange.nextSelection, newRange = _calculateRangeChange.newRange; setCurrentlySelectingRangeEnd(nextSelection); if (currentlySelectingRangeEnd === 'start') { newRange[1] = null; } var isFullRangeSelected = currentlySelectingRangeEnd === 'end' && isRangeValid(utils, newRange); onDateChange(newRange, wrapperVariant, isFullRangeSelected ? 'finish' : 'partial'); }, [currentlySelectingRangeEnd, date, onDateChange, setCurrentlySelectingRangeEnd, utils, wrapperVariant]); var renderView = function renderView() { var sharedCalendarProps = _objectSpread$4(_objectSpread$4({ date: date, isDateDisabled: isDateDisabled, changeFocusedDay: changeFocusedDay, onChange: handleChange, reduceAnimations: reduceAnimations, disableHighlightToday: disableHighlightToday, onMonthSwitchingAnimationEnd: onMonthSwitchingAnimationEnd, changeMonth: changeMonth, currentlySelectingRangeEnd: currentlySelectingRangeEnd, disableFuture: disableFuture, disablePast: disablePast, minDate: minDate, maxDate: maxDate }, calendarState), other); switch (wrapperVariant) { case 'desktop': { return /*#__PURE__*/createElement(DateRangePickerViewDesktop, _extends({ calendars: calendars }, sharedCalendarProps)); } default: { return /*#__PURE__*/createElement(DateRangePickerViewMobile, sharedCalendarProps); } } }; return /*#__PURE__*/createElement("div", { className: className }, toShowToolbar && /*#__PURE__*/createElement(DateRangePickerToolbar, { date: date, isMobileKeyboardViewOpen: isMobileKeyboardViewOpen, toggleMobileKeyboardView: toggleMobileKeyboardView, currentlySelectingRangeEnd: currentlySelectingRangeEnd, setCurrentlySelectingRangeEnd: setCurrentlySelectingRangeEnd, startText: startText, endText: endText, toolbarTitle: toolbarTitle, toolbarFormat: toolbarFormat }), isMobileKeyboardViewOpen ? /*#__PURE__*/createElement(MobileKeyboardInputView, null, /*#__PURE__*/createElement(DateRangePickerInput, _extends({ disableOpenPicker: true, ignoreInvalidInputs: true }, DateInputProps))) : renderView()); } process.env.NODE_ENV !== "production" ? DateRangePickerView.propTypes = { calendars: oneOf([1, 2, 3]), disableAutoMonthSwitching: bool } : void 0; var DateRangeDelimiter = withDefaultProps({ name: 'MuiPickersDateRangeDelimiter' }, styled(Typography)({ margin: '0 16px' })); function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var useDateRangeValidation = makeValidationHook(validateDateRange, { defaultValidationError: [null, null], isSameError: function isSameError(a, b) { return a[1] === b[1] && a[0] === b[0]; } }); function makeRangePicker(name, Wrapper) { var WrapperComponent = makeWrapperComponent(Wrapper, { KeyboardDateInputComponent: DateRangePickerInput, PureDateInputComponent: DateRangePickerInput }); var rangePickerValueManager = { emptyValue: [null, null], parseInput: parseRangeInputValue, areValuesEqual: function areValuesEqual(utils, a, b) { return utils.isEqual(a[0], b[0]) && utils.isEqual(a[1], b[1]); } }; function RangePickerWithStateAndWrapper(_ref) { var calendars = _ref.calendars, value = _ref.value, onChange = _ref.onChange, _ref$mask = _ref.mask, mask = _ref$mask === void 0 ? '__/__/____' : _ref$mask, _ref$startText = _ref.startText, startText = _ref$startText === void 0 ? 'Start' : _ref$startText, _ref$endText = _ref.endText, endText = _ref$endText === void 0 ? 'End' : _ref$endText, passedInputFormat = _ref.inputFormat, _ref$minDate = _ref.minDate, __minDate = _ref$minDate === void 0 ? defaultMinDate : _ref$minDate, _ref$maxDate = _ref.maxDate, __maxDate = _ref$maxDate === void 0 ? defaultMaxDate : _ref$maxDate, other = _objectWithoutProperties(_ref, ["calendars", "value", "onChange", "mask", "startText", "endText", "inputFormat", "minDate", "maxDate"]); var utils = useUtils(); var minDate = useParsedDate(__minDate); var maxDate = useParsedDate(__maxDate); var _React$useState = useState('start'), _React$useState2 = _slicedToArray(_React$useState, 2), currentlySelectingRangeEnd = _React$useState2[0], setCurrentlySelectingRangeEnd = _React$useState2[1]; var pickerStateProps = _objectSpread$5(_objectSpread$5({}, other), {}, { value: value, onChange: onChange, inputFormat: passedInputFormat || utils.formats.keyboardDate }); var restProps = _objectSpread$5(_objectSpread$5({}, other), {}, { minDate: minDate, maxDate: maxDate }); var _usePickerState = usePickerState(pickerStateProps, rangePickerValueManager), pickerProps = _usePickerState.pickerProps, inputProps = _usePickerState.inputProps, wrapperProps = _usePickerState.wrapperProps; var validationError = useDateRangeValidation(value, restProps); var DateInputProps = _objectSpread$5(_objectSpread$5(_objectSpread$5({}, inputProps), restProps), {}, { currentlySelectingRangeEnd: currentlySelectingRangeEnd, setCurrentlySelectingRangeEnd: setCurrentlySelectingRangeEnd, startText: startText, endText: endText, mask: mask, validationError: validationError }); return /*#__PURE__*/createElement(WrapperComponent, _extends({ wrapperProps: wrapperProps, DateInputProps: DateInputProps }, restProps), /*#__PURE__*/createElement(DateRangePickerView, _extends({ open: wrapperProps.open, DateInputProps: DateInputProps, calendars: calendars, currentlySelectingRangeEnd: currentlySelectingRangeEnd, setCurrentlySelectingRangeEnd: setCurrentlySelectingRangeEnd, startText: startText, endText: endText }, pickerProps, restProps))); } process.env.NODE_ENV !== "production" ? RangePickerWithStateAndWrapper.propTypes = { value: arrayOf(date).isRequired, onChange: func.isRequired, startText: node, endText: node } : void 0; var FinalPickerComponent = withDefaultProps({ name: name }, withDateAdapterProp(RangePickerWithStateAndWrapper)); // @ts-ignore @see lib/src/Picker/makePickerWithState.tsx:95 return forwardRef(function (props, ref) { return /*#__PURE__*/createElement(FinalPickerComponent, _extends({}, props, { forwardedRef: ref })); }); } var DateRangePicker = makeRangePicker('MuiPickersDateRangePicker', ResponsiveTooltipWrapper); var DesktopDateRangePicker = makeRangePicker('MuiDesktopDateRangePicker', DesktopTooltipWrapper); var MobileDateRangePicker = makeRangePicker('MuiMobileDateRangePicker', MobileWrapper); var StaticDateRangePicker = makeRangePicker('MuiStaticDateRangePicker', StaticWrapper); export { DateRangeDelimiter, DateRangePicker, DateRangePickerToolbar, DesktopDateRangePicker, MobileDateRangePicker, StaticDateRangePicker, makeRangePicker, useDateRangeValidation }; //# sourceMappingURL=index.js.map