Skip to content

Commit 7e97cef

Browse files
committed
fix: editor support keydown chinese #4847
1 parent a86c6f9 commit 7e97cef

2 files changed

Lines changed: 16 additions & 25 deletions

File tree

packages/vtable/src/edit/edit-manager.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ export class EditManager {
6666
editCellTrigger === 'keydown' ||
6767
(Array.isArray(editCellTrigger) && editCellTrigger.includes('keydown'))
6868
) {
69-
console.log('click-cell', e);
7069
// const { col, row } = e;
7170
// this.beginTriggerEditCellMode = 'keydown';
7271
// const rect = this.table.getCellRangeRelativeRect(this.table.getCellRange(col, row));
@@ -114,7 +113,6 @@ export class EditManager {
114113
referencePosition.rect.height = rect.height + 1; // 这里的1应该根据单元格的borderWidth来定;
115114
}
116115
const editor = (this.table as ListTableAPI).getEditor(col, row);
117-
118116
setTimeout(() => {
119117
// 为什么要加延时:因为这个SELECTED_CHANGED事件是pointerdown过来的,
120118
// 如果这里不加延时,会导致鼠标抬起pointerup的时候将table.getElement()元素设置成焦点,从而导致编辑器失去焦点(因为prepareEdit只是将editor的element设置pointerEvents为none)

packages/vtable/src/event/listener/container-dom.ts

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,7 @@ export function bindContainerDomListener(eventManager: EventManager) {
4747
});
4848

4949
// 监听键盘事件
50-
handler.on(document.body, 'keydown', (e: KeyboardEvent) => {
51-
const selectedRanges = table.stateManager.select.ranges;
52-
const justOneCellSelected =
53-
selectedRanges.length === 1 &&
54-
selectedRanges[0].start.col === selectedRanges[0].end.col &&
55-
selectedRanges[0].start.row === selectedRanges[0].end.row;
56-
const editor =
57-
justOneCellSelected &&
58-
(table as ListTableAPI).getEditor(table.stateManager.select.cellPos.col, table.stateManager.select.cellPos.row);
59-
const editorInput = editor?.getInputElement?.();
60-
61-
if (e.target !== table.getElement() && e.target !== editorInput) {
62-
return;
63-
}
50+
handler.on(table.getElement(), 'keydown', (e: KeyboardEvent) => {
6451
// 键盘按下事件 内部逻辑处理前
6552
const beforeKeydownEvent: KeydownEvent = {
6653
keyCode: e.keyCode ?? e.which,
@@ -149,15 +136,14 @@ export function bindContainerDomListener(eventManager: EventManager) {
149136
if (isCellDisableSelect(table, targetCol, targetRow)) {
150137
return;
151138
}
139+
const isEditingCell = !!(table as ListTableAPI).editorManager?.editingEditor;
140+
// 下面这句completeEdit代码和selectCell代码顺序很重要,不能颠倒,否则会导致编辑器失去焦点(selectCell会触发到edit-manager的selected_changed事件,getEditor会创建editor实例并缓存,completeEdit会清空缓存)
141+
(table as ListTableAPI).editorManager?.completeEdit();
142+
table.getElement().focus();
152143
const enableShiftSelectMode = table.options.keyboardOptions?.shiftMultiSelect ?? true;
153144
table.selectCell(targetCol, targetRow, e.shiftKey && enableShiftSelectMode);
154-
if (
155-
(table.options.keyboardOptions?.moveEditCellOnArrowKeys ?? false) &&
156-
(table as ListTableAPI).editorManager?.editingEditor
157-
) {
145+
if ((table.options.keyboardOptions?.moveEditCellOnArrowKeys ?? false) && isEditingCell) {
158146
// 开启了方向键切换编辑单元格 并且当前已经在编辑状态下 切换到下一个需先退出再进入下个单元格的编辑
159-
(table as ListTableAPI).editorManager?.completeEdit();
160-
table.getElement().focus();
161147
if ((table as ListTableAPI).getEditor(targetCol, targetRow)) {
162148
(table as ListTableAPI).editorManager?.startEditCell(targetCol, targetRow);
163149
}
@@ -238,10 +224,12 @@ export function bindContainerDomListener(eventManager: EventManager) {
238224
if (isCellDisableSelect(table, targetCol, targetRow)) {
239225
return;
240226
}
227+
const isEditingCell = !!(table as ListTableAPI).editorManager?.editingEditor;
228+
// 下面这句completeEdit代码和selectCell代码顺序很重要,不能颠倒,否则会导致编辑器失去焦点(selectCell会触发到edit-manager的selected_changed事件,getEditor会创建editor实例并缓存,completeEdit会清空缓存)
229+
(table as ListTableAPI).editorManager?.completeEdit();
230+
table.getElement().focus();
241231
table.selectCell(targetCol, targetRow);
242-
if ((table as ListTableAPI).editorManager?.editingEditor) {
243-
(table as ListTableAPI).editorManager?.completeEdit();
244-
table.getElement().focus();
232+
if (isEditingCell) {
245233
if ((table as ListTableAPI).getEditor(targetCol, targetRow)) {
246234
(table as ListTableAPI).editorManager?.startEditCell(targetCol, targetRow);
247235
}
@@ -250,6 +238,11 @@ export function bindContainerDomListener(eventManager: EventManager) {
250238
}
251239
} else if (!(e.ctrlKey || e.metaKey)) {
252240
const editCellTrigger = (table.options as ListTableConstructorOptions).editCellTrigger;
241+
const selectedRanges = table.stateManager.select.ranges;
242+
const justOneCellSelected =
243+
selectedRanges.length === 1 &&
244+
selectedRanges[0].start.col === selectedRanges[0].end.col &&
245+
selectedRanges[0].start.row === selectedRanges[0].end.row;
253246
if (justOneCellSelected) {
254247
if (
255248
(editCellTrigger === 'keydown' || (Array.isArray(editCellTrigger) && editCellTrigger.includes('keydown'))) &&

0 commit comments

Comments
 (0)