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)
+ }
+}
|