@@ -14,12 +14,12 @@ import {
1414 shouldCommitInlineEdit ,
1515 shouldEnsureFixedWidthWrap ,
1616} from "./inlineEdit.js?v=editor-interactions-v4" ;
17- import { createCanvasTextEditor } from "./canvasTextEditor.js?v=editor-interactions-v3 " ;
17+ import { createCanvasTextEditor } from "./canvasTextEditor.js?v=editor-interactions-v5 " ;
1818import { createAutoSaveController } from "./autoSaveController.js" ;
1919import { positionStart } from "./canvasEditorMath.js" ;
2020import { createEditorHistory } from "./editorHistory.js" ;
2121import { appendStructuralPatch , appendStylePatch } from "./patchQueue.js" ;
22- import { dragTargetAtPoint } from "./pointerIntent.js?v=editor-interactions-v3 " ;
22+ import { dragTargetAtPoint } from "./pointerIntent.js?v=editor-interactions-v4 " ;
2323import { activateEmbeddedPreview } from "./previewLifecycle.js" ;
2424import {
2525 injectPreviewBase ,
@@ -32,6 +32,10 @@ import {
3232 planTextFieldContentOperations ,
3333 textStructureSignature ,
3434} from "./textFieldModel.js?v=editor-interactions-v4" ;
35+ import {
36+ applyTableAction ,
37+ tableContextForElement ,
38+ } from "./tableEditing.js?v=table-editing-v1" ;
3539
3640// state 保存编辑器运行时状态;真正的 HTML 内容仍然在 iframe 文档里。
3741const state = {
@@ -764,6 +768,27 @@ function injectEditorLayer() {
764768 markDirty ( ) ;
765769 clearSelection ( ) ;
766770 } ,
771+ onTableAction ( action , context ) {
772+ const tableTarget = targetForElement ( context . table ) ;
773+ const result = applyTableAction ( context , action ) ;
774+ if ( ! result . changed ) {
775+ setStatus ( result . reason || "This table operation is unavailable" , "error" ) ;
776+ state . canvasEditor ?. refresh ( ) ;
777+ return ;
778+ }
779+
780+ queueStructuralPatch ( tableTarget , result . operation ) ;
781+ // A table operation changes its text fingerprint and DOM paths. Cache the
782+ // new identity so a second operation in the same auto-save batch resolves
783+ // against the source produced by the first operation.
784+ state . elementTargets . set (
785+ context . table ,
786+ createElementTarget ( context . table , selectorFor ( context . table ) ) ,
787+ ) ;
788+ markDirty ( ) ;
789+ if ( result . selectedCell ?. isConnected ) selectElement ( result . selectedCell ) ;
790+ else clearSelection ( ) ;
791+ } ,
767792 onSelectionChange ( ) {
768793 syncInspector ( ) ;
769794 } ,
@@ -839,7 +864,8 @@ function injectEditorLayer() {
839864 applyDragMarker ( dragTarget ) ;
840865 return ;
841866 }
842- const target = resolveEditableTextTarget ( event . target ) ;
867+ const tableCell = event . target . closest ?. ( "td, th" ) ;
868+ const target = resolveEditableTextTarget ( event . target ) || tableCell ;
843869 if ( ! target ) {
844870 event . preventDefault ( ) ;
845871 event . stopImmediatePropagation ( ) ;
@@ -950,18 +976,22 @@ function handleEditorShortcut(event) {
950976 }
951977 const element = selectedElement ( ) ;
952978 if ( ! element || isFormControl ( event . target ) ) return ;
979+ const tableContext = tableContextForElement ( element ) ;
953980
954981 if ( modifier && key === "d" ) {
955982 event . preventDefault ( ) ;
983+ if ( tableContext ) return ;
956984 state . canvasEditor ?. duplicateSelected ( ) ;
957985 return ;
958986 }
959987 if ( event . key === "Delete" || event . key === "Backspace" ) {
960988 event . preventDefault ( ) ;
989+ if ( tableContext ) return ;
961990 state . canvasEditor ?. deleteSelected ( ) ;
962991 return ;
963992 }
964993 if ( [ "ArrowLeft" , "ArrowRight" , "ArrowUp" , "ArrowDown" ] . includes ( event . key ) ) {
994+ if ( tableContext ) return ;
965995 event . preventDefault ( ) ;
966996 recordHistory ( ) ;
967997 const step = event . shiftKey ? 10 : 1 ;
0 commit comments