@visactor/vtable-sheet 1.20.0-alpha.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.
Files changed (231) hide show
  1. package/cjs/components/vtable-sheet.d.ts +78 -0
  2. package/cjs/components/vtable-sheet.js +474 -0
  3. package/cjs/components/vtable-sheet.js.map +1 -0
  4. package/cjs/core/WorkSheet.d.ts +69 -0
  5. package/cjs/core/WorkSheet.js +298 -0
  6. package/cjs/core/WorkSheet.js.map +1 -0
  7. package/cjs/core/table-plugins.d.ts +3 -0
  8. package/cjs/core/table-plugins.js +171 -0
  9. package/cjs/core/table-plugins.js.map +1 -0
  10. package/cjs/event/event-manager.d.ts +29 -0
  11. package/cjs/event/event-manager.js +71 -0
  12. package/cjs/event/event-manager.js.map +1 -0
  13. package/cjs/event/event-target.d.ts +12 -0
  14. package/cjs/event/event-target.js +50 -0
  15. package/cjs/event/event-target.js.map +1 -0
  16. package/cjs/formula/cell-highlight-manager.d.ts +29 -0
  17. package/cjs/formula/cell-highlight-manager.js +141 -0
  18. package/cjs/formula/cell-highlight-manager.js.map +1 -0
  19. package/cjs/formula/formula-autocomplete.d.ts +39 -0
  20. package/cjs/formula/formula-autocomplete.js +239 -0
  21. package/cjs/formula/formula-autocomplete.js.map +1 -0
  22. package/cjs/formula/formula-editor.d.ts +21 -0
  23. package/cjs/formula/formula-editor.js +162 -0
  24. package/cjs/formula/formula-editor.js.map +1 -0
  25. package/cjs/formula/formula-helper.d.ts +8 -0
  26. package/cjs/formula/formula-helper.js +66 -0
  27. package/cjs/formula/formula-helper.js.map +1 -0
  28. package/cjs/formula/formula-range-selector.d.ts +19 -0
  29. package/cjs/formula/formula-range-selector.js +201 -0
  30. package/cjs/formula/formula-range-selector.js.map +1 -0
  31. package/cjs/formula/formula-throttle.d.ts +10 -0
  32. package/cjs/formula/formula-throttle.js +39 -0
  33. package/cjs/formula/formula-throttle.js.map +1 -0
  34. package/cjs/formula/formula-ui-manager.d.ts +19 -0
  35. package/cjs/formula/formula-ui-manager.js +226 -0
  36. package/cjs/formula/formula-ui-manager.js.map +1 -0
  37. package/cjs/formula/index.d.ts +5 -0
  38. package/cjs/formula/index.js +23 -0
  39. package/cjs/formula/index.js.map +1 -0
  40. package/cjs/index.d.ts +6 -0
  41. package/cjs/index.js +50 -0
  42. package/cjs/index.js.map +1 -0
  43. package/cjs/managers/formula-manager.d.ts +82 -0
  44. package/cjs/managers/formula-manager.js +445 -0
  45. package/cjs/managers/formula-manager.js.map +1 -0
  46. package/cjs/managers/menu-manager.d.ts +12 -0
  47. package/cjs/managers/menu-manager.js +89 -0
  48. package/cjs/managers/menu-manager.js.map +1 -0
  49. package/cjs/managers/sheet-manager.d.ts +21 -0
  50. package/cjs/managers/sheet-manager.js +74 -0
  51. package/cjs/managers/sheet-manager.js.map +1 -0
  52. package/cjs/managers/tab-drag-manager.d.ts +24 -0
  53. package/cjs/managers/tab-drag-manager.js +121 -0
  54. package/cjs/managers/tab-drag-manager.js.map +1 -0
  55. package/cjs/sheet-helper.d.ts +16 -0
  56. package/cjs/sheet-helper.js +64 -0
  57. package/cjs/sheet-helper.js.map +1 -0
  58. package/cjs/styles/common.d.ts +1 -0
  59. package/cjs/styles/common.js +17 -0
  60. package/cjs/styles/common.js.map +1 -0
  61. package/cjs/styles/formula-autocomplete.d.ts +1 -0
  62. package/cjs/styles/formula-autocomplete.js +17 -0
  63. package/cjs/styles/formula-autocomplete.js.map +1 -0
  64. package/cjs/styles/formula-bar.d.ts +1 -0
  65. package/cjs/styles/formula-bar.js +17 -0
  66. package/cjs/styles/formula-bar.js.map +1 -0
  67. package/cjs/styles/menu.d.ts +1 -0
  68. package/cjs/styles/menu.js +17 -0
  69. package/cjs/styles/menu.js.map +1 -0
  70. package/cjs/styles/sheet-tab.d.ts +1 -0
  71. package/cjs/styles/sheet-tab.js +17 -0
  72. package/cjs/styles/sheet-tab.js.map +1 -0
  73. package/cjs/styles/sheet.d.ts +1 -0
  74. package/cjs/styles/sheet.js +17 -0
  75. package/cjs/styles/sheet.js.map +1 -0
  76. package/cjs/styles/style-manager.d.ts +1 -0
  77. package/cjs/styles/style-manager.js +15 -0
  78. package/cjs/styles/style-manager.js.map +1 -0
  79. package/cjs/test/formula-complete.test.d.ts +1 -0
  80. package/cjs/test/formula-complete.test.js +42 -0
  81. package/cjs/test/formula-complete.test.js.map +1 -0
  82. package/cjs/tools/env.d.ts +20 -0
  83. package/cjs/tools/env.js +59 -0
  84. package/cjs/tools/env.js.map +1 -0
  85. package/cjs/tools/index.d.ts +3 -0
  86. package/cjs/tools/index.js +16 -0
  87. package/cjs/tools/index.js.map +1 -0
  88. package/cjs/tools/ui/snackbar.d.ts +1 -0
  89. package/cjs/tools/ui/snackbar.js +20 -0
  90. package/cjs/tools/ui/snackbar.js.map +1 -0
  91. package/cjs/ts-types/base.d.ts +44 -0
  92. package/cjs/ts-types/base.js +14 -0
  93. package/cjs/ts-types/base.js.map +1 -0
  94. package/cjs/ts-types/event.d.ts +79 -0
  95. package/cjs/ts-types/event.js +6 -0
  96. package/cjs/ts-types/event.js.map +1 -0
  97. package/cjs/ts-types/events.d.ts +1 -0
  98. package/cjs/ts-types/events.js +3 -0
  99. package/cjs/ts-types/events.js.map +1 -0
  100. package/cjs/ts-types/filter.d.ts +58 -0
  101. package/cjs/ts-types/filter.js +16 -0
  102. package/cjs/ts-types/filter.js.map +1 -0
  103. package/cjs/ts-types/formula.d.ts +51 -0
  104. package/cjs/ts-types/formula.js +6 -0
  105. package/cjs/ts-types/formula.js.map +1 -0
  106. package/cjs/ts-types/index.d.ts +67 -0
  107. package/cjs/ts-types/index.js +37 -0
  108. package/cjs/ts-types/index.js.map +1 -0
  109. package/cjs/ts-types/sheet.d.ts +45 -0
  110. package/cjs/ts-types/sheet.js +6 -0
  111. package/cjs/ts-types/sheet.js.map +1 -0
  112. package/cjs/vtable.d.ts +1 -0
  113. package/cjs/vtable.js +35 -0
  114. package/cjs/vtable.js.map +1 -0
  115. package/dist/vtable-sheet.js +114494 -0
  116. package/dist/vtable-sheet.min.js +853 -0
  117. package/es/components/vtable-sheet.d.ts +78 -0
  118. package/es/components/vtable-sheet.js +462 -0
  119. package/es/components/vtable-sheet.js.map +1 -0
  120. package/es/core/WorkSheet.d.ts +69 -0
  121. package/es/core/WorkSheet.js +298 -0
  122. package/es/core/WorkSheet.js.map +1 -0
  123. package/es/core/table-plugins.d.ts +3 -0
  124. package/es/core/table-plugins.js +164 -0
  125. package/es/core/table-plugins.js.map +1 -0
  126. package/es/event/event-manager.d.ts +29 -0
  127. package/es/event/event-manager.js +63 -0
  128. package/es/event/event-manager.js.map +1 -0
  129. package/es/event/event-target.d.ts +12 -0
  130. package/es/event/event-target.js +42 -0
  131. package/es/event/event-target.js.map +1 -0
  132. package/es/formula/cell-highlight-manager.d.ts +29 -0
  133. package/es/formula/cell-highlight-manager.js +133 -0
  134. package/es/formula/cell-highlight-manager.js.map +1 -0
  135. package/es/formula/formula-autocomplete.d.ts +39 -0
  136. package/es/formula/formula-autocomplete.js +231 -0
  137. package/es/formula/formula-autocomplete.js.map +1 -0
  138. package/es/formula/formula-editor.d.ts +21 -0
  139. package/es/formula/formula-editor.js +135 -0
  140. package/es/formula/formula-editor.js.map +1 -0
  141. package/es/formula/formula-helper.d.ts +8 -0
  142. package/es/formula/formula-helper.js +60 -0
  143. package/es/formula/formula-helper.js.map +1 -0
  144. package/es/formula/formula-range-selector.d.ts +19 -0
  145. package/es/formula/formula-range-selector.js +195 -0
  146. package/es/formula/formula-range-selector.js.map +1 -0
  147. package/es/formula/formula-throttle.d.ts +10 -0
  148. package/es/formula/formula-throttle.js +31 -0
  149. package/es/formula/formula-throttle.js.map +1 -0
  150. package/es/formula/formula-ui-manager.d.ts +19 -0
  151. package/es/formula/formula-ui-manager.js +218 -0
  152. package/es/formula/formula-ui-manager.js.map +1 -0
  153. package/es/formula/index.d.ts +5 -0
  154. package/es/formula/index.js +10 -0
  155. package/es/formula/index.js.map +1 -0
  156. package/es/index.d.ts +6 -0
  157. package/es/index.js +13 -0
  158. package/es/index.js.map +1 -0
  159. package/es/managers/formula-manager.d.ts +82 -0
  160. package/es/managers/formula-manager.js +441 -0
  161. package/es/managers/formula-manager.js.map +1 -0
  162. package/es/managers/menu-manager.d.ts +12 -0
  163. package/es/managers/menu-manager.js +81 -0
  164. package/es/managers/menu-manager.js.map +1 -0
  165. package/es/managers/sheet-manager.d.ts +21 -0
  166. package/es/managers/sheet-manager.js +66 -0
  167. package/es/managers/sheet-manager.js.map +1 -0
  168. package/es/managers/tab-drag-manager.d.ts +24 -0
  169. package/es/managers/tab-drag-manager.js +113 -0
  170. package/es/managers/tab-drag-manager.js.map +1 -0
  171. package/es/sheet-helper.d.ts +16 -0
  172. package/es/sheet-helper.js +54 -0
  173. package/es/sheet-helper.js.map +1 -0
  174. package/es/styles/common.d.ts +1 -0
  175. package/es/styles/common.js +9 -0
  176. package/es/styles/common.js.map +1 -0
  177. package/es/styles/formula-autocomplete.d.ts +1 -0
  178. package/es/styles/formula-autocomplete.js +9 -0
  179. package/es/styles/formula-autocomplete.js.map +1 -0
  180. package/es/styles/formula-bar.d.ts +1 -0
  181. package/es/styles/formula-bar.js +9 -0
  182. package/es/styles/formula-bar.js.map +1 -0
  183. package/es/styles/menu.d.ts +1 -0
  184. package/es/styles/menu.js +9 -0
  185. package/es/styles/menu.js.map +1 -0
  186. package/es/styles/sheet-tab.d.ts +1 -0
  187. package/es/styles/sheet-tab.js +9 -0
  188. package/es/styles/sheet-tab.js.map +1 -0
  189. package/es/styles/sheet.d.ts +1 -0
  190. package/es/styles/sheet.js +9 -0
  191. package/es/styles/sheet.js.map +1 -0
  192. package/es/styles/style-manager.d.ts +1 -0
  193. package/es/styles/style-manager.js +17 -0
  194. package/es/styles/style-manager.js.map +1 -0
  195. package/es/test/formula-complete.test.d.ts +1 -0
  196. package/es/test/formula-complete.test.js +36 -0
  197. package/es/test/formula-complete.test.js.map +1 -0
  198. package/es/tools/env.d.ts +20 -0
  199. package/es/tools/env.js +53 -0
  200. package/es/tools/env.js.map +1 -0
  201. package/es/tools/index.d.ts +3 -0
  202. package/es/tools/index.js +9 -0
  203. package/es/tools/index.js.map +1 -0
  204. package/es/tools/ui/snackbar.d.ts +1 -0
  205. package/es/tools/ui/snackbar.js +14 -0
  206. package/es/tools/ui/snackbar.js.map +1 -0
  207. package/es/ts-types/base.d.ts +44 -0
  208. package/es/ts-types/base.js +14 -0
  209. package/es/ts-types/base.js.map +1 -0
  210. package/es/ts-types/event.d.ts +79 -0
  211. package/es/ts-types/event.js +2 -0
  212. package/es/ts-types/event.js.map +1 -0
  213. package/es/ts-types/events.d.ts +1 -0
  214. package/es/ts-types/events.js +3 -0
  215. package/es/ts-types/events.js.map +1 -0
  216. package/es/ts-types/filter.d.ts +58 -0
  217. package/es/ts-types/filter.js +16 -0
  218. package/es/ts-types/filter.js.map +1 -0
  219. package/es/ts-types/formula.d.ts +51 -0
  220. package/es/ts-types/formula.js +2 -0
  221. package/es/ts-types/formula.js.map +1 -0
  222. package/es/ts-types/index.d.ts +67 -0
  223. package/es/ts-types/index.js +14 -0
  224. package/es/ts-types/index.js.map +1 -0
  225. package/es/ts-types/sheet.d.ts +45 -0
  226. package/es/ts-types/sheet.js +2 -0
  227. package/es/ts-types/sheet.js.map +1 -0
  228. package/es/vtable.d.ts +1 -0
  229. package/es/vtable.js +2 -0
  230. package/es/vtable.js.map +1 -0
  231. package/package.json +120 -0
