@blazes/data-visualization 0.0.0-stage → 1.0.0-alpha.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.
- package/README.md +238 -2
- package/dist/.vite/manifest.json +129 -0
- package/dist/PivotTableS2Renderer-C-Urwhuv.js +109 -0
- package/dist/PivotTableS2Renderer-C-Urwhuv.js.map +1 -0
- package/dist/WordCloudRenderer-7tzJz57a.js +96 -0
- package/dist/WordCloudRenderer-7tzJz57a.js.map +1 -0
- package/dist/core/adapter/index.d.ts +5 -0
- package/dist/core/adapter/index.d.ts.map +1 -0
- package/dist/core/adapter/standard-adapters.d.ts +211 -0
- package/dist/core/adapter/standard-adapters.d.ts.map +1 -0
- package/dist/core/adapter/standard-definitions.d.ts +230 -0
- package/dist/core/adapter/standard-definitions.d.ts.map +1 -0
- package/dist/core/adapter/types.d.ts +44 -0
- package/dist/core/adapter/types.d.ts.map +1 -0
- package/dist/core/adapter/view-models.d.ts +101 -0
- package/dist/core/adapter/view-models.d.ts.map +1 -0
- package/dist/core/config/config-validator.d.ts +27 -0
- package/dist/core/config/config-validator.d.ts.map +1 -0
- package/dist/core/config/dashboard-config-schema.d.ts +1360 -0
- package/dist/core/config/dashboard-config-schema.d.ts.map +1 -0
- package/dist/core/config/dashboard-config.d.ts +410 -0
- package/dist/core/config/dashboard-config.d.ts.map +1 -0
- package/dist/core/config/index.d.ts +9 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/json-value.d.ts +5 -0
- package/dist/core/config/json-value.d.ts.map +1 -0
- package/dist/core/config/runtime-schema.d.ts +28 -0
- package/dist/core/config/runtime-schema.d.ts.map +1 -0
- package/dist/core/config/schema-version.d.ts +3 -0
- package/dist/core/config/schema-version.d.ts.map +1 -0
- package/dist/core/config/serializable.d.ts +6 -0
- package/dist/core/config/serializable.d.ts.map +1 -0
- package/dist/core/config/value-path.d.ts +2 -0
- package/dist/core/config/value-path.d.ts.map +1 -0
- package/dist/core/dataset/dataset-runner.d.ts +28 -0
- package/dist/core/dataset/dataset-runner.d.ts.map +1 -0
- package/dist/core/dataset/index.d.ts +4 -0
- package/dist/core/dataset/index.d.ts.map +1 -0
- package/dist/core/dataset/normalize.d.ts +8 -0
- package/dist/core/dataset/normalize.d.ts.map +1 -0
- package/dist/core/dataset/types.d.ts +37 -0
- package/dist/core/dataset/types.d.ts.map +1 -0
- package/dist/core/export/csv.d.ts +11 -0
- package/dist/core/export/csv.d.ts.map +1 -0
- package/dist/core/export/index.d.ts +2 -0
- package/dist/core/export/index.d.ts.map +1 -0
- package/dist/core/formatter/index.d.ts +2 -0
- package/dist/core/formatter/index.d.ts.map +1 -0
- package/dist/core/formatter/value-formatter.d.ts +14 -0
- package/dist/core/formatter/value-formatter.d.ts.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +111 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/provider/data-provider.d.ts +18 -0
- package/dist/core/provider/data-provider.d.ts.map +1 -0
- package/dist/core/provider/index.d.ts +5 -0
- package/dist/core/provider/index.d.ts.map +1 -0
- package/dist/core/provider/request-executor.d.ts +48 -0
- package/dist/core/provider/request-executor.d.ts.map +1 -0
- package/dist/core/provider/request-value-codec.d.ts +15 -0
- package/dist/core/provider/request-value-codec.d.ts.map +1 -0
- package/dist/core/provider/resolve-request-input.d.ts +12 -0
- package/dist/core/provider/resolve-request-input.d.ts.map +1 -0
- package/dist/core/registry/core-registries.d.ts +15 -0
- package/dist/core/registry/core-registries.d.ts.map +1 -0
- package/dist/core/registry/index.d.ts +4 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/plugin-registry.d.ts +28 -0
- package/dist/core/registry/plugin-registry.d.ts.map +1 -0
- package/dist/core/registry/register-standard.d.ts +4 -0
- package/dist/core/registry/register-standard.d.ts.map +1 -0
- package/dist/core/runtime/dashboard-data-runtime.d.ts +26 -0
- package/dist/core/runtime/dashboard-data-runtime.d.ts.map +1 -0
- package/dist/core/runtime/dashboard-runtime.d.ts +458 -0
- package/dist/core/runtime/dashboard-runtime.d.ts.map +1 -0
- package/dist/core/runtime/dependency-graph.d.ts +11 -0
- package/dist/core/runtime/dependency-graph.d.ts.map +1 -0
- package/dist/core/runtime/index.d.ts +5 -0
- package/dist/core/runtime/index.d.ts.map +1 -0
- package/dist/core/runtime/types.d.ts +47 -0
- package/dist/core/runtime/types.d.ts.map +1 -0
- package/dist/core/telemetry/index.d.ts +2 -0
- package/dist/core/telemetry/index.d.ts.map +1 -0
- package/dist/core/telemetry/telemetry.d.ts +15 -0
- package/dist/core/telemetry/telemetry.d.ts.map +1 -0
- package/dist/core/variable/dashboard-context.d.ts +22 -0
- package/dist/core/variable/dashboard-context.d.ts.map +1 -0
- package/dist/core/variable/index.d.ts +3 -0
- package/dist/core/variable/index.d.ts.map +1 -0
- package/dist/core/variable/url-state.d.ts +17 -0
- package/dist/core/variable/url-state.d.ts.map +1 -0
- package/dist/csv-Dyrr2yMA.js +254 -0
- package/dist/csv-Dyrr2yMA.js.map +1 -0
- package/dist/dashboard-runtime-8a-9P8Ku.js +1540 -0
- package/dist/dashboard-runtime-8a-9P8Ku.js.map +1 -0
- package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts +18 -0
- package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts.map +1 -0
- package/dist/experimental/s2/index.d.ts +13 -0
- package/dist/experimental/s2/index.d.ts.map +1 -0
- package/dist/experimental/s2/index.js +66 -0
- package/dist/experimental/s2/index.js.map +1 -0
- package/dist/experimental/s2/pivot-table-s2.d.ts +23 -0
- package/dist/experimental/s2/pivot-table-s2.d.ts.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -0
- package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts +20 -0
- package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts.map +1 -0
- package/dist/renderers/word-cloud/index.d.ts +8 -0
- package/dist/renderers/word-cloud/index.d.ts.map +1 -0
- package/dist/renderers/word-cloud/index.js +17 -0
- package/dist/renderers/word-cloud/index.js.map +1 -0
- package/dist/runtime-schema-BO2qLlvE.js +580 -0
- package/dist/runtime-schema-BO2qLlvE.js.map +1 -0
- package/dist/serializable-DOOpLZyk.js +36 -0
- package/dist/serializable-DOOpLZyk.js.map +1 -0
- package/dist/standard-definitions-DHtaLAf1.js +351 -0
- package/dist/standard-definitions-DHtaLAf1.js.map +1 -0
- package/dist/value-formatter-D5QmLSMG.js +47 -0
- package/dist/value-formatter-D5QmLSMG.js.map +1 -0
- package/dist/visual-theme-DH-k3L51.js +23 -0
- package/dist/visual-theme-DH-k3L51.js.map +1 -0
- package/dist/vue/components/DashboardFilterBar.vue.d.ts +23 -0
- package/dist/vue/components/DashboardFilterBar.vue.d.ts.map +1 -0
- package/dist/vue/components/DashboardPanel.vue.d.ts +39 -0
- package/dist/vue/components/DashboardPanel.vue.d.ts.map +1 -0
- package/dist/vue/components/DashboardRenderer.vue.d.ts +57 -0
- package/dist/vue/components/DashboardRenderer.vue.d.ts.map +1 -0
- package/dist/vue/components/index.d.ts +4 -0
- package/dist/vue/components/index.d.ts.map +1 -0
- package/dist/vue/composables/index.d.ts +2 -0
- package/dist/vue/composables/index.d.ts.map +1 -0
- package/dist/vue/composables/use-dashboard-runtime.d.ts +17 -0
- package/dist/vue/composables/use-dashboard-runtime.d.ts.map +1 -0
- package/dist/vue/export/browser-download.d.ts +3 -0
- package/dist/vue/export/browser-download.d.ts.map +1 -0
- package/dist/vue/export/index.d.ts +2 -0
- package/dist/vue/export/index.d.ts.map +1 -0
- package/dist/vue/index.d.ts +7 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +1075 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/registry/index.d.ts +3 -0
- package/dist/vue/registry/index.d.ts.map +1 -0
- package/dist/vue/registry/register-standard.d.ts +3 -0
- package/dist/vue/registry/register-standard.d.ts.map +1 -0
- package/dist/vue/registry/renderer-registry.d.ts +12 -0
- package/dist/vue/registry/renderer-registry.d.ts.map +1 -0
- package/dist/vue/renderers/BarRenderer.vue.d.ts +24 -0
- package/dist/vue/renderers/BarRenderer.vue.d.ts.map +1 -0
- package/dist/vue/renderers/LineRenderer.vue.d.ts +24 -0
- package/dist/vue/renderers/LineRenderer.vue.d.ts.map +1 -0
- package/dist/vue/renderers/MetricRenderer.vue.d.ts +17 -0
- package/dist/vue/renderers/MetricRenderer.vue.d.ts.map +1 -0
- package/dist/vue/renderers/PieRenderer.vue.d.ts +24 -0
- package/dist/vue/renderers/PieRenderer.vue.d.ts.map +1 -0
- package/dist/vue/renderers/TableRenderer.vue.d.ts +21 -0
- package/dist/vue/renderers/TableRenderer.vue.d.ts.map +1 -0
- package/dist/vue/renderers/chart-format.d.ts +8 -0
- package/dist/vue/renderers/chart-format.d.ts.map +1 -0
- package/dist/vue/renderers/index.d.ts +7 -0
- package/dist/vue/renderers/index.d.ts.map +1 -0
- package/dist/vue/theme/index.d.ts +2 -0
- package/dist/vue/theme/index.d.ts.map +1 -0
- package/dist/vue/theme/visual-theme.d.ts +46 -0
- package/dist/vue/theme/visual-theme.d.ts.map +1 -0
- package/package.json +129 -4
package/README.md
CHANGED
|
@@ -1,3 +1,239 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @blazes/data-visualization
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
面向 Blazes 应用的可复用数据标准化与数据看板运行时组件。
|
|
4
|
+
|
|
5
|
+
本包提供可序列化的 DashboardConfig v1 Schema、引用校验、注册表、Provider 执行、看板变量与 URL 状态、
|
|
6
|
+
Dataset 标准化、两级缓存、基于 generation 的调度、格式化、遥测以及相互隔离的 Panel 状态。Vue 入口包含
|
|
7
|
+
看板外壳、筛选栏、面板状态 UI,以及 Metric、Line、Bar、Pie 和基础表格渲染器。WordCloud 与实验性 S2
|
|
8
|
+
通过独立的异步入口提供。
|
|
9
|
+
|
|
10
|
+
## 包入口
|
|
11
|
+
|
|
12
|
+
| 入口 | 职责 |
|
|
13
|
+
| ------------------------------------------------- | ------------------------------------------------------ |
|
|
14
|
+
| `@blazes/data-visualization` | 与框架无关的 Core 导出 |
|
|
15
|
+
| `@blazes/data-visualization/core` | 配置、Provider、Dataset、Adapter、运行时、格式化与诊断 |
|
|
16
|
+
| `@blazes/data-visualization/vue` | Vue 看板、面板与标准渲染器集成 |
|
|
17
|
+
| `@blazes/data-visualization/style.css` | 看板与标准渲染器样式 |
|
|
18
|
+
| `@blazes/data-visualization/renderers/word-cloud` | 可选的 WordCloud 渲染器 |
|
|
19
|
+
| `@blazes/data-visualization/experimental/s2` | 可选的实验性 S2 渲染器 |
|
|
20
|
+
|
|
21
|
+
Core 入口不得依赖 Vue、Ant Design Vue、ECharts、S2、Axios 或 `@blazes/charts`。
|
|
22
|
+
|
|
23
|
+
图表集成要求 `@blazes/charts` 2.x(当前最低版本为 `2.0.0-alpha.0`)。标准 Vue Renderer 统一从 `@blazes/charts` 根入口
|
|
24
|
+
导入 Line、Bar、Pie、Size 与 FormatType;该入口不包含 S2。直接使用透视表组件时,宿主从
|
|
25
|
+
`@blazes/charts/sheet` 导入;看板的实验性 S2 Renderer 仍从本包的 `experimental/s2` 入口注册。
|
|
26
|
+
|
|
27
|
+
## Core 用法
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import {
|
|
31
|
+
createCoreRegistries,
|
|
32
|
+
createDashboardDataRuntime,
|
|
33
|
+
type DashboardConfig
|
|
34
|
+
} from "@blazes/data-visualization/core";
|
|
35
|
+
|
|
36
|
+
const registries = createCoreRegistries();
|
|
37
|
+
registries.providers.register({
|
|
38
|
+
id: "statistics",
|
|
39
|
+
operations: {
|
|
40
|
+
trend: {
|
|
41
|
+
async execute(input, { signal }) {
|
|
42
|
+
return apiGetTrend(input, { signal });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const config = {
|
|
49
|
+
schemaVersion: "1.0",
|
|
50
|
+
id: "operations",
|
|
51
|
+
title: "运营看板",
|
|
52
|
+
variables: [{ id: "start", label: "开始日期", defaultValue: "2026-08-01" }],
|
|
53
|
+
requests: [
|
|
54
|
+
{
|
|
55
|
+
id: "trend-request",
|
|
56
|
+
providerId: "statistics",
|
|
57
|
+
operationId: "trend",
|
|
58
|
+
input: { start: { source: "variable", variableId: "start", codecId: "iso-date" } }
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
datasets: [
|
|
62
|
+
{
|
|
63
|
+
id: "trend-dataset",
|
|
64
|
+
name: "趋势",
|
|
65
|
+
input: { type: "single", requestId: "trend-request", responsePath: "rows" },
|
|
66
|
+
fields: [
|
|
67
|
+
{ key: "date", label: "日期", role: "time", dataType: "date", required: true },
|
|
68
|
+
{ key: "value", label: "数值", role: "metric", dataType: "number", required: true }
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
panels: []
|
|
73
|
+
} satisfies DashboardConfig;
|
|
74
|
+
|
|
75
|
+
const runtime = createDashboardDataRuntime({
|
|
76
|
+
config,
|
|
77
|
+
registries,
|
|
78
|
+
timezone: "Asia/Shanghai",
|
|
79
|
+
locale: "zh-CN"
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const context = runtime.createContext();
|
|
83
|
+
const dataset = await runtime.runDataset("trend-dataset", context);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
首次执行 Provider 之前,运行时会校验配置结构和 Registry 引用。多请求 Dataset 必须注册同步 Transformer。
|
|
87
|
+
必填字段校验失败时会拒绝整个 Dataset;可选字段的无效值会转换为 `null`,并附带诊断信息。
|
|
88
|
+
|
|
89
|
+
## Dashboard 用法
|
|
90
|
+
|
|
91
|
+
每个独立看板运行时都需要注册一次标准 Core 与 Vue 插件:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { createDashboardRuntime, createStandardCoreRegistries } from "@blazes/data-visualization/core";
|
|
95
|
+
import { createVueRendererRegistry, registerStandardVueRenderers } from "@blazes/data-visualization/vue";
|
|
96
|
+
import "@blazes/charts/style.css";
|
|
97
|
+
import "@blazes/data-visualization/style.css";
|
|
98
|
+
|
|
99
|
+
const registries = createStandardCoreRegistries();
|
|
100
|
+
registries.providers.register(statisticsProvider);
|
|
101
|
+
|
|
102
|
+
export const runtime = createDashboardRuntime({
|
|
103
|
+
config,
|
|
104
|
+
registries,
|
|
105
|
+
timezone: "Asia/Shanghai",
|
|
106
|
+
locale: "zh-CN"
|
|
107
|
+
});
|
|
108
|
+
export const rendererRegistry = registerStandardVueRenderers(createVueRendererRegistry());
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```vue
|
|
112
|
+
<DashboardRenderer :runtime="runtime" :renderer-registry="rendererRegistry" />
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`DashboardRenderer` 默认懒加载 Panel。Panel 进入视口或默认的 `600px 0px` 预加载范围时开始加载。设置
|
|
116
|
+
`:lazy-load="false"` 可恢复立即加载,也可以通过 `lazy-load-root-margin="300px 0px"` 调整预加载距离。
|
|
117
|
+
不支持 `IntersectionObserver` 的浏览器会回退到立即加载。懒加载模式下,筛选变化和筛选栏刷新操作只刷新
|
|
118
|
+
预加载范围内的 Panel;屏外 Panel 接近视口时,再使用最新变量加载。
|
|
119
|
+
|
|
120
|
+
`refreshPanel()` 只为指定 Panel 执行相互隔离的请求与 Dataset 链路。`refreshDataset()` 和全局刷新仍会更新
|
|
121
|
+
共享 Request 的所有下游消费者。变量快速变化时会取消上一个全局 generation;刷新失败时以 `stale` 状态
|
|
122
|
+
保留最近一次成功的 ViewModel。所有标准渲染器都支持 CSV 导出,Line、Bar、Pie 和 WordCloud 还支持 PNG 导出。
|
|
123
|
+
|
|
124
|
+
日期快捷范围按看板 `timezone` 的昨天作为结束日期,包含昨天、排除今天;其他结束日期的范围不会被识别为“近 N 天”。
|
|
125
|
+
启用 URL 同步时,筛选值变化会立即更新链接参数,不等待数据请求完成。
|
|
126
|
+
|
|
127
|
+
可在看板元素或其祖先设置 CSS 变量 `--dv-primary` 覆盖主色,默认使用 `#315fc4`。卡片 loading、筛选栏
|
|
128
|
+
刷新按钮与普通表格分页的选中、hover、键盘聚焦颜色均使用该主色,分页的浅色背景由主色生成。
|
|
129
|
+
|
|
130
|
+
### 卡片标题说明
|
|
131
|
+
|
|
132
|
+
所有 Panel 可配置 `titleNote`,在标题旁常驻展示补充说明,使用浅灰色小号文字,空间不足时自动换行。
|
|
133
|
+
`title` 是卡片名称,`description` 继续作为问号图标的悬浮提示;省略或传入空的 `titleNote` 时不展示补充文字。
|
|
134
|
+
这些字段仅控制展示,统计范围由 Request 的输入绑定决定。
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
{
|
|
138
|
+
title: "进线量",
|
|
139
|
+
titleNote: "默认全部客服",
|
|
140
|
+
description: "用户进线客服系统的数量"
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 柱状图滚动
|
|
145
|
+
|
|
146
|
+
柱状图可通过 `enhancement.bar.visibleCount` 限制同屏展示的类别数(2 到 200),完整数据仍保留在 Dataset
|
|
147
|
+
和图表中。超过限制时显示滑条,也可在图表内使用鼠标滚轮或拖动切换;未超过时不显示滑条。
|
|
148
|
+
横向排行建议降序排列,首项显示在顶部:
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
enhancement: {
|
|
152
|
+
type: "bar",
|
|
153
|
+
bar: { orientation: "horizontal", sort: "descending", showLabels: true, visibleCount: 10 }
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 可选渲染器
|
|
158
|
+
|
|
159
|
+
WordCloud 的可序列化 binding、Adapter 和渲染器定义已包含在标准 Core 注册中。在挂载使用
|
|
160
|
+
`rendererId: "wordCloud"` 的看板前,需要先加载其 Vue 实现:
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
import { registerWordCloudVueRenderer } from "@blazes/data-visualization/renderers/word-cloud";
|
|
164
|
+
|
|
165
|
+
await registerWordCloudVueRenderer(rendererRegistry);
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
S2 仍处于实验阶段。Core 和 Vue 均需显式注册,并且必须在看板运行时校验配置前完成:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
import { registerPivotTableS2 } from "@blazes/data-visualization/experimental/s2";
|
|
172
|
+
|
|
173
|
+
await registerPivotTableS2(registries, rendererRegistry);
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
S2 面板使用固定的维度与指标配置,不直接暴露原始 S2 options:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
{
|
|
180
|
+
rendererId: "pivotTableS2",
|
|
181
|
+
binding: {
|
|
182
|
+
type: "pivotTableS2",
|
|
183
|
+
datasetId: "sales",
|
|
184
|
+
rowFields: ["region"],
|
|
185
|
+
columnFields: ["month"],
|
|
186
|
+
valueFields: ["amount", "growth"]
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
两个加载器都使用独立的动态 chunk。缺少可选依赖时只会导致对应的可选渲染器失败,不会影响根入口、Core
|
|
192
|
+
或标准 Vue 入口。
|
|
193
|
+
|
|
194
|
+
## 开发
|
|
195
|
+
|
|
196
|
+
本仓库使用 Node 18 与 Yarn Classic。
|
|
197
|
+
|
|
198
|
+
```sh
|
|
199
|
+
yarn install
|
|
200
|
+
yarn verify
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
常用命令:
|
|
204
|
+
|
|
205
|
+
```sh
|
|
206
|
+
yarn typecheck
|
|
207
|
+
yarn test
|
|
208
|
+
yarn build
|
|
209
|
+
yarn performance:dataset
|
|
210
|
+
yarn size
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 本地包同步
|
|
214
|
+
|
|
215
|
+
默认使用 npm 已发布的 `@blazes/charts@2.0.0-alpha.0`。需要联调未发布的组件库改动时,可选择使用 Yalc:
|
|
216
|
+
|
|
217
|
+
```sh
|
|
218
|
+
# /Users/yh-110081m/dev/chart
|
|
219
|
+
yarn yalc:publish
|
|
220
|
+
|
|
221
|
+
# /Users/yh-110081m/dev/data-visualization
|
|
222
|
+
yarn yalc:add:charts
|
|
223
|
+
yarn yalc:publish
|
|
224
|
+
|
|
225
|
+
# 消费项目
|
|
226
|
+
yalc add @blazes/charts @blazes/data-visualization
|
|
227
|
+
yarn install
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
首次添加后,在发生变更的组件库中执行 `yarn yalc:push`,即可把后续版本推送到所有已注册的消费项目。
|
|
231
|
+
chart 脚本通过 Volta 选择所需的 Node 22 运行时。当 chart 类型变更会影响本包时,先在 chart 中执行
|
|
232
|
+
`yarn yalc:push`,验证 data-visualization 后,再在本仓库执行 `yarn yalc:push`。本地包的依赖列表发生变化后,
|
|
233
|
+
使用对应的 `yalc:update` 脚本更新。`.yalc/` 和 `yalc.lock` 是本地生成产物,不提交到 Git;发布消费项目的
|
|
234
|
+
manifest 前,应恢复正常版本范围。
|
|
235
|
+
|
|
236
|
+
`yarn build` 会生成 ESM 文件、类型声明和 `reports/bundle-stats.html`。`yarn size` 为根入口、Core 和 Vue
|
|
237
|
+
运行时入口依赖图执行初始 50 KB gzip 体积预算;如需测试经过明确批准的其他预算,可设置
|
|
238
|
+
`DV_SIZE_LIMIT_KB`。`yarn performance:dataset` 对 10,000 行数据执行初始 100ms P95 标准化性能预算;如需覆盖
|
|
239
|
+
经过明确批准的阈值,可设置 `DV_DATASET_P95_LIMIT_MS`。
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_csv-Dyrr2yMA.js": {
|
|
3
|
+
"file": "csv-Dyrr2yMA.js",
|
|
4
|
+
"name": "csv",
|
|
5
|
+
"imports": [
|
|
6
|
+
"_serializable-DOOpLZyk.js",
|
|
7
|
+
"_value-formatter-D5QmLSMG.js"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"_dashboard-runtime-8a-9P8Ku.js": {
|
|
11
|
+
"file": "dashboard-runtime-8a-9P8Ku.js",
|
|
12
|
+
"name": "dashboard-runtime",
|
|
13
|
+
"imports": [
|
|
14
|
+
"_csv-Dyrr2yMA.js",
|
|
15
|
+
"_serializable-DOOpLZyk.js",
|
|
16
|
+
"_standard-definitions-DHtaLAf1.js",
|
|
17
|
+
"_runtime-schema-BO2qLlvE.js"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"_runtime-schema-BO2qLlvE.js": {
|
|
21
|
+
"file": "runtime-schema-BO2qLlvE.js",
|
|
22
|
+
"name": "runtime-schema"
|
|
23
|
+
},
|
|
24
|
+
"_serializable-DOOpLZyk.js": {
|
|
25
|
+
"file": "serializable-DOOpLZyk.js",
|
|
26
|
+
"name": "serializable"
|
|
27
|
+
},
|
|
28
|
+
"_standard-definitions-DHtaLAf1.js": {
|
|
29
|
+
"file": "standard-definitions-DHtaLAf1.js",
|
|
30
|
+
"name": "standard-definitions",
|
|
31
|
+
"imports": [
|
|
32
|
+
"_serializable-DOOpLZyk.js",
|
|
33
|
+
"_runtime-schema-BO2qLlvE.js"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"_value-formatter-D5QmLSMG.js": {
|
|
37
|
+
"file": "value-formatter-D5QmLSMG.js",
|
|
38
|
+
"name": "value-formatter"
|
|
39
|
+
},
|
|
40
|
+
"_visual-theme-DH-k3L51.js": {
|
|
41
|
+
"file": "visual-theme-DH-k3L51.js",
|
|
42
|
+
"name": "visual-theme"
|
|
43
|
+
},
|
|
44
|
+
"src/core/index.ts": {
|
|
45
|
+
"file": "core/index.js",
|
|
46
|
+
"name": "core/index",
|
|
47
|
+
"src": "src/core/index.ts",
|
|
48
|
+
"isEntry": true,
|
|
49
|
+
"imports": [
|
|
50
|
+
"_dashboard-runtime-8a-9P8Ku.js",
|
|
51
|
+
"_runtime-schema-BO2qLlvE.js",
|
|
52
|
+
"_csv-Dyrr2yMA.js",
|
|
53
|
+
"_standard-definitions-DHtaLAf1.js",
|
|
54
|
+
"_value-formatter-D5QmLSMG.js",
|
|
55
|
+
"_serializable-DOOpLZyk.js"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"src/experimental/s2/PivotTableS2Renderer.vue": {
|
|
59
|
+
"file": "PivotTableS2Renderer-C-Urwhuv.js",
|
|
60
|
+
"name": "PivotTableS2Renderer",
|
|
61
|
+
"src": "src/experimental/s2/PivotTableS2Renderer.vue",
|
|
62
|
+
"isDynamicEntry": true,
|
|
63
|
+
"imports": [
|
|
64
|
+
"_value-formatter-D5QmLSMG.js"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"src/experimental/s2/index.ts": {
|
|
68
|
+
"file": "experimental/s2/index.js",
|
|
69
|
+
"name": "experimental/s2/index",
|
|
70
|
+
"src": "src/experimental/s2/index.ts",
|
|
71
|
+
"isEntry": true,
|
|
72
|
+
"imports": [
|
|
73
|
+
"_runtime-schema-BO2qLlvE.js"
|
|
74
|
+
],
|
|
75
|
+
"dynamicImports": [
|
|
76
|
+
"src/experimental/s2/PivotTableS2Renderer.vue"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"src/index.ts": {
|
|
80
|
+
"file": "index.js",
|
|
81
|
+
"name": "index",
|
|
82
|
+
"src": "src/index.ts",
|
|
83
|
+
"isEntry": true,
|
|
84
|
+
"imports": [
|
|
85
|
+
"_dashboard-runtime-8a-9P8Ku.js",
|
|
86
|
+
"_runtime-schema-BO2qLlvE.js",
|
|
87
|
+
"_csv-Dyrr2yMA.js",
|
|
88
|
+
"_standard-definitions-DHtaLAf1.js",
|
|
89
|
+
"_value-formatter-D5QmLSMG.js",
|
|
90
|
+
"_serializable-DOOpLZyk.js"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
"src/renderers/word-cloud/WordCloudRenderer.vue": {
|
|
94
|
+
"file": "WordCloudRenderer-7tzJz57a.js",
|
|
95
|
+
"name": "WordCloudRenderer",
|
|
96
|
+
"src": "src/renderers/word-cloud/WordCloudRenderer.vue",
|
|
97
|
+
"isDynamicEntry": true,
|
|
98
|
+
"imports": [
|
|
99
|
+
"_visual-theme-DH-k3L51.js",
|
|
100
|
+
"_value-formatter-D5QmLSMG.js"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"src/renderers/word-cloud/index.ts": {
|
|
104
|
+
"file": "renderers/word-cloud/index.js",
|
|
105
|
+
"name": "renderers/word-cloud/index",
|
|
106
|
+
"src": "src/renderers/word-cloud/index.ts",
|
|
107
|
+
"isEntry": true,
|
|
108
|
+
"imports": [
|
|
109
|
+
"_standard-definitions-DHtaLAf1.js"
|
|
110
|
+
],
|
|
111
|
+
"dynamicImports": [
|
|
112
|
+
"src/renderers/word-cloud/WordCloudRenderer.vue"
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"src/vue/index.ts": {
|
|
116
|
+
"file": "vue/index.js",
|
|
117
|
+
"name": "vue/index",
|
|
118
|
+
"src": "src/vue/index.ts",
|
|
119
|
+
"isEntry": true,
|
|
120
|
+
"imports": [
|
|
121
|
+
"_visual-theme-DH-k3L51.js",
|
|
122
|
+
"_value-formatter-D5QmLSMG.js",
|
|
123
|
+
"_csv-Dyrr2yMA.js"
|
|
124
|
+
],
|
|
125
|
+
"css": [
|
|
126
|
+
"index.css"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { defineComponent as p, ref as x, onMounted as w, watch as C, onBeforeUnmount as b, openBlock as z, createElementBlock as S } from "vue";
|
|
2
|
+
import { PivotSheet as M } from "@antv/s2";
|
|
3
|
+
import { v as B } from "./value-formatter-D5QmLSMG.js";
|
|
4
|
+
const A = /* @__PURE__ */ p({
|
|
5
|
+
name: "PivotTableS2Renderer",
|
|
6
|
+
__name: "PivotTableS2Renderer",
|
|
7
|
+
props: {
|
|
8
|
+
viewModel: {},
|
|
9
|
+
panel: {},
|
|
10
|
+
context: {}
|
|
11
|
+
},
|
|
12
|
+
setup(c) {
|
|
13
|
+
const o = c, r = x();
|
|
14
|
+
let t, n, i = !1;
|
|
15
|
+
const u = {
|
|
16
|
+
cornerCell: {
|
|
17
|
+
text: { fill: "#637083", fontSize: 12, textAlign: "left" },
|
|
18
|
+
bolderText: { fill: "#273244", fontSize: 12, fontWeight: 600, textAlign: "left" },
|
|
19
|
+
cell: { backgroundColor: "#f6f8fb", horizontalBorderColor: "#e4e9f0", verticalBorderColor: "#e4e9f0" }
|
|
20
|
+
},
|
|
21
|
+
rowCell: {
|
|
22
|
+
text: { fill: "#465267", fontSize: 12, textAlign: "left" },
|
|
23
|
+
bolderText: { fill: "#273244", fontSize: 12, fontWeight: 600, textAlign: "left" },
|
|
24
|
+
cell: { backgroundColor: "#fafbfd", horizontalBorderColor: "#e7ebf1", verticalBorderColor: "#e7ebf1" }
|
|
25
|
+
},
|
|
26
|
+
colCell: {
|
|
27
|
+
text: { fill: "#637083", fontSize: 12, textAlign: "left" },
|
|
28
|
+
bolderText: { fill: "#273244", fontSize: 12, fontWeight: 600, textAlign: "left" },
|
|
29
|
+
measureText: { fill: "#273244", fontSize: 12, fontWeight: 600, textAlign: "left" },
|
|
30
|
+
cell: { backgroundColor: "#f6f8fb", horizontalBorderColor: "#e4e9f0", verticalBorderColor: "#e4e9f0" }
|
|
31
|
+
},
|
|
32
|
+
dataCell: {
|
|
33
|
+
text: { fill: "#273244", fontSize: 12, textAlign: "right" },
|
|
34
|
+
bolderText: { fill: "#182230", fontSize: 12, fontWeight: 600, textAlign: "right" },
|
|
35
|
+
cell: {
|
|
36
|
+
backgroundColor: "#fff",
|
|
37
|
+
crossBackgroundColor: "#fbfcfe",
|
|
38
|
+
horizontalBorderColor: "#edf0f5",
|
|
39
|
+
verticalBorderColor: "#edf0f5"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
function s() {
|
|
44
|
+
return [...o.viewModel.rowFields, ...o.viewModel.columnFields, ...o.viewModel.valueFields];
|
|
45
|
+
}
|
|
46
|
+
function h(e, l) {
|
|
47
|
+
if (!e.format) return l;
|
|
48
|
+
const v = B.formatDisplay(l, e.format, o.context), g = e.unit && !e.format.unit && e.format.type !== "percent" ? e.unit : "";
|
|
49
|
+
return `${v}${g}`;
|
|
50
|
+
}
|
|
51
|
+
function a() {
|
|
52
|
+
return {
|
|
53
|
+
fields: {
|
|
54
|
+
rows: o.viewModel.rowFields.map((e) => e.field),
|
|
55
|
+
columns: o.viewModel.columnFields.map((e) => e.field),
|
|
56
|
+
values: o.viewModel.valueFields.map((e) => e.field),
|
|
57
|
+
valueInCols: !0
|
|
58
|
+
},
|
|
59
|
+
meta: s().map((e) => ({
|
|
60
|
+
field: e.field,
|
|
61
|
+
name: e.label,
|
|
62
|
+
...e.format ? { formatter: (l) => h(e, l) } : {}
|
|
63
|
+
})),
|
|
64
|
+
data: o.viewModel.rows.map((e) => ({ ...e }))
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function m() {
|
|
68
|
+
var e, l;
|
|
69
|
+
return {
|
|
70
|
+
width: Math.max(((e = r.value) == null ? void 0 : e.clientWidth) ?? 0, 320),
|
|
71
|
+
height: Math.max(((l = r.value) == null ? void 0 : l.clientHeight) ?? 0, 320)
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function f() {
|
|
75
|
+
return {
|
|
76
|
+
...m(),
|
|
77
|
+
style: {
|
|
78
|
+
layoutWidthType: "adaptive",
|
|
79
|
+
colCell: { height: 34 },
|
|
80
|
+
rowCell: { height: 34 },
|
|
81
|
+
dataCell: { height: 34 }
|
|
82
|
+
},
|
|
83
|
+
interaction: { overscrollBehavior: "contain" }
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async function d() {
|
|
87
|
+
r.value && (t ? (t.setDataCfg(a(), !0), t.setOptions(f(), !0)) : (t = new M(r.value, a(), f()), t.setTheme(u)), await t.render());
|
|
88
|
+
}
|
|
89
|
+
return w(async () => {
|
|
90
|
+
await d(), !i && typeof ResizeObserver < "u" && r.value && (n = new ResizeObserver(([e]) => {
|
|
91
|
+
!e || !t || t.changeSheetSize(Math.max(e.contentRect.width, 320), Math.max(e.contentRect.height, 320));
|
|
92
|
+
}), n.observe(r.value));
|
|
93
|
+
}), C(
|
|
94
|
+
() => [o.viewModel, o.context],
|
|
95
|
+
async () => d()
|
|
96
|
+
), b(() => {
|
|
97
|
+
i = !0, n == null || n.disconnect(), t == null || t.destroy(), t = void 0;
|
|
98
|
+
}), (e, l) => (z(), S("div", {
|
|
99
|
+
ref_key: "containerRef",
|
|
100
|
+
ref: r,
|
|
101
|
+
class: "dv-pivot-table-s2-renderer",
|
|
102
|
+
style: { width: "100%", "min-width": "0", height: "320px", overflow: "hidden", background: "#fff" }
|
|
103
|
+
}, null, 512));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
export {
|
|
107
|
+
A as default
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=PivotTableS2Renderer-C-Urwhuv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotTableS2Renderer-C-Urwhuv.js","sources":["../src/experimental/s2/PivotTableS2Renderer.vue"],"sourcesContent":["<template>\n <div\n ref=\"containerRef\"\n class=\"dv-pivot-table-s2-renderer\"\n style=\"width: 100%; min-width: 0; height: 320px; overflow: hidden; background: #fff\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PivotSheet, type S2DataConfig, type S2Options, type S2Theme } from \"@antv/s2\";\nimport { onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nimport { valueFormatter, type DashboardContext, type PanelConfig } from \"../../core\";\nimport type { PivotTableS2FieldViewModel, PivotTableS2ViewModel } from \"./pivot-table-s2\";\n\ndefineOptions({ name: \"PivotTableS2Renderer\" });\n\nconst props = defineProps<{ viewModel: PivotTableS2ViewModel; panel: PanelConfig; context: DashboardContext }>();\nconst containerRef = ref<HTMLDivElement>();\nlet sheet: PivotSheet | undefined;\nlet resizeObserver: ResizeObserver | undefined;\nlet disposed = false;\n\nconst S2_THEME: S2Theme = {\n cornerCell: {\n text: { fill: \"#637083\", fontSize: 12, textAlign: \"left\" },\n bolderText: { fill: \"#273244\", fontSize: 12, fontWeight: 600, textAlign: \"left\" },\n cell: { backgroundColor: \"#f6f8fb\", horizontalBorderColor: \"#e4e9f0\", verticalBorderColor: \"#e4e9f0\" }\n },\n rowCell: {\n text: { fill: \"#465267\", fontSize: 12, textAlign: \"left\" },\n bolderText: { fill: \"#273244\", fontSize: 12, fontWeight: 600, textAlign: \"left\" },\n cell: { backgroundColor: \"#fafbfd\", horizontalBorderColor: \"#e7ebf1\", verticalBorderColor: \"#e7ebf1\" }\n },\n colCell: {\n text: { fill: \"#637083\", fontSize: 12, textAlign: \"left\" },\n bolderText: { fill: \"#273244\", fontSize: 12, fontWeight: 600, textAlign: \"left\" },\n measureText: { fill: \"#273244\", fontSize: 12, fontWeight: 600, textAlign: \"left\" },\n cell: { backgroundColor: \"#f6f8fb\", horizontalBorderColor: \"#e4e9f0\", verticalBorderColor: \"#e4e9f0\" }\n },\n dataCell: {\n text: { fill: \"#273244\", fontSize: 12, textAlign: \"right\" },\n bolderText: { fill: \"#182230\", fontSize: 12, fontWeight: 600, textAlign: \"right\" },\n cell: {\n backgroundColor: \"#fff\",\n crossBackgroundColor: \"#fbfcfe\",\n horizontalBorderColor: \"#edf0f5\",\n verticalBorderColor: \"#edf0f5\"\n }\n }\n};\n\nfunction allFields(): PivotTableS2FieldViewModel[] {\n return [...props.viewModel.rowFields, ...props.viewModel.columnFields, ...props.viewModel.valueFields];\n}\n\nfunction formatFieldValue(field: PivotTableS2FieldViewModel, value: unknown): string | number | null | undefined {\n if (!field.format) return value as string | number | null | undefined;\n const formatted = valueFormatter.formatDisplay(value, field.format, props.context);\n const unit = field.unit && !field.format.unit && field.format.type !== \"percent\" ? field.unit : \"\";\n return `${formatted}${unit}`;\n}\n\nfunction buildDataConfig(): S2DataConfig {\n return {\n fields: {\n rows: props.viewModel.rowFields.map((field) => field.field),\n columns: props.viewModel.columnFields.map((field) => field.field),\n values: props.viewModel.valueFields.map((field) => field.field),\n valueInCols: true\n },\n meta: allFields().map((field) => ({\n field: field.field,\n name: field.label,\n ...(field.format ? { formatter: (value: unknown) => formatFieldValue(field, value) } : {})\n })),\n data: props.viewModel.rows.map((row) => ({ ...row })) as S2DataConfig[\"data\"]\n };\n}\n\nfunction sheetSize(): { width: number; height: number } {\n return {\n width: Math.max(containerRef.value?.clientWidth ?? 0, 320),\n height: Math.max(containerRef.value?.clientHeight ?? 0, 320)\n };\n}\n\nfunction buildOptions(): S2Options {\n return {\n ...sheetSize(),\n style: {\n layoutWidthType: \"adaptive\",\n colCell: { height: 34 },\n rowCell: { height: 34 },\n dataCell: { height: 34 }\n },\n interaction: { overscrollBehavior: \"contain\" }\n };\n}\n\nasync function render(): Promise<void> {\n if (!containerRef.value) return;\n if (!sheet) {\n sheet = new PivotSheet(containerRef.value, buildDataConfig(), buildOptions());\n sheet.setTheme(S2_THEME);\n } else {\n sheet.setDataCfg(buildDataConfig(), true);\n sheet.setOptions(buildOptions(), true);\n }\n await sheet.render();\n}\n\nonMounted(async () => {\n await render();\n if (disposed) return;\n if (typeof ResizeObserver !== \"undefined\" && containerRef.value) {\n resizeObserver = new ResizeObserver(([entry]) => {\n if (!entry || !sheet) return;\n sheet.changeSheetSize(Math.max(entry.contentRect.width, 320), Math.max(entry.contentRect.height, 320));\n });\n resizeObserver.observe(containerRef.value);\n }\n});\n\nwatch(\n () => [props.viewModel, props.context] as const,\n async () => render()\n);\n\nonBeforeUnmount(() => {\n disposed = true;\n resizeObserver?.disconnect();\n sheet?.destroy();\n sheet = undefined;\n});\n</script>\n"],"names":["props","__props","containerRef","ref","sheet","resizeObserver","disposed","S2_THEME","allFields","formatFieldValue","field","value","formatted","valueFormatter","unit","buildDataConfig","row","sheetSize","_a","_b","buildOptions","render","PivotSheet","onMounted","entry","watch","onBeforeUnmount"],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { defineComponent as M, ref as S, onMounted as _, watch as O, onBeforeUnmount as b, openBlock as h, createElementBlock as F } from "vue";
|
|
2
|
+
import * as A from "echarts";
|
|
3
|
+
import { S as u, a as C } from "./visual-theme-DH-k3L51.js";
|
|
4
|
+
import { v as T } from "./value-formatter-D5QmLSMG.js";
|
|
5
|
+
const D = /* @__PURE__ */ M({
|
|
6
|
+
name: "WordCloudRenderer",
|
|
7
|
+
__name: "WordCloudRenderer",
|
|
8
|
+
props: {
|
|
9
|
+
viewModel: {},
|
|
10
|
+
panel: {},
|
|
11
|
+
context: {}
|
|
12
|
+
},
|
|
13
|
+
setup(p, { expose: f }) {
|
|
14
|
+
const n = p, a = S();
|
|
15
|
+
let e, r, d = !1;
|
|
16
|
+
function c(o) {
|
|
17
|
+
return typeof o == "object" && o !== null ? o : {};
|
|
18
|
+
}
|
|
19
|
+
function l(o) {
|
|
20
|
+
return o.replace(/[&<>"']/g, (s) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[s]);
|
|
21
|
+
}
|
|
22
|
+
function v() {
|
|
23
|
+
const o = Array.from(
|
|
24
|
+
new Set(n.viewModel.words.map((t) => t.semantic).filter((t) => !!t))
|
|
25
|
+
).sort(), s = n.viewModel.words.map((t, i) => ({
|
|
26
|
+
id: t.id,
|
|
27
|
+
name: t.label,
|
|
28
|
+
value: t.value,
|
|
29
|
+
semantic: t.semantic,
|
|
30
|
+
textStyle: {
|
|
31
|
+
color: u[t.semantic ? o.indexOf(t.semantic) % u.length : i % u.length]
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
animationDurationUpdate: 240,
|
|
36
|
+
tooltip: {
|
|
37
|
+
...C,
|
|
38
|
+
trigger: "item",
|
|
39
|
+
formatter(t) {
|
|
40
|
+
const i = c(c(t).data), w = typeof i.name == "string" ? i.name : "", y = typeof i.value == "number" ? i.value : null, R = T.formatTooltip(y, n.viewModel.valueFormat, n.context), x = n.viewModel.unit && !n.viewModel.valueFormat.unit && n.viewModel.valueFormat.type !== "percent" ? n.viewModel.unit : "";
|
|
41
|
+
return `${l(w)}<br/><strong>${l(R)}${l(x)}</strong>`;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
series: [
|
|
45
|
+
{
|
|
46
|
+
type: "wordCloud",
|
|
47
|
+
shape: "circle",
|
|
48
|
+
left: "center",
|
|
49
|
+
top: "center",
|
|
50
|
+
width: "96%",
|
|
51
|
+
height: "92%",
|
|
52
|
+
sizeRange: [n.viewModel.minFontSize, n.viewModel.maxFontSize],
|
|
53
|
+
rotationRange: [0, 0],
|
|
54
|
+
rotationStep: 1,
|
|
55
|
+
gridSize: 8,
|
|
56
|
+
drawOutOfBound: !1,
|
|
57
|
+
shrinkToFit: !0,
|
|
58
|
+
layoutAnimation: !0,
|
|
59
|
+
textStyle: {
|
|
60
|
+
fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
61
|
+
fontWeight: 600
|
|
62
|
+
},
|
|
63
|
+
emphasis: {
|
|
64
|
+
focus: "self"
|
|
65
|
+
},
|
|
66
|
+
data: s
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function m() {
|
|
72
|
+
e == null || e.setOption(v(), !0);
|
|
73
|
+
}
|
|
74
|
+
_(async () => {
|
|
75
|
+
await import("echarts-wordcloud"), !(d || !a.value) && (e = A.init(a.value), m(), typeof ResizeObserver < "u" && (r = new ResizeObserver(() => e == null ? void 0 : e.resize()), r.observe(a.value)));
|
|
76
|
+
}), O(
|
|
77
|
+
() => [n.viewModel, n.context],
|
|
78
|
+
() => m()
|
|
79
|
+
), b(() => {
|
|
80
|
+
d = !0, r == null || r.disconnect(), e == null || e.dispose(), e = void 0;
|
|
81
|
+
});
|
|
82
|
+
function g() {
|
|
83
|
+
return e == null ? void 0 : e.getDataURL({ type: "png", pixelRatio: 2, backgroundColor: "#fff" });
|
|
84
|
+
}
|
|
85
|
+
return f({ exportPng: g }), (o, s) => (h(), F("div", {
|
|
86
|
+
ref_key: "containerRef",
|
|
87
|
+
ref: a,
|
|
88
|
+
class: "dv-word-cloud-renderer",
|
|
89
|
+
style: { width: "100%", "min-width": "0", height: "320px" }
|
|
90
|
+
}, null, 512));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
export {
|
|
94
|
+
D as default
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=WordCloudRenderer-7tzJz57a.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WordCloudRenderer-7tzJz57a.js","sources":["../src/renderers/word-cloud/WordCloudRenderer.vue"],"sourcesContent":["<template>\n <div ref=\"containerRef\" class=\"dv-word-cloud-renderer\" style=\"width: 100%; min-width: 0; height: 320px\" />\n</template>\n\n<script setup lang=\"ts\">\nimport * as echarts from \"echarts\";\nimport type { ECharts, EChartsOption } from \"echarts\";\nimport { onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nimport { valueFormatter, type DashboardContext, type PanelConfig, type WordCloudViewModel } from \"../../core\";\nimport { STANDARD_CHART_COLORS, STANDARD_CHART_TOOLTIP } from \"../../vue/theme\";\n\ndefineOptions({ name: \"WordCloudRenderer\" });\n\nconst props = defineProps<{ viewModel: WordCloudViewModel; panel: PanelConfig; context: DashboardContext }>();\nconst containerRef = ref<HTMLDivElement>();\nlet chart: ECharts | undefined;\nlet resizeObserver: ResizeObserver | undefined;\nlet disposed = false;\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null ? (value as Record<string, unknown>) : {};\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (character) => {\n const entities: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" };\n return entities[character]!;\n });\n}\n\nfunction buildOption(): EChartsOption {\n const semantics = Array.from(\n new Set(props.viewModel.words.map((word) => word.semantic).filter((value): value is string => Boolean(value)))\n ).sort();\n const words = props.viewModel.words.map((word, index) => ({\n id: word.id,\n name: word.label,\n value: word.value,\n semantic: word.semantic,\n textStyle: {\n color:\n STANDARD_CHART_COLORS[\n word.semantic\n ? semantics.indexOf(word.semantic) % STANDARD_CHART_COLORS.length\n : index % STANDARD_CHART_COLORS.length\n ]\n }\n }));\n\n return {\n animationDurationUpdate: 240,\n tooltip: {\n ...STANDARD_CHART_TOOLTIP,\n trigger: \"item\",\n formatter(raw: unknown) {\n const data = asRecord(asRecord(raw).data);\n const label = typeof data.name === \"string\" ? data.name : \"\";\n const value = typeof data.value === \"number\" ? data.value : null;\n const formatted = valueFormatter.formatTooltip(value, props.viewModel.valueFormat, props.context);\n const unit =\n props.viewModel.unit && !props.viewModel.valueFormat.unit && props.viewModel.valueFormat.type !== \"percent\"\n ? props.viewModel.unit\n : \"\";\n return `${escapeHtml(label)}<br/><strong>${escapeHtml(formatted)}${escapeHtml(unit)}</strong>`;\n }\n },\n series: [\n {\n type: \"wordCloud\",\n shape: \"circle\",\n left: \"center\",\n top: \"center\",\n width: \"96%\",\n height: \"92%\",\n sizeRange: [props.viewModel.minFontSize, props.viewModel.maxFontSize],\n rotationRange: [0, 0],\n rotationStep: 1,\n gridSize: 8,\n drawOutOfBound: false,\n shrinkToFit: true,\n layoutAnimation: true,\n textStyle: {\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 600\n },\n emphasis: {\n focus: \"self\"\n },\n data: words\n }\n ]\n } as EChartsOption;\n}\n\nfunction render(): void {\n chart?.setOption(buildOption(), true);\n}\n\nonMounted(async () => {\n await import(\"echarts-wordcloud\");\n if (disposed || !containerRef.value) return;\n chart = echarts.init(containerRef.value);\n render();\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => chart?.resize());\n resizeObserver.observe(containerRef.value);\n }\n});\n\nwatch(\n () => [props.viewModel, props.context] as const,\n () => render()\n);\n\nonBeforeUnmount(() => {\n disposed = true;\n resizeObserver?.disconnect();\n chart?.dispose();\n chart = undefined;\n});\n\nfunction exportPng(): string | undefined {\n return chart?.getDataURL({ type: \"png\", pixelRatio: 2, backgroundColor: \"#fff\" });\n}\n\ndefineExpose({ exportPng });\n</script>\n"],"names":["props","__props","containerRef","ref","chart","resizeObserver","disposed","asRecord","value","escapeHtml","character","buildOption","semantics","word","words","index","STANDARD_CHART_COLORS","STANDARD_CHART_TOOLTIP","raw","data","label","formatted","valueFormatter","unit","render","onMounted","echarts","watch","onBeforeUnmount","exportPng","__expose"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/adapter/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
|