UNPKG

@material-ui/pickers

Version:

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

432 lines (399 loc) 15.7 kB
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import { useState, useCallback, forwardRef, createElement, useContext, useRef, useEffect, useMemo } from 'react'; import { oneOfType, object, string, number, instanceOf, oneOf } from 'prop-types'; import { u as useUtils } from './useUtils-cfb96ac9.js'; import clsx from 'clsx'; import _extends from '@babel/runtime/helpers/esm/extends'; import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties'; import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import { a as arrayIncludes, V as VariantContext, u as useIsomorphicEffect, b as VIEW_HEIGHT, D as DIALOG_WIDTH, c as DIALOG_WIDTH_WIDER } from './Wrapper-241966d7.js'; import { a as Calendar } from './Calendar-11ae61f6.js'; import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray'; import { ClockView } from './ClockView.js'; 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(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var date = oneOfType([object, string, number, instanceOf(Date)]); var datePickerView = oneOf(['year', 'month', 'day']); /* eslint-disable @typescript-eslint/no-object-literal-type-assertion */ var timePickerDefaultProps = { ampm: true, invalidDateMessage: 'Invalid Time Format' }; var datePickerDefaultProps = { minDate: new Date('1900-01-01'), maxDate: new Date('2100-01-01'), invalidDateMessage: 'Invalid Date Format', minDateMessage: 'Date should not be before minimal date', maxDateMessage: 'Date should not be after maximal date', allowKeyboardControl: true }; var dateTimePickerDefaultProps = _objectSpread({}, timePickerDefaultProps, {}, datePickerDefaultProps, { showTabs: true }); function useViews(views, openTo, onChange) { var _React$useState = useState(openTo && arrayIncludes(views, openTo) ? openTo : views[0]), _React$useState2 = _slicedToArray(_React$useState, 2), openView = _React$useState2[0], setOpenView = _React$useState2[1]; var handleChangeAndOpenNext = useCallback(function (date, isFinish) { var nextViewToOpen = views[views.indexOf(openView) + 1]; if (isFinish && nextViewToOpen) { // do not close picker if needs to show next view onChange(date, false); setOpenView(nextViewToOpen); return; } onChange(date, Boolean(isFinish)); }, [onChange, openView, views]); return { handleChangeAndOpenNext: handleChangeAndOpenNext, openView: openView, setOpenView: setOpenView }; } var useStyles = makeStyles(function (theme) { return { root: { height: 40, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', outline: 'none', '&:focus': { color: theme.palette.primary.main, fontWeight: theme.typography.fontWeightMedium } }, yearSelected: { margin: '10px 0', fontWeight: theme.typography.fontWeightMedium }, yearDisabled: { pointerEvents: 'none', color: theme.palette.text.hint } }; }, { name: 'MuiPickersYear' }); var Year = function Year(_ref) { var onSelect = _ref.onSelect, forwardedRef = _ref.forwardedRef, value = _ref.value, selected = _ref.selected, disabled = _ref.disabled, children = _ref.children, other = _objectWithoutProperties(_ref, ["onSelect", "forwardedRef", "value", "selected", "disabled", "children"]); var classes = useStyles(); var handleClick = useCallback(function () { return onSelect(value); }, [onSelect, value]); return createElement(Typography, _extends({ role: "button", component: "div", tabIndex: disabled ? -1 : 0, onClick: handleClick, onKeyPress: handleClick, color: selected ? 'primary' : undefined, variant: selected ? 'h5' : 'subtitle1', children: children, ref: forwardedRef, className: clsx(classes.root, selected && classes.yearSelected, disabled && classes.yearDisabled) }, other)); }; Year.displayName = 'Year'; var Year$1 = forwardRef(function (props, ref) { return createElement(Year, _extends({}, props, { forwardedRef: ref })); }); var useStyles$1 = makeStyles({ container: { height: 300, overflowY: 'auto' } }, { name: 'MuiPickersYearSelection' }); var YearSelection = function YearSelection(_ref) { var date = _ref.date, onChange = _ref.onChange, onYearChange = _ref.onYearChange, minDate = _ref.minDate, maxDate = _ref.maxDate, disablePast = _ref.disablePast, disableFuture = _ref.disableFuture, animateYearScrolling = _ref.animateYearScrolling; var utils = useUtils(); var classes = useStyles$1(); var currentVariant = useContext(VariantContext); var selectedYearRef = useRef(null); useEffect(function () { if (selectedYearRef.current && selectedYearRef.current.scrollIntoView) { try { selectedYearRef.current.scrollIntoView({ block: currentVariant === 'static' ? 'nearest' : 'center', behavior: animateYearScrolling ? 'smooth' : 'auto' }); } catch (e) { // call without arguments in case when scrollIntoView works improperly (e.g. Firefox 52-57) selectedYearRef.current.scrollIntoView(); } } }, []); // eslint-disable-line var currentYear = utils.getYear(date); var onYearSelect = useCallback(function (year) { var newDate = utils.setYear(date, year); if (onYearChange) { onYearChange(newDate); } onChange(newDate, true); }, [date, onChange, onYearChange, utils]); return createElement("div", { className: classes.container }, utils.getYearRange(minDate, maxDate).map(function (year) { var yearNumber = utils.getYear(year); var selected = yearNumber === currentYear; return createElement(Year$1, { key: utils.getYearText(year), selected: selected, value: yearNumber, onSelect: onYearSelect, ref: selected ? selectedYearRef : undefined, disabled: Boolean(disablePast && utils.isBeforeYear(year, utils.date()) || disableFuture && utils.isAfterYear(year, utils.date())) }, utils.getYearText(year)); })); }; var useStyles$2 = makeStyles(function (theme) { return { root: { flex: '1 0 33.33%', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', outline: 'none', height: 75, transition: theme.transitions.create('font-size', { duration: '100ms' }), '&:focus': { color: theme.palette.primary.main, fontWeight: theme.typography.fontWeightMedium } }, monthSelected: { color: theme.palette.primary.main, fontWeight: theme.typography.fontWeightMedium }, monthDisabled: { pointerEvents: 'none', color: theme.palette.text.hint } }; }, { name: 'MuiPickersMonth' }); var Month = function Month(_ref) { var selected = _ref.selected, onSelect = _ref.onSelect, disabled = _ref.disabled, value = _ref.value, children = _ref.children, other = _objectWithoutProperties(_ref, ["selected", "onSelect", "disabled", "value", "children"]); var classes = useStyles$2(); var handleSelection = useCallback(function () { onSelect(value); }, [onSelect, value]); return createElement(Typography, _extends({ role: "button", component: "div", className: clsx(classes.root, selected && classes.monthSelected, disabled && classes.monthDisabled), tabIndex: disabled ? -1 : 0, onClick: handleSelection, onKeyPress: handleSelection, color: selected ? 'primary' : undefined, variant: selected ? 'h5' : 'subtitle1', children: children }, other)); }; Month.displayName = 'Month'; var useStyles$3 = makeStyles({ container: { width: 310, display: 'flex', flexWrap: 'wrap', alignContent: 'stretch' } }, { name: 'MuiPickersMonthSelection' }); var MonthSelection = function MonthSelection(_ref) { var disablePast = _ref.disablePast, disableFuture = _ref.disableFuture, minDate = _ref.minDate, maxDate = _ref.maxDate, date = _ref.date, onMonthChange = _ref.onMonthChange, onChange = _ref.onChange; var utils = useUtils(); var classes = useStyles$3(); var currentMonth = utils.getMonth(date); var shouldDisableMonth = function shouldDisableMonth(month) { var now = utils.date(); var utilMinDate = utils.date(minDate); var utilMaxDate = utils.date(maxDate); var firstEnabledMonth = utils.startOfMonth(disablePast && utils.isAfter(now, utilMinDate) ? now : utilMinDate); var lastEnabledMonth = utils.startOfMonth(disableFuture && utils.isBefore(now, utilMaxDate) ? now : utilMaxDate); var isBeforeFirstEnabled = utils.isBefore(month, firstEnabledMonth); var isAfterLastEnabled = utils.isAfter(month, lastEnabledMonth); return isBeforeFirstEnabled || isAfterLastEnabled; }; var onMonthSelect = useCallback(function (month) { var newDate = utils.setMonth(date, month); onChange(newDate, true); if (onMonthChange) { onMonthChange(newDate); } }, [date, onChange, onMonthChange, utils]); return createElement("div", { className: classes.container }, utils.getMonthArray(date).map(function (month) { var monthNumber = utils.getMonth(month); var monthText = utils.format(month, 'MMM'); return createElement(Month, { key: monthText, value: monthNumber, selected: monthNumber === currentMonth, onSelect: onMonthSelect, disabled: shouldDisableMonth(month) }, monthText); })); }; var getOrientation = function getOrientation() { if (typeof window === 'undefined') { return 'portrait'; } if (window.screen && window.screen.orientation && window.screen.orientation.angle) { return Math.abs(window.screen.orientation.angle) === 90 ? 'landscape' : 'portrait'; } // Support IOS safari if (window.orientation) { return Math.abs(Number(window.orientation)) === 90 ? 'landscape' : 'portrait'; } return 'portrait'; }; function useIsLandscape(customOrientation) { var _React$useState = useState(getOrientation()), _React$useState2 = _slicedToArray(_React$useState, 2), orientation = _React$useState2[0], setOrientation = _React$useState2[1]; var eventHandler = useCallback(function () { return setOrientation(getOrientation()); }, []); useIsomorphicEffect(function () { window.addEventListener('orientationchange', eventHandler); return function () { return window.removeEventListener('orientationchange', eventHandler); }; }, [eventHandler]); var orientationToUse = customOrientation || orientation; return orientationToUse === 'landscape'; } 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(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var viewsMap = { year: YearSelection, month: MonthSelection, date: Calendar, hours: ClockView, minutes: ClockView, seconds: ClockView }; var useStyles$4 = makeStyles({ container: { display: 'flex', flexDirection: 'column' }, containerLandscape: { flexDirection: 'row' }, pickerView: { overflowX: 'hidden', minHeight: VIEW_HEIGHT, minWidth: DIALOG_WIDTH, maxWidth: DIALOG_WIDTH_WIDER, display: 'flex', flexDirection: 'column', justifyContent: 'center' }, pickerViewLandscape: { padding: '0 8px' } }, { name: 'MuiPickersBasePicker' }); var Picker = function Picker(_ref) { var date = _ref.date, views = _ref.views, disableToolbar = _ref.disableToolbar, onChange = _ref.onChange, openTo = _ref.openTo, unparsedMinDate = _ref.minDate, unparsedMaxDate = _ref.maxDate, ToolbarComponent = _ref.ToolbarComponent, orientation = _ref.orientation, rest = _objectWithoutProperties(_ref, ["date", "views", "disableToolbar", "onChange", "openTo", "minDate", "maxDate", "ToolbarComponent", "orientation"]); var utils = useUtils(); var classes = useStyles$4(); var isLandscape = useIsLandscape(orientation); var _useViews = useViews(views, openTo, onChange), openView = _useViews.openView, setOpenView = _useViews.setOpenView, handleChangeAndOpenNext = _useViews.handleChangeAndOpenNext; var minDate = useMemo(function () { return utils.date(unparsedMinDate); }, [unparsedMinDate, utils]); var maxDate = useMemo(function () { return utils.date(unparsedMaxDate); }, [unparsedMaxDate, utils]); return createElement("div", { className: clsx(classes.container, isLandscape && classes.containerLandscape) }, !disableToolbar && createElement(ToolbarComponent, _extends({}, rest, { views: views, isLandscape: isLandscape, date: date, onChange: onChange, setOpenView: setOpenView, openView: openView })), createElement("div", { className: clsx(classes.pickerView, isLandscape && classes.pickerViewLandscape) }, openView === 'year' && createElement(YearSelection, _extends({}, rest, { date: date, onChange: handleChangeAndOpenNext, minDate: minDate, maxDate: maxDate })), openView === 'month' && createElement(MonthSelection, _extends({}, rest, { date: date, onChange: handleChangeAndOpenNext, minDate: minDate, maxDate: maxDate })), openView === 'date' && createElement(Calendar, _extends({}, rest, { date: date, onChange: handleChangeAndOpenNext, minDate: minDate, maxDate: maxDate })), (openView === 'hours' || openView === 'minutes' || openView === 'seconds') && createElement(ClockView, _extends({}, rest, { date: date, type: openView, onHourChange: handleChangeAndOpenNext, onMinutesChange: handleChangeAndOpenNext, onSecondsChange: handleChangeAndOpenNext })))); }; Picker.defaultProps = _objectSpread$1({}, datePickerDefaultProps, { views: Object.keys(viewsMap) }); export { Picker as P, dateTimePickerDefaultProps as a, datePickerDefaultProps as d, timePickerDefaultProps as t }; //# sourceMappingURL=Picker-ccd9ba90.js.map