| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- import { defineComponent, ref, computed, watch, nextTick, openBlock, createElementBlock, unref, normalizeClass, createElementVNode, Fragment, renderList, withKeys, withModifiers, createVNode } from 'vue';
- import dayjs from 'dayjs';
- import { basicMonthTableProps } from '../props/basic-month-table.mjs';
- import { datesInMonth, getValidDateOfMonth } from '../utils.mjs';
- import ElDatePickerCell from './basic-cell-render.mjs';
- import _export_sfc from '../../../../_virtual/plugin-vue_export-helper.mjs';
- import { useNamespace } from '../../../../hooks/use-namespace/index.mjs';
- import { useLocale } from '../../../../hooks/use-locale/index.mjs';
- import { castArray } from '../../../../utils/arrays.mjs';
- import { hasClass } from '../../../../utils/dom/style.mjs';
- const _sfc_main = /* @__PURE__ */ defineComponent({
- __name: "basic-month-table",
- props: basicMonthTableProps,
- emits: ["changerange", "pick", "select"],
- setup(__props, { expose, emit }) {
- const props = __props;
- const ns = useNamespace("month-table");
- const { t, lang } = useLocale();
- const tbodyRef = ref();
- const currentCellRef = ref();
- const months = ref(props.date.locale("en").localeData().monthsShort().map((_) => _.toLowerCase()));
- const tableRows = ref([[], [], []]);
- const lastRow = ref();
- const lastColumn = ref();
- const rows = computed(() => {
- var _a, _b, _c;
- const rows2 = tableRows.value;
- const now = dayjs().locale(lang.value).startOf("month");
- for (let i = 0; i < 3; i++) {
- const row = rows2[i];
- for (let j = 0; j < 4; j++) {
- const cell = row[j] || (row[j] = {
- row: i,
- column: j,
- type: "normal",
- inRange: false,
- start: false,
- end: false,
- text: -1,
- disabled: false,
- isSelected: false,
- customClass: void 0,
- date: void 0,
- dayjs: void 0,
- isCurrent: void 0,
- selected: void 0,
- renderText: void 0,
- timestamp: void 0
- });
- cell.type = "normal";
- const index = i * 4 + j;
- const calTime = props.date.startOf("year").month(index);
- const calEndDate = props.rangeState.endDate || props.maxDate || props.rangeState.selecting && props.minDate || null;
- cell.inRange = !!(props.minDate && calTime.isSameOrAfter(props.minDate, "month") && calEndDate && calTime.isSameOrBefore(calEndDate, "month")) || !!(props.minDate && calTime.isSameOrBefore(props.minDate, "month") && calEndDate && calTime.isSameOrAfter(calEndDate, "month"));
- if ((_a = props.minDate) == null ? void 0 : _a.isSameOrAfter(calEndDate)) {
- cell.start = !!(calEndDate && calTime.isSame(calEndDate, "month"));
- cell.end = props.minDate && calTime.isSame(props.minDate, "month");
- } else {
- cell.start = !!(props.minDate && calTime.isSame(props.minDate, "month"));
- cell.end = !!(calEndDate && calTime.isSame(calEndDate, "month"));
- }
- const isToday = now.isSame(calTime);
- if (isToday) {
- cell.type = "today";
- }
- const cellDate = calTime.toDate();
- cell.text = index;
- cell.disabled = ((_b = props.disabledDate) == null ? void 0 : _b.call(props, cellDate)) || false;
- cell.date = cellDate;
- cell.customClass = (_c = props.cellClassName) == null ? void 0 : _c.call(props, cellDate);
- cell.dayjs = calTime;
- cell.timestamp = calTime.valueOf();
- cell.isSelected = isSelectedCell(cell);
- }
- }
- return rows2;
- });
- const focus = () => {
- var _a;
- (_a = currentCellRef.value) == null ? void 0 : _a.focus();
- };
- const getCellStyle = (cell) => {
- const style = {};
- const year = props.date.year();
- const today = /* @__PURE__ */ new Date();
- const month = cell.text;
- style.disabled = props.disabled || (props.disabledDate ? datesInMonth(props.date, year, month, lang.value).every(props.disabledDate) : false);
- style.current = castArray(props.parsedValue).findIndex((date) => dayjs.isDayjs(date) && date.year() === year && date.month() === month) >= 0;
- style.today = today.getFullYear() === year && today.getMonth() === month;
- if (cell.customClass) {
- style[cell.customClass] = true;
- }
- if (cell.inRange) {
- style["in-range"] = true;
- if (cell.start) {
- style["start-date"] = true;
- }
- if (cell.end) {
- style["end-date"] = true;
- }
- }
- return style;
- };
- const isSelectedCell = (cell) => {
- const year = props.date.year();
- const month = cell.text;
- return castArray(props.date).findIndex((date) => date.year() === year && date.month() === month) >= 0;
- };
- const handleMouseMove = (event) => {
- var _a;
- if (!props.rangeState.selecting)
- return;
- let target = event.target;
- if (target.tagName === "SPAN") {
- target = (_a = target.parentNode) == null ? void 0 : _a.parentNode;
- }
- if (target.tagName === "DIV") {
- target = target.parentNode;
- }
- if (target.tagName !== "TD")
- return;
- const row = target.parentNode.rowIndex;
- const column = target.cellIndex;
- if (rows.value[row][column].disabled)
- return;
- if (row !== lastRow.value || column !== lastColumn.value) {
- lastRow.value = row;
- lastColumn.value = column;
- emit("changerange", {
- selecting: true,
- endDate: props.date.startOf("year").month(row * 4 + column)
- });
- }
- };
- const handleMonthTableClick = (event) => {
- var _a;
- if (props.disabled)
- return;
- const target = (_a = event.target) == null ? void 0 : _a.closest("td");
- if ((target == null ? void 0 : target.tagName) !== "TD")
- return;
- if (hasClass(target, "disabled"))
- return;
- const column = target.cellIndex;
- const row = target.parentNode.rowIndex;
- const month = row * 4 + column;
- const newDate = props.date.startOf("year").month(month);
- if (props.selectionMode === "months") {
- if (event.type === "keydown") {
- emit("pick", castArray(props.parsedValue), false);
- return;
- }
- const newMonth = getValidDateOfMonth(props.date, props.date.year(), month, lang.value, props.disabledDate);
- const newValue = hasClass(target, "current") ? castArray(props.parsedValue).filter((d) => (d == null ? void 0 : d.year()) !== newMonth.year() || (d == null ? void 0 : d.month()) !== newMonth.month()) : castArray(props.parsedValue).concat([dayjs(newMonth)]);
- emit("pick", newValue);
- } else if (props.selectionMode === "range") {
- if (!props.rangeState.selecting) {
- emit("pick", { minDate: newDate, maxDate: null });
- emit("select", true);
- } else {
- if (props.minDate && newDate >= props.minDate) {
- emit("pick", { minDate: props.minDate, maxDate: newDate });
- } else {
- emit("pick", { minDate: newDate, maxDate: props.minDate });
- }
- emit("select", false);
- }
- } else {
- emit("pick", month);
- }
- };
- watch(() => props.date, async () => {
- var _a, _b;
- if ((_a = tbodyRef.value) == null ? void 0 : _a.contains(document.activeElement)) {
- await nextTick();
- (_b = currentCellRef.value) == null ? void 0 : _b.focus();
- }
- });
- expose({
- focus
- });
- return (_ctx, _cache) => {
- return openBlock(), createElementBlock("table", {
- role: "grid",
- "aria-label": unref(t)("el.datepicker.monthTablePrompt"),
- class: normalizeClass(unref(ns).b()),
- onClick: handleMonthTableClick,
- onMousemove: handleMouseMove
- }, [
- createElementVNode("tbody", {
- ref_key: "tbodyRef",
- ref: tbodyRef
- }, [
- (openBlock(true), createElementBlock(Fragment, null, renderList(unref(rows), (row, key) => {
- return openBlock(), createElementBlock("tr", { key }, [
- (openBlock(true), createElementBlock(Fragment, null, renderList(row, (cell, key_) => {
- return openBlock(), createElementBlock("td", {
- key: key_,
- ref_for: true,
- ref: (el) => cell.isSelected && (currentCellRef.value = el),
- class: normalizeClass(getCellStyle(cell)),
- "aria-selected": !!cell.isSelected,
- "aria-label": unref(t)(`el.datepicker.month${+cell.text + 1}`),
- tabindex: cell.isSelected ? 0 : -1,
- onKeydown: [
- withKeys(withModifiers(handleMonthTableClick, ["prevent", "stop"]), ["space"]),
- withKeys(withModifiers(handleMonthTableClick, ["prevent", "stop"]), ["enter"])
- ]
- }, [
- createVNode(unref(ElDatePickerCell), {
- cell: {
- ...cell,
- renderText: unref(t)("el.datepicker.months." + months.value[cell.text])
- }
- }, null, 8, ["cell"])
- ], 42, ["aria-selected", "aria-label", "tabindex", "onKeydown"]);
- }), 128))
- ]);
- }), 128))
- ], 512)
- ], 42, ["aria-label"]);
- };
- }
- });
- var MonthTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "basic-month-table.vue"]]);
- export { MonthTable as default };
- //# sourceMappingURL=basic-month-table.mjs.map
|