UNPKG

@atlaskit/calendar

Version:

An interactive calendar for date selection experiences.

270 lines (269 loc) 12.1 kB
/* calendar.tsx generated by @compiled/babel-plugin v0.36.1 */ import _extends from "@babel/runtime/helpers/extends"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import "./calendar.compiled.css"; import * as React from 'react'; import { ax, ix } from "@compiled/react/runtime"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import { forwardRef, memo, useState } from 'react'; import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler'; import noop from '@atlaskit/ds-lib/noop'; import { useId } from '@atlaskit/ds-lib/use-id'; import { Box, Stack } from '@atlaskit/primitives/compiled'; import Header from './internal/components/header'; import WeekDaysComponent from './internal/components/week-days'; import WeekHeaderComponent from './internal/components/week-header'; import { blankStringArray } from './internal/constants'; import useControlledDateState from './internal/hooks/use-controlled-date-state'; import useFocusing from './internal/hooks/use-focusing'; import useGetWeeks from './internal/hooks/use-get-weeks'; import useHandleDateChange from './internal/hooks/use-handle-date-change'; import useHandleDateSelect from './internal/hooks/use-handle-date-select'; import useLocale from './internal/hooks/use-locale'; var styles = { box: "_1e0c1o8l _uiztglyw" }; var analyticsAttributes = { componentName: 'calendar', packageName: "@atlaskit/calendar", packageVersion: "17.1.8" }; var InnerCalendar = /*#__PURE__*/forwardRef(function Calendar(_ref, ref) { var day = _ref.day, _ref$defaultDay = _ref.defaultDay, defaultDay = _ref$defaultDay === void 0 ? 0 : _ref$defaultDay, _ref$defaultMonth = _ref.defaultMonth, defaultMonth = _ref$defaultMonth === void 0 ? 0 : _ref$defaultMonth, _ref$defaultPreviousl = _ref.defaultPreviouslySelected, defaultPreviouslySelected = _ref$defaultPreviousl === void 0 ? blankStringArray : _ref$defaultPreviousl, _ref$defaultSelected = _ref.defaultSelected, defaultSelected = _ref$defaultSelected === void 0 ? blankStringArray : _ref$defaultSelected, _ref$defaultYear = _ref.defaultYear, defaultYear = _ref$defaultYear === void 0 ? 0 : _ref$defaultYear, disabled = _ref.disabled, disabledDateFilter = _ref.disabledDateFilter, minDate = _ref.minDate, maxDate = _ref.maxDate, month = _ref.month, nextMonthLabel = _ref.nextMonthLabel, _ref$onBlur = _ref.onBlur, onBlur = _ref$onBlur === void 0 ? noop : _ref$onBlur, _ref$onChange = _ref.onChange, onChange = _ref$onChange === void 0 ? noop : _ref$onChange, _ref$onFocus = _ref.onFocus, onFocus = _ref$onFocus === void 0 ? noop : _ref$onFocus, _ref$onSelect = _ref.onSelect, onSelect = _ref$onSelect === void 0 ? noop : _ref$onSelect, previouslySelected = _ref.previouslySelected, previousMonthLabel = _ref.previousMonthLabel, selected = _ref.selected, _ref$shouldSetFocusOn = _ref.shouldSetFocusOnCurrentDay, shouldSetFocusOnCurrentDay = _ref$shouldSetFocusOn === void 0 ? false : _ref$shouldSetFocusOn, today = _ref.today, _ref$locale = _ref.locale, locale = _ref$locale === void 0 ? 'en-US' : _ref$locale, year = _ref.year, analyticsContext = _ref.analyticsContext, _ref$weekStartDay = _ref.weekStartDay, weekStartDay = _ref$weekStartDay === void 0 ? 0 : _ref$weekStartDay, testId = _ref.testId, className = _ref.className, style = _ref.style, _ref$tabIndex = _ref.tabIndex, tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex; var _useControlledDateSta = useControlledDateState({ day: day, defaultDay: defaultDay, month: month, defaultMonth: defaultMonth, year: year, defaultYear: defaultYear, today: today, selected: selected, defaultSelected: defaultSelected, previouslySelected: previouslySelected, defaultPreviouslySelected: defaultPreviouslySelected }), _useControlledDateSta2 = _slicedToArray(_useControlledDateSta.day, 2), dayValue = _useControlledDateSta2[0], setDayValue = _useControlledDateSta2[1], _useControlledDateSta3 = _slicedToArray(_useControlledDateSta.month, 2), monthValue = _useControlledDateSta3[0], setMonthValue = _useControlledDateSta3[1], _useControlledDateSta4 = _slicedToArray(_useControlledDateSta.year, 2), yearValue = _useControlledDateSta4[0], setYearValue = _useControlledDateSta4[1], _useControlledDateSta5 = _slicedToArray(_useControlledDateSta.today, 1), todayValue = _useControlledDateSta5[0], _useControlledDateSta6 = _slicedToArray(_useControlledDateSta.selected, 2), selectedValue = _useControlledDateSta6[0], setSelectedValue = _useControlledDateSta6[1], _useControlledDateSta7 = _slicedToArray(_useControlledDateSta.previous, 2), previouslySelectedValue = _useControlledDateSta7[0], setPreviouslySelectedValue = _useControlledDateSta7[1]; var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), shouldSetFocus = _useState2[0], setShouldSetFocus = _useState2[1]; var onChangeWithAnalytics = usePlatformLeafEventHandler(_objectSpread({ fn: onChange, action: 'changed', analyticsData: analyticsContext }, analyticsAttributes)); var _useHandleDateChange = useHandleDateChange({ day: [dayValue, setDayValue], month: [monthValue, setMonthValue], year: [yearValue, setYearValue], shouldSetFocus: [shouldSetFocus, setShouldSetFocus], onChange: onChangeWithAnalytics }), navigate = _useHandleDateChange.navigate, handleClickNextMonth = _useHandleDateChange.handleClickNextMonth, handleClickNextYear = _useHandleDateChange.handleClickNextYear, handleClickPrevMonth = _useHandleDateChange.handleClickPrevMonth, handleClickPrevYear = _useHandleDateChange.handleClickPrevYear; var onSelectWithAnalytics = usePlatformLeafEventHandler(_objectSpread({ fn: onSelect, action: 'selected', analyticsData: analyticsContext }, analyticsAttributes)); var _useHandleDateSelect = useHandleDateSelect({ day: [dayValue, setDayValue], month: [monthValue, setMonthValue], year: [yearValue, setYearValue], selected: [selectedValue, setSelectedValue], previous: [, setPreviouslySelectedValue], onSelect: onSelectWithAnalytics, navigate: navigate }), handleClickDay = _useHandleDateSelect.handleClickDay, handleContainerKeyDown = _useHandleDateSelect.handleContainerKeyDown; var _useFocusing = useFocusing({ onFocus: onFocus, onBlur: onBlur }), handleContainerBlur = _useFocusing.handleContainerBlur, handleContainerFocus = _useFocusing.handleContainerFocus; var _useLocale = useLocale({ locale: locale, weekStartDay: weekStartDay }), monthsLong = _useLocale.monthsLong, daysShort = _useLocale.daysShort, daysLong = _useLocale.daysLong; var weeks = useGetWeeks({ day: dayValue, month: monthValue, year: yearValue, today: todayValue, selected: selectedValue, previouslySelected: previouslySelectedValue, disabled: disabled, disabledDateFilter: disabledDateFilter, minDate: minDate, maxDate: maxDate, daysLong: daysLong, weekStartDay: weekStartDay }); var getNextMonthHeading = function getNextMonthHeading() { // Next month is (currentMonth - 1) + 1, or just currentMonth in this // instance. var nextMonth = monthValue % 12; var showNextYear = monthValue === 12; return "".concat(monthsLong[nextMonth], " ").concat(showNextYear ? yearValue + 1 : yearValue); }; var getNextYearHeading = function getNextYearHeading() { // Months are held in Date object as zero-indexed var thisMonth = (monthValue - 1) % 12; var nextYear = yearValue + 1; return "".concat(monthsLong[thisMonth], " ").concat(nextYear); }; var getPreviousMonthHeading = function getPreviousMonthHeading() { // Previous month is (monthValue - 1) - 1. Need to add 12 so the modulo // works as expected and stays positive. var previousMonth = (monthValue + 12 - 2) % 12; var showPreviousYear = monthValue === 1; return "".concat(monthsLong[previousMonth], " ").concat(showPreviousYear ? yearValue - 1 : yearValue); }; var getPreviousYearHeading = function getPreviousYearHeading() { // Months are held in Date object as zero-indexed var thisMonth = (monthValue - 1) % 12; var previousYear = yearValue - 1; return "".concat(monthsLong[thisMonth], " ").concat(previousYear); }; var headerId = useId(); return ( /*#__PURE__*/ // eslint-disable-next-line jsx-a11y/no-static-element-interactions React.createElement("div", { // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766 className: className // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766 , style: style, onBlur: handleContainerBlur, onFocus: handleContainerFocus, "data-testid": testId && "".concat(testId, "--container"), ref: ref }, /*#__PURE__*/React.createElement(Box, { xcss: styles.box, padding: "space.200", "aria-label": "calendar", testId: testId && "".concat(testId, "--calendar") }, /*#__PURE__*/React.createElement(Stack, { space: "space.150" }, /*#__PURE__*/React.createElement(Header // The month number needs to be translated to index in the month // name array e.g. 1 (January) -> 0 , { monthLongTitle: monthsLong[monthValue - 1], year: yearValue, nextMonthLabel: nextMonthLabel, previousMonthLabel: previousMonthLabel, nextMonthHeading: getNextMonthHeading(), nextYearHeading: getNextYearHeading(), previousMonthHeading: getPreviousMonthHeading(), previousYearHeading: getPreviousYearHeading(), handleClickNextMonth: handleClickNextMonth, handleClickNextYear: handleClickNextYear, handleClickPrevMonth: handleClickPrevMonth, handleClickPrevYear: handleClickPrevYear, headerId: headerId, tabIndex: tabIndex, testId: testId }), /*#__PURE__*/React.createElement(Box, { role: "grid", onKeyDown: handleContainerKeyDown, "aria-labelledby": headerId, testId: testId && "".concat(testId, "--calendar-dates") }, /*#__PURE__*/React.createElement(WeekHeaderComponent, { daysShort: daysShort, testId: testId }), /*#__PURE__*/React.createElement(WeekDaysComponent, { weeks: weeks, handleClickDay: handleClickDay, monthsLong: monthsLong, shouldSetFocus: shouldSetFocus || shouldSetFocusOnCurrentDay, tabIndex: tabIndex, testId: testId }))))) ); }); /** * __Calendar__ * * A calendar is used for date selection. * * - [Examples](https://atlassian.design/components/calendar/examples) * - [Code](https://atlassian.design/components/calendar/code) * - [Usage](https://atlassian.design/components/calendar/usage) */ var Calendar = /*#__PURE__*/memo( /*#__PURE__*/forwardRef(function Calendar(props, ref) { return /*#__PURE__*/React.createElement(InnerCalendar, _extends({}, props, { ref: ref })); })); Calendar.displayName = 'Calendar'; export default Calendar;