@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,76 @@
1
+ import { formatBindingPlaceholder, inferReportPreset } from "../../report/binding.js";
2
+ import { CustomLayout } from "@veltra/sheet-core";
3
+ //#region src/components/report/binding-badge.ts
4
+ /** 绑定徽章预设配色(设计态富渲染徽章;canvas 绘制需具体色值,无法消费 CSS 变量) */
5
+ const REPORT_PRESET_BADGE_COLORS = {
6
+ groupHeader: {
7
+ bg: "#dbeafe",
8
+ fg: "#1d4ed8"
9
+ },
10
+ detail: {
11
+ bg: "#d1fae5",
12
+ fg: "#047857"
13
+ },
14
+ subtotal: {
15
+ bg: "#fef3c7",
16
+ fg: "#b45309"
17
+ },
18
+ grandTotal: {
19
+ bg: "#ffe4e6",
20
+ fg: "#be123c"
21
+ },
22
+ cross: {
23
+ bg: "#ede9fe",
24
+ fg: "#6d28d9"
25
+ }
26
+ };
27
+ const CUSTOM_PRESET_BADGE_COLOR = {
28
+ bg: "#f3f4f6",
29
+ fg: "#374151"
30
+ };
31
+ function resolveBadgeColor(binding) {
32
+ const preset = inferReportPreset(binding);
33
+ return preset ? REPORT_PRESET_BADGE_COLORS[preset] : CUSTOM_PRESET_BADGE_COLOR;
34
+ }
35
+ /** 绑定格角色底色(走 resolveCellStyle,保留 VTable 默认边框绘制) */
36
+ function createBindingBadgeStyleResolver(getBindingAt) {
37
+ return (addr, base) => {
38
+ const binding = getBindingAt(addr);
39
+ if (!binding) return base;
40
+ const { bg } = resolveBadgeColor(binding);
41
+ return {
42
+ ...base,
43
+ fill: { color: bg }
44
+ };
45
+ };
46
+ }
47
+ /**
48
+ * 绑定格富渲染徽章(ADR-0004 `resolveCellRenderer` 首个消费者):
49
+ * 绑定单元格由纯文本占位符升级为带预设色彩的徽章(底色 + 占位文案),
50
+ * 未绑定格返回 `undefined` 回落默认渲染。
51
+ */
52
+ function createBindingBadgeRenderer(getBindingAt, resolveLabel) {
53
+ return (addr) => {
54
+ const binding = getBindingAt(addr);
55
+ if (!binding) return void 0;
56
+ const { fg } = resolveBadgeColor(binding);
57
+ const rootContainer = new CustomLayout.Container({
58
+ display: "flex",
59
+ flexDirection: "row",
60
+ justifyContent: "center",
61
+ alignItems: "center"
62
+ });
63
+ rootContainer.add(new CustomLayout.Text({
64
+ text: formatBindingPlaceholder(binding, resolveLabel),
65
+ fontSize: 11,
66
+ fontWeight: 600,
67
+ fill: fg
68
+ }));
69
+ return {
70
+ rootContainer,
71
+ renderDefault: false
72
+ };
73
+ };
74
+ }
75
+ //#endregion
76
+ export { REPORT_PRESET_BADGE_COLORS, createBindingBadgeRenderer, createBindingBadgeStyleResolver };
@@ -0,0 +1,46 @@
1
+ function resolveGridOverlayLayout(host) {
2
+ const gridEl = host.querySelector(".u-sheet__grid-instance");
3
+ if (!gridEl) return null;
4
+ const hostBox = host.getBoundingClientRect();
5
+ const gridBox = gridEl.getBoundingClientRect();
6
+ return {
7
+ gridEl,
8
+ layout: {
9
+ offsetX: gridBox.left - hostBox.left,
10
+ offsetY: gridBox.top - hostBox.top,
11
+ viewW: gridEl.clientWidth,
12
+ viewH: gridEl.clientHeight
13
+ }
14
+ };
15
+ }
16
+ /** 将屏幕坐标换算为网格落点地址(用于字段拖拽 bind) */
17
+ function resolveGridDropAddress(grid, gridEl, clientX, clientY) {
18
+ const rect = gridEl.getBoundingClientRect();
19
+ return grid.hitTestSheetAddr(clientX - rect.left, clientY - rect.top) ?? null;
20
+ }
21
+ function getCellOverlayRect(grid, cell, layout) {
22
+ const table = grid.getTable();
23
+ let cellRect;
24
+ try {
25
+ cellRect = table.getCellRelativeRect(cell.col + 1, cell.row + 1);
26
+ } catch {
27
+ return null;
28
+ }
29
+ const left = layout.offsetX + cellRect.left;
30
+ const top = layout.offsetY + cellRect.top;
31
+ const right = layout.offsetX + cellRect.right;
32
+ const bottom = layout.offsetY + cellRect.bottom;
33
+ if (cellRect.bottom < 0 || cellRect.right < 0 || cellRect.top > layout.viewH || cellRect.left > layout.viewW) return null;
34
+ return {
35
+ left,
36
+ top,
37
+ right,
38
+ bottom,
39
+ width: right - left,
40
+ height: bottom - top,
41
+ centerX: (left + right) / 2,
42
+ centerY: (top + bottom) / 2
43
+ };
44
+ }
45
+ //#endregion
46
+ export { getCellOverlayRect, resolveGridDropAddress, resolveGridOverlayLayout };
@@ -0,0 +1,15 @@
1
+ //#region src/components/report/designer/col-widths.ts
2
+ /** 经 SheetGrid → VTable 写入指定列宽 */
3
+ function applyGridColWidths(grid, widths) {
4
+ if (!grid) return;
5
+ const table = grid.getTable();
6
+ for (const [sheetCol, width] of widths) table.setColWidth(sheetCol + 1, width);
7
+ }
8
+ /** 从当前网格读取指定模型列宽度;网格未就绪时返回 null */
9
+ function readGridColWidths(grid, cols) {
10
+ if (!grid) return null;
11
+ const table = grid.getTable();
12
+ return cols.map((sheetCol) => [sheetCol, table.getColWidth(sheetCol + 1)]);
13
+ }
14
+ //#endregion
15
+ export { applyGridColWidths, readGridColWidths };
@@ -0,0 +1,139 @@
1
+ //#region src/components/report/designer/conditional-rules/helpers.ts
2
+ const OPERATOR_LABELS = {
3
+ gt: "大于",
4
+ gte: "大于等于",
5
+ lt: "小于",
6
+ lte: "小于等于",
7
+ eq: "等于",
8
+ between: "介于",
9
+ contains: "包含"
10
+ };
11
+ const RULE_SCOPE_OPTIONS = [{
12
+ value: "cell",
13
+ label: "本格"
14
+ }, {
15
+ value: "row",
16
+ label: "整行"
17
+ }];
18
+ /** 求值字段下拉:缺省项表示本格绑定字段 */
19
+ function ruleEvalFieldOptions(bindingField, datasetFields) {
20
+ return [{
21
+ value: void 0,
22
+ label: "本格字段"
23
+ }, ...datasetFields.filter((field) => field.name !== bindingField).map((field) => ({
24
+ value: field.name,
25
+ label: field.label || field.name
26
+ }))];
27
+ }
28
+ /** 按规则所选求值字段解析字段类型(运算符映射用) */
29
+ function resolveEvalFieldType(rule, bindingField, datasetFields) {
30
+ const fieldName = rule.field ?? bindingField;
31
+ return datasetFields.find((field) => field.name === fieldName)?.type ?? "number";
32
+ }
33
+ const NUMERIC_OPERATORS = [
34
+ "gt",
35
+ "gte",
36
+ "lt",
37
+ "lte",
38
+ "eq",
39
+ "between"
40
+ ];
41
+ const STRING_OPERATORS = ["eq", "contains"];
42
+ let draftIdSeq = 0;
43
+ function nextDraftId() {
44
+ draftIdSeq += 1;
45
+ return `rule-${draftIdSeq}`;
46
+ }
47
+ /** 按字段类型返回可用运算符 */
48
+ function operatorsForFieldType(fieldType) {
49
+ return (fieldType === "string" ? STRING_OPERATORS : NUMERIC_OPERATORS).map((value) => ({
50
+ value,
51
+ label: OPERATOR_LABELS[value]
52
+ }));
53
+ }
54
+ function isNumericFieldType(fieldType) {
55
+ return fieldType === "number" || fieldType === "date";
56
+ }
57
+ function defaultRuleValue(operator, fieldType) {
58
+ if (operator === "between") return isNumericFieldType(fieldType) ? [0, 100] : ["", ""];
59
+ if (operator === "contains" || operator === "eq" && fieldType === "string") return "";
60
+ return 0;
61
+ }
62
+ function defaultRuleStyle() {
63
+ return {
64
+ fill: { color: "#FEE2E2" },
65
+ font: { color: "#DC2626" }
66
+ };
67
+ }
68
+ function createDraftItem(rule, fieldType = "number", _bindingField) {
69
+ if (rule) return {
70
+ id: nextDraftId(),
71
+ rule: cloneRule(rule)
72
+ };
73
+ const operator = operatorsForFieldType(fieldType)[0]?.value ?? "eq";
74
+ return {
75
+ id: nextDraftId(),
76
+ rule: {
77
+ operator,
78
+ value: defaultRuleValue(operator, fieldType),
79
+ style: defaultRuleStyle()
80
+ }
81
+ };
82
+ }
83
+ function initDraftFromRules(rules, fieldType, bindingField) {
84
+ if (rules.length === 0) return [];
85
+ return rules.map((rule) => createDraftItem(rule, fieldType, bindingField));
86
+ }
87
+ function cloneRule(rule) {
88
+ return {
89
+ operator: rule.operator,
90
+ value: cloneRuleValue(rule.value),
91
+ field: rule.field,
92
+ scope: rule.scope,
93
+ style: {
94
+ ...rule.style,
95
+ fill: rule.style.fill ? { ...rule.style.fill } : void 0,
96
+ font: rule.style.font ? { ...rule.style.font } : void 0
97
+ }
98
+ };
99
+ }
100
+ function cloneRuleValue(value) {
101
+ if (Array.isArray(value)) return [...value];
102
+ return value;
103
+ }
104
+ function cloneRulesFromDraft(items) {
105
+ return items.map((item) => cloneRule(item.rule));
106
+ }
107
+ /** 运算符切换时重置比较值为合理缺省 */
108
+ function coerceValueForOperator(operator, fieldType, current) {
109
+ if (operator === "between") {
110
+ if (Array.isArray(current) && current.length === 2) return [...current];
111
+ return defaultRuleValue("between", fieldType);
112
+ }
113
+ if (operator === "contains") return typeof current === "string" ? current : "";
114
+ if (isNumericFieldType(fieldType)) {
115
+ const n = typeof current === "number" && Number.isFinite(current) ? current : Number(current);
116
+ return Number.isFinite(n) ? n : 0;
117
+ }
118
+ return typeof current === "string" ? current : "";
119
+ }
120
+ function toDisplayString(value) {
121
+ if (typeof value === "string") return value;
122
+ if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") return String(value);
123
+ return "";
124
+ }
125
+ function readBetweenValue(value, index, fieldType) {
126
+ const raw = (Array.isArray(value) && value.length === 2 ? value : defaultRuleValue("between", fieldType))[index];
127
+ if (isNumericFieldType(fieldType)) {
128
+ const n = typeof raw === "number" ? raw : Number(raw);
129
+ return Number.isFinite(n) ? n : 0;
130
+ }
131
+ return typeof raw === "string" ? raw : toDisplayString(raw);
132
+ }
133
+ function writeBetweenValue(value, index, next, fieldType) {
134
+ const pair = [readBetweenValue(value, 0, fieldType), readBetweenValue(value, 1, fieldType)];
135
+ pair[index] = next;
136
+ return pair;
137
+ }
138
+ //#endregion
139
+ export { OPERATOR_LABELS, RULE_SCOPE_OPTIONS, cloneRule, cloneRulesFromDraft, coerceValueForOperator, createDraftItem, defaultRuleStyle, defaultRuleValue, initDraftFromRules, isNumericFieldType, operatorsForFieldType, readBetweenValue, resolveEvalFieldType, ruleEvalFieldOptions, writeBetweenValue };
@@ -0,0 +1,76 @@
1
+ import { readCellOverlayRect, useGridOverlaySync } from "./use-grid-overlay.js";
2
+ import { computed, createCommentVNode, createElementBlock, defineComponent, normalizeClass, normalizeStyle, openBlock, ref, toDisplayString, toRef, unref } from "vue";
3
+ import { bem } from "@veltra/utils";
4
+ //#region src/components/report/designer/drop-highlight-overlay.vue
5
+ const _sfc_main = /*@__PURE__*/ defineComponent({
6
+ name: "UReportDropHighlightOverlay",
7
+ __name: "drop-highlight-overlay",
8
+ props: {
9
+ cell: {},
10
+ hostEl: {},
11
+ getGrid: { type: Function },
12
+ dragging: { type: Boolean },
13
+ fallbackLabel: {}
14
+ },
15
+ setup(__props) {
16
+ const props = __props;
17
+ const cls = bem("report-drop-highlight");
18
+ const hostEl = toRef(props, "hostEl");
19
+ const rectLeft = ref(0);
20
+ const rectTop = ref(0);
21
+ const rectWidth = ref(0);
22
+ const rectHeight = ref(0);
23
+ const inView = ref(false);
24
+ const visible = computed(() => !!props.cell && inView.value);
25
+ const showFallback = computed(() => props.dragging && !props.cell);
26
+ const highlightStyle = computed(() => ({
27
+ left: `${rectLeft.value}px`,
28
+ top: `${rectTop.value}px`,
29
+ width: `${rectWidth.value}px`,
30
+ height: `${rectHeight.value}px`
31
+ }));
32
+ function updateHighlight() {
33
+ const cell = props.cell;
34
+ const host = props.hostEl;
35
+ if (!cell || !host) {
36
+ inView.value = false;
37
+ return;
38
+ }
39
+ const rect = readCellOverlayRect(cell, host, props.getGrid);
40
+ if (!rect) {
41
+ inView.value = false;
42
+ return;
43
+ }
44
+ inView.value = true;
45
+ rectLeft.value = Math.round(rect.left);
46
+ rectTop.value = Math.round(rect.top);
47
+ rectWidth.value = Math.round(rect.width);
48
+ rectHeight.value = Math.round(rect.height);
49
+ }
50
+ useGridOverlaySync({
51
+ hostEl,
52
+ getGrid: () => props.getGrid(),
53
+ watchSources: () => [
54
+ props.cell?.row,
55
+ props.cell?.col,
56
+ props.hostEl,
57
+ props.dragging
58
+ ],
59
+ update: updateHighlight
60
+ });
61
+ return (_ctx, _cache) => {
62
+ return __props.cell && visible.value ? (openBlock(), createElementBlock("div", {
63
+ key: 0,
64
+ class: normalizeClass(unref(cls).b),
65
+ style: normalizeStyle(highlightStyle.value),
66
+ "aria-hidden": "true"
67
+ }, null, 6)) : showFallback.value ? (openBlock(), createElementBlock("div", {
68
+ key: 1,
69
+ class: normalizeClass(unref(cls).e("fallback")),
70
+ role: "status"
71
+ }, " 松开将绑定到当前选区 " + toDisplayString(__props.fallbackLabel), 3)) : createCommentVNode("v-if", true);
72
+ };
73
+ }
74
+ });
75
+ //#endregion
76
+ export { _sfc_main as default };