UNPKG

@opensig/opendesign

Version:

84 lines (83 loc) 3.68 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const vue = require("vue"); const dayjs = require("dayjs"); const is = require("../_utils/is.js"); const utils = require("./utils.js"); const NO_RANGE = { isRangeStart: false, isRangeEnd: false, isInRange: false }; function resolveRangeDeps({ rangeStart, rangeEnd, anchorDate, hoverDate }) { return { rangeStart: (rangeStart == null ? void 0 : rangeStart.value) || null, rangeEnd: (rangeEnd == null ? void 0 : rangeEnd.value) || null, anchorDate: (anchorDate == null ? void 0 : anchorDate.value) || null, hoverDate: (hoverDate == null ? void 0 : hoverDate.value) || null }; } function computeIsSelected(date, selectedValue) { if (is.isArray(selectedValue)) { return selectedValue.some((v) => v && date.isSame(v)); } return selectedValue ? date.isSame(selectedValue, "day") : false; } function computeIsDisabled(date, { minDate, maxDate, disabledDateFn }) { if (minDate && date.isBefore(minDate, "day")) return true; if (maxDate && date.isAfter(maxDate, "day")) return true; if (disabledDateFn == null ? void 0 : disabledDateFn({ date: date.toDate(), year: date.year(), month: date.month(), day: date.date() })) return true; return false; } function useCalendar(params) { const { displayYear, displayMonth, selectedDate, dayStartOfWeek, disabledDate, minDate, maxDate, rangeStart, rangeEnd, anchorDate, hoverDate } = params; const today = vue.ref(null); vue.onMounted(() => { today.value = dayjs(); }); const rows = vue.computed(() => { const year = displayYear.value; const month = displayMonth.value; const firstDay = dayjs().year(year).month(month).date(1).startOf("day"); const daysInMonth = firstDay.daysInMonth(); const startDow = firstDay.day(); const leadingBlanks = (startDow - dayStartOfWeek.value + 7) % 7; const todayVal = today.value; const cells = []; const prevMonth = firstDay.subtract(1, "month"); const prevDays = prevMonth.daysInMonth(); for (let i = leadingBlanks - 1; i >= 0; i--) { const d = prevMonth.date(prevDays - i); cells.push(makeCell(d, false, todayVal)); } for (let i = 1; i <= daysInMonth; i++) { const d = firstDay.date(i); cells.push(makeCell(d, true, todayVal)); } const remaining = 42 - cells.length; const nextMonth = firstDay.add(1, "month"); for (let i = 1; i <= remaining; i++) { const d = nextMonth.date(i); cells.push(makeCell(d, false, todayVal)); } const result = []; for (let r = 0; r < 6; r++) { result.push(cells.slice(r * 7, r * 7 + 7)); } return result; }); function makeCell(date, isCurrentMonth, _today) { const isToday = _today ? date.isSame(_today, "day") : false; const isSelected = computeIsSelected(date, vue.toValue(selectedDate)); const isDisabled = computeIsDisabled(date, { minDate: (minDate == null ? void 0 : minDate.value) || null, maxDate: (maxDate == null ? void 0 : maxDate.value) || null, disabledDateFn: disabledDate == null ? void 0 : disabledDate.value }); const rangeState = isCurrentMonth ? utils.computeRangeState({ cell: date, unit: "day", ...resolveRangeDeps({ rangeStart, rangeEnd, anchorDate, hoverDate }) }) : NO_RANGE; return { date, day: date.date(), isCurrentMonth, isToday, isSelected, isDisabled, ...rangeState }; } const weekDayHeaders = vue.computed(() => { const base = [0, 1, 2, 3, 4, 5, 6]; const offset = dayStartOfWeek.value; return [...base.slice(offset), ...base.slice(0, offset)]; }); return { rows, weekDayHeaders }; } exports.useCalendar = useCalendar;