You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 lines
16 KiB

{"ast":null,"code":"import { ref, computed } from 'vue';\nimport dayjs from 'dayjs';\nimport { useLocale } from '../../../hooks/use-locale/index.mjs';\nimport { INPUT_EVENT, UPDATE_MODEL_EVENT } from '../../../constants/event.mjs';\nimport { isArray, isDate } from '@vue/shared';\nimport { debugWarn } from '../../../utils/error.mjs';\nconst adjacentMonth = (start, end) => {\n const firstMonthLastDay = start.endOf(\"month\");\n const lastMonthFirstDay = end.startOf(\"month\");\n const isSameWeek = firstMonthLastDay.isSame(lastMonthFirstDay, \"week\");\n const lastMonthStartDay = isSameWeek ? lastMonthFirstDay.add(1, \"week\") : lastMonthFirstDay;\n return [[start, firstMonthLastDay], [lastMonthStartDay.startOf(\"week\"), end]];\n};\nconst threeConsecutiveMonth = (start, end) => {\n const firstMonthLastDay = start.endOf(\"month\");\n const secondMonthFirstDay = start.add(1, \"month\").startOf(\"month\");\n const secondMonthStartDay = firstMonthLastDay.isSame(secondMonthFirstDay, \"week\") ? secondMonthFirstDay.add(1, \"week\") : secondMonthFirstDay;\n const secondMonthLastDay = secondMonthStartDay.endOf(\"month\");\n const lastMonthFirstDay = end.startOf(\"month\");\n const lastMonthStartDay = secondMonthLastDay.isSame(lastMonthFirstDay, \"week\") ? lastMonthFirstDay.add(1, \"week\") : lastMonthFirstDay;\n return [[start, firstMonthLastDay], [secondMonthStartDay.startOf(\"week\"), secondMonthLastDay], [lastMonthStartDay.startOf(\"week\"), end]];\n};\nconst useCalendar = (props, emit, componentName) => {\n const {\n lang\n } = useLocale();\n const selectedDay = ref();\n const now = dayjs().locale(lang.value);\n const realSelectedDay = computed({\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 emit(INPUT_EVENT, result);\n emit(UPDATE_MODEL_EVENT, result);\n }\n });\n const validatedRange = computed(() => {\n if (!props.range || !isArray(props.range) || props.range.length !== 2 || props.range.some(item => !isDate(item))) 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 return calculateValidatedDateRange(startDayjs, endDayjs);\n } else {\n if (startDayjs.add(1, \"month\").month() !== endDayjs.month()) {\n debugWarn(componentName, \"start time and end time interval must not exceed two months\");\n return [];\n }\n return calculateValidatedDateRange(startDayjs, endDayjs);\n }\n });\n const date = computed(() => {\n if (!props.modelValue) {\n return realSelectedDay.value || (validatedRange.value.length ? validatedRange.value[0][0] : now);\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 const calculateValidatedDateRange = (startDayjs, endDayjs) => {\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 if (firstMonth === lastMonth) {\n return [[firstDay, lastDay]];\n } else if ((firstMonth + 1) % 12 === lastMonth) {\n return adjacentMonth(firstDay, lastDay);\n } else if (firstMonth + 2 === lastMonth || (firstMonth + 1) % 11 === lastMonth) {\n return threeConsecutiveMonth(firstDay, lastDay);\n } else {\n debugWarn(componentName, \"start time and end time interval must not exceed two months\");\n return [];\n }\n };\n const pickDay = day => {\n realSelectedDay.value = day;\n };\n const selectDate = type => {\n const dateMap = {\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 const day = dateMap[type];\n if (!day.isSame(date.value, \"day\")) {\n pickDay(day);\n }\n };\n return {\n calculateValidatedDateRange,\n date,\n realSelectedDay,\n pickDay,\n selectDate,\n validatedRange\n };\n};\nexport { useCalendar };","map":{"version":3,"names":["adjacentMonth","start","end","firstMonthLastDay","endOf","lastMonthFirstDay","startOf","isSameWeek","isSame","lastMonthStartDay","add","threeConsecutiveMonth","secondMonthFirstDay","secondMonthStartDay","secondMonthLastDay","useCalendar","props","emit","componentName","lang","useLocale","selectedDay","ref","now","dayjs","locale","value","realSelectedDay","computed","get","modelValue","date","set","val","result","toDate","INPUT_EVENT","UPDATE_MODEL_EVENT","validatedRange","range","isArray","length","some","item","isDate","rangeArrDayjs","map","_","startDayjs","endDayjs","isAfter","debugWarn","calculateValidatedDateRange","month","prevMonthDayjs","subtract","nextMonthDayjs","prevYearDayjs","nextYearDayjs","firstDay","lastDay","firstMonth","lastMonth","pickDay","day","selectDate","type","dateMap","today"],"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 return {\n calculateValidatedDateRange,\n date,\n realSelectedDay,\n pickDay,\n selectDate,\n validatedRange,\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}