@@ -0,0 +1,78 @@
1
+ import { FormulaManager } from '../managers/formula-manager';
2
+ import SheetManager from '../managers/sheet-manager';
3
+ import { WorkSheet } from '../core/WorkSheet';
4
+ import type { IVTableSheetOptions, ISheetDefine } from '../ts-types';
5
+ import { FormulaUIManager } from '../formula/formula-ui-manager';
6
+ export default class VTableSheet {
7
+ private container;
8
+ private options;
9
+ private sheetManager;
10
+ formulaManager: FormulaManager;
11
+ private eventManager;
12
+ private menuManager;
13
+ private activeWorkSheet;
14
+ workSheetInstances: Map<string, WorkSheet>;
15
+ private formulaAutocomplete;
16
+ formulaUIManager: FormulaUIManager;
17
+ private rootElement;
18
+ private formulaBarElement;
19
+ private sheetTabElement;
20
+ private mainMenuElement;
21
+ private contentElement;
22
+ private dragManager;
23
+ constructor(container: HTMLElement, options: IVTableSheetOptions);
24
+ private mergeDefaultOptions;
25
+ private initFormulaAutocomplete;
26
+ private initUI;
27
+ private createSheetTab;
28
+ private toggleSheetMenu;
29
+ private updateFadeEffects;
30
+ private scrollSheetTabs;
31
+ private _activeSheetTab;
32
+ updateSheetTabs(tabsContainer?: HTMLElement): void;
33
+ private createSheetTabItem;
34
+ private handleSheetTabDblClick;
35
+ private renameSheet;
36
+ private getSheetTabElementByKey;
37
+ updateSheetMenu(): void;
38
+ private activeSheetMenuItem;
39
+ private scrollTabIntoView;
40
+ private initSheets;
41
+ activateSheet(sheetKey: string): void;
42
+ addSheet(sheet: ISheetDefine): void;
43
+ removeSheet(sheetKey: string): void;
44
+ getSheetCount(): number;
45
+ getSheet(sheetKey: string): ISheetDefine | null;
46
+ getAllSheets(): ISheetDefine[];
47
+ private createWorkSheetInstance;
48
+ private restoreFilterState;
49
+ private _addNewSheet;
50
+ private updateFormulaBar;
51
+ getFormulaManager(): FormulaManager;
52
+ getSheetManager(): SheetManager;
53
+ getActiveSheet(): WorkSheet | null;
54
+ saveToConfig(): IVTableSheetOptions;
55
+ exportSheetToFile(fileType: 'csv' | 'xlsx'): void;
56
+ importFileToSheet(): void;
57
+ getContainer(): HTMLElement;
58
+ getRootElement(): HTMLElement;
59
+ getOptions(): IVTableSheetOptions;
60
+ getFormulaBarElement(): HTMLElement | null;
61
+ getSheetTabElement(): HTMLElement | null;
62
+ getContentElement(): HTMLElement;
63
+ release(): void;
64
+ exportData(sheetKey: string): any[][];
65
+ exportAllData(): any[][];
66
+ resize(): void;
67
+ excludeEditCellFromSelection(range: {
68
+ startRow: number;
69
+ startCol: number;
70
+ endRow: number;
71
+ endCol: number;
72
+ }, editRow: number, editCol: number): {
73
+ startRow: number;
74
+ startCol: number;
75
+ endRow: number;
76
+ endCol: number;
77
+ };
78
+ }
@@ -0,0 +1,474 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
+ void 0 === k2 && (k2 = k);
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
+ enumerable: !0,
8
+ get: function() {
9
+ return m[k];
10
+ }
11
+ }), Object.defineProperty(o, k2, desc);
12
+ } : function(o, m, k, k2) {
13
+ void 0 === k2 && (k2 = k), o[k2] = m[k];
14
+ }), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
15
+ Object.defineProperty(o, "default", {
16
+ enumerable: !0,
17
+ value: v
18
+ });
19
+ } : function(o, v) {
20
+ o.default = v;
21
+ }), __importStar = this && this.__importStar || function(mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
25
+ return __setModuleDefault(result, mod), result;
26
+ }, __rest = this && this.__rest || function(s, e) {
27
+ var t = {};
28
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
29
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
30
+ var i = 0;
31
+ for (p = Object.getOwnPropertySymbols(s); i < p.length; i++) e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]) && (t[p[i]] = s[p[i]]);
32
+ }
33
+ return t;
34
+ }, __importDefault = this && this.__importDefault || function(mod) {
35
+ return mod && mod.__esModule ? mod : {
36
+ default: mod
37
+ };
38
+ };
39
+
40
+ Object.defineProperty(exports, "__esModule", {
41
+ value: !0
42
+ });
43
+
44
+ const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), event_manager_1 = require("../event/event-manager"), snackbar_1 = require("../tools/ui/snackbar"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), tools_1 = require("../tools"), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager");
45
+
46
+ VTable.register.editor("formula", formula_editor_1.formulaEditor);
47
+
48
+ class VTableSheet {
49
+ constructor(container, options) {
50
+ this.activeWorkSheet = null, this.workSheetInstances = new Map, this.formulaAutocomplete = null,
51
+ this.formulaBarElement = null, this.sheetTabElement = null, this.mainMenuElement = null,
52
+ this.container = container, this.options = this.mergeDefaultOptions(options), this.sheetManager = new sheet_manager_1.default,
53
+ this.formulaManager = new formula_manager_1.FormulaManager(this), this.eventManager = new event_manager_1.EventManager(this),
54
+ this.dragManager = new tab_drag_manager_1.default(this), this.menuManager = new menu_manager_1.MenuManager(this),
55
+ this.formulaUIManager = new formula_ui_manager_1.FormulaUIManager(this), this.initUI(),
56
+ this.initSheets(), this.resize();
57
+ }
58
+ mergeDefaultOptions(options) {
59
+ return Object.assign({
60
+ showFormulaBar: !0,
61
+ showSheetTab: !0,
62
+ defaultRowHeight: 25,
63
+ defaultColWidth: 100
64
+ }, options);
65
+ }
66
+ initFormulaAutocomplete() {
67
+ if (!this.formulaBarElement) return;
68
+ const formulaInput = this.formulaUIManager.formulaInput;
69
+ formulaInput && (this.formulaAutocomplete = new formula_autocomplete_1.FormulaAutocomplete(this.rootElement, this),
70
+ this.formulaAutocomplete.attachTo(formulaInput));
71
+ }
72
+ initUI() {
73
+ var _a;
74
+ this.rootElement = document.createElement("div"), this.rootElement.className = "vtable-sheet-container",
75
+ this.container.appendChild(this.rootElement);
76
+ const topContainer = document.createElement("div");
77
+ topContainer.className = "vtable-sheet-top-container", this.rootElement.appendChild(topContainer),
78
+ (null === (_a = this.options.mainMenu) || void 0 === _a ? void 0 : _a.show) && (this.mainMenuElement = this.menuManager.createMainMenu(),
79
+ topContainer.appendChild(this.mainMenuElement)), this.options.showFormulaBar && (this.formulaBarElement = this.formulaUIManager.createFormulaBar(),
80
+ topContainer.appendChild(this.formulaBarElement), this.initFormulaAutocomplete()),
81
+ this.contentElement = document.createElement("div"), this.contentElement.className = "vtable-sheet-content",
82
+ this.rootElement.appendChild(this.contentElement), this.options.showSheetTab && (this.sheetTabElement = this.createSheetTab(),
83
+ this.rootElement.appendChild(this.sheetTabElement));
84
+ }
85
+ createSheetTab() {
86
+ const sheetTab = document.createElement("div");
87
+ sheetTab.className = "vtable-sheet-tab-bar";
88
+ const fadeLeft = document.createElement("div");
89
+ fadeLeft.className = "vtable-sheet-fade-left", fadeLeft.style.display = "none",
90
+ sheetTab.appendChild(fadeLeft);
91
+ const tabsContainer = document.createElement("div");
92
+ tabsContainer.className = "vtable-sheet-tabs-container", tabsContainer.addEventListener("scroll", (() => this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight))),
93
+ sheetTab.appendChild(tabsContainer);
94
+ const insertIndicator = document.createElement("div");
95
+ insertIndicator.className = "vtable-sheet-insert-indicator", insertIndicator.style.display = "none",
96
+ tabsContainer.appendChild(insertIndicator);
97
+ const fadeRight = document.createElement("div");
98
+ fadeRight.className = "vtable-sheet-fade-right", sheetTab.appendChild(fadeRight);
99
+ const addButton = document.createElement("button");
100
+ addButton.className = "vtable-sheet-add-button", addButton.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"/></svg>',
101
+ addButton.title = "添加工作表", addButton.addEventListener("click", (() => this._addNewSheet())),
102
+ sheetTab.appendChild(addButton);
103
+ const navButtons = document.createElement("div");
104
+ navButtons.className = "vtable-sheet-nav-buttons";
105
+ const leftScrollBtn = document.createElement("button");
106
+ leftScrollBtn.className = "vtable-sheet-scroll-button", leftScrollBtn.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>',
107
+ leftScrollBtn.title = "向左滚动", leftScrollBtn.addEventListener("click", (() => this.scrollSheetTabs("left", tabsContainer))),
108
+ navButtons.appendChild(leftScrollBtn);
109
+ const rightScrollBtn = document.createElement("button");
110
+ rightScrollBtn.className = "vtable-sheet-scroll-button", rightScrollBtn.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>',
111
+ rightScrollBtn.title = "向右滚动", rightScrollBtn.addEventListener("click", (() => this.scrollSheetTabs("right", tabsContainer))),
112
+ navButtons.appendChild(rightScrollBtn);
113
+ const menuButton = document.createElement("button");
114
+ menuButton.className = "vtable-sheet-menu-button", menuButton.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>',
115
+ menuButton.title = "工作表选项", menuButton.addEventListener("click", (e => this.toggleSheetMenu(e))),
116
+ navButtons.appendChild(menuButton);
117
+ const menuContainer = document.createElement("ul");
118
+ return menuContainer.className = "vtable-sheet-menu-list", sheetTab.appendChild(menuContainer),
119
+ sheetTab.appendChild(navButtons), setTimeout((() => {
120
+ this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight);
121
+ }), 100), sheetTab;
122
+ }
123
+ toggleSheetMenu(event) {
124
+ var _a;
125
+ (null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-menu-list")).classList.toggle("active");
126
+ }
127
+ updateFadeEffects(tabsContainer, fadeLeft, fadeRight) {
128
+ tabsContainer.scrollLeft > 10 ? fadeLeft.style.display = "block" : fadeLeft.style.display = "none";
129
+ const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;
130
+ tabsContainer.scrollLeft < maxScroll - 10 ? fadeRight.style.display = "block" : fadeRight.style.display = "none";
131
+ }
132
+ scrollSheetTabs(direction, tabsContainer) {
133
+ const currentScroll = tabsContainer.scrollLeft;
134
+ "left" === direction ? tabsContainer.scrollTo({
135
+ left: Math.max(0, currentScroll - 200),
136
+ behavior: "smooth"
137
+ }) : tabsContainer.scrollTo({
138
+ left: currentScroll + 200,
139
+ behavior: "smooth"
140
+ });
141
+ }
142
+ _activeSheetTab() {
143
+ var _a;
144
+ const tabs = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelectorAll(".vtable-sheet-tab");
145
+ let activeTab = null;
146
+ tabs.forEach((tab => {
147
+ var _a;
148
+ tab.classList.remove("active"), tab.dataset.key === (null === (_a = this.activeWorkSheet) || void 0 === _a ? void 0 : _a.getKey()) && (tab.classList.add("active"),
149
+ activeTab = tab);
150
+ })), setTimeout((() => {
151
+ activeTab && activeTab.scrollIntoView({
152
+ behavior: "smooth",
153
+ block: "nearest"
154
+ });
155
+ }), 100);
156
+ }
157
+ updateSheetTabs(tabsContainer) {
158
+ var _a;
159
+ if (void 0 === tabsContainer && (tabsContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container")),
160
+ !tabsContainer) return;
161
+ tabsContainer.querySelectorAll(".vtable-sheet-tab").forEach((tab => {
162
+ tab.remove();
163
+ }));
164
+ this.sheetManager.getAllSheets().forEach(((sheet, index) => {
165
+ tabsContainer.appendChild(this.createSheetTabItem(sheet, index));
166
+ })), this._activeSheetTab();
167
+ }
168
+ createSheetTabItem(sheet, index) {
169
+ const tab = document.createElement("div");
170
+ return tab.className = "vtable-sheet-tab", tab.dataset.key = sheet.sheetKey, tab.textContent = sheet.sheetTitle,
171
+ tab.title = sheet.sheetTitle, tab.addEventListener("click", (() => this.activateSheet(sheet.sheetKey))),
172
+ tab.addEventListener("dblclick", (() => this.handleSheetTabDblClick(sheet.sheetKey, sheet.sheetTitle))),
173
+ tab.addEventListener("mousedown", (e => this.dragManager.handleTabMouseDown(e, sheet.sheetKey))),
174
+ tab;
175
+ }
176
+ handleSheetTabDblClick(sheetKey, originalTitle) {
177
+ const targetTab = this.getSheetTabElementByKey(sheetKey);
178
+ if (!targetTab) return;
179
+ targetTab.setAttribute("contenteditable", "true"), targetTab.setAttribute("spellcheck", "false"),
180
+ targetTab.classList.add("editing");
181
+ const range = document.createRange();
182
+ range.selectNodeContents(targetTab);
183
+ const selection = window.getSelection();
184
+ selection.removeAllRanges(), selection.addRange(range);
185
+ const onBlur = () => {
186
+ finishInput(!0);
187
+ }, onKeyDown = e => {
188
+ e.stopPropagation(), "Enter" === e.key ? (e.preventDefault(), finishInput(!0)) : "Escape" === e.key && finishInput(!1);
189
+ }, finishInput = commit => {
190
+ var _a;
191
+ targetTab.removeEventListener("blur", onBlur), targetTab.removeEventListener("keydown", onKeyDown),
192
+ targetTab.classList.remove("editing"), targetTab.setAttribute("contenteditable", "false");
193
+ const newTitle = null === (_a = targetTab.textContent) || void 0 === _a ? void 0 : _a.trim();
194
+ commit && newTitle !== originalTitle && this.renameSheet(sheetKey, newTitle) || (targetTab.textContent = originalTitle);
195
+ };
196
+ targetTab.addEventListener("blur", onBlur), targetTab.addEventListener("keydown", onKeyDown);
197
+ }
198
+ renameSheet(sheetKey, newTitle) {
199
+ var _a;
200
+ if (!this.sheetManager.getSheet(sheetKey)) return !1;
201
+ const error = (0, tools_1.checkTabTitle)(newTitle);
202
+ if (error) return (0, snackbar_1.showSnackbar)(error, 1300), !1;
203
+ return this.sheetManager.getAllSheets().find((s => s.sheetKey !== sheetKey && s.sheetTitle === newTitle)) ? ((0,
204
+ snackbar_1.showSnackbar)("工作表名称已存在,请重新输入", 1300), !1) : (this.sheetManager.renameSheet(sheetKey, newTitle),
205
+ null === (_a = this.workSheetInstances.get(sheetKey)) || void 0 === _a || _a.setTitle(newTitle),
206
+ this.updateSheetTabs(), this.updateSheetMenu(), !0);
207
+ }
208
+ getSheetTabElementByKey(sheetKey) {
209
+ var _a;
210
+ const tabsContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container");
211
+ return null == tabsContainer ? void 0 : tabsContainer.querySelector(`.vtable-sheet-tab[data-key="${sheetKey}"]`);
212
+ }
213
+ updateSheetMenu() {
214
+ var _a;
215
+ const menuContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-menu-list");
216
+ menuContainer.innerHTML = "";
217
+ this.sheetManager.getAllSheets().forEach((sheet => {
218
+ const li = document.createElement("li");
219
+ li.className = "vtable-sheet-menu-item", li.dataset.key = sheet.sheetKey;
220
+ const title = document.createElement("span");
221
+ title.className = "vtable-sheet-menu-item-title", title.innerText = sheet.sheetTitle,
222
+ li.appendChild(title);
223
+ const div = document.createElement("div");
224
+ div.className = "vtable-sheet-menu-delete-button", div.innerHTML = '<svg class="x-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>',
225
+ div.addEventListener("click", (e => {
226
+ e.stopPropagation(), this.removeSheet(sheet.sheetKey);
227
+ })), li.addEventListener("click", (() => this.activateSheet(sheet.sheetKey))), li.appendChild(div),
228
+ menuContainer.appendChild(li);
229
+ })), this.activeSheetMenuItem(), setTimeout((() => {
230
+ const activeItem = menuContainer.querySelector(".vtable-sheet-main-menu-item.active");
231
+ activeItem && activeItem.scrollIntoView({
232
+ behavior: "smooth",
233
+ block: "nearest"
234
+ });
235
+ }), 100);
236
+ }
237
+ activeSheetMenuItem() {
238
+ var _a;
239
+ const menuItems = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelectorAll(".vtable-sheet-main-menu-item");
240
+ let activeItem = null;
241
+ menuItems.forEach((item => {
242
+ var _a;
243
+ item.classList.remove("active"), item.dataset.key === (null === (_a = this.activeWorkSheet) || void 0 === _a ? void 0 : _a.getKey()) && (item.classList.add("active"),
244
+ activeItem = item);
245
+ })), setTimeout((() => {
246
+ activeItem && activeItem.scrollIntoView({
247
+ behavior: "smooth",
248
+ block: "nearest"
249
+ });
250
+ }), 100);
251
+ }
252
+ scrollTabIntoView(tab, container) {
253
+ const tabRect = tab.getBoundingClientRect(), containerRect = container.getBoundingClientRect();
254
+ tabRect.left < containerRect.left ? container.scrollLeft += tabRect.left - containerRect.left - 10 : tabRect.right > containerRect.right && (container.scrollLeft += tabRect.right - containerRect.right + 10);
255
+ }
256
+ initSheets() {
257
+ if (this.options.sheets && this.options.sheets.length > 0) {
258
+ this.options.sheets.forEach((sheetDefine => {
259
+ this.sheetManager.addSheet(sheetDefine);
260
+ }));
261
+ let activeSheetKey = "";
262
+ const activeSheet = this.options.sheets.find((sheet => sheet.active));
263
+ activeSheetKey = activeSheet ? activeSheet.sheetKey : this.options.sheets[0].sheetKey,
264
+ this.activateSheet(activeSheetKey);
265
+ } else this._addNewSheet();
266
+ }
267
+ activateSheet(sheetKey) {
268
+ this.sheetManager.setActiveSheet(sheetKey);
269
+ const sheetDefine = this.sheetManager.getSheet(sheetKey);
270
+ if (sheetDefine) {
271
+ if (this.workSheetInstances.forEach((instance => {
272
+ instance.getElement().style.display = "none";
273
+ })), this.workSheetInstances.has(sheetKey)) {
274
+ const instance = this.workSheetInstances.get(sheetKey);
275
+ instance.getElement().style.display = "block", this.activeWorkSheet = instance,
276
+ this._activeSheetTab(), this.activeSheetMenuItem(), this.restoreFilterState(instance, sheetDefine);
277
+ } else {
278
+ const instance = this.createWorkSheetInstance(sheetDefine);
279
+ this.workSheetInstances.set(sheetKey, instance), this.activeWorkSheet = instance,
280
+ this.updateSheetTabs(), this.updateSheetMenu(), this.restoreFilterState(instance, sheetDefine);
281
+ }
282
+ this.updateFormulaBar();
283
+ }
284
+ }
285
+ addSheet(sheet) {
286
+ this.sheetManager.addSheet(sheet), this.updateSheetTabs(), this.updateSheetMenu();
287
+ }
288
+ removeSheet(sheetKey) {
289
+ if (this.sheetManager.getSheetCount() <= 1) return void (0, snackbar_1.showSnackbar)("至少保留一个工作表", 1300);
290
+ const instance = this.workSheetInstances.get(sheetKey);
291
+ instance && (instance.getElement().remove(), this.workSheetInstances.delete(sheetKey));
292
+ const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);
293
+ newActiveSheetKey && this.activateSheet(newActiveSheetKey), this.updateSheetTabs(),
294
+ this.updateSheetMenu();
295
+ }
296
+ getSheetCount() {
297
+ return this.sheetManager.getSheetCount();
298
+ }
299
+ getSheet(sheetKey) {
300
+ return this.sheetManager.getSheet(sheetKey);
301
+ }
302
+ getAllSheets() {
303
+ return this.sheetManager.getAllSheets();
304
+ }
305
+ createWorkSheetInstance(sheetDefine) {
306
+ var _a, _b;
307
+ formula_editor_1.formulaEditor.setSheet(this);
308
+ const contentWidth = this.contentElement.clientWidth, contentHeight = this.contentElement.clientHeight, sheet = new WorkSheet_1.WorkSheet(this, Object.assign(Object.assign({}, sheetDefine), {
309
+ container: this.contentElement,
310
+ width: contentWidth,
311
+ height: contentHeight,
312
+ defaultRowHeight: this.options.defaultRowHeight,
313
+ defaultColWidth: this.options.defaultColWidth,
314
+ plugins: (0, table_plugins_1.getTablePlugins)(sheetDefine, this.options),
315
+ headerEditor: "formula",
316
+ editor: "formula",
317
+ select: {
318
+ makeSelectCellVisible: !1
319
+ },
320
+ style: {
321
+ borderColor: [ "#E1E4E8", "#E1E4E8", "#E1E4E8", "#E1E4E8" ],
322
+ borderLineWidth: [ 1, 1, 1, 1 ],
323
+ borderLineDash: [ null, null, null, null ],
324
+ padding: [ 8, 8, 8, 8 ]
325
+ },
326
+ editCellTrigger: [ "api", "keydown", "doubleclick" ],
327
+ customMergeCell: sheetDefine.cellMerge,
328
+ theme: (null === (_a = sheetDefine.theme) || void 0 === _a ? void 0 : _a.tableTheme) || (null === (_b = this.options.theme) || void 0 === _b ? void 0 : _b.tableTheme)
329
+ }));
330
+ sheet.on("cell-selected", this.eventManager.handleCellSelectedBind), sheet.on("cell-value-changed", this.eventManager.handleCellValueChangedBind),
331
+ sheet.on("selection-changed", this.eventManager.handleSelectionChangedForRangeModeBind),
332
+ sheet.on("selection-end", this.eventManager.handleSelectionChangedForRangeModeBind);
333
+ try {
334
+ const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);
335
+ this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData);
336
+ } catch (error) {}
337
+ return sheet;
338
+ }
339
+ restoreFilterState(sheet, sheetDefine) {
340
+ sheetDefine.filterState && setTimeout((() => {
341
+ if (sheet.tableInstance && sheet.tableInstance.pluginManager) {
342
+ const filterPlugin = sheet.tableInstance.pluginManager.getPluginByName("Filter");
343
+ filterPlugin && filterPlugin.setFilterState(sheetDefine.filterState);
344
+ }
345
+ }), 0);
346
+ }
347
+ _addNewSheet() {
348
+ const sheetCount = this.sheetManager.getSheetCount();
349
+ let key = `sheet${sheetCount + 1}`, title = `Sheet ${sheetCount + 1}`, index = sheetCount + 1;
350
+ const existingKeys = new Set(this.sheetManager.getAllSheets().map((s => s.sheetKey))), existingTitles = new Set(this.sheetManager.getAllSheets().map((s => s.sheetTitle)));
351
+ for (;existingKeys.has(key) || existingTitles.has(title); ) index += 1, key = `sheet${index}`,
352
+ title = `Sheet ${index}`;
353
+ const newSheet = {
354
+ sheetKey: key,
355
+ sheetTitle: title,
356
+ columnCount: 20,
357
+ rowCount: 100,
358
+ data: []
359
+ };
360
+ this.sheetManager.addSheet(newSheet), this.activateSheet(key);
361
+ }
362
+ updateFormulaBar() {
363
+ this.formulaUIManager.updateFormulaBar();
364
+ }
365
+ getFormulaManager() {
366
+ return this.formulaManager;
367
+ }
368
+ getSheetManager() {
369
+ return this.sheetManager;
370
+ }
371
+ getActiveSheet() {
372
+ return this.activeWorkSheet;
373
+ }
374
+ saveToConfig() {
375
+ const sheets = [];
376
+ return this.sheetManager.getAllSheets().forEach((sheetDefine => {
377
+ const instance = this.workSheetInstances.get(sheetDefine.sheetKey);
378
+ if (instance) {
379
+ const data = instance.getData(), columns = instance.getColumns().map((column => {
380
+ const rest = __rest(column, []);
381
+ return delete rest.field, rest;
382
+ })), lastTitleIndex = columns.reduce(((lastIndex, column, index) => column.title ? index : lastIndex), -1);
383
+ -1 === lastTitleIndex ? columns.length = 0 : columns.splice(lastTitleIndex + 1);
384
+ const lastDataIndex = data.reduce(((lastIndex, rowData, index) => rowData ? index : lastIndex), -1);
385
+ -1 === lastDataIndex ? data.length = 0 : data.splice(lastDataIndex + 1);
386
+ let filterState = null;
387
+ const filterPlugin = instance.tableInstance.pluginManager.getPluginByName("Filter");
388
+ filterPlugin && (filterState = filterPlugin.getFilterState());
389
+ let sortState = instance.tableInstance.internalProps.sortState;
390
+ sortState = Array.isArray(sortState) ? sortState : [ sortState ];
391
+ const currentSortState = sortState.map((item => Object.assign({
392
+ field: item.field,
393
+ order: item.order
394
+ }, null != item.orderFn && {
395
+ orderFn: item.orderFn
396
+ })));
397
+ sheets.push(Object.assign(Object.assign({}, sheetDefine), {
398
+ data: data,
399
+ columns: columns,
400
+ cellMerge: instance.tableInstance.options.customMergeCell,
401
+ showHeader: instance.tableInstance.options.showHeader,
402
+ frozenRowCount: instance.tableInstance.frozenRowCount,
403
+ frozenColCount: instance.tableInstance.frozenColCount,
404
+ active: sheetDefine.sheetKey === this.sheetManager.getActiveSheet().sheetKey,
405
+ filterState: filterState,
406
+ sortState: currentSortState
407
+ }));
408
+ } else sheets.push(sheetDefine);
409
+ })), Object.assign(Object.assign({}, this.options), {
410
+ sheets: sheets
411
+ });
412
+ }
413
+ exportSheetToFile(fileType) {
414
+ var _a, _b;
415
+ const sheet = this.getActiveSheet();
416
+ sheet && ("csv" === fileType ? (null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.exportToCsv) && sheet.tableInstance.exportToCsv() : (null === (_b = sheet.tableInstance) || void 0 === _b ? void 0 : _b.exportToExcel) && sheet.tableInstance.exportToExcel());
417
+ }
418
+ importFileToSheet() {
419
+ var _a;
420
+ const sheet = this.getActiveSheet();
421
+ sheet && (null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.importFile) && sheet.tableInstance.importFile();
422
+ }
423
+ getContainer() {
424
+ return this.container;
425
+ }
426
+ getRootElement() {
427
+ return this.rootElement;
428
+ }
429
+ getOptions() {
430
+ return this.options;
431
+ }
432
+ getFormulaBarElement() {
433
+ return this.formulaBarElement;
434
+ }
435
+ getSheetTabElement() {
436
+ return this.sheetTabElement;
437
+ }
438
+ getContentElement() {
439
+ return this.contentElement;
440
+ }
441
+ release() {
442
+ this.eventManager.release(), this.formulaManager.release(), this.formulaUIManager.release(),
443
+ this.workSheetInstances.forEach((instance => {
444
+ instance.release();
445
+ })), this.rootElement && this.rootElement.parentNode && this.rootElement.parentNode.removeChild(this.rootElement),
446
+ this.formulaAutocomplete && this.formulaAutocomplete.release(), this.formulaManager.cellHighlightManager && this.formulaManager.cellHighlightManager.release();
447
+ }
448
+ exportData(sheetKey) {
449
+ const sheet = this.workSheetInstances.get(sheetKey);
450
+ return sheet ? sheet.getData() : [];
451
+ }
452
+ exportAllData() {
453
+ return Array.from(this.workSheetInstances.values()).map((sheet => sheet.getData()));
454
+ }
455
+ resize() {
456
+ var _a;
457
+ null === (_a = this.getActiveSheet()) || void 0 === _a || _a.resize();
458
+ }
459
+ excludeEditCellFromSelection(range, editRow, editCol) {
460
+ const r = Object.assign({}, range), withinRow = r.startRow <= editRow && editRow <= r.endRow, withinCol = r.startCol <= editCol && editCol <= r.endCol;
461
+ if (!withinRow || !withinCol) return r;
462
+ const rowSpan = r.endRow - r.startRow, colSpan = r.endCol - r.startCol;
463
+ return 0 === rowSpan && 0 === colSpan && r.startRow === editRow && r.startCol === editCol ? {
464
+ startRow: -1,
465
+ startCol: -1,
466
+ endRow: -1,
467
+ endCol: -1
468
+ } : (rowSpan >= colSpan ? editRow === r.startRow && r.startRow < r.endRow ? r.startRow += 1 : editRow === r.endRow && r.startRow < r.endRow ? r.endRow -= 1 : r.startRow < r.endRow && (r.startRow += 1) : editCol === r.startCol && r.startCol < r.endCol ? r.startCol += 1 : editCol === r.endCol && r.startCol < r.endCol ? r.endCol -= 1 : r.startCol < r.endCol && (r.startCol += 1),
469
+ r);
470
+ }
471
+ }
472
+
473
+ exports.default = VTableSheet;
474
+ //# sourceMappingURL=vtable-sheet.js.map