{"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 v-if=\"$slots.dateCell\" #dateCell=\"data\">\n          <slot 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 v-if=\"$slots.dateCell\" #dateCell=\"data\">\n          <slot 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 } from 'vue'\nimport dayjs from 'dayjs'\nimport { ElButton, ElButtonGroup } from '@element-plus/components/button'\nimport { useLocale, useNamespace } from '@element-plus/hooks'\nimport { debugWarn } from '@element-plus/utils'\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'\n\ndefineOptions({\n  name: 'ElCalendar',\n})\n\nconst props = defineProps(calendarProps)\nconst emit = defineEmits(calendarEmits)\n\nconst ns = useNamespace('calendar')\n\nconst { t, lang } = useLocale()\nconst selectedDay = ref<Dayjs>()\nconst now = dayjs().locale(lang.value)\n\nconst prevMonthDayjs = computed(() => {\n  return date.value.subtract(1, 'month').date(1)\n})\n\nconst nextMonthDayjs = computed(() => {\n  return date.value.add(1, 'month').date(1)\n})\n\nconst prevYearDayjs = computed(() => {\n  return date.value.subtract(1, 'year').date(1)\n})\n\nconst nextYearDayjs = computed(() => {\n  return date.value.add(1, 'year').date(1)\n})\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\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', result)\n    emit('update:modelValue', result)\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})\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 (firstMonth + 2 === lastMonth) {\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\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 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\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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"}