@veltra/sheet 2.4.0 → 2.5.1

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 (147) hide show
  1. package/dist/components/sheet/formula-bar.js +50 -7
  2. package/dist/components/sheet/style2.css +2 -2
  3. package/dist/index.d.ts +2 -19
  4. package/dist/index.js +2 -15
  5. package/dist/types/index.d.ts +1 -3
  6. package/package.json +5 -6
  7. package/src/components/sheet/__test__/formula-bar.test.ts +29 -0
  8. package/src/components/sheet/formula-bar.vue +67 -6
  9. package/src/components/sheet/style.scss +1 -1
  10. package/src/index.ts +1 -27
  11. package/src/types/index.ts +0 -2
  12. package/dist/components/report/binding-badge.js +0 -118
  13. package/dist/components/report/designer/cell-coords.js +0 -46
  14. package/dist/components/report/designer/col-widths.js +0 -29
  15. package/dist/components/report/designer/conditional-rules/helpers.js +0 -139
  16. package/dist/components/report/designer/drill-dialog.js +0 -258
  17. package/dist/components/report/designer/drop-highlight-overlay.js +0 -76
  18. package/dist/components/report/designer/float-panel.js +0 -434
  19. package/dist/components/report/designer/role.js +0 -17
  20. package/dist/components/report/designer/rule-preview.js +0 -33
  21. package/dist/components/report/designer/rule-row.js +0 -253
  22. package/dist/components/report/designer/rules-dialog.js +0 -118
  23. package/dist/components/report/designer/topology-overlay.js +0 -122
  24. package/dist/components/report/designer/topology.js +0 -64
  25. package/dist/components/report/designer/use-grid-overlay.js +0 -75
  26. package/dist/components/report/designer-hub.js +0 -177
  27. package/dist/components/report/field-panel-helpers.js +0 -33
  28. package/dist/components/report/field-panel.js +0 -132
  29. package/dist/components/report/filter-bar.js +0 -74
  30. package/dist/components/report/hub-connection-form.js +0 -145
  31. package/dist/components/report/hub-dataset-editor.js +0 -409
  32. package/dist/components/report/preview-grid-size.js +0 -32
  33. package/dist/components/report/print.js +0 -39
  34. package/dist/components/report/report-designer.js +0 -428
  35. package/dist/components/report/report-viewer.js +0 -253
  36. package/dist/components/report/style.d.ts +0 -17
  37. package/dist/components/report/style.js +0 -18
  38. package/dist/components/report/style2.css +0 -965
  39. package/dist/components/report/use-report-designer.js +0 -387
  40. package/dist/components/report/use-report-viewer.js +0 -140
  41. package/dist/report/binding.d.ts +0 -83
  42. package/dist/report/binding.js +0 -334
  43. package/dist/report/connector.d.ts +0 -66
  44. package/dist/report/connector.js +0 -159
  45. package/dist/report/drill.d.ts +0 -48
  46. package/dist/report/drill.js +0 -78
  47. package/dist/report/export-xlsx.d.ts +0 -13
  48. package/dist/report/export-xlsx.js +0 -13
  49. package/dist/report/filter-bar.d.ts +0 -10
  50. package/dist/report/filter-bar.js +0 -31
  51. package/dist/report/index.d.ts +0 -14
  52. package/dist/report/params.d.ts +0 -13
  53. package/dist/report/params.js +0 -61
  54. package/dist/report/print.d.ts +0 -23
  55. package/dist/report/print.js +0 -197
  56. package/dist/report/render/aggregate.js +0 -193
  57. package/dist/report/render/builder.d.ts +0 -12
  58. package/dist/report/render/builder.js +0 -139
  59. package/dist/report/render/coordinate.d.ts +0 -25
  60. package/dist/report/render/coordinate.js +0 -733
  61. package/dist/report/render/index.d.ts +0 -14
  62. package/dist/report/render/index.js +0 -21
  63. package/dist/report/render/style-resolver.js +0 -50
  64. package/dist/report/render/template-index.d.ts +0 -24
  65. package/dist/report/render/template-index.js +0 -137
  66. package/dist/report/rules/evaluate.d.ts +0 -25
  67. package/dist/report/rules/evaluate.js +0 -82
  68. package/dist/report/rules/index.d.ts +0 -2
  69. package/dist/report/template.d.ts +0 -63
  70. package/dist/report/template.js +0 -83
  71. package/dist/report/types.d.ts +0 -103
  72. package/dist/types/report-designer.d.ts +0 -51
  73. package/dist/types/report-viewer.d.ts +0 -57
  74. package/src/components/report/__test__/binding-badge.test.ts +0 -92
  75. package/src/components/report/__test__/conditional-rules-helpers.test.ts +0 -88
  76. package/src/components/report/__test__/field-panel-helpers.test.ts +0 -65
  77. package/src/components/report/__test__/float-panel-position.test.ts +0 -45
  78. package/src/components/report/__test__/preview-grid-size.test.ts +0 -63
  79. package/src/components/report/__test__/report-designer.test.ts +0 -559
  80. package/src/components/report/__test__/report-drill.test.ts +0 -692
  81. package/src/components/report/__test__/report-viewer.test.ts +0 -400
  82. package/src/components/report/__test__/topology.test.ts +0 -143
  83. package/src/components/report/__test__/use-report-designer.test.ts +0 -804
  84. package/src/components/report/binding-badge.ts +0 -122
  85. package/src/components/report/designer/cell-coords.ts +0 -95
  86. package/src/components/report/designer/col-widths.ts +0 -56
  87. package/src/components/report/designer/conditional-rules/helpers.ts +0 -189
  88. package/src/components/report/designer/drill-dialog.vue +0 -245
  89. package/src/components/report/designer/drop-highlight-overlay.vue +0 -75
  90. package/src/components/report/designer/float-panel.vue +0 -444
  91. package/src/components/report/designer/role.ts +0 -32
  92. package/src/components/report/designer/rule-preview.vue +0 -40
  93. package/src/components/report/designer/rule-row.vue +0 -252
  94. package/src/components/report/designer/rules-dialog.vue +0 -110
  95. package/src/components/report/designer/topology-overlay.vue +0 -128
  96. package/src/components/report/designer/topology.ts +0 -124
  97. package/src/components/report/designer/use-grid-overlay.ts +0 -114
  98. package/src/components/report/designer-hub.vue +0 -198
  99. package/src/components/report/field-panel-helpers.ts +0 -44
  100. package/src/components/report/field-panel.vue +0 -136
  101. package/src/components/report/filter-bar.vue +0 -77
  102. package/src/components/report/hub-connection-form.vue +0 -124
  103. package/src/components/report/hub-dataset-editor.vue +0 -387
  104. package/src/components/report/index.ts +0 -2
  105. package/src/components/report/preview-grid-size.ts +0 -33
  106. package/src/components/report/print.ts +0 -44
  107. package/src/components/report/report-designer.vue +0 -454
  108. package/src/components/report/report-viewer.vue +0 -289
  109. package/src/components/report/style-designer.scss +0 -653
  110. package/src/components/report/style-hub.scss +0 -292
  111. package/src/components/report/style-viewer.scss +0 -144
  112. package/src/components/report/style.scss +0 -3
  113. package/src/components/report/style.ts +0 -20
  114. package/src/components/report/use-report-designer.ts +0 -603
  115. package/src/components/report/use-report-viewer.ts +0 -227
  116. package/src/report/__test__/binding.test.ts +0 -320
  117. package/src/report/__test__/connector.test.ts +0 -239
  118. package/src/report/__test__/drill.test.ts +0 -194
  119. package/src/report/__test__/export-xlsx.test.ts +0 -96
  120. package/src/report/__test__/filter-bar.test.ts +0 -58
  121. package/src/report/__test__/params.test.ts +0 -156
  122. package/src/report/__test__/print.test.ts +0 -170
  123. package/src/report/__test__/render.test.ts +0 -856
  124. package/src/report/__test__/rules.test.ts +0 -131
  125. package/src/report/__test__/template.test.ts +0 -366
  126. package/src/report/binding.ts +0 -474
  127. package/src/report/connector.ts +0 -206
  128. package/src/report/drill.ts +0 -112
  129. package/src/report/export-xlsx.ts +0 -15
  130. package/src/report/filter-bar.ts +0 -36
  131. package/src/report/index.ts +0 -16
  132. package/src/report/params.ts +0 -96
  133. package/src/report/print.ts +0 -234
  134. package/src/report/render/__test__/aggregate.test.ts +0 -16
  135. package/src/report/render/__test__/coordinate.test.ts +0 -405
  136. package/src/report/render/aggregate.ts +0 -289
  137. package/src/report/render/builder.ts +0 -211
  138. package/src/report/render/coordinate.ts +0 -1239
  139. package/src/report/render/index.ts +0 -30
  140. package/src/report/render/style-resolver.ts +0 -68
  141. package/src/report/render/template-index.ts +0 -200
  142. package/src/report/rules/evaluate.ts +0 -113
  143. package/src/report/rules/index.ts +0 -7
  144. package/src/report/template.ts +0 -145
  145. package/src/report/types.ts +0 -116
  146. package/src/types/report-designer.ts +0 -55
  147. package/src/types/report-viewer.ts +0 -54
