UNPKG

@material-ui/pickers

Version:

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

668 lines (589 loc) 25 kB
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import React__default, { createElement, useMemo, useState, useCallback, useEffect, useDebugValue, useRef } from 'react'; import { bool, string, any } 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, fade, withStyles, createStyles } from '@material-ui/core/styles'; import Button from '@material-ui/core/Button'; import Toolbar from '@material-ui/core/Toolbar'; import { W as Wrapper } from './Wrapper-241966d7.js'; import TextField from '@material-ui/core/TextField'; import IconButton from '@material-ui/core/IconButton'; import InputAdornment from '@material-ui/core/InputAdornment'; import { Rifm } from 'rifm'; import SvgIcon from '@material-ui/core/SvgIcon'; import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray'; import { P as Picker } from './Picker-ccd9ba90.js'; var useStyles = makeStyles(function (theme) { var textColor = theme.palette.type === 'light' ? theme.palette.primary.contrastText : theme.palette.getContrastText(theme.palette.background["default"]); return { toolbarTxt: { color: fade(textColor, 0.54) }, toolbarBtnSelected: { color: textColor } }; }, { name: 'MuiPickersToolbarText' }); var ToolbarText = function ToolbarText(_ref) { var selected = _ref.selected, label = _ref.label, _ref$className = _ref.className, className = _ref$className === void 0 ? null : _ref$className, other = _objectWithoutProperties(_ref, ["selected", "label", "className"]); var classes = useStyles(); return createElement(Typography, _extends({ children: label, className: clsx(classes.toolbarTxt, className, selected && classes.toolbarBtnSelected) }, other)); }; var ToolbarButton = function ToolbarButton(_ref) { var classes = _ref.classes, _ref$className = _ref.className, className = _ref$className === void 0 ? null : _ref$className, label = _ref.label, selected = _ref.selected, variant = _ref.variant, align = _ref.align, typographyClassName = _ref.typographyClassName, other = _objectWithoutProperties(_ref, ["classes", "className", "label", "selected", "variant", "align", "typographyClassName"]); return createElement(Button, _extends({ variant: "text", className: clsx(classes.toolbarBtn, className) }, other), createElement(ToolbarText, { align: align, className: typographyClassName, variant: variant, label: label, selected: selected })); }; process.env.NODE_ENV !== "production" ? ToolbarButton.propTypes = { selected: bool.isRequired, label: string.isRequired, classes: any.isRequired, className: string, innerRef: any } : void 0; ToolbarButton.defaultProps = { className: '' }; var styles = createStyles({ toolbarBtn: { padding: 0, minWidth: '16px', textTransform: 'none' } }); var ToolbarButton$1 = withStyles(styles, { name: 'MuiPickersToolbarButton' })(ToolbarButton); var useStyles$1 = makeStyles(function (theme) { return { toolbar: { display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'center', height: 100, backgroundColor: theme.palette.type === 'light' ? theme.palette.primary.main : theme.palette.background["default"] }, toolbarLandscape: { height: 'auto', maxWidth: 150, padding: 8, justifyContent: 'flex-start' } }; }, { name: 'MuiPickersToolbar' }); var PickerToolbar = function PickerToolbar(_ref) { var children = _ref.children, isLandscape = _ref.isLandscape, _ref$className = _ref.className, className = _ref$className === void 0 ? null : _ref$className, other = _objectWithoutProperties(_ref, ["children", "isLandscape", "className"]); var classes = useStyles$1(); return createElement(Toolbar, _extends({ className: clsx(classes.toolbar, className, isLandscape && classes.toolbarLandscape) }, other), children); }; 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 PureDateInput = function PureDateInput(_ref) { var inputValue = _ref.inputValue, inputVariant = _ref.inputVariant, validationError = _ref.validationError, InputProps = _ref.InputProps, onOpen = _ref.openPicker, _ref$TextFieldCompone = _ref.TextFieldComponent, TextFieldComponent = _ref$TextFieldCompone === void 0 ? TextField : _ref$TextFieldCompone, other = _objectWithoutProperties(_ref, ["inputValue", "inputVariant", "validationError", "InputProps", "openPicker", "TextFieldComponent"]); var PureDateInputProps = useMemo(function () { return _objectSpread({}, InputProps, { readOnly: true }); }, [InputProps]); return createElement(TextFieldComponent, _extends({ error: Boolean(validationError), helperText: validationError }, other, { // do not overridable onClick: onOpen, value: inputValue, variant: inputVariant, InputProps: PureDateInputProps, onKeyDown: function onKeyDown(e) { // space if (e.keyCode === 32) { e.stopPropagation(); onOpen(); } } })); }; PureDateInput.displayName = 'PureDateInput'; var KeyboardIcon = function KeyboardIcon(props) { return React__default.createElement(SvgIcon, props, React__default.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" }), React__default.createElement("path", { fill: "none", d: "M0 0h24v24H0z" })); }; var getDisplayDate = function getDisplayDate(value, format, utils, isEmpty, _ref) { var invalidLabel = _ref.invalidLabel, emptyLabel = _ref.emptyLabel, labelFunc = _ref.labelFunc; var date = utils.date(value); if (labelFunc) { return labelFunc(isEmpty ? null : date, invalidLabel); } if (isEmpty) { return emptyLabel || ''; } return utils.isValid(date) ? utils.format(date, format) : invalidLabel; }; var getComparisonMaxDate = function getComparisonMaxDate(utils, strictCompareDates, date) { if (strictCompareDates) { return date; } return utils.endOfDay(date); }; var getComparisonMinDate = function getComparisonMinDate(utils, strictCompareDates, date) { if (strictCompareDates) { return date; } return utils.startOfDay(date); }; var validate = function validate(value, utils, _ref2) { var maxDate = _ref2.maxDate, minDate = _ref2.minDate, disablePast = _ref2.disablePast, disableFuture = _ref2.disableFuture, maxDateMessage = _ref2.maxDateMessage, minDateMessage = _ref2.minDateMessage, invalidDateMessage = _ref2.invalidDateMessage, strictCompareDates = _ref2.strictCompareDates; var parsedValue = utils.date(value); // if null - do not show error if (value === null) { return ''; } if (!utils.isValid(value)) { return invalidDateMessage; } if (maxDate && utils.isAfter(parsedValue, getComparisonMaxDate(utils, !!strictCompareDates, utils.date(maxDate)))) { return maxDateMessage; } if (disableFuture && utils.isAfter(parsedValue, getComparisonMaxDate(utils, !!strictCompareDates, utils.date()))) { return maxDateMessage; } if (minDate && utils.isBefore(parsedValue, getComparisonMinDate(utils, !!strictCompareDates, utils.date(minDate)))) { return minDateMessage; } if (disablePast && utils.isBefore(parsedValue, getComparisonMinDate(utils, !!strictCompareDates, utils.date()))) { return minDateMessage; } return ''; }; function pick12hOr24hFormat(userFormat) { var ampm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var formats = arguments.length > 2 ? arguments[2] : undefined; if (userFormat) { return userFormat; } return ampm ? formats['12h'] : formats['24h']; } function makeMaskFromFormat(format, numberMaskChar) { return format.replace(/[a-z]/gi, numberMaskChar); } var maskedDateFormatter = function maskedDateFormatter(mask, numberMaskChar, refuse) { return function (value) { var result = ''; var parsed = value.replace(refuse, ''); if (parsed === '') { return parsed; } var i = 0; var n = 0; while (i < mask.length) { var maskChar = mask[i]; if (maskChar === numberMaskChar && n < parsed.length) { var parsedChar = parsed[n]; result += parsedChar; n += 1; } else { result += maskChar; } i += 1; } return result; }; }; 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 KeyboardDateInput = function KeyboardDateInput(_ref) { var inputValue = _ref.inputValue, inputVariant = _ref.inputVariant, validationError = _ref.validationError, KeyboardButtonProps = _ref.KeyboardButtonProps, InputAdornmentProps = _ref.InputAdornmentProps, onOpen = _ref.openPicker, onChange = _ref.onChange, InputProps = _ref.InputProps, mask = _ref.mask, _ref$maskChar = _ref.maskChar, maskChar = _ref$maskChar === void 0 ? '_' : _ref$maskChar, _ref$refuse = _ref.refuse, refuse = _ref$refuse === void 0 ? /[^\d]+/gi : _ref$refuse, format = _ref.format, keyboardIcon = _ref.keyboardIcon, disabled = _ref.disabled, rifmFormatter = _ref.rifmFormatter, _ref$TextFieldCompone = _ref.TextFieldComponent, TextFieldComponent = _ref$TextFieldCompone === void 0 ? TextField : _ref$TextFieldCompone, other = _objectWithoutProperties(_ref, ["inputValue", "inputVariant", "validationError", "KeyboardButtonProps", "InputAdornmentProps", "openPicker", "onChange", "InputProps", "mask", "maskChar", "refuse", "format", "keyboardIcon", "disabled", "rifmFormatter", "TextFieldComponent"]); var inputMask = mask || makeMaskFromFormat(format, maskChar); // prettier-ignore var formatter = useMemo(function () { return maskedDateFormatter(inputMask, maskChar, refuse); }, [inputMask, maskChar, refuse]); var position = InputAdornmentProps && InputAdornmentProps.position ? InputAdornmentProps.position : 'end'; var handleChange = function handleChange(text) { var finalString = text === '' || text === inputMask ? null : text; onChange(finalString); }; return createElement(Rifm, { key: inputMask, value: inputValue, onChange: handleChange, refuse: refuse, format: rifmFormatter || formatter }, function (_ref2) { var onChange = _ref2.onChange, value = _ref2.value; return createElement(TextFieldComponent, _extends({ disabled: disabled, error: Boolean(validationError), helperText: validationError }, other, { value: value, onChange: onChange, variant: inputVariant, InputProps: _objectSpread$1({}, InputProps, _defineProperty({}, "".concat(position, "Adornment"), createElement(InputAdornment, _extends({ position: position }, InputAdornmentProps), createElement(IconButton, _extends({ disabled: disabled }, KeyboardButtonProps, { onClick: onOpen }), keyboardIcon)))) })); }); }; KeyboardDateInput.defaultProps = { keyboardIcon: createElement(KeyboardIcon, null) }; function useOpenState(_ref) { var open = _ref.open, onOpen = _ref.onOpen, onClose = _ref.onClose; var setIsOpenState = null; if (open === undefined || open === null) { // The component is uncontrolled, so we need to give it its own state. var _useState = useState(false); var _useState2 = _slicedToArray(_useState, 2); open = _useState2[0]; setIsOpenState = _useState2[1]; } // prettier-ignore var setIsOpen = useCallback(function (newIsOpen) { setIsOpenState && setIsOpenState(newIsOpen); return newIsOpen ? onOpen && onOpen() : onClose && onClose(); }, [onOpen, onClose, setIsOpenState]); return { isOpen: open, setIsOpen: setIsOpen }; } var useValueToDate = function useValueToDate(utils, _ref) { var value = _ref.value, initialFocusedDate = _ref.initialFocusedDate; var nowRef = useRef(utils.date()); var date = utils.date(value || initialFocusedDate || nowRef.current); return date && utils.isValid(date) ? date : nowRef.current; }; function useDateValues(props, options) { var utils = useUtils(); var date = useValueToDate(utils, props); var format = props.format || options.getDefaultFormat(); return { date: date, format: format }; } function usePickerState(props, options) { var autoOk = props.autoOk, disabled = props.disabled, readOnly = props.readOnly, onAccept = props.onAccept, _onChange = props.onChange, onError = props.onError, value = props.value, variant = props.variant; var utils = useUtils(); var _useOpenState = useOpenState(props), isOpen = _useOpenState.isOpen, setIsOpen = _useOpenState.setIsOpen; var _useDateValues = useDateValues(props, options), date = _useDateValues.date, format = _useDateValues.format; var _useState = useState(date), _useState2 = _slicedToArray(_useState, 2), pickerDate = _useState2[0], setPickerDate = _useState2[1]; useEffect(function () { // if value was changed in closed state - treat it as accepted if (!isOpen && !utils.isEqual(pickerDate, date)) { setPickerDate(date); } }, [date, isOpen, pickerDate, utils]); var acceptDate = useCallback(function (acceptedDate) { _onChange(acceptedDate); if (onAccept) { onAccept(acceptedDate); } setIsOpen(false); }, [onAccept, _onChange, setIsOpen]); var wrapperProps = useMemo(function () { return { format: format, open: isOpen, onClear: function onClear() { return acceptDate(null); }, onAccept: function onAccept() { return acceptDate(pickerDate); }, onSetToday: function onSetToday() { return setPickerDate(utils.date()); }, onDismiss: function onDismiss() { setIsOpen(false); } }; }, [acceptDate, format, isOpen, pickerDate, setIsOpen, utils]); var pickerProps = useMemo(function () { return { date: pickerDate, onChange: function onChange(newDate) { var isFinish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; setPickerDate(newDate); if (isFinish && autoOk) { acceptDate(newDate); return; } // simulate autoOk, but do not close the modal if (variant === 'inline' || variant === 'static') { _onChange(newDate); onAccept && onAccept(newDate); } } }; }, [acceptDate, autoOk, onAccept, _onChange, pickerDate, variant]); var validationError = validate(value, utils, props); useEffect(function () { if (onError) { onError(validationError, value); } }, [onError, validationError, value]); var inputValue = getDisplayDate(date, format, utils, value === null, props); var inputProps = useMemo(function () { return { inputValue: inputValue, validationError: validationError, openPicker: function openPicker() { return !readOnly && !disabled && setIsOpen(true); } }; }, [disabled, inputValue, readOnly, setIsOpen, validationError]); var pickerState = { pickerProps: pickerProps, inputProps: inputProps, wrapperProps: wrapperProps }; useDebugValue(pickerState); return pickerState; } 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(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function parseInputString(value, utils, format) { try { return utils.parse(value, format); } catch (_unused) { return null; } } function useKeyboardPickerState(props, options) { var _props$format = props.format, format = _props$format === void 0 ? options.getDefaultFormat() : _props$format, inputValue = props.inputValue, _onChange = props.onChange, value = props.value; var utils = useUtils(); var displayDate = getDisplayDate(value, format, utils, value === null, props); var _useState = useState(displayDate), _useState2 = _slicedToArray(_useState, 2), innerInputValue = _useState2[0], setInnerInputValue = _useState2[1]; var dateValue = inputValue ? parseInputString(inputValue, utils, format) : value; useEffect(function () { if (value === null || utils.isValid(value)) { setInnerInputValue(displayDate); } }, [displayDate, setInnerInputValue, utils, value]); var handleKeyboardChange = useCallback(function (date) { _onChange(date, date === null ? null : utils.format(date, format)); }, [format, _onChange, utils]); var _usePickerState = usePickerState( // Extend props interface _objectSpread$2({}, props, { value: dateValue, onChange: handleKeyboardChange }), options), innerInputProps = _usePickerState.inputProps, wrapperProps = _usePickerState.wrapperProps, pickerProps = _usePickerState.pickerProps; var inputProps = useMemo(function () { return _objectSpread$2({}, innerInputProps, { // reuse validation and open/close logic format: wrapperProps.format, inputValue: inputValue || innerInputValue, onChange: function onChange(value) { setInnerInputValue(value || ''); var date = value === null ? null : utils.parse(value, wrapperProps.format); _onChange(date, value); } }); }, [innerInputProps, innerInputValue, inputValue, _onChange, utils, wrapperProps.format]); return { inputProps: inputProps, wrapperProps: wrapperProps, pickerProps: pickerProps }; } function makePickerWithState(_ref) { var Input = _ref.Input, useState = _ref.useState, useOptions = _ref.useOptions, getCustomProps = _ref.getCustomProps, DefaultToolbarComponent = _ref.DefaultToolbarComponent; function PickerWithState(props) { var allowKeyboardControl = props.allowKeyboardControl, ampm = props.ampm, animateYearScrolling = props.animateYearScrolling, autoOk = props.autoOk, dateRangeIcon = props.dateRangeIcon, disableFuture = props.disableFuture, disablePast = props.disablePast, disableToolbar = props.disableToolbar, emptyLabel = props.emptyLabel, format = props.format, forwardedRef = props.forwardedRef, hideTabs = props.hideTabs, initialFocusedDate = props.initialFocusedDate, invalidDateMessage = props.invalidDateMessage, invalidLabel = props.invalidLabel, labelFunc = props.labelFunc, leftArrowButtonProps = props.leftArrowButtonProps, leftArrowIcon = props.leftArrowIcon, loadingIndicator = props.loadingIndicator, maxDate = props.maxDate, maxDateMessage = props.maxDateMessage, minDate = props.minDate, minDateMessage = props.minDateMessage, minutesStep = props.minutesStep, onAccept = props.onAccept, onChange = props.onChange, onClose = props.onClose, onMonthChange = props.onMonthChange, onOpen = props.onOpen, onYearChange = props.onYearChange, openTo = props.openTo, orientation = props.orientation, renderDay = props.renderDay, rightArrowButtonProps = props.rightArrowButtonProps, rightArrowIcon = props.rightArrowIcon, shouldDisableDate = props.shouldDisableDate, strictCompareDates = props.strictCompareDates, timeIcon = props.timeIcon, _props$ToolbarCompone = props.ToolbarComponent, ToolbarComponent = _props$ToolbarCompone === void 0 ? DefaultToolbarComponent : _props$ToolbarCompone, value = props.value, variant = props.variant, views = props.views, other = _objectWithoutProperties(props, ["allowKeyboardControl", "ampm", "animateYearScrolling", "autoOk", "dateRangeIcon", "disableFuture", "disablePast", "disableToolbar", "emptyLabel", "format", "forwardedRef", "hideTabs", "initialFocusedDate", "invalidDateMessage", "invalidLabel", "labelFunc", "leftArrowButtonProps", "leftArrowIcon", "loadingIndicator", "maxDate", "maxDateMessage", "minDate", "minDateMessage", "minutesStep", "onAccept", "onChange", "onClose", "onMonthChange", "onOpen", "onYearChange", "openTo", "orientation", "renderDay", "rightArrowButtonProps", "rightArrowIcon", "shouldDisableDate", "strictCompareDates", "timeIcon", "ToolbarComponent", "value", "variant", "views"]); var injectedProps = getCustomProps ? getCustomProps(props) : {}; var options = useOptions(props); var _useState = useState(props, options), pickerProps = _useState.pickerProps, inputProps = _useState.inputProps, wrapperProps = _useState.wrapperProps; return createElement(Wrapper, _extends({ variant: variant, InputComponent: Input, DateInputProps: inputProps }, injectedProps, wrapperProps, other), createElement(Picker, _extends({}, pickerProps, { allowKeyboardControl: allowKeyboardControl, ampm: ampm, animateYearScrolling: animateYearScrolling, dateRangeIcon: dateRangeIcon, disableFuture: disableFuture, disablePast: disablePast, disableToolbar: disableToolbar, hideTabs: hideTabs, leftArrowButtonProps: leftArrowButtonProps, leftArrowIcon: leftArrowIcon, loadingIndicator: loadingIndicator, maxDate: maxDate, minDate: minDate, minutesStep: minutesStep, onMonthChange: onMonthChange, onYearChange: onYearChange, openTo: openTo, orientation: orientation, renderDay: renderDay, rightArrowButtonProps: rightArrowButtonProps, rightArrowIcon: rightArrowIcon, shouldDisableDate: shouldDisableDate, strictCompareDates: strictCompareDates, timeIcon: timeIcon, ToolbarComponent: ToolbarComponent, views: views }))); } return PickerWithState; } export { KeyboardDateInput as K, PickerToolbar as P, ToolbarButton$1 as T, PureDateInput as a, useKeyboardPickerState as b, ToolbarText as c, makePickerWithState as m, pick12hOr24hFormat as p, usePickerState as u, validate as v }; //# sourceMappingURL=makePickerWithState-5a79cb8a.js.map