From 6cde29f559df415dbde8179489dd1344db3be571 Mon Sep 17 00:00:00 2001 From: Jeremy <15975785+jw-foss@users.noreply.github.com> Date: Sun, 5 Jun 2022 21:03:24 +0800 Subject: [PATCH] refactor(components): [date-picker] basic-date-table (#8095) * Refactor `basic-date-table` to script setup. Co-authored-by: JeremyWuuuuu <15975785+JeremyWuuuuu@users.noreply.github.com> --- .../src/date-picker-com/basic-date-table.vue | 744 +++++++++--------- .../src/date-picker-com/basic-month-table.vue | 1 + packages/components/date-picker/src/utils.ts | 90 +++ 3 files changed, 463 insertions(+), 372 deletions(-) diff --git a/packages/components/date-picker/src/date-picker-com/basic-date-table.vue b/packages/components/date-picker/src/date-picker-com/basic-date-table.vue index c351c57a0c..709bb2f2ce 100644 --- a/packages/components/date-picker/src/date-picker-com/basic-date-table.vue +++ b/packages/components/date-picker/src/date-picker-com/basic-date-table.vue @@ -21,17 +21,17 @@ @@ -42,407 +42,407 @@ - diff --git a/packages/components/date-picker/src/date-picker-com/basic-month-table.vue b/packages/components/date-picker/src/date-picker-com/basic-month-table.vue index ca551fe48a..f4acbaf10b 100644 --- a/packages/components/date-picker/src/date-picker-com/basic-month-table.vue +++ b/packages/components/date-picker/src/date-picker-com/basic-month-table.vue @@ -79,6 +79,7 @@ const lastRow = ref() const lastColumn = ref() const rows = computed(() => { const rows = tableRows.value + const now = dayjs().locale(lang.value).startOf('month') for (let i = 0; i < 3; i++) { diff --git a/packages/components/date-picker/src/utils.ts b/packages/components/date-picker/src/utils.ts index ca25ce245c..ffc534e6f2 100644 --- a/packages/components/date-picker/src/utils.ts +++ b/packages/components/date-picker/src/utils.ts @@ -1,6 +1,8 @@ import { default as dayjs, isDayjs } from 'dayjs' import { isArray } from '@element-plus/utils' + import type { Dayjs } from 'dayjs' +import type { DateCell } from './date-picker.type' type DayRange = [Dayjs | undefined, Dayjs | undefined] @@ -40,3 +42,91 @@ export const getDefaultValue = ( start = start.locale(lang) return [start, start.add(1, unit)] } + +type Dimension = { + row: number + column: number +} + +type BuildPickerTableMetadata = { + startDate?: Dayjs | null + unit: 'month' | 'day' + columnIndexOffset: number + now: Dayjs + nextEndDate: Dayjs | null + relativeDateGetter: (index: number) => Dayjs + setCellMetadata?: ( + cell: DateCell, + dimension: { rowIndex: number; columnIndex: number } + ) => void + setRowMetadata?: (row: DateCell[]) => void +} + +export const buildPickerTable = ( + dimension: Dimension, + rows: DateCell[][], + { + columnIndexOffset, + startDate, + nextEndDate, + now, + unit, + relativeDateGetter, + setCellMetadata, + setRowMetadata, + }: BuildPickerTableMetadata +) => { + for (let rowIndex = 0; rowIndex < dimension.row; rowIndex++) { + const row = rows[rowIndex] + for (let columnIndex = 0; columnIndex < dimension.column; columnIndex++) { + let cell = row[columnIndex + columnIndexOffset] + if (!cell) { + cell = { + row: rowIndex, + column: columnIndex, + type: 'normal', + inRange: false, + start: false, + end: false, + } + } + const index = rowIndex * dimension.column + columnIndex + const nextStartDate = relativeDateGetter(index) + cell.dayjs = nextStartDate + cell.date = nextStartDate.toDate() + cell.timestamp = nextStartDate.valueOf() + cell.type = 'normal' + + cell.inRange = + !!( + startDate && + nextStartDate.isSameOrAfter(startDate, unit) && + nextEndDate && + nextStartDate.isSameOrBefore(nextEndDate, unit) + ) || + !!( + startDate && + nextStartDate.isSameOrBefore(startDate, unit) && + nextEndDate && + nextStartDate.isSameOrAfter(nextEndDate, unit) + ) + + if (startDate?.isSameOrAfter(nextEndDate)) { + cell.start = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit) + cell.end = startDate && nextStartDate.isSame(startDate, unit) + } else { + cell.start = !!startDate && nextStartDate.isSame(startDate, unit) + cell.end = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit) + } + + const isToday = nextStartDate.isSame(now, unit) + + if (isToday) { + cell.type = 'today' + } + setCellMetadata?.(cell, { rowIndex, columnIndex }) + row[columnIndex + columnIndexOffset] = cell + } + setRowMetadata?.(row) + } +}