UNPKG

@fluentui/react-northstar

Version:
409 lines (406 loc) 20 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.datepickerCalendarClassName = exports.DatepickerCalendar = void 0; var _times2 = _interopRequireDefault(require("lodash/times")); var _map2 = _interopRequireDefault(require("lodash/map")); var _invoke2 = _interopRequireDefault(require("lodash/invoke")); var _find4 = _interopRequireDefault(require("lodash/find")); var _accessibility = require("@fluentui/accessibility"); var _dateTimeUtilities = require("../../utils/date-time-utilities"); var _reactBindings = require("@fluentui/react-bindings"); var customPropTypes = _interopRequireWildcard(require("@fluentui/react-proptypes")); var PropTypes = _interopRequireWildcard(require("prop-types")); var React = _interopRequireWildcard(require("react")); var _utils = require("../../utils"); var _DatepickerCalendarGrid = require("./DatepickerCalendarGrid"); var _DatepickerCalendarGridRow = require("./DatepickerCalendarGridRow"); var _DatepickerCalendarHeader = require("./DatepickerCalendarHeader"); var _DatepickerCalendarCell = require("./DatepickerCalendarCell"); var _DatepickerCalendarCellButton = require("./DatepickerCalendarCellButton"); var _DatepickerCalendarHeaderCell = require("./DatepickerCalendarHeaderCell"); var _navigateToNewDate = require("./navigateToNewDate"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var datepickerCalendarClassName = 'ui-datepicker__calendar'; exports.datepickerCalendarClassName = datepickerCalendarClassName; var normalizeDateInGrid = function normalizeDateInGrid(date) { var result = new Date(date.getTime()); result.setDate(1); return result; }; /** * A DatepickerCalendar is used to display dates in sematically grouped way. */ var DatepickerCalendar = /*#__PURE__*/React.forwardRef(function (props, ref) { var context = (0, _reactBindings.useFluentContext)(); var _useTelemetry = (0, _reactBindings.useTelemetry)(DatepickerCalendar.displayName, context.telemetry), setStart = _useTelemetry.setStart, setEnd = _useTelemetry.setEnd; setStart(); var className = props.className, design = props.design, styles = props.styles, variables = props.variables, calendarHeaderCell = props.calendarHeaderCell, calendarCell = props.calendarCell, calendarCellButton = props.calendarCellButton, calendarGrid = props.calendarGrid, calendarGridRow = props.calendarGridRow, dateRangeType = props.dateRangeType, header = props.header, selectedDate = props.selectedDate, navigatedDate = props.navigatedDate, firstDayOfWeek = props.firstDayOfWeek, today = props.today, formatMonthDayYear = props.formatMonthDayYear, formatMonthYear = props.formatMonthYear, shortDays = props.shortDays, days = props.days, minDate = props.minDate, maxDate = props.maxDate, restrictedDates = props.restrictedDates; var restrictedDatesOptions = { minDate: minDate, maxDate: maxDate, restrictedDates: restrictedDates }; var ElementType = (0, _reactBindings.getElementType)(props); var unhandledProps = (0, _reactBindings.useUnhandledProps)(DatepickerCalendar.handledProps, props); var updateNavigatedDate = function updateNavigatedDate(date) { if (!!date) { if (!shouldFocusInDayGrid) { setShouldFocusInDayGrid(true); } setGridNavigatedDate(date); } }; var getA11yProps = (0, _reactBindings.useAccessibility)(props.accessibility, { debugName: DatepickerCalendar.displayName, actionHandlers: { addWeek: function addWeek(e) { e.preventDefault(); var newNavigatedDate = (0, _navigateToNewDate.navigateToNewDate)(gridNavigatedDate, 'Week', 1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, subtractWeek: function subtractWeek(e) { e.preventDefault(); var newNavigatedDate = (0, _navigateToNewDate.navigateToNewDate)(gridNavigatedDate, 'Week', -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, addDay: function addDay(e) { e.preventDefault(); var newNavigatedDate = (0, _navigateToNewDate.navigateToNewDate)(gridNavigatedDate, 'Day', 1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, subtractDay: function subtractDay(e) { e.preventDefault(); var newNavigatedDate = (0, _navigateToNewDate.navigateToNewDate)(gridNavigatedDate, 'Day', -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, moveToStartOfWeek: function moveToStartOfWeek(e) { e.preventDefault(); var targetDate = (0, _dateTimeUtilities.getStartDateOfWeek)(gridNavigatedDate, firstDayOfWeek); var newNavigatedDate = (0, _navigateToNewDate.contstraintNavigatedDate)(gridNavigatedDate, targetDate, -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, moveToEndOfWeek: function moveToEndOfWeek(e) { e.preventDefault(); var targetDate = (0, _dateTimeUtilities.getEndDateOfWeek)(gridNavigatedDate, firstDayOfWeek); var newNavigatedDate = (0, _navigateToNewDate.contstraintNavigatedDate)(gridNavigatedDate, targetDate, -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, moveToStartOfColumn: function moveToStartOfColumn(e) { var _find2; e.preventDefault(); var targetDayOfWeek = gridNavigatedDate.getDay(); var targetDate = (_find2 = (0, _find4.default)(visibleGrid[0], function (day) { return day.originalDate.getDay() === targetDayOfWeek; })) == null ? void 0 : _find2.originalDate; var newNavigatedDate = (0, _navigateToNewDate.contstraintNavigatedDate)(gridNavigatedDate, targetDate, -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); }, moveToEndOfColumn: function moveToEndOfColumn(e) { var _find3; e.preventDefault(); var targetDayOfWeek = gridNavigatedDate.getDay(); var targetDate = (_find3 = (0, _find4.default)(visibleGrid[visibleGrid.length - 1], function (day) { return day.originalDate.getDay() === targetDayOfWeek; })) == null ? void 0 : _find3.originalDate; var newNavigatedDate = (0, _navigateToNewDate.contstraintNavigatedDate)(gridNavigatedDate, targetDate, -1, restrictedDatesOptions, true); updateNavigatedDate(newNavigatedDate); } }, rtl: context.rtl }); var _React$useState = React.useState(function () { return new Date((navigatedDate || today || new Date()).getTime()); }), gridNavigatedDate = _React$useState[0], setGridNavigatedDate = _React$useState[1]; var _React$useState2 = React.useState(function () { return normalizeDateInGrid(gridNavigatedDate); }), normalizedGridDate = _React$useState2[0], setNormalizedGridDate = _React$useState2[1]; var _React$useState3 = React.useState(true), shouldFocusInDayGrid = _React$useState3[0], setShouldFocusInDayGrid = _React$useState3[1]; var _useStyles = (0, _reactBindings.useStyles)(DatepickerCalendar.displayName, { className: datepickerCalendarClassName, mapPropsToInlineStyles: function mapPropsToInlineStyles() { return { className: className, design: design, styles: styles, variables: variables }; }, rtl: context.rtl }), classes = _useStyles.classes; var visibleGrid = React.useMemo(function () { var dayGridOptions = { selectedDate: selectedDate, navigatedDate: normalizedGridDate, weeksToShow: props.weeksToShow, firstDayOfWeek: props.firstDayOfWeek, firstWeekOfYear: props.firstWeekOfYear, dateRangeType: props.dateRangeType, daysToSelectInDayView: props.daysToSelectInDayView, today: props.today, showWeekNumbers: props.showWeekNumbers, workWeekDays: props.workWeekDays, minDate: props.minDate, maxDate: props.maxDate, restrictedDates: props.restrictedDates }; var grid = (0, _dateTimeUtilities.getDayGrid)(dayGridOptions); return grid.slice(1, grid.length - 1); // slicing off first and last weeks, cause we don't use them for transitions }, [selectedDate, normalizedGridDate, props]); React.useEffect(function () { var newNormalizedDate = normalizeDateInGrid(gridNavigatedDate); if ((0, _dateTimeUtilities.compareDatePart)(newNormalizedDate, normalizedGridDate)) { // Do not change the grid immediately the month changes but only once the date stops being visible. var gridContainsNavigatedDate = visibleGrid.find(function (week) { return week.find(function (day) { return (0, _dateTimeUtilities.compareDatePart)(day.originalDate, gridNavigatedDate) === 0; }); }); if (!gridContainsNavigatedDate) { setNormalizedGridDate(newNormalizedDate); } } }, [gridNavigatedDate, visibleGrid, normalizedGridDate]); var dateFormatting = { months: props.months, shortMonths: props.shortMonths, days: props.days, shortDays: props.shortDays }; var focusDateRef = React.useRef(null); var changeMonth = function changeMonth(nextMonth) { var newNavigatedDate = (0, _navigateToNewDate.navigateToNewDate)(normalizedGridDate, 'Month', nextMonth ? 1 : -1, restrictedDatesOptions, true); if (!!newNavigatedDate) { setGridNavigatedDate(newNavigatedDate); setShouldFocusInDayGrid(false); setNormalizedGridDate(normalizeDateInGrid(newNavigatedDate)); } }; var prevMonthOutOfBounds = minDate ? (0, _dateTimeUtilities.compareDatePart)(minDate, (0, _dateTimeUtilities.getMonthStart)(normalizedGridDate)) >= 0 : false; var nextMonthOutOfBounds = maxDate ? (0, _dateTimeUtilities.compareDatePart)((0, _dateTimeUtilities.getMonthEnd)(normalizedGridDate), maxDate) >= 0 : false; React.useEffect(function () { if (shouldFocusInDayGrid) { var _focusDateRef$current; (_focusDateRef$current = focusDateRef.current) == null ? void 0 : _focusDateRef$current.focus(); } }, [gridNavigatedDate, normalizedGridDate, shouldFocusInDayGrid]); var renderCell = function renderCell(day, content) { return (0, _utils.createShorthand)(_DatepickerCalendarCell.DatepickerCalendarCell, calendarCell, { defaultProps: function defaultProps() { var _props$today; return getA11yProps('calendarCell', { content: content, key: day.key, selected: day.isSelected, disabled: !day.isInBounds, quiet: !day.isInMonth, today: (0, _dateTimeUtilities.compareDates)(day.originalDate, (_props$today = props.today) != null ? _props$today : new Date()) }); } }); }; var renderCellButton = function renderCellButton(day, dateRange) { return (0, _utils.createShorthand)(_DatepickerCalendarCellButton.DatepickerCalendarCellButton, calendarCellButton, { defaultProps: function defaultProps() { var _props$today2; return getA11yProps('calendarCell', { content: day.date, 'aria-label': formatMonthDayYear(day.originalDate, dateFormatting), selected: day.isSelected, disabled: !day.isInBounds, quiet: !day.isInMonth, today: (0, _dateTimeUtilities.compareDates)(day.originalDate, (_props$today2 = props.today) != null ? _props$today2 : new Date()) }); }, overrideProps: function overrideProps(predefinedProps) { return { onFocus: function onFocus(e) { setGridNavigatedDate(day.originalDate); (0, _invoke2.default)(predefinedProps, 'onFocus', e, predefinedProps); }, onClick: function onClick(e) { (0, _invoke2.default)(props, 'onDateChange', e, Object.assign({}, props, { value: day, selectedDateRange: dateRangeType !== _dateTimeUtilities.DateRangeType.Day ? dateRange : [day] })); (0, _invoke2.default)(predefinedProps, 'onClick', e, predefinedProps); }, ref: (0, _dateTimeUtilities.compareDates)(gridNavigatedDate, day.originalDate) ? focusDateRef : null }; } }); }; var renderWeekRow = function renderWeekRow(week) { return (0, _map2.default)(week, function (day) { return renderCell(day, renderCellButton(day, week)); }); }; var element = /*#__PURE__*/React.createElement(ElementType, getA11yProps('root', Object.assign({ className: classes.root, ref: ref }, unhandledProps)), (0, _utils.createShorthand)(_DatepickerCalendarHeader.DatepickerCalendarHeader, header, { defaultProps: function defaultProps() { return { label: formatMonthYear(normalizedGridDate, dateFormatting), 'aria-label': formatMonthYear(normalizedGridDate, dateFormatting), disabledNextButton: nextMonthOutOfBounds, disabledPreviousButton: prevMonthOutOfBounds, prevMonthAriaLabel: props.prevMonthAriaLabel, nextMonthAriaLabel: props.nextMonthAriaLabel }; }, overrideProps: function overrideProps(predefinedProps) { return { onPreviousClick: function onPreviousClick(e, data) { changeMonth(false); (0, _invoke2.default)(predefinedProps, 'onPreviousClick', e, data); }, onNextClick: function onNextClick(e, data) { changeMonth(true); (0, _invoke2.default)(predefinedProps, 'onNextClick', e, data); } }; } }), (0, _utils.createShorthand)(_DatepickerCalendarGrid.DatepickerCalendarGrid, calendarGrid, { defaultProps: function defaultProps() { return getA11yProps('calendarGrid', { content: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("thead", null, (0, _utils.createShorthand)(_DatepickerCalendarGridRow.DatepickerCalendarGridRow, calendarGridRow, { defaultProps: function defaultProps() { return getA11yProps('calendarGridRow', { children: (0, _times2.default)(_dateTimeUtilities.DAYS_IN_WEEK, function (dayNumber) { return (0, _utils.createShorthand)(_DatepickerCalendarHeaderCell.DatepickerCalendarHeaderCell, calendarHeaderCell, { defaultProps: function defaultProps() { return getA11yProps('calendarHeaderCell', { 'aria-label': days[(dayNumber + firstDayOfWeek) % _dateTimeUtilities.DAYS_IN_WEEK], content: shortDays[(dayNumber + firstDayOfWeek) % _dateTimeUtilities.DAYS_IN_WEEK], key: dayNumber }); } }); }) }); } })), /*#__PURE__*/React.createElement("tbody", null, (0, _map2.default)(visibleGrid, function (week) { return (0, _utils.createShorthand)(_DatepickerCalendarGridRow.DatepickerCalendarGridRow, calendarGridRow, { defaultProps: function defaultProps() { return getA11yProps('calendarGridRow', { children: renderWeekRow(week), isRowSelectionActive: dateRangeType === _dateTimeUtilities.DateRangeType.Week, key: week[0].key }); } }); }))) }); } })); setEnd(); return element; }); exports.DatepickerCalendar = DatepickerCalendar; DatepickerCalendar.displayName = 'DatepickerCalendar'; DatepickerCalendar.propTypes = Object.assign({}, _utils.commonPropTypes.createCommon(), { calendarCell: customPropTypes.itemShorthand, calendarCellButton: customPropTypes.itemShorthand, calendarHeaderCell: customPropTypes.itemShorthand, header: customPropTypes.itemShorthand, calendarGrid: customPropTypes.itemShorthand, calendarGridRow: customPropTypes.itemShorthand, onDateChange: PropTypes.func, selectedDate: PropTypes.instanceOf(Date), navigatedDate: PropTypes.instanceOf(Date), minDate: PropTypes.instanceOf(Date), maxDate: PropTypes.instanceOf(Date), restrictedDates: PropTypes.arrayOf(PropTypes.instanceOf(Date)), firstDayOfWeek: PropTypes.oneOf(Object.keys(_dateTimeUtilities.DayOfWeek).map(function (name) { return _dateTimeUtilities.DayOfWeek[name]; })), firstWeekOfYear: PropTypes.oneOf(Object.keys(_dateTimeUtilities.FirstWeekOfYear).map(function (name) { return _dateTimeUtilities.FirstWeekOfYear[name]; })), dateRangeType: PropTypes.oneOf(Object.keys(_dateTimeUtilities.DateRangeType).map(function (name) { return _dateTimeUtilities.DateRangeType[name]; })), daysToSelectInDayView: PropTypes.number, today: PropTypes.instanceOf(Date), showWeekNumbers: PropTypes.bool, workWeekDays: PropTypes.arrayOf(PropTypes.oneOf(Object.keys(_dateTimeUtilities.DayOfWeek).map(function (name) { return _dateTimeUtilities.DayOfWeek[name]; }))), weeksToShow: PropTypes.number, formatDay: PropTypes.func, formatYear: PropTypes.func, formatMonthDayYear: PropTypes.func, formatMonthYear: PropTypes.func, parseDate: PropTypes.func, months: PropTypes.arrayOf(PropTypes.string), shortMonths: PropTypes.arrayOf(PropTypes.string), days: PropTypes.arrayOf(PropTypes.string), shortDays: PropTypes.arrayOf(PropTypes.string), isRequiredErrorMessage: PropTypes.string, invalidInputErrorMessage: PropTypes.string, isOutOfBoundsErrorMessage: PropTypes.string, openCalendarTitle: PropTypes.string, inputPlaceholder: PropTypes.string, prevMonthAriaLabel: PropTypes.string, nextMonthAriaLabel: PropTypes.string, prevYearAriaLabel: PropTypes.string, nextYearAriaLabel: PropTypes.string, prevYearRangeAriaLabel: PropTypes.string, nextYearRangeAriaLabel: PropTypes.string, monthPickerHeaderAriaLabel: PropTypes.string, yearPickerHeaderAriaLabel: PropTypes.string, closeButtonAriaLabel: PropTypes.string, weekNumberFormatString: PropTypes.string, selectedDateFormatString: PropTypes.string, todayDateFormatString: PropTypes.string, inputAriaLabel: PropTypes.string, inputBoundedFormatString: PropTypes.string, inputMinBoundedFormatString: PropTypes.string, inputMaxBoundedFormatString: PropTypes.string }); DatepickerCalendar.defaultProps = Object.assign({ accessibility: _accessibility.datepickerCalendarBehavior, firstDayOfWeek: _dateTimeUtilities.DayOfWeek.Monday, firstWeekOfYear: _dateTimeUtilities.FirstWeekOfYear.FirstDay, dateRangeType: _dateTimeUtilities.DateRangeType.Day, header: {}, calendarCell: {}, calendarCellButton: {}, calendarHeaderCell: {}, calendarGrid: {}, calendarGridRow: {} }, _dateTimeUtilities.DEFAULT_CALENDAR_STRINGS); DatepickerCalendar.handledProps = Object.keys(DatepickerCalendar.propTypes); //# sourceMappingURL=DatepickerCalendar.js.map