@veltra/sheet 2.4.0 → 2.5.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 (142) hide show
  1. package/dist/index.d.ts +2 -19
  2. package/dist/index.js +2 -15
  3. package/dist/types/index.d.ts +1 -3
  4. package/package.json +2 -3
  5. package/src/index.ts +1 -27
  6. package/src/types/index.ts +0 -2
  7. package/dist/components/report/binding-badge.js +0 -118
  8. package/dist/components/report/designer/cell-coords.js +0 -46
  9. package/dist/components/report/designer/col-widths.js +0 -29
  10. package/dist/components/report/designer/conditional-rules/helpers.js +0 -139
  11. package/dist/components/report/designer/drill-dialog.js +0 -258
  12. package/dist/components/report/designer/drop-highlight-overlay.js +0 -76
  13. package/dist/components/report/designer/float-panel.js +0 -434
  14. package/dist/components/report/designer/role.js +0 -17
  15. package/dist/components/report/designer/rule-preview.js +0 -33
  16. package/dist/components/report/designer/rule-row.js +0 -253
  17. package/dist/components/report/designer/rules-dialog.js +0 -118
  18. package/dist/components/report/designer/topology-overlay.js +0 -122
  19. package/dist/components/report/designer/topology.js +0 -64
  20. package/dist/components/report/designer/use-grid-overlay.js +0 -75
  21. package/dist/components/report/designer-hub.js +0 -177
  22. package/dist/components/report/field-panel-helpers.js +0 -33
  23. package/dist/components/report/field-panel.js +0 -132
  24. package/dist/components/report/filter-bar.js +0 -74
  25. package/dist/components/report/hub-connection-form.js +0 -145
  26. package/dist/components/report/hub-dataset-editor.js +0 -409
  27. package/dist/components/report/preview-grid-size.js +0 -32
  28. package/dist/components/report/print.js +0 -39
  29. package/dist/components/report/report-designer.js +0 -428
  30. package/dist/components/report/report-viewer.js +0 -253
  31. package/dist/components/report/style.d.ts +0 -17
  32. package/dist/components/report/style.js +0 -18
  33. package/dist/components/report/style2.css +0 -965
  34. package/dist/components/report/use-report-designer.js +0 -387
  35. package/dist/components/report/use-report-viewer.js +0 -140
  36. package/dist/report/binding.d.ts +0 -83
  37. package/dist/report/binding.js +0 -334
  38. package/dist/report/connector.d.ts +0 -66
  39. package/dist/report/connector.js +0 -159
  40. package/dist/report/drill.d.ts +0 -48
  41. package/dist/report/drill.js +0 -78
  42. package/dist/report/export-xlsx.d.ts +0 -13
  43. package/dist/report/export-xlsx.js +0 -13
  44. package/dist/report/filter-bar.d.ts +0 -10
  45. package/dist/report/filter-bar.js +0 -31
  46. package/dist/report/index.d.ts +0 -14
  47. package/dist/report/params.d.ts +0 -13
  48. package/dist/report/params.js +0 -61
  49. package/dist/report/print.d.ts +0 -23
  50. package/dist/report/print.js +0 -197
  51. package/dist/report/render/aggregate.js +0 -193
  52. package/dist/report/render/builder.d.ts +0 -12
  53. package/dist/report/render/builder.js +0 -139
  54. package/dist/report/render/coordinate.d.ts +0 -25
  55. package/dist/report/render/coordinate.js +0 -733
  56. package/dist/report/render/index.d.ts +0 -14
  57. package/dist/report/render/index.js +0 -21
  58. package/dist/report/render/style-resolver.js +0 -50
  59. package/dist/report/render/template-index.d.ts +0 -24
  60. package/dist/report/render/template-index.js +0 -137
  61. package/dist/report/rules/evaluate.d.ts +0 -25
  62. package/dist/report/rules/evaluate.js +0 -82
  63. package/dist/report/rules/index.d.ts +0 -2
  64. package/dist/report/template.d.ts +0 -63
  65. package/dist/report/template.js +0 -83
  66. package/dist/report/types.d.ts +0 -103
  67. package/dist/types/report-designer.d.ts +0 -51
  68. package/dist/types/report-viewer.d.ts +0 -57
  69. package/src/components/report/__test__/binding-badge.test.ts +0 -92
  70. package/src/components/report/__test__/conditional-rules-helpers.test.ts +0 -88
  71. package/src/components/report/__test__/field-panel-helpers.test.ts +0 -65
  72. package/src/components/report/__test__/float-panel-position.test.ts +0 -45
  73. package/src/components/report/__test__/preview-grid-size.test.ts +0 -63
  74. package/src/components/report/__test__/report-designer.test.ts +0 -559
  75. package/src/components/report/__test__/report-drill.test.ts +0 -692
  76. package/src/components/report/__test__/report-viewer.test.ts +0 -400
  77. package/src/components/report/__test__/topology.test.ts +0 -143
  78. package/src/components/report/__test__/use-report-designer.test.ts +0 -804
  79. package/src/components/report/binding-badge.ts +0 -122
  80. package/src/components/report/designer/cell-coords.ts +0 -95
  81. package/src/components/report/designer/col-widths.ts +0 -56
  82. package/src/components/report/designer/conditional-rules/helpers.ts +0 -189
  83. package/src/components/report/designer/drill-dialog.vue +0 -245
  84. package/src/components/report/designer/drop-highlight-overlay.vue +0 -75
  85. package/src/components/report/designer/float-panel.vue +0 -444
  86. package/src/components/report/designer/role.ts +0 -32
  87. package/src/components/report/designer/rule-preview.vue +0 -40
  88. package/src/components/report/designer/rule-row.vue +0 -252
  89. package/src/components/report/designer/rules-dialog.vue +0 -110
  90. package/src/components/report/designer/topology-overlay.vue +0 -128
  91. package/src/components/report/designer/topology.ts +0 -124
  92. package/src/components/report/designer/use-grid-overlay.ts +0 -114
  93. package/src/components/report/designer-hub.vue +0 -198
  94. package/src/components/report/field-panel-helpers.ts +0 -44
  95. package/src/components/report/field-panel.vue +0 -136
  96. package/src/components/report/filter-bar.vue +0 -77
  97. package/src/components/report/hub-connection-form.vue +0 -124
  98. package/src/components/report/hub-dataset-editor.vue +0 -387
  99. package/src/components/report/index.ts +0 -2
  100. package/src/components/report/preview-grid-size.ts +0 -33
  101. package/src/components/report/print.ts +0 -44
  102. package/src/components/report/report-designer.vue +0 -454
  103. package/src/components/report/report-viewer.vue +0 -289
  104. package/src/components/report/style-designer.scss +0 -653
  105. package/src/components/report/style-hub.scss +0 -292
  106. package/src/components/report/style-viewer.scss +0 -144
  107. package/src/components/report/style.scss +0 -3
  108. package/src/components/report/style.ts +0 -20
  109. package/src/components/report/use-report-designer.ts +0 -603
  110. package/src/components/report/use-report-viewer.ts +0 -227
  111. package/src/report/__test__/binding.test.ts +0 -320
  112. package/src/report/__test__/connector.test.ts +0 -239
  113. package/src/report/__test__/drill.test.ts +0 -194
  114. package/src/report/__test__/export-xlsx.test.ts +0 -96
  115. package/src/report/__test__/filter-bar.test.ts +0 -58
  116. package/src/report/__test__/params.test.ts +0 -156
  117. package/src/report/__test__/print.test.ts +0 -170
  118. package/src/report/__test__/render.test.ts +0 -856
  119. package/src/report/__test__/rules.test.ts +0 -131
  120. package/src/report/__test__/template.test.ts +0 -366
  121. package/src/report/binding.ts +0 -474
  122. package/src/report/connector.ts +0 -206
  123. package/src/report/drill.ts +0 -112
  124. package/src/report/export-xlsx.ts +0 -15
  125. package/src/report/filter-bar.ts +0 -36
  126. package/src/report/index.ts +0 -16
  127. package/src/report/params.ts +0 -96
  128. package/src/report/print.ts +0 -234
  129. package/src/report/render/__test__/aggregate.test.ts +0 -16
  130. package/src/report/render/__test__/coordinate.test.ts +0 -405
  131. package/src/report/render/aggregate.ts +0 -289
  132. package/src/report/render/builder.ts +0 -211
  133. package/src/report/render/coordinate.ts +0 -1239
  134. package/src/report/render/index.ts +0 -30
  135. package/src/report/render/style-resolver.ts +0 -68
  136. package/src/report/render/template-index.ts +0 -200
  137. package/src/report/rules/evaluate.ts +0 -113
  138. package/src/report/rules/index.ts +0 -7
  139. package/src/report/template.ts +0 -145
  140. package/src/report/types.ts +0 -116
  141. package/src/types/report-designer.ts +0 -55
  142. package/src/types/report-viewer.ts +0 -54
