UNPKG

element-plus

Version:

A Component Library for Vue3.0

428 lines (415 loc) 14.2 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var locale = require('../locale'); var ElButton = require('../el-button'); var ElButtonGroup = require('../el-button-group'); var vue = require('vue'); var dayjs = require('dayjs'); var localeData = require('dayjs/plugin/localeData'); var timePicker = require('../el-time-picker'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var ElButton__default = /*#__PURE__*/_interopDefaultLegacy(ElButton); var ElButtonGroup__default = /*#__PURE__*/_interopDefaultLegacy(ElButtonGroup); var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs); var localeData__default = /*#__PURE__*/_interopDefaultLegacy(localeData); dayjs__default['default'].extend(localeData__default['default']); const getPrevMonthLastDays = (date, amount) => { const lastDay = date.subtract(1, "month").endOf("month").date(); return timePicker.rangeArr(amount).map((_, index) => lastDay - (amount - index - 1)); }; const getMonthDays = (date) => { const days = date.daysInMonth(); return timePicker.rangeArr(days).map((_, index) => index + 1); }; var script = vue.defineComponent({ props: { selectedDay: { type: Object }, range: { type: Array }, date: { type: Object }, hideHeader: { type: Boolean } }, emits: ["pick"], setup(props, ctx) { const WEEK_DAYS = vue.ref(dayjs__default['default']().localeData().weekdaysShort()); const now = dayjs__default['default'](); const firstDayOfWeek = now.$locale().weekStart || 0; const toNestedArr = (days) => { return timePicker.rangeArr(days.length / 7).map((_, index) => { const start = index * 7; return days.slice(start, start + 7); }); }; const getFormattedDate = (day, type) => { let result; if (type === "prev") { result = props.date.startOf("month").subtract(1, "month").date(day); } else if (type === "next") { result = props.date.startOf("month").add(1, "month").date(day); } else { result = props.date.date(day); } return result; }; const getCellClass = ({ text, type }) => { const classes = [type]; if (type === "current") { const date_ = getFormattedDate(text, type); if (date_.isSame(props.selectedDay, "day")) { classes.push("is-selected"); } if (date_.isSame(now, "day")) { classes.push("is-today"); } } return classes; }; const pickDay = ({ text, type }) => { const date = getFormattedDate(text, type); ctx.emit("pick", date); }; const getSlotData = ({ text, type }) => { const day = getFormattedDate(text, type); return { isSelected: day.isSame(props.selectedDay), type: `${type}-month`, day: day.format("YYYY-MM-DD"), date: day.toDate() }; }; const isInRange = vue.computed(() => { return props.range && props.range.length; }); const rows = vue.computed(() => { let days = []; if (isInRange.value) { const [start, end] = props.range; const currentMonthRange = timePicker.rangeArr(end.date() - start.date() + 1).map((_, index) => ({ text: start.date() + index, type: "current" })); let remaining = currentMonthRange.length % 7; remaining = remaining === 0 ? 0 : 7 - remaining; const nextMonthRange = timePicker.rangeArr(remaining).map((_, index) => ({ text: index + 1, type: "next" })); days = currentMonthRange.concat(nextMonthRange); } else { const firstDay = props.date.startOf("month").day() || 7; const prevMonthDays = getPrevMonthLastDays(props.date, firstDay - firstDayOfWeek).map((day) => ({ text: day, type: "prev" })); const currentMonthDays = getMonthDays(props.date).map((day) => ({ text: day, type: "current" })); days = [...prevMonthDays, ...currentMonthDays]; const nextMonthDays = timePicker.rangeArr(42 - days.length).map((_, index) => ({ text: index + 1, type: "next" })); days = days.concat(nextMonthDays); } return toNestedArr(days); }); const weekDays = vue.computed(() => { const start = firstDayOfWeek; if (start === 0) { return WEEK_DAYS.value; } else { return WEEK_DAYS.value.slice(start).concat(WEEK_DAYS.value.slice(0, start)); } }); return { isInRange, weekDays, rows, getCellClass, pickDay, getSlotData }; } }); const _hoisted_1 = { key: 0 }; const _hoisted_2 = { class: "el-calendar-day" }; function render(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createBlock("table", { class: { "el-calendar-table": true, "is-range": _ctx.isInRange }, cellspacing: "0", cellpadding: "0" }, [ !_ctx.hideHeader ? (vue.openBlock(), vue.createBlock("thead", _hoisted_1, [ (vue.openBlock(true), vue.createBlock(vue.Fragment, null, vue.renderList(_ctx.weekDays, (day) => { return vue.openBlock(), vue.createBlock("th", { key: day }, vue.toDisplayString(day), 1); }), 128)) ])) : vue.createCommentVNode("v-if", true), vue.createVNode("tbody", null, [ (vue.openBlock(true), vue.createBlock(vue.Fragment, null, vue.renderList(_ctx.rows, (row, index) => { return vue.openBlock(), vue.createBlock("tr", { key: index, class: { "el-calendar-table__row": true, "el-calendar-table__row--hide-border": index === 0 && _ctx.hideHeader } }, [ (vue.openBlock(true), vue.createBlock(vue.Fragment, null, vue.renderList(row, (cell, key) => { return vue.openBlock(), vue.createBlock("td", { key, class: _ctx.getCellClass(cell), onClick: ($event) => _ctx.pickDay(cell) }, [ vue.createVNode("div", _hoisted_2, [ vue.renderSlot(_ctx.$slots, "dateCell", { data: _ctx.getSlotData(cell) }, () => [ vue.createVNode("span", null, vue.toDisplayString(cell.text), 1) ]) ]) ], 10, ["onClick"]); }), 128)) ], 2); }), 128)) ]) ], 2); } script.render = render; script.__file = "packages/calendar/src/date-table.vue"; var script$1 = vue.defineComponent({ name: "ElCalendar", components: { DateTable: script, ElButton: ElButton__default['default'], ElButtonGroup: ElButtonGroup__default['default'] }, props: { modelValue: { type: Date }, range: { type: Array, validator: (range) => { if (Array.isArray(range)) { return range.length === 2 && range.every((item) => item instanceof Date); } return false; } } }, emits: ["input", "update:modelValue"], setup(props, ctx) { const selectedDay = vue.ref(null); const now = dayjs__default['default'](); const prevMonthDayjs = vue.computed(() => { return date.value.subtract(1, "month"); }); const curMonthDatePrefix = vue.computed(() => { return dayjs__default['default'](date.value).format("YYYY-MM"); }); const nextMonthDayjs = vue.computed(() => { return date.value.add(1, "month"); }); const i18nDate = vue.computed(() => { const pickedMonth = `el.datepicker.month${date.value.format("M")}`; return `${date.value.year()} ${locale.t("el.datepicker.year")} ${locale.t(pickedMonth)}`; }); const realSelectedDay = vue.computed({ get() { if (!props.modelValue) return selectedDay.value; return date.value; }, set(val) { selectedDay.value = val; const result = val.toDate(); ctx.emit("input", result); ctx.emit("update:modelValue", result); } }); const date = vue.computed(() => { if (!props.modelValue) { if (realSelectedDay.value) { return realSelectedDay.value; } else if (validatedRange.value.length) { return validatedRange.value[0][0]; } return now; } else { return dayjs__default['default'](props.modelValue); } }); const validatedRange = vue.computed(() => { if (!props.range) return []; const rangeArrDayjs = props.range.map((_) => dayjs__default['default'](_)); const [startDayjs, endDayjs] = rangeArrDayjs; if (startDayjs.isAfter(endDayjs)) { console.warn("[ElementCalendar]end time should be greater than start time"); return []; } if (startDayjs.isSame(endDayjs, "month")) { return [[ startDayjs.startOf("week"), endDayjs.endOf("week") ]]; } else { if (startDayjs.add(1, "month").month() !== endDayjs.month()) { console.warn("[ElementCalendar]start time and end time interval must not exceed two months"); return []; } const endMonthFirstDay = endDayjs.startOf("month"); const endMonthFirstWeekDay = endMonthFirstDay.startOf("week"); let endMonthStart = endMonthFirstDay; if (!endMonthFirstDay.isSame(endMonthFirstWeekDay, "month")) { endMonthStart = endMonthFirstDay.endOf("week").add(1, "day"); } return [ [ startDayjs.startOf("week"), startDayjs.endOf("month") ], [ endMonthStart, endDayjs.endOf("week") ] ]; } }); const pickDay = (day) => { realSelectedDay.value = day; }; const selectDate = (type) => { let day; if (type === "prev-month") { day = prevMonthDayjs.value; } else if (type === "next-month") { day = nextMonthDayjs.value; } else { day = now; } if (day.isSame(date.value, "day")) return; pickDay(day); }; return { selectedDay, curMonthDatePrefix, i18nDate, realSelectedDay, date, validatedRange, pickDay, selectDate, t: locale.t }; } }); const _hoisted_1$1 = { class: "el-calendar" }; const _hoisted_2$1 = { class: "el-calendar__header" }; const _hoisted_3 = { class: "el-calendar__title" }; const _hoisted_4 = { key: 0, class: "el-calendar__button-group" }; const _hoisted_5 = { key: 0, class: "el-calendar__body" }; const _hoisted_6 = { key: 1, class: "el-calendar__body" }; function render$1(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_button = vue.resolveComponent("el-button"); const _component_el_button_group = vue.resolveComponent("el-button-group"); const _component_date_table = vue.resolveComponent("date-table"); return vue.openBlock(), vue.createBlock("div", _hoisted_1$1, [ vue.createVNode("div", _hoisted_2$1, [ vue.createVNode("div", _hoisted_3, vue.toDisplayString(_ctx.i18nDate), 1), _ctx.validatedRange.length === 0 ? (vue.openBlock(), vue.createBlock("div", _hoisted_4, [ vue.createVNode(_component_el_button_group, null, { default: vue.withCtx(() => [ vue.createVNode(_component_el_button, { size: "mini", onClick: _cache[1] || (_cache[1] = ($event) => _ctx.selectDate("prev-month")) }, { default: vue.withCtx(() => [ vue.createTextVNode(vue.toDisplayString(_ctx.t("el.datepicker.prevMonth")), 1) ]), _: 1 }), vue.createVNode(_component_el_button, { size: "mini", onClick: _cache[2] || (_cache[2] = ($event) => _ctx.selectDate("today")) }, { default: vue.withCtx(() => [ vue.createTextVNode(vue.toDisplayString(_ctx.t("el.datepicker.today")), 1) ]), _: 1 }), vue.createVNode(_component_el_button, { size: "mini", onClick: _cache[3] || (_cache[3] = ($event) => _ctx.selectDate("next-month")) }, { default: vue.withCtx(() => [ vue.createTextVNode(vue.toDisplayString(_ctx.t("el.datepicker.nextMonth")), 1) ]), _: 1 }) ]), _: 1 }) ])) : vue.createCommentVNode("v-if", true) ]), _ctx.validatedRange.length === 0 ? (vue.openBlock(), vue.createBlock("div", _hoisted_5, [ vue.createVNode(_component_date_table, { date: _ctx.date, "selected-day": _ctx.realSelectedDay, onPick: _ctx.pickDay }, vue.createSlots({ _: 2 }, [ _ctx.$slots.dateCell ? { name: "dateCell", fn: vue.withCtx((data) => [ vue.renderSlot(_ctx.$slots, "dateCell", data) ]) } : void 0 ]), 1032, ["date", "selected-day", "onPick"]) ])) : (vue.openBlock(), vue.createBlock("div", _hoisted_6, [ (vue.openBlock(true), vue.createBlock(vue.Fragment, null, vue.renderList(_ctx.validatedRange, (range_, index) => { return vue.openBlock(), vue.createBlock(_component_date_table, { key: index, date: range_[0], "selected-day": _ctx.realSelectedDay, range: range_, "hide-header": index !== 0, onPick: _ctx.pickDay }, vue.createSlots({ _: 2 }, [ _ctx.$slots.dateCell ? { name: "dateCell", fn: vue.withCtx((data) => [ vue.renderSlot(_ctx.$slots, "dateCell", data) ]) } : void 0 ]), 1032, ["date", "selected-day", "range", "hide-header", "onPick"]); }), 128)) ])) ]); } script$1.render = render$1; script$1.__file = "packages/calendar/src/index.vue"; script$1.install = (app) => { app.component(script$1.name, script$1); }; const _Calendar = script$1; exports.default = _Calendar;