{"version":3,"file":"calendar.vue.cjs","sources":["../../../../components/datepicker/modules/calendar.vue"],"sourcesContent":["<template>\n  <table\n    class=\"d-datepicker__calendar\"\n    aria-labelledby=\"calendar-heading\"\n  >\n    <thead>\n      <tr>\n        <th\n          v-for=\"day in weekDays\"\n          :key=\"day\"\n          scope=\"col\"\n          class=\"d-datepicker__cell d-datepicker__cell--header\"\n        >\n          <span\n            class=\"d-datepicker__weekday\"\n            :title=\"day\"\n            :aria-label=\"day\"\n          > {{ day }}</span>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr\n        v-for=\"(week, indexWeek) in calendarDays\"\n        :key=\"indexWeek\"\n      >\n        <td\n          v-for=\"(day, indexDays) in week.days\"\n          :key=\"indexWeek + indexDays\"\n          class=\"d-datepicker__cell\"\n          role=\"listbox\"\n        >\n          <dt-button\n            :ref=\"`buttonRef_${indexWeek}_${indexDays}`\"\n            class=\"d-datepicker__day\"\n            :circle=\"true\"\n            size=\"sm\"\n            importance=\"clear\"\n            :disabled=\"!day.currentMonth\"\n            :class=\"{\n              'd-datepicker__day--disabled': !day.currentMonth,\n              'd-datepicker__day--selected': selectedDay\n                ? ((day.text === selectedDay) && day.currentMonth)\n                : day.selected,\n            }\"\n            type=\"button\"\n            :aria-selected=\"!!selectedDay ? ((day.text === selectedDay) && day.currentMonth) : day.selected\"\n            :aria-label=\"dayAriaLabel(day)\"\n            role=\"option\"\n            @click=\"selectDay(day)\"\n            @keydown=\"handleKeyDown($event)\"\n          >\n            {{ day.text }}\n          </dt-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</template>\n\n<script>\nimport { getWeekDayNames, calculateNextFocusDate, calculatePrevFocusDate } from '@/components/datepicker/utils';\nimport { WEEK_START, MONTH_FORMAT } from '@/components/datepicker/datepicker_constants.js';\nimport { format, getYear } from 'date-fns';\nimport DtButton from '@/components/button/button.vue';\n\nexport default {\n  name: 'DtDatepickerCalendar',\n  components: { DtButton },\n\n  props: {\n    calendarDays: {\n      type: Array,\n      required: true,\n    },\n\n    locale: {\n      type: String,\n      required: true,\n    },\n\n    selectDayLabel: {\n      type: String,\n      required: true,\n    },\n  },\n\n  emits: [\n    /**\n     * Event fired when a date is selected\n     *\n     * @event select-date\n     * @type {Date}\n     */\n    'select-date',\n\n    /**\n     * Will focus the month and year picker\n     *\n     * @event focus-month-year-picker\n     */\n    'focus-month-year-picker',\n\n    /**\n     * Will close the datepicker\n     *\n     * @event close-datepicker\n     */\n    'close-datepicker',\n  ],\n\n  data () {\n    return {\n      // local selectedDay to override the received by props calendarDays\n      selectedDay: null,\n      focusDay: 0,\n      daysRef: [],\n    };\n  },\n\n  computed: {\n    weekDays () {\n      return getWeekDayNames(this.locale, WEEK_START);\n    },\n  },\n\n  watch: {\n    calendarDays () {\n      // on calendarDays update, reset our local variables\n      this.focusDay = 0;\n      this.selectedDay = null;\n\n      this.daysRef = [];\n\n      this.$nextTick(() => {\n        this.daysRef = [];\n        this.setDayRef();\n      });\n    },\n  },\n\n  methods: {\n    dayAriaLabel (day) {\n      return `${this.selectDayLabel} ${day.text} ${format(day.value, MONTH_FORMAT)} ${getYear(day.value)}`;\n    },\n\n    setDayRef (el, day) {\n      this.calendarDays.forEach((week, weekIndex) => {\n        week.days.forEach((day, dayIndex) => {\n          const refKey = `buttonRef_${weekIndex}_${dayIndex}`;\n          const dayButton = this.$refs[refKey];\n          if (dayButton && day.currentMonth) {\n            this.daysRef.push({ el: dayButton[0], day });\n          }\n        });\n      });\n    },\n\n    handleKeyDown (event) {\n      switch (event.key) {\n        case 'ArrowUp':\n          event.preventDefault();\n          this.focusDay -= 7;\n          try {\n            this.daysRef[this.focusDay].el.$el.focus();\n          } catch (error) {\n            const prevFocusDate = calculatePrevFocusDate(this.daysRef[this.focusDay + 7].day.value);\n            this.$emit('go-to-prev-month');\n            this.$nextTick(() => {\n              this.setDayRef();\n              this.daysRef[prevFocusDate - 1].el.$el.focus();\n              this.focusDay += prevFocusDate - 1;\n            });\n          }\n          break;\n\n        case 'ArrowDown':\n          event.preventDefault();\n          this.focusDay += 7;\n          try {\n            this.daysRef[this.focusDay].el.$el.focus();\n          } catch (error) {\n            const nextFocusDate = calculateNextFocusDate(this.daysRef[this.focusDay - 7].day.value);\n            this.$emit('go-to-next-month');\n            this.$nextTick(() => {\n              this.setDayRef();\n              this.daysRef[nextFocusDate - 1].el.$el.focus();\n              this.focusDay += nextFocusDate - 1;\n            });\n          }\n          break;\n\n        case 'ArrowLeft':\n          event.preventDefault();\n          if (this.focusDay > 0) {\n            this.focusDay -= 1;\n            this.daysRef[this.focusDay].el.$el.focus();\n          } else {\n            // if we are on month first day, jump to last day of prev month\n            this.$emit('go-to-prev-month');\n            this.$nextTick(() => {\n              this.focusLastDay();\n            });\n          }\n          break;\n\n        case 'ArrowRight':\n          event.preventDefault();\n          if (this.focusDay < this.daysRef.length - 1) {\n            this.focusDay += 1;\n            this.daysRef[this.focusDay].el.$el.focus();\n          } else {\n            // if we are on month last day, jump to first day of next month\n            this.$emit('go-to-next-month');\n            this.$nextTick(() => {\n              this.focusFirstDay();\n            });\n          }\n          break;\n\n        case 'Tab':\n          event.preventDefault();\n          this.$emit('focus-month-year-picker');\n          break;\n\n        case 'Escape':\n          this.$emit('close-datepicker');\n          break;\n      }\n    },\n\n    focusFirstDay () {\n      this.focusDay = 0;\n      this.$nextTick(() => {\n        this.daysRef[this.focusDay].el.$el.focus();\n      });\n    },\n\n    focusLastDay () {\n      this.$nextTick(() => {\n        this.focusDay = this.daysRef.length - 1;\n        this.daysRef[this.focusDay].el.$el.focus();\n      });\n    },\n\n    selectDay (day) {\n      if (!day.currentMonth) { return; }\n\n      // local selectedDay is updated when a day is selected\n      this.selectedDay = day.text;\n      this.$emit('select-date', day.value);\n    },\n  },\n};\n</script>\n"],"names":["DtButton","getWeekDayNames","WEEK_START","format","MONTH_FORMAT","getYear","day","calculatePrevFocusDate","calculateNextFocusDate"],"mappings":"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"}