{"version":3,"file":"use-basic-date-table.mjs","sources":["../../../../../../../../packages/components/date-picker-panel/src/composables/use-basic-date-table.ts"],"sourcesContent":["import { computed, nextTick, ref, unref, watch } from 'vue'\nimport dayjs from 'dayjs'\nimport { flatten } from 'lodash-unified'\nimport { useLocale, useNamespace } from '@hd-front-end/hooks'\nimport { castArray, isArray } from '@hd-front-end/utils'\nimport { buildPickerTable } from '../utils'\n\nimport type { SetupContext } from 'vue'\nimport type { Dayjs } from 'dayjs'\nimport type { DateCell } from '../types'\nimport type {\n  BasicDateTableEmits,\n  BasicDateTableProps,\n} from '../props/basic-date-table'\n\nconst isNormalDay = (type = '') => {\n  return ['normal', 'today'].includes(type)\n}\n\nexport const useBasicDateTable = (\n  props: BasicDateTableProps,\n  emit: SetupContext<BasicDateTableEmits>['emit']\n) => {\n  const { lang } = useLocale()\n  const tbodyRef = ref<HTMLElement>()\n  const currentCellRef = ref<HTMLElement>()\n  // data\n  const lastRow = ref<number>()\n  const lastColumn = ref<number>()\n  const tableRows = ref<DateCell[][]>([[], [], [], [], [], []])\n\n  let focusWithClick = false\n\n  // todo better way to get Day.js locale object\n  const firstDayOfWeek = (props.date as any).$locale().weekStart || 7\n  const WEEKS_CONSTANT = props.date\n    .locale('en')\n    .localeData()\n    .weekdaysShort()\n    .map((_) => _.toLowerCase())\n\n  const offsetDay = computed(() => {\n    // Sunday 7(0), cal the left and right offset days, 3217654, such as Monday is -1, the is to adjust the position of the first two rows of dates\n    return firstDayOfWeek > 3 ? 7 - firstDayOfWeek : -firstDayOfWeek\n  })\n\n  const startDate = computed(() => {\n    const startDayOfMonth = props.date.startOf('month')\n    return startDayOfMonth.subtract(startDayOfMonth.day() || 7, 'day')\n  })\n\n  const WEEKS = computed(() => {\n    return WEEKS_CONSTANT.concat(WEEKS_CONSTANT).slice(\n      firstDayOfWeek,\n      firstDayOfWeek + 7\n    )\n  })\n\n  const hasCurrent = computed<boolean>(() => {\n    return flatten(unref(rows)).some((row) => {\n      return row.isCurrent\n    })\n  })\n\n  const days = computed(() => {\n    const startOfMonth = props.date.startOf('month')\n    const startOfMonthDay = startOfMonth.day() || 7 // day of first day\n    const dateCountOfMonth = startOfMonth.daysInMonth()\n\n    const dateCountOfLastMonth = startOfMonth.subtract(1, 'month').daysInMonth()\n\n    return {\n      startOfMonthDay,\n      dateCountOfMonth,\n      dateCountOfLastMonth,\n    }\n  })\n\n  const selectedDate = computed<Dayjs[]>(() => {\n    return props.selectionMode === 'dates' ? castArray(props.parsedValue!) : []\n  })\n\n  // Return value indicates should the counter be incremented\n  type CellCoordinate = { columnIndex: number; rowIndex: number }\n  type CellMeta = CellCoordinate & {\n    count: number\n  }\n  const setDateText = (\n    cell: DateCell,\n    { count, rowIndex, columnIndex }: CellMeta\n  ): boolean => {\n    const { startOfMonthDay, dateCountOfMonth, dateCountOfLastMonth } =\n      unref(days)\n    const offset = unref(offsetDay)\n    if (rowIndex >= 0 && rowIndex <= 1) {\n      const numberOfDaysFromPreviousMonth =\n        startOfMonthDay + offset < 0\n          ? 7 + startOfMonthDay + offset\n          : startOfMonthDay + offset\n\n      if (columnIndex + rowIndex * 7 >= numberOfDaysFromPreviousMonth) {\n        cell.text = count\n        return true\n      } else {\n        cell.text =\n          dateCountOfLastMonth -\n          (numberOfDaysFromPreviousMonth - (columnIndex % 7)) +\n          1 +\n          rowIndex * 7\n        cell.type = 'prev-month'\n      }\n    } else {\n      if (count <= dateCountOfMonth) {\n        cell.text = count\n      } else {\n        cell.text = count - dateCountOfMonth\n        cell.type = 'next-month'\n      }\n      return true\n    }\n    return false\n  }\n\n  const setCellMetadata = (\n    cell: DateCell,\n    { columnIndex, rowIndex }: CellCoordinate,\n    count: number\n  ) => {\n    const { disabledDate, cellClassName } = props\n    const _selectedDate = unref(selectedDate)\n    const shouldIncrement = setDateText(cell, { count, rowIndex, columnIndex })\n\n    const cellDate = cell.dayjs!.toDate()\n    cell.selected = _selectedDate.find((d) => d.isSame(cell.dayjs, 'day'))\n    cell.isSelected = !!cell.selected\n    cell.isCurrent = isCurrent(cell)\n    cell.disabled = disabledDate?.(cellDate)\n    cell.customClass = cellClassName?.(cellDate)\n    return shouldIncrement\n  }\n\n  const setRowMetadata = (row: DateCell[]) => {\n    if (props.selectionMode === 'week') {\n      const [start, end] = props.showWeekNumber ? [1, 7] : [0, 6]\n      const isActive = isWeekActive(row[start + 1])\n      row[start].inRange = isActive\n      row[start].start = isActive\n      row[end].inRange = isActive\n      row[end].end = isActive\n    }\n  }\n\n  const rows = computed(() => {\n    const { minDate, maxDate, rangeState, showWeekNumber } = props\n\n    const offset = unref(offsetDay)\n    const rows_ = unref(tableRows)\n    const dateUnit = 'day'\n    let count = 1\n\n    buildPickerTable({ row: 6, column: 7 }, rows_, {\n      startDate: minDate,\n      columnIndexOffset: showWeekNumber ? 1 : 0,\n      nextEndDate:\n        rangeState.endDate ||\n        maxDate ||\n        (rangeState.selecting && minDate) ||\n        null,\n      now: dayjs().locale(unref(lang)).startOf(dateUnit),\n      unit: dateUnit,\n      relativeDateGetter: (idx: number) =>\n        unref(startDate).add(idx - offset, dateUnit),\n      setCellMetadata: (...args) => {\n        if (setCellMetadata(...args, count)) {\n          count += 1\n        }\n      },\n\n      setRowMetadata,\n    })\n\n    if (showWeekNumber) {\n      for (let rowIndex = 0; rowIndex < 6; rowIndex++) {\n        if (rows_[rowIndex][1].dayjs) {\n          rows_[rowIndex][0] = {\n            type: 'week',\n            text: rows_[rowIndex][1].dayjs!.week(),\n          }\n        }\n      }\n    }\n\n    return rows_\n  })\n\n  watch(\n    () => props.date,\n    async () => {\n      if (unref(tbodyRef)?.contains(document.activeElement)) {\n        await nextTick()\n        await focus()\n        // currentCellRef.value?.focus()\n      }\n    }\n  )\n\n  const focus = async () => unref(currentCellRef)?.focus()\n\n  const isCurrent = (cell: DateCell): boolean => {\n    return (\n      props.selectionMode === 'date' &&\n      isNormalDay(cell.type) &&\n      cellMatchesDate(cell, props.parsedValue as Dayjs)\n    )\n  }\n\n  const cellMatchesDate = (cell: DateCell, date: Dayjs) => {\n    if (!date) return false\n    return dayjs(date)\n      .locale(unref(lang))\n      .isSame(props.date.date(Number(cell.text)), 'day')\n  }\n\n  const getDateOfCell = (row: number, column: number) => {\n    const offsetFromStart =\n      row * 7 + (column - (props.showWeekNumber ? 1 : 0)) - unref(offsetDay)\n    return unref(startDate).add(offsetFromStart, 'day')\n  }\n\n  const handleMouseMove = (event: MouseEvent) => {\n    if (!props.rangeState.selecting) return\n\n    let target = event.target as HTMLElement\n    if (target.tagName === 'SPAN') {\n      target = target.parentNode?.parentNode as HTMLElement\n    }\n    if (target.tagName === 'DIV') {\n      target = target.parentNode as HTMLElement\n    }\n    if (target.tagName !== 'TD') return\n\n    const row = (target.parentNode as HTMLTableRowElement).rowIndex - 1\n    const column = (target as HTMLTableCellElement).cellIndex\n\n    // can not select disabled date\n    if (unref(rows)[row][column].disabled) return\n\n    // only update rangeState when mouse moves to a new cell\n    // this avoids frequent Date object creation and improves performance\n    if (row !== unref(lastRow) || column !== unref(lastColumn)) {\n      lastRow.value = row\n      lastColumn.value = column\n      emit('changerange', {\n        selecting: true,\n        endDate: getDateOfCell(row, column),\n      })\n    }\n  }\n\n  const isSelectedCell = (cell: DateCell) => {\n    return (\n      (!unref(hasCurrent) && cell?.text === 1 && cell.type === 'normal') ||\n      cell.isCurrent\n    )\n  }\n\n  const handleFocus = (event: FocusEvent) => {\n    if (focusWithClick || unref(hasCurrent) || props.selectionMode !== 'date')\n      return\n    handlePickDate(event, true)\n  }\n\n  const handleMouseDown = (event: MouseEvent) => {\n    const target = (event.target as HTMLElement).closest('td')\n    if (!target) return\n    focusWithClick = true\n  }\n\n  const handleMouseUp = (event: MouseEvent) => {\n    const target = (event.target as HTMLElement).closest('td')\n    if (!target) return\n    focusWithClick = false\n  }\n\n  const handleRangePick = (newDate: Dayjs) => {\n    if (!props.rangeState.selecting || !props.minDate) {\n      emit('pick', { minDate: newDate, maxDate: null })\n      emit('select', true)\n    } else {\n      if (newDate >= props.minDate) {\n        emit('pick', { minDate: props.minDate, maxDate: newDate })\n      } else {\n        emit('pick', { minDate: newDate, maxDate: props.minDate })\n      }\n      emit('select', false)\n    }\n  }\n\n  const handleWeekPick = (newDate: Dayjs) => {\n    const weekNumber = newDate.week()\n    const value = `${newDate.year()}w${weekNumber}`\n    emit('pick', {\n      year: newDate.year(),\n      week: weekNumber,\n      value,\n      date: newDate.startOf('week'),\n    })\n  }\n\n  const handleDatesPick = (newDate: Dayjs, selected: boolean) => {\n    const newValue = selected\n      ? castArray(props.parsedValue).filter(\n          (d) => d?.valueOf() !== newDate.valueOf()\n        )\n      : castArray(props.parsedValue).concat([newDate])\n    emit('pick', newValue)\n  }\n\n  const handlePickDate = (\n    event: FocusEvent | MouseEvent,\n    isKeyboardMovement = false\n  ) => {\n    if (props.disabled) return\n    const target = (event.target as HTMLElement).closest('td')\n\n    if (!target) return\n\n    const row = (target.parentNode as HTMLTableRowElement).rowIndex - 1\n    const column = (target as HTMLTableCellElement).cellIndex\n    const cell = unref(rows)[row][column]\n\n    if (cell.disabled || cell.type === 'week') return\n\n    const newDate = getDateOfCell(row, column)\n\n    switch (props.selectionMode) {\n      case 'range': {\n        handleRangePick(newDate)\n        break\n      }\n      case 'date': {\n        emit('pick', newDate, isKeyboardMovement)\n        break\n      }\n      case 'week': {\n        handleWeekPick(newDate)\n        break\n      }\n      case 'dates': {\n        handleDatesPick(newDate, !!cell.selected)\n        break\n      }\n      default: {\n        break\n      }\n    }\n  }\n\n  const isWeekActive = (cell: DateCell) => {\n    if (props.selectionMode !== 'week') return false\n    let newDate = props.date.startOf('day')\n\n    if (cell.type === 'prev-month') {\n      newDate = newDate.subtract(1, 'month')\n    }\n\n    if (cell.type === 'next-month') {\n      newDate = newDate.add(1, 'month')\n    }\n\n    newDate = newDate.date(Number.parseInt(cell.text as any, 10))\n\n    if (props.parsedValue && !isArray(props.parsedValue)) {\n      const dayOffset = ((props.parsedValue.day() - firstDayOfWeek + 7) % 7) - 1\n      const weekDate = props.parsedValue.subtract(dayOffset, 'day')\n      return weekDate.isSame(newDate, 'day')\n    }\n    return false\n  }\n\n  return {\n    WEEKS,\n    rows,\n    tbodyRef,\n    currentCellRef,\n\n    // cellMatchesDate,\n    // getDateOfCell,\n    focus,\n    isCurrent,\n    isWeekActive,\n    isSelectedCell,\n\n    handlePickDate,\n    handleMouseUp,\n    handleMouseDown,\n    handleMouseMove,\n    handleFocus,\n  }\n}\n\nexport const useBasicDateTableDOM = (\n  props: BasicDateTableProps,\n  {\n    isCurrent,\n    isWeekActive,\n  }: Pick<ReturnType<typeof useBasicDateTable>, 'isCurrent' | 'isWeekActive'>\n) => {\n  const ns = useNamespace('date-table')\n  const { t } = useLocale()\n\n  const tableKls = computed(() => [\n    ns.b(),\n    { 'is-week-mode': props.selectionMode === 'week' && !props.disabled },\n  ])\n\n  const tableLabel = computed(() => t('el.datepicker.dateTablePrompt'))\n\n  const getCellClasses = (cell: DateCell) => {\n    const classes: string[] = []\n    if (isNormalDay(cell.type) && !cell.disabled) {\n      classes.push('available')\n      if (cell.type === 'today') {\n        classes.push('today')\n      }\n    } else {\n      classes.push(cell.type!)\n    }\n\n    if (isCurrent(cell)) {\n      classes.push('current')\n    }\n\n    if (\n      cell.inRange &&\n      (isNormalDay(cell.type) || props.selectionMode === 'week')\n    ) {\n      classes.push('in-range')\n\n      if (cell.start) {\n        classes.push('start-date')\n      }\n\n      if (cell.end) {\n        classes.push('end-date')\n      }\n    }\n\n    if (cell.disabled || props.disabled) {\n      classes.push('disabled')\n    }\n\n    if (cell.selected) {\n      classes.push('selected')\n    }\n\n    if (cell.customClass) {\n      classes.push(cell.customClass)\n    }\n\n    return classes.join(' ')\n  }\n\n  const getRowKls = (cell: DateCell) => [\n    ns.e('row'),\n    { current: isWeekActive(cell) },\n  ]\n\n  return {\n    tableKls,\n    tableLabel,\n    weekHeaderClass: ns.e('week-header'),\n\n    getCellClasses,\n    getRowKls,\n    t,\n  }\n}\n"],"names":[],"mappings":"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"}