UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 11.3 kB
{"version":3,"file":"use-calendar.mjs","sources":["../../../../../../packages/components/calendar/src/use-calendar.ts"],"sourcesContent":["import { computed, ref } from 'vue'\nimport dayjs from 'dayjs'\nimport { useLocale } from '@element-plus/hooks'\nimport { debugWarn, isArray, isDate } from '@element-plus/utils'\nimport { INPUT_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\n\nimport type { ComputedRef, SetupContext } from 'vue'\nimport type { Dayjs } from 'dayjs'\nimport type { CalendarDateType, CalendarEmits, CalendarProps } from './calendar'\n\nconst adjacentMonth = (start: Dayjs, end: Dayjs): [Dayjs, Dayjs][] => {\n const firstMonthLastDay = start.endOf('month')\n const lastMonthFirstDay = end.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 [start, firstMonthLastDay],\n [lastMonthStartDay.startOf('week'), end],\n ]\n}\n\nconst threeConsecutiveMonth = (start: Dayjs, end: Dayjs): [Dayjs, Dayjs][] => {\n const firstMonthLastDay = start.endOf('month')\n const secondMonthFirstDay = start.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 = end.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(lastMonthFirstDay, 'week')\n ? lastMonthFirstDay.add(1, 'week')\n : lastMonthFirstDay\n\n return [\n [start, firstMonthLastDay],\n [secondMonthStartDay.startOf('week'), secondMonthLastDay],\n [lastMonthStartDay.startOf('week'), end],\n ]\n}\n\nexport const useCalendar = (\n props: CalendarProps,\n emit: SetupContext<CalendarEmits>['emit'],\n componentName: string\n) => {\n const { lang } = useLocale()\n\n const selectedDay = ref<Dayjs>()\n const now = dayjs().locale(lang.value)\n\n const 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\n const validatedRange = computed(() => {\n if (\n !props.range ||\n !isArray(props.range) ||\n props.range.length !== 2 ||\n props.range.some((item) => !isDate(item))\n )\n return []\n const rangeArrDayjs = props.range.map((_) => dayjs(_).locale(lang.value))\n const [startDayjs, endDayjs] = rangeArrDayjs\n if (startDayjs.isAfter(endDayjs)) {\n debugWarn(componentName, '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 componentName,\n 'start time and end time interval must not exceed two months'\n )\n return []\n }\n return calculateValidatedDateRange(startDayjs, endDayjs)\n }\n })\n\n const date: ComputedRef<Dayjs> = computed(() => {\n if (!props.modelValue) {\n return (\n realSelectedDay.value ||\n (validatedRange.value.length ? validatedRange.value[0][0] : now)\n )\n } else {\n return dayjs(props.modelValue).locale(lang.value)\n }\n })\n const prevMonthDayjs = computed(() => date.value.subtract(1, 'month').date(1))\n const nextMonthDayjs = computed(() => date.value.add(1, 'month').date(1))\n const prevYearDayjs = computed(() => date.value.subtract(1, 'year').date(1))\n const nextYearDayjs = computed(() => date.value.add(1, 'year').date(1))\n\n // https://github.com/element-plus/element-plus/issues/3155\n // Calculate the validate date range according to the start and end dates\n const 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) % 12 === lastMonth) {\n return adjacentMonth(firstDay, lastDay)\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 return threeConsecutiveMonth(firstDay, lastDay)\n }\n // Other cases\n else {\n debugWarn(\n componentName,\n 'start time and end time interval must not exceed two months'\n )\n return []\n }\n }\n\n const pickDay = (day: Dayjs) => {\n realSelectedDay.value = day\n }\n\n const selectDate = (type: CalendarDateType) => {\n const dateMap: Record<CalendarDateType, Dayjs> = {\n 'prev-month': prevMonthDayjs.value,\n 'next-month': nextMonthDayjs.value,\n 'prev-year': prevYearDayjs.value,\n 'next-year': nextYearDayjs.value,\n today: now,\n }\n\n const day = dateMap[type]\n\n if (!day.isSame(date.value, 'day')) {\n pickDay(day)\n }\n }\n\n const handleDateChange = (date: Dayjs | 'today') => {\n if (date === 'today') {\n selectDate('today')\n } else {\n pickDay(date)\n }\n }\n\n return {\n calculateValidatedDateRange,\n date,\n realSelectedDay,\n pickDay,\n selectDate,\n validatedRange,\n handleDateChange,\n }\n}\n"],"names":["date"],"mappings":"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"}