UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 20.5 kB
{"version":3,"file":"use-basic-date-table.mjs","names":[],"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 '@element-plus/hooks'\nimport { castArray, isArray } from '@element-plus/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 //NOTE: because relying of startDate is not reliable in every weekStart (especially 2, 3); we re-create it\n const startOfMonthDay = unref(days).startOfMonthDay\n const offset = unref(offsetDay)\n const numberOfDaysFromPreviousMonth =\n startOfMonthDay + offset < 0\n ? 7 + startOfMonthDay + offset\n : startOfMonthDay + offset\n const offsetFromStart = row * 7 + (column - (props.showWeekNumber ? 1 : 0))\n return props.date\n .startOf('month')\n .subtract(numberOfDaysFromPreviousMonth, 'day')\n .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 && isNormalDay(cell.type)) ||\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 ns.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"],"mappings":"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"}