@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
@@ -0,0 +1,343 @@
1
+ import _sfc_main$1 from "../sheet/sheet.js";
2
+ import { resolveGridDropAddress } from "./designer/cell-coords.js";
3
+ import { applyGridColWidths, readGridColWidths } from "./designer/col-widths.js";
4
+ import _sfc_main$2 from "./report-viewer.js";
5
+ import _sfc_main$3 from "./designer-hub.js";
6
+ import _sfc_main$4 from "./designer/drop-highlight-overlay.js";
7
+ import _sfc_main$5 from "./designer/float-panel.js";
8
+ import _sfc_main$6 from "./designer/rules-dialog.js";
9
+ import _sfc_main$7 from "./designer/topology-overlay.js";
10
+ import { FIELD_DRAG_MIME, parseFieldDragPayload } from "./field-panel-helpers.js";
11
+ import _sfc_main$8 from "./field-panel.js";
12
+ import { useReportDesigner } from "./use-report-designer.js";
13
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, shallowRef, unref, useTemplateRef, watch, withCtx } from "vue";
14
+ import { UButton, UDrawer } from "@veltra/desktop";
15
+ import { bem } from "@veltra/utils";
16
+ import { Workbook } from "@veltra/sheet-core";
17
+ //#region src/components/report/report-designer.vue
18
+ const DESIGN_ROWS = 24;
19
+ const DESIGN_COLS = 10;
20
+ const _sfc_main = /*@__PURE__*/ defineComponent({
21
+ name: "UReportDesigner",
22
+ __name: "report-designer",
23
+ props: {
24
+ connector: {},
25
+ connections: { default: () => [] },
26
+ template: {},
27
+ workbook: {}
28
+ },
29
+ emits: ["update:connections"],
30
+ setup(__props, { expose: __expose, emit: __emit }) {
31
+ const props = __props;
32
+ const emit = __emit;
33
+ const cls = bem("report-designer");
34
+ /** 设计态网格尺寸(列宽捕获范围与之一致) */
35
+ const EMPTY_CONDITIONAL_RULES = [];
36
+ /** `v-model:connections` 可写代理(连接为纯序列化对象,仅驻留内存) */
37
+ const connections = computed({
38
+ get: () => props.connections,
39
+ set: (value) => emit("update:connections", value)
40
+ });
41
+ const designer = useReportDesigner({
42
+ props,
43
+ connections
44
+ });
45
+ const { workbook, catalog, boundKeys, activeCell, selectionLabel, activeBinding, activeFieldType, activeDatasetFields, resolvedRowParentLabel, resolvedColParentLabel, parentPick, rowParentCandidates, colParentCandidates, bindingEntries, metaTick, getBindingAt, resolveFieldLabel, bindField, patchActiveBinding, startParentPick, cancelParentPick, pickParentAt, clearParent, removeActiveBinding, resolveCellStyle, resolveCellRenderer, getTemplate } = designer;
46
+ const hubVisible = ref(false);
47
+ const rulesDialogVisible = ref(false);
48
+ const sheetRef = useTemplateRef("sheetRef");
49
+ const previewViewerRef = useTemplateRef("previewViewerRef");
50
+ const gridHostRef = useTemplateRef("gridHostRef");
51
+ const gridHostEl = computed(() => gridHostRef.value ?? null);
52
+ /** 字段拖拽落点高亮(dragover 时更新;落空时 overlay 提示回退当前选区) */
53
+ const isFieldDragging = ref(false);
54
+ const dropTargetAddr = ref(null);
55
+ function getDesignGrid() {
56
+ return sheetRef.value?.getGrid();
57
+ }
58
+ const viewMode = ref("design");
59
+ const isPreview = computed(() => viewMode.value === "preview");
60
+ /** 进入预览时的模板快照(getTemplate 吐出,设计态工作簿不受预览取数影响,切回绑定不丢) */
61
+ const previewTemplate = shallowRef(null);
62
+ /** 预览工作簿自持(XLSX 导出需要拿到填充后的 sheet,05 票 workbook? prop 先例) */
63
+ const previewWorkbook = new Workbook();
64
+ /** 当前设计态列宽(sheet-core 列宽未进快照,经 VTable 运行时捕获;导出随快照写宽) */
65
+ const designColWidths = ref([]);
66
+ const exporting = ref(false);
67
+ /** 从当前设计网格捕获列宽(网格未就绪则保留旧值) */
68
+ function captureDesignColWidths() {
69
+ const widths = readGridColWidths(getDesignGrid(), Array.from({ length: DESIGN_COLS }, (_, col) => col));
70
+ if (widths) designColWidths.value = widths;
71
+ }
72
+ /** 设计网格重建后补刷新与列宽(restore 不发 content-reset 的场景由 grid 自行订阅,这里只管列宽) */
73
+ function syncDesignGridView() {
74
+ const grid = getDesignGrid();
75
+ grid?.flushPending();
76
+ grid?.refresh();
77
+ applyGridColWidths(grid, designColWidths.value);
78
+ }
79
+ function setViewMode(mode) {
80
+ if (viewMode.value === mode) return;
81
+ if (mode === "preview") {
82
+ captureDesignColWidths();
83
+ previewTemplate.value = getTemplate();
84
+ }
85
+ viewMode.value = mode;
86
+ if (mode === "design") nextTick(syncDesignGridView);
87
+ }
88
+ watch(() => props.template, () => {
89
+ viewMode.value = "design";
90
+ });
91
+ watch(activeCell, (cell) => {
92
+ if (cell && parentPick.value) pickParentAt(cell);
93
+ });
94
+ watch(catalog, () => {
95
+ nextTick(() => getDesignGrid()?.refresh());
96
+ });
97
+ async function exportPreviewXlsx() {
98
+ if (!isPreview.value || exporting.value) return;
99
+ const viewer = previewViewerRef.value;
100
+ if (!viewer) throw new Error("预览查看器尚未就绪,请稍后再导出");
101
+ exporting.value = true;
102
+ try {
103
+ await viewer.exportXlsx();
104
+ } finally {
105
+ exporting.value = false;
106
+ }
107
+ }
108
+ function saveConditionalRules(rules) {
109
+ patchActiveBinding({ conditionalRules: rules });
110
+ }
111
+ function clearDropState() {
112
+ isFieldDragging.value = false;
113
+ dropTargetAddr.value = null;
114
+ }
115
+ function resolveDropAddress(event) {
116
+ const grid = getDesignGrid();
117
+ const gridEl = gridHostRef.value?.querySelector(".u-sheet__grid-instance");
118
+ if (!grid || !gridEl) return null;
119
+ return resolveGridDropAddress(grid, gridEl, event.clientX, event.clientY);
120
+ }
121
+ function onGridDragOver(event) {
122
+ if (!event.dataTransfer?.types.includes("application/x-sheet-report-field")) return;
123
+ event.preventDefault();
124
+ event.dataTransfer.dropEffect = "copy";
125
+ isFieldDragging.value = true;
126
+ dropTargetAddr.value = resolveDropAddress(event);
127
+ }
128
+ function onGridDragLeave(event) {
129
+ const host = gridHostRef.value;
130
+ const related = event.relatedTarget;
131
+ if (host && related instanceof Node && host.contains(related)) return;
132
+ clearDropState();
133
+ }
134
+ function onGridDrop(event) {
135
+ event.preventDefault();
136
+ clearDropState();
137
+ const raw = event.dataTransfer?.getData(FIELD_DRAG_MIME);
138
+ const payload = raw ? parseFieldDragPayload(raw) : null;
139
+ if (!payload) return;
140
+ const grid = getDesignGrid();
141
+ const gridEl = gridHostRef.value?.querySelector(".u-sheet__grid-instance");
142
+ if (!grid || !gridEl) return;
143
+ const dropAddr = resolveDropAddress(event);
144
+ if (dropAddr) {
145
+ bindField(payload.datasetId, payload.fieldName, dropAddr);
146
+ sheetRef.value?.getContext().selectCell(dropAddr);
147
+ } else bindField(payload.datasetId, payload.fieldName);
148
+ }
149
+ __expose({ getTemplate });
150
+ return (_ctx, _cache) => {
151
+ return openBlock(), createElementBlock("div", { class: normalizeClass(unref(cls).b) }, [
152
+ createElementVNode("div", { class: normalizeClass(unref(cls).e("toolbar")) }, [
153
+ createVNode(unref(UButton), {
154
+ size: "small",
155
+ plain: "",
156
+ onClick: _cache[0] || (_cache[0] = ($event) => hubVisible.value = true)
157
+ }, {
158
+ default: withCtx(() => [..._cache[7] || (_cache[7] = [createTextVNode("数据中枢", -1)])]),
159
+ _: 1
160
+ }),
161
+ createElementVNode("div", {
162
+ class: normalizeClass(unref(cls).e("mode-toggle")),
163
+ role: "group",
164
+ "aria-label": "视图模式"
165
+ }, [createVNode(unref(UButton), {
166
+ size: "small",
167
+ type: !isPreview.value ? "primary" : void 0,
168
+ plain: isPreview.value,
169
+ onClick: _cache[1] || (_cache[1] = ($event) => setViewMode("design"))
170
+ }, {
171
+ default: withCtx(() => [..._cache[8] || (_cache[8] = [createTextVNode(" 设计模式 ", -1)])]),
172
+ _: 1
173
+ }, 8, ["type", "plain"]), createVNode(unref(UButton), {
174
+ size: "small",
175
+ type: isPreview.value ? "primary" : void 0,
176
+ plain: !isPreview.value,
177
+ onClick: _cache[2] || (_cache[2] = ($event) => setViewMode("preview"))
178
+ }, {
179
+ default: withCtx(() => [..._cache[9] || (_cache[9] = [createTextVNode(" 预览模式 ", -1)])]),
180
+ _: 1
181
+ }, 8, ["type", "plain"])], 2),
182
+ isPreview.value ? (openBlock(), createBlock(unref(UButton), {
183
+ key: 0,
184
+ size: "small",
185
+ type: "primary",
186
+ plain: "",
187
+ loading: exporting.value,
188
+ onClick: exportPreviewXlsx
189
+ }, {
190
+ default: withCtx(() => [..._cache[10] || (_cache[10] = [createTextVNode(" 导出 XLSX ", -1)])]),
191
+ _: 1
192
+ }, 8, ["loading"])) : createCommentVNode("v-if", true),
193
+ createElementVNode("span", { class: normalizeClass(unref(cls).e("hint")) }, " 在数据中枢配置连接与 SQL 数据集,再将左侧字段点击或拖拽到单元格完成绑定;选中已绑定格可通过悬浮卡片调整角色、聚合与条件样式。 ", 2)
194
+ ], 2),
195
+ !isPreview.value ? (openBlock(), createElementBlock("div", {
196
+ key: 0,
197
+ class: normalizeClass(unref(cls).e("body"))
198
+ }, [createVNode(_sfc_main$8, {
199
+ class: normalizeClass(unref(cls).e("field-panel")),
200
+ datasets: unref(catalog),
201
+ "selection-label": unref(selectionLabel),
202
+ "bound-keys": unref(boundKeys),
203
+ onBind: unref(bindField)
204
+ }, null, 8, [
205
+ "class",
206
+ "datasets",
207
+ "selection-label",
208
+ "bound-keys",
209
+ "onBind"
210
+ ]), createElementVNode("div", {
211
+ ref_key: "gridHostRef",
212
+ ref: gridHostRef,
213
+ class: normalizeClass(unref(cls).e("grid")),
214
+ onDragover: onGridDragOver,
215
+ onDragleave: onGridDragLeave,
216
+ onDrop: onGridDrop
217
+ }, [
218
+ createVNode(unref(_sfc_main$1), {
219
+ ref_key: "sheetRef",
220
+ ref: sheetRef,
221
+ class: normalizeClass(unref(cls).e("sheet")),
222
+ workbook: unref(workbook),
223
+ rows: DESIGN_ROWS,
224
+ cols: DESIGN_COLS,
225
+ "show-tabs": false,
226
+ "resolve-cell-style": unref(resolveCellStyle),
227
+ "resolve-cell-renderer": unref(resolveCellRenderer)
228
+ }, null, 8, [
229
+ "class",
230
+ "workbook",
231
+ "resolve-cell-style",
232
+ "resolve-cell-renderer"
233
+ ]),
234
+ createVNode(_sfc_main$7, {
235
+ cell: unref(activeCell),
236
+ binding: unref(activeBinding) ?? null,
237
+ entries: unref(bindingEntries),
238
+ "meta-tick": unref(metaTick),
239
+ "host-el": gridHostEl.value,
240
+ "get-grid": getDesignGrid,
241
+ "get-binding-at": unref(getBindingAt)
242
+ }, null, 8, [
243
+ "cell",
244
+ "binding",
245
+ "entries",
246
+ "meta-tick",
247
+ "host-el",
248
+ "get-binding-at"
249
+ ]),
250
+ createVNode(_sfc_main$4, {
251
+ cell: dropTargetAddr.value,
252
+ "host-el": gridHostEl.value,
253
+ "get-grid": getDesignGrid,
254
+ dragging: isFieldDragging.value,
255
+ "fallback-label": unref(selectionLabel)
256
+ }, null, 8, [
257
+ "cell",
258
+ "host-el",
259
+ "dragging",
260
+ "fallback-label"
261
+ ]),
262
+ createVNode(_sfc_main$5, {
263
+ cell: unref(activeCell),
264
+ binding: unref(activeBinding) ?? null,
265
+ "resolved-row-parent-label": unref(resolvedRowParentLabel),
266
+ "resolved-col-parent-label": unref(resolvedColParentLabel),
267
+ "parent-pick-mode": unref(parentPick)?.mode ?? null,
268
+ "row-parent-candidates": unref(rowParentCandidates),
269
+ "col-parent-candidates": unref(colParentCandidates),
270
+ "resolve-field-label": unref(resolveFieldLabel),
271
+ "host-el": gridHostEl.value,
272
+ "get-grid": getDesignGrid,
273
+ onPatch: unref(patchActiveBinding),
274
+ onRemove: unref(removeActiveBinding),
275
+ onOpenRules: _cache[3] || (_cache[3] = ($event) => rulesDialogVisible.value = true),
276
+ onStartParentPick: unref(startParentPick),
277
+ onCancelParentPick: unref(cancelParentPick),
278
+ onClearParent: unref(clearParent)
279
+ }, null, 8, [
280
+ "cell",
281
+ "binding",
282
+ "resolved-row-parent-label",
283
+ "resolved-col-parent-label",
284
+ "parent-pick-mode",
285
+ "row-parent-candidates",
286
+ "col-parent-candidates",
287
+ "resolve-field-label",
288
+ "host-el",
289
+ "onPatch",
290
+ "onRemove",
291
+ "onStartParentPick",
292
+ "onCancelParentPick",
293
+ "onClearParent"
294
+ ])
295
+ ], 34)], 2)) : previewTemplate.value ? (openBlock(), createElementBlock("div", {
296
+ key: 1,
297
+ class: normalizeClass(unref(cls).e("preview"))
298
+ }, [createVNode(_sfc_main$2, {
299
+ ref_key: "previewViewerRef",
300
+ ref: previewViewerRef,
301
+ connector: props.connector,
302
+ template: previewTemplate.value,
303
+ workbook: unref(previewWorkbook),
304
+ "col-widths": designColWidths.value
305
+ }, null, 8, [
306
+ "connector",
307
+ "template",
308
+ "workbook",
309
+ "col-widths"
310
+ ])], 2)) : createCommentVNode("v-if", true),
311
+ createVNode(unref(UDrawer), {
312
+ modelValue: hubVisible.value,
313
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => hubVisible.value = $event),
314
+ class: normalizeClass(unref(cls).e("hub-drawer")),
315
+ "show-close": ""
316
+ }, {
317
+ default: withCtx(() => [createVNode(_sfc_main$3, {
318
+ hub: unref(designer),
319
+ onClose: _cache[4] || (_cache[4] = ($event) => hubVisible.value = false)
320
+ }, null, 8, ["hub"])]),
321
+ _: 1
322
+ }, 8, ["modelValue", "class"]),
323
+ createVNode(_sfc_main$6, {
324
+ modelValue: rulesDialogVisible.value,
325
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => rulesDialogVisible.value = $event),
326
+ rules: unref(activeBinding)?.conditionalRules ?? EMPTY_CONDITIONAL_RULES,
327
+ "binding-field": unref(activeBinding)?.field ?? "",
328
+ "dataset-fields": unref(activeDatasetFields),
329
+ "field-type": unref(activeFieldType),
330
+ onSave: saveConditionalRules
331
+ }, null, 8, [
332
+ "modelValue",
333
+ "rules",
334
+ "binding-field",
335
+ "dataset-fields",
336
+ "field-type"
337
+ ])
338
+ ], 2);
339
+ };
340
+ }
341
+ });
342
+ //#endregion
343
+ export { _sfc_main as default };
@@ -0,0 +1,111 @@
1
+ import _sfc_main$1 from "../sheet/sheet.js";
2
+ import { exportFilledReportXlsx } from "../../report/export-xlsx.js";
3
+ import { applyGridColWidths, readGridColWidths } from "./designer/col-widths.js";
4
+ import _sfc_main$2 from "./filter-bar.js";
5
+ import { useReportViewer } from "./use-report-viewer.js";
6
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, toDisplayString, unref, useTemplateRef, watch } from "vue";
7
+ import { bem } from "@veltra/utils";
8
+ import { saveBlob } from "@cat-kit/fe";
9
+ import { Workbook } from "@veltra/sheet-core";
10
+ //#region src/components/report/report-viewer.vue
11
+ const MIN_RENDER_ROWS = 50;
12
+ const MIN_RENDER_COLS = 10;
13
+ /** 取数未完成时拒绝导出的可读错误 */
14
+ const EXPORT_NOT_READY_MESSAGE = "报表数据尚未就绪,请等待取数完成后再导出";
15
+ const EXPORT_LOADING_MESSAGE = "报表数据加载中,请稍后再导出";
16
+ /** 查看器工作簿:宿主可注入(同 USheet `workbook?` 先例),缺省内部自建;模板 / 填充结果都 restore 进活动 sheet 只读展示 */
17
+ const _sfc_main = /*@__PURE__*/ defineComponent({
18
+ name: "UReportViewer",
19
+ __name: "report-viewer",
20
+ props: {
21
+ connector: {},
22
+ template: {},
23
+ workbook: {},
24
+ colWidths: {}
25
+ },
26
+ setup(__props, { expose: __expose }) {
27
+ const props = __props;
28
+ const cls = bem("report-viewer");
29
+ /** 网格最小渲染尺寸(与 playground 预览态一致);Filled Report 超出时按快照尺寸放大 */
30
+ const internalWorkbook = new Workbook();
31
+ const workbook = computed(() => props.workbook ?? internalWorkbook);
32
+ const sheetRef = useTemplateRef("sheetRef");
33
+ const { params, values, loading, error, filledSnapshot, refresh, setValues } = useReportViewer(props);
34
+ const renderRows = computed(() => Math.max(MIN_RENDER_ROWS, filledSnapshot.value?.rows ?? 0, props.template.rows));
35
+ const renderCols = computed(() => Math.max(MIN_RENDER_COLS, filledSnapshot.value?.cols ?? 0, props.template.cols));
36
+ function exportColIndexes() {
37
+ return Array.from({ length: renderCols.value }, (_, col) => col);
38
+ }
39
+ /** 将宿主传入的列宽写入 VTable 运行时(sheet-core 列宽未进快照) */
40
+ function applyRuntimeColWidths() {
41
+ if (!props.colWidths?.length) return;
42
+ applyGridColWidths(sheetRef.value?.getGrid(), props.colWidths);
43
+ }
44
+ /**
45
+ * restore 负责尺寸/冻结/行高/选区(静默),restoreContent 发 content-reset
46
+ * 触发网格全量刷新(grid 层订阅直刷,无需手动 flush);history.clear 使填充不进 undo
47
+ */
48
+ function applySnapshot(snapshot) {
49
+ const sheet = workbook.value.activeSheet;
50
+ sheet.restore(snapshot);
51
+ sheet.restoreContent(snapshot);
52
+ sheet.history.clear();
53
+ nextTick(applyRuntimeColWidths);
54
+ }
55
+ watch(() => props.template, applySnapshot, { immediate: true });
56
+ watch(filledSnapshot, (filled) => {
57
+ if (filled) applySnapshot(filled);
58
+ });
59
+ watch(() => props.colWidths, applyRuntimeColWidths);
60
+ async function exportXlsx() {
61
+ if (loading.value) throw new Error(EXPORT_LOADING_MESSAGE);
62
+ if (!filledSnapshot.value) throw new Error(EXPORT_NOT_READY_MESSAGE);
63
+ const sheet = workbook.value.activeSheet;
64
+ const colWidths = readGridColWidths(sheetRef.value?.getGrid(), exportColIndexes()) ?? [];
65
+ const buffer = await exportFilledReportXlsx(sheet, colWidths);
66
+ saveBlob(new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }), `${sheet.name || "报表"}.xlsx`);
67
+ }
68
+ __expose({
69
+ refresh,
70
+ exportXlsx
71
+ });
72
+ return (_ctx, _cache) => {
73
+ return openBlock(), createElementBlock("div", { class: normalizeClass(unref(cls).b) }, [unref(params).length ? (openBlock(), createBlock(_sfc_main$2, {
74
+ key: 0,
75
+ "query-params": unref(params),
76
+ values: unref(values),
77
+ "onUpdate:values": unref(setValues)
78
+ }, null, 8, [
79
+ "query-params",
80
+ "values",
81
+ "onUpdate:values"
82
+ ])) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(cls).e("body")) }, [unref(loading) ? (openBlock(), createElementBlock("div", {
83
+ key: 0,
84
+ class: normalizeClass(unref(cls).e("loading")),
85
+ "aria-live": "polite"
86
+ }, [createElementVNode("div", { class: normalizeClass(unref(cls).e("loading-spinner")) }, null, 2), _cache[0] || (_cache[0] = createElementVNode("span", null, "正在加载报表数据…", -1))], 2)) : unref(error) ? (openBlock(), createElementBlock("div", {
87
+ key: 1,
88
+ class: normalizeClass(unref(cls).e("error")),
89
+ role: "alert"
90
+ }, toDisplayString(unref(error).message), 3)) : createCommentVNode("v-if", true), createVNode(unref(_sfc_main$1), {
91
+ ref_key: "sheetRef",
92
+ ref: sheetRef,
93
+ class: normalizeClass(unref(cls).e("sheet")),
94
+ workbook: workbook.value,
95
+ rows: renderRows.value,
96
+ cols: renderCols.value,
97
+ "show-toolbar": false,
98
+ "show-formula-bar": false,
99
+ "show-tabs": false,
100
+ readonly: ""
101
+ }, null, 8, [
102
+ "class",
103
+ "workbook",
104
+ "rows",
105
+ "cols"
106
+ ])], 2)], 2);
107
+ };
108
+ }
109
+ });
110
+ //#endregion
111
+ export { _sfc_main as default };
@@ -0,0 +1,17 @@
1
+ import "../sheet/style.js";
2
+ import "@veltra/desktop/components/number-input/style";
3
+ import "@veltra/desktop/components/palette/style";
4
+ import "@veltra/desktop/components/input/style";
5
+ import "@veltra/desktop/components/select/style";
6
+ import "@veltra/desktop/components/date-picker/style";
7
+ import "@veltra/desktop/components/date-range-picker/style";
8
+ import "@veltra/desktop/components/button/style";
9
+ import "@veltra/desktop/components/drawer/style";
10
+ import "@veltra/desktop/components/dialog/style";
11
+ import "@veltra/desktop/components/radio-group/style";
12
+ import "@veltra/desktop/components/switch/style";
13
+ import "@veltra/desktop/components/table/style";
14
+ import "@veltra/desktop/components/tabs/style";
15
+ import "@veltra/desktop/components/tag/style";
16
+ import "@veltra/desktop/components/pop-confirm/style";
17
+ import "@veltra/desktop/components/code-editor/style";
@@ -0,0 +1,18 @@
1
+ import "../sheet/style.js";
2
+ import "./style2.css";
3
+ import "@veltra/desktop/components/number-input/style";
4
+ import "@veltra/desktop/components/palette/style";
5
+ import "@veltra/desktop/components/input/style";
6
+ import "@veltra/desktop/components/select/style";
7
+ import "@veltra/desktop/components/date-picker/style";
8
+ import "@veltra/desktop/components/date-range-picker/style";
9
+ import "@veltra/desktop/components/button/style";
10
+ import "@veltra/desktop/components/drawer/style";
11
+ import "@veltra/desktop/components/dialog/style";
12
+ import "@veltra/desktop/components/radio-group/style";
13
+ import "@veltra/desktop/components/switch/style";
14
+ import "@veltra/desktop/components/table/style";
15
+ import "@veltra/desktop/components/tabs/style";
16
+ import "@veltra/desktop/components/tag/style";
17
+ import "@veltra/desktop/components/pop-confirm/style";
18
+ import "@veltra/desktop/components/code-editor/style";