UNPKG

ph-material-pickers

Version:

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

1,291 lines (1,158 loc) 214 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty')); var _objectWithoutProperties = _interopDefault(require('@babel/runtime/helpers/objectWithoutProperties')); var React = require('react'); var React__default = _interopDefault(React); var PropTypes = require('prop-types'); var _extends = _interopDefault(require('@babel/runtime/helpers/extends')); var clsx = _interopDefault(require('clsx')); var Typography = _interopDefault(require('@material-ui/core/Typography')); var styles$1 = require('@material-ui/core/styles'); var Grid = _interopDefault(require('@material-ui/core/Grid')); var IconButton = _interopDefault(require('@material-ui/core/IconButton')); var Toolbar = _interopDefault(require('@material-ui/core/Toolbar')); var utils = require('@material-ui/core/utils'); var getThemeProps = _interopDefault(require('@material-ui/styles/getThemeProps')); var _slicedToArray = _interopDefault(require('@babel/runtime/helpers/slicedToArray')); var _typeof = _interopDefault(require('@babel/runtime/helpers/typeof')); var useMediaQuery = _interopDefault(require('@material-ui/core/useMediaQuery')); var Button = _interopDefault(require('@material-ui/core/Button')); var DialogActions = _interopDefault(require('@material-ui/core/DialogActions')); var DialogContent = _interopDefault(require('@material-ui/core/DialogContent')); var Dialog = _interopDefault(require('@material-ui/core/Dialog')); var InputAdornment = _interopDefault(require('@material-ui/core/InputAdornment')); var rifm = require('rifm'); var Grow = _interopDefault(require('@material-ui/core/Grow')); var Paper = _interopDefault(require('@material-ui/core/Paper')); var Popper = _interopDefault(require('@material-ui/core/Popper')); var TrapFocus = _interopDefault(require('@material-ui/core/Unstable_TrapFocus')); var _classCallCheck = _interopDefault(require('@babel/runtime/helpers/classCallCheck')); var _createClass = _interopDefault(require('@babel/runtime/helpers/createClass')); var _inherits = _interopDefault(require('@babel/runtime/helpers/inherits')); var _possibleConstructorReturn = _interopDefault(require('@babel/runtime/helpers/possibleConstructorReturn')); var _getPrototypeOf = _interopDefault(require('@babel/runtime/helpers/getPrototypeOf')); var ButtonBase = _interopDefault(require('@material-ui/core/ButtonBase')); var reactTransitionGroup = require('react-transition-group'); var Tab = _interopDefault(require('@material-ui/core/Tab')); var Tabs = _interopDefault(require('@material-ui/core/Tabs')); var MuiPickersAdapterContext = React.createContext(null); var LocalizationProvider = function LocalizationProvider(props) { var children = props.children, Utils = props.dateAdapter, dateFormats = props.dateFormats, dateLibInstance = props.dateLibInstance, locale = props.locale; var utils = React.useMemo(function () { return new Utils({ locale: locale, formats: dateFormats, instance: dateLibInstance }); }, [Utils, locale, dateFormats, dateLibInstance]); return /*#__PURE__*/React.createElement(MuiPickersAdapterContext.Provider, { value: utils }, children); }; process.env.NODE_ENV !== "production" ? LocalizationProvider.propTypes = { dateAdapter: PropTypes.func.isRequired, locale: PropTypes.oneOfType([PropTypes.object, PropTypes.string]), /** * Your component tree. */ children: PropTypes.node } : void 0; // TODO uncomment when syntax will be allowed by next babel function checkUtils(utils) /* :asserts utils is MuiPickersAdapter */ { if (!utils) { throw new Error('Can not find utils in context. It looks like you forgot to wrap your component in LocalizationProvider, or pass dateAdapter prop directly.'); } } function useUtils() { var utils = React.useContext(MuiPickersAdapterContext); checkUtils(utils); return utils; } function useNow() { var utils = useUtils(); var now = React.useRef(utils.date()); return now.current; } /** * @ignore - internal component. */ var PenIcon = utils.createSvgIcon( /*#__PURE__*/React.createElement("path", { d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" }), 'Pen'); /** * @ignore - internal component. */ var CalendarIcon = utils.createSvgIcon( /*#__PURE__*/React.createElement("path", { d: "M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z" }), 'Calendar'); var useStyles = styles$1.makeStyles(function (theme) { var toolbarBackground = theme.palette.type === 'light' ? theme.palette.primary.main : theme.palette.background["default"]; return { root: { display: 'flex', flexDirection: 'column', alignItems: 'flex-start', justifyContent: 'space-between', paddingTop: 16, paddingBottom: 16, backgroundColor: toolbarBackground, color: theme.palette.getContrastText(toolbarBackground) }, toolbarLandscape: { height: 'auto', maxWidth: 160, padding: 16, justifyContent: 'flex-start', flexWrap: 'wrap' }, dateTitleContainer: { flex: 1 } }; }, { name: 'MuiPickersToolbar' }); function defaultGetKeyboardInputSwitchingButtonText(isKeyboardInputOpen) { return isKeyboardInputOpen ? 'text input view is open, go to calendar view' : 'calendar view is open, go to text input view'; } var PickerToolbar = function PickerToolbar(_ref) { var children = _ref.children, className = _ref.className, _ref$getMobileKeyboar = _ref.getMobileKeyboardInputViewButtonText, getMobileKeyboardInputViewButtonText = _ref$getMobileKeyboar === void 0 ? defaultGetKeyboardInputSwitchingButtonText : _ref$getMobileKeyboar, isLandscape = _ref.isLandscape, isMobileKeyboardViewOpen = _ref.isMobileKeyboardViewOpen, _ref$landscapeDirecti = _ref.landscapeDirection, landscapeDirection = _ref$landscapeDirecti === void 0 ? 'column' : _ref$landscapeDirecti, penIconClassName = _ref.penIconClassName, toggleMobileKeyboardView = _ref.toggleMobileKeyboardView, toolbarTitle = _ref.toolbarTitle; var classes = useStyles(); return /*#__PURE__*/React.createElement(Toolbar, { "data-mui-test": "picker-toolbar", className: clsx(classes.root, className, isLandscape && classes.toolbarLandscape) }, /*#__PURE__*/React.createElement(Typography, { "data-mui-test": "picker-toolbar-title", color: "inherit", variant: "overline" }, toolbarTitle), /*#__PURE__*/React.createElement(Grid, { container: true, justifyContent: "space-between", className: classes.dateTitleContainer, direction: isLandscape ? landscapeDirection : 'row', alignItems: isLandscape ? 'flex-start' : 'flex-end' }, children, /*#__PURE__*/React.createElement(IconButton, { onClick: toggleMobileKeyboardView, className: penIconClassName, color: "inherit", "data-mui-test": "toggle-mobile-keyboard-view", "aria-label": getMobileKeyboardInputViewButtonText(isMobileKeyboardViewOpen) }, isMobileKeyboardViewOpen ? /*#__PURE__*/React.createElement(CalendarIcon, { color: "inherit" }) : /*#__PURE__*/React.createElement(PenIcon, { color: "inherit" })))); }; function useDefaultProps(props, _ref) { var name = _ref.name; var theme = styles$1.useTheme(); return getThemeProps({ props: props, theme: theme, name: name }); } function withDefaultProps(componentConfig, Component) { var componentName = componentConfig.name.replace('Mui', ''); var WithDefaultProps = function WithDefaultProps(props) { Component.displayName = componentName; var propsWithDefault = useDefaultProps(props, componentConfig); return /*#__PURE__*/React.createElement(Component, propsWithDefault); }; WithDefaultProps.displayName = "WithDefaultProps(".concat(componentName, ")"); return WithDefaultProps; } /* Use it instead of .includes method for IE support */ function arrayIncludes(array, itemOrItems) { if (Array.isArray(itemOrItems)) { return itemOrItems.every(function (item) { return array.indexOf(item) !== -1; }); } return array.indexOf(itemOrItems) !== -1; } var onSpaceOrEnter = function onSpaceOrEnter(innerFn, onFocus) { return function (event) { if (event.key === 'Enter' || event.key === ' ') { innerFn(); // prevent any side effects event.preventDefault(); event.stopPropagation(); } if (onFocus) { onFocus(event); } }; }; /* Quick untyped helper to improve function composition readability */ var pipe = function pipe() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } return fns.reduceRight(function (prevFn, nextFn) { return function () { return nextFn(prevFn.apply(void 0, arguments)); }; }, function (value) { return value; }); }; var executeInTheNextEventLoopTick = function executeInTheNextEventLoopTick(fn) { setTimeout(fn, 0); }; function createDelegatedEventHandler(fn, onEvent) { return function (event) { fn(event); if (onEvent) { onEvent(event); } }; } function mergeRefs(refs) { return function (value) { refs.forEach(function (ref) { if (typeof ref === 'function') { ref(value); } else if (_typeof(ref) === 'object' && ref != null) { // @ts-ignore .current is not a readonly, hold on ts ref.current = value; } }); }; } var findClosestEnabledDate = function findClosestEnabledDate(_ref) { var date = _ref.date, utils = _ref.utils, minDate = _ref.minDate, maxDate = _ref.maxDate, disableFuture = _ref.disableFuture, disablePast = _ref.disablePast, shouldDisableDate = _ref.shouldDisableDate; var today = utils.startOfDay(utils.date()); if (disablePast && utils.isBefore(minDate, today)) { minDate = today; } if (disableFuture && utils.isAfter(maxDate, today)) { maxDate = today; } var forward = date; var backward = date; if (utils.isBefore(date, minDate)) { forward = utils.date(minDate); backward = null; } if (utils.isAfter(date, maxDate)) { if (backward) { backward = utils.date(maxDate); } forward = null; } while (forward || backward) { if (forward && utils.isAfter(forward, maxDate)) { forward = null; } if (backward && utils.isBefore(backward, minDate)) { backward = null; } if (forward) { if (!shouldDisableDate(forward)) { return forward; } forward = utils.addDays(forward, 1); } if (backward) { if (!shouldDisableDate(backward)) { return backward; } backward = utils.addDays(backward, -1); } } // fallback to today if no enabled days return utils.date(); }; var isYearOnlyView = function isYearOnlyView(views) { return views.length === 1 && views[0] === 'year'; }; var isYearAndMonthViews = function isYearAndMonthViews(views) { return views.length === 2 && arrayIncludes(views, 'month') && arrayIncludes(views, 'year'); }; var getFormatAndMaskByViews = function getFormatAndMaskByViews(views, utils) { if (isYearOnlyView(views)) { return { mask: '____', inputFormat: utils.formats.year }; } if (isYearAndMonthViews(views)) { return { disableMaskedInput: true, inputFormat: utils.formats.monthAndYear }; } return { mask: '__/__/____', inputFormat: utils.formats.keyboardDate }; }; function parsePickerInputValue(utils, _ref2) { var value = _ref2.value; var parsedValue = utils.date(value); return utils.isValid(parsedValue) ? parsedValue : null; } function parseRangeInputValue(utils, _ref3) { var _ref3$value = _ref3.value, value = _ref3$value === void 0 ? [null, null] : _ref3$value; return value.map(function (date) { return !utils.isValid(date) || date === null ? null : utils.startOfDay(utils.date(date)); }); } var isRangeValid = function isRangeValid(utils, range) { return Boolean(range && range[0] && range[1] && utils.isBefore(range[0], range[1])); }; var isWithinRange = function isWithinRange(utils, day, range) { return isRangeValid(utils, range) && utils.isWithinRange(day, range); }; var isStartOfRange = function isStartOfRange(utils, day, range) { return isRangeValid(utils, range) && utils.isSameDay(day, range[0]); }; var isEndOfRange = function isEndOfRange(utils, day, range) { return isRangeValid(utils, range) && utils.isSameDay(day, range[1]); }; var validateDate = function validateDate(utils, value, _ref4) { var minDate = _ref4.minDate, maxDate = _ref4.maxDate, disableFuture = _ref4.disableFuture, shouldDisableDate = _ref4.shouldDisableDate, disablePast = _ref4.disablePast; var now = utils.date(); var date = utils.date(value); if (value === null) { return null; } switch (true) { case !utils.isValid(value): return 'invalidDate'; case Boolean(shouldDisableDate && shouldDisableDate(date)): return 'shouldDisableDate'; case Boolean(disableFuture && utils.isAfterDay(date, now)): return 'disableFuture'; case Boolean(disablePast && utils.isBeforeDay(date, now)): return 'disablePast'; case Boolean(minDate && utils.isBeforeDay(date, minDate)): return 'minDate'; case Boolean(maxDate && utils.isAfterDay(date, maxDate)): return 'maxDate'; default: return null; } }; var validateDateRange = function validateDateRange(utils, value, dateValidationProps) { var _value = _slicedToArray(value, 2), start = _value[0], end = _value[1]; // for partial input if (start === null || end === null) { return [null, null]; } var dateValidations = [validateDate(utils, start, dateValidationProps), validateDate(utils, end, dateValidationProps)]; if (dateValidations[0] || dateValidations[1]) { return dateValidations; } if (!isRangeValid(utils, [utils.date(start), utils.date(end)])) { return ['invalidRange', 'invalidRange']; } return [null, null]; }; var muiPickersComponentConfig = { name: 'MuiPickersDatePickerToolbar' }; var useStyles$1 = styles$1.makeStyles({ root: {}, dateTitleLandscape: { margin: 'auto 16px auto auto' }, penIcon: { position: 'relative', top: 4 } }, muiPickersComponentConfig); var DatePickerToolbar = withDefaultProps(muiPickersComponentConfig, function (_ref) { var date = _ref.date, views = _ref.views, isLandscape = _ref.isLandscape, isMobileKeyboardViewOpen = _ref.isMobileKeyboardViewOpen, toggleMobileKeyboardView = _ref.toggleMobileKeyboardView, toolbarFormat = _ref.toolbarFormat, onChange = _ref.onChange, _ref$toolbarPlacehold = _ref.toolbarPlaceholder, toolbarPlaceholder = _ref$toolbarPlacehold === void 0 ? '––' : _ref$toolbarPlacehold, _ref$toolbarTitle = _ref.toolbarTitle, toolbarTitle = _ref$toolbarTitle === void 0 ? 'SELECT DATE' : _ref$toolbarTitle, other = _objectWithoutProperties(_ref, ["date", "views", "isLandscape", "isMobileKeyboardViewOpen", "toggleMobileKeyboardView", "toolbarFormat", "onChange", "toolbarPlaceholder", "toolbarTitle"]); var utils = useUtils(); var classes = useStyles$1(); var dateText = React.useMemo(function () { if (!date) { return toolbarPlaceholder; } if (toolbarFormat) { return utils.formatByString(date, toolbarFormat); } if (isYearOnlyView(views)) { return utils.format(date, 'year'); } if (isYearAndMonthViews(views)) { return utils.format(date, 'month'); } // Little localization hack (Google is doing the same for android native pickers): // For english localization it is convenient to include weekday into the date "Mon, Jun 1" // For other locales using strings like "June 1", without weekday return /en/.test(utils.getCurrentLocaleCode()) ? utils.format(date, 'normalDateWithWeekday') : utils.format(date, 'normalDate'); }, [date, toolbarFormat, toolbarPlaceholder, utils, views]); return /*#__PURE__*/React.createElement(PickerToolbar, _extends({ className: classes.root, toolbarTitle: toolbarTitle, isMobileKeyboardViewOpen: isMobileKeyboardViewOpen, toggleMobileKeyboardView: toggleMobileKeyboardView, isLandscape: isLandscape, penIconClassName: classes.penIcon }, other), /*#__PURE__*/React.createElement(Typography, { variant: "h4", "data-mui-test": "datepicker-toolbar-date", align: isLandscape ? 'left' : 'center', className: clsx(isLandscape && classes.dateTitleLandscape) }, dateText)); }); var DIALOG_WIDTH = 320; var DIALOG_WIDTH_WIDER = 325; var VIEW_HEIGHT = 358; var DAY_SIZE = 36; var DAY_MARGIN = 2; var IS_TOUCH_DEVICE_MEDIA = '@media (pointer: fine)'; function getTextFieldAriaText(rawValue, utils) { return rawValue && utils.isValid(utils.date(rawValue)) ? "Choose date, selected date is ".concat(utils.format(utils.date(rawValue), 'fullDate')) : 'Choose date'; } var getDisplayDate = function getDisplayDate(utils, value, inputFormat) { var date = utils.date(value); var isEmpty = value === null; if (isEmpty) { return ''; } return utils.isValid(date) ? utils.formatByString(date, inputFormat) : ''; }; function pick12hOr24hFormat(userFormat, ampm, formats) { if (userFormat) { return userFormat; } if (typeof ampm === 'undefined') { return formats.localized; } return ampm ? formats['12h'] : formats['24h']; } var MASK_USER_INPUT_SYMBOL = '_'; var staticDateWith2DigitTokens = new Date('2019-11-21T22:30:00.000'); var staticDateWith1DigitTokens = new Date('2019-01-01T09:00:00.000'); function checkMaskIsValidForCurrentFormat(mask, format, acceptRegex, utils) { var formattedDateWith1Digit = utils.formatByString(utils.date(staticDateWith1DigitTokens), format); var inferredFormatPatternWith1Digits = formattedDateWith1Digit.replace(acceptRegex, MASK_USER_INPUT_SYMBOL); var inferredFormatPatternWith2Digits = utils.formatByString(utils.date(staticDateWith2DigitTokens), format).replace(acceptRegex, '_'); var isMaskValid = inferredFormatPatternWith2Digits === mask && inferredFormatPatternWith1Digits === mask; // @ts-ignore Ignore this warning for luxon because it is appearing mostly always (related to the formats structure of luxon itself) if (!isMaskValid && utils.lib !== 'luxon' && process.env.NODE_ENV !== 'production') { console.warn("The mask \"".concat(mask, "\" you passed is not valid for the format used ").concat(format, ". Falling down to uncontrolled not-masked input.")); } return isMaskValid; } var maskedDateFormatter = function maskedDateFormatter(mask, acceptRegexp) { return function (value) { return value.split('').map(function (_char, i) { acceptRegexp.lastIndex = 0; if (i > mask.length - 1) { return ''; } var maskChar = mask[i]; var nextMaskChar = mask[i + 1]; var acceptedChar = acceptRegexp.test(_char) ? _char : ''; var formattedChar = maskChar === MASK_USER_INPUT_SYMBOL ? acceptedChar : maskChar + acceptedChar; if (i === value.length - 1 && nextMaskChar && nextMaskChar !== MASK_USER_INPUT_SYMBOL) { // when cursor at the end of mask part (e.g. month) prerender next symbol "21" -> "21/" return formattedChar ? formattedChar + nextMaskChar : ''; } return formattedChar; }).join(''); }; }; 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 PureDateInput = function PureDateInput(_ref) { var containerRef = _ref.containerRef, disabled = _ref.disabled, forwardedRef = _ref.forwardedRef, _ref$getOpenDialogAri = _ref.getOpenDialogAriaText, getOpenDialogAriaText = _ref$getOpenDialogAri === void 0 ? getTextFieldAriaText : _ref$getOpenDialogAri, inputFormat = _ref.inputFormat, InputProps = _ref.InputProps, label = _ref.label, onOpen = _ref.openPicker, rawValue = _ref.rawValue, renderInput = _ref.renderInput, _ref$TextFieldProps = _ref.TextFieldProps, TextFieldProps = _ref$TextFieldProps === void 0 ? {} : _ref$TextFieldProps, validationError = _ref.validationError; var utils = useUtils(); var PureDateInputProps = React.useMemo(function () { return _objectSpread(_objectSpread({}, InputProps), {}, { readOnly: true }); }, [InputProps]); var inputValue = getDisplayDate(utils, rawValue, inputFormat); return renderInput(_objectSpread({ label: label, disabled: disabled, ref: containerRef, inputRef: forwardedRef, error: validationError, InputProps: PureDateInputProps, inputProps: { disabled: disabled, 'aria-readonly': true, 'aria-label': getOpenDialogAriaText(rawValue, utils), value: inputValue, onClick: onOpen, onKeyDown: onSpaceOrEnter(onOpen) } }, TextFieldProps)); }; process.env.NODE_ENV !== "production" ? PureDateInput.propTypes = { acceptRegex: PropTypes.instanceOf(RegExp), getOpenDialogAriaText: PropTypes.func, mask: PropTypes.string, OpenPickerButtonProps: PropTypes.object, openPickerIcon: PropTypes.node, renderInput: PropTypes.func.isRequired, rifmFormatter: PropTypes.func } : void 0; // consider getting rid from wrapper variant var WrapperVariantContext = React.createContext(null); var IsStaticVariantContext = React.createContext(false); 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 useStyles$2 = styles$1.makeStyles({ dialogRoot: { minWidth: DIALOG_WIDTH }, dialogRootWider: { minWidth: DIALOG_WIDTH_WIDER }, dialogContainer: { '&:focus > $dialogRoot': { outline: 'auto', '@media (pointer:coarse)': { outline: 0 } } }, dialog: { '&:first-child': { padding: 0 } }, dialogAction: {// requested for overrides }, withAdditionalAction: { // set justifyContent to default value to fix IE11 layout bug // see https://github.com/mui-org/material-ui-pickers/pull/267 justifyContent: 'flex-start', '& > *:first-child': { marginRight: 'auto' } } }, { name: 'MuiPickersModalDialog' }); var PickersModalDialog = function PickersModalDialog(props) { var _props$cancelText = props.cancelText, cancelText = _props$cancelText === void 0 ? 'Cancel' : _props$cancelText, children = props.children, MuiDialogClasses = props.classes, _props$clearable = props.clearable, clearable = _props$clearable === void 0 ? false : _props$clearable, _props$clearText = props.clearText, clearText = _props$clearText === void 0 ? 'Clear' : _props$clearText, _props$okText = props.okText, okText = _props$okText === void 0 ? 'OK' : _props$okText, onAccept = props.onAccept, onClear = props.onClear, onDismiss = props.onDismiss, onSetToday = props.onSetToday, showTabs = props.showTabs, _props$showTodayButto = props.showTodayButton, showTodayButton = _props$showTodayButto === void 0 ? false : _props$showTodayButto, _props$todayText = props.todayText, todayText = _props$todayText === void 0 ? 'Today' : _props$todayText, wider = props.wider, other = _objectWithoutProperties(props, ["cancelText", "children", "classes", "clearable", "clearText", "okText", "onAccept", "onClear", "onDismiss", "onSetToday", "showTabs", "showTodayButton", "todayText", "wider"]); var classes = useStyles$2(); return /*#__PURE__*/React.createElement(Dialog, _extends({ onClose: onDismiss, classes: _objectSpread$1({ container: classes.dialogContainer, paper: clsx(classes.dialogRoot, wider && classes.dialogRootWider) }, MuiDialogClasses) }, other), /*#__PURE__*/React.createElement(DialogContent, { className: classes.dialog }, children), /*#__PURE__*/React.createElement(DialogActions, { className: clsx(classes.dialogAction, (clearable || showTodayButton) && classes.withAdditionalAction) }, clearable && /*#__PURE__*/React.createElement(Button, { "data-mui-test": "clear-action-button", color: "primary", onClick: onClear }, clearText), showTodayButton && /*#__PURE__*/React.createElement(Button, { "data-mui-test": "today-action-button", color: "primary", onClick: onSetToday }, todayText), cancelText && /*#__PURE__*/React.createElement(Button, { color: "primary", onClick: onDismiss }, cancelText), okText && /*#__PURE__*/React.createElement(Button, { color: "primary", onClick: onAccept }, okText))); }; var MobileWrapper = function MobileWrapper(props) { var cancelText = props.cancelText, children = props.children, clearable = props.clearable, clearText = props.clearText, DateInputProps = props.DateInputProps, DialogProps = props.DialogProps, displayStaticWrapperAs = props.displayStaticWrapperAs, KeyboardDateInputComponent = props.KeyboardDateInputComponent, okText = props.okText, onAccept = props.onAccept, onClear = props.onClear, onDismiss = props.onDismiss, onSetToday = props.onSetToday, open = props.open, PopperProps = props.PopperProps, _props$PureDateInputC = props.PureDateInputComponent, PureDateInputComponent = _props$PureDateInputC === void 0 ? PureDateInput : _props$PureDateInputC, showTabs = props.showTabs, showTodayButton = props.showTodayButton, todayText = props.todayText, wider = props.wider, other = _objectWithoutProperties(props, ["cancelText", "children", "clearable", "clearText", "DateInputProps", "DialogProps", "displayStaticWrapperAs", "KeyboardDateInputComponent", "okText", "onAccept", "onClear", "onDismiss", "onSetToday", "open", "PopperProps", "PureDateInputComponent", "showTabs", "showTodayButton", "todayText", "wider"]); return /*#__PURE__*/React.createElement(WrapperVariantContext.Provider, { value: "mobile" }, /*#__PURE__*/React.createElement(PureDateInputComponent, _extends({}, other, DateInputProps)), /*#__PURE__*/React.createElement(PickersModalDialog, _extends({ wider: wider, showTabs: showTabs, open: open, onClear: onClear, onAccept: onAccept, onDismiss: onDismiss, onSetToday: onSetToday, clearText: clearText, todayText: todayText, okText: okText, cancelText: cancelText, clearable: clearable, showTodayButton: showTodayButton, "data-mui-test": "mobile-wrapper-dialog" }, DialogProps), children)); }; process.env.NODE_ENV !== "production" ? MobileWrapper.propTypes = { cancelText: PropTypes.node, clearable: PropTypes.bool, clearText: PropTypes.node, DialogProps: PropTypes.object, okText: PropTypes.node, showTodayButton: PropTypes.bool, todayText: PropTypes.node } : void 0; 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; } function useMaskedInput(_ref) { var _ref$acceptRegex = _ref.acceptRegex, acceptRegex = _ref$acceptRegex === void 0 ? /[\d]/gi : _ref$acceptRegex, disabled = _ref.disabled, disableMaskedInput = _ref.disableMaskedInput, ignoreInvalidInputs = _ref.ignoreInvalidInputs, inputFormat = _ref.inputFormat, inputProps = _ref.inputProps, label = _ref.label, mask = _ref.mask, onChange = _ref.onChange, rawValue = _ref.rawValue, readOnly = _ref.readOnly, rifmFormatter = _ref.rifmFormatter, TextFieldProps = _ref.TextFieldProps, validationError = _ref.validationError; var utils = useUtils(); var isFocusedRef = React.useRef(false); var getInputValue = React.useCallback(function () { return getDisplayDate(utils, rawValue, inputFormat); }, [inputFormat, rawValue, utils]); var formatHelperText = utils.getFormatHelperText(inputFormat); var _React$useState = React.useState(getInputValue()), _React$useState2 = _slicedToArray(_React$useState, 2), innerInputValue = _React$useState2[0], setInnerInputValue = _React$useState2[1]; var shouldUseMaskedInput = React.useMemo(function () { // formatting of dates is a quite slow thing, so do not make useless .format calls if (!mask || disableMaskedInput) { return false; } return checkMaskIsValidForCurrentFormat(mask, inputFormat, acceptRegex, utils); }, [acceptRegex, disableMaskedInput, inputFormat, mask, utils]); var formatter = React.useMemo(function () { return shouldUseMaskedInput && mask ? maskedDateFormatter(mask, acceptRegex) : function (st) { return st; }; }, [acceptRegex, mask, shouldUseMaskedInput]); React.useEffect(function () { // We do not need to update the input value on keystroke // Because library formatters can change inputs from 12/12/2 to 12/12/0002 if ((rawValue === null || utils.isValid(rawValue)) && !isFocusedRef.current) { setInnerInputValue(getInputValue()); } }, [utils, getInputValue, rawValue]); var handleChange = function handleChange(text) { var finalString = text === '' || text === mask ? '' : text; setInnerInputValue(finalString); var date = finalString === null ? null : utils.parse(finalString, inputFormat); if (ignoreInvalidInputs && !utils.isValid(date)) { return; } onChange(date, finalString || undefined); }; var rifmProps = rifm.useRifm({ value: innerInputValue, onChange: handleChange, format: rifmFormatter || formatter }); var inputStateArgs = shouldUseMaskedInput ? rifmProps : { value: innerInputValue, onChange: function onChange(event) { handleChange(event.currentTarget.value); } }; return _objectSpread$2({ label: label, disabled: disabled, error: validationError, helperText: formatHelperText, inputProps: _objectSpread$2(_objectSpread$2(_objectSpread$2({}, inputStateArgs), {}, { disabled: disabled, // make spreading in custom input easier placeholder: formatHelperText, readOnly: readOnly, type: shouldUseMaskedInput ? 'tel' : 'text' }, inputProps), {}, { onFocus: createDelegatedEventHandler(function () { isFocusedRef.current = true; }, inputProps === null || inputProps === void 0 ? void 0 : inputProps.onFocus), onBlur: createDelegatedEventHandler(function () { isFocusedRef.current = false; }, inputProps === null || inputProps === void 0 ? void 0 : inputProps.onBlur) }) }, TextFieldProps); } 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 KeyboardDateInput = function KeyboardDateInput(_ref) { var containerRef = _ref.containerRef, _ref$inputRef = _ref.inputRef, inputRef = _ref$inputRef === void 0 ? null : _ref$inputRef, _ref$forwardedRef = _ref.forwardedRef, forwardedRef = _ref$forwardedRef === void 0 ? null : _ref$forwardedRef, hideOpenPickerButton = _ref.disableOpenPicker, _ref$getOpenDialogAri = _ref.getOpenDialogAriaText, getOpenDialogAriaText = _ref$getOpenDialogAri === void 0 ? getTextFieldAriaText : _ref$getOpenDialogAri, InputAdornmentProps = _ref.InputAdornmentProps, InputProps = _ref.InputProps, onOpen = _ref.openPicker, OpenPickerButtonProps = _ref.OpenPickerButtonProps, _ref$openPickerIcon = _ref.openPickerIcon, openPickerIcon = _ref$openPickerIcon === void 0 ? /*#__PURE__*/React.createElement(CalendarIcon, null) : _ref$openPickerIcon, renderInput = _ref.renderInput, other = _objectWithoutProperties(_ref, ["containerRef", "inputRef", "forwardedRef", "disableOpenPicker", "getOpenDialogAriaText", "InputAdornmentProps", "InputProps", "openPicker", "OpenPickerButtonProps", "openPickerIcon", "renderInput"]); var utils$1 = useUtils(); var inputRefHandle = utils.useForkRef(inputRef, forwardedRef); var textFieldProps = useMaskedInput(other); var adornmentPosition = (InputAdornmentProps === null || InputAdornmentProps === void 0 ? void 0 : InputAdornmentProps.position) || 'end'; return renderInput(_objectSpread$3(_objectSpread$3({ ref: containerRef, inputRef: inputRefHandle }, textFieldProps), {}, { InputProps: _objectSpread$3(_objectSpread$3({}, InputProps), {}, _defineProperty({}, "".concat(adornmentPosition, "Adornment"), hideOpenPickerButton ? undefined : /*#__PURE__*/React.createElement(InputAdornment, _extends({ position: adornmentPosition }, InputAdornmentProps), /*#__PURE__*/React.createElement(IconButton, _extends({ edge: adornmentPosition, "data-mui-test": "open-picker-from-keyboard", disabled: other.disabled, "aria-label": getOpenDialogAriaText(other.rawValue, utils$1) }, OpenPickerButtonProps, { onClick: onOpen }), openPickerIcon)))) })); }; process.env.NODE_ENV !== "production" ? KeyboardDateInput.propTypes = { acceptRegex: PropTypes.instanceOf(RegExp), getOpenDialogAriaText: PropTypes.func, mask: PropTypes.string, OpenPickerButtonProps: PropTypes.object, openPickerIcon: PropTypes.node, renderInput: PropTypes.func.isRequired, rifmFormatter: PropTypes.func } : void 0; var useIsomorphicEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect; function runKeyHandler(event, keyHandlers) { var handler = keyHandlers[event.keyCode]; if (handler) { handler(); // if event was handled prevent other side effects (e.g. page scroll) event.preventDefault(); } } function useGlobalKeyDown(active, keyHandlers) { var keyHandlersRef = React.useRef(keyHandlers); keyHandlersRef.current = keyHandlers; useIsomorphicEffect(function () { if (active) { var handleKeyDown = function handleKeyDown(event) { runKeyHandler(event, keyHandlersRef.current); }; window.addEventListener('keydown', handleKeyDown); return function () { window.removeEventListener('keydown', handleKeyDown); }; } return undefined; }, [active]); } var keycode = { ArrowUp: 38, ArrowDown: 40, ArrowLeft: 37, ArrowRight: 39, Enter: 13, Home: 36, End: 35, PageUp: 33, PageDown: 34, Esc: 27 }; var useStyles$3 = styles$1.makeStyles(function (theme) { return { root: { zIndex: theme.zIndex.modal }, paper: { transformOrigin: 'top center', '&:focus': _defineProperty({}, IS_TOUCH_DEVICE_MEDIA, { outline: 0 }) }, topTransition: { transformOrigin: 'bottom center' } }; }, { name: 'MuiPickersPopper' }); var PickersPopper = function PickersPopper(props) { var anchorEl = props.anchorEl, children = props.children, _props$innerRef = props.innerRef, innerRef = _props$innerRef === void 0 ? null : _props$innerRef, onClose = props.onClose, onOpen = props.onOpen, open = props.open, PopperProps = props.PopperProps, role = props.role, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow : _props$TransitionComp, TrapFocusProps = props.TrapFocusProps; var classes = useStyles$3(); var paperRef = React.useRef(null); var handlePopperRef = utils.useForkRef(paperRef, innerRef); var lastFocusedElementRef = React.useRef(null); var popperOptions = React.useMemo(function () { return { onCreate: onOpen }; }, [onOpen]); useGlobalKeyDown(open, _defineProperty({}, keycode.Esc, onClose)); React.useEffect(function () { if (role === 'tooltip') { return; } if (open) { lastFocusedElementRef.current = document.activeElement; } else if (lastFocusedElementRef.current && lastFocusedElementRef.current instanceof HTMLElement) { lastFocusedElementRef.current.focus(); } }, [open, role]); var handleBlur = function handleBlur() { if (!open) { return; } // document.activeElement is updating on the next tick after `blur` called executeInTheNextEventLoopTick(function () { var _paperRef$current; if ((_paperRef$current = paperRef.current) === null || _paperRef$current === void 0 ? void 0 : _paperRef$current.contains(document.activeElement)) { return; } onClose(); }); }; return /*#__PURE__*/React.createElement(Popper, _extends({ transition: true, role: role, open: open, anchorEl: anchorEl, className: clsx(classes.root, PopperProps === null || PopperProps === void 0 ? void 0 : PopperProps.className), popperOptions: popperOptions }, PopperProps), function (_ref) { var TransitionProps = _ref.TransitionProps, placement = _ref.placement; return /*#__PURE__*/React.createElement(TrapFocus, _extends({ open: open, disableAutoFocus: true, disableEnforceFocus: role === 'tooltip', isEnabled: function isEnabled() { return true; }, getDoc: function getDoc() { var _paperRef$current$own, _paperRef$current2; return (_paperRef$current$own = (_paperRef$current2 = paperRef.current) === null || _paperRef$current2 === void 0 ? void 0 : _paperRef$current2.ownerDocument) !== null && _paperRef$current$own !== void 0 ? _paperRef$current$own : document; } }, TrapFocusProps), /*#__PURE__*/React.createElement(TransitionComponent, TransitionProps, /*#__PURE__*/React.createElement(Paper, { tabIndex: -1, elevation: 8, ref: handlePopperRef, className: clsx(classes.paper, placement === 'top' && classes.topTransition), onBlur: handleBlur }, children))); }); }; var CanAutoFocusContext = React.createContext(true); var useCanAutoFocus = function useCanAutoFocus() { return React.useContext(CanAutoFocusContext); }; function useAutoFocusControl(open) { var _React$useState = React.useState(false), _React$useState2 = _slicedToArray(_React$useState, 2), canAutoFocus = _React$useState2[0], setCanAutoFocus = _React$useState2[1]; React.useEffect(function () { if (!open) { setCanAutoFocus(false); } }, [open]); return { canAutoFocus: canAutoFocus, onOpen: React.useCallback(function () { return setCanAutoFocus(true); }, []) }; } var DesktopWrapper = function DesktopWrapper(props) { var children = props.children, DateInputProps = props.DateInputProps, _props$KeyboardDateIn = props.KeyboardDateInputComponent, KeyboardDateInputComponent = _props$KeyboardDateIn === void 0 ? KeyboardDateInput : _props$KeyboardDateIn, onDismiss = props.onDismiss, open = props.open, PopperProps = props.PopperProps, TransitionComponent = props.TransitionComponent; var inputRef = React.useRef(null); var _useAutoFocusControl = useAutoFocusControl(open), canAutoFocus = _useAutoFocusControl.canAutoFocus, onOpen = _useAutoFocusControl.onOpen; return /*#__PURE__*/React.createElement(WrapperVariantContext.Provider, { value: "desktop" }, /*#__PURE__*/React.createElement(CanAutoFocusContext.Provider, { value: canAutoFocus }, /*#__PURE__*/React.createElement(KeyboardDateInputComponent, _extends({}, DateInputProps, { inputRef: inputRef })), /*#__PURE__*/React.createElement(PickersPopper, { role: "dialog", open: open, anchorEl: inputRef.current, TransitionComponent: TransitionComponent, PopperProps: PopperProps, onClose: onDismiss, onOpen: onOpen }, children))); }; process.env.NODE_ENV !== "production" ? DesktopWrapper.propTypes = { onOpen: PropTypes.func, onClose: PropTypes.func } : void 0; var DesktopTooltipWrapper = function DesktopTooltipWrapper(props) { var open = props.open, children = props.children, PopperProps = props.PopperProps, onDismiss = props.onDismiss, DateInputProps = props.DateInputProps, TransitionComponent = props.TransitionComponent, _props$KeyboardDateIn = props.KeyboardDateInputComponent, KeyboardDateInputComponent = _props$KeyboardDateIn === void 0 ? KeyboardDateInput : _props$KeyboardDateIn; var inputRef = React.useRef(null); var popperRef = React.useRef(null); var _useAutoFocusControl = useAutoFocusControl(open), canAutoFocus = _useAutoFocusControl.canAutoFocus, onOpen = _useAutoFocusControl.onOpen; var handleBlur = function handleBlur() { executeInTheNextEventLoopTick(function () { var _inputRef$current, _popperRef$current; if (((_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.contains(document.activeElement)) || ((_popperRef$current = popperRef.current) === null || _popperRef$current === void 0 ? void 0 : _popperRef$current.contains(document.activeElement))) { return; } onDismiss(); }); }; return /*#__PURE__*/React.createElement(WrapperVariantContext.Provider, { value: "desktop" }, /*#__PURE__*/React.createElement(CanAutoFocusContext.Provider, { value: canAutoFocus }, /*#__PURE__*/React.createElement(KeyboardDateInputComponent, _extends({}, DateInputProps, { containerRef: inputRef, onBlur: handleBlur })), /*#__PURE__*/React.createElement(PickersPopper, { role: "tooltip", open: open, innerRef: popperRef, anchorEl: inputRef.current, TransitionComponent: TransitionComponent, PopperProps: PopperProps, onBlur: handleBlur, onClose: onDismiss, onOpen: onOpen }, children))); }; var makeResponsiveWrapper = function makeResponsiveWrapper(DesktopWrapperComponent, MobileWrapperComponent) { var ResponsiveWrapper = function ResponsiveWrapper(_ref) { var cancelText = _ref.cancelText, clearable = _ref.clearable, clearText = _ref.clearText, _ref$desktopModeMedia = _ref.desktopModeMediaQuery, desktopModeMediaQuery = _ref$desktopModeMedia === void 0 ? IS_TOUCH_DEVICE_MEDIA : _ref$desktopModeMedia, DialogProps = _ref.DialogProps, displayStaticWrapperAs = _ref.displayStaticWrapperAs, okText = _ref.okText, PopperProps = _ref.PopperProps, showTodayButton = _ref.showTodayButton, todayText = _ref.todayText, TransitionComponent = _ref.TransitionComponent, other = _objectWithoutProperties(_ref, ["cancelText", "clearable", "clearText", "desktopModeMediaQuery", "DialogProps", "displayStaticWrapperAs", "okText", "PopperProps", "showTodayButton", "todayText", "TransitionComponent"]); var isDesktop = useMediaQuery(desktopModeMediaQuery); return isDesktop ? /*#__PURE__*/React.createElement(DesktopWrapperComponent, _extends({ PopperProps: PopperProps, TransitionComponent: TransitionComponent }, other)) : /*#__PURE__*/React.createElement(MobileWrapperComponent, _extends({ okText: okText, cancelText: cancelText, clearText: clearText, todayText: todayText, showTodayButton: showTodayButton, clearable: clearable, DialogProps: DialogProps }, other)); }; return ResponsiveWrapper; }; var ResponsiveWrapper = makeResponsiveWrapper(DesktopWrapper, MobileWrapper); var ResponsiveTooltipWrapper = makeResponsiveWrapper(DesktopTooltipWrapper, MobileWrapper); function useParsedDate(possiblyUnparsedValue) { var utils = useUtils(); return React.useMemo(function () { return typeof possiblyUnparsedValue === 'undefined' ? undefined : utils.date(possiblyUnparsedValue); }, [possiblyUnparsedValue, utils]); } function useNextMonthDisabled(month, _ref) { var disableFuture = _ref.disableFuture, maxDate = _ref.maxDate; var utils = useUtils(); return React.useMemo(function () { var now = utils.date(); var lastEnabledMonth = utils.startOfMonth(disableFuture && utils.isBefore(now, maxDate) ? now : maxDate); return !utils.isAfter(lastEnabledMonth, month); }, [disableFuture, maxDate, month, utils]); } function usePreviousMonthDisabled(month, _ref2) { var disablePast = _ref2.disablePast, minDate = _ref2.minDate; var utils = useUtils(); return React.useMemo(function () { var now = utils.date(); var firstEnabledMonth = utils.startOfMonth(disablePast && utils.isAfter(now, minDate) ? now : minDate); return !utils.isBefore(firstEnabledMonth, month); }, [disablePast, minDate, month, utils]); } var useStyles$4 = styles$1.makeStyles(function (theme) { return { root: { overflow: 'hidden', minWidth: DIALOG_WIDTH, display: 'flex', flexDirection: 'column', backgroundColor: theme.palette.background.paper } }; }, { name: 'MuiPickersStaticWrapper' }); var StaticWrapper = function StaticWrapper(props) { var _props$displayStaticW = props.displayStaticWrapperAs, displayStaticWrapperAs = _props$displayStaticW === void 0 ? 'static' : _props$displayStaticW, children = props.children; var classes = useStyles$4(); var isStatic = true; return /*#__PURE__*/React.createElement(IsStaticVariantContext.Provider, { value: isStatic }, /*#__PURE__*/React.createElement(WrapperVariantContext.Provider, { value: displayStaticWrapperAs }, /*#__PURE__*/React.createElement("div", { className: classes.root }, children))); }; var defaultIsSameError = function defaultIsSameError(a, b) { return a === b; }; function makeValidationHook(validateFn) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, defaultValidationError = _ref.defaultValidationError, _ref$isSameError = _ref.isSameError, isSameError = _ref$isSameError === void 0 ? defaultIsSameError : _ref$isSameError; return function (value, props) { var utils = useUtils(); var previousValidationErrorRef = React.useRef(defaultValidationError || null); var validationError = validateFn(utils, value, props); React.useEffect(function () { if (props.onError && !isSameError(validationError, previousValidationErrorRef.current)) { props.onError(validationError, value); } previousValidationErrorRef.current = validationError; }, [previousValidationErrorRef, props, validationError, value]); return validationError; }; } var date = PropTypes.oneOfType([PropTypes.object, PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]); var datePickerView = PropTypes.oneOf(['year', 'month', 'day']); var defaultMinDate = new Date('1900-01-01'); var defaultMaxDate = new Date('2099-12-31'); functi