UNPKG

@material-ui/lab

Version:

Material-UI Lab - Incubator for Material-UI React components.

170 lines (157 loc) 6.08 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; import * as React from 'react'; import { withStyles, createStyles } from '@material-ui/core/styles'; import { useUtils } from '../internal/pickers/hooks/useUtils'; import { calculateRangePreview } from './date-range-manager'; import PickersCalendar from '../DayPicker/PickersCalendar'; import DateRangeDay from '../DateRangePickerDay'; import { defaultMinDate, defaultMaxDate } from '../internal/pickers/constants/prop-types'; import ArrowSwitcher from '../internal/pickers/PickersArrowSwitcher'; import { usePreviousMonthDisabled, useNextMonthDisabled } from '../internal/pickers/hooks/date-helpers-hooks'; import { isWithinRange, isStartOfRange, isEndOfRange } from '../internal/pickers/date-utils'; import { doNothing } from '../internal/pickers/utils'; export const styles = theme => createStyles({ root: { display: 'flex', flexDirection: 'row' }, rangeCalendarContainer: { '&:not(:last-child)': { borderRight: `2px solid ${theme.palette.divider}` } }, calendar: { minWidth: 312, minHeight: 288 }, arrowSwitcher: { padding: '16px 16px 8px 16px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' } }); 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); } } /** * @ignore - internal component. */ function DateRangePickerViewDesktop(props) { const { date, classes, calendars = 2, changeMonth, leftArrowButtonProps, leftArrowButtonText = 'previous month', leftArrowIcon, rightArrowButtonProps, rightArrowButtonText = 'next month', rightArrowIcon, onChange, disableFuture, disablePast, // eslint-disable-next-line @typescript-eslint/naming-convention minDate: __minDate, // eslint-disable-next-line @typescript-eslint/naming-convention maxDate: __maxDate, currentlySelectingRangeEnd, currentMonth, renderDay = (_, dateRangeProps) => /*#__PURE__*/React.createElement(DateRangeDay, dateRangeProps) } = props, other = _objectWithoutPropertiesLoose(props, ["date", "classes", "calendars", "changeMonth", "leftArrowButtonProps", "leftArrowButtonText", "leftArrowIcon", "rightArrowButtonProps", "rightArrowButtonText", "rightArrowIcon", "onChange", "disableFuture", "disablePast", "minDate", "maxDate", "currentlySelectingRangeEnd", "currentMonth", "renderDay"]); const utils = useUtils(); const minDate = __minDate || utils.date(defaultMinDate); const maxDate = __maxDate || utils.date(defaultMaxDate); const [rangePreviewDay, setRangePreviewDay] = React.useState(null); const isNextMonthDisabled = useNextMonthDisabled(currentMonth, { disableFuture, maxDate }); const isPreviousMonthDisabled = usePreviousMonthDisabled(currentMonth, { disablePast, minDate }); const previewingRange = calculateRangePreview({ utils, range: date, newDate: rangePreviewDay, currentlySelectingRangeEnd }); const handleDayChange = React.useCallback(day => { setRangePreviewDay(null); onChange(day); }, [onChange]); const handlePreviewDayChange = newPreviewRequest => { if (!isWithinRange(utils, newPreviewRequest, date)) { setRangePreviewDay(newPreviewRequest); } else { setRangePreviewDay(null); } }; const CalendarTransitionProps = React.useMemo(() => ({ onMouseLeave: () => setRangePreviewDay(null) }), []); const selectNextMonth = React.useCallback(() => { changeMonth(utils.getNextMonth(currentMonth)); }, [changeMonth, currentMonth, utils]); const selectPreviousMonth = React.useCallback(() => { changeMonth(utils.getPreviousMonth(currentMonth)); }, [changeMonth, currentMonth, utils]); return /*#__PURE__*/React.createElement("div", { className: classes.root }, getCalendarsArray(calendars).map((_, index) => { const monthOnIteration = utils.setMonth(currentMonth, utils.getMonth(currentMonth) + index); return /*#__PURE__*/React.createElement("div", { key: index, className: classes.rangeCalendarContainer }, /*#__PURE__*/React.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__*/React.createElement(PickersCalendar, _extends({}, other, { key: index, date: date, onFocusedDayChange: doNothing, className: classes.calendar, onChange: handleDayChange, currentMonth: monthOnIteration, TransitionProps: CalendarTransitionProps, renderDay: (day, __, DayProps) => renderDay(day, _extends({ 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: () => handlePreviewDayChange(day) }, DayProps)) }))); })); } export default withStyles(styles, { name: 'MuiPickersDesktopDateRangeCalendar' })(DateRangePickerViewDesktop);