@opensig/opendesign
Version:
84 lines (83 loc) • 3.68 kB
JavaScript
"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;