@visactor/vtable-sheet 1.22.13-alpha.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/sheet-tab-event-handler.js +1 -1
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +18 -12
- package/cjs/components/vtable-sheet.js +77 -48
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +12 -7
- package/cjs/core/WorkSheet.js +38 -67
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +1 -1
- package/cjs/core/table-plugins.js +45 -24
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/base-event-manager.d.ts +21 -0
- package/cjs/event/base-event-manager.js +58 -0
- package/cjs/event/base-event-manager.js.map +1 -0
- package/cjs/event/dom-event-manager.d.ts +10 -0
- package/cjs/event/dom-event-manager.js +31 -0
- package/cjs/event/dom-event-manager.js.map +1 -0
- package/cjs/event/event-interfaces.d.ts +46 -0
- package/cjs/event/event-interfaces.js +6 -0
- package/cjs/event/event-interfaces.js.map +1 -0
- package/cjs/event/event-performance.d.ts +20 -0
- package/cjs/event/event-performance.js +94 -0
- package/cjs/event/event-performance.js.map +1 -0
- package/cjs/event/event-validator.d.ts +10 -0
- package/cjs/event/event-validator.js +78 -0
- package/cjs/event/event-validator.js.map +1 -0
- package/cjs/event/formula-event-utils.d.ts +30 -0
- package/cjs/event/formula-event-utils.js +69 -0
- package/cjs/event/formula-event-utils.js.map +1 -0
- package/cjs/event/index.d.ts +9 -0
- package/cjs/event/index.js +78 -0
- package/cjs/event/index.js.map +1 -0
- package/cjs/event/spreadsheet-event-manager.d.ts +27 -0
- package/cjs/event/spreadsheet-event-manager.js +143 -0
- package/cjs/event/spreadsheet-event-manager.js.map +1 -0
- package/cjs/event/table-event-relay.d.ts +30 -0
- package/cjs/event/table-event-relay.js +105 -0
- package/cjs/event/table-event-relay.js.map +1 -0
- package/cjs/event/vtable-sheet-event-bus.d.ts +23 -0
- package/cjs/event/vtable-sheet-event-bus.js +75 -0
- package/cjs/event/vtable-sheet-event-bus.js.map +1 -0
- package/cjs/event/worksheet-event-manager.d.ts +28 -0
- package/cjs/event/worksheet-event-manager.js +82 -0
- package/cjs/event/worksheet-event-manager.js.map +1 -0
- package/cjs/formula/formula-engine.js +7 -4
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/formula/formula-range-selector.d.ts +3 -3
- package/cjs/formula/formula-range-selector.js +4 -4
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/index.js +1 -2
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +1 -0
- package/cjs/managers/formula-manager.js +33 -2
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +32 -7
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +4 -1
- package/cjs/managers/sheet-manager.js +40 -5
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.js +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +11 -12
- package/cjs/sheet-helper.js +18 -23
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/styles/sheet-tab.js +2 -1
- package/cjs/ts-types/formula.js +1 -2
- package/cjs/ts-types/index.d.ts +1 -1
- package/cjs/ts-types/index.js +3 -3
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/spreadsheet-events.d.ts +195 -0
- package/cjs/ts-types/spreadsheet-events.js +26 -0
- package/cjs/ts-types/spreadsheet-events.js.map +1 -0
- package/dist/vtable-sheet.js +1240 -366
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +1 -1
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +18 -12
- package/es/components/vtable-sheet.js +84 -51
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +12 -7
- package/es/core/WorkSheet.js +38 -69
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +1 -1
- package/es/core/table-plugins.js +45 -24
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/base-event-manager.d.ts +21 -0
- package/es/event/base-event-manager.js +52 -0
- package/es/event/base-event-manager.js.map +1 -0
- package/es/event/dom-event-manager.d.ts +10 -0
- package/es/event/dom-event-manager.js +23 -0
- package/es/event/dom-event-manager.js.map +1 -0
- package/es/event/event-interfaces.d.ts +46 -0
- package/es/event/event-interfaces.js +2 -0
- package/es/event/event-interfaces.js.map +1 -0
- package/es/event/event-performance.d.ts +20 -0
- package/es/event/event-performance.js +86 -0
- package/es/event/event-performance.js.map +1 -0
- package/es/event/event-validator.d.ts +10 -0
- package/es/event/event-validator.js +70 -0
- package/es/event/event-validator.js.map +1 -0
- package/es/event/formula-event-utils.d.ts +30 -0
- package/es/event/formula-event-utils.js +61 -0
- package/es/event/formula-event-utils.js.map +1 -0
- package/es/event/index.d.ts +9 -0
- package/es/event/index.js +16 -0
- package/es/event/index.js.map +1 -0
- package/es/event/spreadsheet-event-manager.d.ts +27 -0
- package/es/event/spreadsheet-event-manager.js +137 -0
- package/es/event/spreadsheet-event-manager.js.map +1 -0
- package/es/event/table-event-relay.d.ts +30 -0
- package/es/event/table-event-relay.js +97 -0
- package/es/event/table-event-relay.js.map +1 -0
- package/es/event/vtable-sheet-event-bus.d.ts +23 -0
- package/es/event/vtable-sheet-event-bus.js +67 -0
- package/es/event/vtable-sheet-event-bus.js.map +1 -0
- package/es/event/worksheet-event-manager.d.ts +28 -0
- package/es/event/worksheet-event-manager.js +76 -0
- package/es/event/worksheet-event-manager.js.map +1 -0
- package/es/formula/formula-engine.js +7 -4
- package/es/formula/formula-engine.js.map +1 -1
- package/es/formula/formula-range-selector.d.ts +3 -3
- package/es/formula/formula-range-selector.js +5 -3
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/index.js +1 -2
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +1 -0
- package/es/managers/formula-manager.js +33 -2
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +32 -7
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +4 -1
- package/es/managers/sheet-manager.js +39 -5
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.js +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +11 -12
- package/es/sheet-helper.js +13 -16
- package/es/sheet-helper.js.map +1 -1
- package/es/styles/sheet-tab.js +2 -1
- package/es/ts-types/formula.js +1 -2
- package/es/ts-types/index.d.ts +1 -1
- package/es/ts-types/index.js +2 -2
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/spreadsheet-events.d.ts +195 -0
- package/es/ts-types/spreadsheet-events.js +23 -0
- package/es/ts-types/spreadsheet-events.js.map +1 -0
- package/package.json +5 -5
- package/cjs/event/event-manager.d.ts +0 -28
- package/cjs/event/event-manager.js +0 -62
- package/cjs/event/event-manager.js.map +0 -1
- package/cjs/event/event-target.d.ts +0 -12
- package/cjs/event/event-target.js +0 -50
- package/cjs/event/event-target.js.map +0 -1
- package/cjs/ts-types/event.d.ts +0 -90
- package/cjs/ts-types/event.js +0 -11
- package/cjs/ts-types/event.js.map +0 -1
- package/cjs/ts-types/events.d.ts +0 -1
- package/cjs/ts-types/events.js +0 -1
- package/cjs/ts-types/events.js.map +0 -1
- package/es/event/event-manager.d.ts +0 -28
- package/es/event/event-manager.js +0 -54
- package/es/event/event-manager.js.map +0 -1
- package/es/event/event-target.d.ts +0 -12
- package/es/event/event-target.js +0 -42
- package/es/event/event-target.js.map +0 -1
- package/es/ts-types/event.d.ts +0 -90
- package/es/ts-types/event.js +0 -7
- package/es/ts-types/event.js.map +0 -1
- package/es/ts-types/events.d.ts +0 -1
- package/es/ts-types/events.js +0 -1
- package/es/ts-types/events.js.map +0 -1
|
@@ -111,7 +111,7 @@ class SheetTabEventHandler {
|
|
|
111
111
|
const div = document.createElement("div");
|
|
112
112
|
div.className = "vtable-sheet-menu-delete-button", div.innerHTML = '<svg class="x-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>',
|
|
113
113
|
div.addEventListener("click", (e => {
|
|
114
|
-
|
|
114
|
+
this.vTableSheet.removeSheet(sheet.sheetKey), e.stopPropagation();
|
|
115
115
|
})), li.addEventListener("click", (() => this.vTableSheet.activateSheet(sheet.sheetKey))),
|
|
116
116
|
li.appendChild(div), menuContainer.appendChild(li);
|
|
117
117
|
})), this.activeSheetMenuItem(), setTimeout((() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/sheet-tab-event-handler.ts"],"names":[],"mappings":";;;AACA,mDAAoD;AACpD,oCAAyC;AAMzC,MAAa,oBAAoB;IAG/B,YAAY,WAAwB;QA4M5B,wBAAmB,GAAG,CAAC,KAAiB,EAAQ,EAAE;;YACxD,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,WAAW;iBACnC,kBAAkB,EAAE,0CACnB,aAAa,CAAC,yBAAyB,CAAgB,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,0CAAE,aAAa,CAAC,2BAA2B,CAAgB,CAAC;YAGpH,IACE,aAAa;gBACb,UAAU;gBACV,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBAC7C,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAC1C;gBACA,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACnC;QACH,CAAC,CAAC;QA3NA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAQD,sBAAsB,CAAC,QAAgB,EAAE,aAAqB;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,EAAE;YACd,OAAO;SACR;QAED,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAClD,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5B,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAE,EAAE;YACrC,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;gBACrB,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,IAAI,CAAC,CAAC;aACnB;iBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC7B,WAAW,CAAC,KAAK,CAAC,CAAC;aACpB;QACH,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,MAAe,EAAE,EAAE;;YACtC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9C,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpD,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAA,SAAS,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBAClF,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;gBACtC,OAAO;aACR;QACH,CAAC,CAAC;QACF,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAQO,WAAW,CAAC,QAAgB,EAAE,QAAgB;;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,KAAK,CAAC;SACd;QACD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE;YACT,IAAA,uBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,KAAK,CAAC;SACd;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW;aAC7B,eAAe,EAAE;aACjB,YAAY,EAAE;aACd,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,IAAI,OAAO,EAAE;YACX,IAAA,uBAAY,EAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,0CAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAGtE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE1E,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAKO,uBAAuB,CAAC,QAAgB;;QAC9C,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,WAAW;aACnC,kBAAkB,EAAE,0CACnB,aAAa,CAAC,8BAA8B,CAAgB,CAAC;QACjE,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,CAAC,+BAA+B,QAAQ,IAAI,CAAgB,CAAC;IAClG,CAAC;IAKD,cAAc;;QACZ,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,WAAW;aAC1B,kBAAkB,EAAE,0CACnB,gBAAgB,CAAC,mBAAmB,CAA4B,CAAC;QACrE,IAAI,SAAS,GAAuB,IAAI,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;;YACjB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,MAAK,MAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,0CAAE,MAAM,EAAE,CAAA,EAAE;gBACnE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,SAAS,GAAG,GAAG,CAAC;aACjB;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;aACpE;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAQD,iBAAiB,CAAC,aAA0B,EAAE,QAAqB,EAAE,SAAsB;QAEzF,IAAI,aAAa,CAAC,UAAU,GAAG,EAAE,EAAE;YACjC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SAClC;aAAM;YACL,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SACjC;QAGD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;QACxE,IAAI,aAAa,CAAC,UAAU,GAAG,SAAS,GAAG,EAAE,EAAE;YAC7C,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SACnC;aAAM;YACL,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAClC;IACH,CAAC;IAOD,eAAe,CAAC,SAA2B,EAAE,aAA0B;QACrE,MAAM,YAAY,GAAG,GAAG,CAAC;QACzB,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC;QAE/C,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,aAAa,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;gBAC/C,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAC;SACJ;aAAM;YACL,aAAa,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,aAAa,GAAG,YAAY;gBAClC,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAC;SACJ;IACH,CAAC;IAOD,iBAAiB,CAAC,GAAgB,EAAE,SAAsB;QACxD,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAExD,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE;YAErC,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC;SAChE;aAAM,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE;YAE9C,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;SAClE;IACH,CAAC;IAKD,eAAe,CAAC,KAAiB;;QAC/B,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,WAAW;aACnC,kBAAkB,EAAE,0CACnB,aAAa,CAAC,yBAAyB,CAAgB,CAAC;QAC5D,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAGzC,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC9C,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;aAAM;YACL,IAAI,CAAC,0BAA0B,EAAE,CAAC;SACnC;IACH,CAAC;IA0BD,uBAAuB;QACrB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IAKD,0BAA0B;QACxB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClE,CAAC;IAKD,eAAe;;QACb,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,WAAW;aACnC,kBAAkB,EAAE,0CACnB,aAAa,CAAC,yBAAyB,CAAgB,CAAC;QAC5D,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,CAAC;QACjE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAErB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACxC,EAAE,CAAC,SAAS,GAAG,wBAAwB,CAAC;YACxC,EAAE,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;YAEhC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,SAAS,GAAG,8BAA8B,CAAC;YACjD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEtB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,CAAC,SAAS,GAAG,iCAAiC,CAAC;YAClD,GAAG,CAAC,SAAS;gBACX,gHAAgH;oBAChH,8GAA8G;oBAC9G,8GAA8G;oBAC9G,QAAQ,CAAC;YACX,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;gBAChC,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnF,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpB,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,qCAAqC,CAAC,CAAC;YACtF,IAAI,UAAU,EAAE;gBACd,UAAU,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;aACrE;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAKD,mBAAmB;;QACjB,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW;aAC/B,kBAAkB,EAAE,0CACnB,gBAAgB,CAAC,8BAA8B,CAA4B,CAAC;QAChF,IAAI,UAAU,GAAuB,IAAI,CAAC;QAC1C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;;YACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,MAAK,MAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,0CAAE,MAAM,EAAE,CAAA,EAAE;gBACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7B,UAAU,GAAG,IAAI,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,UAAU,EAAE;gBACd,UAAU,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;aACrE;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;CACF;AAjTD,oDAiTC","file":"sheet-tab-event-handler.js","sourcesContent":["import type VTableSheet from './vtable-sheet';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport { checkTabTitle } from '../tools';\n\n/**\n * Sheet Tab Event Handler\n * 专门处理sheet标签页相关的事件逻辑\n */\nexport class SheetTabEventHandler {\n private vTableSheet: VTableSheet;\n\n constructor(vTableSheet: VTableSheet) {\n this.vTableSheet = vTableSheet;\n }\n\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.vTableSheet.getSheetManager().getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.vTableSheet\n .getSheetManager()\n .getAllSheets()\n .find(s => s.sheetKey !== sheetKey && s.sheetTitle.toLowerCase() === newTitle.toLowerCase());\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n this.vTableSheet.getSheetManager().renameSheet(sheetKey, newTitle);\n this.vTableSheet.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n\n // 更新公式引擎中的工作表标题映射\n this.vTableSheet.getFormulaManager().updateSheetTitle(sheetKey, newTitle);\n\n this.vTableSheet.updateSheetTabs();\n this.vTableSheet.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 激活sheet标签并滚动到可见区域\n */\n activeSheetTab(): void {\n const tabs = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 显示工作表菜单\n */\n toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n\n // 如果菜单被打开,添加点击外部关闭的监听器\n if (menuContainer.classList.contains('active')) {\n this.addClickOutsideListener();\n } else {\n this.removeClickOutsideListener();\n }\n }\n\n /**\n * 添加点击外部关闭菜单的监听器\n */\n private clickOutsideHandler = (event: MouseEvent): void => {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n const menuButton = this.vTableSheet.getSheetTabElement()?.querySelector('.vtable-sheet-menu-button') as HTMLElement;\n\n // 如果点击的不是菜单容器和菜单按钮,则关闭菜单\n if (\n menuContainer &&\n menuButton &&\n !menuContainer.contains(event.target as Node) &&\n !menuButton.contains(event.target as Node)\n ) {\n menuContainer.classList.remove('active');\n this.removeClickOutsideListener();\n }\n };\n\n /**\n * 添加点击外部监听器\n */\n addClickOutsideListener(): void {\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 移除点击外部监听器\n */\n removeClickOutsideListener(): void {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.vTableSheet.getSheetManager().getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n e.stopPropagation();\n this.vTableSheet.removeSheet(sheet.sheetKey);\n });\n li.addEventListener('click', () => this.vTableSheet.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n activeSheetMenuItem(): void {\n const menuItems = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/sheet-tab-event-handler.ts"],"names":[],"mappings":"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","file":"sheet-tab-event-handler.js","sourcesContent":["import type VTableSheet from './vtable-sheet';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport { checkTabTitle } from '../tools';\n\n/**\n * Sheet Tab Event Handler\n * 专门处理sheet标签页相关的事件逻辑\n */\nexport class SheetTabEventHandler {\n private vTableSheet: VTableSheet;\n\n constructor(vTableSheet: VTableSheet) {\n this.vTableSheet = vTableSheet;\n }\n\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.vTableSheet.getSheetManager().getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.vTableSheet\n .getSheetManager()\n .getAllSheets()\n .find(s => s.sheetKey !== sheetKey && s.sheetTitle.toLowerCase() === newTitle.toLowerCase());\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n\n this.vTableSheet.getSheetManager().renameSheet(sheetKey, newTitle);\n this.vTableSheet.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n\n // 更新公式引擎中的工作表标题映射\n this.vTableSheet.getFormulaManager().updateSheetTitle(sheetKey, newTitle);\n\n this.vTableSheet.updateSheetTabs();\n this.vTableSheet.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 激活sheet标签并滚动到可见区域\n */\n activeSheetTab(): void {\n const tabs = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 显示工作表菜单\n */\n toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n\n // 如果菜单被打开,添加点击外部关闭的监听器\n if (menuContainer.classList.contains('active')) {\n this.addClickOutsideListener();\n } else {\n this.removeClickOutsideListener();\n }\n }\n\n /**\n * 添加点击外部关闭菜单的监听器\n */\n private clickOutsideHandler = (event: MouseEvent): void => {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n const menuButton = this.vTableSheet.getSheetTabElement()?.querySelector('.vtable-sheet-menu-button') as HTMLElement;\n\n // 如果点击的不是菜单容器和菜单按钮,则关闭菜单\n if (\n menuContainer &&\n menuButton &&\n !menuContainer.contains(event.target as Node) &&\n !menuButton.contains(event.target as Node)\n ) {\n menuContainer.classList.remove('active');\n this.removeClickOutsideListener();\n }\n };\n\n /**\n * 添加点击外部监听器\n */\n addClickOutsideListener(): void {\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 移除点击外部监听器\n */\n removeClickOutsideListener(): void {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.vTableSheet.getSheetManager().getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n this.vTableSheet.removeSheet(sheet.sheetKey);\n e.stopPropagation();\n });\n li.addEventListener('click', () => this.vTableSheet.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n activeSheetMenuItem(): void {\n const menuItems = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n}\n"]}
|
|
@@ -3,7 +3,11 @@ import SheetManager from '../managers/sheet-manager';
|
|
|
3
3
|
import { WorkSheet } from '../core/WorkSheet';
|
|
4
4
|
import type { IVTableSheetOptions, ISheetDefine } from '../ts-types';
|
|
5
5
|
import type { MultiSheetImportResult } from '@visactor/vtable-plugins/src/excel-import/types';
|
|
6
|
+
import type { TableEventHandlersEventArgumentMap } from '@visactor/vtable/es/ts-types/events';
|
|
6
7
|
import { FormulaUIManager } from '../formula/formula-ui-manager';
|
|
8
|
+
import type { VTableSheetEventType } from '../ts-types/spreadsheet-events';
|
|
9
|
+
import { SpreadSheetEventManager } from '../event/spreadsheet-event-manager';
|
|
10
|
+
import { VTableSheetEventBus } from '../event/vtable-sheet-event-bus';
|
|
7
11
|
export default class VTableSheet {
|
|
8
12
|
private container;
|
|
9
13
|
private options;
|
|
@@ -14,6 +18,9 @@ export default class VTableSheet {
|
|
|
14
18
|
private activeWorkSheet;
|
|
15
19
|
workSheetInstances: Map<string, WorkSheet>;
|
|
16
20
|
private formulaAutocomplete;
|
|
21
|
+
private tableEventRelay;
|
|
22
|
+
private spreadsheetEventManager;
|
|
23
|
+
private eventBus;
|
|
17
24
|
formulaUIManager: FormulaUIManager;
|
|
18
25
|
private rootElement;
|
|
19
26
|
private formulaBarElement;
|
|
@@ -34,7 +41,6 @@ export default class VTableSheet {
|
|
|
34
41
|
private initSheets;
|
|
35
42
|
activateSheet(sheetKey: string): void;
|
|
36
43
|
addSheet(sheet: ISheetDefine): void;
|
|
37
|
-
private _selectExcelFile;
|
|
38
44
|
removeSheet(sheetKey: string): void;
|
|
39
45
|
getSheetCount(): number;
|
|
40
46
|
getSheet(sheetKey: string): ISheetDefine | null;
|
|
@@ -46,9 +52,20 @@ export default class VTableSheet {
|
|
|
46
52
|
private _addNewSheet;
|
|
47
53
|
private updateFormulaBar;
|
|
48
54
|
getFormulaManager(): FormulaManager;
|
|
55
|
+
getSpreadSheetEventManager(): SpreadSheetEventManager;
|
|
56
|
+
getEventBus(): VTableSheetEventBus;
|
|
49
57
|
getSheetManager(): SheetManager;
|
|
50
58
|
getActiveSheet(): WorkSheet | null;
|
|
59
|
+
onTableEvent<K extends keyof TableEventHandlersEventArgumentMap>(type: K, callback: (event: TableEventHandlersEventArgumentMap[K] & {
|
|
60
|
+
sheetKey: string;
|
|
61
|
+
}) => void): void;
|
|
62
|
+
offTableEvent(type: string, callback?: (...args: any[]) => void): void;
|
|
63
|
+
onSheetEvent(type: string, callback: (event: any) => void): void;
|
|
64
|
+
offSheetEvent(type: string, callback?: (event: any) => void): void;
|
|
65
|
+
on(type: VTableSheetEventType, callback: (event: any) => void): void;
|
|
66
|
+
off(type: VTableSheetEventType, callback?: (event: any) => void): void;
|
|
51
67
|
getSheetByName(sheetName: string): WorkSheet | null;
|
|
68
|
+
getWorkSheetByKey(sheetKey: string): WorkSheet | null;
|
|
52
69
|
saveToConfig(): IVTableSheetOptions;
|
|
53
70
|
exportSheetToFile(fileType: 'csv' | 'xlsx', allSheets?: boolean): void;
|
|
54
71
|
exportAllSheetsToExcel(): void;
|
|
@@ -66,15 +83,4 @@ export default class VTableSheet {
|
|
|
66
83
|
exportData(sheetKey: string): any[][];
|
|
67
84
|
exportAllData(): any[][];
|
|
68
85
|
resize(): void;
|
|
69
|
-
excludeEditCellFromSelection(range: {
|
|
70
|
-
startRow: number;
|
|
71
|
-
startCol: number;
|
|
72
|
-
endRow: number;
|
|
73
|
-
endCol: number;
|
|
74
|
-
}, editRow: number, editCol: number): {
|
|
75
|
-
startRow: number;
|
|
76
|
-
startCol: number;
|
|
77
|
-
endRow: number;
|
|
78
|
-
endCol: number;
|
|
79
|
-
};
|
|
80
86
|
}
|
|
@@ -65,7 +65,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
65
65
|
value: !0
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"),
|
|
68
|
+
const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), dom_event_manager_1 = require("../event/dom-event-manager"), snackbar_1 = require("../tools/ui/snackbar"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager"), sheet_tab_event_handler_1 = require("./sheet-tab-event-handler"), table_event_relay_1 = require("../event/table-event-relay"), spreadsheet_event_manager_1 = require("../event/spreadsheet-event-manager"), vtable_sheet_event_bus_1 = require("../event/vtable-sheet-event-bus");
|
|
69
69
|
|
|
70
70
|
VTable.register.editor("formula", formula_editor_1.formulaEditor);
|
|
71
71
|
|
|
@@ -73,10 +73,12 @@ class VTableSheet {
|
|
|
73
73
|
constructor(container, options) {
|
|
74
74
|
this.activeWorkSheet = null, this.workSheetInstances = new Map, this.formulaAutocomplete = null,
|
|
75
75
|
this.formulaBarElement = null, this.sheetTabElement = null, this.mainMenuElement = null,
|
|
76
|
-
this.container = container, this.options = this.mergeDefaultOptions(options), this.
|
|
77
|
-
this.
|
|
76
|
+
this.container = container, this.options = this.mergeDefaultOptions(options), this.eventBus = new vtable_sheet_event_bus_1.VTableSheetEventBus,
|
|
77
|
+
this.sheetManager = new sheet_manager_1.default(this.eventBus), this.formulaManager = new formula_manager_1.FormulaManager(this),
|
|
78
|
+
this.tableEventRelay = new table_event_relay_1.TableEventRelay(this), this.eventManager = new dom_event_manager_1.DomEventManager(this),
|
|
78
79
|
this.dragManager = new tab_drag_manager_1.default(this), this.menuManager = new menu_manager_1.MenuManager(this),
|
|
79
80
|
this.formulaUIManager = new formula_ui_manager_1.FormulaUIManager(this), this.sheetTabEventHandler = new sheet_tab_event_handler_1.SheetTabEventHandler(this),
|
|
81
|
+
this.spreadsheetEventManager = new spreadsheet_event_manager_1.SpreadSheetEventManager(this),
|
|
80
82
|
this.initUI(), this.initSheets(), this.resize();
|
|
81
83
|
}
|
|
82
84
|
mergeDefaultOptions(options) {
|
|
@@ -151,9 +153,7 @@ class VTableSheet {
|
|
|
151
153
|
var _a;
|
|
152
154
|
if (void 0 === tabsContainer && (tabsContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container")),
|
|
153
155
|
!tabsContainer) return;
|
|
154
|
-
tabsContainer.
|
|
155
|
-
tab.remove();
|
|
156
|
-
}));
|
|
156
|
+
tabsContainer.innerHTML = "";
|
|
157
157
|
this.sheetManager.getAllSheets().forEach(((sheet, index) => {
|
|
158
158
|
tabsContainer.appendChild(this.createSheetTabItem(sheet, index));
|
|
159
159
|
})), this._activeSheetTab();
|
|
@@ -181,14 +181,16 @@ class VTableSheet {
|
|
|
181
181
|
} else this._addNewSheet();
|
|
182
182
|
}
|
|
183
183
|
activateSheet(sheetKey) {
|
|
184
|
+
const previousActiveSheet = this.sheetManager.getActiveSheet(), previousSheetKey = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetKey, previousSheetTitle = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetTitle;
|
|
184
185
|
this.sheetManager.setActiveSheet(sheetKey);
|
|
185
186
|
const sheetDefine = this.sheetManager.getSheet(sheetKey);
|
|
186
187
|
if (sheetDefine) {
|
|
187
188
|
if (this.workSheetInstances.forEach((instance => {
|
|
188
|
-
instance.getElement().style.display = "none";
|
|
189
|
+
instance.getElement().style.display = "none", instance.tableInstance && this.tableEventRelay.unbindSheetEvents(instance.sheetKey, instance.tableInstance);
|
|
189
190
|
})), this.workSheetInstances.has(sheetKey)) {
|
|
190
191
|
const instance = this.workSheetInstances.get(sheetKey);
|
|
191
192
|
instance.getElement().style.display = "block", this.activeWorkSheet = instance,
|
|
193
|
+
instance.tableInstance && this.tableEventRelay.bindSheetEvents(instance.sheetKey, instance.tableInstance),
|
|
192
194
|
this.formulaManager.setActiveSheet(sheetKey), this._activeSheetTab(), this.sheetTabEventHandler.activeSheetMenuItem(),
|
|
193
195
|
this.restoreFilterState(instance, sheetDefine);
|
|
194
196
|
} else {
|
|
@@ -197,29 +199,17 @@ class VTableSheet {
|
|
|
197
199
|
this.formulaManager.setActiveSheet(sheetKey), this.updateSheetTabs(), this.updateSheetMenu(),
|
|
198
200
|
this.restoreFilterState(instance, sheetDefine);
|
|
199
201
|
}
|
|
200
|
-
this.updateFormulaBar()
|
|
202
|
+
this.updateFormulaBar(), this.spreadsheetEventManager.emitSheetActivated(sheetKey, sheetDefine.sheetTitle, previousSheetKey, previousSheetTitle),
|
|
203
|
+
previousSheetKey && previousSheetKey !== sheetKey && this.spreadsheetEventManager.emitSheetDeactivated(previousSheetKey, previousSheetTitle);
|
|
201
204
|
}
|
|
202
205
|
}
|
|
203
206
|
addSheet(sheet) {
|
|
204
207
|
this.sheetManager.addSheet(sheet), this.updateSheetTabs(), this.updateSheetMenu();
|
|
205
208
|
}
|
|
206
|
-
_selectExcelFile() {
|
|
207
|
-
return new Promise((resolve => {
|
|
208
|
-
const input = document.createElement("input");
|
|
209
|
-
input.type = "file", input.accept = ".xlsx,.xls", input.style.display = "none",
|
|
210
|
-
document.body.appendChild(input), input.addEventListener("change", (e => {
|
|
211
|
-
var _a;
|
|
212
|
-
const file = null === (_a = e.target.files) || void 0 === _a ? void 0 : _a[0];
|
|
213
|
-
document.body.removeChild(input), resolve(file || null);
|
|
214
|
-
})), input.addEventListener("cancel", (() => {
|
|
215
|
-
document.body.removeChild(input), resolve(null);
|
|
216
|
-
})), input.click();
|
|
217
|
-
}));
|
|
218
|
-
}
|
|
219
209
|
removeSheet(sheetKey) {
|
|
220
210
|
if (this.sheetManager.getSheetCount() <= 1) return void (0, snackbar_1.showSnackbar)("至少保留一个工作表", 1300);
|
|
221
211
|
const instance = this.workSheetInstances.get(sheetKey);
|
|
222
|
-
instance && (instance.
|
|
212
|
+
instance && (instance.release(), this.workSheetInstances.delete(sheetKey));
|
|
223
213
|
const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);
|
|
224
214
|
newActiveSheetKey && this.activateSheet(newActiveSheetKey), this.updateSheetTabs(),
|
|
225
215
|
this.updateSheetMenu();
|
|
@@ -261,10 +251,6 @@ class VTableSheet {
|
|
|
261
251
|
customMergeCell: sheetDefine.cellMerge,
|
|
262
252
|
theme: (null === (_b = sheetDefine.theme) || void 0 === _b ? void 0 : _b.tableTheme) || (null === (_c = this.options.theme) || void 0 === _c ? void 0 : _c.tableTheme)
|
|
263
253
|
}));
|
|
264
|
-
sheet.on(ts_types_1.WorkSheetEventType.CELL_CLICK, this.eventManager.handleCellClickBind),
|
|
265
|
-
sheet.on(ts_types_1.WorkSheetEventType.CELL_VALUE_CHANGED, this.eventManager.handleCellValueChangedBind),
|
|
266
|
-
sheet.on(ts_types_1.WorkSheetEventType.SELECTION_CHANGED, this.eventManager.handleSelectionChangedForRangeModeBind),
|
|
267
|
-
sheet.on(ts_types_1.WorkSheetEventType.SELECTION_END, this.eventManager.handleSelectionChangedForRangeModeBind);
|
|
268
254
|
try {
|
|
269
255
|
const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);
|
|
270
256
|
this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData, sheetDefine.sheetTitle),
|
|
@@ -328,12 +314,36 @@ class VTableSheet {
|
|
|
328
314
|
getFormulaManager() {
|
|
329
315
|
return this.formulaManager;
|
|
330
316
|
}
|
|
317
|
+
getSpreadSheetEventManager() {
|
|
318
|
+
return this.spreadsheetEventManager;
|
|
319
|
+
}
|
|
320
|
+
getEventBus() {
|
|
321
|
+
return this.eventBus;
|
|
322
|
+
}
|
|
331
323
|
getSheetManager() {
|
|
332
324
|
return this.sheetManager;
|
|
333
325
|
}
|
|
334
326
|
getActiveSheet() {
|
|
335
327
|
return this.activeWorkSheet;
|
|
336
328
|
}
|
|
329
|
+
onTableEvent(type, callback) {
|
|
330
|
+
this.tableEventRelay.onTableEvent(type, callback);
|
|
331
|
+
}
|
|
332
|
+
offTableEvent(type, callback) {
|
|
333
|
+
this.tableEventRelay.offTableEvent(type, callback);
|
|
334
|
+
}
|
|
335
|
+
onSheetEvent(type, callback) {
|
|
336
|
+
this.spreadsheetEventManager.on(type, callback);
|
|
337
|
+
}
|
|
338
|
+
offSheetEvent(type, callback) {
|
|
339
|
+
this.spreadsheetEventManager.off(type, callback);
|
|
340
|
+
}
|
|
341
|
+
on(type, callback) {
|
|
342
|
+
this.onSheetEvent(type, callback);
|
|
343
|
+
}
|
|
344
|
+
off(type, callback) {
|
|
345
|
+
this.offSheetEvent(type, callback);
|
|
346
|
+
}
|
|
337
347
|
getSheetByName(sheetName) {
|
|
338
348
|
for (const [sheetKey, workSheet] of this.workSheetInstances) {
|
|
339
349
|
const sheetDefine = this.sheetManager.getSheet(sheetKey);
|
|
@@ -341,6 +351,9 @@ class VTableSheet {
|
|
|
341
351
|
}
|
|
342
352
|
return null;
|
|
343
353
|
}
|
|
354
|
+
getWorkSheetByKey(sheetKey) {
|
|
355
|
+
return this.workSheetInstances.get(sheetKey) || null;
|
|
356
|
+
}
|
|
344
357
|
saveToConfig() {
|
|
345
358
|
const sheets = [];
|
|
346
359
|
return this.sheetManager.getAllSheets().forEach((sheetDefine => {
|
|
@@ -392,8 +405,23 @@ class VTableSheet {
|
|
|
392
405
|
}
|
|
393
406
|
exportSheetToFile(fileType, allSheets = !0) {
|
|
394
407
|
var _a, _b;
|
|
395
|
-
|
|
396
|
-
|
|
408
|
+
try {
|
|
409
|
+
this.spreadsheetEventManager.emitExportStart(fileType, allSheets);
|
|
410
|
+
const sheet = this.getActiveSheet();
|
|
411
|
+
if (!sheet) throw new Error("No active sheet available for export");
|
|
412
|
+
let sheetCount = 0;
|
|
413
|
+
if ("csv" === fileType) {
|
|
414
|
+
if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.exportToCsv)) throw new Error("TableExportPlugin not configured for CSV export");
|
|
415
|
+
sheet.tableInstance.exportToCsv(), sheetCount = 1;
|
|
416
|
+
} else if (allSheets) this.exportAllSheetsToExcel(), sheetCount = this.sheetManager.getSheetCount(); else {
|
|
417
|
+
if (!(null === (_b = sheet.tableInstance) || void 0 === _b ? void 0 : _b.exportToExcel)) throw new Error("TableExportPlugin not configured for Excel export");
|
|
418
|
+
sheet.tableInstance.exportToExcel(), sheetCount = 1;
|
|
419
|
+
}
|
|
420
|
+
this.spreadsheetEventManager.emitExportCompleted(fileType, allSheets, sheetCount);
|
|
421
|
+
} catch (error) {
|
|
422
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
423
|
+
this.spreadsheetEventManager.emitExportError(fileType, allSheets, errorMessage);
|
|
424
|
+
}
|
|
397
425
|
}
|
|
398
426
|
exportAllSheetsToExcel() {
|
|
399
427
|
var _b;
|
|
@@ -415,15 +443,26 @@ class VTableSheet {
|
|
|
415
443
|
importFileToSheet(options = {
|
|
416
444
|
clearExisting: !0
|
|
417
445
|
}) {
|
|
418
|
-
var _a;
|
|
446
|
+
var _a, _b;
|
|
419
447
|
return __awaiter(this, void 0, void 0, (function*() {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
448
|
+
try {
|
|
449
|
+
let result;
|
|
450
|
+
if (this.spreadsheetEventManager.emitImportStart("xlsx"), null == this ? void 0 : this._importFile) result = yield this._importFile({
|
|
451
|
+
clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
|
|
452
|
+
}); else {
|
|
453
|
+
const sheet = this.getActiveSheet();
|
|
454
|
+
if (!sheet) throw new Error("No active sheet available for import");
|
|
455
|
+
if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.importFile)) throw new Error("ExcelImportPlugin not configured");
|
|
456
|
+
result = yield sheet.tableInstance.importFile({
|
|
457
|
+
clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
const sheetCount = result && "sheets" in result && (null === (_b = result.sheets) || void 0 === _b ? void 0 : _b.length) || 0;
|
|
461
|
+
return this.spreadsheetEventManager.emitImportCompleted("xlsx", sheetCount), result;
|
|
462
|
+
} catch (error) {
|
|
463
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
464
|
+
throw this.spreadsheetEventManager.emitImportError("xlsx", errorMessage), error;
|
|
465
|
+
}
|
|
427
466
|
}));
|
|
428
467
|
}
|
|
429
468
|
getContainer() {
|
|
@@ -445,7 +484,9 @@ class VTableSheet {
|
|
|
445
484
|
return this.contentElement;
|
|
446
485
|
}
|
|
447
486
|
release() {
|
|
487
|
+
this.spreadsheetEventManager.emitDestroyed(), this.tableEventRelay.clearAllListeners(),
|
|
448
488
|
this.eventManager.release(), this.formulaManager.release(), this.formulaUIManager.release(),
|
|
489
|
+
this.spreadsheetEventManager.clearAllListeners(), this.menuManager && this.menuManager.release(),
|
|
449
490
|
this.sheetTabEventHandler.removeClickOutsideListener(), this.workSheetInstances.forEach((instance => {
|
|
450
491
|
instance.release();
|
|
451
492
|
})), this.rootElement && this.rootElement.parentNode && this.rootElement.parentNode.removeChild(this.rootElement),
|
|
@@ -462,18 +503,6 @@ class VTableSheet {
|
|
|
462
503
|
var _a;
|
|
463
504
|
null === (_a = this.getActiveSheet()) || void 0 === _a || _a.resize();
|
|
464
505
|
}
|
|
465
|
-
excludeEditCellFromSelection(range, editRow, editCol) {
|
|
466
|
-
const r = Object.assign({}, range), withinRow = r.startRow <= editRow && editRow <= r.endRow, withinCol = r.startCol <= editCol && editCol <= r.endCol;
|
|
467
|
-
if (!withinRow || !withinCol) return r;
|
|
468
|
-
const rowSpan = r.endRow - r.startRow, colSpan = r.endCol - r.startCol;
|
|
469
|
-
return 0 === rowSpan && 0 === colSpan && r.startRow === editRow && r.startCol === editCol ? {
|
|
470
|
-
startRow: -1,
|
|
471
|
-
startCol: -1,
|
|
472
|
-
endRow: -1,
|
|
473
|
-
endCol: -1
|
|
474
|
-
} : (rowSpan >= colSpan ? editRow === r.startRow && r.startRow < r.endRow ? r.startRow += 1 : editRow === r.endRow && r.startRow < r.endRow ? r.endRow -= 1 : r.startRow < r.endRow && (r.startRow += 1) : editCol === r.startCol && r.startCol < r.endCol ? r.startCol += 1 : editCol === r.endCol && r.startCol < r.endCol ? r.endCol -= 1 : r.startCol < r.endCol && (r.startCol += 1),
|
|
475
|
-
r);
|
|
476
|
-
}
|
|
477
506
|
}
|
|
478
507
|
|
|
479
508
|
exports.default = VTableSheet;
|