@material-ui/lab
Version:
Material-UI Lab - Incubator for Material-UI React components.
370 lines (306 loc) • 11.1 kB
JavaScript
"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;