{"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\"></slot>\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\"></slot>\n        </template>\n      </date-table>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { ref, computed, defineComponent } 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 { calendarProps, calendarEmits } from './calendar'\n\nimport type { ComputedRef } from 'vue'\nimport type { Dayjs } from 'dayjs'\n\ntype DateType =\n  | 'prev-month'\n  | 'next-month'\n  | 'prev-year'\n  | 'next-year'\n  | 'today'\n\nexport default defineComponent({\n  name: 'ElCalendar',\n\n  components: {\n    DateTable,\n    ElButton,\n    ElButtonGroup,\n  },\n\n  props: calendarProps,\n  emits: calendarEmits,\n\n  setup(props, { emit }) {\n    const ns = useNamespace('calendar')\n\n    const { t, lang } = useLocale()\n    const selectedDay = ref<Dayjs>()\n    const now = dayjs().locale(lang.value)\n\n    const prevMonthDayjs = computed(() => {\n      return date.value.subtract(1, 'month').date(1)\n    })\n    const curMonthDatePrefix = computed(() => {\n      return dayjs(date.value).locale(lang.value).format('YYYY-MM')\n    })\n\n    const nextMonthDayjs = computed(() => {\n      return date.value.add(1, 'month').date(1)\n    })\n\n    const prevYearDayjs = computed(() => {\n      return date.value.subtract(1, 'year').date(1)\n    })\n\n    const nextYearDayjs = computed(() => {\n      return date.value.add(1, 'year').date(1)\n    })\n\n    const 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    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', result)\n        emit('update:modelValue', result)\n      },\n    })\n\n    const 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\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 === 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          'ElCalendar',\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\n    const 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('ElCalendar', '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            'ElCalendar',\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 pickDay = (day: Dayjs) => {\n      realSelectedDay.value = day\n    }\n\n    const selectDate = (type: DateType) => {\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\n    return {\n      selectedDay,\n      curMonthDatePrefix,\n      i18nDate,\n      realSelectedDay,\n      date,\n      validatedRange,\n      pickDay,\n      selectDate,\n      t,\n\n      ns,\n    }\n  },\n})\n</script>\n"],"names":["_openBlock","_toDisplayString","_withCtx","_createSlots","_Fragment","_createBlock"],"mappings":"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"}