From afaa70d293ee4661e614da414b2adc21d9e8a2bd Mon Sep 17 00:00:00 2001
From: zz <2418184580@qq.com>
Date: Thu, 21 Jul 2022 12:12:32 +0800
Subject: [PATCH] fix(components): [date-picker] prevent duplicate pick date
(#8588)
* fix(components): [date-picker] prevent duplicate pick
* refactor: mousedown instead of click
* chore: fix test
* chore: update
* chore: update
---
.../src/date-picker-com/basic-date-table.vue | 33 +++++++++++++++----
1 file changed, 26 insertions(+), 7 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 709bb2f2ce..b80ab66d51 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
@@ -7,6 +7,8 @@
:class="[ns.b(), { 'is-week-mode': selectionMode === 'week' }]"
@click="handlePickDate"
@mousemove="handleMouseMove"
+ @mousedown="handleMouseDown"
+ @mouseup="handleMouseUp"
>
@@ -28,7 +30,7 @@
| ()
const lastColumn = ref()
const tableRows = ref([[], [], [], [], [], []])
+let focusWithClick = false
+
// todo better way to get Day.js locale object
const firstDayOfWeek = (props.date as any).$locale().weekStart || 7
const WEEKS_CONSTANT = props.date
@@ -365,16 +369,31 @@ const isSelectedCell = (cell: DateCell) => {
)
}
-const handleFocus = (event: Event) => {
- if (!hasCurrent.value && props.selectionMode === 'date') {
- handlePickDate(event, true)
- }
+const handleFocus = (event: FocusEvent) => {
+ if (focusWithClick || hasCurrent.value || props.selectionMode !== 'date')
+ return
+ handlePickDate(event, true)
}
-const handlePickDate = (event: Event, isKeyboardMovement = false) => {
+const handleMouseDown = (event: MouseEvent) => {
+ const target = (event.target as HTMLElement).closest('td')
+ if (!target) return
+ focusWithClick = true
+}
+
+const handleMouseUp = (event: MouseEvent) => {
+ const target = (event.target as HTMLElement).closest('td')
+ if (!target) return
+ focusWithClick = false
+}
+
+const handlePickDate = (
+ event: FocusEvent | MouseEvent,
+ isKeyboardMovement = false
+) => {
const target = (event.target as HTMLElement).closest('td')
- if (!target || target.tagName !== 'TD') return
+ if (!target) return
const row = (target.parentNode as HTMLTableRowElement).rowIndex - 1
const column = (target as HTMLTableCellElement).cellIndex
|