{"version":3,"file":"calendar.vue.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')\"> 上个月 </el-button>\n            <el-button size=\"small\" @click=\"selectDate('today')\"> 今天 </el-button>\n            <el-button size=\"small\" @click=\"selectDate('next-month')\"> 下个月 </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-ultra/components/button'\nimport { useNamespace } from '@element-ultra/hooks'\nimport { debugWarn } from '@element-ultra/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 = 'prev-month' | 'next-month' | 'prev-year' | 'next-year' | '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 selectedDay = ref<Dayjs>()\n    const now = dayjs().locale('zh-cn')\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('zh-cn').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      return `${date.value.year()} 年 ${date.value.format('M')} 月`\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('zh-cn')\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 = (startDayjs: Dayjs, endDayjs: Dayjs): [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 ? lastMonthFirstDay.add(1, 'week') : 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(secondMonthFirstDay, 'week')\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(lastMonthFirstDay, 'week')\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('ElCalendar', 'start time and end time interval must not exceed two months')\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('zh-cn'))\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('ElCalendar', 'start time and end time interval must not exceed two months')\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\n      ns\n    }\n  }\n})\n</script>\n"],"names":["_resolveComponent","_normalizeClass","_renderSlot","_createElementVNode","_toDisplayString","_openBlock","_createElementBlock","_withCtx","_createVNode","_createSlots","_Fragment","_renderList","_createBlock"],"mappings":"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"}