{"version":3,"file":"calendar.vue2.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":[],"mappings":"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"}