@@ -1,211 +0,0 @@
1
- import type {
2
- CellRange,
3
- CellSnapshotItem,
4
- CellType,
5
- CellValue,
6
- SheetSnapshot
7
- } from '@veltra/sheet-core'
8
- import { cellKey } from '@veltra/sheet-core'
9
-
10
- import type { ReportColWidthEntry } from '../export-xlsx'
11
- import type { ConditionalEvalContext } from '../rules'
12
- import type { DatasetRecords } from '../types'
13
- import { AggregateIndex, resolvePlacementRecord, resolvePlacementValue } from './aggregate'
14
- import type { ExpansionLayout, PhysicalPlacement } from './coordinate'
15
- import { physicalColSpan, physicalRowSpan } from './coordinate'
16
- import { StyleResolver } from './style-resolver'
17
- import type { TemplateIndex } from './template-index'
18
-
19
- function toCellValue(value: unknown): { v: CellValue; t?: CellType } {
20
- if (value === null || value === undefined) return { v: '' }
21
- if (typeof value === 'number' && !Number.isNaN(value)) return { v: value, t: 'n' }
22
- if (typeof value === 'boolean') return { v: value, t: 'b' }
23
- if (typeof value === 'string') return { v: value, t: 's' }
24
- if (value instanceof Date) return { v: value.toISOString().slice(0, 10), t: 's' }
25
- return { v: JSON.stringify(value), t: 's' }
26
- }
27
-
28
- function rangeCells(range: CellRange): Array<{ row: number; col: number }> {
29
- const cells: Array<{ row: number; col: number }> = []
30
- for (let row = range.start.row; row <= range.end.row; row++) {
31
- for (let col = range.start.col; col <= range.end.col; col++) {
32
- cells.push({ row, col })
33
- }
34
- }
35
- return cells
36
- }
37
-
38
- function placementSourceValue(
39
- placement: PhysicalPlacement,
40
- template: SheetSnapshot,
41
- index: TemplateIndex,
42
- data: DatasetRecords,
43
- aggregateIndex: AggregateIndex
44
- ): unknown {
45
- if (placement.binding) {
46
- return resolvePlacementValue(placement, index, data, aggregateIndex)
47
- }
48
- const staticCell = index.cellAt(placement.logical)
49
- return staticCell?.v
50
- }
51
-
52
- function colWidthSourceLogicalCol(placement: PhysicalPlacement): number {
53
- const binding = placement.binding
54
- if (binding?.colParent) {
55
- return binding.colParent.col
56
- }
57
- return placement.logical.col
58
- }
59
-
60
- /**
61
- * 将模板列宽映射到填充报表物理列:横向展开列继承列方向父格所在模板列宽。
62
- */
63
- export function mapFilledColWidths(
64
- templateColWidths: ReadonlyArray<ReportColWidthEntry>,
65
- layout: ExpansionLayout,
66
- _index: TemplateIndex
67
- ): ReportColWidthEntry[] {
68
- if (templateColWidths.length === 0 || layout.colCount === 0) return []
69
-
70
- const widthByTemplateCol = new Map<number, number>()
71
- for (const [col, width] of templateColWidths) {
72
- widthByTemplateCol.set(col, width)
73
- }
74
-
75
- const physicalWidths = new Map<number, number>()
76
- for (const placement of layout.placements) {
77
- const sourceCol = colWidthSourceLogicalCol(placement)
78
- const width = widthByTemplateCol.get(sourceCol)
79
- if (width === undefined) continue
80
-
81
- const startCol = placement.physical.start.col
82
- const endCol = placement.physical.end.col
83
- for (let col = startCol; col <= endCol; col++) {
84
- physicalWidths.set(col, width)
85
- }
86
- }
87
-
88
- return [...physicalWidths.entries()].sort((a, b) => a[0] - b[0])
89
- }
90
-
91
- function placementEvalContext(
92
- placement: PhysicalPlacement,
93
- value: unknown,
94
- template: SheetSnapshot,
95
- index: TemplateIndex,
96
- data: DatasetRecords,
97
- aggregateIndex: AggregateIndex
98
- ): ConditionalEvalContext {
99
- const binding = placement.binding
100
- return {
101
- cellValue: value,
102
- bindingField: binding?.field ?? '',
103
- record: binding ? resolvePlacementRecord(placement, index, data, aggregateIndex) : undefined
104
- }
105
- }
106
-
107
- function collectRowConditionalStyles(
108
- layout: ExpansionLayout,
109
- template: SheetSnapshot,
110
- index: TemplateIndex,
111
- data: DatasetRecords,
112
- styles: StyleResolver
113
- ): void {
114
- const aggregateIndex = new AggregateIndex(data)
115
-
116
- for (const placement of layout.placements) {
117
- const binding = placement.binding
118
- if (!binding?.conditionalRules?.some((rule) => rule.scope === 'row')) continue
119
-
120
- const value = placementSourceValue(placement, template, index, data, aggregateIndex)
121
- const ctx = placementEvalContext(placement, value, template, index, data, aggregateIndex)
122
-
123
- for (let row = placement.physical.start.row; row <= placement.physical.end.row; row++) {
124
- styles.collectRowStyle(row, ctx, binding.conditionalRules)
125
- }
126
- }
127
- }
128
-
129
- /** 由扩展坐标布局组装 Filled Report 快照 */
130
- export function buildFilledReport(
131
- template: SheetSnapshot,
132
- index: TemplateIndex,
133
- layout: ExpansionLayout,
134
- data: DatasetRecords
135
- ): SheetSnapshot {
136
- const styles = new StyleResolver(template)
137
- collectRowConditionalStyles(layout, template, index, data, styles)
138
-
139
- const aggregateIndex = new AggregateIndex(data)
140
- const cells: CellSnapshotItem[] = []
141
- const merges: CellRange[] = [...layout.mappedMerges]
142
- const mergeKeys = new Set(merges.map((m) => cellKey(m.start)))
143
-
144
- const pushMerge = (range: CellRange): void => {
145
- const key = cellKey(range.start)
146
- if (mergeKeys.has(key)) return
147
- mergeKeys.add(key)
148
- merges.push(range)
149
- }
150
-
151
- const resolveStyleId = (
152
- placement: PhysicalPlacement,
153
- templateRow: number,
154
- templateCol: number,
155
- value: unknown,
156
- physicalRow: number
157
- ): number | undefined => {
158
- const binding = placement.binding
159
- const ctx = placementEvalContext(placement, value, template, index, data, aggregateIndex)
160
- const baseStyleId = binding
161
- ? styles.resolveCell(templateRow, templateCol, ctx, binding.conditionalRules)
162
- : styles.resolveStatic(templateRow, templateCol)
163
- return styles.mergeRowStyle(baseStyleId, physicalRow)
164
- }
165
-
166
- for (const placement of layout.placements) {
167
- const value = placementSourceValue(placement, template, index, data, aggregateIndex)
168
- const { row: templateRow, col: templateCol } = placement.logical
169
-
170
- const rowSpan = physicalRowSpan(placement)
171
- const colSpan = physicalColSpan(placement)
172
- const shouldMerge = placement.mergeSpan && (rowSpan > 1 || colSpan > 1)
173
-
174
- if (shouldMerge) {
175
- const item: CellSnapshotItem = {
176
- row: placement.physical.start.row,
177
- col: placement.physical.start.col,
178
- ...toCellValue(value)
179
- }
180
- const styleId = resolveStyleId(
181
- placement,
182
- templateRow,
183
- templateCol,
184
- value,
185
- placement.physical.start.row
186
- )
187
- if (styleId !== undefined) item.s = styleId
188
- cells.push(item)
189
- if (rowSpan > 1 || colSpan > 1) {
190
- pushMerge(placement.physical)
191
- }
192
- continue
193
- }
194
-
195
- for (const pos of rangeCells(placement.physical)) {
196
- const item: CellSnapshotItem = { row: pos.row, col: pos.col, ...toCellValue(value) }
197
- const styleId = resolveStyleId(placement, templateRow, templateCol, value, pos.row)
198
- if (styleId !== undefined) item.s = styleId
199
- cells.push(item)
200
- }
201
- }
202
-
203
- return {
204
- cells,
205
- styles: styles.snapshot(),
206
- merges,
207
- frozen: template.frozen,
208
- rows: layout.rowCount,
209
- cols: Math.max(layout.colCount, template.cols)
210
- }
211
- }