@veltra/sheet 2.0.1 → 2.2.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 (339) hide show
  1. package/dist/components/report/binding-badge.js +76 -0
  2. package/dist/components/report/designer/cell-coords.js +46 -0
  3. package/dist/components/report/designer/col-widths.js +15 -0
  4. package/dist/components/report/designer/conditional-rules/helpers.js +139 -0
  5. package/dist/components/report/designer/drop-highlight-overlay.js +76 -0
  6. package/dist/components/report/designer/float-panel.js +385 -0
  7. package/dist/components/report/designer/role.js +17 -0
  8. package/dist/components/report/designer/rule-preview.js +33 -0
  9. package/dist/components/report/designer/rule-row.js +269 -0
  10. package/dist/components/report/designer/rules-dialog.js +135 -0
  11. package/dist/components/report/designer/topology-overlay.js +122 -0
  12. package/dist/components/report/designer/topology.js +64 -0
  13. package/dist/components/report/designer/use-grid-overlay.js +75 -0
  14. package/dist/components/report/designer-hub.js +177 -0
  15. package/dist/components/report/field-panel-helpers.js +33 -0
  16. package/dist/components/report/field-panel.js +132 -0
  17. package/dist/components/report/filter-bar.js +74 -0
  18. package/dist/components/report/hub-connection-form.js +145 -0
  19. package/dist/components/report/hub-dataset-editor.js +394 -0
  20. package/dist/components/report/report-designer.js +343 -0
  21. package/dist/components/report/report-viewer.js +111 -0
  22. package/dist/components/report/style.d.ts +17 -0
  23. package/dist/components/report/style.js +18 -0
  24. package/dist/components/report/style2.css +869 -0
  25. package/dist/components/report/use-report-designer.js +360 -0
  26. package/dist/components/report/use-report-viewer.js +50 -0
  27. package/dist/components/sheet/formula-bar.js +393 -0
  28. package/dist/components/sheet/formula-suggest-list.js +66 -0
  29. package/dist/components/sheet/import-file.js +140 -0
  30. package/dist/components/sheet/insert-count-menu-item.js +68 -0
  31. package/dist/components/sheet/insert-image.js +79 -0
  32. package/dist/components/sheet/popup-helpers.js +73 -0
  33. package/dist/components/sheet/popups/border-popup.js +75 -0
  34. package/dist/components/sheet/popups/border-preset-glyph.js +106 -0
  35. package/dist/components/sheet/popups/export-popup.js +51 -0
  36. package/dist/components/sheet/popups/fill-color-popup.js +37 -0
  37. package/dist/components/sheet/popups/find-popup.js +113 -0
  38. package/dist/components/sheet/popups/font-color-popup.js +37 -0
  39. package/dist/components/sheet/popups/font-size-popup.js +63 -0
  40. package/dist/components/sheet/popups/import.worker.d.ts +21 -0
  41. package/dist/components/sheet/popups/import.worker.js +41 -0
  42. package/dist/components/sheet/popups/insert-image-popup.js +38 -0
  43. package/dist/components/sheet/sheet-context-menu.js +200 -0
  44. package/dist/components/sheet/sheet-tabs.js +162 -0
  45. package/dist/components/sheet/sheet-toolbar.js +106 -0
  46. package/dist/components/sheet/sheet.js +198 -0
  47. package/dist/components/sheet/style.d.ts +11 -0
  48. package/dist/components/sheet/style.js +12 -0
  49. package/dist/components/sheet/style2.css +654 -0
  50. package/dist/components/sheet/use-find-replace.js +161 -0
  51. package/dist/components/sheet/use-formula-ref-select.js +37 -0
  52. package/dist/components/sheet/use-formula-suggest.js +126 -0
  53. package/dist/components/sheet/use-sheet-grid.js +188 -0
  54. package/dist/components/sheet/use-sheet-state.js +122 -0
  55. package/dist/components/sheet/use-sheet-tabs-bar.js +90 -0
  56. package/dist/components/sheet/use-tool-groups.js +42 -0
  57. package/dist/components/sheet/use-tool-popup.js +123 -0
  58. package/dist/components/sheet/use-toolbar-scroll.js +72 -0
  59. package/dist/index.d.ts +18 -26
  60. package/dist/index.js +14 -24
  61. package/dist/report/binding.d.ts +45 -0
  62. package/dist/report/binding.js +175 -0
  63. package/dist/report/connector.d.ts +66 -0
  64. package/dist/report/connector.js +159 -0
  65. package/dist/report/export-xlsx.d.ts +19 -0
  66. package/dist/report/export-xlsx.js +95 -0
  67. package/dist/report/filter-bar.d.ts +10 -0
  68. package/dist/report/filter-bar.js +31 -0
  69. package/dist/report/index.d.ts +12 -0
  70. package/dist/report/params.d.ts +13 -0
  71. package/dist/report/params.js +61 -0
  72. package/dist/report/render/aggregate.js +157 -0
  73. package/dist/report/render/builder.d.ts +12 -0
  74. package/dist/report/render/builder.js +139 -0
  75. package/dist/report/render/coordinate.d.ts +25 -0
  76. package/dist/report/render/coordinate.js +733 -0
  77. package/dist/report/render/index.d.ts +14 -0
  78. package/dist/report/render/index.js +21 -0
  79. package/dist/report/render/style-resolver.js +50 -0
  80. package/dist/report/render/template-index.d.ts +24 -0
  81. package/dist/report/render/template-index.js +137 -0
  82. package/dist/report/rules/evaluate.d.ts +25 -0
  83. package/dist/report/rules/evaluate.js +82 -0
  84. package/dist/report/rules/index.d.ts +2 -0
  85. package/dist/report/template.d.ts +59 -0
  86. package/dist/report/template.js +80 -0
  87. package/dist/report/types.d.ts +85 -0
  88. package/dist/tools/builtin.js +279 -8
  89. package/dist/tools/context.d.ts +54 -11
  90. package/dist/tools/context.js +28 -5
  91. package/dist/tools/download.js +68 -0
  92. package/dist/tools/export.worker.d.ts +16 -0
  93. package/dist/tools/export.worker.js +29 -0
  94. package/dist/tools/registry.d.ts +7 -4
  95. package/dist/tools/registry.js +1 -3
  96. package/dist/types/index.d.ts +3 -1
  97. package/dist/types/report-designer.d.ts +36 -0
  98. package/dist/types/report-viewer.d.ts +38 -0
  99. package/dist/types/sheet.d.ts +22 -5
  100. package/package.json +10 -7
  101. package/src/components/report/__test__/conditional-rules-helpers.test.ts +87 -0
  102. package/src/components/report/__test__/field-panel-helpers.test.ts +65 -0
  103. package/src/components/report/__test__/float-panel-position.test.ts +45 -0
  104. package/src/components/report/__test__/report-designer.test.ts +388 -0
  105. package/src/components/report/__test__/report-viewer.test.ts +334 -0
  106. package/src/components/report/__test__/topology.test.ts +143 -0
  107. package/src/components/report/__test__/use-report-designer.test.ts +565 -0
  108. package/src/components/report/binding-badge.ts +73 -0
  109. package/src/components/report/designer/cell-coords.ts +94 -0
  110. package/src/components/report/designer/col-widths.ts +33 -0
  111. package/src/components/report/designer/conditional-rules/helpers.ts +186 -0
  112. package/src/components/report/designer/drop-highlight-overlay.vue +74 -0
  113. package/src/components/report/designer/float-panel.vue +387 -0
  114. package/src/components/report/designer/role.ts +32 -0
  115. package/src/components/report/designer/rule-preview.vue +40 -0
  116. package/src/components/report/designer/rule-row.vue +252 -0
  117. package/src/components/report/designer/rules-dialog.vue +126 -0
  118. package/src/components/report/designer/topology-overlay.vue +127 -0
  119. package/src/components/report/designer/topology.ts +124 -0
  120. package/src/components/report/designer/use-grid-overlay.ts +113 -0
  121. package/src/components/report/designer-hub.vue +198 -0
  122. package/src/components/report/field-panel-helpers.ts +44 -0
  123. package/src/components/report/field-panel.vue +136 -0
  124. package/src/components/report/filter-bar.vue +77 -0
  125. package/src/components/report/hub-connection-form.vue +124 -0
  126. package/src/components/report/hub-dataset-editor.vue +369 -0
  127. package/src/components/report/index.ts +2 -0
  128. package/src/components/report/report-designer.vue +356 -0
  129. package/src/components/report/report-viewer.vue +128 -0
  130. package/src/components/report/style-designer.scss +583 -0
  131. package/src/components/report/style-hub.scss +292 -0
  132. package/src/components/report/style-viewer.scss +104 -0
  133. package/src/components/report/style.scss +3 -0
  134. package/src/components/report/style.ts +20 -0
  135. package/src/components/report/use-report-designer.ts +547 -0
  136. package/src/components/report/use-report-viewer.ts +79 -0
  137. package/src/components/sheet/__test__/formula-bar.test.ts +474 -0
  138. package/src/components/sheet/__test__/import-file.test.ts +183 -0
  139. package/src/components/sheet/__test__/insert-count-menu-item.test.ts +123 -0
  140. package/src/components/sheet/__test__/insert-image-popup.test.ts +89 -0
  141. package/src/components/sheet/__test__/insert-image.test.ts +100 -0
  142. package/src/components/sheet/__test__/sheet-component.test.ts +993 -0
  143. package/src/components/sheet/__test__/sheet-context-menu.test.ts +206 -0
  144. package/src/components/sheet/__test__/use-formula-ref-select.test.ts +35 -0
  145. package/src/components/sheet/__test__/use-formula-suggest.test.ts +83 -0
  146. package/src/components/sheet/formula-bar.vue +473 -0
  147. package/src/components/sheet/formula-suggest-list.vue +64 -0
  148. package/src/components/sheet/import-file.ts +173 -0
  149. package/src/components/sheet/insert-count-menu-item.vue +69 -0
  150. package/src/components/sheet/insert-image.ts +90 -0
  151. package/src/components/sheet/parsing.ts +11 -0
  152. package/src/components/sheet/popup-helpers.ts +50 -0
  153. package/src/components/sheet/popups/border-popup.vue +93 -0
  154. package/src/components/sheet/popups/border-preset-glyph.vue +111 -0
  155. package/src/components/sheet/popups/export-popup.vue +52 -0
  156. package/src/components/sheet/popups/fill-color-popup.vue +39 -0
  157. package/src/components/sheet/popups/find-popup.vue +111 -0
  158. package/src/components/sheet/popups/font-color-popup.vue +39 -0
  159. package/src/components/sheet/popups/font-size-popup.vue +52 -0
  160. package/src/components/sheet/popups/import.worker.ts +66 -0
  161. package/src/components/sheet/popups/insert-image-popup.vue +39 -0
  162. package/src/components/sheet/sheet-context-menu.ts +229 -0
  163. package/src/components/sheet/sheet-tabs.vue +162 -0
  164. package/src/components/sheet/sheet-toolbar.vue +91 -0
  165. package/src/components/sheet/sheet.vue +211 -0
  166. package/src/components/sheet/style.scss +737 -0
  167. package/src/components/sheet/style.ts +13 -0
  168. package/src/components/sheet/use-find-replace.ts +200 -0
  169. package/src/components/sheet/use-formula-ref-select.ts +34 -0
  170. package/src/components/sheet/use-formula-suggest.ts +150 -0
  171. package/src/components/sheet/use-sheet-grid.ts +247 -0
  172. package/src/components/sheet/use-sheet-state.ts +161 -0
  173. package/src/components/sheet/use-sheet-tabs-bar.ts +115 -0
  174. package/src/components/sheet/use-tool-groups.ts +61 -0
  175. package/src/components/sheet/use-tool-popup.ts +150 -0
  176. package/src/components/sheet/use-toolbar-scroll.ts +95 -0
  177. package/src/env.d.ts +11 -0
  178. package/src/index.ts +39 -14
  179. package/src/report/__test__/binding.test.ts +218 -0
  180. package/src/report/__test__/connector.test.ts +218 -0
  181. package/src/report/__test__/export-xlsx.test.ts +118 -0
  182. package/src/report/__test__/filter-bar.test.ts +58 -0
  183. package/src/report/__test__/params.test.ts +156 -0
  184. package/src/report/__test__/render.test.ts +728 -0
  185. package/src/report/__test__/rules.test.ts +131 -0
  186. package/src/report/__test__/template.test.ts +355 -0
  187. package/src/report/binding.ts +243 -0
  188. package/src/report/connector.ts +205 -0
  189. package/src/report/export-xlsx.ts +118 -0
  190. package/src/report/filter-bar.ts +36 -0
  191. package/src/report/index.ts +13 -0
  192. package/src/report/params.ts +96 -0
  193. package/src/report/render/__test__/aggregate.test.ts +16 -0
  194. package/src/report/render/__test__/coordinate.test.ts +405 -0
  195. package/src/report/render/aggregate.ts +240 -0
  196. package/src/report/render/builder.ts +211 -0
  197. package/src/report/render/coordinate.ts +1239 -0
  198. package/src/report/render/index.ts +30 -0
  199. package/src/report/render/style-resolver.ts +68 -0
  200. package/src/report/render/template-index.ts +200 -0
  201. package/src/report/rules/evaluate.ts +113 -0
  202. package/src/report/rules/index.ts +7 -0
  203. package/src/report/template.ts +141 -0
  204. package/src/report/types.ts +96 -0
  205. package/src/tools/__test__/builtin.test.ts +208 -66
  206. package/src/tools/__test__/context.test.ts +62 -2
  207. package/src/tools/builtin.ts +350 -6
  208. package/src/tools/context.ts +89 -11
  209. package/src/tools/download.ts +82 -0
  210. package/src/tools/export.worker.ts +61 -0
  211. package/src/tools/registry.ts +16 -1
  212. package/src/types/index.ts +2 -0
  213. package/src/types/report-designer.ts +36 -0
  214. package/src/types/report-viewer.ts +37 -0
  215. package/src/types/sheet.ts +26 -3
  216. package/dist/core/address.d.ts +0 -60
  217. package/dist/core/address.js +0 -142
  218. package/dist/core/address.js.map +0 -1
  219. package/dist/core/cell-store.d.ts +0 -61
  220. package/dist/core/cell-store.js +0 -135
  221. package/dist/core/cell-store.js.map +0 -1
  222. package/dist/core/command/default-registry.d.ts +0 -10
  223. package/dist/core/command/default-registry.js +0 -18
  224. package/dist/core/command/default-registry.js.map +0 -1
  225. package/dist/core/command/history.d.ts +0 -64
  226. package/dist/core/command/history.js +0 -127
  227. package/dist/core/command/history.js.map +0 -1
  228. package/dist/core/command/merge-cells.d.ts +0 -21
  229. package/dist/core/command/merge-cells.js +0 -74
  230. package/dist/core/command/merge-cells.js.map +0 -1
  231. package/dist/core/command/registry.d.ts +0 -17
  232. package/dist/core/command/registry.js +0 -26
  233. package/dist/core/command/registry.js.map +0 -1
  234. package/dist/core/command/set-cell-formula.d.ts +0 -17
  235. package/dist/core/command/set-cell-formula.js +0 -29
  236. package/dist/core/command/set-cell-formula.js.map +0 -1
  237. package/dist/core/command/set-cell-value.d.ts +0 -22
  238. package/dist/core/command/set-cell-value.js +0 -35
  239. package/dist/core/command/set-cell-value.js.map +0 -1
  240. package/dist/core/command/types.d.ts +0 -68
  241. package/dist/core/events.js +0 -29
  242. package/dist/core/events.js.map +0 -1
  243. package/dist/core/fill.d.ts +0 -34
  244. package/dist/core/fill.js +0 -320
  245. package/dist/core/fill.js.map +0 -1
  246. package/dist/core/formula/ast.d.ts +0 -58
  247. package/dist/core/formula/ast.js +0 -38
  248. package/dist/core/formula/ast.js.map +0 -1
  249. package/dist/core/formula/dependency-graph.d.ts +0 -70
  250. package/dist/core/formula/dependency-graph.js +0 -269
  251. package/dist/core/formula/dependency-graph.js.map +0 -1
  252. package/dist/core/formula/errors.d.ts +0 -25
  253. package/dist/core/formula/errors.js +0 -36
  254. package/dist/core/formula/errors.js.map +0 -1
  255. package/dist/core/formula/evaluator.d.ts +0 -41
  256. package/dist/core/formula/evaluator.js +0 -154
  257. package/dist/core/formula/evaluator.js.map +0 -1
  258. package/dist/core/formula/functions.d.ts +0 -30
  259. package/dist/core/formula/functions.js +0 -209
  260. package/dist/core/formula/functions.js.map +0 -1
  261. package/dist/core/formula/parser.d.ts +0 -7
  262. package/dist/core/formula/parser.js +0 -208
  263. package/dist/core/formula/parser.js.map +0 -1
  264. package/dist/core/formula/tokenizer.d.ts +0 -37
  265. package/dist/core/formula/tokenizer.js +0 -146
  266. package/dist/core/formula/tokenizer.js.map +0 -1
  267. package/dist/core/merge-manager.d.ts +0 -64
  268. package/dist/core/merge-manager.js +0 -111
  269. package/dist/core/merge-manager.js.map +0 -1
  270. package/dist/core/selection.d.ts +0 -31
  271. package/dist/core/selection.js +0 -62
  272. package/dist/core/selection.js.map +0 -1
  273. package/dist/core/sheet.d.ts +0 -116
  274. package/dist/core/sheet.js +0 -224
  275. package/dist/core/sheet.js.map +0 -1
  276. package/dist/core/workbook.d.ts +0 -43
  277. package/dist/core/workbook.js +0 -77
  278. package/dist/core/workbook.js.map +0 -1
  279. package/dist/grid/sheet-grid.d.ts +0 -81
  280. package/dist/grid/sheet-grid.js +0 -331
  281. package/dist/grid/sheet-grid.js.map +0 -1
  282. package/dist/grid/vtable-theme.js +0 -80
  283. package/dist/grid/vtable-theme.js.map +0 -1
  284. package/dist/tools/builtin.js.map +0 -1
  285. package/dist/tools/context.js.map +0 -1
  286. package/dist/tools/registry.js.map +0 -1
  287. package/dist/vue/index.d.ts +0 -2
  288. package/dist/vue/sheet.js +0 -211
  289. package/dist/vue/sheet.js.map +0 -1
  290. package/dist/vue/sheet.vue.d.ts +0 -24
  291. package/dist/vue/style.d.ts +0 -1
  292. package/dist/vue/style.js +0 -2
  293. package/dist/vue/style2.css +0 -93
  294. package/src/core/__test__/address.test.ts +0 -113
  295. package/src/core/__test__/cell-store.test.ts +0 -97
  296. package/src/core/__test__/command.test.ts +0 -377
  297. package/src/core/__test__/fill.test.ts +0 -140
  298. package/src/core/__test__/formula-adversarial.test.ts +0 -265
  299. package/src/core/__test__/formula-engine.test.ts +0 -470
  300. package/src/core/__test__/formula-functions.test.ts +0 -178
  301. package/src/core/__test__/formula-parser.test.ts +0 -160
  302. package/src/core/__test__/history.test.ts +0 -225
  303. package/src/core/__test__/merge-manager.test.ts +0 -106
  304. package/src/core/__test__/sheet.test.ts +0 -142
  305. package/src/core/address.ts +0 -166
  306. package/src/core/cell-store.ts +0 -173
  307. package/src/core/command/default-registry.ts +0 -15
  308. package/src/core/command/history.ts +0 -167
  309. package/src/core/command/index.ts +0 -7
  310. package/src/core/command/merge-cells.ts +0 -74
  311. package/src/core/command/registry.ts +0 -30
  312. package/src/core/command/set-cell-formula.ts +0 -29
  313. package/src/core/command/set-cell-value.ts +0 -38
  314. package/src/core/command/types.ts +0 -73
  315. package/src/core/events.ts +0 -37
  316. package/src/core/fill.ts +0 -314
  317. package/src/core/formula/ast.ts +0 -66
  318. package/src/core/formula/dependency-graph.ts +0 -329
  319. package/src/core/formula/errors.ts +0 -41
  320. package/src/core/formula/evaluator.ts +0 -219
  321. package/src/core/formula/functions.ts +0 -266
  322. package/src/core/formula/index.ts +0 -7
  323. package/src/core/formula/parser.ts +0 -198
  324. package/src/core/formula/tokenizer.ts +0 -160
  325. package/src/core/merge-manager.ts +0 -158
  326. package/src/core/selection.ts +0 -66
  327. package/src/core/sheet.ts +0 -282
  328. package/src/core/workbook.ts +0 -99
  329. package/src/grid/__test__/canvas-mock.ts +0 -49
  330. package/src/grid/__test__/setup.ts +0 -3
  331. package/src/grid/__test__/sheet-grid-formula.test.ts +0 -140
  332. package/src/grid/__test__/sheet-grid.test.ts +0 -275
  333. package/src/grid/sheet-grid.ts +0 -407
  334. package/src/grid/vtable-theme.ts +0 -61
  335. package/src/vue/__test__/sheet-component.test.ts +0 -267
  336. package/src/vue/sheet.vue +0 -235
  337. package/src/vue/style.scss +0 -94
  338. package/src/vue/style.ts +0 -2
  339. /package/src/{vue → components/sheet}/index.ts +0 -0
