@veltra/sheet 2.1.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 (202) 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/{vue → components/sheet}/formula-bar.js +1 -1
  28. package/dist/{vue → components/sheet}/formula-suggest-list.js +1 -1
  29. package/dist/{vue → components/sheet}/import-file.js +1 -1
  30. package/dist/{vue → components/sheet}/insert-count-menu-item.js +1 -1
  31. package/dist/{vue → components/sheet}/insert-image.js +1 -1
  32. package/dist/{vue → components/sheet}/popup-helpers.js +1 -1
  33. package/dist/{vue → components/sheet}/popups/border-popup.js +1 -1
  34. package/dist/{vue → components/sheet}/popups/border-preset-glyph.js +1 -1
  35. package/dist/{vue → components/sheet}/popups/export-popup.js +2 -2
  36. package/dist/{vue → components/sheet}/popups/fill-color-popup.js +1 -1
  37. package/dist/{vue → components/sheet}/popups/find-popup.js +1 -1
  38. package/dist/{vue → components/sheet}/popups/font-color-popup.js +1 -1
  39. package/dist/{vue → components/sheet}/popups/font-size-popup.js +1 -1
  40. package/dist/{vue → components/sheet}/popups/import.worker.d.ts +1 -1
  41. package/dist/{vue → components/sheet}/popups/import.worker.js +1 -1
  42. package/dist/{vue → components/sheet}/popups/insert-image-popup.js +1 -1
  43. package/dist/{vue → components/sheet}/sheet-context-menu.js +1 -1
  44. package/dist/{vue → components/sheet}/sheet-tabs.js +1 -1
  45. package/dist/{vue → components/sheet}/sheet-toolbar.js +1 -1
  46. package/dist/{vue → components/sheet}/sheet.js +8 -1
  47. package/dist/{vue → components/sheet}/use-find-replace.js +1 -1
  48. package/dist/{vue → components/sheet}/use-formula-ref-select.js +1 -1
  49. package/dist/{vue → components/sheet}/use-sheet-grid.js +10 -2
  50. package/dist/{vue → components/sheet}/use-sheet-state.js +3 -3
  51. package/dist/{vue → components/sheet}/use-sheet-tabs-bar.js +1 -1
  52. package/dist/{vue → components/sheet}/use-tool-groups.js +2 -2
  53. package/dist/{vue → components/sheet}/use-tool-popup.js +2 -2
  54. package/dist/{vue → components/sheet}/use-toolbar-scroll.js +1 -1
  55. package/dist/index.d.ts +17 -3
  56. package/dist/index.js +13 -3
  57. package/dist/report/binding.d.ts +45 -0
  58. package/dist/report/binding.js +175 -0
  59. package/dist/report/connector.d.ts +66 -0
  60. package/dist/report/connector.js +159 -0
  61. package/dist/report/export-xlsx.d.ts +19 -0
  62. package/dist/report/export-xlsx.js +95 -0
  63. package/dist/report/filter-bar.d.ts +10 -0
  64. package/dist/report/filter-bar.js +31 -0
  65. package/dist/report/index.d.ts +12 -0
  66. package/dist/report/params.d.ts +13 -0
  67. package/dist/report/params.js +61 -0
  68. package/dist/report/render/aggregate.js +157 -0
  69. package/dist/report/render/builder.d.ts +12 -0
  70. package/dist/report/render/builder.js +139 -0
  71. package/dist/report/render/coordinate.d.ts +25 -0
  72. package/dist/report/render/coordinate.js +733 -0
  73. package/dist/report/render/index.d.ts +14 -0
  74. package/dist/report/render/index.js +21 -0
  75. package/dist/report/render/style-resolver.js +50 -0
  76. package/dist/report/render/template-index.d.ts +24 -0
  77. package/dist/report/render/template-index.js +137 -0
  78. package/dist/report/rules/evaluate.d.ts +25 -0
  79. package/dist/report/rules/evaluate.js +82 -0
  80. package/dist/report/rules/index.d.ts +2 -0
  81. package/dist/report/template.d.ts +59 -0
  82. package/dist/report/template.js +80 -0
  83. package/dist/report/types.d.ts +85 -0
  84. package/dist/tools/context.d.ts +1 -1
  85. package/dist/types/index.d.ts +3 -2
  86. package/dist/types/report-designer.d.ts +36 -0
  87. package/dist/types/report-viewer.d.ts +38 -0
  88. package/dist/types/sheet.d.ts +17 -1
  89. package/package.json +3 -5
  90. package/src/components/report/__test__/conditional-rules-helpers.test.ts +87 -0
  91. package/src/components/report/__test__/field-panel-helpers.test.ts +65 -0
  92. package/src/components/report/__test__/float-panel-position.test.ts +45 -0
  93. package/src/components/report/__test__/report-designer.test.ts +388 -0
  94. package/src/components/report/__test__/report-viewer.test.ts +334 -0
  95. package/src/components/report/__test__/topology.test.ts +143 -0
  96. package/src/components/report/__test__/use-report-designer.test.ts +565 -0
  97. package/src/components/report/binding-badge.ts +73 -0
  98. package/src/components/report/designer/cell-coords.ts +94 -0
  99. package/src/components/report/designer/col-widths.ts +33 -0
  100. package/src/components/report/designer/conditional-rules/helpers.ts +186 -0
  101. package/src/components/report/designer/drop-highlight-overlay.vue +74 -0
  102. package/src/components/report/designer/float-panel.vue +387 -0
  103. package/src/components/report/designer/role.ts +32 -0
  104. package/src/components/report/designer/rule-preview.vue +40 -0
  105. package/src/components/report/designer/rule-row.vue +252 -0
  106. package/src/components/report/designer/rules-dialog.vue +126 -0
  107. package/src/components/report/designer/topology-overlay.vue +127 -0
  108. package/src/components/report/designer/topology.ts +124 -0
  109. package/src/components/report/designer/use-grid-overlay.ts +113 -0
  110. package/src/components/report/designer-hub.vue +198 -0
  111. package/src/components/report/field-panel-helpers.ts +44 -0
  112. package/src/components/report/field-panel.vue +136 -0
  113. package/src/components/report/filter-bar.vue +77 -0
  114. package/src/components/report/hub-connection-form.vue +124 -0
  115. package/src/components/report/hub-dataset-editor.vue +369 -0
  116. package/src/components/report/index.ts +2 -0
  117. package/src/components/report/report-designer.vue +356 -0
  118. package/src/components/report/report-viewer.vue +128 -0
  119. package/src/components/report/style-designer.scss +583 -0
  120. package/src/components/report/style-hub.scss +292 -0
  121. package/src/components/report/style-viewer.scss +104 -0
  122. package/src/components/report/style.scss +3 -0
  123. package/src/components/report/style.ts +20 -0
  124. package/src/components/report/use-report-designer.ts +547 -0
  125. package/src/components/report/use-report-viewer.ts +79 -0
  126. package/src/{vue → components/sheet}/__test__/formula-bar.test.ts +37 -18
  127. package/src/{vue → components/sheet}/__test__/insert-image-popup.test.ts +1 -1
  128. package/src/{vue → components/sheet}/__test__/insert-image.test.ts +1 -1
  129. package/src/{vue → components/sheet}/__test__/sheet-component.test.ts +40 -3
  130. package/src/{vue → components/sheet}/__test__/sheet-context-menu.test.ts +1 -1
  131. package/src/{vue → components/sheet}/formula-bar.vue +1 -1
  132. package/src/{vue → components/sheet}/insert-image.ts +1 -1
  133. package/src/{vue → components/sheet}/popup-helpers.ts +1 -1
  134. package/src/{vue → components/sheet}/popups/border-popup.vue +1 -1
  135. package/src/{vue → components/sheet}/popups/export-popup.vue +2 -2
  136. package/src/{vue → components/sheet}/popups/fill-color-popup.vue +1 -1
  137. package/src/{vue → components/sheet}/popups/find-popup.vue +1 -1
  138. package/src/{vue → components/sheet}/popups/font-color-popup.vue +1 -1
  139. package/src/{vue → components/sheet}/popups/font-size-popup.vue +1 -1
  140. package/src/{vue → components/sheet}/popups/insert-image-popup.vue +1 -1
  141. package/src/{vue → components/sheet}/sheet-context-menu.ts +2 -2
  142. package/src/{vue → components/sheet}/sheet-toolbar.vue +2 -2
  143. package/src/{vue → components/sheet}/sheet.vue +4 -3
  144. package/src/{vue → components/sheet}/use-find-replace.ts +1 -1
  145. package/src/{vue → components/sheet}/use-sheet-grid.ts +7 -3
  146. package/src/{vue → components/sheet}/use-sheet-state.ts +3 -3
  147. package/src/{vue → components/sheet}/use-tool-groups.ts +2 -2
  148. package/src/{vue → components/sheet}/use-tool-popup.ts +2 -2
  149. package/src/index.ts +24 -188
  150. package/src/report/__test__/binding.test.ts +218 -0
  151. package/src/report/__test__/connector.test.ts +218 -0
  152. package/src/report/__test__/export-xlsx.test.ts +118 -0
  153. package/src/report/__test__/filter-bar.test.ts +58 -0
  154. package/src/report/__test__/params.test.ts +156 -0
  155. package/src/report/__test__/render.test.ts +728 -0
  156. package/src/report/__test__/rules.test.ts +131 -0
  157. package/src/report/__test__/template.test.ts +355 -0
  158. package/src/report/binding.ts +243 -0
  159. package/src/report/connector.ts +205 -0
  160. package/src/report/export-xlsx.ts +118 -0
  161. package/src/report/filter-bar.ts +36 -0
  162. package/src/report/index.ts +13 -0
  163. package/src/report/params.ts +96 -0
  164. package/src/report/render/__test__/aggregate.test.ts +16 -0
  165. package/src/report/render/__test__/coordinate.test.ts +405 -0
  166. package/src/report/render/aggregate.ts +240 -0
  167. package/src/report/render/builder.ts +211 -0
  168. package/src/report/render/coordinate.ts +1239 -0
  169. package/src/report/render/index.ts +30 -0
  170. package/src/report/render/style-resolver.ts +68 -0
  171. package/src/report/render/template-index.ts +200 -0
  172. package/src/report/rules/evaluate.ts +113 -0
  173. package/src/report/rules/index.ts +7 -0
  174. package/src/report/template.ts +141 -0
  175. package/src/report/types.ts +96 -0
  176. package/src/tools/builtin.ts +2 -2
  177. package/src/types/index.ts +2 -6
  178. package/src/types/report-designer.ts +36 -0
  179. package/src/types/report-viewer.ts +37 -0
  180. package/src/types/sheet.ts +22 -1
  181. /package/dist/{vue → components/sheet}/style.d.ts +0 -0
  182. /package/dist/{vue → components/sheet}/style.js +0 -0
  183. /package/dist/{vue → components/sheet}/style2.css +0 -0
  184. /package/dist/{vue → components/sheet}/use-formula-suggest.js +0 -0
  185. /package/src/{vue → components/sheet}/__test__/import-file.test.ts +0 -0
  186. /package/src/{vue → components/sheet}/__test__/insert-count-menu-item.test.ts +0 -0
  187. /package/src/{vue → components/sheet}/__test__/use-formula-ref-select.test.ts +0 -0
  188. /package/src/{vue → components/sheet}/__test__/use-formula-suggest.test.ts +0 -0
  189. /package/src/{vue → components/sheet}/formula-suggest-list.vue +0 -0
  190. /package/src/{vue → components/sheet}/import-file.ts +0 -0
  191. /package/src/{vue → components/sheet}/index.ts +0 -0
  192. /package/src/{vue → components/sheet}/insert-count-menu-item.vue +0 -0
  193. /package/src/{vue → components/sheet}/parsing.ts +0 -0
  194. /package/src/{vue → components/sheet}/popups/border-preset-glyph.vue +0 -0
  195. /package/src/{vue → components/sheet}/popups/import.worker.ts +0 -0
  196. /package/src/{vue → components/sheet}/sheet-tabs.vue +0 -0
  197. /package/src/{vue → components/sheet}/style.scss +0 -0
  198. /package/src/{vue → components/sheet}/style.ts +0 -0
  199. /package/src/{vue → components/sheet}/use-formula-ref-select.ts +0 -0
  200. /package/src/{vue → components/sheet}/use-formula-suggest.ts +0 -0
  201. /package/src/{vue → components/sheet}/use-sheet-tabs-bar.ts +0 -0
  202. /package/src/{vue → components/sheet}/use-toolbar-scroll.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 };