@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,445 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.FormulaManager = void 0;
6
+
7
+ const hyperformula_1 = require("hyperformula"), formula_range_selector_1 = require("../formula/formula-range-selector"), formula_1 = require("../formula"), DEFAULT_HYPERFORMULA_CONFIG = {
8
+ licenseKey: "gpl-v3",
9
+ useColumnIndex: !0,
10
+ useArrayArithmetic: !1,
11
+ useStats: !0,
12
+ precisionRounding: 14,
13
+ nullYear: 30,
14
+ leapYear1900: !1,
15
+ smartRounding: !0,
16
+ functionPlugins: [],
17
+ ignoreWhiteSpace: "standard",
18
+ caseSensitive: !1,
19
+ parseDateTime: () => {},
20
+ nullDate: {
21
+ year: 1899,
22
+ month: 12,
23
+ day: 30
24
+ },
25
+ dateFormats: [ "DD/MM/YYYY", "DD/MM/YY", "YYYY-MM-DD" ],
26
+ timeFormats: [ "hh:mm", "hh:mm:ss.s" ]
27
+ };
28
+
29
+ class FormulaManager {
30
+ get formulaWorkingOnCell() {
31
+ return this._formulaWorkingOnCell;
32
+ }
33
+ set formulaWorkingOnCell(value) {
34
+ this._formulaWorkingOnCell = value;
35
+ }
36
+ constructor(sheet) {
37
+ this.sheetMapping = new Map, this.reverseSheetMapping = new Map, this.isInitialized = !1,
38
+ this.nextSheetId = 0, this._formulaWorkingOnCell = null, this.lastKnownCursorPosInFormulaInput = null,
39
+ this.lastSelectionRangesOfHandling = [], this.inputIsParamMode = null, this.inputingElement = null,
40
+ this.sheet = sheet, this.cellHighlightManager = new formula_1.CellHighlightManager(sheet),
41
+ this.formulaRangeSelector = new formula_range_selector_1.FormulaRangeSelector(this),
42
+ this.initializeHyperFormula();
43
+ }
44
+ initializeHyperFormula() {
45
+ try {
46
+ this.hyperFormula = hyperformula_1.HyperFormula.buildEmpty(DEFAULT_HYPERFORMULA_CONFIG),
47
+ this.isInitialized = !0;
48
+ } catch (error) {
49
+ throw new Error("FormulaManager initialization failed");
50
+ }
51
+ }
52
+ addSheet(sheetKey, normalizedData) {
53
+ if (this.ensureInitialized(), this.sheetMapping.has(sheetKey)) return this.sheetMapping.get(sheetKey);
54
+ try {
55
+ let sheetId;
56
+ if (0 === this.sheetMapping.size) {
57
+ this.hyperFormula = hyperformula_1.HyperFormula.buildFromArray([ [ "" ] ], DEFAULT_HYPERFORMULA_CONFIG),
58
+ sheetId = 0;
59
+ if (this.hyperFormula.getSheetName(0) !== sheetKey) try {
60
+ this.hyperFormula.renameSheet(0, sheetKey);
61
+ } catch (e) {}
62
+ } else try {
63
+ const existingSheetId = this.hyperFormula.getSheetId(sheetKey);
64
+ if (void 0 !== existingSheetId) sheetId = existingSheetId; else {
65
+ const sheetName = this.hyperFormula.addSheet(sheetKey);
66
+ sheetId = this.hyperFormula.getSheetId(sheetName);
67
+ }
68
+ } catch (error) {
69
+ const sheetName = this.hyperFormula.addSheet(sheetKey);
70
+ sheetId = this.hyperFormula.getSheetId(sheetName);
71
+ }
72
+ return Array.isArray(normalizedData) && normalizedData.length > 0 && this.hyperFormula.setSheetContent(sheetId, normalizedData),
73
+ this.sheetMapping.set(sheetKey, sheetId), this.reverseSheetMapping.set(sheetId, sheetKey),
74
+ this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1), sheetId;
75
+ } catch (error) {
76
+ throw new Error(`Failed to add sheet: ${sheetKey}`);
77
+ }
78
+ }
79
+ normalizeSheetData(data, tableInstance) {
80
+ try {
81
+ const headerRows = [];
82
+ for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {
83
+ const headerRow = [];
84
+ for (let j = 0; j < tableInstance.colCount; j++) {
85
+ const cellValue = tableInstance.getCellValue(j, i);
86
+ headerRow.push(cellValue);
87
+ }
88
+ headerRows.push(headerRow);
89
+ }
90
+ const dataCopy = JSON.parse(JSON.stringify(data)), toNormalizeData = tableInstance.columnHeaderLevelCount > 0 ? [ ...headerRows ].concat(dataCopy) : dataCopy;
91
+ if (!Array.isArray(toNormalizeData) || 0 === toNormalizeData.length) return [ [ "" ] ];
92
+ const validData = toNormalizeData.filter((row => Array.isArray(row)));
93
+ if (0 === validData.length) return [ [ "" ] ];
94
+ const maxCols = Math.max(...validData.map((row => row.length)));
95
+ return validData.map((row => {
96
+ const normalizedRow = Array.isArray(row) ? row.map((cell => {
97
+ if ("string" == typeof cell) {
98
+ if (cell.startsWith("=")) return cell;
99
+ const num = Number(cell);
100
+ return isNaN(num) ? cell : num;
101
+ }
102
+ return null != cell ? cell : "";
103
+ })) : [ "" ];
104
+ for (;normalizedRow.length < maxCols; ) normalizedRow.push("");
105
+ return normalizedRow;
106
+ }));
107
+ } catch (error) {
108
+ return [ [ "" ] ];
109
+ }
110
+ }
111
+ removeSheet(sheetKey) {
112
+ const sheetId = this.sheetMapping.get(sheetKey);
113
+ if (void 0 !== sheetId) try {
114
+ if (this.sheetMapping.size <= 1) throw new Error("Cannot remove the last sheet");
115
+ this.hyperFormula.removeSheet(sheetId), this.sheetMapping.delete(sheetKey), this.reverseSheetMapping.delete(sheetId);
116
+ } catch (error) {
117
+ throw new Error(`Failed to remove sheet: ${sheetKey}`);
118
+ }
119
+ }
120
+ renameSheet(oldKey, newKey) {
121
+ const sheetId = this.sheetMapping.get(oldKey);
122
+ if (void 0 === sheetId) throw new Error(`Sheet not found: ${oldKey}`);
123
+ try {
124
+ this.hyperFormula.renameSheet(sheetId, newKey), this.sheetMapping.delete(oldKey),
125
+ this.sheetMapping.set(newKey, sheetId), this.reverseSheetMapping.set(sheetId, newKey);
126
+ } catch (error) {
127
+ throw new Error(`Failed to rename sheet: ${oldKey}`);
128
+ }
129
+ }
130
+ getSheetId(sheetKey) {
131
+ const sheetId = this.sheetMapping.get(sheetKey);
132
+ return void 0 === sheetId ? this.addSheet(sheetKey) : sheetId;
133
+ }
134
+ getHasHeader(sheetKey) {
135
+ var _a, _b, _c;
136
+ const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);
137
+ return null !== (_c = null !== (_a = null == sheetDefine ? void 0 : sheetDefine.showHeader) && void 0 !== _a ? _a : (null === (_b = null == sheetDefine ? void 0 : sheetDefine.columns) || void 0 === _b ? void 0 : _b.length) > 0) && void 0 !== _c && _c;
138
+ }
139
+ setCellContent(cell, value) {
140
+ if (this.ensureInitialized(), !cell || void 0 === cell.sheet || void 0 === cell.row || void 0 === cell.col) throw new Error("Invalid cell parameter for setCellContent");
141
+ if (cell.row < 0 || cell.col < 0) throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);
142
+ try {
143
+ const address = {
144
+ sheet: this.getSheetId(cell.sheet),
145
+ row: cell.row,
146
+ col: cell.col
147
+ };
148
+ let processedValue = value;
149
+ if (null == processedValue && (processedValue = ""), "string" == typeof processedValue && !processedValue.startsWith("=")) {
150
+ const numericValue = Number(processedValue);
151
+ isNaN(numericValue) || "" === processedValue.trim() || (processedValue = numericValue);
152
+ }
153
+ this.hyperFormula.setCellContents(address, [ [ processedValue ] ]);
154
+ } catch (error) {
155
+ throw error instanceof Error ? new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`) : new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);
156
+ }
157
+ }
158
+ getCellValue(cell) {
159
+ this.ensureInitialized();
160
+ try {
161
+ const address = {
162
+ sheet: this.getSheetId(cell.sheet),
163
+ row: cell.row,
164
+ col: cell.col
165
+ }, value = this.hyperFormula.getCellValue(address);
166
+ return {
167
+ value: value,
168
+ error: value instanceof hyperformula_1.CellError ? value : void 0
169
+ };
170
+ } catch (error) {
171
+ return {
172
+ value: null,
173
+ error: error instanceof Error ? error.message : "Unknown error"
174
+ };
175
+ }
176
+ }
177
+ getCellFormula(cell) {
178
+ this.ensureInitialized();
179
+ try {
180
+ const address = {
181
+ sheet: this.getSheetId(cell.sheet),
182
+ row: cell.row,
183
+ col: cell.col
184
+ };
185
+ return this.hyperFormula.getCellFormula(address);
186
+ } catch (error) {
187
+ return;
188
+ }
189
+ }
190
+ isCellFormula(cell) {
191
+ this.ensureInitialized();
192
+ try {
193
+ const address = {
194
+ sheet: this.getSheetId(cell.sheet),
195
+ row: cell.row,
196
+ col: cell.col
197
+ };
198
+ return this.hyperFormula.doesCellHaveFormula(address);
199
+ } catch (error) {
200
+ return !1;
201
+ }
202
+ }
203
+ getCellDependents(cell) {
204
+ this.ensureInitialized();
205
+ try {
206
+ const address = {
207
+ sheet: this.getSheetId(cell.sheet),
208
+ row: cell.row,
209
+ col: cell.col
210
+ };
211
+ return this.hyperFormula.getCellDependents(address).filter((dep => "sheet" in dep && "row" in dep && "col" in dep)).map((dep => ({
212
+ sheet: this.reverseSheetMapping.get(dep.sheet) || "",
213
+ row: dep.row,
214
+ col: dep.col
215
+ })));
216
+ } catch (error) {
217
+ return [];
218
+ }
219
+ }
220
+ getCellPrecedents(cell) {
221
+ this.ensureInitialized();
222
+ try {
223
+ const address = {
224
+ sheet: this.getSheetId(cell.sheet),
225
+ row: cell.row,
226
+ col: cell.col
227
+ };
228
+ return this.hyperFormula.getCellPrecedents(address).filter((prec => "sheet" in prec && "row" in prec && "col" in prec)).map((prec => ({
229
+ sheet: this.reverseSheetMapping.get(prec.sheet) || "",
230
+ row: prec.row,
231
+ col: prec.col
232
+ })));
233
+ } catch (error) {
234
+ return [];
235
+ }
236
+ }
237
+ batchUpdate(changes) {
238
+ this.ensureInitialized();
239
+ try {
240
+ this.hyperFormula.batch((() => {
241
+ changes.forEach((({cell: cell, value: value}) => {
242
+ const address = {
243
+ sheet: this.getSheetId(cell.sheet),
244
+ row: cell.row,
245
+ col: cell.col
246
+ };
247
+ this.hyperFormula.setCellContents(address, [ [ value ] ]);
248
+ }));
249
+ }));
250
+ } catch (error) {
251
+ throw new Error("Batch update failed");
252
+ }
253
+ }
254
+ addRows(sheetKey, rowIndex, numberOfRows = 1) {
255
+ this.ensureInitialized();
256
+ try {
257
+ const sheetId = this.getSheetId(sheetKey);
258
+ this.hyperFormula.addRows(sheetId, [ rowIndex, numberOfRows ]);
259
+ } catch (error) {
260
+ throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);
261
+ }
262
+ }
263
+ removeRows(sheetKey, rowIndex, numberOfRows = 1) {
264
+ this.ensureInitialized();
265
+ try {
266
+ const sheetId = this.getSheetId(sheetKey);
267
+ this.hyperFormula.removeRows(sheetId, [ rowIndex, numberOfRows ]);
268
+ } catch (error) {
269
+ throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);
270
+ }
271
+ }
272
+ addColumns(sheetKey, columnIndex, numberOfColumns = 1) {
273
+ this.ensureInitialized();
274
+ try {
275
+ const sheetId = this.getSheetId(sheetKey);
276
+ this.hyperFormula.addColumns(sheetId, [ columnIndex, numberOfColumns ]);
277
+ } catch (error) {
278
+ throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);
279
+ }
280
+ }
281
+ removeColumns(sheetKey, columnIndex, numberOfColumns = 1) {
282
+ this.ensureInitialized();
283
+ try {
284
+ const sheetId = this.getSheetId(sheetKey);
285
+ this.hyperFormula.removeColumns(sheetId, [ columnIndex, numberOfColumns ]);
286
+ } catch (error) {
287
+ throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);
288
+ }
289
+ }
290
+ getSheetSerialized(sheetKey) {
291
+ this.ensureInitialized();
292
+ try {
293
+ const sheetId = this.getSheetId(sheetKey);
294
+ return this.hyperFormula.getSheetSerialized(sheetId);
295
+ } catch (error) {
296
+ return [ [] ];
297
+ }
298
+ }
299
+ setSheetContent(sheetKey, normalizedData) {
300
+ this.ensureInitialized();
301
+ try {
302
+ const sheetId = this.getSheetId(sheetKey);
303
+ this.hyperFormula.setSheetContent(sheetId, normalizedData);
304
+ } catch (error) {
305
+ throw new Error(`Failed to set content for sheet: ${sheetKey}`);
306
+ }
307
+ }
308
+ hasCircularReference() {
309
+ try {
310
+ const stats = this.hyperFormula.getStats();
311
+ return stats && stats.dependencyGraph && stats.dependencyGraph.hasCircularReferences();
312
+ } catch (error) {
313
+ return !1;
314
+ }
315
+ }
316
+ getAvailableFunctions() {
317
+ return [ "ABS", "ACOS", "AND", "ASIN", "ATAN", "AVERAGE", "CEILING", "CONCATENATE", "COS", "COUNT", "COUNTA", "COUNTIF", "COUNTIFS", "DATE", "DAY", "FLOOR", "IF", "IFERROR", "INDEX", "LEFT", "LEN", "LOWER", "MATCH", "MAX", "MID", "MIN", "MONTH", "NOT", "NOW", "OR", "RIGHT", "ROUND", "ROUNDDOWN", "ROUNDUP", "SIN", "SUM", "SUMIF", "SUMIFS", "TAN", "TODAY", "UPPER", "VLOOKUP", "YEAR" ];
318
+ }
319
+ validateFormula(formula) {
320
+ try {
321
+ return this.hyperFormula.validateFormula(formula), {
322
+ isValid: !0
323
+ };
324
+ } catch (error) {
325
+ return {
326
+ isValid: !1,
327
+ error: error instanceof Error ? error.message : "Invalid formula syntax"
328
+ };
329
+ }
330
+ }
331
+ isFormulaComplete(formula) {
332
+ if (!formula || "string" != typeof formula) return !1;
333
+ if (!formula.startsWith("=")) return !0;
334
+ if ("=" === formula.trim()) return !1;
335
+ try {
336
+ const openParenCount = (formula.match(/\(/g) || []).length, closeParenCount = (formula.match(/\)/g) || []).length, doubleQuoteCount = (formula.match(/"/g) || []).length, singleQuoteCount = (formula.match(/'/g) || []).length;
337
+ if (openParenCount !== closeParenCount || doubleQuoteCount % 2 != 0 || singleQuoteCount % 2 != 0) return !1;
338
+ if (formula.match(/\([^)]*,\s*\)/) || formula.match(/,\s*\)/) || formula.match(/\(\s*\)/) || formula.endsWith(",")) return !1;
339
+ if (formula.match(/,,/)) return !1;
340
+ if (formula.match(/[+\-*/^&%<>=]$/)) return !1;
341
+ if (formula.match(/[<>=][<>=]?(?=[\s,)])/)) return !1;
342
+ if (formula.match(/\b(AND|OR|NOT)\((?=[\s,)])/i)) return !1;
343
+ if (formula.match(/[+\-*/^&%][+\-*/^&%]/)) return !1;
344
+ return this.validateFormula(formula).isValid;
345
+ } catch (error) {
346
+ return !1;
347
+ }
348
+ }
349
+ calculateFormula(formula) {
350
+ try {
351
+ const result = this.hyperFormula.calculateFormula(formula, 0);
352
+ return {
353
+ value: result,
354
+ error: result instanceof hyperformula_1.CellError ? result.message : void 0
355
+ };
356
+ } catch (error) {
357
+ return {
358
+ value: null,
359
+ error: error instanceof Error ? error.message : "Calculation failed"
360
+ };
361
+ }
362
+ }
363
+ suspendEvaluation() {
364
+ try {
365
+ this.hyperFormula.suspendEvaluation();
366
+ } catch (error) {}
367
+ }
368
+ resumeEvaluation() {
369
+ try {
370
+ this.hyperFormula.resumeEvaluation();
371
+ } catch (error) {}
372
+ }
373
+ rebuildAndRecalculate() {
374
+ try {
375
+ this.hyperFormula.rebuildAndRecalculate();
376
+ } catch (error) {}
377
+ }
378
+ clearContent() {
379
+ try {
380
+ this.release(), this.initializeHyperFormula();
381
+ } catch (error) {}
382
+ }
383
+ release() {
384
+ var _a, _b;
385
+ null === (_a = this.formulaRangeSelector) || void 0 === _a || _a.release(), null === (_b = this.cellHighlightManager) || void 0 === _b || _b.release();
386
+ try {
387
+ this.hyperFormula && this.hyperFormula.destroy();
388
+ } catch (error) {} finally {
389
+ this.sheetMapping.clear(), this.reverseSheetMapping.clear(), this.isInitialized = !1,
390
+ this.nextSheetId = 0, this.formulaRangeSelector = null, this.cellHighlightManager = null;
391
+ }
392
+ }
393
+ exportState() {
394
+ return {
395
+ isInitialized: this.isInitialized,
396
+ sheets: Array.from(this.sheetMapping.entries()),
397
+ functions: this.getAvailableFunctions(),
398
+ stats: this.isInitialized ? this.hyperFormula.getStats() : null
399
+ };
400
+ }
401
+ ensureInitialized() {
402
+ if (!this.isInitialized) throw new Error("FormulaManager not initialized");
403
+ }
404
+ getAllSheets() {
405
+ const sheets = [];
406
+ for (const [key, id] of this.sheetMapping.entries()) try {
407
+ const name = this.hyperFormula.getSheetName(id) || key;
408
+ sheets.push({
409
+ key: key,
410
+ id: id,
411
+ name: name
412
+ });
413
+ } catch (error) {
414
+ sheets.push({
415
+ key: key,
416
+ id: id,
417
+ name: key
418
+ });
419
+ }
420
+ return sheets;
421
+ }
422
+ copyRange(sourceSheet, sourceRange, targetSheet, targetRow, targetCol) {
423
+ this.ensureInitialized();
424
+ try {
425
+ this.getSheetId(sourceSheet), this.getSheetId(targetSheet);
426
+ for (let row = sourceRange.startRow; row <= sourceRange.endRow; row++) for (let col = sourceRange.startCol; col <= sourceRange.endCol; col++) {
427
+ const sourceCell = {
428
+ sheet: sourceSheet,
429
+ row: row,
430
+ col: col
431
+ }, targetCell = {
432
+ sheet: targetSheet,
433
+ row: targetRow + (row - sourceRange.startRow),
434
+ col: targetCol + (col - sourceRange.startCol)
435
+ }, value = this.getCellValue(sourceCell).value;
436
+ null != value && this.setCellContent(targetCell, value);
437
+ }
438
+ } catch (error) {
439
+ throw new Error("Failed to copy cell range");
440
+ }
441
+ }
442
+ }
443
+
444
+ exports.FormulaManager = FormulaManager;
445
+ //# sourceMappingURL=formula-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/managers/formula-manager.ts"],"names":[],"mappings":"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","file":"formula-manager.js","sourcesContent":["import type { SimpleCellAddress } from 'hyperformula';\nimport { HyperFormula, CellError } from 'hyperformula';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { FormulaCell, FormulaResult } from '../ts-types/formula';\nimport { FormulaRangeSelector } from '../formula/formula-range-selector';\nimport type { CellRange } from '../ts-types';\nimport { CellHighlightManager } from '../formula';\nimport type * as VTable from '@visactor/vtable';\n\n/**\n * 标准HyperFormula配置\n */\nconst DEFAULT_HYPERFORMULA_CONFIG = {\n licenseKey: 'gpl-v3',\n useColumnIndex: true,\n useArrayArithmetic: false,\n useStats: true,\n precisionRounding: 14,\n nullYear: 30,\n leapYear1900: false,\n smartRounding: true,\n functionPlugins: [] as any[],\n ignoreWhiteSpace: 'standard' as const,\n caseSensitive: false,\n parseDateTime: (): undefined => undefined,\n nullDate: { year: 1899, month: 12, day: 30 },\n dateFormats: ['DD/MM/YYYY', 'DD/MM/YY', 'YYYY-MM-DD'],\n timeFormats: ['hh:mm', 'hh:mm:ss.s']\n};\n\nexport class FormulaManager {\n /** Sheet实例 */\n sheet: VTableSheet;\n /** HyperFormula实例 */\n private hyperFormula: HyperFormula;\n /** 工作表映射 */\n private sheetMapping: Map<string, number> = new Map();\n /** 反向工作表映射 */\n private reverseSheetMapping: Map<number, string> = new Map();\n /** 是否已初始化 */\n private isInitialized = false;\n /** 下一个工作表ID */\n private nextSheetId = 0;\n /** 单元格高亮管理器 */\n cellHighlightManager: CellHighlightManager;\n /** 正在输入公式的单元格(如果是完整的公式 不做记录。没输入完整才记录)。为后面拖拽单元范围或者点击单元格选中计算范围逻辑做准备。 */\n _formulaWorkingOnCell: FormulaCell | null = null;\n /** 上一次被记录过的光标位置。 公式输入框中光标位置 */\n lastKnownCursorPosInFormulaInput: number | null = null;\n\n /** 公式范围选择器 */\n formulaRangeSelector: FormulaRangeSelector;\n /** 正在处理的单元格选区 */\n lastSelectionRangesOfHandling: CellRange[] = [];\n\n inputIsParamMode: {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n } | null = null;\n\n inputingElement: HTMLInputElement | null = null;\n\n get formulaWorkingOnCell(): FormulaCell | null {\n return this._formulaWorkingOnCell;\n }\n set formulaWorkingOnCell(value: FormulaCell | null) {\n console.trace('set formulaWorkingOnCell', value);\n this._formulaWorkingOnCell = value;\n }\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.cellHighlightManager = new CellHighlightManager(sheet);\n this.formulaRangeSelector = new FormulaRangeSelector(this);\n this.initializeHyperFormula();\n }\n\n /**\n * 初始化HyperFormula实例\n */\n private initializeHyperFormula(): void {\n try {\n this.hyperFormula = HyperFormula.buildEmpty(DEFAULT_HYPERFORMULA_CONFIG);\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize HyperFormula:', error);\n throw new Error('FormulaManager initialization failed');\n }\n }\n\n /**\n * 添加新工作表 - 正确的多表格支持\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据 因为要输入给HyperFormula\n * @returns 工作表ID\n */\n addSheet(sheetKey: string, normalizedData?: any[][]): number {\n this.ensureInitialized();\n\n // 检查是否已存在\n if (this.sheetMapping.has(sheetKey)) {\n return this.sheetMapping.get(sheetKey)!;\n }\n\n try {\n let sheetId: number;\n\n // 创建第一个sheet\n if (this.sheetMapping.size === 0) {\n this.hyperFormula = HyperFormula.buildFromArray([['']], DEFAULT_HYPERFORMULA_CONFIG);\n sheetId = 0;\n\n // 获取 HyperFormula 自动创建的 sheet 名称并重命名为我们需要的名称\n const defaultSheetName = this.hyperFormula.getSheetName(0);\n if (defaultSheetName !== sheetKey) {\n try {\n // 重命名默认 sheet 为我们需要的名称\n (this.hyperFormula as any).renameSheet(0, sheetKey);\n } catch (e) {\n console.warn(`Could not rename default sheet from ${defaultSheetName} to ${sheetKey}:`, e);\n }\n }\n } else {\n // 后续sheet - 先检查这个名称是否已经存在于 HyperFormula 中\n try {\n // 尝试获取已存在的 sheet ID\n const existingSheetId = this.hyperFormula.getSheetId(sheetKey);\n if (existingSheetId !== undefined) {\n // 如果 HyperFormula 中已经有这个名称的 sheet,直接使用它\n sheetId = existingSheetId;\n } else {\n // 否则创建新的 sheet\n const sheetName = this.hyperFormula.addSheet(sheetKey);\n sheetId = this.hyperFormula.getSheetId(sheetName);\n }\n } catch (error) {\n // 如果获取 sheet ID 失败,说明不存在,创建新的\n const sheetName = this.hyperFormula.addSheet(sheetKey);\n sheetId = this.hyperFormula.getSheetId(sheetName);\n }\n }\n // 如果是有效数据,设置内容\n if (Array.isArray(normalizedData) && normalizedData.length > 0) {\n this.hyperFormula.setSheetContent(sheetId, normalizedData);\n }\n\n this.sheetMapping.set(sheetKey, sheetId);\n this.reverseSheetMapping.set(sheetId, sheetKey);\n this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1);\n\n return sheetId;\n } catch (error) {\n console.error(`Failed to add sheet ${sheetKey}:`, error);\n throw new Error(`Failed to add sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 标准化工作表数据\n * @param data 工作表数据\n * @returns 标准化后的工作表数据\n */\n normalizeSheetData(data: any[][], tableInstance: VTable.ListTable): any[][] {\n try {\n //将columns中的title追加到data中\n const headerRows: any[][] = [];\n for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {\n const headerRow: any[] = [];\n for (let j = 0; j < tableInstance.colCount; j++) {\n const cellValue = tableInstance.getCellValue(j, i);\n headerRow.push(cellValue);\n }\n headerRows.push(headerRow);\n }\n const dataCopy = JSON.parse(JSON.stringify(data));\n\n const toNormalizeData = tableInstance.columnHeaderLevelCount > 0 ? [...headerRows].concat(dataCopy) : dataCopy;\n\n if (!Array.isArray(toNormalizeData) || toNormalizeData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都是数组,并转换数据类型\n const validData = toNormalizeData.filter(row => Array.isArray(row));\n if (validData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都有相同的列数,并正确处理数据类型\n const maxCols = Math.max(...validData.map(row => row.length));\n return validData.map(row => {\n const normalizedRow = Array.isArray(row)\n ? row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) ? num : cell;\n }\n return cell ?? '';\n })\n : [''];\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n return normalizedRow;\n });\n } catch (error) {\n console.error('Failed to normalize sheet data:', error);\n return [['']];\n }\n }\n\n /**\n * 移除工作表\n * @param sheetKey 工作表键\n */\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n try {\n // 不能删除最后一个sheet\n if (this.sheetMapping.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n this.hyperFormula.removeSheet(sheetId);\n this.sheetMapping.delete(sheetKey);\n this.reverseSheetMapping.delete(sheetId);\n } catch (error) {\n console.error(`Failed to remove sheet ${sheetKey}:`, error);\n throw new Error(`Failed to remove sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 重命名工作表\n * @param oldKey 旧工作表键\n * @param newKey 新工作表键\n */\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheetMapping.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n try {\n // 使用HyperFormula的renameSheet API\n (this.hyperFormula as any).renameSheet(sheetId, newKey);\n\n // 更新内部映射\n this.sheetMapping.delete(oldKey);\n this.sheetMapping.set(newKey, sheetId);\n this.reverseSheetMapping.set(sheetId, newKey);\n } catch (error) {\n console.error(`Failed to rename sheet from ${oldKey} to ${newKey}:`, error);\n throw new Error(`Failed to rename sheet: ${oldKey}`);\n }\n }\n\n /**\n * 获取工作表ID\n * @param sheetKey 工作表键\n * @returns 工作表ID\n */\n private getSheetId(sheetKey: string): number {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n // 自动创建新sheet\n return this.addSheet(sheetKey);\n }\n return sheetId;\n }\n\n /**\n * 获取是否有表头\n * @param sheetKey 工作表键\n * @returns 是否有表头\n */\n private getHasHeader(sheetKey: string): boolean {\n const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);\n\n return sheetDefine?.showHeader ?? sheetDefine?.columns?.length > 0 ?? false;\n }\n\n /**\n * 设置单元格内容\n * @param cell 单元格\n * @param value 值\n */\n setCellContent(cell: FormulaCell, value: any): void {\n console.trace('setCellContent', cell, value);\n this.ensureInitialized();\n\n // 检查单元格参数有效性\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n console.error('Invalid cell parameter:', cell);\n throw new Error('Invalid cell parameter for setCellContent');\n }\n\n // 检查单元格是否超出有效范围\n if (cell.row < 0 || cell.col < 0) {\n console.error('Cell coordinates out of bounds:', cell);\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n // 创建单元格地址对象\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n // 尝试处理特殊值\n let processedValue = value;\n\n // 处理空值\n if (processedValue === undefined || processedValue === null) {\n processedValue = '';\n }\n\n // 如果是字符串中的数字,尝试转换为数字类型\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 设置单元格内容\n this.hyperFormula.setCellContents(address, [[processedValue]]);\n // this.formulaWorkingOnCell = cell;\n } catch (error) {\n console.error('Failed to set cell content:', error);\n // 提供更详细的错误信息\n if (error instanceof Error) {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`);\n } else {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);\n }\n }\n }\n\n /**\n * 获取单元格值\n * @param cell 单元格\n * @returns 单元格值\n */\n getCellValue(cell: FormulaCell): FormulaResult {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const value = this.hyperFormula.getCellValue(address);\n return {\n value,\n error: value instanceof CellError ? value : undefined\n };\n } catch (error) {\n console.error('Failed to get cell value:', error);\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * 获取单元格公式\n * @param cell 单元格\n * @returns 单元格公式\n */\n getCellFormula(cell: FormulaCell): string | undefined {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n return this.hyperFormula.getCellFormula(address);\n } catch (error) {\n console.error('Failed to get cell formula:', error);\n return undefined;\n }\n }\n\n /**\n * 检查是否为公式单元格\n * @param cell 单元格\n * @returns 是否为公式单元格\n */\n isCellFormula(cell: FormulaCell): boolean {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n return this.hyperFormula.doesCellHaveFormula(address);\n } catch (error) {\n console.error('Failed to check if cell has formula:', error);\n return false;\n }\n }\n\n /**\n * 获取依赖此单元格的所有单元格\n * @param cell 单元格\n * @returns 依赖此单元格的所有单元格\n */\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const dependents = this.hyperFormula.getCellDependents(address);\n\n return dependents\n .filter((dep): dep is SimpleCellAddress => 'sheet' in dep && 'row' in dep && 'col' in dep)\n .map(dep => ({\n sheet: this.reverseSheetMapping.get(dep.sheet) || '',\n row: dep.row,\n col: dep.col\n }));\n } catch (error) {\n console.error('Failed to get cell dependents:', error);\n return [];\n }\n }\n\n /**\n * 获取此单元格依赖的所有单元格\n * @param cell 单元格\n * @returns 此单元格依赖的所有单元格\n */\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const precedents = (this.hyperFormula as any).getCellPrecedents(address);\n\n return precedents\n .filter((prec: any): prec is SimpleCellAddress => 'sheet' in prec && 'row' in prec && 'col' in prec)\n .map((prec: any) => ({\n sheet: this.reverseSheetMapping.get(prec.sheet) || '',\n row: prec.row,\n col: prec.col\n }));\n } catch (error) {\n console.error('Failed to get cell precedents:', error);\n return [];\n }\n }\n\n /**\n * 批量更新单元格\n * @param changes 更新内容\n */\n batchUpdate(changes: Array<{ cell: FormulaCell; value: any }>): void {\n this.ensureInitialized();\n\n try {\n (this.hyperFormula as any).batch(() => {\n changes.forEach(({ cell, value }) => {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n this.hyperFormula.setCellContents(address, [[value]]);\n });\n });\n } catch (error) {\n console.error('Failed to batch update cells:', error);\n throw new Error('Batch update failed');\n }\n }\n\n /**\n * 添加行\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 添加的行数\n */\n addRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).addRows(sheetId, [rowIndex, numberOfRows]);\n } catch (error) {\n console.error('Failed to add rows:', error);\n throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 删除行\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 删除的行数\n */\n removeRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).removeRows(sheetId, [rowIndex, numberOfRows]);\n } catch (error) {\n console.error('Failed to remove rows:', error);\n throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 添加列\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 添加的列数\n */\n addColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).addColumns(sheetId, [columnIndex, numberOfColumns]);\n } catch (error) {\n console.error('Failed to add columns:', error);\n throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 删除列\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 删除的列数\n */\n removeColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).removeColumns(sheetId, [columnIndex, numberOfColumns]);\n } catch (error) {\n console.error('Failed to remove columns:', error);\n throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 获取工作表序列化数据\n * @param sheetKey 工作表键\n * @returns 工作表序列化数据\n */\n getSheetSerialized(sheetKey: string): any[][] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n return (this.hyperFormula as any).getSheetSerialized(sheetId);\n } catch (error) {\n console.error('Failed to get sheet serialized data:', error);\n return [[]];\n }\n }\n\n /**\n * 设置工作表内容\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据\n */\n setSheetContent(sheetKey: string, normalizedData: any[][]): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n\n (this.hyperFormula as any).setSheetContent(sheetId, normalizedData);\n } catch (error) {\n console.error('Failed to set sheet content:', error);\n throw new Error(`Failed to set content for sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 检查循环引用\n * @returns 是否存在循环引用\n */\n hasCircularReference(): boolean {\n try {\n const stats = (this.hyperFormula as any).getStats();\n return stats && stats.dependencyGraph && stats.dependencyGraph.hasCircularReferences();\n } catch (error) {\n console.error('Failed to check circular reference:', error);\n return false;\n }\n }\n\n /**\n * 获取可用函数列表 - 静态列表\n * @returns 可用函数列表\n */\n getAvailableFunctions(): string[] {\n // 返回常用的Excel函数列表\n return [\n 'ABS',\n 'ACOS',\n 'AND',\n 'ASIN',\n 'ATAN',\n 'AVERAGE',\n 'CEILING',\n 'CONCATENATE',\n 'COS',\n 'COUNT',\n 'COUNTA',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DAY',\n 'FLOOR',\n 'IF',\n 'IFERROR',\n 'INDEX',\n 'LEFT',\n 'LEN',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MID',\n 'MIN',\n 'MONTH',\n 'NOT',\n 'NOW',\n 'OR',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'SIN',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'TAN',\n 'TODAY',\n 'UPPER',\n 'VLOOKUP',\n 'YEAR'\n ];\n }\n\n /**\n * 验证公式语法\n * @param formula 公式\n * @returns 验证结果\n */\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 使用HyperFormula的内置验证\n (this.hyperFormula as any).validateFormula(formula);\n return { isValid: true };\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n // /**\n // * 检查公式是否完整\n // * @param formula 公式字符串\n // * @returns 是否完整\n // */\n // isFormulaComplete(formula: string): boolean {\n // if (!formula || typeof formula !== 'string') {\n // return false;\n // }\n\n // // 如果不是公式,则认为是完整的\n // if (!formula.startsWith('=')) {\n // return true;\n // }\n\n // // 检查是否只有等号或等号加空格\n // if (formula.trim() === '=') {\n // return false;\n // }\n\n // try {\n // // 检查括号是否匹配\n // const openParenCount = (formula.match(/\\(/g) || []).length;\n // const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // // 检查引号是否匹配(简单检查)\n // const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n // const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // // 检查括号和引号是否匹配\n // if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n // return false;\n // }\n\n // // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n // if (\n // formula.match(/\\([^)]*,\\s*\\)/) ||\n // formula.match(/,\\s*\\)/) ||\n // formula.match(/\\(\\s*\\)/) ||\n // formula.endsWith(',')\n // ) {\n // return false;\n // }\n\n // // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n // if (formula.match(/,,/)) {\n // return false;\n // }\n\n // // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n // if (formula.match(/[+\\-*/^&%<>=]$/)) {\n // return false;\n // }\n\n // // 尝试验证公式语法\n // const validationResult = this.validateFormula(formula);\n // return validationResult.isValid;\n // } catch (error) {\n // // 如果验证抛出异常,则公式不完整\n // return false;\n // }\n // }\n\n /**\n * 检查公式是否完整\n * @param formula 公式字符串\n * @returns 是否完整\n */\n isFormulaComplete(formula: string): boolean {\n if (!formula || typeof formula !== 'string') {\n return false;\n }\n\n // 如果不是公式,则认为是完整的\n if (!formula.startsWith('=')) {\n return true;\n }\n\n // 检查是否只有等号或等号加空格\n if (formula.trim() === '=') {\n return false;\n }\n\n try {\n // 检查括号是否匹配\n const openParenCount = (formula.match(/\\(/g) || []).length;\n const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // 检查引号是否匹配(简单检查)\n const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // 检查括号和引号是否匹配\n if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n return false;\n }\n\n // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n if (\n formula.match(/\\([^)]*,\\s*\\)/) ||\n formula.match(/,\\s*\\)/) ||\n formula.match(/\\(\\s*\\)/) ||\n formula.endsWith(',')\n ) {\n return false;\n }\n\n // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n if (formula.match(/,,/)) {\n return false;\n }\n\n // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n if (formula.match(/[+\\-*/^&%<>=]$/)) {\n return false;\n }\n\n // 检查比较运算符后是否缺少操作数,如 \"=IF(E1>,\" 或 \"=IF(A1=)\" 这种情况\n if (formula.match(/[<>=][<>=]?(?=[\\s,)])/)) {\n return false;\n }\n\n // 检查逻辑运算符后是否缺少操作数,如 \"=IF(AND(A1,)\" 这种情况\n if (formula.match(/\\b(AND|OR|NOT)\\((?=[\\s,)])/i)) {\n return false;\n }\n\n // 检查数学运算符后是否有操作数,如 \"=A1+*B1\" 这种情况\n if (formula.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n return false;\n }\n\n // 尝试验证公式语法\n const validationResult = this.validateFormula(formula);\n return validationResult.isValid;\n } catch (error) {\n // 如果验证抛出异常,则公式不完整\n return false;\n }\n }\n\n /**\n * 计算单个公式而不影响工作表\n * @param formula 公式\n * @returns 计算结果\n */\n calculateFormula(formula: string): { value: any; error?: string } {\n try {\n const result = (this.hyperFormula as any).calculateFormula(formula, 0);\n return {\n value: result,\n error: result instanceof CellError ? result.message : undefined\n };\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 暂停自动计算\n * @returns 是否成功\n */\n suspendEvaluation(): void {\n try {\n (this.hyperFormula as any).suspendEvaluation();\n } catch (error) {\n console.error('Failed to suspend evaluation:', error);\n }\n }\n\n /**\n * 恢复自动计算\n */\n resumeEvaluation(): void {\n try {\n (this.hyperFormula as any).resumeEvaluation();\n } catch (error) {\n console.error('Failed to resume evaluation:', error);\n }\n }\n\n /**\n * 强制重新计算所有公式\n */\n rebuildAndRecalculate(): void {\n try {\n (this.hyperFormula as any).rebuildAndRecalculate();\n } catch (error) {\n console.error('Failed to rebuild and recalculate:', error);\n }\n }\n\n /**\n * 清空所有内容\n */\n clearContent(): void {\n try {\n this.release();\n this.initializeHyperFormula();\n } catch (error) {\n console.error('Failed to clear content:', error);\n }\n }\n\n /**\n * 销毁FormulaManager\n */\n release(): void {\n this.formulaRangeSelector?.release();\n this.cellHighlightManager?.release();\n try {\n if (this.hyperFormula) {\n (this.hyperFormula as any).destroy();\n }\n } catch (error) {\n console.error('Failed to destroy HyperFormula:', error);\n } finally {\n this.sheetMapping.clear();\n this.reverseSheetMapping.clear();\n this.isInitialized = false;\n this.nextSheetId = 0;\n this.formulaRangeSelector = null;\n this.cellHighlightManager = null;\n }\n }\n\n /**\n * 导出状态用于调试\n */\n exportState(): any {\n return {\n isInitialized: this.isInitialized,\n sheets: Array.from(this.sheetMapping.entries()),\n functions: this.getAvailableFunctions(),\n stats: this.isInitialized ? (this.hyperFormula as any).getStats() : null\n };\n }\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('FormulaManager not initialized');\n }\n }\n\n /**\n * 获取所有工作表信息\n */\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n const sheets: Array<{ key: string; id: number; name: string }> = [];\n\n for (const [key, id] of this.sheetMapping.entries()) {\n try {\n const name = (this.hyperFormula as any).getSheetName(id) || key;\n sheets.push({ key, id, name });\n } catch (error) {\n console.warn(`Failed to get name for sheet ${key}:`, error);\n sheets.push({ key, id, name: key });\n }\n }\n\n return sheets;\n }\n\n /**\n * 复制/移动单元格范围 - 简化版本\n * @param sourceSheet 源工作表\n * @param sourceRange 源范围\n * @param targetSheet 目标工作表\n * @param targetRow 目标行\n * @param targetCol 目标列\n */\n copyRange(\n sourceSheet: string,\n sourceRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n targetSheet: string,\n targetRow: number,\n targetCol: number\n ): void {\n this.ensureInitialized();\n\n try {\n const sourceSheetId = this.getSheetId(sourceSheet);\n const targetSheetId = this.getSheetId(targetSheet);\n\n // 简单的数据复制实现\n for (let row = sourceRange.startRow; row <= sourceRange.endRow; row++) {\n for (let col = sourceRange.startCol; col <= sourceRange.endCol; col++) {\n const sourceCell = { sheet: sourceSheet, row, col };\n const targetCell = {\n sheet: targetSheet,\n row: targetRow + (row - sourceRange.startRow),\n col: targetCol + (col - sourceRange.startCol)\n };\n\n const value = this.getCellValue(sourceCell).value;\n if (value !== null && value !== undefined) {\n this.setCellContent(targetCell, value);\n }\n }\n }\n } catch (error) {\n console.error('Failed to copy range:', error);\n throw new Error('Failed to copy cell range');\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type VTableSheet from '../components/vtable-sheet';
2
+ import { MainMenuItemKey } from '../ts-types/base';
3
+ export declare class MenuManager {
4
+ private sheet;
5
+ private menuContainer;
6
+ constructor(sheet: VTableSheet);
7
+ createMainMenu(): HTMLElement;
8
+ private createSubMenu;
9
+ private adjustSubMenuPosition;
10
+ private hideAllSubMenus;
11
+ handleMenuClick(menuKey: MainMenuItemKey): void;
12
+ }