UNPKG

@material-ui/lab

Version:

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

370 lines (306 loc) 11.1 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.styles = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styles = require("@material-ui/core/styles"); var _Clock = _interopRequireDefault(require("./Clock")); var _utils = require("../internal/pickers/utils"); var _useUtils = require("../internal/pickers/hooks/useUtils"); var _ClockNumbers = require("./ClockNumbers"); var _PickersArrowSwitcher = _interopRequireDefault(require("../internal/pickers/PickersArrowSwitcher")); var _timeUtils = require("../internal/pickers/time-utils"); var _dateHelpersHooks = require("../internal/pickers/hooks/date-helpers-hooks"); const styles = (0, _styles.createStyles)({ arrowSwitcher: { position: 'absolute', right: 12, top: 15 } }); exports.styles = styles; const getDefaultClockLabelText = (view, time, adapter) => `Select ${view}. Selected time is ${adapter.format(time, 'fullTime')}`; const getMinutesAriaText = minute => `${minute} minutes`; const getHoursAriaText = hour => `${hour} hours`; const getSecondsAriaText = seconds => `${seconds} seconds`; /** * @ignore - do not document. */ function ClockPicker(props) { const { allowKeyboardControl, ampm, ampmInClock, classes, date, disableIgnoringDatePartForTimeValidation, getClockLabelText = getDefaultClockLabelText, getHoursClockNumberText = getHoursAriaText, getMinutesClockNumberText = getMinutesAriaText, getSecondsClockNumberText = getSecondsAriaText, leftArrowButtonProps, leftArrowButtonText = 'open previous view', leftArrowIcon, maxTime, minTime, minutesStep = 1, nextViewAvailable, onChange, openNextView, openPreviousView, previousViewAvailable, rightArrowButtonProps, rightArrowButtonText = 'open next view', rightArrowIcon, shouldDisableTime, showViewSwitcher, view } = props; const now = (0, _useUtils.useNow)(); const utils = (0, _useUtils.useUtils)(); const dateOrNow = date || now; const { meridiemMode, handleMeridiemChange } = (0, _dateHelpersHooks.useMeridiemMode)(dateOrNow, ampm, onChange); const isTimeDisabled = React.useCallback((rawValue, viewType) => { if (date === null) { return false; } const validateTimeValue = getRequestedTimePoint => { const isAfterComparingFn = (0, _timeUtils.createIsAfterIgnoreDatePart)(Boolean(disableIgnoringDatePartForTimeValidation), utils); return Boolean(minTime && isAfterComparingFn(minTime, getRequestedTimePoint('end')) || maxTime && isAfterComparingFn(getRequestedTimePoint('start'), maxTime) || shouldDisableTime && shouldDisableTime(rawValue, viewType)); }; switch (viewType) { case 'hours': { const hoursWithMeridiem = (0, _timeUtils.convertValueToMeridiem)(rawValue, meridiemMode, Boolean(ampm)); return validateTimeValue(when => (0, _utils.pipe)(currentDate => utils.setHours(currentDate, hoursWithMeridiem), dateWithHours => utils.setMinutes(dateWithHours, when === 'start' ? 0 : 59), dateWithMinutes => utils.setSeconds(dateWithMinutes, when === 'start' ? 0 : 59))(date)); } case 'minutes': return validateTimeValue(when => (0, _utils.pipe)(currentDate => utils.setMinutes(currentDate, rawValue), dateWithMinutes => utils.setSeconds(dateWithMinutes, when === 'start' ? 0 : 59))(date)); case 'seconds': return validateTimeValue(() => utils.setSeconds(date, rawValue)); default: throw new Error('not supported'); } }, [ampm, date, disableIgnoringDatePartForTimeValidation, maxTime, meridiemMode, minTime, shouldDisableTime, utils]); const viewProps = React.useMemo(() => { switch (view) { case 'hours': { const handleHoursChange = (value, isFinish) => { const valueWithMeridiem = (0, _timeUtils.convertValueToMeridiem)(value, meridiemMode, Boolean(ampm)); onChange(utils.setHours(dateOrNow, valueWithMeridiem), isFinish); }; return { onChange: handleHoursChange, value: utils.getHours(dateOrNow), children: (0, _ClockNumbers.getHourNumbers)({ date, utils, ampm: Boolean(ampm), onChange: handleHoursChange, getClockNumberText: getHoursClockNumberText, isDisabled: value => isTimeDisabled(value, 'hours') }) }; } case 'minutes': { const minutesValue = utils.getMinutes(dateOrNow); const handleMinutesChange = (value, isFinish) => { onChange(utils.setMinutes(dateOrNow, value), isFinish); }; return { value: minutesValue, onChange: handleMinutesChange, children: (0, _ClockNumbers.getMinutesNumbers)({ utils, value: minutesValue, onChange: handleMinutesChange, getClockNumberText: getMinutesClockNumberText, isDisabled: value => isTimeDisabled(value, 'minutes') }) }; } case 'seconds': { const secondsValue = utils.getSeconds(dateOrNow); const handleSecondsChange = (value, isFinish) => { onChange(utils.setSeconds(dateOrNow, value), isFinish); }; return { value: secondsValue, onChange: handleSecondsChange, children: (0, _ClockNumbers.getMinutesNumbers)({ utils, value: secondsValue, onChange: handleSecondsChange, getClockNumberText: getSecondsClockNumberText, isDisabled: value => isTimeDisabled(value, 'seconds') }) }; } default: throw new Error('You must provide the type for ClockView'); } }, [view, utils, date, ampm, getHoursClockNumberText, getMinutesClockNumberText, getSecondsClockNumberText, meridiemMode, onChange, dateOrNow, isTimeDisabled]); return /*#__PURE__*/React.createElement(React.Fragment, null, showViewSwitcher && /*#__PURE__*/React.createElement(_PickersArrowSwitcher.default, { className: classes.arrowSwitcher, leftArrowButtonProps: leftArrowButtonProps, rightArrowButtonProps: rightArrowButtonProps, leftArrowButtonText: leftArrowButtonText, rightArrowButtonText: rightArrowButtonText, leftArrowIcon: leftArrowIcon, rightArrowIcon: rightArrowIcon, onLeftClick: openPreviousView, onRightClick: openNextView, isLeftDisabled: previousViewAvailable, isRightDisabled: nextViewAvailable }), /*#__PURE__*/React.createElement(_Clock.default, (0, _extends2.default)({ date: date, ampmInClock: ampmInClock, type: view, ampm: ampm // @ts-expect-error TODO figure out this weird error , getClockLabelText: getClockLabelText, minutesStep: minutesStep, allowKeyboardControl: allowKeyboardControl, isTimeDisabled: isTimeDisabled, meridiemMode: meridiemMode, handleMeridiemChange: handleMeridiemChange }, viewProps))); } ClockPicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | // | To update them edit TypeScript types and run "yarn proptypes" | // ---------------------------------------------------------------------- /** * Enables keyboard listener for moving between days in calendar. * @default currentWrapper !== 'static' */ allowKeyboardControl: _propTypes.default.bool, /** * 12h/24h view for hour selection clock. * @default true */ ampm: _propTypes.default.bool, /** * Display ampm controls under the clock (instead of in the toolbar). * @default false */ ampmInClock: _propTypes.default.bool, /** * @ignore */ classes: _propTypes.default.object.isRequired, /** * Selected date @DateIOType. */ date: _propTypes.default.any, /** * Do not ignore date part when validating min/max time. * @default false */ disableIgnoringDatePartForTimeValidation: _propTypes.default.bool, /** * Accessible text that helps user to understand which time and view is selected. * @default (view, time) => `Select ${view}. Selected time is ${format(time, 'fullTime')}` */ getClockLabelText: _propTypes.default.func, /** * Get clock number aria-text for hours. */ getHoursClockNumberText: _propTypes.default.func, /** * Get clock number aria-text for minutes. */ getMinutesClockNumberText: _propTypes.default.func, /** * Get clock number aria-text for seconds. */ getSecondsClockNumberText: _propTypes.default.func, /** * Props to pass to left arrow button. */ leftArrowButtonProps: _propTypes.default.object, /** * Left arrow icon aria-label text. */ leftArrowButtonText: _propTypes.default.string, /** * Left arrow icon. */ leftArrowIcon: _propTypes.default.node, /** * Max time acceptable time. * For input validation date part of passed object will be ignored if `disableIgnoringDatePartForTimeValidation` not specified. */ maxTime: _propTypes.default.any, /** * Min time acceptable time. * For input validation date part of passed object will be ignored if `disableIgnoringDatePartForTimeValidation` not specified. */ minTime: _propTypes.default.any, /** * Step over minutes. * @default 1 */ minutesStep: _propTypes.default.number, /** * @ignore */ nextViewAvailable: _propTypes.default.bool.isRequired, /** * On change callback @DateIOType. */ onChange: _propTypes.default.func.isRequired, /** * @ignore */ openNextView: _propTypes.default.func.isRequired, /** * @ignore */ openPreviousView: _propTypes.default.func.isRequired, /** * @ignore */ previousViewAvailable: _propTypes.default.bool.isRequired, /** * Props to pass to right arrow button. */ rightArrowButtonProps: _propTypes.default.object, /** * Right arrow icon aria-label text. */ rightArrowButtonText: _propTypes.default.string, /** * Right arrow icon. */ rightArrowIcon: _propTypes.default.node, /** * Dynamically check if time is disabled or not. * If returns `false` appropriate time point will ot be acceptable. */ shouldDisableTime: _propTypes.default.func, /** * @ignore */ showViewSwitcher: _propTypes.default.bool, /** * @ignore */ view: _propTypes.default.oneOf(['hours', 'minutes', 'seconds']).isRequired }; var _default = (0, _styles.withStyles)(styles, { name: 'MuiPickersClockView' })(ClockPicker); exports.default = _default;