@material-ui/pickers
Version:
React components, that implements material design pickers for material-ui v4
668 lines (589 loc) • 25 kB
JavaScript
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