@material-ui/pickers
Version:
React components, that implements material design pickers for material-ui v4
432 lines (399 loc) • 15.7 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
import { useState, useCallback, forwardRef, createElement, useContext, useRef, useEffect, useMemo } from 'react';
import { oneOfType, object, string, number, instanceOf, oneOf } 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 } from '@material-ui/core/styles';
import { a as arrayIncludes, V as VariantContext, u as useIsomorphicEffect, b as VIEW_HEIGHT, D as DIALOG_WIDTH, c as DIALOG_WIDTH_WIDER } from './Wrapper-241966d7.js';
import { a as Calendar } from './Calendar-11ae61f6.js';
import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';
import { ClockView } from './ClockView.js';
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 date = oneOfType([object, string, number, instanceOf(Date)]);
var datePickerView = oneOf(['year', 'month', 'day']);
/* eslint-disable @typescript-eslint/no-object-literal-type-assertion */
var timePickerDefaultProps = {
ampm: true,
invalidDateMessage: 'Invalid Time Format'
};
var datePickerDefaultProps = {
minDate: new Date('1900-01-01'),
maxDate: new Date('2100-01-01'),
invalidDateMessage: 'Invalid Date Format',
minDateMessage: 'Date should not be before minimal date',
maxDateMessage: 'Date should not be after maximal date',
allowKeyboardControl: true
};
var dateTimePickerDefaultProps = _objectSpread({}, timePickerDefaultProps, {}, datePickerDefaultProps, {
showTabs: true
});
function useViews(views, openTo, onChange) {
var _React$useState = useState(openTo && arrayIncludes(views, openTo) ? openTo : views[0]),
_React$useState2 = _slicedToArray(_React$useState, 2),
openView = _React$useState2[0],
setOpenView = _React$useState2[1];
var handleChangeAndOpenNext = useCallback(function (date, isFinish) {
var nextViewToOpen = views[views.indexOf(openView) + 1];
if (isFinish && nextViewToOpen) {
// do not close picker if needs to show next view
onChange(date, false);
setOpenView(nextViewToOpen);
return;
}
onChange(date, Boolean(isFinish));
}, [onChange, openView, views]);
return {
handleChangeAndOpenNext: handleChangeAndOpenNext,
openView: openView,
setOpenView: setOpenView
};
}
var useStyles = makeStyles(function (theme) {
return {
root: {
height: 40,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
outline: 'none',
'&:focus': {
color: theme.palette.primary.main,
fontWeight: theme.typography.fontWeightMedium
}
},
yearSelected: {
margin: '10px 0',
fontWeight: theme.typography.fontWeightMedium
},
yearDisabled: {
pointerEvents: 'none',
color: theme.palette.text.hint
}
};
}, {
name: 'MuiPickersYear'
});
var Year = function Year(_ref) {
var onSelect = _ref.onSelect,
forwardedRef = _ref.forwardedRef,
value = _ref.value,
selected = _ref.selected,
disabled = _ref.disabled,
children = _ref.children,
other = _objectWithoutProperties(_ref, ["onSelect", "forwardedRef", "value", "selected", "disabled", "children"]);
var classes = useStyles();
var handleClick = useCallback(function () {
return onSelect(value);
}, [onSelect, value]);
return createElement(Typography, _extends({
role: "button",
component: "div",
tabIndex: disabled ? -1 : 0,
onClick: handleClick,
onKeyPress: handleClick,
color: selected ? 'primary' : undefined,
variant: selected ? 'h5' : 'subtitle1',
children: children,
ref: forwardedRef,
className: clsx(classes.root, selected && classes.yearSelected, disabled && classes.yearDisabled)
}, other));
};
Year.displayName = 'Year';
var Year$1 = forwardRef(function (props, ref) {
return createElement(Year, _extends({}, props, {
forwardedRef: ref
}));
});
var useStyles$1 = makeStyles({
container: {
height: 300,
overflowY: 'auto'
}
}, {
name: 'MuiPickersYearSelection'
});
var YearSelection = function YearSelection(_ref) {
var date = _ref.date,
onChange = _ref.onChange,
onYearChange = _ref.onYearChange,
minDate = _ref.minDate,
maxDate = _ref.maxDate,
disablePast = _ref.disablePast,
disableFuture = _ref.disableFuture,
animateYearScrolling = _ref.animateYearScrolling;
var utils = useUtils();
var classes = useStyles$1();
var currentVariant = useContext(VariantContext);
var selectedYearRef = useRef(null);
useEffect(function () {
if (selectedYearRef.current && selectedYearRef.current.scrollIntoView) {
try {
selectedYearRef.current.scrollIntoView({
block: currentVariant === 'static' ? 'nearest' : 'center',
behavior: animateYearScrolling ? 'smooth' : 'auto'
});
} catch (e) {
// call without arguments in case when scrollIntoView works improperly (e.g. Firefox 52-57)
selectedYearRef.current.scrollIntoView();
}
}
}, []); // eslint-disable-line
var currentYear = utils.getYear(date);
var onYearSelect = useCallback(function (year) {
var newDate = utils.setYear(date, year);
if (onYearChange) {
onYearChange(newDate);
}
onChange(newDate, true);
}, [date, onChange, onYearChange, utils]);
return createElement("div", {
className: classes.container
}, utils.getYearRange(minDate, maxDate).map(function (year) {
var yearNumber = utils.getYear(year);
var selected = yearNumber === currentYear;
return createElement(Year$1, {
key: utils.getYearText(year),
selected: selected,
value: yearNumber,
onSelect: onYearSelect,
ref: selected ? selectedYearRef : undefined,
disabled: Boolean(disablePast && utils.isBeforeYear(year, utils.date()) || disableFuture && utils.isAfterYear(year, utils.date()))
}, utils.getYearText(year));
}));
};
var useStyles$2 = makeStyles(function (theme) {
return {
root: {
flex: '1 0 33.33%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
outline: 'none',
height: 75,
transition: theme.transitions.create('font-size', {
duration: '100ms'
}),
'&:focus': {
color: theme.palette.primary.main,
fontWeight: theme.typography.fontWeightMedium
}
},
monthSelected: {
color: theme.palette.primary.main,
fontWeight: theme.typography.fontWeightMedium
},
monthDisabled: {
pointerEvents: 'none',
color: theme.palette.text.hint
}
};
}, {
name: 'MuiPickersMonth'
});
var Month = function Month(_ref) {
var selected = _ref.selected,
onSelect = _ref.onSelect,
disabled = _ref.disabled,
value = _ref.value,
children = _ref.children,
other = _objectWithoutProperties(_ref, ["selected", "onSelect", "disabled", "value", "children"]);
var classes = useStyles$2();
var handleSelection = useCallback(function () {
onSelect(value);
}, [onSelect, value]);
return createElement(Typography, _extends({
role: "button",
component: "div",
className: clsx(classes.root, selected && classes.monthSelected, disabled && classes.monthDisabled),
tabIndex: disabled ? -1 : 0,
onClick: handleSelection,
onKeyPress: handleSelection,
color: selected ? 'primary' : undefined,
variant: selected ? 'h5' : 'subtitle1',
children: children
}, other));
};
Month.displayName = 'Month';
var useStyles$3 = makeStyles({
container: {
width: 310,
display: 'flex',
flexWrap: 'wrap',
alignContent: 'stretch'
}
}, {
name: 'MuiPickersMonthSelection'
});
var MonthSelection = function MonthSelection(_ref) {
var disablePast = _ref.disablePast,
disableFuture = _ref.disableFuture,
minDate = _ref.minDate,
maxDate = _ref.maxDate,
date = _ref.date,
onMonthChange = _ref.onMonthChange,
onChange = _ref.onChange;
var utils = useUtils();
var classes = useStyles$3();
var currentMonth = utils.getMonth(date);
var shouldDisableMonth = function shouldDisableMonth(month) {
var now = utils.date();
var utilMinDate = utils.date(minDate);
var utilMaxDate = utils.date(maxDate);
var firstEnabledMonth = utils.startOfMonth(disablePast && utils.isAfter(now, utilMinDate) ? now : utilMinDate);
var lastEnabledMonth = utils.startOfMonth(disableFuture && utils.isBefore(now, utilMaxDate) ? now : utilMaxDate);
var isBeforeFirstEnabled = utils.isBefore(month, firstEnabledMonth);
var isAfterLastEnabled = utils.isAfter(month, lastEnabledMonth);
return isBeforeFirstEnabled || isAfterLastEnabled;
};
var onMonthSelect = useCallback(function (month) {
var newDate = utils.setMonth(date, month);
onChange(newDate, true);
if (onMonthChange) {
onMonthChange(newDate);
}
}, [date, onChange, onMonthChange, utils]);
return createElement("div", {
className: classes.container
}, utils.getMonthArray(date).map(function (month) {
var monthNumber = utils.getMonth(month);
var monthText = utils.format(month, 'MMM');
return createElement(Month, {
key: monthText,
value: monthNumber,
selected: monthNumber === currentMonth,
onSelect: onMonthSelect,
disabled: shouldDisableMonth(month)
}, monthText);
}));
};
var getOrientation = function getOrientation() {
if (typeof window === 'undefined') {
return 'portrait';
}
if (window.screen && window.screen.orientation && window.screen.orientation.angle) {
return Math.abs(window.screen.orientation.angle) === 90 ? 'landscape' : 'portrait';
} // Support IOS safari
if (window.orientation) {
return Math.abs(Number(window.orientation)) === 90 ? 'landscape' : 'portrait';
}
return 'portrait';
};
function useIsLandscape(customOrientation) {
var _React$useState = useState(getOrientation()),
_React$useState2 = _slicedToArray(_React$useState, 2),
orientation = _React$useState2[0],
setOrientation = _React$useState2[1];
var eventHandler = useCallback(function () {
return setOrientation(getOrientation());
}, []);
useIsomorphicEffect(function () {
window.addEventListener('orientationchange', eventHandler);
return function () {
return window.removeEventListener('orientationchange', eventHandler);
};
}, [eventHandler]);
var orientationToUse = customOrientation || orientation;
return orientationToUse === 'landscape';
}
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 viewsMap = {
year: YearSelection,
month: MonthSelection,
date: Calendar,
hours: ClockView,
minutes: ClockView,
seconds: ClockView
};
var useStyles$4 = makeStyles({
container: {
display: 'flex',
flexDirection: 'column'
},
containerLandscape: {
flexDirection: 'row'
},
pickerView: {
overflowX: 'hidden',
minHeight: VIEW_HEIGHT,
minWidth: DIALOG_WIDTH,
maxWidth: DIALOG_WIDTH_WIDER,
display: 'flex',
flexDirection: 'column',
justifyContent: 'center'
},
pickerViewLandscape: {
padding: '0 8px'
}
}, {
name: 'MuiPickersBasePicker'
});
var Picker = function Picker(_ref) {
var date = _ref.date,
views = _ref.views,
disableToolbar = _ref.disableToolbar,
onChange = _ref.onChange,
openTo = _ref.openTo,
unparsedMinDate = _ref.minDate,
unparsedMaxDate = _ref.maxDate,
ToolbarComponent = _ref.ToolbarComponent,
orientation = _ref.orientation,
rest = _objectWithoutProperties(_ref, ["date", "views", "disableToolbar", "onChange", "openTo", "minDate", "maxDate", "ToolbarComponent", "orientation"]);
var utils = useUtils();
var classes = useStyles$4();
var isLandscape = useIsLandscape(orientation);
var _useViews = useViews(views, openTo, onChange),
openView = _useViews.openView,
setOpenView = _useViews.setOpenView,
handleChangeAndOpenNext = _useViews.handleChangeAndOpenNext;
var minDate = useMemo(function () {
return utils.date(unparsedMinDate);
}, [unparsedMinDate, utils]);
var maxDate = useMemo(function () {
return utils.date(unparsedMaxDate);
}, [unparsedMaxDate, utils]);
return createElement("div", {
className: clsx(classes.container, isLandscape && classes.containerLandscape)
}, !disableToolbar && createElement(ToolbarComponent, _extends({}, rest, {
views: views,
isLandscape: isLandscape,
date: date,
onChange: onChange,
setOpenView: setOpenView,
openView: openView
})), createElement("div", {
className: clsx(classes.pickerView, isLandscape && classes.pickerViewLandscape)
}, openView === 'year' && createElement(YearSelection, _extends({}, rest, {
date: date,
onChange: handleChangeAndOpenNext,
minDate: minDate,
maxDate: maxDate
})), openView === 'month' && createElement(MonthSelection, _extends({}, rest, {
date: date,
onChange: handleChangeAndOpenNext,
minDate: minDate,
maxDate: maxDate
})), openView === 'date' && createElement(Calendar, _extends({}, rest, {
date: date,
onChange: handleChangeAndOpenNext,
minDate: minDate,
maxDate: maxDate
})), (openView === 'hours' || openView === 'minutes' || openView === 'seconds') && createElement(ClockView, _extends({}, rest, {
date: date,
type: openView,
onHourChange: handleChangeAndOpenNext,
onMinutesChange: handleChangeAndOpenNext,
onSecondsChange: handleChangeAndOpenNext
}))));
};
Picker.defaultProps = _objectSpread$1({}, datePickerDefaultProps, {
views: Object.keys(viewsMap)
});
export { Picker as P, dateTimePickerDefaultProps as a, datePickerDefaultProps as d, timePickerDefaultProps as t };
//# sourceMappingURL=Picker-ccd9ba90.js.map