UNPKG

rsuite

Version:

A suite of react components

130 lines (128 loc) 5.16 kB
'use client'; "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _MonthDropdownItem = _interopRequireDefault(require("./MonthDropdownItem")); var _utils = require("../../internals/utils"); var _date = require("../../internals/utils/date"); var _Windowing = require("../../internals/Windowing"); var _hooks = require("../../internals/hooks"); var _hooks2 = require("../hooks"); var _plainDate = require("../../internals/utils/date/plainDate"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } // Array representing the index of each month const MONTHS_INDEX = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; // The height of each item const ITEM_SIZE = 108; const MonthDropdown = (0, _utils.forwardRef)((props, ref) => { const { as: Component = 'div', className, classPrefix = 'calendar-month-dropdown', limitStartYear, limitEndYear = 5, show, height: defaultHeight = 221, width: defaultWidth = 256, isMonthDisabled, ...rest } = props; const { date = new Date(), targetId, monthDropdownProps } = (0, _hooks2.useCalendar)(); const { prefix, merge, withPrefix } = (0, _hooks.useStyles)(classPrefix); const thisYear = (0, _date.getYear)(new Date()); const startYear = limitStartYear ? thisYear - limitStartYear + 1 : 1900; const rowCount = (0, _react.useMemo)(() => { const endYear = thisYear + limitEndYear; return endYear - startYear; }, [limitEndYear, startYear, thisYear]); const { className: listClassName, itemClassName, as: List, itemAs: Item = 'div', ...restListProps } = monthDropdownProps || {}; const rowRenderer = (0, _react.useCallback)(({ index, style }) => { const selectedMonth = (0, _date.getMonth)(date); const selectedYear = (0, _date.getYear)(date); const year = startYear + index; const isSelectedYear = year === selectedYear; const titleClassName = prefix('year', { 'year-active': isSelectedYear }); return /*#__PURE__*/_react.default.createElement(Item, { role: "row", "aria-label": `${year}`, className: merge(itemClassName, prefix('row'), { 'first-row': index === 0, 'last-row': index === rowCount - 1 }), style: style }, /*#__PURE__*/_react.default.createElement("div", { className: titleClassName, role: "rowheader" }, year), /*#__PURE__*/_react.default.createElement("div", { className: prefix('list') }, MONTHS_INDEX.map(month => { const yearMonth = { year, month: month + 1 }; // TODO: Doma - Should we make a constant pool for optimization? return /*#__PURE__*/_react.default.createElement(_MonthDropdownItem.default, { key: (0, _plainDate.plainYearMonthToString)(yearMonth), yearMonth: yearMonth, disabled: isMonthDisabled?.(yearMonth), active: isSelectedYear && month === selectedMonth }); }))); }, [Item, date, isMonthDisabled, merge, prefix, itemClassName, rowCount, startYear]); const classes = merge(className, withPrefix(), { show }); const initialItemIndex = (0, _date.getYear)(date) - startYear; const initialScrollOffset = ITEM_SIZE * initialItemIndex; if (!show) { return null; } return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({ ref: ref, role: "grid", tabIndex: -1, className: classes, "aria-labelledby": targetId ? `${targetId}-grid-label` : undefined, id: targetId ? `${targetId}-calendar-month-dropdown` : undefined, "data-testid": "calendar-month-dropdown" }, rest), /*#__PURE__*/_react.default.createElement("div", { className: prefix('scroll') }, /*#__PURE__*/_react.default.createElement(_Windowing.AutoSizer, { defaultHeight: defaultHeight, defaultWidth: defaultWidth }, ({ height, width }) => /*#__PURE__*/_react.default.createElement(_Windowing.FixedSizeList, (0, _extends2.default)({ className: merge(prefix('row-wrapper'), listClassName), width: width || defaultWidth, height: height || defaultHeight, itemSize: ITEM_SIZE, itemCount: rowCount, initialScrollOffset: initialScrollOffset, innerElementType: List }, restListProps), rowRenderer)))); }); MonthDropdown.displayName = 'MonthDropdown'; var _default = exports.default = MonthDropdown;