@@ -1,245 +0,0 @@
1
- <template>
2
- <u-dialog
3
- v-model="visible"
4
- title="下钻配置"
5
- style="width: min(560px, 92vw); max-height: 85vh"
6
- @close="onClose"
7
- >
8
- <div :class="cls.b">
9
- <section :class="cls.e('section')">
10
- <div :class="cls.e('label')">目标模板</div>
11
- <u-select
12
- size="small"
13
- placeholder="从模板列表选择目标"
14
- :model-value="target"
15
- :options="templateOptions"
16
- @update:model-value="onTarget"
17
- />
18
- <p :class="cls.e('hint')">目标模板仅从宿主提供的列表选择,不支持手填引用。</p>
19
- </section>
20
-
21
- <section :class="cls.e('section')">
22
- <div :class="cls.e('label')">打开方式</div>
23
- <u-radio-group
24
- size="small"
25
- :items="openModeItems"
26
- :model-value="openMode"
27
- @update:model-value="onOpenMode"
28
- />
29
- </section>
30
-
31
- <section :class="cls.e('section')">
32
- <div :class="cls.e('label')">字段 → 详情报参数映射</div>
33
- <p v-if="!target" :class="cls.e('hint')">先选择目标模板,再配置映射。</p>
34
- <p v-else-if="paramsLoading" :class="cls.e('hint')">正在解析目标模板参数…</p>
35
- <p v-else-if="paramsError" :class="cls.e('error')">{{ paramsError }}</p>
36
- <template v-else>
37
- <p v-if="targetParams.length === 0" :class="cls.e('hint')">
38
- 目标模板没有查询参数,无需配置映射。
39
- </p>
40
- <ul v-else :class="cls.e('list')">
41
- <li v-for="(row, index) in mappings" :key="index" :class="cls.e('mapping')">
42
- <u-select
43
- size="small"
44
- :class="cls.e('field')"
45
- placeholder="字段"
46
- :model-value="row.field"
47
- :options="fieldOptions"
48
- @update:model-value="row.field = $event"
49
- />
50
- <span :class="cls.e('arrow')">→</span>
51
- <u-select
52
- size="small"
53
- :class="cls.e('param')"
54
- placeholder="参数"
55
- :model-value="row.param"
56
- :options="paramOptions"
57
- @update:model-value="row.param = $event"
58
- />
59
- <u-button size="small" text type="danger" @click="removeMapping(index)">
60
- 删除
61
- </u-button>
62
- </li>
63
- </ul>
64
- <div v-if="targetParams.length > 0">
65
- <u-button size="small" plain @click="addMapping">添加映射</u-button>
66
- </div>
67
- </template>
68
- </section>
69
- </div>
70
-
71
- <template #footer>
72
- <u-button
73
- v-if="drill"
74
- size="small"
75
- text
76
- type="danger"
77
- style="margin-right: auto"
78
- @click="remove"
79
- >
80
- 移除下钻
81
- </u-button>
82
- <u-button size="small" @click="visible = false">取消</u-button>
83
- <u-button size="small" type="primary" :disabled="!target" @click="confirm">确定</u-button>
84
- </template>
85
- </u-dialog>
86
- </template>
87
-
88
- <script lang="ts" setup>
89
- import { UButton, UDialog, URadioGroup, USelect } from '@veltra/desktop'
90
- import { bem } from '@veltra/utils'
91
- import { computed, ref, watch } from 'vue'
92
-
93
- import type { ResolveReportTemplate } from '../../../report/drill'
94
- import { resolveTemplateParams } from '../../../report/template'
95
- import type {
96
- DatasetField,
97
- QueryParamDef,
98
- ReportDrillConfig,
99
- ReportTemplateListItem
100
- } from '../../../report/types'
101
-
102
- defineOptions({ name: 'UReportDrillDialog' })
103
-
104
- /** 映射编辑行草稿(保存时折叠为 Record<字段, 参数>) */
105
- interface MappingRow {
106
- field: string
107
- param: string
108
- }
109
-
110
- const props = withDefaults(
111
- defineProps<{
112
- modelValue: boolean
113
- /** 宿主提供的可下钻目标模板列表(目标必选,无手填输入) */
114
- templates: ReportTemplateListItem[]
115
- /** 当前绑定所在数据集的字段 catalog */
116
- fields?: DatasetField[]
117
- /** 已有下钻配置(编辑时回填;缺省为新建) */
118
- drill?: ReportDrillConfig
119
- /** 宿主模板解析契约:选中目标后解析其查询参数;缺失时映射区给出可读提示 */
120
- resolveTemplate?: ResolveReportTemplate
121
- }>(),
122
- { fields: () => [], drill: undefined, resolveTemplate: undefined }
123
- )
124
-
125
- const emit = defineEmits<{
126
- 'update:modelValue': [value: boolean]
127
- save: [drill: ReportDrillConfig]
128
- remove: []
129
- }>()
130
-
131
- const cls = bem('report-drill-dialog')
132
-
133
- const visible = computed({
134
- get: () => props.modelValue,
135
- set: (value: boolean) => emit('update:modelValue', value)
136
- })
137
-
138
- const openModeItems = [
139
- { value: 'switch' as const, label: '查看器内切换' },
140
- { value: 'dialog' as const, label: '弹框打开(UDialog)' }
141
- ]
142
-
143
- // ---- 草稿(打开时从 props.drill 回填) ----
144
-
145
- const target = ref('')
146
- const openMode = ref<ReportDrillConfig['openMode']>('switch')
147
- const mappings = ref<MappingRow[]>([])
148
-
149
- watch(
150
- () => props.modelValue,
151
- (open) => {
152
- if (!open) return
153
- target.value = props.drill?.target ?? ''
154
- openMode.value = props.drill?.openMode ?? 'switch'
155
- mappings.value = Object.entries(props.drill?.mapping ?? {}).map(([field, param]) => ({
156
- field,
157
- param
158
- }))
159
- void resolveTargetParams(target.value)
160
- }
161
- )
162
-
163
- // ---- 目标模板参数解析(并发守卫:只应用最后一次解析) ----
164
-
165
- const targetParams = ref<QueryParamDef[]>([])
166
- const paramsLoading = ref(false)
167
- const paramsError = ref('')
168
- let paramsSeq = 0
169
-
170
- async function resolveTargetParams(ref: string): Promise<void> {
171
- const seq = ++paramsSeq
172
- targetParams.value = []
173
- paramsError.value = ''
174
- if (!ref) return
175
- const resolve = props.resolveTemplate
176
- if (!resolve) {
177
- paramsError.value = '宿主未提供 resolveTemplate,无法解析目标模板参数'
178
- return
179
- }
180
- paramsLoading.value = true
181
- try {
182
- const template = await resolve(ref)
183
- if (seq !== paramsSeq) return
184
- targetParams.value = resolveTemplateParams(template)
185
- } catch (error) {
186
- if (seq !== paramsSeq) return
187
- paramsError.value = `解析目标模板参数失败:${error instanceof Error ? error.message : String(error)}`
188
- } finally {
189
- if (seq === paramsSeq) paramsLoading.value = false
190
- }
191
- }
192
-
193
- const templateOptions = computed(() =>
194
- props.templates.map((item) => ({ value: item.ref, label: item.label }))
195
- )
196
-
197
- const fieldOptions = computed(() =>
198
- props.fields.map((field) => ({ value: field.name, label: field.label }))
199
- )
200
-
201
- const paramOptions = computed(() =>
202
- targetParams.value.map((param) => ({
203
- value: param.id,
204
- label: param.label && param.label !== param.id ? `${param.label}(${param.id})` : param.id
205
- }))
206
- )
207
-
208
- /** 用户改选目标:旧映射的参数 id 未必存在于新模板,直接清空重配 */
209
- function onTarget(value: string): void {
210
- target.value = value ?? ''
211
- mappings.value = []
212
- void resolveTargetParams(target.value)
213
- }
214
-
215
- function onOpenMode(value: ReportDrillConfig['openMode']): void {
216
- openMode.value = value
217
- }
218
-
219
- function addMapping(): void {
220
- mappings.value = [...mappings.value, { field: '', param: '' }]
221
- }
222
-
223
- function removeMapping(index: number): void {
224
- mappings.value = mappings.value.filter((_, i) => i !== index)
225
- }
226
-
227
- function confirm(): void {
228
- if (!target.value) return
229
- const mapping: Record<string, string> = {}
230
- for (const row of mappings.value) {
231
- if (row.field && row.param) mapping[row.field] = row.param
232
- }
233
- emit('save', { target: target.value, mapping, openMode: openMode.value })
234
- visible.value = false
235
- }
236
-
237
- function remove(): void {
238
- emit('remove')
239
- visible.value = false
240
- }
241
-
242
- function onClose(): void {
243
- visible.value = false
244
- }
245
- </script>
@@ -1,75 +0,0 @@
1
- <template>
2
- <div v-if="cell && visible" :class="cls.b" :style="highlightStyle" aria-hidden="true" />
3
- <div v-else-if="showFallback" :class="cls.e('fallback')" role="status">
4
- 松开将绑定到当前选区 {{ fallbackLabel }}
5
- </div>
6
- </template>
7
-
8
- <script lang="ts" setup>
9
- import type { CellAddress } from '@veltra/sheet-core'
10
- import type { SheetGrid } from '@veltra/sheet-core/grid'
11
- import { bem } from '@veltra/utils'
12
- import { computed, ref, toRef } from 'vue'
13
-
14
- import { readCellOverlayRect, useGridOverlaySync } from './use-grid-overlay'
15
-
16
- defineOptions({ name: 'UReportDropHighlightOverlay' })
17
-
18
- const props = defineProps<{
19
- cell: CellAddress | null
20
- hostEl: HTMLElement | null
21
- getGrid: () => SheetGrid | undefined
22
- /** 字段拖拽进行中(dragover 时为 true) */
23
- dragging: boolean
24
- /** hit-test 落空时提示回退的选区标签(如 A1) */
25
- fallbackLabel: string
26
- }>()
27
-
28
- const cls = bem('report-drop-highlight')
29
-
30
- const hostEl = toRef(props, 'hostEl')
31
-
32
- const rectLeft = ref(0)
33
- const rectTop = ref(0)
34
- const rectWidth = ref(0)
35
- const rectHeight = ref(0)
36
- const inView = ref(false)
37
-
38
- const visible = computed(() => !!props.cell && inView.value)
39
- const showFallback = computed(() => props.dragging && !props.cell)
40
-
41
- const highlightStyle = computed(() => ({
42
- left: `${rectLeft.value}px`,
43
- top: `${rectTop.value}px`,
44
- width: `${rectWidth.value}px`,
45
- height: `${rectHeight.value}px`
46
- }))
47
-
48
- function updateHighlight(): void {
49
- const cell = props.cell
50
- const host = props.hostEl
51
- if (!cell || !host) {
52
- inView.value = false
53
- return
54
- }
55
-
56
- const rect = readCellOverlayRect(cell, host, props.getGrid)
57
- if (!rect) {
58
- inView.value = false
59
- return
60
- }
61
-
62
- inView.value = true
63
- rectLeft.value = Math.round(rect.left)
64
- rectTop.value = Math.round(rect.top)
65
- rectWidth.value = Math.round(rect.width)
66
- rectHeight.value = Math.round(rect.height)
67
- }
68
-
69
- useGridOverlaySync({
70
- hostEl,
71
- getGrid: () => props.getGrid(),
72
- watchSources: () => [props.cell?.row, props.cell?.col, props.hostEl, props.dragging] as const,
73
- update: updateHighlight
74
- })
75
- </script>