{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/calendar/src/index.vue"],"sourcesContent":["<template>\r\n  <div class=\"sg-calendar\">\r\n    <div class=\"sg-calendar__header\">\r\n      <div class=\"sg-calendar__title\">{{ i18nDate }}</div>\r\n      <div v-if=\"validatedRange.length === 0\" class=\"sg-calendar__button-group\">\r\n        \r\n              <sg-button\r\n                @click=\"selectDate('prev-month')\"\r\n              >\r\n              {{ t('sg.datepicker.prevMonth') }}\r\n            </sg-button>\r\n            <sg-button  @click=\"selectDate('today')\">\r\n              {{\r\n                t('sg.datepicker.today')\r\n              }}\r\n            </sg-button>\r\n            <sg-button\r\n              @click=\"selectDate('next-month')\"\r\n            >\r\n              {{ t('sg.datepicker.nextMonth') }}\r\n            </sg-button>\r\n     \r\n      </div>\r\n    </div>\r\n    <div v-if=\"validatedRange.length === 0\" class=\"sg-calendar__body\">\r\n      <date-table\r\n        :date=\"date\"\r\n        :selected-day=\"realSelectedDay\"\r\n        @pick=\"pickDay\"\r\n      >\r\n        <template v-if=\"$slots.dateCell\" #dateCell=\"data\">\r\n          <slot name=\"dateCell\" v-bind=\"data\"></slot>\r\n        </template>\r\n      </date-table>\r\n    </div>\r\n    <div v-else class=\"sg-calendar__body\">\r\n      <date-table\r\n        v-for=\"(range_, index) in validatedRange\"\r\n        :key=\"index\"\r\n        :date=\"range_[0]\"\r\n        :selected-day=\"realSelectedDay\"\r\n        :range=\"range_\"\r\n        :hide-header=\"index !== 0\"\r\n        @pick=\"pickDay\"\r\n      >\r\n        <template v-if=\"$slots.dateCell\" #dateCell=\"data\">\r\n          <slot name=\"dateCell\" v-bind=\"data\"></slot>\r\n        </template>\r\n      </date-table>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport SgButton from '../../button/index'\r\nimport SgButtonGroup from '../../button/index'\r\nimport { useLocale } from '@sgui-plus/hooks'\r\nimport DateTable from './date-table.vue'\r\nimport {\r\n  ref,\r\n  ComputedRef,\r\n  PropType,\r\n  computed,\r\n  defineComponent,\r\n} from 'vue'\r\nimport dayjs, { Dayjs } from 'dayjs'\r\n\r\ntype DateType = 'prev-month' | 'today' | 'next-month'\r\n\r\nexport default defineComponent({\r\n  name: 'SgCalendar',\r\n\r\n  components: {\r\n    DateTable,\r\n    SgButton,\r\n    SgButtonGroup\r\n  },\r\n\r\n  props: {\r\n    modelValue: {\r\n      type: Date,\r\n    },\r\n    range: {\r\n      type: Array as PropType<Array<Date>>,\r\n      validator: (range: Date): boolean => {\r\n        if (Array.isArray(range)) {\r\n          return (\r\n            range.length === 2 &&\r\n            range.every(\r\n              item => item instanceof Date,\r\n            )\r\n          )\r\n        }\r\n        return false\r\n      },\r\n    },\r\n  },\r\n\r\n  emits: ['input', 'update:modelValue'],\r\n  setup(props, ctx) {\r\n    const { t, lang } = useLocale()\r\n    const selectedDay = ref<any>(null)\r\n    const now = dayjs().locale(lang.value)\r\n\r\n    const prevMonthDayjs = computed(() => {\r\n      return date.value.subtract(1, 'month')\r\n    })\r\n    const curMonthDatePrefix = computed(() => {\r\n      return dayjs(date.value).locale(lang.value).format('YYYY-MM')\r\n    })\r\n\r\n    const nextMonthDayjs = computed(() => {\r\n      return date.value.add(1, 'month')\r\n    })\r\n\r\n    const i18nDate = computed(() => {\r\n      const pickedMonth = `sg.datepicker.month${date.value.format('M')}`\r\n      return `${date.value.year()} ${t('sg.datepicker.year')} ${t(pickedMonth)}`\r\n    })\r\n\r\n    const realSelectedDay = computed<any>({\r\n      get() {\r\n        if (!props.modelValue) return selectedDay.value\r\n        return date.value\r\n      },\r\n      set(val: Dayjs) {\r\n        selectedDay.value = val\r\n        const result = val.toDate()\r\n        ctx.emit('input', result)\r\n        ctx.emit('update:modelValue', result)\r\n      },\r\n    })\r\n\r\n    const date: ComputedRef<Dayjs> = computed(() => {\r\n      if (!props.modelValue) {\r\n        if (realSelectedDay.value) {\r\n          return realSelectedDay.value\r\n        } else if (validatedRange.value.length) {\r\n          return validatedRange.value[0][0]\r\n        }\r\n        return now\r\n      } else {\r\n        return dayjs(props.modelValue).locale(lang.value)\r\n      }\r\n    })\r\n\r\n    // if range is valid, we get a two-digit array\r\n    const validatedRange = computed(() => {\r\n      if (!props.range) return []\r\n      const rangeArrDayjs = props.range.map(_ => dayjs(_).locale(lang.value))\r\n      const [startDayjs, endDayjs] = rangeArrDayjs\r\n      if (startDayjs.isAfter(endDayjs)) {\r\n        console.warn(\r\n          '[SgCalendar]end time should be greater than start time',\r\n        )\r\n        return []\r\n      }\r\n      if (startDayjs.isSame(endDayjs, 'month')) {\r\n        // same month\r\n        return [[\r\n          startDayjs.startOf('week'),\r\n          endDayjs.endOf('week'),\r\n        ]]\r\n      } else {\r\n        // two months\r\n        if (startDayjs.add(1, 'month').month() !== endDayjs.month()) {\r\n          console.warn(\r\n            '[SgCalendar]start time and end time interval must not exceed two months',\r\n          )\r\n          return []\r\n        }\r\n        const endMonthFirstDay = endDayjs.startOf('month')\r\n        const endMonthFirstWeekDay = endMonthFirstDay.startOf('week')\r\n        let endMonthStart = endMonthFirstDay\r\n        if (!endMonthFirstDay.isSame(endMonthFirstWeekDay, 'month')) {\r\n          endMonthStart = endMonthFirstDay.endOf('week').add(1, 'day')\r\n        }\r\n        return [\r\n          [\r\n            startDayjs.startOf('week'),\r\n            startDayjs.endOf('month'),\r\n          ],\r\n          [\r\n            endMonthStart,\r\n            endDayjs.endOf('week'),\r\n          ],\r\n        ]\r\n      }\r\n    })\r\n\r\n    const pickDay = (day: Dayjs) => {\r\n      realSelectedDay.value = day\r\n    }\r\n\r\n    const selectDate = (type: DateType) => {\r\n      let day: Dayjs\r\n      if (type === 'prev-month') {\r\n        day = prevMonthDayjs.value\r\n      } else if (type === 'next-month') {\r\n        day = nextMonthDayjs.value\r\n      } else {\r\n        day = now\r\n      }\r\n\r\n      if (day.isSame(date.value, 'day')) return\r\n      pickDay(day)\r\n    }\r\n\r\n    return {\r\n      selectedDay,\r\n      curMonthDatePrefix,\r\n      i18nDate,\r\n      realSelectedDay,\r\n      date,\r\n      validatedRange,\r\n      pickDay,\r\n      selectDate,\r\n      t,\r\n    }\r\n  },\r\n})\r\n</script>\r\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","_createCommentVNode","_createSlots","_withCtx","_Fragment","_renderList","_createBlock"],"mappings":"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"}