{"version":3,"file":"date-table.vue.mjs","sources":["../../../../../packages/components/calendar/src/date-table.vue"],"sourcesContent":["<template>\n  <table :class=\"[nsTable.b(), nsTable.is('range', isInRange)]\" cellspacing=\"0\" cellpadding=\"0\">\n    <thead v-if=\"!hideHeader\">\n      <th v-for=\"day in weekDays\" :key=\"day\">{{ day }}</th>\n    </thead>\n\n    <tbody>\n      <tr\n        v-for=\"(row, index) in rows\"\n        :key=\"index\"\n        :class=\"{\n          [nsTable.e('row')]: true,\n          [nsTable.em('row', 'hide-border')]: index === 0 && hideHeader\n        }\"\n      >\n        <td\n          v-for=\"(cell, key) in row\"\n          :key=\"key\"\n          :class=\"getCellClass(cell)\"\n          @click=\"handlePickDay(cell)\"\n        >\n          <div :class=\"nsDay.b()\">\n            <slot name=\"dateCell\" :data=\"getSlotData(cell)\">\n              <span>{{ cell.text }}</span>\n            </slot>\n          </div>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\nimport dayjs from 'dayjs'\nimport localeData from 'dayjs/plugin/localeData'\nimport { useNamespace } from '@element-ultra/hooks'\nimport { rangeArr } from '@element-ultra/components/time-picker'\nimport { dateTableProps, dateTableEmits } from './date-table'\nimport type { Dayjs } from 'dayjs'\ndayjs.extend(localeData)\n\ntype CellType = 'next' | 'prev' | 'current'\ninterface Cell {\n  text: number\n  type: CellType\n}\n\nconst WEEK_DAYS = ['日', '一', '二', '三', '四', '五', '六'] as const\n\nexport const getPrevMonthLastDays = (date: Dayjs, count: number) => {\n  const lastDay = date.subtract(1, 'month').endOf('month').date()\n  return rangeArr(count).map((_, index) => lastDay - (count - index - 1))\n}\n\nexport const getMonthDays = (date: Dayjs) => {\n  const days = date.daysInMonth()\n  return rangeArr(days).map((_, index) => index + 1)\n}\n\nconst toNestedArr = (days: Cell[]) =>\n  rangeArr(days.length / 7).map(index => {\n    const start = index * 7\n    return days.slice(start, start + 7)\n  })\n\nexport default defineComponent({\n  props: dateTableProps,\n  emits: dateTableEmits,\n\n  setup(props, { emit }) {\n    const nsTable = useNamespace('calendar-table')\n    const nsDay = useNamespace('calendar-day')\n\n    const now = dayjs().locale('zh-cn')\n    // todo better way to get Day.js locale object\n    const firstDayOfWeek: number = (now as any).$locale().weekStart || 0\n\n    const isInRange = computed(() => !!props.range && !!props.range.length)\n\n    const rows = computed(() => {\n      let days: Cell[] = []\n      if (isInRange.value) {\n        const [start, end] = props.range!\n        const currentMonthRange: Cell[] = rangeArr(end.date() - start.date() + 1).map(index => ({\n          text: start.date() + index,\n          type: 'current'\n        }))\n\n        let remaining = currentMonthRange.length % 7\n        remaining = remaining === 0 ? 0 : 7 - remaining\n        const nextMonthRange: Cell[] = rangeArr(remaining).map((_, index) => ({\n          text: index + 1,\n          type: 'next'\n        }))\n        days = currentMonthRange.concat(nextMonthRange)\n      } else {\n        const firstDay = props.date.startOf('month').day() || 7\n        const prevMonthDays: Cell[] = getPrevMonthLastDays(\n          props.date,\n          firstDay - firstDayOfWeek\n        ).map(day => ({\n          text: day,\n          type: 'prev'\n        }))\n        const currentMonthDays: Cell[] = getMonthDays(props.date).map(day => ({\n          text: day,\n          type: 'current'\n        }))\n        days = [...prevMonthDays, ...currentMonthDays]\n        const nextMonthDays: Cell[] = rangeArr(42 - days.length).map((_, index) => ({\n          text: index + 1,\n          type: 'next'\n        }))\n        days = days.concat(nextMonthDays)\n      }\n      return toNestedArr(days)\n    })\n\n    const weekDays = computed(() => {\n      const start = firstDayOfWeek\n      if (start === 0) {\n        return WEEK_DAYS\n      } else {\n        return WEEK_DAYS.slice(start).concat(WEEK_DAYS.slice(0, start))\n      }\n    })\n\n    const getFormattedDate = (day: number, type: CellType): Dayjs => {\n      switch (type) {\n        case 'prev':\n          return props.date.startOf('month').subtract(1, 'month').date(day)\n        case 'next':\n          return props.date.startOf('month').add(1, 'month').date(day)\n        case 'current':\n          return props.date.date(day)\n      }\n    }\n\n    const getCellClass = ({ text, type }: Cell) => {\n      const classes: string[] = [type]\n      if (type === 'current') {\n        const date = getFormattedDate(text, type)\n        if (date.isSame(props.selectedDay, 'day')) {\n          classes.push('is-selected')\n        }\n        if (date.isSame(now, 'day')) {\n          classes.push('is-today')\n        }\n      }\n      return classes\n    }\n\n    const handlePickDay = ({ text, type }: Cell) => {\n      const date = getFormattedDate(text, type)\n      emit('pick', date)\n    }\n\n    const getSlotData = ({ text, type }: Cell) => {\n      const day = getFormattedDate(text, type)\n      return {\n        isSelected: day.isSame(props.selectedDay),\n        type: `${type}-month`,\n        day: day.format('YYYY-MM-DD'),\n        date: day.toDate()\n      }\n    }\n\n    return {\n      isInRange,\n      weekDays,\n      rows,\n      getCellClass,\n      handlePickDay,\n      getSlotData,\n\n      nsTable,\n      nsDay\n    }\n  }\n})\n</script>\n"],"names":["_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_createElementVNode","_Fragment","_renderList","_renderSlot"],"mappings":";;;;;;;SACe,YAAG,IAAA,EAAA,MAAA,EAAA,MAAS,EAAA,MAAA,EAAI,OAAO,QAAG,EAAA;SAAuBA,WAAe,EAAAC,kBAAA;AAAA,IAAA,OAAA;AAAA,IAAA;AAAA,MAAC,KAAe,EAAAC,cAAA,CAAA,CAAA,IAAA,CAAA,QAAA,CAAA,EAAA,EAAA,IAAA,CAAA,OAAA,CAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,SAAA,CAAA,CAAA,CAAA;AAAA,MAAA,WAAA,EAAA,GAAA;AAAA,MAC7E,WAAA,EAAA,GAAA;AAAA,KAAA;AAAA;0DACZ,SAA6B,UAAA,EAAA;AAAA,SAAAF,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA;AAAA;;;;;;;;;;;;;;OAI7B,CAAA,IAAAE,kBAAA,CAAA,MAAA,EAAA,IAAA,CAAA;AAAA,MAAAC,kBAAA,CAAA,SAAA,IAAA,EAAA;AAAA,SAAAJ,SAAA,CAEQ,IAAK,CAAA,EAAAC,kBAAA;AAAA,UAAAI,QAAA;AAAA,UAAA,IAAA;AAAA,UAAAC,UAAA,CAAA,IAAA,CAAA,IAAA,EAAA,CAAA,KAAA,KAAA,KAAA;AACL,YAAA,OAAAN,WAAA,EAAAC,kBAAA;AAAA,cAAA,IAAA;AAAA,cAAA;AAAA,gBAAe,GAAA,EAAA,KAAA;AAAA,gBAAA,OAAoCC,cAAU,CAAA;AAAA,kBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,CAAA,KAAA,CAAA,GAAA,IAAA;AAAA;;;;iBAOxDF,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA;AAAA,kBAAAI,QAAA;AAAA,kBAAA,IAAA;AAAA,kBAAAC,UAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAA,GAAA,KAAA;AACH,oBAAA,OAAAN,SAAA,EAAA,EAAAC,kBAAA,CAAc,IAAK,EAAA;AAAA,sBACxB,GAAA;AAAA,sBAAA,KAAA,EAAAC,cAAA,CAAA,IAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA;AAAA,sBAED,OAIM,EAAA,CAAA,MAAA,KAAA,IAAA,CAAA,cAAA,IAAA,CAAA;AAAA,qBAAA,EAAA;AAAA;;;0BAHJ,KAEO,EAAAA,cAAA,CAAA,IAAA,CAAA,KAAA,CAAA,GAAA,CAAA;AAAA,yBAAA;AAAA;0BAAAK,UAAA,CAAA,IAAA,CAAA,MAAA,EAAA,UAAA,EAAA;AAAA,4BADL,IAAA,EAA4B,IAAA,CAAA,WAAA,CAAA,IAAA,CAAA;AAAA,6BAAA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}