@@ -1,10 +0,0 @@
1
- import { CommandRegistry } from "./registry.js";
2
- //#region src/core/command/default-registry.d.ts
3
- /**
4
- * 默认命令注册表:内置命令模块加载时注册一次,全局共享(命令无状态)。
5
- * Sheet 默认经此表执行命令;阶段 4 工具扩展可继续注册自定义命令。
6
- */
7
- declare const defaultCommandRegistry: CommandRegistry;
8
- //#endregion
9
- export { defaultCommandRegistry };
10
- //# sourceMappingURL=default-registry.d.ts.map
@@ -1,18 +0,0 @@
1
- import { MergeCellsCommand, UnmergeCellsCommand } from "./merge-cells.js";
2
- import { CommandRegistry } from "./registry.js";
3
- import { SetCellFormulaCommand } from "./set-cell-formula.js";
4
- import { SetCellValueCommand } from "./set-cell-value.js";
5
- //#region src/core/command/default-registry.ts
6
- /**
7
- * 默认命令注册表:内置命令模块加载时注册一次,全局共享(命令无状态)。
8
- * Sheet 默认经此表执行命令;阶段 4 工具扩展可继续注册自定义命令。
9
- */
10
- const defaultCommandRegistry = new CommandRegistry();
11
- defaultCommandRegistry.register(SetCellValueCommand);
12
- defaultCommandRegistry.register(SetCellFormulaCommand);
13
- defaultCommandRegistry.register(MergeCellsCommand);
14
- defaultCommandRegistry.register(UnmergeCellsCommand);
15
- //#endregion
16
- export { defaultCommandRegistry };
17
-
18
- //# sourceMappingURL=default-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-registry.js","names":[],"sources":["../../../src/core/command/default-registry.ts"],"sourcesContent":["import { MergeCellsCommand, UnmergeCellsCommand } from './merge-cells'\nimport { CommandRegistry } from './registry'\nimport { SetCellFormulaCommand } from './set-cell-formula'\nimport { SetCellValueCommand } from './set-cell-value'\n\n/**\n * 默认命令注册表:内置命令模块加载时注册一次,全局共享(命令无状态)。\n * Sheet 默认经此表执行命令;阶段 4 工具扩展可继续注册自定义命令。\n */\nexport const defaultCommandRegistry = new CommandRegistry()\n\ndefaultCommandRegistry.register(SetCellValueCommand)\ndefaultCommandRegistry.register(SetCellFormulaCommand)\ndefaultCommandRegistry.register(MergeCellsCommand)\ndefaultCommandRegistry.register(UnmergeCellsCommand)\n"],"mappings":";;;;;;;;;AASA,MAAa,yBAAyB,IAAI,gBAAgB;AAE1D,uBAAuB,SAAS,mBAAmB;AACnD,uBAAuB,SAAS,qBAAqB;AACrD,uBAAuB,SAAS,iBAAiB;AACjD,uBAAuB,SAAS,mBAAmB"}
@@ -1,64 +0,0 @@
1
- import { Mutation, Patch, PatchDirection } from "./types.js";
2
- //#region src/core/command/history.d.ts
3
- /**
4
- * HistoryManager:undo/redo 栈 + 事务。
5
- *
6
- * - 一个 undo 单元 = 一次命令(或一次事务)的全部 Mutation
7
- * - 事务:beginTransaction / commit,支持嵌套(深度计数,拍平到最外层);
8
- * rollback 回滚缓冲区中已应用的变更并放弃事务
9
- * - 容量上限(默认 200):超出淘汰最旧条目
10
- * - 新命令入栈即清空 redo 栈
11
- */
12
- /** 历史栈容量默认值 */
13
- declare const DEFAULT_HISTORY_CAPACITY = 200;
14
- /** 历史状态(history-change 事件负载) */
15
- interface HistoryState {
16
- canUndo: boolean;
17
- canRedo: boolean;
18
- }
19
- declare class HistoryManager {
20
- /** 补丁应用器(由 Sheet 注入,命令执行与回放共用) */
21
- private readonly applyPatch;
22
- private readonly capacity;
23
- private undoStack;
24
- private redoStack;
25
- /** 事务深度(>0 表示事务进行中) */
26
- private transactionDepth;
27
- /** 事务缓冲:commit 时合并为一个 undo 单元 */
28
- private transactionBuffer;
29
- private emitter;
30
- constructor(
31
- /** 补丁应用器(由 Sheet 注入,命令执行与回放共用) */
32
- applyPatch: (patch: Patch, direction: PatchDirection) => void, capacity?: number);
33
- get canUndo(): boolean;
34
- get canRedo(): boolean;
35
- /** undo 栈深度(调试/测试用) */
36
- get undoSize(): number;
37
- /** redo 栈深度(调试/测试用) */
38
- get redoSize(): number;
39
- /** 是否处于事务中 */
40
- get inTransaction(): boolean;
41
- /** 命令执行产生的 mutation 入栈(事务中则缓冲);空列表直接忽略 */
42
- push(mutations: Mutation[]): void;
43
- /** 开启事务(可嵌套,拍平到最外层) */
44
- beginTransaction(): void;
45
- /** 提交事务:缓冲的 mutation 合并为一个 undo 单元入栈 */
46
- commit(): void;
47
- /**
48
- * 回滚事务:逆序应用缓冲区中各 mutation 的 undo 补丁还原模型,
49
- * 丢弃缓冲并结束事务(含嵌套);不动 undo/redo 栈。
50
- */
51
- rollback(): void;
52
- /** 撤销一个单元;事务进行中或栈空时返回 false */
53
- undo(): boolean;
54
- /** 重做一个单元;事务进行中或栈空时返回 false */
55
- redo(): boolean;
56
- /** 清空全部历史(含事务缓冲) */
57
- clear(): void;
58
- onChange(handler: (state: HistoryState) => void): () => void;
59
- private pushEntry;
60
- private emitChange;
61
- }
62
- //#endregion
63
- export { DEFAULT_HISTORY_CAPACITY, HistoryManager, HistoryState };
64
- //# sourceMappingURL=history.d.ts.map
@@ -1,127 +0,0 @@
1
- import { TypedEventEmitter } from "../events.js";
2
- //#region src/core/command/history.ts
3
- /**
4
- * HistoryManager:undo/redo 栈 + 事务。
5
- *
6
- * - 一个 undo 单元 = 一次命令(或一次事务)的全部 Mutation
7
- * - 事务:beginTransaction / commit,支持嵌套(深度计数,拍平到最外层);
8
- * rollback 回滚缓冲区中已应用的变更并放弃事务
9
- * - 容量上限(默认 200):超出淘汰最旧条目
10
- * - 新命令入栈即清空 redo 栈
11
- */
12
- /** 历史栈容量默认值 */
13
- const DEFAULT_HISTORY_CAPACITY = 200;
14
- var HistoryManager = class {
15
- applyPatch;
16
- capacity;
17
- undoStack = [];
18
- redoStack = [];
19
- /** 事务深度(>0 表示事务进行中) */
20
- transactionDepth = 0;
21
- /** 事务缓冲:commit 时合并为一个 undo 单元 */
22
- transactionBuffer = [];
23
- emitter = new TypedEventEmitter();
24
- constructor(applyPatch, capacity = 200) {
25
- this.applyPatch = applyPatch;
26
- this.capacity = capacity;
27
- }
28
- get canUndo() {
29
- return this.undoStack.length > 0;
30
- }
31
- get canRedo() {
32
- return this.redoStack.length > 0;
33
- }
34
- /** undo 栈深度(调试/测试用) */
35
- get undoSize() {
36
- return this.undoStack.length;
37
- }
38
- /** redo 栈深度(调试/测试用) */
39
- get redoSize() {
40
- return this.redoStack.length;
41
- }
42
- /** 是否处于事务中 */
43
- get inTransaction() {
44
- return this.transactionDepth > 0;
45
- }
46
- /** 命令执行产生的 mutation 入栈(事务中则缓冲);空列表直接忽略 */
47
- push(mutations) {
48
- if (mutations.length === 0) return;
49
- if (this.transactionDepth > 0) {
50
- this.transactionBuffer.push(...mutations);
51
- return;
52
- }
53
- this.pushEntry(mutations);
54
- }
55
- /** 开启事务(可嵌套,拍平到最外层) */
56
- beginTransaction() {
57
- this.transactionDepth++;
58
- }
59
- /** 提交事务:缓冲的 mutation 合并为一个 undo 单元入栈 */
60
- commit() {
61
- if (this.transactionDepth === 0) throw new Error("HistoryManager.commit:没有进行中的事务");
62
- this.transactionDepth--;
63
- if (this.transactionDepth === 0 && this.transactionBuffer.length > 0) {
64
- const entry = this.transactionBuffer;
65
- this.transactionBuffer = [];
66
- this.pushEntry(entry);
67
- }
68
- }
69
- /**
70
- * 回滚事务:逆序应用缓冲区中各 mutation 的 undo 补丁还原模型,
71
- * 丢弃缓冲并结束事务(含嵌套);不动 undo/redo 栈。
72
- */
73
- rollback() {
74
- if (this.transactionDepth === 0) return;
75
- const buffer = this.transactionBuffer;
76
- this.transactionBuffer = [];
77
- this.transactionDepth = 0;
78
- for (let i = buffer.length - 1; i >= 0; i--) for (const patch of buffer[i].undo) this.applyPatch(patch, "undo");
79
- }
80
- /** 撤销一个单元;事务进行中或栈空时返回 false */
81
- undo() {
82
- if (this.transactionDepth > 0) return false;
83
- const entry = this.undoStack.pop();
84
- if (!entry) return false;
85
- for (let i = entry.length - 1; i >= 0; i--) for (const patch of entry[i].undo) this.applyPatch(patch, "undo");
86
- this.redoStack.push(entry);
87
- this.emitChange();
88
- return true;
89
- }
90
- /** 重做一个单元;事务进行中或栈空时返回 false */
91
- redo() {
92
- if (this.transactionDepth > 0) return false;
93
- const entry = this.redoStack.pop();
94
- if (!entry) return false;
95
- for (const mutation of entry) for (const patch of mutation.redo) this.applyPatch(patch, "redo");
96
- this.undoStack.push(entry);
97
- this.emitChange();
98
- return true;
99
- }
100
- /** 清空全部历史(含事务缓冲) */
101
- clear() {
102
- this.undoStack = [];
103
- this.redoStack = [];
104
- this.transactionBuffer = [];
105
- this.transactionDepth = 0;
106
- this.emitChange();
107
- }
108
- onChange(handler) {
109
- return this.emitter.on("change", handler);
110
- }
111
- pushEntry(entry) {
112
- this.undoStack.push(entry);
113
- if (this.undoStack.length > this.capacity) this.undoStack.shift();
114
- this.redoStack = [];
115
- this.emitChange();
116
- }
117
- emitChange() {
118
- this.emitter.emit("change", {
119
- canUndo: this.canUndo,
120
- canRedo: this.canRedo
121
- });
122
- }
123
- };
124
- //#endregion
125
- export { DEFAULT_HISTORY_CAPACITY, HistoryManager };
126
-
127
- //# sourceMappingURL=history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.js","names":[],"sources":["../../../src/core/command/history.ts"],"sourcesContent":["import { TypedEventEmitter } from '../events'\nimport type { Mutation, Patch, PatchDirection } from './types'\n\n/**\n * HistoryManager:undo/redo 栈 + 事务。\n *\n * - 一个 undo 单元 = 一次命令(或一次事务)的全部 Mutation\n * - 事务:beginTransaction / commit,支持嵌套(深度计数,拍平到最外层);\n * rollback 回滚缓冲区中已应用的变更并放弃事务\n * - 容量上限(默认 200):超出淘汰最旧条目\n * - 新命令入栈即清空 redo 栈\n */\n\n/** 历史栈容量默认值 */\nexport const DEFAULT_HISTORY_CAPACITY = 200\n\n/** 历史状态(history-change 事件负载) */\nexport interface HistoryState {\n canUndo: boolean\n canRedo: boolean\n}\n\ntype HistoryEvents = { change: HistoryState }\n\n/** 一个 undo 单元 = 一组 Mutation */\ntype HistoryEntry = Mutation[]\n\nexport class HistoryManager {\n private undoStack: HistoryEntry[] = []\n private redoStack: HistoryEntry[] = []\n /** 事务深度(>0 表示事务进行中) */\n private transactionDepth = 0\n /** 事务缓冲:commit 时合并为一个 undo 单元 */\n private transactionBuffer: Mutation[] = []\n private emitter = new TypedEventEmitter<HistoryEvents>()\n\n constructor(\n /** 补丁应用器(由 Sheet 注入,命令执行与回放共用) */\n private readonly applyPatch: (patch: Patch, direction: PatchDirection) => void,\n private readonly capacity: number = DEFAULT_HISTORY_CAPACITY\n ) {}\n\n get canUndo(): boolean {\n return this.undoStack.length > 0\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0\n }\n\n /** undo 栈深度(调试/测试用) */\n get undoSize(): number {\n return this.undoStack.length\n }\n\n /** redo 栈深度(调试/测试用) */\n get redoSize(): number {\n return this.redoStack.length\n }\n\n /** 是否处于事务中 */\n get inTransaction(): boolean {\n return this.transactionDepth > 0\n }\n\n /** 命令执行产生的 mutation 入栈(事务中则缓冲);空列表直接忽略 */\n push(mutations: Mutation[]): void {\n if (mutations.length === 0) return\n if (this.transactionDepth > 0) {\n this.transactionBuffer.push(...mutations)\n return\n }\n this.pushEntry(mutations)\n }\n\n /** 开启事务(可嵌套,拍平到最外层) */\n beginTransaction(): void {\n this.transactionDepth++\n }\n\n /** 提交事务:缓冲的 mutation 合并为一个 undo 单元入栈 */\n commit(): void {\n if (this.transactionDepth === 0) {\n throw new Error('HistoryManager.commit:没有进行中的事务')\n }\n this.transactionDepth--\n if (this.transactionDepth === 0 && this.transactionBuffer.length > 0) {\n const entry = this.transactionBuffer\n this.transactionBuffer = []\n this.pushEntry(entry)\n }\n }\n\n /**\n * 回滚事务:逆序应用缓冲区中各 mutation 的 undo 补丁还原模型,\n * 丢弃缓冲并结束事务(含嵌套);不动 undo/redo 栈。\n */\n rollback(): void {\n if (this.transactionDepth === 0) return\n const buffer = this.transactionBuffer\n this.transactionBuffer = []\n this.transactionDepth = 0\n for (let i = buffer.length - 1; i >= 0; i--) {\n for (const patch of buffer[i]!.undo) {\n this.applyPatch(patch, 'undo')\n }\n }\n }\n\n /** 撤销一个单元;事务进行中或栈空时返回 false */\n undo(): boolean {\n if (this.transactionDepth > 0) return false\n const entry = this.undoStack.pop()\n if (!entry) return false\n for (let i = entry.length - 1; i >= 0; i--) {\n for (const patch of entry[i]!.undo) {\n this.applyPatch(patch, 'undo')\n }\n }\n this.redoStack.push(entry)\n this.emitChange()\n return true\n }\n\n /** 重做一个单元;事务进行中或栈空时返回 false */\n redo(): boolean {\n if (this.transactionDepth > 0) return false\n const entry = this.redoStack.pop()\n if (!entry) return false\n for (const mutation of entry) {\n for (const patch of mutation.redo) {\n this.applyPatch(patch, 'redo')\n }\n }\n this.undoStack.push(entry)\n this.emitChange()\n return true\n }\n\n /** 清空全部历史(含事务缓冲) */\n clear(): void {\n this.undoStack = []\n this.redoStack = []\n this.transactionBuffer = []\n this.transactionDepth = 0\n this.emitChange()\n }\n\n onChange(handler: (state: HistoryState) => void): () => void {\n return this.emitter.on('change', handler)\n }\n\n private pushEntry(entry: HistoryEntry): void {\n this.undoStack.push(entry)\n if (this.undoStack.length > this.capacity) {\n // 淘汰最旧条目;redo 栈不受影响(淘汰只发生在 undo 栈底部)\n this.undoStack.shift()\n }\n // 新命令清空 redo 栈\n this.redoStack = []\n this.emitChange()\n }\n\n private emitChange(): void {\n this.emitter.emit('change', { canUndo: this.canUndo, canRedo: this.canRedo })\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,MAAa,2BAA2B;AAaxC,IAAa,iBAAb,MAA4B;CAWP;CACA;CAXnB,YAAoC,CAAC;CACrC,YAAoC,CAAC;;CAErC,mBAA2B;;CAE3B,oBAAwC,CAAC;CACzC,UAAkB,IAAI,kBAAiC;CAEvD,YAEE,YACA,WAAiB,KACjB;EAFiB,KAAA,aAAA;EACA,KAAA,WAAA;CAChB;CAEH,IAAI,UAAmB;EACrB,OAAO,KAAK,UAAU,SAAS;CACjC;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,UAAU,SAAS;CACjC;;CAGA,IAAI,WAAmB;EACrB,OAAO,KAAK,UAAU;CACxB;;CAGA,IAAI,WAAmB;EACrB,OAAO,KAAK,UAAU;CACxB;;CAGA,IAAI,gBAAyB;EAC3B,OAAO,KAAK,mBAAmB;CACjC;;CAGA,KAAK,WAA6B;EAChC,IAAI,UAAU,WAAW,GAAG;EAC5B,IAAI,KAAK,mBAAmB,GAAG;GAC7B,KAAK,kBAAkB,KAAK,GAAG,SAAS;GACxC;EACF;EACA,KAAK,UAAU,SAAS;CAC1B;;CAGA,mBAAyB;EACvB,KAAK;CACP;;CAGA,SAAe;EACb,IAAI,KAAK,qBAAqB,GAC5B,MAAM,IAAI,MAAM,gCAAgC;EAElD,KAAK;EACL,IAAI,KAAK,qBAAqB,KAAK,KAAK,kBAAkB,SAAS,GAAG;GACpE,MAAM,QAAQ,KAAK;GACnB,KAAK,oBAAoB,CAAC;GAC1B,KAAK,UAAU,KAAK;EACtB;CACF;;;;;CAMA,WAAiB;EACf,IAAI,KAAK,qBAAqB,GAAG;EACjC,MAAM,SAAS,KAAK;EACpB,KAAK,oBAAoB,CAAC;EAC1B,KAAK,mBAAmB;EACxB,KAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KACtC,KAAK,MAAM,SAAS,OAAO,EAAE,CAAE,MAC7B,KAAK,WAAW,OAAO,MAAM;CAGnC;;CAGA,OAAgB;EACd,IAAI,KAAK,mBAAmB,GAAG,OAAO;EACtC,MAAM,QAAQ,KAAK,UAAU,IAAI;EACjC,IAAI,CAAC,OAAO,OAAO;EACnB,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KACrC,KAAK,MAAM,SAAS,MAAM,EAAE,CAAE,MAC5B,KAAK,WAAW,OAAO,MAAM;EAGjC,KAAK,UAAU,KAAK,KAAK;EACzB,KAAK,WAAW;EAChB,OAAO;CACT;;CAGA,OAAgB;EACd,IAAI,KAAK,mBAAmB,GAAG,OAAO;EACtC,MAAM,QAAQ,KAAK,UAAU,IAAI;EACjC,IAAI,CAAC,OAAO,OAAO;EACnB,KAAK,MAAM,YAAY,OACrB,KAAK,MAAM,SAAS,SAAS,MAC3B,KAAK,WAAW,OAAO,MAAM;EAGjC,KAAK,UAAU,KAAK,KAAK;EACzB,KAAK,WAAW;EAChB,OAAO;CACT;;CAGA,QAAc;EACZ,KAAK,YAAY,CAAC;EAClB,KAAK,YAAY,CAAC;EAClB,KAAK,oBAAoB,CAAC;EAC1B,KAAK,mBAAmB;EACxB,KAAK,WAAW;CAClB;CAEA,SAAS,SAAoD;EAC3D,OAAO,KAAK,QAAQ,GAAG,UAAU,OAAO;CAC1C;CAEA,UAAkB,OAA2B;EAC3C,KAAK,UAAU,KAAK,KAAK;EACzB,IAAI,KAAK,UAAU,SAAS,KAAK,UAE/B,KAAK,UAAU,MAAM;EAGvB,KAAK,YAAY,CAAC;EAClB,KAAK,WAAW;CAClB;CAEA,aAA2B;EACzB,KAAK,QAAQ,KAAK,UAAU;GAAE,SAAS,KAAK;GAAS,SAAS,KAAK;EAAQ,CAAC;CAC9E;AACF"}
@@ -1,21 +0,0 @@
1
- import { CellRange } from "../address.js";
2
- import { Command } from "./types.js";
3
- //#region src/core/command/merge-cells.d.ts
4
- interface MergeCellsParams {
5
- range: CellRange;
6
- }
7
- /**
8
- * 合并命令。Patch 捕获完整 before 状态:
9
- * - 被解除的既有合并记录(undo 时逐一恢复)
10
- * - 包围盒内每一格的原数据(undo 时连被清空的值一起还原)
11
- * 值保留规则同 Excel/univer:行主序第一个有值格的值写入新锚点,其余清空。
12
- */
13
- declare const MergeCellsCommand: Command<MergeCellsParams, CellRange>;
14
- interface UnmergeCellsParams {
15
- range: CellRange;
16
- }
17
- /** 取消合并命令:解除与 range 相交的所有合并;undo 恢复合并记录 */
18
- declare const UnmergeCellsCommand: Command<UnmergeCellsParams>;
19
- //#endregion
20
- export { MergeCellsCommand, MergeCellsParams, UnmergeCellsCommand, UnmergeCellsParams };
21
- //# sourceMappingURL=merge-cells.d.ts.map
@@ -1,74 +0,0 @@
1
- import { iterateRange, rangesIntersect } from "../address.js";
2
- import { cellDataEqual, isEmptyCellData } from "../cell-store.js";
3
- //#region src/core/command/merge-cells.ts
4
- /**
5
- * 合并命令。Patch 捕获完整 before 状态:
6
- * - 被解除的既有合并记录(undo 时逐一恢复)
7
- * - 包围盒内每一格的原数据(undo 时连被清空的值一起还原)
8
- * 值保留规则同 Excel/univer:行主序第一个有值格的值写入新锚点,其余清空。
9
- */
10
- const MergeCellsCommand = {
11
- id: "sheet.command.merge-cells",
12
- handler(ctx, params) {
13
- const { sheet } = ctx;
14
- const { range: finalRange, removed } = sheet.merges.computeMerge(params.range);
15
- const cellPatches = [];
16
- let retained;
17
- let anchorPatch;
18
- for (const addr of iterateRange(finalRange)) {
19
- const before = sheet.store.getCell(addr);
20
- if (before && !retained && !isEmptyCellData(before)) retained = before;
21
- const patch = {
22
- kind: "cell",
23
- addr,
24
- before,
25
- after: void 0
26
- };
27
- if (addr.row === finalRange.start.row && addr.col === finalRange.start.col) anchorPatch = patch;
28
- cellPatches.push(patch);
29
- }
30
- if (retained && anchorPatch) anchorPatch.after = { ...retained };
31
- const patches = [...[...removed.map((range) => ({
32
- kind: "merge",
33
- range,
34
- before: true,
35
- after: false
36
- })), {
37
- kind: "merge",
38
- range: finalRange,
39
- before: false,
40
- after: true
41
- }], ...cellPatches.filter((patch) => !cellDataEqual(patch.before, patch.after))];
42
- for (const patch of patches) ctx.applyPatch(patch, "redo");
43
- return {
44
- mutations: [{
45
- redo: patches,
46
- undo: [...patches].reverse()
47
- }],
48
- result: finalRange
49
- };
50
- }
51
- };
52
- /** 取消合并命令:解除与 range 相交的所有合并;undo 恢复合并记录 */
53
- const UnmergeCellsCommand = {
54
- id: "sheet.command.unmerge-cells",
55
- handler(ctx, params) {
56
- const removed = [];
57
- for (const range of ctx.sheet.merges.getMerges()) if (rangesIntersect(range, params.range)) removed.push({
58
- kind: "merge",
59
- range,
60
- before: true,
61
- after: false
62
- });
63
- if (removed.length === 0) return { mutations: [] };
64
- for (const patch of removed) ctx.applyPatch(patch, "redo");
65
- return { mutations: [{
66
- redo: removed,
67
- undo: [...removed].reverse()
68
- }] };
69
- }
70
- };
71
- //#endregion
72
- export { MergeCellsCommand, UnmergeCellsCommand };
73
-
74
- //# sourceMappingURL=merge-cells.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-cells.js","names":[],"sources":["../../../src/core/command/merge-cells.ts"],"sourcesContent":["import { iterateRange, rangesIntersect, type CellRange } from '../address'\nimport { cellDataEqual, isEmptyCellData, type CellData } from '../cell-store'\nimport type { CellPatch, Command, CommandResult, MergePatch, Patch } from './types'\n\nexport interface MergeCellsParams {\n range: CellRange\n}\n\n/**\n * 合并命令。Patch 捕获完整 before 状态:\n * - 被解除的既有合并记录(undo 时逐一恢复)\n * - 包围盒内每一格的原数据(undo 时连被清空的值一起还原)\n * 值保留规则同 Excel/univer:行主序第一个有值格的值写入新锚点,其余清空。\n */\nexport const MergeCellsCommand: Command<MergeCellsParams, CellRange> = {\n id: 'sheet.command.merge-cells',\n\n handler(ctx, params): CommandResult<CellRange> {\n const { sheet } = ctx\n const { range: finalRange, removed } = sheet.merges.computeMerge(params.range)\n\n // 捕获包围盒内各格 before;同时按行主序找出第一个有值格\n const cellPatches: CellPatch[] = []\n let retained: CellData | undefined\n let anchorPatch: CellPatch | undefined\n for (const addr of iterateRange(finalRange)) {\n const before = sheet.store.getCell(addr)\n if (before && !retained && !isEmptyCellData(before)) retained = before\n const patch: CellPatch = { kind: 'cell', addr, before, after: undefined }\n if (addr.row === finalRange.start.row && addr.col === finalRange.start.col) {\n anchorPatch = patch\n }\n cellPatches.push(patch)\n }\n if (retained && anchorPatch) {\n anchorPatch.after = { ...retained }\n }\n\n const mergePatches: MergePatch[] = [\n ...removed.map((range): MergePatch => ({ kind: 'merge', range, before: true, after: false })),\n { kind: 'merge', range: finalRange, before: false, after: true }\n ]\n\n // 过滤无实际变化的 cell 补丁(如被覆盖格本就为空)\n const patches: Patch[] = [\n ...mergePatches,\n ...cellPatches.filter((patch) => !cellDataEqual(patch.before, patch.after))\n ]\n for (const patch of patches) ctx.applyPatch(patch, 'redo')\n\n return { mutations: [{ redo: patches, undo: [...patches].reverse() }], result: finalRange }\n }\n}\n\nexport interface UnmergeCellsParams {\n range: CellRange\n}\n\n/** 取消合并命令:解除与 range 相交的所有合并;undo 恢复合并记录 */\nexport const UnmergeCellsCommand: Command<UnmergeCellsParams> = {\n id: 'sheet.command.unmerge-cells',\n\n handler(ctx, params): CommandResult {\n const removed: MergePatch[] = []\n for (const range of ctx.sheet.merges.getMerges()) {\n if (rangesIntersect(range, params.range)) {\n removed.push({ kind: 'merge', range, before: true, after: false })\n }\n }\n if (removed.length === 0) return { mutations: [] }\n for (const patch of removed) ctx.applyPatch(patch, 'redo')\n return { mutations: [{ redo: removed, undo: [...removed].reverse() }] }\n }\n}\n"],"mappings":";;;;;;;;;AAcA,MAAa,oBAA0D;CACrE,IAAI;CAEJ,QAAQ,KAAK,QAAkC;EAC7C,MAAM,EAAE,UAAU;EAClB,MAAM,EAAE,OAAO,YAAY,YAAY,MAAM,OAAO,aAAa,OAAO,KAAK;EAG7E,MAAM,cAA2B,CAAC;EAClC,IAAI;EACJ,IAAI;EACJ,KAAK,MAAM,QAAQ,aAAa,UAAU,GAAG;GAC3C,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI;GACvC,IAAI,UAAU,CAAC,YAAY,CAAC,gBAAgB,MAAM,GAAG,WAAW;GAChE,MAAM,QAAmB;IAAE,MAAM;IAAQ;IAAM;IAAQ,OAAO,KAAA;GAAU;GACxE,IAAI,KAAK,QAAQ,WAAW,MAAM,OAAO,KAAK,QAAQ,WAAW,MAAM,KACrE,cAAc;GAEhB,YAAY,KAAK,KAAK;EACxB;EACA,IAAI,YAAY,aACd,YAAY,QAAQ,EAAE,GAAG,SAAS;EASpC,MAAM,UAAmB,CACvB,GAAG,CANH,GAAG,QAAQ,KAAK,WAAuB;GAAE,MAAM;GAAS;GAAO,QAAQ;GAAM,OAAO;EAAM,EAAE,GAC5F;GAAE,MAAM;GAAS,OAAO;GAAY,QAAQ;GAAO,OAAO;EAAK,CAKjD,GACd,GAAG,YAAY,QAAQ,UAAU,CAAC,cAAc,MAAM,QAAQ,MAAM,KAAK,CAAC,CAC5E;EACA,KAAK,MAAM,SAAS,SAAS,IAAI,WAAW,OAAO,MAAM;EAEzD,OAAO;GAAE,WAAW,CAAC;IAAE,MAAM;IAAS,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ;GAAE,CAAC;GAAG,QAAQ;EAAW;CAC5F;AACF;;AAOA,MAAa,sBAAmD;CAC9D,IAAI;CAEJ,QAAQ,KAAK,QAAuB;EAClC,MAAM,UAAwB,CAAC;EAC/B,KAAK,MAAM,SAAS,IAAI,MAAM,OAAO,UAAU,GAC7C,IAAI,gBAAgB,OAAO,OAAO,KAAK,GACrC,QAAQ,KAAK;GAAE,MAAM;GAAS;GAAO,QAAQ;GAAM,OAAO;EAAM,CAAC;EAGrE,IAAI,QAAQ,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC,EAAE;EACjD,KAAK,MAAM,SAAS,SAAS,IAAI,WAAW,OAAO,MAAM;EACzD,OAAO,EAAE,WAAW,CAAC;GAAE,MAAM;GAAS,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ;EAAE,CAAC,EAAE;CACxE;AACF"}
@@ -1,17 +0,0 @@
1
- import { Command, CommandContext, CommandResult } from "./types.js";
2
- //#region src/core/command/registry.d.ts
3
- /**
4
- * 命令注册表:register / execute。
5
- * 命令无状态,可全局共享(见 default-registry);阶段 4 工具扩展可注册自定义命令。
6
- */
7
- declare class CommandRegistry {
8
- private commands;
9
- /** 注册命令;同 id 重复注册视为错误 */
10
- register(command: Command): void;
11
- get(id: string): Command | undefined;
12
- /** 执行命令;未注册的 id 抛错 */
13
- execute<R>(ctx: CommandContext, id: string, params: unknown): CommandResult<R> | undefined;
14
- }
15
- //#endregion
16
- export { CommandRegistry };
17
- //# sourceMappingURL=registry.d.ts.map
@@ -1,26 +0,0 @@
1
- //#region src/core/command/registry.ts
2
- /**
3
- * 命令注册表:register / execute。
4
- * 命令无状态,可全局共享(见 default-registry);阶段 4 工具扩展可注册自定义命令。
5
- */
6
- var CommandRegistry = class {
7
- commands = /* @__PURE__ */ new Map();
8
- /** 注册命令;同 id 重复注册视为错误 */
9
- register(command) {
10
- if (this.commands.has(command.id)) throw new Error(`命令重复注册: ${command.id}`);
11
- this.commands.set(command.id, command);
12
- }
13
- get(id) {
14
- return this.commands.get(id);
15
- }
16
- /** 执行命令;未注册的 id 抛错 */
17
- execute(ctx, id, params) {
18
- const command = this.commands.get(id);
19
- if (!command) throw new Error(`命令未注册: ${id}`);
20
- return command.handler(ctx, params);
21
- }
22
- };
23
- //#endregion
24
- export { CommandRegistry };
25
-
26
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../../src/core/command/registry.ts"],"sourcesContent":["import type { Command, CommandContext, CommandResult } from './types'\n\n/**\n * 命令注册表:register / execute。\n * 命令无状态,可全局共享(见 default-registry);阶段 4 工具扩展可注册自定义命令。\n */\nexport class CommandRegistry {\n private commands = new Map<string, Command>()\n\n /** 注册命令;同 id 重复注册视为错误 */\n register(command: Command): void {\n if (this.commands.has(command.id)) {\n throw new Error(`命令重复注册: ${command.id}`)\n }\n this.commands.set(command.id, command)\n }\n\n get(id: string): Command | undefined {\n return this.commands.get(id)\n }\n\n /** 执行命令;未注册的 id 抛错 */\n execute<R>(ctx: CommandContext, id: string, params: unknown): CommandResult<R> | undefined {\n const command = this.commands.get(id)\n if (!command) {\n throw new Error(`命令未注册: ${id}`)\n }\n return command.handler(ctx, params) as CommandResult<R> | undefined\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,kBAAb,MAA6B;CAC3B,2BAAmB,IAAI,IAAqB;;CAG5C,SAAS,SAAwB;EAC/B,IAAI,KAAK,SAAS,IAAI,QAAQ,EAAE,GAC9B,MAAM,IAAI,MAAM,WAAW,QAAQ,IAAI;EAEzC,KAAK,SAAS,IAAI,QAAQ,IAAI,OAAO;CACvC;CAEA,IAAI,IAAiC;EACnC,OAAO,KAAK,SAAS,IAAI,EAAE;CAC7B;;CAGA,QAAW,KAAqB,IAAY,QAA+C;EACzF,MAAM,UAAU,KAAK,SAAS,IAAI,EAAE;EACpC,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,UAAU,IAAI;EAEhC,OAAO,QAAQ,QAAQ,KAAK,MAAM;CACpC;AACF"}
@@ -1,17 +0,0 @@
1
- import { CellAddress } from "../address.js";
2
- import { Command } from "./types.js";
3
- //#region src/core/command/set-cell-formula.d.ts
4
- interface SetCellFormulaParams {
5
- addr: CellAddress;
6
- /** 公式文本(不含 '=') */
7
- formula: string;
8
- }
9
- /**
10
- * 公式写入命令:只登记公式原文(f);计算缓存(v/t)由命令执行后的
11
- * 增量重算以派生补丁填充(见 Sheet.executeCommand),重算波及的所有变更
12
- * 与源补丁并入同一 undo 单元。
13
- */
14
- declare const SetCellFormulaCommand: Command<SetCellFormulaParams>;
15
- //#endregion
16
- export { SetCellFormulaCommand, SetCellFormulaParams };
17
- //# sourceMappingURL=set-cell-formula.d.ts.map
@@ -1,29 +0,0 @@
1
- //#region src/core/command/set-cell-formula.ts
2
- /**
3
- * 公式写入命令:只登记公式原文(f);计算缓存(v/t)由命令执行后的
4
- * 增量重算以派生补丁填充(见 Sheet.executeCommand),重算波及的所有变更
5
- * 与源补丁并入同一 undo 单元。
6
- */
7
- const SetCellFormulaCommand = {
8
- id: "sheet.command.set-cell-formula",
9
- handler(ctx, params) {
10
- const anchor = ctx.sheet.merges.resolveAnchor(params.addr);
11
- const before = ctx.sheet.store.getCell(anchor);
12
- if (before?.f === params.formula) return { mutations: [] };
13
- const patch = {
14
- kind: "cell",
15
- addr: anchor,
16
- before,
17
- after: { f: params.formula }
18
- };
19
- ctx.applyPatch(patch, "redo");
20
- return { mutations: [{
21
- redo: [patch],
22
- undo: [patch]
23
- }] };
24
- }
25
- };
26
- //#endregion
27
- export { SetCellFormulaCommand };
28
-
29
- //# sourceMappingURL=set-cell-formula.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set-cell-formula.js","names":[],"sources":["../../../src/core/command/set-cell-formula.ts"],"sourcesContent":["import type { CellAddress } from '../address'\nimport type { CellData } from '../cell-store'\nimport type { CellPatch, Command, CommandResult } from './types'\n\nexport interface SetCellFormulaParams {\n addr: CellAddress\n /** 公式文本(不含 '=') */\n formula: string\n}\n\n/**\n * 公式写入命令:只登记公式原文(f);计算缓存(v/t)由命令执行后的\n * 增量重算以派生补丁填充(见 Sheet.executeCommand),重算波及的所有变更\n * 与源补丁并入同一 undo 单元。\n */\nexport const SetCellFormulaCommand: Command<SetCellFormulaParams> = {\n id: 'sheet.command.set-cell-formula',\n\n handler(ctx, params): CommandResult {\n const anchor = ctx.sheet.merges.resolveAnchor(params.addr)\n const before = ctx.sheet.store.getCell(anchor)\n // 同公式重复输入 = 无实际变更,不入历史\n if (before?.f === params.formula) return { mutations: [] }\n const after: CellData = { f: params.formula }\n const patch: CellPatch = { kind: 'cell', addr: anchor, before, after }\n ctx.applyPatch(patch, 'redo')\n return { mutations: [{ redo: [patch], undo: [patch] }] }\n }\n}\n"],"mappings":";;;;;;AAeA,MAAa,wBAAuD;CAClE,IAAI;CAEJ,QAAQ,KAAK,QAAuB;EAClC,MAAM,SAAS,IAAI,MAAM,OAAO,cAAc,OAAO,IAAI;EACzD,MAAM,SAAS,IAAI,MAAM,MAAM,QAAQ,MAAM;EAE7C,IAAI,QAAQ,MAAM,OAAO,SAAS,OAAO,EAAE,WAAW,CAAC,EAAE;EAEzD,MAAM,QAAmB;GAAE,MAAM;GAAQ,MAAM;GAAQ;GAAQ,OAAA,EADrC,GAAG,OAAO,QAC+B;EAAE;EACrE,IAAI,WAAW,OAAO,MAAM;EAC5B,OAAO,EAAE,WAAW,CAAC;GAAE,MAAM,CAAC,KAAK;GAAG,MAAM,CAAC,KAAK;EAAE,CAAC,EAAE;CACzD;AACF"}
@@ -1,22 +0,0 @@
1
- import { CellAddress } from "../address.js";
2
- import { CellData } from "../cell-store.js";
3
- import { Command } from "./types.js";
4
- //#region src/core/command/set-cell-value.d.ts
5
- /** SetCellValueCommand 的批量写入项 */
6
- interface SetCellValueItem {
7
- addr: CellAddress;
8
- /** 目标数据;空数据(无公式且 v 为 null/undefined/'')= 清除 */
9
- data?: CellData;
10
- }
11
- interface SetCellValueParams {
12
- /** 批量写入(供粘贴/填充复用);一次调用 = 一个 undo 单元 */
13
- items: SetCellValueItem[];
14
- }
15
- /**
16
- * 单元格写入命令:逐项解析锚点、捕获 before/after 差量并立即应用。
17
- * 与 before 相等的项跳过(不产生补丁);全部无变化时不入历史。
18
- */
19
- declare const SetCellValueCommand: Command<SetCellValueParams>;
20
- //#endregion
21
- export { SetCellValueCommand, SetCellValueItem, SetCellValueParams };
22
- //# sourceMappingURL=set-cell-value.d.ts.map
@@ -1,35 +0,0 @@
1
- import { cellDataEqual, isEmptyCellData } from "../cell-store.js";
2
- //#region src/core/command/set-cell-value.ts
3
- /**
4
- * 单元格写入命令:逐项解析锚点、捕获 before/after 差量并立即应用。
5
- * 与 before 相等的项跳过(不产生补丁);全部无变化时不入历史。
6
- */
7
- const SetCellValueCommand = {
8
- id: "sheet.command.set-cell-value",
9
- handler(ctx, params) {
10
- const patches = [];
11
- for (const item of params.items) {
12
- const anchor = ctx.sheet.merges.resolveAnchor(item.addr);
13
- const before = ctx.sheet.store.getCell(anchor);
14
- const after = isEmptyCellData(item.data) ? void 0 : item.data;
15
- if (cellDataEqual(before, after)) continue;
16
- const patch = {
17
- kind: "cell",
18
- addr: anchor,
19
- before,
20
- after
21
- };
22
- ctx.applyPatch(patch, "redo");
23
- patches.push(patch);
24
- }
25
- if (patches.length === 0) return { mutations: [] };
26
- return { mutations: [{
27
- redo: patches,
28
- undo: [...patches].reverse()
29
- }] };
30
- }
31
- };
32
- //#endregion
33
- export { SetCellValueCommand };
34
-
35
- //# sourceMappingURL=set-cell-value.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set-cell-value.js","names":[],"sources":["../../../src/core/command/set-cell-value.ts"],"sourcesContent":["import type { CellAddress } from '../address'\nimport { cellDataEqual, isEmptyCellData, type CellData } from '../cell-store'\nimport type { CellPatch, Command, CommandResult } from './types'\n\n/** SetCellValueCommand 的批量写入项 */\nexport interface SetCellValueItem {\n addr: CellAddress\n /** 目标数据;空数据(无公式且 v 为 null/undefined/'')= 清除 */\n data?: CellData\n}\n\nexport interface SetCellValueParams {\n /** 批量写入(供粘贴/填充复用);一次调用 = 一个 undo 单元 */\n items: SetCellValueItem[]\n}\n\n/**\n * 单元格写入命令:逐项解析锚点、捕获 before/after 差量并立即应用。\n * 与 before 相等的项跳过(不产生补丁);全部无变化时不入历史。\n */\nexport const SetCellValueCommand: Command<SetCellValueParams> = {\n id: 'sheet.command.set-cell-value',\n\n handler(ctx, params): CommandResult {\n const patches: CellPatch[] = []\n for (const item of params.items) {\n const anchor = ctx.sheet.merges.resolveAnchor(item.addr)\n const before = ctx.sheet.store.getCell(anchor)\n const after = isEmptyCellData(item.data) ? undefined : item.data\n if (cellDataEqual(before, after)) continue\n const patch: CellPatch = { kind: 'cell', addr: anchor, before, after }\n ctx.applyPatch(patch, 'redo')\n patches.push(patch)\n }\n if (patches.length === 0) return { mutations: [] }\n return { mutations: [{ redo: patches, undo: [...patches].reverse() }] }\n }\n}\n"],"mappings":";;;;;;AAoBA,MAAa,sBAAmD;CAC9D,IAAI;CAEJ,QAAQ,KAAK,QAAuB;EAClC,MAAM,UAAuB,CAAC;EAC9B,KAAK,MAAM,QAAQ,OAAO,OAAO;GAC/B,MAAM,SAAS,IAAI,MAAM,OAAO,cAAc,KAAK,IAAI;GACvD,MAAM,SAAS,IAAI,MAAM,MAAM,QAAQ,MAAM;GAC7C,MAAM,QAAQ,gBAAgB,KAAK,IAAI,IAAI,KAAA,IAAY,KAAK;GAC5D,IAAI,cAAc,QAAQ,KAAK,GAAG;GAClC,MAAM,QAAmB;IAAE,MAAM;IAAQ,MAAM;IAAQ;IAAQ;GAAM;GACrE,IAAI,WAAW,OAAO,MAAM;GAC5B,QAAQ,KAAK,KAAK;EACpB;EACA,IAAI,QAAQ,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC,EAAE;EACjD,OAAO,EAAE,WAAW,CAAC;GAAE,MAAM;GAAS,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ;EAAE,CAAC,EAAE;CACxE;AACF"}
@@ -1,68 +0,0 @@
1
- import { CellAddress, CellRange } from "../address.js";
2
- import { CellData } from "../cell-store.js";
3
- import { Sheet } from "../sheet.js";
4
- //#region src/core/command/types.d.ts
5
- /**
6
- * 命令系统类型定义(决策 5:命令 + 逆操作补丁)。
7
- *
8
- * - 一切模型变更都是 Command,执行时产出 Mutation
9
- * - Patch 是受影响单元格 / 合并记录的 before/after 差量,不是全量快照
10
- * - 同一批 Patch 双向回放:redo 方向应用 after,undo 方向应用 before
11
- */
12
- /** 补丁回放方向 */
13
- type PatchDirection = 'undo' | 'redo';
14
- /** 单元格数据差量补丁(原始存储语义;undefined = 该侧无此格) */
15
- interface CellPatch {
16
- kind: 'cell';
17
- addr: CellAddress;
18
- /**
19
- * 目标 sheet(跨表公式重算的派生补丁会落在其它 sheet 上);
20
- * 缺省 = 命令所在 sheet。回放时按此字段路由到目标 sheet 的变更通道。
21
- */
22
- sheet?: Sheet;
23
- /** 变更前的数据(undefined = 原本为空格) */
24
- before?: CellData;
25
- /** 变更后的数据(undefined = 变更后为空格) */
26
- after?: CellData;
27
- }
28
- /** 合并记录差量补丁(before/after = 该侧是否存在此合并) */
29
- interface MergePatch {
30
- kind: 'merge';
31
- range: CellRange;
32
- before: boolean;
33
- after: boolean;
34
- }
35
- type Patch = CellPatch | MergePatch;
36
- /**
37
- * 一次命令执行产生的变更单元。
38
- * `redo` 按列表顺序应用;`undo` 取同一批补丁的逆序(命令实现负责构造,
39
- * 保证 undo 先撤销后登记的副作用,例如先移除新合并再恢复旧合并)。
40
- */
41
- interface Mutation {
42
- redo: Patch[];
43
- undo: Patch[];
44
- }
45
- /** 命令执行结果 */
46
- interface CommandResult<R = unknown> {
47
- /** 产生的 mutation 列表(空数组 = 无实际变更,不入历史) */
48
- mutations: Mutation[];
49
- /** 命令附带返回值(如 MergeCellsCommand 返回最终生效区域) */
50
- result?: R;
51
- }
52
- /** 命令执行上下文 */
53
- interface CommandContext {
54
- sheet: Sheet;
55
- /**
56
- * 应用单个补丁。命令 handler 执行时对 redo 补丁逐项调用;
57
- * HistoryManager 回放 undo/redo 亦走此路径,保证只有一条变更通道。
58
- */
59
- applyPatch(patch: Patch, direction: PatchDirection): void;
60
- }
61
- /** 命令:id + handler */
62
- interface Command<P = unknown, R = unknown> {
63
- readonly id: string;
64
- handler(ctx: CommandContext, params: P): CommandResult<R> | undefined;
65
- }
66
- //#endregion
67
- export { CellPatch, Command, CommandContext, CommandResult, MergePatch, Mutation, Patch, PatchDirection };
68
- //# sourceMappingURL=types.d.ts.map
@@ -1,29 +0,0 @@
1
- //#region src/core/events.ts
2
- var TypedEventEmitter = class {
3
- handlers = /* @__PURE__ */ new Map();
4
- /** 订阅事件,返回取消订阅函数 */
5
- on(type, handler) {
6
- let set = this.handlers.get(type);
7
- if (!set) {
8
- set = /* @__PURE__ */ new Set();
9
- this.handlers.set(type, set);
10
- }
11
- set.add(handler);
12
- return () => this.off(type, handler);
13
- }
14
- off(type, handler) {
15
- this.handlers.get(type)?.delete(handler);
16
- }
17
- emit(type, payload) {
18
- const set = this.handlers.get(type);
19
- if (!set) return;
20
- for (const handler of set) handler(payload);
21
- }
22
- clear() {
23
- this.handlers.clear();
24
- }
25
- };
26
- //#endregion
27
- export { TypedEventEmitter };
28
-
29
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../src/core/events.ts"],"sourcesContent":["/**\n * 包内轻量类型化事件发射器(core 内部基建,不对外导出实现细节)。\n */\n\nexport type EventHandler<T> = (payload: T) => void\n\nexport class TypedEventEmitter<EventMap extends Record<string, unknown>> {\n private handlers = new Map<keyof EventMap, Set<EventHandler<EventMap[keyof EventMap]>>>()\n\n /** 订阅事件,返回取消订阅函数 */\n on<K extends keyof EventMap>(type: K, handler: EventHandler<EventMap[K]>): () => void {\n let set = this.handlers.get(type)\n if (!set) {\n set = new Set()\n this.handlers.set(type, set)\n }\n set.add(handler as EventHandler<EventMap[keyof EventMap]>)\n return () => this.off(type, handler)\n }\n\n off<K extends keyof EventMap>(type: K, handler: EventHandler<EventMap[K]>): void {\n this.handlers.get(type)?.delete(handler as EventHandler<EventMap[keyof EventMap]>)\n }\n\n emit<K extends keyof EventMap>(type: K, payload: EventMap[K]): void {\n const set = this.handlers.get(type)\n if (!set) return\n // Set 迭代天然容忍遍历中取消订阅\n for (const handler of set) {\n ;(handler as EventHandler<EventMap[K]>)(payload)\n }\n }\n\n clear(): void {\n this.handlers.clear()\n }\n}\n"],"mappings":";AAMA,IAAa,oBAAb,MAAyE;CACvE,2BAAmB,IAAI,IAAiE;;CAGxF,GAA6B,MAAS,SAAgD;EACpF,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI;EAChC,IAAI,CAAC,KAAK;GACR,sBAAM,IAAI,IAAI;GACd,KAAK,SAAS,IAAI,MAAM,GAAG;EAC7B;EACA,IAAI,IAAI,OAAiD;EACzD,aAAa,KAAK,IAAI,MAAM,OAAO;CACrC;CAEA,IAA8B,MAAS,SAA0C;EAC/E,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,OAAO,OAAiD;CACnF;CAEA,KAA+B,MAAS,SAA4B;EAClE,MAAM,MAAM,KAAK,SAAS,IAAI,IAAI;EAClC,IAAI,CAAC,KAAK;EAEV,KAAK,MAAM,WAAW,KACnB,QAAuC,OAAO;CAEnD;CAEA,QAAc;EACZ,KAAK,SAAS,MAAM;CACtB;AACF"}