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