element-plus
Version:
A Component Library for Vue 3
1 lines • 14.2 kB
Source Map (JSON)
{"version":3,"file":"calendar2.mjs","sources":["../../../../../../packages/components/calendar/src/calendar.vue"],"sourcesContent":["<template>\n <div :class=\"ns.b()\">\n <div :class=\"ns.e('header')\">\n <slot name=\"header\" :date=\"i18nDate\">\n <div :class=\"ns.e('title')\">{{ i18nDate }}</div>\n <div v-if=\"validatedRange.length === 0\" :class=\"ns.e('button-group')\">\n <el-button-group>\n <el-button size=\"small\" @click=\"selectDate('prev-month')\">\n {{ t('el.datepicker.prevMonth') }}\n </el-button>\n <el-button size=\"small\" @click=\"selectDate('today')\">\n {{ t('el.datepicker.today') }}\n </el-button>\n <el-button size=\"small\" @click=\"selectDate('next-month')\">\n {{ t('el.datepicker.nextMonth') }}\n </el-button>\n </el-button-group>\n </div>\n </slot>\n </div>\n <div v-if=\"validatedRange.length === 0\" :class=\"ns.e('body')\">\n <date-table :date=\"date\" :selected-day=\"realSelectedDay\" @pick=\"pickDay\">\n <template\n v-if=\"$slots['date-cell'] || $slots.dateCell\"\n #date-cell=\"data\"\n >\n <slot v-if=\"$slots['date-cell']\" name=\"date-cell\" v-bind=\"data\" />\n <slot v-else name=\"dateCell\" v-bind=\"data\" />\n </template>\n </date-table>\n </div>\n <div v-else :class=\"ns.e('body')\">\n <date-table\n v-for=\"(range_, index) in validatedRange\"\n :key=\"index\"\n :date=\"range_[0]\"\n :selected-day=\"realSelectedDay\"\n :range=\"range_\"\n :hide-header=\"index !== 0\"\n @pick=\"pickDay\"\n >\n <template\n v-if=\"$slots['date-cell'] || $slots.dateCell\"\n #date-cell=\"data\"\n >\n <slot v-if=\"$slots['date-cell']\" name=\"date-cell\" v-bind=\"data\" />\n <slot v-else name=\"dateCell\" v-bind=\"data\" />\n </template>\n </date-table>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, ref, useSlots } from 'vue'\nimport dayjs from 'dayjs'\nimport { ElButton, ElButtonGroup } from '@element-plus/components/button'\nimport { useDeprecated, useLocale, useNamespace } from '@element-plus/hooks'\nimport { debugWarn } from '@element-plus/utils'\nimport { INPUT_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\nimport DateTable from './date-table.vue'\nimport { calendarEmits, calendarProps } from './calendar'\n\nimport type { CalendarDateType } from './calendar'\nimport type { ComputedRef } from 'vue'\nimport type { Dayjs } from 'dayjs'\n\nconst COMPONENT_NAME = 'ElCalendar'\ndefineOptions({\n name: COMPONENT_NAME,\n})\n\nconst props = defineProps(calendarProps)\nconst emit = defineEmits(calendarEmits)\n\nconst solts = useSlots()\nconst ns = useNamespace('calendar')\nconst { t, lang } = useLocale()\n\nconst selectedDay = ref<Dayjs>()\nconst now = dayjs().locale(lang.value)\n\nconst realSelectedDay = computed<Dayjs | undefined>({\n get() {\n if (!props.modelValue) return selectedDay.value\n return date.value\n },\n set(val) {\n if (!val) return\n selectedDay.value = val\n const result = val.toDate()\n\n emit(INPUT_EVENT, result)\n emit(UPDATE_MODEL_EVENT, result)\n },\n})\n\n// if range is valid, we get a two-digit array\nconst validatedRange = computed(() => {\n if (!props.range) return []\n const rangeArrDayjs = props.range.map((_) => dayjs(_).locale(lang.value))\n const [startDayjs, endDayjs] = rangeArrDayjs\n if (startDayjs.isAfter(endDayjs)) {\n debugWarn(COMPONENT_NAME, 'end time should be greater than start time')\n return []\n }\n if (startDayjs.isSame(endDayjs, 'month')) {\n // same month\n return calculateValidatedDateRange(startDayjs, endDayjs)\n } else {\n // two months\n if (startDayjs.add(1, 'month').month() !== endDayjs.month()) {\n debugWarn(\n COMPONENT_NAME,\n 'start time and end time interval must not exceed two months'\n )\n return []\n }\n return calculateValidatedDateRange(startDayjs, endDayjs)\n }\n})\n\nconst date: ComputedRef<Dayjs> = computed(() => {\n if (!props.modelValue) {\n if (realSelectedDay.value) {\n return realSelectedDay.value\n } else if (validatedRange.value.length) {\n return validatedRange.value[0][0]\n }\n return now\n } else {\n return dayjs(props.modelValue).locale(lang.value)\n }\n})\nconst prevMonthDayjs = computed(() => date.value.subtract(1, 'month').date(1))\nconst nextMonthDayjs = computed(() => date.value.add(1, 'month').date(1))\nconst prevYearDayjs = computed(() => date.value.subtract(1, 'year').date(1))\nconst nextYearDayjs = computed(() => date.value.add(1, 'year').date(1))\n\nconst i18nDate = computed(() => {\n const pickedMonth = `el.datepicker.month${date.value.format('M')}`\n return `${date.value.year()} ${t('el.datepicker.year')} ${t(pickedMonth)}`\n})\n\n// https://github.com/element-plus/element-plus/issues/3155\n// Calculate the validate date range according to the start and end dates\nconst calculateValidatedDateRange = (\n startDayjs: Dayjs,\n endDayjs: Dayjs\n): [Dayjs, Dayjs][] => {\n const firstDay = startDayjs.startOf('week')\n const lastDay = endDayjs.endOf('week')\n const firstMonth = firstDay.get('month')\n const lastMonth = lastDay.get('month')\n\n // Current mouth\n if (firstMonth === lastMonth) {\n return [[firstDay, lastDay]]\n }\n // Two adjacent months\n else if (firstMonth + 1 === lastMonth) {\n const firstMonthLastDay = firstDay.endOf('month')\n const lastMonthFirstDay = lastDay.startOf('month')\n\n // Whether the last day of the first month and the first day of the last month is in the same week\n const isSameWeek = firstMonthLastDay.isSame(lastMonthFirstDay, 'week')\n const lastMonthStartDay = isSameWeek\n ? lastMonthFirstDay.add(1, 'week')\n : lastMonthFirstDay\n\n return [\n [firstDay, firstMonthLastDay],\n [lastMonthStartDay.startOf('week'), lastDay],\n ]\n }\n // Three consecutive months (compatible: 2021-01-30 to 2021-02-28)\n else if (\n firstMonth + 2 === lastMonth ||\n (firstMonth + 1) % 11 === lastMonth\n ) {\n const firstMonthLastDay = firstDay.endOf('month')\n const secondMonthFirstDay = firstDay.add(1, 'month').startOf('month')\n\n // Whether the last day of the first month and the second month is in the same week\n const secondMonthStartDay = firstMonthLastDay.isSame(\n secondMonthFirstDay,\n 'week'\n )\n ? secondMonthFirstDay.add(1, 'week')\n : secondMonthFirstDay\n\n const secondMonthLastDay = secondMonthStartDay.endOf('month')\n const lastMonthFirstDay = lastDay.startOf('month')\n\n // Whether the last day of the second month and the last day of the last month is in the same week\n const lastMonthStartDay = secondMonthLastDay.isSame(\n lastMonthFirstDay,\n 'week'\n )\n ? lastMonthFirstDay.add(1, 'week')\n : lastMonthFirstDay\n\n return [\n [firstDay, firstMonthLastDay],\n [secondMonthStartDay.startOf('week'), secondMonthLastDay],\n [lastMonthStartDay.startOf('week'), lastDay],\n ]\n }\n // Other cases\n else {\n debugWarn(\n COMPONENT_NAME,\n 'start time and end time interval must not exceed two months'\n )\n return []\n }\n}\n\nconst pickDay = (day: Dayjs) => {\n realSelectedDay.value = day\n}\n\nconst selectDate = (type: CalendarDateType) => {\n let day: Dayjs\n if (type === 'prev-month') {\n day = prevMonthDayjs.value\n } else if (type === 'next-month') {\n day = nextMonthDayjs.value\n } else if (type === 'prev-year') {\n day = prevYearDayjs.value\n } else if (type === 'next-year') {\n day = nextYearDayjs.value\n } else {\n day = now\n }\n\n if (day.isSame(date.value, 'day')) return\n pickDay(day)\n}\n\nuseDeprecated(\n {\n from: '\"dateCell\"',\n replacement: '\"date-cell\"',\n scope: 'ElCalendar',\n version: '2.3.0',\n ref: 'https://element-plus.org/en-US/component/calendar.html#slots',\n type: 'Slot',\n },\n computed(() => !!solts.dateCell)\n)\n\ndefineExpose({\n /** @description currently selected date */\n selectedDay: realSelectedDay,\n /** @description select a specific date */\n pickDay,\n /** @description select date */\n selectDate,\n /** @description Calculate the validate date range according to the start and end dates */\n calculateValidatedDateRange,\n})\n</script>\n"],"names":[],"mappings":"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"}