@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
154 lines (153 loc) • 5.56 kB
JavaScript
"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const jsxRuntime = require("react/jsx-runtime");
const React = require("react");
const keyboardUtils = require("../../utils/keyboardUtils.cjs");
const setId = require("../../utils/setId.cjs");
const CalendarHeader = require("../CalendarHeader/CalendarHeader.cjs");
const model = require("../model.cjs");
const utils = require("../utils.cjs");
const CalendarCell = require("./CalendarCell.cjs");
const SingleCalendar_styles = require("./SingleCalendar.styles.cjs");
const ComposedNavigation = require("../CalendarNavigation/ComposedNavigation/ComposedNavigation.cjs");
const MonthSelector = require("../CalendarNavigation/MonthSelector/MonthSelector.cjs");
const Panel = require("../../Panel/Panel.cjs");
const Typography = require("../../Typography/Typography.cjs");
const HvSingleCalendar = ({
classes: classesProp,
className,
id,
locale = utils.DEFAULT_LOCALE,
value,
visibleMonth,
visibleYear,
minimumDate,
maximumDate,
onChange,
onInputChange,
onVisibleDateChange,
showEndDate,
showDayOfWeek,
invalidDateLabel,
children,
...others
}) => {
const { classes, cx } = SingleCalendar_styles.useClasses(classesProp);
const today = /* @__PURE__ */ new Date();
const localValue = value ?? today;
const [calViewMode, setCalViewMode] = React.useState("calendar");
const rangeMode = utils.isRange(localValue);
const isDateSelectionMode = rangeMode && !utils.isDate(localValue.endDate);
const calModel = rangeMode ? model.generateCalendarModel(localValue.startDate, visibleMonth, visibleYear) : model.generateCalendarModel(localValue, visibleMonth, visibleYear);
const firstDayOfCurrentMonth = new Date(calModel.year, calModel.month - 1, 1);
const firstDayOfCurrentMonthTime = firstDayOfCurrentMonth.getTime();
const listWeekdayNames = React.useMemo(() => utils.getWeekdayNamesList(locale), [locale]);
const handleChange = (event, date) => {
event?.preventDefault();
onChange?.(event, date);
};
const handleInputChange = (event, date) => {
event?.preventDefault();
onInputChange?.(event, date);
};
const getNavChild = (event, siblings, i) => {
if (keyboardUtils.isKey(event, "ArrowLeft")) return siblings[i - 1];
if (keyboardUtils.isKey(event, "ArrowRight")) return siblings[i + 1];
if (keyboardUtils.isKey(event, "ArrowUp")) return siblings[i - 7];
if (keyboardUtils.isKey(event, "ArrowDown")) return siblings[i + 7];
return void 0;
};
const handleKeyDown = (event) => {
const el = document?.activeElement;
const parent = el?.parentElement?.parentElement;
const siblings = parent != null ? Array.from(
parent.getElementsByClassName(classes.cellContainer)
) : [];
const elIndex = el ? siblings.indexOf(el) : 0;
if (keyboardUtils.isKey(event, "Enter")) {
el.focus();
return;
}
const child = getNavChild(event, siblings, elIndex);
if (child) {
const inMonth = child.getAttribute("data-in-month");
if (inMonth === "true") {
event?.preventDefault();
child?.focus();
}
}
};
const renderWeekLabel = (dayName, index) => /* @__PURE__ */ jsxRuntime.jsx(Typography.HvTypography, { variant: "label", className: classes.calendarDay, children: dayName }, index);
const renderCalendarDate = (currentDate) => {
return /* @__PURE__ */ jsxRuntime.jsx(
CalendarCell.HvCalendarCell,
{
classes,
tabIndex: currentDate.getTime() === firstDayOfCurrentMonthTime ? 0 : -1,
onChange: handleChange,
onKeyDown: handleKeyDown,
value: currentDate,
today,
calendarValue: localValue,
rangeMode,
isDateSelectionMode,
locale,
firstDayOfCurrentMonth,
maximumDate,
minimumDate
},
currentDate.toString()
);
};
return /* @__PURE__ */ jsxRuntime.jsxs(Panel.HvPanel, { id, className: cx(classes.root, className), ...others, children: [
/* @__PURE__ */ jsxRuntime.jsx(
CalendarHeader.HvCalendarHeader,
{
id: setId.setId(id, "header"),
locale,
value,
onChange: handleInputChange,
showEndDate: showEndDate && !isDateSelectionMode,
showDayOfWeek,
invalidDateLabel
}
),
calViewMode === "calendar" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
/* @__PURE__ */ jsxRuntime.jsx(
ComposedNavigation.HvComposedNavigation,
{
id,
locale,
onChange: onVisibleDateChange,
onViewModeChange: setCalViewMode,
visibleYear: visibleYear || today.getFullYear(),
visibleMonth: visibleMonth || today.getMonth() + 1
}
),
/* @__PURE__ */ jsxRuntime.jsxs(
"div",
{
className: classes.calendarGrid,
"aria-controls": CalendarHeader.HvCalendarHeader?.[0]?.id,
children: [
listWeekdayNames.map(renderWeekLabel),
calModel.dates.map(renderCalendarDate)
]
}
)
] }),
calViewMode === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(
MonthSelector.HvMonthSelector,
{
id,
locale,
onChange: onVisibleDateChange,
onViewModeChange: setCalViewMode,
visibleMonth: visibleMonth || today.getMonth() + 1,
rangeMode
}
)
] });
};
exports.singleCalendarClasses = SingleCalendar_styles.staticClasses;
exports.HvSingleCalendar = HvSingleCalendar;