@visactor/vtable-sheet 1.20.0-alpha.4 → 1.20.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/README.md +173 -0
- package/cjs/components/vtable-sheet.d.ts +2 -0
- package/cjs/components/vtable-sheet.js +45 -13
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +1 -0
- package/cjs/core/WorkSheet.js +32 -7
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/event-manager.d.ts +7 -8
- package/cjs/event/event-manager.js +2 -11
- package/cjs/event/event-manager.js.map +1 -1
- package/cjs/formula/formula-autocomplete.js.map +1 -1
- package/cjs/formula/formula-editor.js.map +1 -1
- package/cjs/formula/formula-engine.d.ts +102 -0
- package/cjs/formula/formula-engine.js +1028 -0
- package/cjs/formula/formula-engine.js.map +1 -0
- package/cjs/formula/formula-helper.js +1 -1
- package/cjs/formula/formula-helper.js.map +1 -1
- package/cjs/formula/formula-range-selector.d.ts +5 -2
- package/cjs/formula/formula-range-selector.js +70 -15
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/formula-ui-manager.js +7 -4
- package/cjs/formula/formula-ui-manager.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 +19 -16
- package/cjs/managers/formula-manager.js +71 -183
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/tools/env.js.map +1 -1
- package/cjs/ts-types/event.d.ts +77 -68
- package/cjs/ts-types/event.js +6 -1
- package/cjs/ts-types/event.js.map +1 -1
- package/dist/vtable-sheet.js +73155 -109727
- package/dist/vtable-sheet.min.js +1 -853
- package/es/components/vtable-sheet.d.ts +2 -0
- package/es/components/vtable-sheet.js +46 -12
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +1 -0
- package/es/core/WorkSheet.js +32 -5
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/event-manager.d.ts +7 -8
- package/es/event/event-manager.js +2 -11
- package/es/event/event-manager.js.map +1 -1
- package/es/formula/formula-autocomplete.js.map +1 -1
- package/es/formula/formula-editor.js.map +1 -1
- package/es/formula/formula-engine.d.ts +102 -0
- package/es/formula/formula-engine.js +1020 -0
- package/es/formula/formula-engine.js.map +1 -0
- package/es/formula/formula-helper.js +1 -1
- package/es/formula/formula-helper.js.map +1 -1
- package/es/formula/formula-range-selector.d.ts +5 -2
- package/es/formula/formula-range-selector.js +70 -15
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/formula-ui-manager.js +7 -4
- package/es/formula/formula-ui-manager.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 +19 -16
- package/es/managers/formula-manager.js +72 -184
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.js.map +1 -1
- package/es/tools/env.js.map +1 -1
- package/es/ts-types/event.d.ts +77 -68
- package/es/ts-types/event.js +6 -1
- package/es/ts-types/event.js.map +1 -1
- package/package.json +6 -7
- package/cjs/test/formula-complete.test.d.ts +0 -1
- package/cjs/test/formula-complete.test.js +0 -42
- package/cjs/test/formula-complete.test.js.map +0 -1
- package/es/test/formula-complete.test.d.ts +0 -1
- package/es/test/formula-complete.test.js +0 -36
- package/es/test/formula-complete.test.js.map +0 -1
package/es/core/WorkSheet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/WorkSheet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAqB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,MAAM,OAAO,SAAU,SAAQ,WAAW;IAuBxC,YAAY,KAAkB,EAAE,OAA0B;QACxD,KAAK,EAAE,CAAC;QAdF,cAAS,GAAqB,IAAI,CAAC;QAW3C,gBAAW,GAAuD,IAAI,CAAC;QAuU/D,gBAAW,GAAkB,IAAI,CAAC;QAClC,eAAU,GAAG,KAAK,CAAC;QApUzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAGnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAGzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAGzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAGxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAKD,IAAI,QAAQ;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAKD,IAAI,QAAQ;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAKD,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;IACrC,CAAC;IAKD,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;IACrC,CAAC;IAKD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAKD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IAKO,kBAAkB;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,GAAG,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC;QAElD,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;QAErC,OAAO,OAAO,CAAC;IACjB,CAAC;IAKO,gBAAgB;QAEtB,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,GAAI,IAAI,CAAC,aAAqB,CAAC,QAAQ,CAAC;IACvD,CAAC;IAKO,qBAAqB;;QAC3B,IAAI,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAEhD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACzB,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;SAC3B;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aACnC;SACF;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;SACxB;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACvC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBACxB,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACjB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;qBAC9B,CAAC;iBACH;aACF;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,iBAAiB,GAAG,IAAI,CAAC;SAC1B;QACD,MAAM,eAAe,mCAChB,IAAI,CAAC,OAAO,CAAC,eAAe,KAC/B,YAAY,EAAE,IAAI,EAClB,gBAAgB,EAAE,IAAI,EACtB,kBAAkB,EAAE,IAAI,EACxB,WAAW,EAAE,IAAI,GAClB,CAAC;QAGF,IAAI,YAAkD,CAAC;QACvD,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,CAAA,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC;SAC3C;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE;YAExF,YAAY,GAAI,IAAI,CAAC,OAAO,CAAC,KAAuC,CAAC,OAAO,CACzE,IAAI,CAAC,OAAO,CAAC,KAAuC,CAAC,cAAc,EAAE,CACvE,CAAC;YACF,MAAM,iBAAiB,GAAI,YAA8C,CAAC,cAAc,EAAE,CAAC;YAE3F,iBAAiB,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,UAAU,EAAE;gBAC7E,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,eAAe,EAAE,CAAC;aACnB,CAAC,CAAC;SACJ;aAAM;YACL,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;gBACzE,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,eAAe,EAAE,CAAC;aACnB,CAAC,CAAC;SACJ;QACD,uCACK,IAAI,CAAC,OAAO,KACf,aAAa,EAAE,OAAO,EACtB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAC1B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EACjC,SAAS,EAAE,IAAI,CAAC,OAAO,EACvB,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EACf,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE;gBACZ,UAAU,EAAE,IAAI;aACjB,EACD,YAAY,EAAE;gBACZ,iCAAiC,EAAE,IAAI;aACxC,IAGD;IACJ,CAAC;IAKO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,aAAa,EAAE;YAEtB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAU,EAAE,EAAE;gBACrD,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,oBAAoB,EAAE;oBAExD,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;iBAC9B;YACH,CAAC,CAAC,CAAC;YAGH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,kBAAyB,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC9D,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAE3E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE;oBAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,oBAAoB,EAAE;wBACzD,IAAI,CAAC,WAAW,GAAG;4BACjB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;4BACpB,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,GAAG,EAAE,KAAK,CAAC,GAAG;yBACf,CAAC;qBACH;oBACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;iBAChC;gBACD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAarC,CAAC,CAAC,CAAC;YAGH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,iBAAwB,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC7D,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAGH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAU,EAAE,EAAE;gBACxD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAGH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;gBACvC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAMO,kBAAkB,CAAC,KAAU;QAEnC,IAAI,CAAC,SAAS,GAAG;YACf,QAAQ,EAAE,KAAK,CAAC,GAAG;YACnB,QAAQ,EAAE,KAAK,CAAC,GAAG;YACnB,MAAM,EAAE,KAAK,CAAC,GAAG;YACjB,MAAM,EAAE,KAAK,CAAC,GAAG;SAClB,CAAC;QAGF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAMO,sBAAsB,CAAC,KAAU;;QACvC,IAAI,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,0CAAE,MAAM,EAAE;YACzB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,GAAG;gBACf,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG;gBACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG;gBACrB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;gBACjB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;aAClB,CAAC;SACH;QACD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAMO,mBAAmB,CAAC,KAAU;;QACpC,IAAI,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,0CAAE,MAAM,EAAE;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,SAAS,GAAG;gBACf,QAAQ,EAAE,KAAK,CAAC,GAAG;gBACnB,QAAQ,EAAE,KAAK,CAAC,GAAG;gBACnB,MAAM,EAAE,IAAI,CAAC,GAAG;gBAChB,MAAM,EAAE,IAAI,CAAC,GAAG;aACjB,CAAC;SACH;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAMO,sBAAsB,CAAC,KAAU;QACvC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,YAAY;SAC7B,CAAC,CAAC;IACL,CAAC;IAOS,SAAS,CAAC,SAAiB,EAAE,SAAc;QACnD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;IAOD,EAAE,CAAC,SAAiB,EAAE,OAAiC;QACrD,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAUD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO;SACR;QAGD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;YAC7B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;QAGD,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;YACP,OAAO;SACR;QAGD,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAMO,QAAQ;QACd,IAAI;YACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,GAAG,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC;YAGlD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE;gBAC1G,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;gBAG1C,IAAI,IAAI,CAAC,aAAa,EAAE;oBAEtB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;iBAC7B;aACF;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;SAC9C;gBAAS;YACR,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;SACzB;IACH,CAAC;IAKD,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAKD,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAKD,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKD,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAKD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;IAClC,CAAC;IAKD,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IAKD,OAAO;QAEL,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC;IAMD,OAAO,CAAC,IAAa;;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAEzB,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc,EAAE;gBACpC,IAAI;oBACF,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBACpG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;iBAChF;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;iBACnD;aACF;SACF;IACH,CAAC;IAMD,YAAY,CAAC,GAAW,EAAE,GAAW;QACnC,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI;gBACF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxD,OAAO,KAAK,CAAC;aACd;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;aAC9D;SACF;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;SACvB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,YAAY,CAAC,GAAW,EAAE,GAAW,EAAE,KAAU;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAGvB,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;aACrD;YAGD,MAAM,KAAK,GAA0B;gBACnC,GAAG;gBACH,GAAG;gBACH,QAAQ;gBACR,QAAQ,EAAE,KAAK;aAChB,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;SACtC;IACH,CAAC;IAMD,gBAAgB,CAAC,OAAe;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO;YACL,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;SAC/C,CAAC;IACJ,CAAC;IAQD,gBAAgB,CAAC,UAA8B,EAAE,GAAY;QAC3D,IAAI,GAAW,CAAC;QAChB,IAAI,MAAc,CAAC;QAEnB,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;YACrB,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC;SACzB;aAAM;YACL,GAAG,GAAG,UAAU,CAAC;YACjB,MAAM,GAAG,GAAI,CAAC;SACf;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;QAEzB,GAAG;YACD,OAAO,IAAI,CAAC,CAAC;YACb,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;YAC3D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;SACpC,QAAQ,OAAO,GAAG,CAAC,EAAE;QAEtB,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IAC/B,CAAC;IAMD,gBAAgB,CAAC,OAAe;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;SACrD;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SAC9C;QAED,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC;YAC7B,GAAG,EAAE,GAAG,GAAG,CAAC;SACb,CAAC;IACJ,CAAC;IAKD,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAKD,qBAAqB;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C;QAGD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAEhE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C;QAGD,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;YACzB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;YACzB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG;YACrB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG;SACtB,CAAC,CAAC,CAAC;IACN,CAAC;IAKD,mBAAmB;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBACxB,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBAClB,CAAC;iBACH;qBAAM;oBACL,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;iBACnC;aACF;SACF;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,CAAC,YAAY,iCAC1B,IAAI,CAAC,OAAO,KACf,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAC7B,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,IAAI,IACb,CAAC;IACL,CAAC;IAKD,OAAO;;QAIL,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;SAC9B;QAGD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACnD;QAGD,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,EAAE,CAAC;IAChC,CAAC;CACF","file":"WorkSheet.js","sourcesContent":["import type { ColumnDefine, ListTableConstructorOptions } from '@visactor/vtable';\nimport { ListTable } from '@visactor/vtable';\nimport { isValid, type EventEmitter } from '@visactor/vutils';\nimport { EventTarget } from '../event/event-target';\nimport type {\n IWorkSheetOptions,\n IWorkSheetAPI,\n CellCoord,\n CellRange,\n CellValue,\n CellValueChangedEvent,\n IFormulaManagerOptions\n} from '../ts-types';\nimport type { TYPES, VTableSheet } from '..';\nimport { isPropertyWritable } from '../tools';\nimport { VTableThemes } from '../ts-types';\nimport { detectFunctionParameterPosition } from '../formula/formula-helper';\n\n/**\n * Sheet constructor options. 内部类型Sheet的构造函数参数类型\n */\nexport type WorkSheetConstructorOptions = {\n /** 表格数据 */\n data?: any[][];\n /** 公式计算选项 */\n formula?: IFormulaManagerOptions;\n /** Sheet 唯一标识 */\n sheetKey: string;\n /** Sheet 标题 */\n sheetTitle: string;\n} & Omit<ListTableConstructorOptions, 'records'>;\n\nexport class WorkSheet extends EventTarget implements IWorkSheetAPI {\n /** 选项 */\n options: IWorkSheetOptions;\n /** 容器 */\n container: HTMLElement;\n /** 表格实例 */\n tableInstance?: ListTable;\n /** 元素 */\n element: HTMLElement;\n /** 选择范围 */\n private selection: CellRange | null = null;\n /** Sheet 唯一标识 */\n private sheetKey: string;\n /** Sheet 标题 */\n private sheetTitle: string;\n\n /** 事件总线 */\n private eventBus: EventEmitter;\n\n private vtableSheet: VTableSheet;\n\n editingCell: { sheet: string; row: number; col: number } | null = null;\n\n constructor(sheet: VTableSheet, options: IWorkSheetOptions) {\n super();\n this.options = options;\n this.container = options.container;\n\n // 初始化基本属性\n this.sheetKey = options.sheetKey;\n this.sheetTitle = options.sheetTitle;\n this.vtableSheet = sheet;\n\n // 创建表格元素\n this.element = this._createRootElement();\n this.container.appendChild(this.element);\n\n // 初始化表格\n this._initializeTable();\n\n // 设置事件监听\n this._setupEventListeners();\n }\n\n /**\n * 获取行数\n */\n get rowCount(): number {\n const data = this.getData();\n return data ? data.length : 0;\n }\n\n /**\n * 获取列数\n */\n get colCount(): number {\n const data = this.getData();\n return data && data.length > 0 ? data[0].length : 0;\n }\n\n /**\n * 获取行数\n */\n getRowCount(): number {\n return this.tableInstance.rowCount;\n }\n\n /**\n * 获取列数\n */\n getColumnCount(): number {\n return this.tableInstance.colCount;\n }\n\n /**\n * 获取表格数据\n */\n get records(): any {\n return this.getData();\n }\n\n /**\n * 获取列定义\n */\n get columns(): any {\n return this.options.columns || [];\n }\n\n /**\n * 创建根元素\n */\n private _createRootElement(): HTMLElement {\n const element = document.createElement('div');\n element.setAttribute('sheet-key', `${this.sheetKey}`);\n element.classList.add('vtable-sheet');\n element.style.outline = 'none';\n element.style.position = 'relative';\n\n const width = this.container.clientWidth || 800;\n const height = this.container.clientHeight || 600;\n\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n\n return element;\n }\n\n /**\n * 初始化表格实例\n */\n private _initializeTable(): void {\n // 这里应该是实际的表格初始化逻辑\n const tableOptions = this._generateTableOptions();\n this.tableInstance = new ListTable(tableOptions);\n this.element.classList.add('vtable-excel-cursor');\n // 获取事件总线\n this.eventBus = (this.tableInstance as any).eventBus;\n }\n\n /**\n * 生成VTable选项\n */\n private _generateTableOptions(): ListTableConstructorOptions {\n let isShowTableHeader = this.options.showHeader;\n // 转换为ListTable的选项\n if (!this.options.columns) {\n isShowTableHeader = isValid(isShowTableHeader) ? isShowTableHeader : false;\n this.options.columns = [];\n } else {\n for (let i = 0; i < this.options.columns.length; i++) {\n this.options.columns[i].field = i;\n }\n }\n if (!this.options.data) {\n this.options.data = [];\n } else if (this.options.columns.length === 0 && this.options.firstRowAsHeader) {\n const data = this.options.data;\n if (data && data.length > 0) {\n for (let i = 0; i < data[0].length; i++) {\n this.options.columns[i] = {\n field: i,\n title: data[0][i],\n filter: !!this.options.filter\n };\n }\n }\n data.shift();\n isShowTableHeader = true;\n }\n const keyboardOptions = {\n ...this.options.keyboardOptions,\n copySelected: true,\n pasteValueToCell: true,\n showCopyCellBorder: true,\n cutSelected: true\n };\n\n //更改theme 的frameStyle\n let changedTheme: TYPES.VTableThemes.ITableThemeDefine;\n if (!this.options?.theme) {\n this.options.theme = VTableThemes.DEFAULT;\n }\n this.options.theme = this.options.theme;\n if (this.options.theme.bodyStyle && !isPropertyWritable(this.options.theme, 'bodyStyle')) {\n //测试是否使用了主题 使用了主题配置项不可写。\n changedTheme = (this.options.theme as TYPES.VTableThemes.TableTheme).extends(\n (this.options.theme as TYPES.VTableThemes.TableTheme).getExtendTheme()\n ); //防止将原主题如DARK ARCO的属性改掉\n const extendThemeOption = (changedTheme as TYPES.VTableThemes.TableTheme).getExtendTheme();\n\n extendThemeOption.frameStyle = Object.assign({}, extendThemeOption.frameStyle, {\n shadowBlur: 0,\n cornerRadius: 0,\n borderLineWidth: 0\n });\n } else {\n changedTheme = this.options.theme;\n changedTheme.frameStyle = Object.assign({}, this.options.theme.frameStyle, {\n shadowBlur: 0,\n cornerRadius: 0,\n borderLineWidth: 0\n });\n }\n return {\n ...this.options,\n addRecordRule: 'Array',\n defaultCursor: 'cell',\n records: this.options.data,\n sortState: this.options.sortState,\n container: this.element,\n showHeader: isShowTableHeader,\n keyboardOptions,\n theme: changedTheme,\n excelOptions: {\n fillHandle: true\n },\n customConfig: {\n selectCellWhenCellEditorNotExists: true\n }\n // maintainedColumnCount: 120\n // 其他特定配置\n };\n }\n\n /**\n * 设置事件监听\n */\n private _setupEventListeners(): void {\n if (this.tableInstance) {\n // 监听单元格选择事件 - 优化:移除console.log调试代码\n this.tableInstance.on('mousedown_cell', (event: any) => {\n if (this.vtableSheet.formulaManager.formulaWorkingOnCell) {\n //防止公式输入状态下,原本的input元素blur掉,导致公式输入框无法输入\n event.event.preventDefault();\n }\n });\n\n // 监听选择变化事件(多选时)- 优化:移除console.log调试代码\n this.tableInstance.on('selected_changed' as any, (event: any) => {\n console.log('selected_changed', this.tableInstance.eventManager.isDraging);\n // 判断是drag过程中的选中单元格变化\n if (!this.tableInstance.eventManager.isDraging) {\n if (!this.vtableSheet.formulaManager.formulaWorkingOnCell) {\n this.editingCell = {\n sheet: this.getKey(),\n row: event.row,\n col: event.col\n };\n }\n this.handleCellSelected(event);\n }\n this.handleSelectionChanged(event);\n // if (this.vtableSheet.formulaManager.formulaWorkingOnCell) {\n // //#region 在完整公式状态下 计算完结果 可以退出编辑状态 并重新响应重新选中的单元格\n // this.vtableSheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n // this.vtableSheet.formulaManager.inputingElement.value,\n // this.vtableSheet.formulaManager.lastKnownCursorPosInFormulaInput\n // );\n // if (!this.vtableSheet.formulaManager.inputIsParamMode.inParamMode) {\n // this.vtableSheet.formulaManager.formulaWorkingOnCell = null;\n // this.handleCellSelected(event);\n // }\n // }\n //#endregion\n });\n\n // 监听拖拽选择结束事件 - 优化:移除console.log和debugger调试代码\n this.tableInstance.on('drag_select_end' as any, (event: any) => {\n this.handleDragSelectEnd(event);\n });\n\n // 监听单元格值变更事件\n this.tableInstance.on('change_cell_value', (event: any) => {\n this.handleCellValueChanged(event);\n });\n\n // 监听编辑结束事件,恢复十字光标\n this.tableInstance.on('click_cell', () => {\n this.element.classList.add('vtable-excel-cursor');\n });\n }\n }\n\n /**\n * 处理单元格选择事件\n * @param event 选择事件\n */\n private handleCellSelected(event: any): void {\n // 更新选择范围\n this.selection = {\n startRow: event.row,\n startCol: event.col,\n endRow: event.row,\n endCol: event.col\n };\n\n // 触发事件给父组件\n this.fire('cell-selected', event);\n }\n\n /**\n * 处理选择变化事件\n * @param event 选择变化事件\n */\n private handleSelectionChanged(event: any): void {\n if (event?.ranges?.length) {\n const r = event.ranges[event.ranges.length - 1];\n this.selection = {\n startRow: r.start.row,\n startCol: r.start.col,\n endRow: r.end.row,\n endCol: r.end.col\n };\n }\n this.fire('selection-changed', event);\n }\n\n /**\n * 处理拖拽选择结束事件\n * @param event 拖拽选择结束事件\n */\n private handleDragSelectEnd(event: any): void {\n if (event?.cells?.length) {\n const first = event.cells[0][0];\n const lastRow = event.cells[event.cells.length - 1];\n const last = lastRow[lastRow.length - 1];\n this.selection = {\n startRow: first.row,\n startCol: first.col,\n endRow: last.row,\n endCol: last.col\n };\n }\n this.fire('selection-end', event);\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 值变更事件\n */\n private handleCellValueChanged(event: any): void {\n this.fire('cell-value-changed', {\n row: event.row,\n col: event.col,\n oldValue: event.rawValue,\n newValue: event.changedValue\n });\n }\n\n /**\n * 触发事件\n * @param eventName 事件名称\n * @param eventData 事件数据\n */\n protected fireEvent(eventName: string, eventData: any): void {\n this.fire(eventName, eventData);\n }\n\n /**\n * 监听事件\n * @param eventName 事件名称\n * @param handler 事件处理函数\n */\n on(eventName: string, handler: (...args: any[]) => void): this {\n return super.on(eventName, handler);\n }\n\n // 用于防止短时间内多次调用resize的节流变量\n private resizeTimer: number | null = null;\n private isResizing = false;\n\n /**\n * 更新Sheet大小\n * 使用节流方式避免频繁调用resize\n */\n resize(): void {\n if (!this.element) {\n return;\n }\n\n // 如果正在进行调整,清除之前的定时器\n if (this.resizeTimer !== null) {\n window.clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // 如果已经在执行resize,设置一个短期延迟\n if (this.isResizing) {\n this.resizeTimer = window.setTimeout(() => {\n this.doResize();\n this.resizeTimer = null;\n }, 50);\n return;\n }\n\n // 否则直接执行resize\n this.doResize();\n }\n\n /**\n * 实际执行调整大小的操作\n * @private\n */\n private doResize(): void {\n try {\n this.isResizing = true;\n\n const width = this.container.clientWidth || 800;\n const height = this.container.clientHeight || 600;\n\n // 只有尺寸确实变化时才更新样式和触发表格实例的resize\n if (parseInt(this.element.style.width, 10) !== width || parseInt(this.element.style.height, 10) !== height) {\n this.element.style.width = `${width}px`;\n this.element.style.height = `${height}px`;\n\n // 更新表格实例大小\n if (this.tableInstance) {\n // 触发VTable的resize\n this.tableInstance.resize();\n }\n }\n } catch (error) {\n console.error('Error during resize:', error);\n } finally {\n this.isResizing = false;\n }\n }\n\n /**\n * 获取Sheet元素\n */\n getElement(): HTMLElement {\n return this.element;\n }\n\n /**\n * 获取Sheet容器\n */\n getContainer(): HTMLElement {\n return this.container;\n }\n\n /**\n * 获取Sheet的key\n */\n getKey(): string {\n return this.sheetKey;\n }\n\n /**\n * 获取Sheet的标题\n */\n getTitle(): string {\n return this.sheetTitle;\n }\n\n /**\n * 设置Sheet的标题\n */\n setTitle(title: string): void {\n this.sheetTitle = title;\n this.options.sheetTitle = title;\n }\n\n /**\n * 获取列定义\n */\n getColumns(): ColumnDefine[] {\n return this.options.columns || [];\n }\n\n /**\n * 获取表格数据\n */\n getData(): any[][] {\n // 从表格实例获取数据\n return this.options.data || [];\n }\n\n /**\n * 设置表格数据\n * @param data 表格数据\n */\n setData(data: any[][]): void {\n this.options.data = data;\n // 更新表格实例数据\n if (this.tableInstance) {\n this.tableInstance.updateOption({\n records: data\n });\n // 更新公式引擎中的数据\n if (this.vtableSheet?.formulaManager) {\n try {\n const normalizedData = this.vtableSheet.formulaManager.normalizeSheetData(data, this.tableInstance);\n this.vtableSheet.formulaManager.setSheetContent(this.sheetKey, normalizedData);\n } catch (e) {\n console.warn('Failed to update formula data:', e);\n }\n }\n }\n }\n /**\n * 获取指定坐标的单元格值\n * @param row 行索引\n * @param col 列索引\n */\n getCellValue(row: number, col: number): any {\n if (this.tableInstance) {\n try {\n const value = this.tableInstance.getCellValue(col, row);\n return value;\n } catch (error) {\n console.warn('Failed to get cell value from VTable:', error);\n }\n }\n\n const data = this.getData();\n if (data && data[row] && data[row][col] !== undefined) {\n return data[row][col];\n }\n return null;\n }\n\n /**\n * 设置指定坐标的单元格值\n * @param row 行索引\n * @param col 列索引\n * @param value 新值\n */\n setCellValue(row: number, col: number, value: any): void {\n const data = this.getData();\n if (data && data[row]) {\n const oldValue = data[row][col];\n data[row][col] = value;\n\n // 更新表格实例\n if (this.tableInstance) {\n this.tableInstance.changeCellValue(col, row, value);\n }\n\n // 触发事件\n const event: CellValueChangedEvent = {\n row,\n col,\n oldValue,\n newValue: value\n };\n\n this.fire('cellValueChanged', event);\n }\n }\n\n /**\n * 根据A1地址获取单元格信息\n * @param address A1地址\n */\n getCellByAddress(address: string): { coord: CellCoord; value: CellValue } {\n const coord = this.coordFromAddress(address);\n return {\n coord,\n value: this.getCellValue(coord.row, coord.col)\n };\n }\n\n /**\n * 将行/列坐标转换为A1格式\n * @param coord 坐标\n */\n addressFromCoord(coord: CellCoord): string;\n addressFromCoord(row: number, col: number): string;\n addressFromCoord(coordOrRow: CellCoord | number, col?: number): string {\n let row: number;\n let colNum: number;\n\n if (typeof coordOrRow === 'object') {\n row = coordOrRow.row;\n colNum = coordOrRow.col;\n } else {\n row = coordOrRow;\n colNum = col!;\n }\n\n let colStr = '';\n let tempCol = colNum + 1;\n\n do {\n tempCol -= 1;\n colStr = String.fromCharCode(65 + (tempCol % 26)) + colStr;\n tempCol = Math.floor(tempCol / 26);\n } while (tempCol > 0);\n\n return `${colStr}${row + 1}`;\n }\n\n /**\n * 将A1格式转换为行/列坐标\n * @param address A1地址\n */\n coordFromAddress(address: string): CellCoord {\n const match = address.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n throw new Error(`Invalid cell address: ${address}`);\n }\n\n const colStr = match[1];\n const rowStr = match[2];\n\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n\n return {\n row: parseInt(rowStr, 10) - 1,\n col: col - 1\n };\n }\n\n /**\n * 获取当前选择\n */\n getSelection(): CellRange | null {\n return this.selection;\n }\n\n /**\n * 获取多个选择范围(支持Ctrl/Cmd多选)\n */\n getMultipleSelections(): CellRange[] {\n if (!this.tableInstance) {\n return this.selection ? [this.selection] : [];\n }\n\n // 从底层VTable获取所有选择范围\n const vtableRanges = this.tableInstance.getSelectedCellRanges();\n\n if (vtableRanges.length === 0) {\n return this.selection ? [this.selection] : [];\n }\n\n // 转换VTable的坐标格式到WorkSheet格式\n return vtableRanges.map(range => ({\n startRow: range.start.row,\n startCol: range.start.col,\n endRow: range.end.row,\n endCol: range.end.col\n }));\n }\n\n /**\n * 将第一行设置为表头\n */\n setFirstRowAsHeader(): void {\n const data = this.getData();\n if (data && data.length > 0) {\n for (let i = 0; i < data[0].length; i++) {\n if (!this.options.columns[i]) {\n this.options.columns[i] = {\n field: i,\n title: data[0][i]\n };\n } else {\n this.options.columns[i].title = data[0][i];\n this.options.columns[i].field = i;\n }\n }\n }\n data.shift();\n this.tableInstance.updateOption({\n ...this.options,\n columns: this.options.columns,\n showHeader: true,\n records: data\n });\n }\n\n /**\n * 释放资源\n */\n release(): void {\n // 清理事件监听器\n\n // 释放表格实例\n if (this.tableInstance) {\n this.tableInstance.release();\n }\n\n // 从DOM中移除元素\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n\n // 清除引用\n this.tableInstance?.release();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/WorkSheet.ts"],"names":[],"mappings":"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","file":"WorkSheet.js","sourcesContent":["import type { ColumnDefine, ListTableConstructorOptions } from '@visactor/vtable';\nimport { ListTable } from '@visactor/vtable';\nimport { isValid, type EventEmitter } from '@visactor/vutils';\nimport { EventTarget } from '../event/event-target';\nimport type {\n IWorkSheetOptions,\n IWorkSheetAPI,\n CellCoord,\n CellRange,\n CellValue,\n CellValueChangedEvent,\n CellClickEvent,\n SelectionChangedEvent,\n IFormulaManagerOptions\n} from '../ts-types';\nimport { WorkSheetEventType } from '../ts-types';\nimport type { TYPES, VTableSheet } from '..';\nimport { isPropertyWritable } from '../tools';\nimport { VTableThemes } from '../ts-types';\nimport { detectFunctionParameterPosition } from '../formula/formula-helper';\n\n/**\n * Sheet constructor options. 内部类型Sheet的构造函数参数类型\n */\nexport type WorkSheetConstructorOptions = {\n /** 表格数据 */\n data?: any[][];\n /** 公式计算选项 */\n formula?: IFormulaManagerOptions;\n /** Sheet 唯一标识 */\n sheetKey: string;\n /** Sheet 标题 */\n sheetTitle: string;\n} & Omit<ListTableConstructorOptions, 'records'>;\n\nexport class WorkSheet extends EventTarget implements IWorkSheetAPI {\n /** 选项 */\n options: IWorkSheetOptions;\n /** 容器 */\n container: HTMLElement;\n /** 表格实例 */\n tableInstance?: ListTable;\n /** 元素 */\n element: HTMLElement;\n /** 选择范围 */\n private selection: CellRange | null = null;\n /** Sheet 唯一标识 */\n private sheetKey: string;\n /** Sheet 标题 */\n private sheetTitle: string;\n\n /** 事件总线 */\n private eventBus: EventEmitter;\n\n private vtableSheet: VTableSheet;\n\n editingCell: { sheet: string; row: number; col: number } | null = null;\n\n constructor(sheet: VTableSheet, options: IWorkSheetOptions) {\n super();\n this.options = options;\n this.container = options.container;\n\n // 初始化基本属性\n this.sheetKey = options.sheetKey;\n this.sheetTitle = options.sheetTitle;\n this.vtableSheet = sheet;\n\n // 创建表格元素\n this.element = this._createRootElement();\n this.container.appendChild(this.element);\n\n // 初始化表格\n this._initializeTable();\n\n // 设置事件监听\n this._setupEventListeners();\n }\n\n /**\n * 获取行数\n */\n get rowCount(): number {\n const data = this.getData();\n return data ? data.length : 0;\n }\n\n /**\n * 获取列数\n */\n get colCount(): number {\n const data = this.getData();\n return data && data.length > 0 ? data[0].length : 0;\n }\n\n /**\n * 获取行数\n */\n getRowCount(): number {\n return this.tableInstance.rowCount;\n }\n\n /**\n * 获取列数\n */\n getColumnCount(): number {\n return this.tableInstance.colCount;\n }\n\n /**\n * 获取表格数据\n */\n get records(): any {\n return this.getData();\n }\n\n /**\n * 获取列定义\n */\n get columns(): any {\n return this.options.columns || [];\n }\n\n /**\n * 创建根元素\n */\n private _createRootElement(): HTMLElement {\n const element = document.createElement('div');\n element.setAttribute('sheet-key', `${this.sheetKey}`);\n element.classList.add('vtable-sheet');\n element.style.outline = 'none';\n element.style.position = 'relative';\n\n const width = this.container.clientWidth || 800;\n const height = this.container.clientHeight || 600;\n\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n\n return element;\n }\n\n /**\n * 初始化表格实例\n */\n private _initializeTable(): void {\n // 这里应该是实际的表格初始化逻辑\n const tableOptions = this._generateTableOptions();\n this.tableInstance = new ListTable(tableOptions);\n this.element.classList.add('vtable-excel-cursor');\n // 获取事件总线\n this.eventBus = (this.tableInstance as any).eventBus;\n }\n\n /**\n * 生成VTable选项\n */\n private _generateTableOptions(): ListTableConstructorOptions {\n let isShowTableHeader = this.options.showHeader;\n // 转换为ListTable的选项\n if (!this.options.columns) {\n isShowTableHeader = isValid(isShowTableHeader) ? isShowTableHeader : false;\n this.options.columns = [];\n } else {\n for (let i = 0; i < this.options.columns.length; i++) {\n this.options.columns[i].field = i;\n }\n }\n if (!this.options.data) {\n this.options.data = [];\n } else if (this.options.columns.length === 0 && this.options.firstRowAsHeader) {\n const data = this.options.data;\n if (data && data.length > 0) {\n for (let i = 0; i < data[0].length; i++) {\n this.options.columns[i] = {\n field: i,\n title: data[0][i],\n filter: !!this.options.filter\n };\n }\n }\n data.shift();\n isShowTableHeader = true;\n }\n const keyboardOptions = {\n ...this.options.keyboardOptions,\n copySelected: true,\n pasteValueToCell: true,\n showCopyCellBorder: true,\n cutSelected: true\n };\n\n //更改theme 的frameStyle\n let changedTheme: TYPES.VTableThemes.ITableThemeDefine;\n if (!this.options?.theme) {\n this.options.theme = VTableThemes.DEFAULT;\n }\n this.options.theme = this.options.theme;\n if (this.options.theme.bodyStyle && !isPropertyWritable(this.options.theme, 'bodyStyle')) {\n //测试是否使用了主题 使用了主题配置项不可写。\n changedTheme = (this.options.theme as TYPES.VTableThemes.TableTheme).extends(\n (this.options.theme as TYPES.VTableThemes.TableTheme).getExtendTheme()\n ); //防止将原主题如DARK ARCO的属性改掉\n const extendThemeOption = (changedTheme as TYPES.VTableThemes.TableTheme).getExtendTheme();\n\n extendThemeOption.frameStyle = Object.assign({}, extendThemeOption.frameStyle, {\n shadowBlur: 0,\n cornerRadius: 0,\n borderLineWidth: 0\n });\n } else {\n changedTheme = this.options.theme;\n changedTheme.frameStyle = Object.assign({}, this.options.theme.frameStyle, {\n shadowBlur: 0,\n cornerRadius: 0,\n borderLineWidth: 0\n });\n }\n return {\n ...this.options,\n addRecordRule: 'Array',\n defaultCursor: 'cell',\n records: this.options.data,\n sortState: this.options.sortState,\n container: this.element,\n showHeader: isShowTableHeader,\n keyboardOptions,\n theme: changedTheme,\n excelOptions: {\n fillHandle: true\n },\n customConfig: {\n selectCellWhenCellEditorNotExists: true\n }\n // maintainedColumnCount: 120\n // 其他特定配置\n };\n }\n\n /**\n * 设置事件监听\n */\n private _setupEventListeners(): void {\n if (this.tableInstance) {\n // 监听单元格选择事件 - 优化:移除console.log调试代码\n this.tableInstance.on('mousedown_cell', (event: any) => {\n if (this.vtableSheet.formulaManager.formulaWorkingOnCell) {\n //防止公式输入状态下,原本的input元素blur掉,导致公式输入框无法输入\n event.event.preventDefault();\n }\n });\n\n // 监听选择变化事件(多选时)\n this.tableInstance.on('selected_changed' as any, (event: any) => {\n // 判断是drag过程中的选中单元格变化\n if (!this.tableInstance.eventManager.isDraging) {\n if (!this.vtableSheet.formulaManager.formulaWorkingOnCell) {\n this.editingCell = {\n sheet: this.getKey(),\n row: event.row,\n col: event.col\n };\n }\n this.handleCellSelected(event);\n }\n this.handleSelectionChanged(event);\n });\n\n // 监听拖拽选择结束事件 - 优化:移除console.log和debugger调试代码\n this.tableInstance.on('drag_select_end' as any, (event: any) => {\n this.handleDragSelectEnd(event);\n });\n\n // 监听单元格值变更事件\n this.tableInstance.on('change_cell_value', (event: any) => {\n this.handleCellValueChanged(event);\n });\n\n // 监听编辑结束事件,恢复十字光标\n this.tableInstance.on('click_cell', () => {\n this.element.classList.add('vtable-excel-cursor');\n });\n }\n }\n\n /**\n * 处理单元格选择事件\n * @param event 选择事件\n */\n private handleCellSelected(event: any): void {\n // 更新选择范围\n this.selection = {\n startRow: event.row,\n startCol: event.col,\n endRow: event.row,\n endCol: event.col\n };\n\n // 使用事件类型枚举触发事件给父组件\n const cellSelectedEvent: CellClickEvent = {\n row: event.row,\n col: event.col,\n value: event.value,\n cellElement: event.cellElement,\n originalEvent: event.originalEvent\n };\n this.fire(WorkSheetEventType.CELL_CLICK, cellSelectedEvent);\n }\n\n /**\n * 处理选择变化事件\n * @param event 选择变化事件\n */\n private handleSelectionChanged(event: any): void {\n if (event?.ranges?.length) {\n const r = event.ranges[event.ranges.length - 1];\n this.selection = {\n startRow: r.start.row,\n startCol: r.start.col,\n endRow: r.end.row,\n endCol: r.end.col\n };\n }\n // 保持原始事件结构,同时确保类型符合定义\n const selectionChangedEvent: SelectionChangedEvent = {\n row: event.row,\n col: event.col,\n value: event.value,\n ranges: event.ranges,\n cells: event.cells,\n originalEvent: event.originalEvent\n };\n this.fire(WorkSheetEventType.SELECTION_CHANGED, selectionChangedEvent);\n }\n\n /**\n * 处理拖拽选择结束事件\n * @param event 拖拽选择结束事件\n */\n private handleDragSelectEnd(event: any): void {\n if (event?.cells?.length) {\n const first = event.cells[0][0];\n const lastRow = event.cells[event.cells.length - 1];\n const last = lastRow[lastRow.length - 1];\n this.selection = {\n startRow: first.row,\n startCol: first.col,\n endRow: last.row,\n endCol: last.col\n };\n }\n // 保持原始事件结构,同时确保类型符合定义\n const selectionEndEvent: SelectionChangedEvent = {\n ranges: event.ranges,\n cells: event.cells,\n originalEvent: event.originalEvent\n };\n this.fire(WorkSheetEventType.SELECTION_END, selectionEndEvent);\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 值变更事件\n */\n private handleCellValueChanged(event: any): void {\n const cellValueChangedEvent: CellValueChangedEvent = {\n row: event.row,\n col: event.col,\n oldValue: event.rawValue,\n newValue: event.changedValue\n };\n this.fire(WorkSheetEventType.CELL_VALUE_CHANGED, cellValueChangedEvent);\n }\n\n /**\n * 触发事件\n * @param eventName 事件名称\n * @param eventData 事件数据\n */\n protected fireEvent(eventName: string, eventData: any): void {\n this.fire(eventName, eventData);\n }\n\n /**\n * 监听事件\n * @param eventName 事件名称\n * @param handler 事件处理函数\n */\n on(eventName: string, handler: (...args: any[]) => void): this {\n return super.on(eventName, handler);\n }\n\n // 用于防止短时间内多次调用resize的节流变量\n private resizeTimer: number | null = null;\n private isResizing = false;\n\n /**\n * 更新Sheet大小\n * 使用节流方式避免频繁调用resize\n */\n resize(): void {\n if (!this.element) {\n return;\n }\n\n // 如果正在进行调整,清除之前的定时器\n if (this.resizeTimer !== null) {\n window.clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // 如果已经在执行resize,设置一个短期延迟\n if (this.isResizing) {\n this.resizeTimer = window.setTimeout(() => {\n this.doResize();\n this.resizeTimer = null;\n }, 50);\n return;\n }\n\n // 否则直接执行resize\n this.doResize();\n }\n\n /**\n * 实际执行调整大小的操作\n * @private\n */\n private doResize(): void {\n try {\n this.isResizing = true;\n\n const width = this.container.clientWidth || 800;\n const height = this.container.clientHeight || 600;\n\n // 只有尺寸确实变化时才更新样式和触发表格实例的resize\n if (parseInt(this.element.style.width, 10) !== width || parseInt(this.element.style.height, 10) !== height) {\n this.element.style.width = `${width}px`;\n this.element.style.height = `${height}px`;\n\n // 更新表格实例大小\n if (this.tableInstance) {\n // 触发VTable的resize\n this.tableInstance.resize();\n }\n }\n } catch (error) {\n console.error('Error during resize:', error);\n } finally {\n this.isResizing = false;\n }\n }\n\n /**\n * 获取Sheet元素\n */\n getElement(): HTMLElement {\n return this.element;\n }\n\n /**\n * 获取Sheet容器\n */\n getContainer(): HTMLElement {\n return this.container;\n }\n\n /**\n * 获取Sheet的key\n */\n getKey(): string {\n return this.sheetKey;\n }\n\n /**\n * 获取Sheet的标题\n */\n getTitle(): string {\n return this.sheetTitle;\n }\n\n /**\n * 设置Sheet的标题\n */\n setTitle(title: string): void {\n this.sheetTitle = title;\n this.options.sheetTitle = title;\n }\n\n /**\n * 获取列定义\n */\n getColumns(): ColumnDefine[] {\n return this.options.columns || [];\n }\n\n /**\n * 获取表格数据\n */\n getData(): any[][] {\n // 从表格实例获取数据\n return this.options.data || [];\n }\n\n getCopiedData(): any[][] {\n // 为了避免影响当前数据,所以需要复制一份数据\n return this.getData().map(row => (Array.isArray(row) ? row.slice() : []));\n }\n\n /**\n * 设置表格数据\n * @param data 表格数据\n */\n setData(data: any[][]): void {\n this.options.data = data;\n // 更新表格实例数据\n if (this.tableInstance) {\n this.tableInstance.updateOption({\n records: data\n });\n // 更新公式引擎中的数据\n if (this.vtableSheet?.formulaManager) {\n try {\n const normalizedData = this.vtableSheet.formulaManager.normalizeSheetData(data, this.tableInstance);\n this.vtableSheet.formulaManager.setSheetContent(this.sheetKey, normalizedData);\n } catch (e) {\n console.warn('Failed to update formula data:', e);\n }\n }\n }\n }\n /**\n * 获取指定坐标的单元格值\n * @param row 行索引\n * @param col 列索引\n */\n getCellValue(row: number, col: number): any {\n if (this.tableInstance) {\n try {\n const value = this.tableInstance.getCellValue(col, row);\n return value;\n } catch (error) {\n console.warn('Failed to get cell value from VTable:', error);\n }\n }\n\n const data = this.getData();\n if (data && data[row] && data[row][col] !== undefined) {\n return data[row][col];\n }\n return null;\n }\n\n /**\n * 设置指定坐标的单元格值\n * @param row 行索引\n * @param col 列索引\n * @param value 新值\n */\n setCellValue(row: number, col: number, value: any): void {\n const data = this.getData();\n if (data && data[row]) {\n const oldValue = data[row][col];\n data[row][col] = value;\n\n // 更新表格实例\n if (this.tableInstance) {\n this.tableInstance.changeCellValue(col, row, value);\n }\n\n // 触发事件\n const event: CellValueChangedEvent = {\n row,\n col,\n oldValue,\n newValue: value\n };\n\n this.fire('cellValueChanged', event);\n }\n }\n\n /**\n * 根据A1地址获取单元格信息\n * @param address A1地址\n */\n getCellByAddress(address: string): { coord: CellCoord; value: CellValue } {\n const coord = this.coordFromAddress(address);\n return {\n coord,\n value: this.getCellValue(coord.row, coord.col)\n };\n }\n\n /**\n * 将行/列坐标转换为A1格式\n * @param coord 坐标\n */\n addressFromCoord(coord: CellCoord): string;\n addressFromCoord(row: number, col: number): string;\n addressFromCoord(coordOrRow: CellCoord | number, col?: number): string {\n let row: number;\n let colNum: number;\n\n if (typeof coordOrRow === 'object') {\n row = coordOrRow.row;\n colNum = coordOrRow.col;\n } else {\n row = coordOrRow;\n colNum = col!;\n }\n\n let colStr = '';\n let tempCol = colNum + 1;\n\n do {\n tempCol -= 1;\n colStr = String.fromCharCode(65 + (tempCol % 26)) + colStr;\n tempCol = Math.floor(tempCol / 26);\n } while (tempCol > 0);\n\n return `${colStr}${row + 1}`;\n }\n\n /**\n * 将A1格式转换为行/列坐标\n * @param address A1地址\n */\n coordFromAddress(address: string): CellCoord {\n const match = address.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n throw new Error(`Invalid cell address: ${address}`);\n }\n\n const colStr = match[1];\n const rowStr = match[2];\n\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n\n return {\n row: parseInt(rowStr, 10) - 1,\n col: col - 1\n };\n }\n\n /**\n * 获取当前选择\n */\n getSelection(): CellRange | null {\n return this.selection;\n }\n\n /**\n * 获取多个选择范围(支持Ctrl/Cmd多选)\n */\n getMultipleSelections(): CellRange[] {\n if (!this.tableInstance) {\n return this.selection ? [this.selection] : [];\n }\n\n // 从底层VTable获取所有选择范围\n const vtableRanges = this.tableInstance.getSelectedCellRanges();\n\n if (vtableRanges.length === 0) {\n return this.selection ? [this.selection] : [];\n }\n\n // 转换VTable的坐标格式到WorkSheet格式\n return vtableRanges.map(range => ({\n startRow: range.start.row,\n startCol: range.start.col,\n endRow: range.end.row,\n endCol: range.end.col\n }));\n }\n\n /**\n * 将第一行设置为表头\n */\n setFirstRowAsHeader(): void {\n const data = this.getData();\n if (data && data.length > 0) {\n for (let i = 0; i < data[0].length; i++) {\n if (!this.options.columns[i]) {\n this.options.columns[i] = {\n field: i,\n title: data[0][i]\n };\n } else {\n this.options.columns[i].title = data[0][i];\n this.options.columns[i].field = i;\n }\n }\n }\n data.shift();\n this.tableInstance.updateOption({\n ...this.options,\n columns: this.options.columns,\n showHeader: true,\n records: data\n });\n }\n\n /**\n * 释放资源\n */\n release(): void {\n // 清理事件监听器\n\n // 释放表格实例\n if (this.tableInstance) {\n this.tableInstance.release();\n }\n\n // 从DOM中移除元素\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n\n // 清除引用\n this.tableInstance?.release();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/table-plugins.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EAEjB,iBAAiB,EACjB,2BAA2B,EAC3B,cAAc,EACd,yBAAyB,EACzB,uBAAuB,EACvB,gCAAgC,EACjC,MAAM,0BAA0B,CAAC;AAWlC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAO3C,MAAM,UAAU,eAAe,CAC7B,WAA0B,EAC1B,OAA6B;;IAE7B,MAAM,OAAO,GAAmC,EAAE,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,0CAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,0CAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxF,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,CAAA,EAAE;QACpE,MAAM,iBAAiB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,0CACpF,aAA8B,CAAC;QACnC,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC5B;IACD,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAA,EAAE;QAC1E,MAAM,iBAAiB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,kBAAkB,CAAC,0CAC1F,aAAoC,CAAC;QACzC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,iBAC/C,cAAc,EAAE,CAAC,GAAW,EAAE,aAA+B,EAAE,EAAE;gBAC/D,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC;YAC1E,CAAC,IACE,iBAAiB,EACpB,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAClC;IACD,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAA,EAAE;QACzE,MAAM,iBAAiB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,0CACzF,aAAyC,CAAC;QAC9C,MAAM,uBAAuB,GAAG,IAAI,iBAAiB,iBACnD,QAAQ,EAAE,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,KAAI,GAAG,EACtC,QAAQ,EAAE,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW,KAAI,GAAG,EACzC,oBAAoB,EAAE,EAAE,EACxB,qBAAqB,EAAE,EAAE,EACzB,wBAAwB,EACtB,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,0CAAE,wBAAwB,MAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,0CAAE,wBAAwB,CAAA,EAC1F,wBAAwB,EACtB,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,0CAAE,wBAAwB,MAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,0CAAE,wBAAwB,CAAA,IACvF,iBAAiB,EACpB,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACvC;IAYD,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAA,EAAE;QACzE,MAAM,iBAAiB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,0CAAE,aAAa,CAAC;QAC7G,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACjC;IACD,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,2BAA2B,CAAC,CAAA,EAAE;QACnF,MAAM,iBAAiB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAC5C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,2BAA2B,CACxD,0CAAE,aAAa,CAAC;QACjB,MAAM,2BAA2B,GAAG,IAAI,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;KAC3C;IACD,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,CAAA,EAAE;QAItE,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC9B;IACD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,EAAE;QAChC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CACjC,CAAC,MAA0F,EAAE,EAAE;YAC7F,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;gBAEvC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;aACvD;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aACrD;QACH,CAAC,CACF,CAAC;KACH;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAOD,SAAS,kBAAkB,CAAC,WAA0B,EAAE,iBAAiC;IAUvF,OAAO,IAAI,YAAY,iBACrB,YAAY,EAAE,yBAAyB,CAAC,WAAW,CAAC,IACjD,iBAAiB,EACpB,CAAC;AACL,CAAC;AAOD,SAAS,yBAAyB,CAAC,WAAyB;IAC1D,OAAO,CAAC,WAAmB,EAAE,MAAiC,EAAW,EAAE;;QAEzE,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE;YACxF,OAAO,KAAK,CAAC;SACd;QAGD,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAkB,CAAC;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,mCAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QAE9D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAyB,EAAE,iBAAsC;IAC/F,OAAO,IAAI,iBAAiB,iBAC1B,mBAAmB,EAAE;YACnB,GAAG,yBAAyB;YAC5B;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,YAAY;aACtB;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,eAAe;aACzB;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,4BAA4B;aACtC;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,6BAA6B;aACvC;SACF,EACD,iBAAiB,EAAE;YACjB,GAAG,uBAAuB;YAC1B;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,4BAA4B;aACtC;SACF,EACD,2BAA2B,EAAE;YAC3B,GAAG,gCAAgC;YACnC;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,4BAA4B;aACtC;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,6BAA6B;aACvC;SACF,EACD,yBAAyB,EAAE,CACzB,SAAgC,EAChC,KAAuB,EACvB,GAAW,EACX,GAAW,EACX,EAAE;;YACF,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACrE,IAAI,oBAAoB,GAAG,KAAK,CAAC;YACjC,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI,UAAU,GAAG,KAAK,CAAC;YAEvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACjB,oBAAoB,GAAG,IAAI,CAAC;aAC7B;YACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;gBAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;oBAC5B,YAAY,GAAG,IAAI,CAAC;iBACrB;qBAAM;oBACL,UAAU,GAAG,IAAI,CAAC;iBACnB;aACF;YACD,IAAI,YAAY,EAAE;gBAChB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAkB,CAAC;gBAC3D,IAAI,MAAA,MAAM,CAAC,MAAM,mCAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAE;oBACxC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;iBACjG;qBAAM;oBACL,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC;iBACpG;aACF;YAED,IAAI,YAAY,EAAE;gBAChB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,4BAA4B,CAAC,CAAC;aACjH;iBAAM,IAAI,UAAU,EAAE;gBACrB,IAAI,GAAG,KAAK,CAAC,EAAE;oBACb,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,6BAA6B,CACnF,CAAC;iBACH;qBAAM;oBACL,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,4BAA4B,CAClF,CAAC;iBACH;aACF;iBAAM,IAAI,oBAAoB,EAAE;gBAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;oBAC1B,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,4BAA4B,CAClF,CAAC;iBACH;qBAAM;oBACL,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,6BAA6B,CACnF,CAAC;iBACH;aACF;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,EACD,iBAAiB,EAAE;YACjB,UAAU,EAAE,CAAC,IAAwB,EAAE,KAAuB,EAAE,EAAE;gBAChE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEvC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;gBAGjD,MAAM,UAAU,mCACX,KAAK,CAAC,OAAO,KAChB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAwB,EAAE,KAAa,EAAE,EAAE;wBAC7E,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE;4BAC3B,uCAAY,GAAG,KAAE,MAAM,EAAE,IAAI,IAAG;yBACjC;wBACD,OAAO,GAAG,CAAC;oBACb,CAAC,CAAC,GACH,CAAC;gBAEF,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,aAAa,EAAE,CAAC,IAAwB,EAAE,KAAuB,EAAE,EAAE;gBACnE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAE1C,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;gBAGlD,MAAM,UAAU,mCACX,KAAK,CAAC,OAAO,KAChB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAwB,EAAE,KAAa,EAAE,EAAE;wBAC7E,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE;4BAC3B,uCAAY,GAAG,KAAE,MAAM,EAAE,KAAK,IAAG;yBAClC;wBACD,OAAO,GAAG,CAAC;oBACb,CAAC,CAAC,GACH,CAAC;gBAGF,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,0BAA0B,EAAE,CAAC,IAAwB,EAAE,KAAuB,EAAE,EAAE;gBAChF,4BAA4B,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;YACD,2BAA2B,EAAE,CAAC,IAAwB,EAAE,KAAuB,EAAE,EAAE;gBACjF,6BAA6B,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;SACF,IACE,iBAAiB,EACpB,CAAC;AACL,CAAC;AAKD,SAAS,4BAA4B,CAAC,KAAuB;IAE3D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAa,CAAC;IAEjD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;QACxG,kBAAkB,EAAE,KAAK;QACzB,mBAAmB,EAAE,KAAK;KAC3B,CAAC,CAAC;IAEH,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;AACrC,CAAC;AAKD,SAAS,6BAA6B,CAAC,KAAuB;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC7B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;QACzG,kBAAkB,EAAE,KAAK;QACzB,mBAAmB,EAAE,KAAK;KAC3B,CAAC,CAAC;IACH,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;AACrC,CAAC","file":"table-plugins.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport {\n FilterPlugin,\n AddRowColumnPlugin,\n TableSeriesNumber,\n HighlightHeaderWhenSelectCellPlugin,\n ContextMenuPlugin,\n ExcelEditCellKeyboardPlugin,\n AutoFillPlugin,\n DEFAULT_HEADER_MENU_ITEMS,\n DEFAULT_BODY_MENU_ITEMS,\n DEFAULT_COLUMN_SERIES_MENU_ITEMS\n} from '@visactor/vtable-plugins';\nimport type {\n FilterOptions,\n MenuItemOrSeparator,\n MenuClickEventArgs,\n AddRowColumnOptions,\n TableSeriesNumberOptions,\n IHighlightHeaderWhenSelectCellPluginOptions,\n ContextMenuOptions\n} from '@visactor/vtable-plugins';\nimport type { ISheetDefine, IColumnDefine, IVTableSheetOptions } from '../ts-types';\nimport { isValid } from '@visactor/vutils';\n\n/**\n * 获取表格插件列表\n * @param sheetDefine Sheet配置定义\n * @returns 插件数组\n */\nexport function getTablePlugins(\n sheetDefine?: ISheetDefine,\n options?: IVTableSheetOptions\n): VTable.plugins.IVTablePlugin[] {\n const plugins: VTable.plugins.IVTablePlugin[] = [];\n // 结合options.VTablePluginModules,来判断是否禁用插件\n const disabledPlugins = options?.VTablePluginModules?.filter(module => module.disabled);\n const enabledPlugins = options?.VTablePluginModules?.filter(module => !module.disabled);\n if (!disabledPlugins?.some(module => module.module === FilterPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === FilterPlugin)\n ?.moduleOptions as FilterOptions;\n const filterPlugin = createFilterPlugin(sheetDefine, userPluginOptions);\n plugins.push(filterPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AddRowColumnPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === AddRowColumnPlugin)\n ?.moduleOptions as AddRowColumnOptions;\n const addRowColumnPlugin = new AddRowColumnPlugin({\n addRowCallback: (row: number, tableInstance: VTable.ListTable) => {\n tableInstance.addRecord([], row - tableInstance.columnHeaderLevelCount);\n },\n ...userPluginOptions\n });\n plugins.push(addRowColumnPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === TableSeriesNumber)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === TableSeriesNumber)\n ?.moduleOptions as TableSeriesNumberOptions;\n const tableSeriesNumberPlugin = new TableSeriesNumber({\n rowCount: sheetDefine?.rowCount || 100,\n colCount: sheetDefine?.columnCount || 100,\n rowSeriesNumberWidth: 30,\n colSeriesNumberHeight: 30,\n rowSeriesNumberCellStyle:\n sheetDefine?.theme?.rowSeriesNumberCellStyle || options?.theme?.rowSeriesNumberCellStyle,\n colSeriesNumberCellStyle:\n sheetDefine?.theme?.colSeriesNumberCellStyle || options?.theme?.colSeriesNumberCellStyle,\n ...userPluginOptions\n });\n plugins.push(tableSeriesNumberPlugin);\n }\n // 这个插件有个bug 先不启用 #4447\n // if (!disabledPlugins?.some(module => module.module === HighlightHeaderWhenSelectCellPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(module => module.module === HighlightHeaderWhenSelectCellPlugin)\n // ?.moduleOptions as IHighlightHeaderWhenSelectCellPluginOptions;\n // const highlightHeaderWhenSelectCellPlugin = new HighlightHeaderWhenSelectCellPlugin({\n // colHighlight: true,\n // rowHighlight: true,\n // ...userPluginOptions\n // });\n // plugins.push(highlightHeaderWhenSelectCellPlugin); // 这个插件有个bug 先不启用 #4447\n // }\n if (!disabledPlugins?.some(module => module.module === ContextMenuPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === ContextMenuPlugin)?.moduleOptions;\n const contextMenuPlugin = createContextMenuItems(sheetDefine, userPluginOptions);\n plugins.push(contextMenuPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === ExcelEditCellKeyboardPlugin)) {\n const userPluginOptions = enabledPlugins?.find(\n module => module.module === ExcelEditCellKeyboardPlugin\n )?.moduleOptions;\n const excelEditCellKeyboardPlugin = new ExcelEditCellKeyboardPlugin(userPluginOptions);\n plugins.push(excelEditCellKeyboardPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AutoFillPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(\n // module => module.module === VTablePlugins.AutoFillPlugin\n // )?.moduleOptions;\n const autoFillPlugin = new AutoFillPlugin();\n plugins.push(autoFillPlugin);\n }\n if (options?.VTablePluginModules) {\n options.VTablePluginModules.forEach(\n (module: { module: new (options: any) => VTable.plugins.IVTablePlugin; moduleOptions: any }) => {\n if (typeof module.module === 'function') {\n // 检查是否为构造函数\n plugins.push(new module.module(module.moduleOptions));\n } else {\n throw new Error(`Invalid plugin: ${module.module}`);\n }\n }\n );\n }\n return plugins;\n}\n\n/**\n * 创建筛选插件(如果需要)\n * @param sheetDefine Sheet配置\n * @returns 筛选插件实例或null\n */\nfunction createFilterPlugin(sheetDefine?: ISheetDefine, userPluginOptions?: FilterOptions): FilterPlugin | null {\n // // 对象配置\n // if (typeof sheetDefine.filter === 'object') {\n // return new VTablePlugins.FilterPlugin({\n // filterIcon: sheetDefine.filter.filterIcon,\n // filteringIcon: sheetDefine.filter.filteringIcon,\n // enableFilter: createColumnFilterChecker(sheetDefine),\n // filterModes: sheetDefine.filter.filterModes\n // });\n // }\n return new FilterPlugin({\n enableFilter: createColumnFilterChecker(sheetDefine),\n ...userPluginOptions\n });\n}\n\n/**\n * 创建列级别筛选检查函数\n * @param sheetDefine Sheet配置\n * @returns 筛选检查函数\n */\nfunction createColumnFilterChecker(sheetDefine: ISheetDefine) {\n return (columnIndex: number, column: VTable.TYPES.ColumnDefine): boolean => {\n // 由于在 vtable-sheet,把列索引作为列的唯一标识 field,因此这里直接使用列索引\n if (columnIndex < 0 || !sheetDefine.columns || columnIndex >= sheetDefine.columns.length) {\n return false; // 默认启用,保持向后兼容\n }\n\n // 获取列定义配置\n const columnDefine = sheetDefine.columns[columnIndex] as IColumnDefine;\n const filter = !!(columnDefine?.filter ?? sheetDefine.filter);\n // 明确禁用检查\n return filter;\n };\n}\n\nfunction createContextMenuItems(sheetDefine: ISheetDefine, userPluginOptions?: ContextMenuOptions) {\n return new ContextMenuPlugin({\n headerCellMenuItems: [\n ...DEFAULT_HEADER_MENU_ITEMS,\n {\n text: '设置筛选器',\n menuKey: 'set_filter'\n },\n {\n text: '取消筛选器',\n menuKey: 'cancel_filter'\n },\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n bodyCellMenuItems: [\n ...DEFAULT_BODY_MENU_ITEMS,\n {\n text: '启用首行表头',\n menuKey: 'enable_first_row_as_header'\n }\n ],\n columnSeriesNumberMenuItems: [\n ...DEFAULT_COLUMN_SERIES_MENU_ITEMS,\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n beforeShowAdjustMenuItems: (\n menuItems: MenuItemOrSeparator[],\n table: VTable.ListTable,\n col: number,\n row: number\n ) => {\n console.log('beforeShowAdjustMenuItems', menuItems, table, col, row);\n let isColumnSeriesNumber = false;\n let isHeaderCell = false;\n let isBodyCell = false;\n\n if (!isValid(row)) {\n isColumnSeriesNumber = true;\n }\n if (isValid(col) && isValid(row)) {\n if (table.isHeader(col, row)) {\n isHeaderCell = true;\n } else {\n isBodyCell = true;\n }\n }\n if (isHeaderCell) {\n const column = table.options.columns[col] as IColumnDefine;\n if (column.filter ?? sheetDefine?.filter) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'set_filter');\n } else {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'cancel_filter');\n }\n }\n\n if (isHeaderCell) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header');\n } else if (isBodyCell) {\n if (row === 0) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n }\n } else if (isColumnSeriesNumber) {\n if (table.isHeader(col, 0)) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n }\n }\n return menuItems;\n },\n menuClickCallback: {\n set_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n console.log('set_filter', args, table);\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = true;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: true };\n }\n return col;\n })\n };\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n cancel_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n console.log('cancel_filter', args, table);\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = false;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: false };\n }\n return col;\n })\n };\n\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n enable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleEnableFirstRowAsHeader(table);\n },\n disable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleDisableFirstRowAsHeader(table);\n }\n },\n ...userPluginOptions\n });\n}\n\n/**\n * 处理启用第一行作为表头\n */\nfunction handleEnableFirstRowAsHeader(table: VTable.ListTable): void {\n // 获取第一行数据\n const firstRecord = table.records[0] as string[];\n // 获取剩余数据\n const new_records = table.records.slice(1);\n //获取当前column\n const columns = table.columns;\n // 设置第一行为表头\n firstRecord.forEach((item, index) => {\n columns[index].title = item;\n });\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: true }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n // 更新渲染\n table.scenegraph.updateNextFrame();\n}\n\n/**\n * 处理禁用第一行作为表头\n */\nfunction handleDisableFirstRowAsHeader(table: VTable.ListTable): void {\n const columns = table.columns;\n const firstRecord: (string | number)[] = [];\n columns.forEach((col, index) => {\n firstRecord.push(col.title as string);\n });\n //像records中添加第一行\n const new_records = [firstRecord, ...table.records];\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: false }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n table.scenegraph.updateNextFrame();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/table-plugins.ts"],"names":[],"mappings":"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","file":"table-plugins.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport {\n FilterPlugin,\n AddRowColumnPlugin,\n TableSeriesNumber,\n HighlightHeaderWhenSelectCellPlugin,\n ContextMenuPlugin,\n ExcelEditCellKeyboardPlugin,\n AutoFillPlugin,\n DEFAULT_HEADER_MENU_ITEMS,\n DEFAULT_BODY_MENU_ITEMS,\n DEFAULT_COLUMN_SERIES_MENU_ITEMS\n} from '@visactor/vtable-plugins';\nimport type {\n FilterOptions,\n MenuItemOrSeparator,\n MenuClickEventArgs,\n AddRowColumnOptions,\n TableSeriesNumberOptions,\n IHighlightHeaderWhenSelectCellPluginOptions,\n ContextMenuOptions\n} from '@visactor/vtable-plugins';\nimport type { ISheetDefine, IColumnDefine, IVTableSheetOptions } from '../ts-types';\nimport { isValid } from '@visactor/vutils';\n\n/**\n * 获取表格插件列表\n * @param sheetDefine Sheet配置定义\n * @returns 插件数组\n */\nexport function getTablePlugins(\n sheetDefine?: ISheetDefine,\n options?: IVTableSheetOptions\n): VTable.plugins.IVTablePlugin[] {\n const plugins: VTable.plugins.IVTablePlugin[] = [];\n // 结合options.VTablePluginModules,来判断是否禁用插件\n const disabledPlugins = options?.VTablePluginModules?.filter(module => module.disabled);\n const enabledPlugins = options?.VTablePluginModules?.filter(module => !module.disabled);\n if (!disabledPlugins?.some(module => module.module === FilterPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === FilterPlugin)\n ?.moduleOptions as FilterOptions;\n const filterPlugin = createFilterPlugin(sheetDefine, userPluginOptions);\n plugins.push(filterPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AddRowColumnPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === AddRowColumnPlugin)\n ?.moduleOptions as AddRowColumnOptions;\n const addRowColumnPlugin = new AddRowColumnPlugin({\n addRowCallback: (row: number, tableInstance: VTable.ListTable) => {\n tableInstance.addRecord([], row - tableInstance.columnHeaderLevelCount);\n },\n ...userPluginOptions\n });\n plugins.push(addRowColumnPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === TableSeriesNumber)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === TableSeriesNumber)\n ?.moduleOptions as TableSeriesNumberOptions;\n const tableSeriesNumberPlugin = new TableSeriesNumber({\n rowCount: sheetDefine?.rowCount || 100,\n colCount: sheetDefine?.columnCount || 100,\n rowSeriesNumberWidth: 30,\n colSeriesNumberHeight: 30,\n rowSeriesNumberCellStyle:\n sheetDefine?.theme?.rowSeriesNumberCellStyle || options?.theme?.rowSeriesNumberCellStyle,\n colSeriesNumberCellStyle:\n sheetDefine?.theme?.colSeriesNumberCellStyle || options?.theme?.colSeriesNumberCellStyle,\n ...userPluginOptions\n });\n plugins.push(tableSeriesNumberPlugin);\n }\n // 这个插件有个bug 先不启用 #4447\n // if (!disabledPlugins?.some(module => module.module === HighlightHeaderWhenSelectCellPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(module => module.module === HighlightHeaderWhenSelectCellPlugin)\n // ?.moduleOptions as IHighlightHeaderWhenSelectCellPluginOptions;\n // const highlightHeaderWhenSelectCellPlugin = new HighlightHeaderWhenSelectCellPlugin({\n // colHighlight: true,\n // rowHighlight: true,\n // ...userPluginOptions\n // });\n // plugins.push(highlightHeaderWhenSelectCellPlugin); // 这个插件有个bug 先不启用 #4447\n // }\n if (!disabledPlugins?.some(module => module.module === ContextMenuPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === ContextMenuPlugin)?.moduleOptions;\n const contextMenuPlugin = createContextMenuItems(sheetDefine, userPluginOptions);\n plugins.push(contextMenuPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === ExcelEditCellKeyboardPlugin)) {\n const userPluginOptions = enabledPlugins?.find(\n module => module.module === ExcelEditCellKeyboardPlugin\n )?.moduleOptions;\n const excelEditCellKeyboardPlugin = new ExcelEditCellKeyboardPlugin(userPluginOptions);\n plugins.push(excelEditCellKeyboardPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AutoFillPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(\n // module => module.module === VTablePlugins.AutoFillPlugin\n // )?.moduleOptions;\n const autoFillPlugin = new AutoFillPlugin();\n plugins.push(autoFillPlugin);\n }\n if (options?.VTablePluginModules) {\n options.VTablePluginModules.forEach(\n (module: { module: new (options: any) => VTable.plugins.IVTablePlugin; moduleOptions: any }) => {\n if (typeof module.module === 'function') {\n // 检查是否为构造函数\n plugins.push(new module.module(module.moduleOptions));\n } else {\n throw new Error(`Invalid plugin: ${module.module}`);\n }\n }\n );\n }\n return plugins;\n}\n\n/**\n * 创建筛选插件(如果需要)\n * @param sheetDefine Sheet配置\n * @returns 筛选插件实例或null\n */\nfunction createFilterPlugin(sheetDefine?: ISheetDefine, userPluginOptions?: FilterOptions): FilterPlugin | null {\n // // 对象配置\n // if (typeof sheetDefine.filter === 'object') {\n // return new VTablePlugins.FilterPlugin({\n // filterIcon: sheetDefine.filter.filterIcon,\n // filteringIcon: sheetDefine.filter.filteringIcon,\n // enableFilter: createColumnFilterChecker(sheetDefine),\n // filterModes: sheetDefine.filter.filterModes\n // });\n // }\n return new FilterPlugin({\n enableFilter: createColumnFilterChecker(sheetDefine),\n ...userPluginOptions\n });\n}\n\n/**\n * 创建列级别筛选检查函数\n * @param sheetDefine Sheet配置\n * @returns 筛选检查函数\n */\nfunction createColumnFilterChecker(sheetDefine: ISheetDefine) {\n return (columnIndex: number, column: VTable.TYPES.ColumnDefine): boolean => {\n // 由于在 vtable-sheet,把列索引作为列的唯一标识 field,因此这里直接使用列索引\n if (columnIndex < 0 || !sheetDefine.columns || columnIndex >= sheetDefine.columns.length) {\n return false; // 默认启用,保持向后兼容\n }\n\n // 获取列定义配置\n const columnDefine = sheetDefine.columns[columnIndex] as IColumnDefine;\n const filter = !!(columnDefine?.filter ?? sheetDefine.filter);\n // 明确禁用检查\n return filter;\n };\n}\n\nfunction createContextMenuItems(sheetDefine: ISheetDefine, userPluginOptions?: ContextMenuOptions) {\n return new ContextMenuPlugin({\n headerCellMenuItems: [\n ...DEFAULT_HEADER_MENU_ITEMS,\n {\n text: '设置筛选器',\n menuKey: 'set_filter'\n },\n {\n text: '取消筛选器',\n menuKey: 'cancel_filter'\n },\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n bodyCellMenuItems: [\n ...DEFAULT_BODY_MENU_ITEMS,\n {\n text: '启用首行表头',\n menuKey: 'enable_first_row_as_header'\n }\n ],\n columnSeriesNumberMenuItems: [\n ...DEFAULT_COLUMN_SERIES_MENU_ITEMS,\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n beforeShowAdjustMenuItems: (\n menuItems: MenuItemOrSeparator[],\n table: VTable.ListTable,\n col: number,\n row: number\n ) => {\n let isColumnSeriesNumber = false;\n let isHeaderCell = false;\n let isBodyCell = false;\n\n if (!isValid(row)) {\n isColumnSeriesNumber = true;\n }\n if (isValid(col) && isValid(row)) {\n if (table.isHeader(col, row)) {\n isHeaderCell = true;\n } else {\n isBodyCell = true;\n }\n }\n if (isHeaderCell) {\n const column = table.options.columns[col] as IColumnDefine;\n if (column.filter ?? sheetDefine?.filter) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'set_filter');\n } else {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'cancel_filter');\n }\n }\n\n if (isHeaderCell) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header');\n } else if (isBodyCell) {\n if (row === 0) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n }\n } else if (isColumnSeriesNumber) {\n if (table.isHeader(col, 0)) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n }\n }\n return menuItems;\n },\n menuClickCallback: {\n set_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = true;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: true };\n }\n return col;\n })\n };\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n cancel_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = false;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: false };\n }\n return col;\n })\n };\n\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n enable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleEnableFirstRowAsHeader(table);\n },\n disable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleDisableFirstRowAsHeader(table);\n }\n },\n ...userPluginOptions\n });\n}\n\n/**\n * 处理启用第一行作为表头\n */\nfunction handleEnableFirstRowAsHeader(table: VTable.ListTable): void {\n // 获取第一行数据\n const firstRecord = table.records[0] as string[];\n // 获取剩余数据\n const new_records = table.records.slice(1);\n //获取当前column\n const columns = table.columns;\n // 设置第一行为表头\n firstRecord.forEach((item, index) => {\n columns[index].title = item;\n });\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: true }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n // 更新渲染\n table.scenegraph.updateNextFrame();\n}\n\n/**\n * 处理禁用第一行作为表头\n */\nfunction handleDisableFirstRowAsHeader(table: VTable.ListTable): void {\n const columns = table.columns;\n const firstRecord: (string | number)[] = [];\n columns.forEach((col, index) => {\n firstRecord.push(col.title as string);\n });\n //像records中添加第一行\n const new_records = [firstRecord, ...table.records];\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: false }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n table.scenegraph.updateNextFrame();\n}\n"]}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import type { CellClickEvent, CellValueChangedEvent, SelectionChangedEvent } from '../ts-types';
|
|
1
2
|
import type VTableSheet from '../components/vtable-sheet';
|
|
2
3
|
export declare class EventManager {
|
|
3
4
|
private sheet;
|
|
4
5
|
private boundHandlers;
|
|
5
|
-
readonly
|
|
6
|
-
readonly handleCellValueChangedBind: (event:
|
|
7
|
-
readonly handleSelectionChangedForRangeModeBind: (event:
|
|
6
|
+
readonly handleCellClickBind: (event: CellClickEvent) => void;
|
|
7
|
+
readonly handleCellValueChangedBind: (event: CellValueChangedEvent) => void;
|
|
8
|
+
readonly handleSelectionChangedForRangeModeBind: (event: SelectionChangedEvent) => void;
|
|
8
9
|
constructor(sheet: VTableSheet);
|
|
9
10
|
private setupEventListeners;
|
|
10
11
|
private addEvent;
|
|
11
|
-
|
|
12
|
-
handleCellValueChanged(event:
|
|
13
|
-
handleSelectionChangedForRangeMode(event:
|
|
12
|
+
handleCellClick(event: CellClickEvent): void;
|
|
13
|
+
handleCellValueChanged(event: CellValueChangedEvent): void;
|
|
14
|
+
handleSelectionChangedForRangeMode(event: SelectionChangedEvent): void;
|
|
14
15
|
private handleMouseDown;
|
|
15
16
|
private handleMouseMove;
|
|
16
17
|
private handleMouseUp;
|
|
@@ -23,7 +24,5 @@ export declare class EventManager {
|
|
|
23
24
|
private handleFocus;
|
|
24
25
|
private handleBlur;
|
|
25
26
|
private handleWindowResize;
|
|
26
|
-
private getCellFromMouseCoords;
|
|
27
|
-
private getFormulaUIManager;
|
|
28
27
|
release(): void;
|
|
29
28
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export class EventManager {
|
|
2
2
|
constructor(sheet) {
|
|
3
|
-
this.boundHandlers = new Map, this.sheet = sheet, this.
|
|
3
|
+
this.boundHandlers = new Map, this.sheet = sheet, this.handleCellClickBind = this.handleCellClick.bind(this),
|
|
4
4
|
this.handleCellValueChangedBind = this.handleCellValueChanged.bind(this), this.handleSelectionChangedForRangeModeBind = this.handleSelectionChangedForRangeMode.bind(this),
|
|
5
5
|
this.setupEventListeners();
|
|
6
6
|
}
|
|
@@ -16,7 +16,7 @@ export class EventManager {
|
|
|
16
16
|
addEvent(target, eventType, handler) {
|
|
17
17
|
target.addEventListener(eventType, handler), this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
handleCellClick(event) {
|
|
20
20
|
if (this.sheet.formulaManager.formulaWorkingOnCell) return;
|
|
21
21
|
const formulaUIManager = this.sheet.formulaUIManager;
|
|
22
22
|
formulaUIManager.isFormulaBarShowingResult = !1, formulaUIManager.clearFormula(),
|
|
@@ -42,15 +42,6 @@ export class EventManager {
|
|
|
42
42
|
handleWindowResize(event) {
|
|
43
43
|
this.sheet.resize();
|
|
44
44
|
}
|
|
45
|
-
getCellFromMouseCoords(x, y) {
|
|
46
|
-
return {
|
|
47
|
-
row: 0,
|
|
48
|
-
col: 0
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
getFormulaUIManager() {
|
|
52
|
-
return this.sheet.formulaUIManager || null;
|
|
53
|
-
}
|
|
54
45
|
release() {
|
|
55
46
|
const element = this.sheet.getContainer();
|
|
56
47
|
for (const [key, handler] of this.boundHandlers.entries()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event/event-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/event/event-manager.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IAavB,YAAY,KAAkB;QAXtB,kBAAa,GAA+B,IAAI,GAAG,EAAE,CAAC;QAY5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAGnB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAKO,mBAAmB;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAG1C,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAGtE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAG7D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAGzD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAG3D,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAQO,QAAQ,CAAC,MAAmB,EAAE,SAAiB,EAAE,OAAsB;QAC7E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAOD,eAAe,CAAC,KAAqB;QAEnC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,EAAE;YAClD,OAAO;SACR;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACrD,gBAAgB,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACnD,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAChC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC;IAMD,sBAAsB,CAAC,KAA4B;QAEjD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAMD,kCAAkC,CAAC,KAA4B;QAE7D,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAGO,eAAe,CAAC,KAAiB;IAEzC,CAAC;IAEO,eAAe,CAAC,KAAiB;IAEzC,CAAC;IAEO,aAAa,CAAC,KAAiB;IAEvC,CAAC;IAEO,iBAAiB,CAAC,KAAiB;IAE3C,CAAC;IAEO,aAAa,CAAC,KAAoB;IAE1C,CAAC;IAEO,WAAW,CAAC,KAAoB;IAExC,CAAC;IAEO,UAAU,CAAC,KAAqB;IAExC,CAAC;IAEO,WAAW,CAAC,KAAqB;IAEzC,CAAC;IAEO,SAAS,CAAC,KAAqB;IAEvC,CAAC;IAEO,WAAW,CAAC,KAAiB;IAErC,CAAC;IAEO,UAAU,CAAC,KAAiB;IAEpC,CAAC;IAMO,kBAAkB,CAAC,KAAc;QAEvC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IAKD,OAAO;QACL,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAG1C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;YACzD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAI,SAAS,KAAK,QAAQ,EAAE;gBAC1B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;aAChD;iBAAM;gBACL,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;aACjD;SACF;QAGD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF","file":"event-manager.js","sourcesContent":["import type { CellClickEvent, CellValueChangedEvent, SelectionChangedEvent } from '../ts-types';\nimport type VTableSheet from '../components/vtable-sheet';\n\n/**\n * 事件管理器类\n * 负责处理VTableSheet组件的事件系统中转和基础DOM事件\n */\nexport class EventManager {\n private sheet: VTableSheet;\n private boundHandlers: Map<string, EventListener> = new Map();\n\n // 预先绑定的事件处理方法\n readonly handleCellClickBind: (event: CellClickEvent) => void;\n readonly handleCellValueChangedBind: (event: CellValueChangedEvent) => void;\n readonly handleSelectionChangedForRangeModeBind: (event: SelectionChangedEvent) => void;\n\n /**\n * 创建事件管理器实例\n * @param sheet VTableSheet实例\n */\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n\n // 预先绑定事件处理方法\n this.handleCellClickBind = this.handleCellClick.bind(this);\n this.handleCellValueChangedBind = this.handleCellValueChanged.bind(this);\n this.handleSelectionChangedForRangeModeBind = this.handleSelectionChangedForRangeMode.bind(this);\n\n this.setupEventListeners();\n }\n\n /**\n * 设置DOM事件监听\n */\n private setupEventListeners(): void {\n // 获取Sheet元素\n const element = this.sheet.getContainer();\n\n // 设置鼠标事件\n this.addEvent(element, 'mousedown', this.handleMouseDown.bind(this));\n this.addEvent(element, 'mousemove', this.handleMouseMove.bind(this));\n this.addEvent(element, 'mouseup', this.handleMouseUp.bind(this));\n this.addEvent(element, 'dblclick', this.handleDoubleClick.bind(this));\n\n // 设置键盘事件\n this.addEvent(element, 'keydown', this.handleKeyDown.bind(this));\n this.addEvent(element, 'keyup', this.handleKeyUp.bind(this));\n\n // 设置剪贴板事件\n this.addEvent(element, 'copy', this.handleCopy.bind(this));\n this.addEvent(element, 'paste', this.handlePaste.bind(this));\n this.addEvent(element, 'cut', this.handleCut.bind(this));\n\n // 设置焦点事件\n this.addEvent(element, 'focus', this.handleFocus.bind(this));\n this.addEvent(element, 'blur', this.handleBlur.bind(this));\n\n // 窗口大小变化事件\n this.addEvent(window, 'resize', this.handleWindowResize.bind(this));\n }\n\n /**\n * 添加DOM事件监听\n * @param target 事件目标\n * @param eventType 事件类型\n * @param handler 事件处理函数\n */\n private addEvent(target: EventTarget, eventType: string, handler: EventListener): void {\n target.addEventListener(eventType, handler);\n this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);\n }\n\n /**\n * 处理单元格选择事件\n * 这个方法处理从Worksheet冒泡上来的cell-selected事件\n * @param event 单元格选择事件数据\n */\n handleCellClick(event: CellClickEvent): void {\n // 如果在公式编辑状态,不处理\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n // 重置公式栏显示标志,让公式栏显示选中单元格的值\n const formulaUIManager = this.sheet.formulaUIManager;\n formulaUIManager.isFormulaBarShowingResult = false;\n formulaUIManager.clearFormula();\n formulaUIManager.updateFormulaBar();\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 单元格值变更事件数据\n */\n handleCellValueChanged(event: CellValueChangedEvent): void {\n // 处理公式相关逻辑\n this.sheet.formulaManager.formulaRangeSelector.handleCellValueChanged(event);\n }\n\n /**\n * 处理选择范围变化事件\n * @param event 选择范围变化事件数据\n */\n handleSelectionChangedForRangeMode(event: SelectionChangedEvent): void {\n // 处理公式相关逻辑\n this.sheet.formulaManager.formulaRangeSelector.handleSelectionChangedForRangeMode(event);\n }\n\n // 原有DOM事件处理方法保持不变\n private handleMouseDown(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleMouseMove(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleDoubleClick(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleCopy(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handlePaste(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleCut(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleFocus(event: FocusEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleBlur(event: FocusEvent): void {\n // 原有逻辑保持不变\n }\n\n /**\n * 处理窗口大小变化事件\n * @param event UI事件\n */\n private handleWindowResize(event: UIEvent): void {\n // 更新Sheet大小\n this.sheet.resize();\n }\n\n /**\n * 释放所有事件处理函数\n */\n release(): void {\n const element = this.sheet.getContainer();\n\n // 移除所有DOM事件监听器\n for (const [key, handler] of this.boundHandlers.entries()) {\n const eventType = key.split('-')[0];\n\n if (eventType === 'resize') {\n window.removeEventListener(eventType, handler);\n } else {\n element.removeEventListener(eventType, handler);\n }\n }\n\n // 清空事件处理函数映射\n this.boundHandlers.clear();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formula/formula-autocomplete.ts"],"names":[],"mappings":"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","file":"formula-autocomplete.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\ninterface AutocompleteItem {\n type: 'function' | 'cell' | 'range';\n value: string;\n label: string;\n description?: string;\n signature?: string;\n}\n\nexport class FormulaAutocomplete {\n private container: HTMLElement;\n private dropdown: HTMLElement | null = null;\n private items: AutocompleteItem[] = [];\n private selectedIndex: number = -1;\n private isVisible: boolean = false;\n private inputElement: HTMLInputElement | null = null;\n private sheet: VTableSheet;\n private onSelectCallback?: (item: AutocompleteItem) => void;\n\n private customPositioning?: () => void;\n\n constructor(container: HTMLElement, sheet: VTableSheet) {\n this.container = container;\n this.sheet = sheet;\n this.createDropdown();\n }\n\n /**\n * 创建下拉框元素\n */\n private createDropdown(): void {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'vtable-formula-autocomplete';\n this.dropdown.style.display = 'none';\n this.container.appendChild(this.dropdown);\n }\n\n /**\n * 绑定到输入框\n */\n attachTo(input: HTMLInputElement, onSelect?: (item: AutocompleteItem) => void, customPositioning?: () => void): void {\n this.inputElement = input;\n this.onSelectCallback = onSelect;\n this.customPositioning = customPositioning;\n\n // 绑定事件\n input.addEventListener('input', this.handleInput.bind(this));\n input.addEventListener('keydown', this.handleKeydown.bind(this));\n input.addEventListener('blur', () => {\n setTimeout(() => this.hide(), 200);\n });\n }\n\n /**\n * 处理输入事件\n */\n private handleInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n const cursorPos = input.selectionStart || 0;\n\n // 解析当前输入上下文\n const context = this.parseInputContext(value, cursorPos);\n\n if (context.shouldShowAutocomplete) {\n this.updateSuggestions(context);\n this.show();\n } else {\n this.hide();\n }\n }\n\n /**\n * 解析输入上下文\n */\n private parseInputContext(\n value: string,\n cursorPos: number\n ): {\n shouldShowAutocomplete: boolean;\n searchTerm: string;\n type: 'function' | 'cell' | 'all';\n insertPosition: number;\n } {\n // 如果不是公式,不显示\n if (!value.startsWith('=')) {\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n // 获取光标前的文本\n const textBeforeCursor = value.substring(1, cursorPos); // 去掉 '='\n\n // 查找最后一个函数或操作符\n const lastOperatorMatch = textBeforeCursor.match(/[\\+\\-\\*\\/\\(\\,\\s]([A-Za-z0-9]*)$/);\n\n if (lastOperatorMatch && lastOperatorMatch[1] !== '') {\n return {\n shouldShowAutocomplete: true,\n searchTerm: lastOperatorMatch[1],\n type: /^[A-Za-z]/.test(lastOperatorMatch[1]) ? 'function' : 'cell',\n insertPosition: cursorPos - lastOperatorMatch[1].length\n };\n }\n\n // 公式开始位置\n if (textBeforeCursor.match(/^[A-Za-z0-9]*$/)) {\n return {\n shouldShowAutocomplete: true,\n searchTerm: textBeforeCursor,\n type: 'all',\n insertPosition: 1\n };\n }\n\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n /**\n * 更新建议列表\n */\n private updateSuggestions(context: any): void {\n const { searchTerm, type } = context;\n this.items = [];\n\n // 获取函数列表\n if (type === 'function' || type === 'all') {\n const functions = this.sheet.formulaManager.getAvailableFunctions();\n const functionItems = functions\n .filter(fn => fn.toUpperCase().startsWith(searchTerm.toUpperCase()))\n .slice(0, 10) // 限制数量\n .map(fn => ({\n type: 'function' as const,\n value: fn,\n label: fn,\n description: this.getFunctionDescription(fn),\n signature: this.getFunctionSignature(fn)\n }));\n this.items.push(...functionItems);\n }\n\n // 添加单元格引用建议\n if (type === 'cell' || type === 'all') {\n const cellSuggestions = this.generateCellSuggestions(searchTerm);\n this.items.push(...cellSuggestions);\n }\n console.log('updateSuggestions', context, this.items);\n this.renderDropdown();\n }\n\n /**\n * 生成单元格引用建议\n */\n private generateCellSuggestions(searchTerm: string): AutocompleteItem[] {\n const suggestions: AutocompleteItem[] = [];\n\n // 如果是有效的部分单元格地址\n const cellMatch = searchTerm.match(/^([A-Za-z]*)([0-9]*)$/);\n if (cellMatch) {\n const [, colPart, rowPart] = cellMatch;\n\n // 生成列建议\n if (colPart && !rowPart) {\n // A -> A1, A2, A3...\n for (let row = 1; row <= 5; row++) {\n suggestions.push({\n type: 'cell',\n value: `${colPart.toUpperCase()}${row}`,\n label: `${colPart.toUpperCase()}${row}`,\n description: '单元格引用'\n });\n }\n }\n\n // 生成完整单元格建议\n if (colPart && rowPart) {\n const address = `${colPart.toUpperCase()}${rowPart}`;\n suggestions.push({\n type: 'cell',\n value: address,\n label: address,\n description: '单元格引用'\n });\n\n // 添加范围建议\n suggestions.push({\n type: 'range',\n value: `${address}:`,\n label: `${address}:...`,\n description: '开始选择范围'\n });\n }\n }\n\n return suggestions.slice(0, 5); // 限制建议数量\n }\n\n /**\n * 获取函数描述\n */\n private getFunctionDescription(functionName: string): string {\n const descriptions: Record<string, string> = {\n SUM: '计算数值总和',\n AVERAGE: '计算平均值',\n COUNT: '计数数值单元格',\n MAX: '返回最大值',\n MIN: '返回最小值',\n IF: '条件判断',\n VLOOKUP: '垂直查找',\n CONCATENATE: '连接文本'\n // ... 更多函数描述\n };\n return descriptions[functionName] || '';\n }\n\n /**\n * 获取函数签名\n */\n private getFunctionSignature(functionName: string): string {\n const signatures: Record<string, string> = {\n SUM: '(number1, [number2], ...)',\n AVERAGE: '(number1, [number2], ...)',\n COUNT: '(value1, [value2], ...)',\n MAX: '(number1, [number2], ...)',\n MIN: '(number1, [number2], ...)',\n IF: '(logical_test, value_if_true, value_if_false)',\n VLOOKUP: '(lookup_value, table_array, col_index_num, [range_lookup])',\n CONCATENATE: '(text1, [text2], ...)'\n // ... 更多函数签名\n };\n return signatures[functionName] || '()';\n }\n\n /**\n * 渲染下拉框\n */\n private renderDropdown(): void {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.innerHTML = '';\n\n if (this.items.length === 0) {\n // 无结果提示\n const emptyEl = document.createElement('div');\n emptyEl.className = 'vtable-formula-autocomplete-empty';\n emptyEl.textContent = '没有匹配的函数';\n this.dropdown.appendChild(emptyEl);\n return;\n }\n\n // 按类型分组\n const groups = this.groupItems(this.items);\n\n groups.forEach(group => {\n // 添加分组标题\n if (groups.length > 1) {\n const groupEl = document.createElement('div');\n groupEl.className = 'vtable-formula-autocomplete-group';\n groupEl.textContent = this.getGroupTitle(group.type);\n this.dropdown.appendChild(groupEl);\n }\n\n // 渲染组内项目\n group.items.forEach((item, index) => {\n const globalIndex = this.items.indexOf(item);\n const itemEl = document.createElement('div');\n itemEl.className = 'vtable-formula-autocomplete-item';\n\n if (globalIndex === this.selectedIndex) {\n itemEl.classList.add('selected');\n }\n\n // 函数名和类型标签\n const nameEl = document.createElement('div');\n nameEl.className = 'item-name';\n\n const labelEl = document.createElement('span');\n labelEl.textContent = item.label;\n nameEl.appendChild(labelEl);\n\n const typeEl = document.createElement('span');\n typeEl.className = `item-type ${item.type}`;\n typeEl.textContent = this.getTypeLabel(item.type);\n nameEl.appendChild(typeEl);\n\n itemEl.appendChild(nameEl);\n\n // 函数签名\n if (item.signature) {\n const signatureEl = document.createElement('div');\n signatureEl.className = 'item-signature';\n signatureEl.textContent = item.signature;\n itemEl.appendChild(signatureEl);\n }\n\n // 描述\n if (item.description) {\n const descEl = document.createElement('div');\n descEl.className = 'item-description';\n descEl.textContent = item.description;\n itemEl.appendChild(descEl);\n }\n\n itemEl.addEventListener('click', () => this.selectItem(globalIndex));\n itemEl.addEventListener('mouseenter', () => {\n this.selectedIndex = globalIndex;\n this.renderDropdown();\n });\n\n this.dropdown.appendChild(itemEl);\n });\n });\n\n // 添加快捷键提示\n const footerEl = document.createElement('div');\n footerEl.className = 'vtable-formula-autocomplete-footer';\n footerEl.innerHTML = `\n <div class=\"shortcut\">\n <span class=\"key\">↑↓</span>\n <span>选择</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Enter</span>\n <span>确认</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Esc</span>\n <span>取消</span>\n </div>\n `;\n this.dropdown.appendChild(footerEl);\n\n this.positionDropdown();\n }\n\n /**\n * 对项目进行分组\n */\n private groupItems(items: AutocompleteItem[]): Array<{ type: string; items: AutocompleteItem[] }> {\n const groups: Record<string, AutocompleteItem[]> = {};\n\n items.forEach(item => {\n if (!groups[item.type]) {\n groups[item.type] = [];\n }\n groups[item.type].push(item);\n });\n\n // 按照优先级排序:function > cell > range\n const priority = ['function', 'cell', 'range'];\n return priority.filter(type => groups[type]).map(type => ({ type, items: groups[type] }));\n }\n\n /**\n * 获取分组标题\n */\n private getGroupTitle(type: string): string {\n const titles: Record<string, string> = {\n function: '函数',\n cell: '单元格',\n range: '范围'\n };\n return titles[type] || type;\n }\n\n /**\n * 获取类型标签\n */\n private getTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n function: 'fx',\n cell: 'A1',\n range: 'A:B'\n };\n return labels[type] || type;\n }\n\n /**\n * 定位下拉框\n */\n private positionDropdown(): void {\n if (this.customPositioning) {\n this.customPositioning();\n return;\n }\n if (!this.dropdown || !this.inputElement) {\n return;\n }\n\n const inputRect = this.inputElement.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n\n this.dropdown.style.position = 'absolute';\n this.dropdown.style.left = `${inputRect.left - containerRect.left}px`;\n this.dropdown.style.top = `${inputRect.bottom - containerRect.top + 2}px`;\n this.dropdown.style.width = `${Math.max(300, inputRect.width)}px`;\n }\n\n /**\n * 处理键盘事件\n */\n private handleKeydown(event: KeyboardEvent): void {\n if (!this.isVisible) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.items.length - 1);\n this.renderDropdown();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderDropdown();\n break;\n case 'Enter':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n case 'Escape':\n this.hide();\n break;\n case 'Tab':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n }\n }\n\n /**\n * 选择项目\n */\n private selectItem(index: number): void {\n const item = this.items[index];\n if (!item || !this.inputElement) {\n return;\n }\n\n if (this.onSelectCallback) {\n this.onSelectCallback(item);\n } else {\n // 默认插入行为\n const value = this.inputElement.value;\n const cursorPos = this.inputElement.selectionStart || 0;\n const context = this.parseInputContext(value, cursorPos);\n\n const newValue =\n value.substring(0, context.insertPosition) +\n item.value +\n (item.type === 'function' ? '(' : '') +\n value.substring(cursorPos);\n\n this.inputElement.value = newValue;\n\n // 设置光标位置\n const newCursorPos = context.insertPosition + item.value.length + (item.type === 'function' ? 1 : 0);\n this.inputElement.setSelectionRange(newCursorPos, newCursorPos);\n }\n\n this.hide();\n }\n\n /**\n * 显示下拉框\n */\n private show(): void {\n if (this.dropdown && this.items.length > 0) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n this.selectedIndex = 0;\n this.renderDropdown();\n }\n }\n\n /**\n * 隐藏下拉框\n */\n private hide(): void {\n if (this.dropdown) {\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n }\n }\n\n /**\n * 销毁组件\n */\n release(): void {\n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/formula/formula-autocomplete.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,mBAAmB;IAY9B,YAAY,SAAsB,EAAE,KAAkB;QAV9C,aAAQ,GAAuB,IAAI,CAAC;QACpC,UAAK,GAAuB,EAAE,CAAC;QAC/B,kBAAa,GAAW,CAAC,CAAC,CAAC;QAC3B,cAAS,GAAY,KAAK,CAAC;QAC3B,iBAAY,GAA4B,IAAI,CAAC;QAOnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAKO,cAAc;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,6BAA6B,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAKD,QAAQ,CAAC,KAAuB,EAAE,QAA2C,EAAE,iBAA8B;QAC3G,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAG3C,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAClC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,WAAW,CAAC,KAAY;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;QAG5C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEzD,IAAI,OAAO,CAAC,sBAAsB,EAAE;YAClC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;aAAM;YACL,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;IACH,CAAC;IAKO,iBAAiB,CACvB,KAAa,EACb,SAAiB;QAQjB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;SAC1F;QAGD,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAGvD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEpF,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,OAAO;gBACL,sBAAsB,EAAE,IAAI;gBAC5B,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC;gBAChC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAClE,cAAc,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM;aACxD,CAAC;SACH;QAGD,IAAI,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;YAC5C,OAAO;gBACL,sBAAsB,EAAE,IAAI;gBAC5B,UAAU,EAAE,gBAAgB;gBAC5B,IAAI,EAAE,KAAK;gBACX,cAAc,EAAE,CAAC;aAClB,CAAC;SACH;QAED,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC;IAKO,iBAAiB,CAAC,OAAY;QACpC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAGhB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC;YACpE,MAAM,aAAa,GAAG,SAAS;iBAC5B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;iBACnE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACV,IAAI,EAAE,UAAmB;gBACzB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAC5C,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;aACzC,CAAC,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;SACnC;QAGD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAKO,uBAAuB,CAAC,UAAkB;QAChD,MAAM,WAAW,GAAuB,EAAE,CAAC;QAG3C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC5D,IAAI,SAAS,EAAE;YACb,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;YAGvC,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE;gBAEvB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE;oBACjC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,GAAG,EAAE;wBACvC,KAAK,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,GAAG,EAAE;wBACvC,WAAW,EAAE,OAAO;qBACrB,CAAC,CAAC;iBACJ;aACF;YAGD,IAAI,OAAO,IAAI,OAAO,EAAE;gBACtB,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;gBACrD,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,OAAO;oBACd,KAAK,EAAE,OAAO;oBACd,WAAW,EAAE,OAAO;iBACrB,CAAC,CAAC;gBAGH,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,GAAG,OAAO,GAAG;oBACpB,KAAK,EAAE,GAAG,OAAO,MAAM;oBACvB,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;aACJ;SACF;QAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAKO,sBAAsB,CAAC,YAAoB;QACjD,MAAM,YAAY,GAA2B;YAC3C,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,OAAO;YACZ,EAAE,EAAE,MAAM;YACV,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,MAAM;SAEpB,CAAC;QACF,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAKO,oBAAoB,CAAC,YAAoB;QAC/C,MAAM,UAAU,GAA2B;YACzC,GAAG,EAAE,2BAA2B;YAChC,OAAO,EAAE,2BAA2B;YACpC,KAAK,EAAE,yBAAyB;YAChC,GAAG,EAAE,2BAA2B;YAChC,GAAG,EAAE,2BAA2B;YAChC,EAAE,EAAE,+CAA+C;YACnD,OAAO,EAAE,4DAA4D;YACrE,WAAW,EAAE,uBAAuB;SAErC,CAAC;QACF,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAKO,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO;SACR;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,EAAE,CAAC;QAE7B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,GAAG,mCAAmC,CAAC;YACxD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO;SACR;QAGD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAErB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC9C,OAAO,CAAC,SAAS,GAAG,mCAAmC,CAAC;gBACxD,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;aACpC;YAGD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAClC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,SAAS,GAAG,kCAAkC,CAAC;gBAEtD,IAAI,WAAW,KAAK,IAAI,CAAC,aAAa,EAAE;oBACtC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;iBAClC;gBAGD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;gBAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;gBACjC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAE5B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,CAAC,SAAS,GAAG,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAE3B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAG3B,IAAI,IAAI,CAAC,SAAS,EAAE;oBAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAClD,WAAW,CAAC,SAAS,GAAG,gBAAgB,CAAC;oBACzC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;oBACzC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;iBACjC;gBAGD,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC7C,MAAM,CAAC,SAAS,GAAG,kBAAkB,CAAC;oBACtC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;oBACtC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;iBAC5B;gBAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBACrE,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE;oBACzC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;oBACjC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAGH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,QAAQ,CAAC,SAAS,GAAG,oCAAoC,CAAC;QAC1D,QAAQ,CAAC,SAAS,GAAG;;;;;;;;;;;;;GAatB,CAAC;QACA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAKO,UAAU,CAAC,KAAyB;QAC1C,MAAM,MAAM,GAAuC,EAAE,CAAC;QAEtD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACxB;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAGH,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAKO,aAAa,CAAC,IAAY;QAChC,MAAM,MAAM,GAA2B;YACrC,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC9B,CAAC;IAKO,YAAY,CAAC,IAAY;QAC/B,MAAM,MAAM,GAA2B;YACrC,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,KAAK;SACb,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC9B,CAAC;IAKO,gBAAgB;QACtB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;SACR;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACxC,OAAO;SACR;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAE7D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,IAAI,CAAC;QACtE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IACpE,CAAC;IAKO,aAAa,CAAC,KAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO;SACR;QAED,QAAQ,KAAK,CAAC,GAAG,EAAE;YACjB,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE;oBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACrC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE;oBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACrC;gBACD,MAAM;SACT;IACH,CAAC;IAKO,UAAU,CAAC,KAAa;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC/B,OAAO;SACR;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;SAC7B;aAAM;YAEL,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,IAAI,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAEzD,MAAM,QAAQ,GACZ,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;gBAC1C,IAAI,CAAC,KAAK;gBACV,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE7B,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC;YAGnC,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;SACjE;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAKO,IAAI;QACV,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;IACH,CAAC;IAKO,IAAI;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;SACzB;IACH,CAAC;IAKD,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC7C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACrD;IACH,CAAC;CACF","file":"formula-autocomplete.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\ninterface AutocompleteItem {\n type: 'function' | 'cell' | 'range';\n value: string;\n label: string;\n description?: string;\n signature?: string;\n}\n\nexport class FormulaAutocomplete {\n private container: HTMLElement;\n private dropdown: HTMLElement | null = null;\n private items: AutocompleteItem[] = [];\n private selectedIndex: number = -1;\n private isVisible: boolean = false;\n private inputElement: HTMLInputElement | null = null;\n private sheet: VTableSheet;\n private onSelectCallback?: (item: AutocompleteItem) => void;\n\n private customPositioning?: () => void;\n\n constructor(container: HTMLElement, sheet: VTableSheet) {\n this.container = container;\n this.sheet = sheet;\n this.createDropdown();\n }\n\n /**\n * 创建下拉框元素\n */\n private createDropdown(): void {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'vtable-formula-autocomplete';\n this.dropdown.style.display = 'none';\n this.container.appendChild(this.dropdown);\n }\n\n /**\n * 绑定到输入框\n */\n attachTo(input: HTMLInputElement, onSelect?: (item: AutocompleteItem) => void, customPositioning?: () => void): void {\n this.inputElement = input;\n this.onSelectCallback = onSelect;\n this.customPositioning = customPositioning;\n\n // 绑定事件\n input.addEventListener('input', this.handleInput.bind(this));\n input.addEventListener('keydown', this.handleKeydown.bind(this));\n input.addEventListener('blur', () => {\n setTimeout(() => this.hide(), 200);\n });\n }\n\n /**\n * 处理输入事件\n */\n private handleInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n const cursorPos = input.selectionStart || 0;\n\n // 解析当前输入上下文\n const context = this.parseInputContext(value, cursorPos);\n\n if (context.shouldShowAutocomplete) {\n this.updateSuggestions(context);\n this.show();\n } else {\n this.hide();\n }\n }\n\n /**\n * 解析输入上下文\n */\n private parseInputContext(\n value: string,\n cursorPos: number\n ): {\n shouldShowAutocomplete: boolean;\n searchTerm: string;\n type: 'function' | 'cell' | 'all';\n insertPosition: number;\n } {\n // 如果不是公式,不显示\n if (!value.startsWith('=')) {\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n // 获取光标前的文本\n const textBeforeCursor = value.substring(1, cursorPos); // 去掉 '='\n\n // 查找最后一个函数或操作符\n const lastOperatorMatch = textBeforeCursor.match(/[\\+\\-\\*\\/\\(\\,\\s]([A-Za-z0-9]*)$/);\n\n if (lastOperatorMatch && lastOperatorMatch[1] !== '') {\n return {\n shouldShowAutocomplete: true,\n searchTerm: lastOperatorMatch[1],\n type: /^[A-Za-z]/.test(lastOperatorMatch[1]) ? 'function' : 'cell',\n insertPosition: cursorPos - lastOperatorMatch[1].length\n };\n }\n\n // 公式开始位置\n if (textBeforeCursor.match(/^[A-Za-z0-9]*$/)) {\n return {\n shouldShowAutocomplete: true,\n searchTerm: textBeforeCursor,\n type: 'all',\n insertPosition: 1\n };\n }\n\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n /**\n * 更新建议列表\n */\n private updateSuggestions(context: any): void {\n const { searchTerm, type } = context;\n this.items = [];\n\n // 获取函数列表\n if (type === 'function' || type === 'all') {\n const functions = this.sheet.formulaManager.getAvailableFunctions();\n const functionItems = functions\n .filter(fn => fn.toUpperCase().startsWith(searchTerm.toUpperCase()))\n .slice(0, 10) // 限制数量\n .map(fn => ({\n type: 'function' as const,\n value: fn,\n label: fn,\n description: this.getFunctionDescription(fn),\n signature: this.getFunctionSignature(fn)\n }));\n this.items.push(...functionItems);\n }\n\n // 添加单元格引用建议\n if (type === 'cell' || type === 'all') {\n const cellSuggestions = this.generateCellSuggestions(searchTerm);\n this.items.push(...cellSuggestions);\n }\n this.renderDropdown();\n }\n\n /**\n * 生成单元格引用建议\n */\n private generateCellSuggestions(searchTerm: string): AutocompleteItem[] {\n const suggestions: AutocompleteItem[] = [];\n\n // 如果是有效的部分单元格地址\n const cellMatch = searchTerm.match(/^([A-Za-z]*)([0-9]*)$/);\n if (cellMatch) {\n const [, colPart, rowPart] = cellMatch;\n\n // 生成列建议\n if (colPart && !rowPart) {\n // A -> A1, A2, A3...\n for (let row = 1; row <= 5; row++) {\n suggestions.push({\n type: 'cell',\n value: `${colPart.toUpperCase()}${row}`,\n label: `${colPart.toUpperCase()}${row}`,\n description: '单元格引用'\n });\n }\n }\n\n // 生成完整单元格建议\n if (colPart && rowPart) {\n const address = `${colPart.toUpperCase()}${rowPart}`;\n suggestions.push({\n type: 'cell',\n value: address,\n label: address,\n description: '单元格引用'\n });\n\n // 添加范围建议\n suggestions.push({\n type: 'range',\n value: `${address}:`,\n label: `${address}:...`,\n description: '开始选择范围'\n });\n }\n }\n\n return suggestions.slice(0, 5); // 限制建议数量\n }\n\n /**\n * 获取函数描述\n */\n private getFunctionDescription(functionName: string): string {\n const descriptions: Record<string, string> = {\n SUM: '计算数值总和',\n AVERAGE: '计算平均值',\n COUNT: '计数数值单元格',\n MAX: '返回最大值',\n MIN: '返回最小值',\n IF: '条件判断',\n VLOOKUP: '垂直查找',\n CONCATENATE: '连接文本'\n // ... 更多函数描述\n };\n return descriptions[functionName] || '';\n }\n\n /**\n * 获取函数签名\n */\n private getFunctionSignature(functionName: string): string {\n const signatures: Record<string, string> = {\n SUM: '(number1, [number2], ...)',\n AVERAGE: '(number1, [number2], ...)',\n COUNT: '(value1, [value2], ...)',\n MAX: '(number1, [number2], ...)',\n MIN: '(number1, [number2], ...)',\n IF: '(logical_test, value_if_true, value_if_false)',\n VLOOKUP: '(lookup_value, table_array, col_index_num, [range_lookup])',\n CONCATENATE: '(text1, [text2], ...)'\n // ... 更多函数签名\n };\n return signatures[functionName] || '()';\n }\n\n /**\n * 渲染下拉框\n */\n private renderDropdown(): void {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.innerHTML = '';\n\n if (this.items.length === 0) {\n // 无结果提示\n const emptyEl = document.createElement('div');\n emptyEl.className = 'vtable-formula-autocomplete-empty';\n emptyEl.textContent = '没有匹配的函数';\n this.dropdown.appendChild(emptyEl);\n return;\n }\n\n // 按类型分组\n const groups = this.groupItems(this.items);\n\n groups.forEach(group => {\n // 添加分组标题\n if (groups.length > 1) {\n const groupEl = document.createElement('div');\n groupEl.className = 'vtable-formula-autocomplete-group';\n groupEl.textContent = this.getGroupTitle(group.type);\n this.dropdown.appendChild(groupEl);\n }\n\n // 渲染组内项目\n group.items.forEach((item, index) => {\n const globalIndex = this.items.indexOf(item);\n const itemEl = document.createElement('div');\n itemEl.className = 'vtable-formula-autocomplete-item';\n\n if (globalIndex === this.selectedIndex) {\n itemEl.classList.add('selected');\n }\n\n // 函数名和类型标签\n const nameEl = document.createElement('div');\n nameEl.className = 'item-name';\n\n const labelEl = document.createElement('span');\n labelEl.textContent = item.label;\n nameEl.appendChild(labelEl);\n\n const typeEl = document.createElement('span');\n typeEl.className = `item-type ${item.type}`;\n typeEl.textContent = this.getTypeLabel(item.type);\n nameEl.appendChild(typeEl);\n\n itemEl.appendChild(nameEl);\n\n // 函数签名\n if (item.signature) {\n const signatureEl = document.createElement('div');\n signatureEl.className = 'item-signature';\n signatureEl.textContent = item.signature;\n itemEl.appendChild(signatureEl);\n }\n\n // 描述\n if (item.description) {\n const descEl = document.createElement('div');\n descEl.className = 'item-description';\n descEl.textContent = item.description;\n itemEl.appendChild(descEl);\n }\n\n itemEl.addEventListener('click', () => this.selectItem(globalIndex));\n itemEl.addEventListener('mouseenter', () => {\n this.selectedIndex = globalIndex;\n this.renderDropdown();\n });\n\n this.dropdown.appendChild(itemEl);\n });\n });\n\n // 添加快捷键提示\n const footerEl = document.createElement('div');\n footerEl.className = 'vtable-formula-autocomplete-footer';\n footerEl.innerHTML = `\n <div class=\"shortcut\">\n <span class=\"key\">↑↓</span>\n <span>选择</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Enter</span>\n <span>确认</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Esc</span>\n <span>取消</span>\n </div>\n `;\n this.dropdown.appendChild(footerEl);\n\n this.positionDropdown();\n }\n\n /**\n * 对项目进行分组\n */\n private groupItems(items: AutocompleteItem[]): Array<{ type: string; items: AutocompleteItem[] }> {\n const groups: Record<string, AutocompleteItem[]> = {};\n\n items.forEach(item => {\n if (!groups[item.type]) {\n groups[item.type] = [];\n }\n groups[item.type].push(item);\n });\n\n // 按照优先级排序:function > cell > range\n const priority = ['function', 'cell', 'range'];\n return priority.filter(type => groups[type]).map(type => ({ type, items: groups[type] }));\n }\n\n /**\n * 获取分组标题\n */\n private getGroupTitle(type: string): string {\n const titles: Record<string, string> = {\n function: '函数',\n cell: '单元格',\n range: '范围'\n };\n return titles[type] || type;\n }\n\n /**\n * 获取类型标签\n */\n private getTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n function: 'fx',\n cell: 'A1',\n range: 'A:B'\n };\n return labels[type] || type;\n }\n\n /**\n * 定位下拉框\n */\n private positionDropdown(): void {\n if (this.customPositioning) {\n this.customPositioning();\n return;\n }\n if (!this.dropdown || !this.inputElement) {\n return;\n }\n\n const inputRect = this.inputElement.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n\n this.dropdown.style.position = 'absolute';\n this.dropdown.style.left = `${inputRect.left - containerRect.left}px`;\n this.dropdown.style.top = `${inputRect.bottom - containerRect.top + 2}px`;\n this.dropdown.style.width = `${Math.max(300, inputRect.width)}px`;\n }\n\n /**\n * 处理键盘事件\n */\n private handleKeydown(event: KeyboardEvent): void {\n if (!this.isVisible) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.items.length - 1);\n this.renderDropdown();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderDropdown();\n break;\n case 'Enter':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n case 'Escape':\n this.hide();\n break;\n case 'Tab':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n }\n }\n\n /**\n * 选择项目\n */\n private selectItem(index: number): void {\n const item = this.items[index];\n if (!item || !this.inputElement) {\n return;\n }\n\n if (this.onSelectCallback) {\n this.onSelectCallback(item);\n } else {\n // 默认插入行为\n const value = this.inputElement.value;\n const cursorPos = this.inputElement.selectionStart || 0;\n const context = this.parseInputContext(value, cursorPos);\n\n const newValue =\n value.substring(0, context.insertPosition) +\n item.value +\n (item.type === 'function' ? '(' : '') +\n value.substring(cursorPos);\n\n this.inputElement.value = newValue;\n\n // 设置光标位置\n const newCursorPos = context.insertPosition + item.value.length + (item.type === 'function' ? 1 : 0);\n this.inputElement.setSelectionRange(newCursorPos, newCursorPos);\n }\n\n this.hide();\n }\n\n /**\n * 显示下拉框\n */\n private show(): void {\n if (this.dropdown && this.items.length > 0) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n this.selectedIndex = 0;\n this.renderDropdown();\n }\n }\n\n /**\n * 隐藏下拉框\n */\n private hide(): void {\n if (this.dropdown) {\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n }\n }\n\n /**\n * 销毁组件\n */\n release(): void {\n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n }\n }\n}\n"]}
|