@blazes/data-visualization 0.0.0-stage → 1.0.0-alpha.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 (170) hide show
  1. package/README.md +238 -2
  2. package/dist/.vite/manifest.json +129 -0
  3. package/dist/PivotTableS2Renderer-C-Urwhuv.js +109 -0
  4. package/dist/PivotTableS2Renderer-C-Urwhuv.js.map +1 -0
  5. package/dist/WordCloudRenderer-7tzJz57a.js +96 -0
  6. package/dist/WordCloudRenderer-7tzJz57a.js.map +1 -0
  7. package/dist/core/adapter/index.d.ts +5 -0
  8. package/dist/core/adapter/index.d.ts.map +1 -0
  9. package/dist/core/adapter/standard-adapters.d.ts +211 -0
  10. package/dist/core/adapter/standard-adapters.d.ts.map +1 -0
  11. package/dist/core/adapter/standard-definitions.d.ts +230 -0
  12. package/dist/core/adapter/standard-definitions.d.ts.map +1 -0
  13. package/dist/core/adapter/types.d.ts +44 -0
  14. package/dist/core/adapter/types.d.ts.map +1 -0
  15. package/dist/core/adapter/view-models.d.ts +101 -0
  16. package/dist/core/adapter/view-models.d.ts.map +1 -0
  17. package/dist/core/config/config-validator.d.ts +27 -0
  18. package/dist/core/config/config-validator.d.ts.map +1 -0
  19. package/dist/core/config/dashboard-config-schema.d.ts +1360 -0
  20. package/dist/core/config/dashboard-config-schema.d.ts.map +1 -0
  21. package/dist/core/config/dashboard-config.d.ts +410 -0
  22. package/dist/core/config/dashboard-config.d.ts.map +1 -0
  23. package/dist/core/config/index.d.ts +9 -0
  24. package/dist/core/config/index.d.ts.map +1 -0
  25. package/dist/core/config/json-value.d.ts +5 -0
  26. package/dist/core/config/json-value.d.ts.map +1 -0
  27. package/dist/core/config/runtime-schema.d.ts +28 -0
  28. package/dist/core/config/runtime-schema.d.ts.map +1 -0
  29. package/dist/core/config/schema-version.d.ts +3 -0
  30. package/dist/core/config/schema-version.d.ts.map +1 -0
  31. package/dist/core/config/serializable.d.ts +6 -0
  32. package/dist/core/config/serializable.d.ts.map +1 -0
  33. package/dist/core/config/value-path.d.ts +2 -0
  34. package/dist/core/config/value-path.d.ts.map +1 -0
  35. package/dist/core/dataset/dataset-runner.d.ts +28 -0
  36. package/dist/core/dataset/dataset-runner.d.ts.map +1 -0
  37. package/dist/core/dataset/index.d.ts +4 -0
  38. package/dist/core/dataset/index.d.ts.map +1 -0
  39. package/dist/core/dataset/normalize.d.ts +8 -0
  40. package/dist/core/dataset/normalize.d.ts.map +1 -0
  41. package/dist/core/dataset/types.d.ts +37 -0
  42. package/dist/core/dataset/types.d.ts.map +1 -0
  43. package/dist/core/export/csv.d.ts +11 -0
  44. package/dist/core/export/csv.d.ts.map +1 -0
  45. package/dist/core/export/index.d.ts +2 -0
  46. package/dist/core/export/index.d.ts.map +1 -0
  47. package/dist/core/formatter/index.d.ts +2 -0
  48. package/dist/core/formatter/index.d.ts.map +1 -0
  49. package/dist/core/formatter/value-formatter.d.ts +14 -0
  50. package/dist/core/formatter/value-formatter.d.ts.map +1 -0
  51. package/dist/core/index.d.ts +11 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +111 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/provider/data-provider.d.ts +18 -0
  56. package/dist/core/provider/data-provider.d.ts.map +1 -0
  57. package/dist/core/provider/index.d.ts +5 -0
  58. package/dist/core/provider/index.d.ts.map +1 -0
  59. package/dist/core/provider/request-executor.d.ts +48 -0
  60. package/dist/core/provider/request-executor.d.ts.map +1 -0
  61. package/dist/core/provider/request-value-codec.d.ts +15 -0
  62. package/dist/core/provider/request-value-codec.d.ts.map +1 -0
  63. package/dist/core/provider/resolve-request-input.d.ts +12 -0
  64. package/dist/core/provider/resolve-request-input.d.ts.map +1 -0
  65. package/dist/core/registry/core-registries.d.ts +15 -0
  66. package/dist/core/registry/core-registries.d.ts.map +1 -0
  67. package/dist/core/registry/index.d.ts +4 -0
  68. package/dist/core/registry/index.d.ts.map +1 -0
  69. package/dist/core/registry/plugin-registry.d.ts +28 -0
  70. package/dist/core/registry/plugin-registry.d.ts.map +1 -0
  71. package/dist/core/registry/register-standard.d.ts +4 -0
  72. package/dist/core/registry/register-standard.d.ts.map +1 -0
  73. package/dist/core/runtime/dashboard-data-runtime.d.ts +26 -0
  74. package/dist/core/runtime/dashboard-data-runtime.d.ts.map +1 -0
  75. package/dist/core/runtime/dashboard-runtime.d.ts +458 -0
  76. package/dist/core/runtime/dashboard-runtime.d.ts.map +1 -0
  77. package/dist/core/runtime/dependency-graph.d.ts +11 -0
  78. package/dist/core/runtime/dependency-graph.d.ts.map +1 -0
  79. package/dist/core/runtime/index.d.ts +5 -0
  80. package/dist/core/runtime/index.d.ts.map +1 -0
  81. package/dist/core/runtime/types.d.ts +47 -0
  82. package/dist/core/runtime/types.d.ts.map +1 -0
  83. package/dist/core/telemetry/index.d.ts +2 -0
  84. package/dist/core/telemetry/index.d.ts.map +1 -0
  85. package/dist/core/telemetry/telemetry.d.ts +15 -0
  86. package/dist/core/telemetry/telemetry.d.ts.map +1 -0
  87. package/dist/core/variable/dashboard-context.d.ts +22 -0
  88. package/dist/core/variable/dashboard-context.d.ts.map +1 -0
  89. package/dist/core/variable/index.d.ts +3 -0
  90. package/dist/core/variable/index.d.ts.map +1 -0
  91. package/dist/core/variable/url-state.d.ts +17 -0
  92. package/dist/core/variable/url-state.d.ts.map +1 -0
  93. package/dist/csv-Dyrr2yMA.js +254 -0
  94. package/dist/csv-Dyrr2yMA.js.map +1 -0
  95. package/dist/dashboard-runtime-8a-9P8Ku.js +1540 -0
  96. package/dist/dashboard-runtime-8a-9P8Ku.js.map +1 -0
  97. package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts +18 -0
  98. package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts.map +1 -0
  99. package/dist/experimental/s2/index.d.ts +13 -0
  100. package/dist/experimental/s2/index.d.ts.map +1 -0
  101. package/dist/experimental/s2/index.js +66 -0
  102. package/dist/experimental/s2/index.js.map +1 -0
  103. package/dist/experimental/s2/pivot-table-s2.d.ts +23 -0
  104. package/dist/experimental/s2/pivot-table-s2.d.ts.map +1 -0
  105. package/dist/index.css +1 -0
  106. package/dist/index.d.ts +2 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +111 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts +20 -0
  111. package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts.map +1 -0
  112. package/dist/renderers/word-cloud/index.d.ts +8 -0
  113. package/dist/renderers/word-cloud/index.d.ts.map +1 -0
  114. package/dist/renderers/word-cloud/index.js +17 -0
  115. package/dist/renderers/word-cloud/index.js.map +1 -0
  116. package/dist/runtime-schema-BO2qLlvE.js +580 -0
  117. package/dist/runtime-schema-BO2qLlvE.js.map +1 -0
  118. package/dist/serializable-DOOpLZyk.js +36 -0
  119. package/dist/serializable-DOOpLZyk.js.map +1 -0
  120. package/dist/standard-definitions-DHtaLAf1.js +351 -0
  121. package/dist/standard-definitions-DHtaLAf1.js.map +1 -0
  122. package/dist/value-formatter-D5QmLSMG.js +47 -0
  123. package/dist/value-formatter-D5QmLSMG.js.map +1 -0
  124. package/dist/visual-theme-DH-k3L51.js +23 -0
  125. package/dist/visual-theme-DH-k3L51.js.map +1 -0
  126. package/dist/vue/components/DashboardFilterBar.vue.d.ts +23 -0
  127. package/dist/vue/components/DashboardFilterBar.vue.d.ts.map +1 -0
  128. package/dist/vue/components/DashboardPanel.vue.d.ts +39 -0
  129. package/dist/vue/components/DashboardPanel.vue.d.ts.map +1 -0
  130. package/dist/vue/components/DashboardRenderer.vue.d.ts +57 -0
  131. package/dist/vue/components/DashboardRenderer.vue.d.ts.map +1 -0
  132. package/dist/vue/components/index.d.ts +4 -0
  133. package/dist/vue/components/index.d.ts.map +1 -0
  134. package/dist/vue/composables/index.d.ts +2 -0
  135. package/dist/vue/composables/index.d.ts.map +1 -0
  136. package/dist/vue/composables/use-dashboard-runtime.d.ts +17 -0
  137. package/dist/vue/composables/use-dashboard-runtime.d.ts.map +1 -0
  138. package/dist/vue/export/browser-download.d.ts +3 -0
  139. package/dist/vue/export/browser-download.d.ts.map +1 -0
  140. package/dist/vue/export/index.d.ts +2 -0
  141. package/dist/vue/export/index.d.ts.map +1 -0
  142. package/dist/vue/index.d.ts +7 -0
  143. package/dist/vue/index.d.ts.map +1 -0
  144. package/dist/vue/index.js +1064 -0
  145. package/dist/vue/index.js.map +1 -0
  146. package/dist/vue/registry/index.d.ts +3 -0
  147. package/dist/vue/registry/index.d.ts.map +1 -0
  148. package/dist/vue/registry/register-standard.d.ts +3 -0
  149. package/dist/vue/registry/register-standard.d.ts.map +1 -0
  150. package/dist/vue/registry/renderer-registry.d.ts +12 -0
  151. package/dist/vue/registry/renderer-registry.d.ts.map +1 -0
  152. package/dist/vue/renderers/BarRenderer.vue.d.ts +24 -0
  153. package/dist/vue/renderers/BarRenderer.vue.d.ts.map +1 -0
  154. package/dist/vue/renderers/LineRenderer.vue.d.ts +24 -0
  155. package/dist/vue/renderers/LineRenderer.vue.d.ts.map +1 -0
  156. package/dist/vue/renderers/MetricRenderer.vue.d.ts +17 -0
  157. package/dist/vue/renderers/MetricRenderer.vue.d.ts.map +1 -0
  158. package/dist/vue/renderers/PieRenderer.vue.d.ts +24 -0
  159. package/dist/vue/renderers/PieRenderer.vue.d.ts.map +1 -0
  160. package/dist/vue/renderers/TableRenderer.vue.d.ts +21 -0
  161. package/dist/vue/renderers/TableRenderer.vue.d.ts.map +1 -0
  162. package/dist/vue/renderers/chart-format.d.ts +8 -0
  163. package/dist/vue/renderers/chart-format.d.ts.map +1 -0
  164. package/dist/vue/renderers/index.d.ts +7 -0
  165. package/dist/vue/renderers/index.d.ts.map +1 -0
  166. package/dist/vue/theme/index.d.ts +2 -0
  167. package/dist/vue/theme/index.d.ts.map +1 -0
  168. package/dist/vue/theme/visual-theme.d.ts +46 -0
  169. package/dist/vue/theme/visual-theme.d.ts.map +1 -0
  170. package/package.json +129 -4
@@ -0,0 +1,1064 @@
1
+ import { defineComponent as O, openBlock as p, createElementBlock as w, normalizeClass as q, createElementVNode as P, Fragment as H, renderList as K, normalizeStyle as ue, toDisplayString as L, createVNode as R, unref as u, mergeProps as Me, withCtx as k, createTextVNode as U, createBlock as A, createCommentVNode as I, ref as j, computed as $, onErrorCaptured as xe, watch as Ce, resolveDynamicComponent as pe, pushScopeId as Se, popScopeId as ke, shallowRef as Re, onMounted as fe, onBeforeUnmount as ve, onBeforeMount as Ie, markRaw as $e, toRaw as Pe, h as V } from "vue";
2
+ import { FormatType as Z, ChartBar as De, Size as J, ChartLine as Ae, ChartPie as ze } from "@blazes/charts";
3
+ import { a as ee, b as G, c as Q, S as te } from "../visual-theme-DH-k3L51.js";
4
+ import { v as E } from "../value-formatter-D5QmLSMG.js";
5
+ import { RedoOutlined as X, ExclamationCircleOutlined as Le, WarningOutlined as Te, CloudDownloadOutlined as Fe, QuestionCircleOutlined as Ee, RiseOutlined as me, FallOutlined as ge, MinusOutlined as he } from "@ant-design/icons-vue";
6
+ import { RangePicker as Ve, RadioGroup as Oe, RadioButton as Be, Select as le, Tooltip as N, Button as Y, Card as Ue, Spin as de, Empty as Ne, Dropdown as je, Menu as Ye, MenuItem as ce, Progress as He, Tag as qe, Table as Ke } from "ant-design-vue";
7
+ import { b as Ge, s as We, a as Ze, P as Qe } from "../csv-Dyrr2yMA.js";
8
+ const Xe = { class: "dv-filter-bar__controls" }, Je = { class: "dv-filter-bar__label" }, et = {
9
+ key: 0,
10
+ class: "dv-filter-bar__date-range"
11
+ }, tt = /* @__PURE__ */ O({
12
+ __name: "DashboardFilterBar",
13
+ props: {
14
+ config: {},
15
+ context: {},
16
+ loading: { type: Boolean }
17
+ },
18
+ emits: ["change", "refresh"],
19
+ setup(r, { emit: g }) {
20
+ const i = r, e = g;
21
+ function y(o) {
22
+ return {
23
+ "--dv-filter-xs": String(o.xs),
24
+ "--dv-filter-sm": String(o.sm ?? o.xs),
25
+ "--dv-filter-md": String(o.md ?? o.sm ?? o.xs),
26
+ "--dv-filter-lg": String(o.lg ?? o.md ?? o.sm ?? o.xs),
27
+ "--dv-filter-xl": String(o.xl ?? o.lg ?? o.md ?? o.sm ?? o.xs)
28
+ };
29
+ }
30
+ function x(o) {
31
+ return o;
32
+ }
33
+ function C(o) {
34
+ return o.map((a) => ({ ...a }));
35
+ }
36
+ function s(o) {
37
+ if (typeof o != "string" || !/^\d{4}-\d{2}-\d{2}$/.test(o)) return;
38
+ const a = /* @__PURE__ */ new Date(`${o}T12:00:00Z`);
39
+ return Number.isNaN(a.getTime()) ? void 0 : a;
40
+ }
41
+ function S(o) {
42
+ return o.toISOString().slice(0, 10);
43
+ }
44
+ function D() {
45
+ const o = new Intl.DateTimeFormat("en-CA", {
46
+ timeZone: i.context.timezone,
47
+ year: "numeric",
48
+ month: "2-digit",
49
+ day: "2-digit"
50
+ }).formatToParts(/* @__PURE__ */ new Date()), a = Object.fromEntries(o.map((h) => [h.type, h.value])), t = /* @__PURE__ */ new Date(`${a.year}-${a.month}-${a.day}T12:00:00Z`);
51
+ return t.setUTCDate(t.getUTCDate() - 1), t;
52
+ }
53
+ function c(o) {
54
+ return i.context.variables[o];
55
+ }
56
+ function l(o) {
57
+ const a = c(o.startVariableId), t = c(o.endVariableId);
58
+ return typeof a != "string" || typeof t != "string" || !s(a) || !s(t) ? {} : { value: [a, t] };
59
+ }
60
+ function f(o, a) {
61
+ if (!Array.isArray(a) || a.length !== 2) return;
62
+ const [t, h] = a;
63
+ typeof t != "string" || typeof h != "string" || e("change", {
64
+ [o.startVariableId]: t,
65
+ [o.endVariableId]: h
66
+ });
67
+ }
68
+ function d(o) {
69
+ var _, z;
70
+ const a = s(c(o.startVariableId)), t = s(c(o.endVariableId));
71
+ if (!a || !t || t.getTime() !== D().getTime()) return;
72
+ const h = Math.round((t.getTime() - a.getTime()) / 864e5) + 1;
73
+ return (z = (_ = o.presets) == null ? void 0 : _.find((F) => F.days === h)) == null ? void 0 : z.id;
74
+ }
75
+ function n(o, a) {
76
+ var F;
77
+ const t = typeof a.target.value == "string" ? a.target.value : void 0, h = (F = o.presets) == null ? void 0 : F.find((W) => W.id === t);
78
+ if (!h) return;
79
+ const _ = D(), z = new Date(_);
80
+ z.setUTCDate(z.getUTCDate() - h.days + 1), e("change", {
81
+ [o.startVariableId]: S(z),
82
+ [o.endVariableId]: S(_)
83
+ });
84
+ }
85
+ function M(o, a) {
86
+ e("change", { [o]: a ?? null });
87
+ }
88
+ return (o, a) => o.config ? (p(), w("div", {
89
+ key: 0,
90
+ class: q(["dv-filter-bar", { "dv-filter-bar--flow": o.config.layout === "flow" }])
91
+ }, [
92
+ P("div", Xe, [
93
+ (p(!0), w(H, null, K(o.config.controls, (t) => {
94
+ var h;
95
+ return p(), w("div", {
96
+ key: t.id,
97
+ class: q(["dv-filter-bar__control", `dv-filter-bar__control--${t.type}`]),
98
+ style: ue(y(t.layout))
99
+ }, [
100
+ P("label", Je, L(t.label), 1),
101
+ t.type === "date-range" ? (p(), w("div", et, [
102
+ R(u(Ve), Me({
103
+ class: "dv-filter-bar__range-picker",
104
+ "allow-clear": !1,
105
+ disabled: t.disabled ?? !1,
106
+ "dropdown-class-name": "dv-filter-bar__date-popup",
107
+ format: t.format ?? "YYYY-MM-DD"
108
+ }, l(t), {
109
+ "value-format": "YYYY-MM-DD",
110
+ onChange: (_) => f(t, _)
111
+ }), {
112
+ separator: k(() => [
113
+ U("至")
114
+ ]),
115
+ _: 2
116
+ }, 1040, ["disabled", "format", "onChange"]),
117
+ (h = t.presets) != null && h.length ? (p(), A(u(Oe), {
118
+ key: 0,
119
+ class: "dv-filter-bar__presets",
120
+ disabled: t.disabled ?? !1,
121
+ size: "small",
122
+ value: d(t),
123
+ onChange: (_) => n(t, _)
124
+ }, {
125
+ default: k(() => [
126
+ (p(!0), w(H, null, K(t.presets, (_) => (p(), A(u(Be), {
127
+ key: _.id,
128
+ value: _.id
129
+ }, {
130
+ default: k(() => [
131
+ U(L(_.label), 1)
132
+ ]),
133
+ _: 2
134
+ }, 1032, ["value"]))), 128))
135
+ ]),
136
+ _: 2
137
+ }, 1032, ["disabled", "value", "onChange"])) : I("", !0)
138
+ ])) : t.type === "multi-select" ? (p(), A(u(le), {
139
+ key: 1,
140
+ "allow-clear": t.allowClear ?? !1,
141
+ disabled: t.disabled ?? !1,
142
+ "max-tag-count": t.maxTagCount ?? "responsive",
143
+ mode: "multiple",
144
+ "option-filter-prop": "label",
145
+ options: C(t.options),
146
+ placeholder: t.placeholder ?? "",
147
+ "show-search": t.showSearch ?? !1,
148
+ value: o.context.variables[t.variableId],
149
+ onChange: (_) => M(t.variableId, _)
150
+ }, null, 8, ["allow-clear", "disabled", "max-tag-count", "options", "placeholder", "show-search", "value", "onChange"])) : (p(), A(u(le), {
151
+ key: 2,
152
+ "allow-clear": t.allowClear ?? !1,
153
+ disabled: t.disabled ?? !1,
154
+ "option-filter-prop": "label",
155
+ options: C(t.options),
156
+ placeholder: t.placeholder ?? "",
157
+ "show-search": t.showSearch ?? !1,
158
+ value: o.context.variables[t.variableId],
159
+ onChange: (_) => M(t.variableId, _)
160
+ }, null, 8, ["allow-clear", "disabled", "options", "placeholder", "show-search", "value", "onChange"]))
161
+ ], 6);
162
+ }), 128))
163
+ ]),
164
+ o.config.showRefresh !== !1 ? (p(), A(u(N), {
165
+ key: 0,
166
+ title: "刷新全部"
167
+ }, {
168
+ default: k(() => [
169
+ R(u(Y), {
170
+ type: "primary",
171
+ class: "dv-filter-bar__refresh",
172
+ loading: o.loading ?? !1,
173
+ onClick: a[0] || (a[0] = (t) => o.$emit("refresh"))
174
+ }, {
175
+ icon: k(() => [
176
+ R(u(X))
177
+ ]),
178
+ default: k(() => [
179
+ U(" 刷新 ")
180
+ ]),
181
+ _: 1
182
+ }, 8, ["loading"])
183
+ ]),
184
+ _: 1
185
+ })) : I("", !0)
186
+ ], 2)) : I("", !0);
187
+ }
188
+ }), B = (r, g) => {
189
+ const i = r.__vccOpts || r;
190
+ for (const [e, y] of g)
191
+ i[e] = y;
192
+ return i;
193
+ }, nt = /* @__PURE__ */ B(tt, [["__scopeId", "data-v-45855b0b"]]), at = (r) => (Se("data-v-912acf36"), r = r(), ke(), r), ot = { class: "dv-panel__heading" }, it = { class: "dv-panel__title-group" }, rt = { class: "dv-panel__title" }, st = {
194
+ key: 0,
195
+ class: "dv-panel__title-note"
196
+ }, lt = { class: "dv-panel__actions" }, dt = {
197
+ key: 0,
198
+ class: "dv-panel__filters"
199
+ }, ct = {
200
+ key: 1,
201
+ class: "dv-panel__state dv-panel__state--failure",
202
+ role: "status"
203
+ }, ut = { class: "dv-panel__failure" }, pt = { class: "dv-panel__failure-copy" }, ft = { class: "dv-panel__failure-heading" }, vt = ["title"], mt = /* @__PURE__ */ at(() => /* @__PURE__ */ P("span", { class: "dv-panel__retry-label" }, "重新加载", -1)), gt = {
204
+ key: 2,
205
+ class: "dv-panel__state dv-panel__state--loading"
206
+ }, ht = {
207
+ key: 0,
208
+ class: "dv-panel__state dv-panel__state--metric-empty"
209
+ }, yt = {
210
+ key: 4,
211
+ class: "dv-panel__renderer"
212
+ }, _t = {
213
+ key: 0,
214
+ class: "dv-panel__refreshing"
215
+ }, bt = {
216
+ key: 5,
217
+ class: "dv-panel__state dv-panel__idle"
218
+ }, wt = {
219
+ key: 6,
220
+ class: "dv-panel__updated"
221
+ }, Mt = /* @__PURE__ */ O({
222
+ __name: "DashboardPanel",
223
+ props: {
224
+ panel: {},
225
+ state: {},
226
+ context: {},
227
+ definition: {},
228
+ renderer: {},
229
+ filterSummary: {},
230
+ refreshDisabled: { type: Boolean }
231
+ },
232
+ emits: ["refresh", "retry", "exportCsv", "exportPng", "action", "visualizationEvent"],
233
+ setup(r, { expose: g, emit: i }) {
234
+ const e = r, y = i, x = j(), C = j(), s = $(() => e.panel.rendererId === "metric"), S = $(() => {
235
+ var n;
236
+ if (C.value)
237
+ return { title: "图表暂时无法展示", detail: C.value.message };
238
+ if (e.state.status === "error" || e.state.status === "cancelled")
239
+ return { title: "数据暂时无法加载", detail: (n = e.state.error) == null ? void 0 : n.message };
240
+ }), D = $(
241
+ () => e.definition.capabilities.csv && !!e.state.dataset || e.definition.capabilities.png && !!e.state.viewModel
242
+ ), c = $(() => {
243
+ const n = e.panel.layout.minHeight ?? (s.value ? 119 : 401), M = s.value ? 40 : 50;
244
+ return { minHeight: `${Math.max(n - M - 2, s.value ? 77 : 190)}px` };
245
+ }), l = $(
246
+ () => e.state.lastSuccessfulAt ? new Intl.DateTimeFormat(e.context.locale, { timeStyle: "medium", timeZone: e.context.timezone }).format(
247
+ new Date(e.state.lastSuccessfulAt)
248
+ ) : ""
249
+ );
250
+ function f() {
251
+ var n, M;
252
+ return (M = (n = x.value) == null ? void 0 : n.exportPng) == null ? void 0 : M.call(n);
253
+ }
254
+ function d(n) {
255
+ n.key === "csv" && y("exportCsv"), n.key === "png" && y("exportPng");
256
+ }
257
+ return xe((n) => (C.value = n instanceof Error ? n : new Error(String(n)), !1)), Ce(
258
+ () => [e.state.generation, e.state.viewModel],
259
+ () => {
260
+ C.value = void 0;
261
+ }
262
+ ), g({ exportPng: f }), (n, M) => (p(), A(u(Ue), {
263
+ class: q(["dv-panel", { "dv-panel--metric": s.value }]),
264
+ "body-style": c.value
265
+ }, {
266
+ title: k(() => [
267
+ P("div", ot, [
268
+ P("span", it, [
269
+ P("span", rt, L(n.panel.title), 1),
270
+ n.panel.description ? (p(), A(u(N), {
271
+ key: 0,
272
+ title: n.panel.description
273
+ }, {
274
+ default: k(() => [
275
+ R(u(Ee))
276
+ ]),
277
+ _: 1
278
+ }, 8, ["title"])) : I("", !0)
279
+ ]),
280
+ n.panel.titleNote ? (p(), w("span", st, L(n.panel.titleNote), 1)) : I("", !0)
281
+ ])
282
+ ]),
283
+ extra: k(() => {
284
+ var o;
285
+ return [
286
+ P("div", lt, [
287
+ n.state.status === "stale" ? (p(), A(u(N), {
288
+ key: 0,
289
+ title: `刷新失败,当前展示上次成功数据${(o = n.state.error) != null && o.message ? `:${n.state.error.message}` : ""}`
290
+ }, {
291
+ default: k(() => [
292
+ R(u(Te), { class: "dv-panel__warning" })
293
+ ]),
294
+ _: 1
295
+ }, 8, ["title"])) : I("", !0),
296
+ R(u(N), {
297
+ title: n.refreshDisabled ? "正在刷新全部" : "刷新"
298
+ }, {
299
+ default: k(() => [
300
+ R(u(Y), {
301
+ disabled: n.refreshDisabled ?? !1,
302
+ type: "text",
303
+ size: "small",
304
+ onClick: M[0] || (M[0] = (a) => n.$emit("refresh"))
305
+ }, {
306
+ icon: k(() => [
307
+ R(u(X))
308
+ ]),
309
+ _: 1
310
+ }, 8, ["disabled"])
311
+ ]),
312
+ _: 1
313
+ }, 8, ["title"]),
314
+ D.value ? (p(), A(u(je), {
315
+ key: 1,
316
+ placement: "bottomRight",
317
+ trigger: ["click"]
318
+ }, {
319
+ overlay: k(() => [
320
+ R(u(Ye), { onClick: d }, {
321
+ default: k(() => [
322
+ n.definition.capabilities.csv && n.state.dataset ? (p(), A(u(ce), { key: "csv" }, {
323
+ default: k(() => [
324
+ U("导出 CSV")
325
+ ]),
326
+ _: 1
327
+ })) : I("", !0),
328
+ n.definition.capabilities.png && n.state.viewModel ? (p(), A(u(ce), { key: "png" }, {
329
+ default: k(() => [
330
+ U("导出 PNG")
331
+ ]),
332
+ _: 1
333
+ })) : I("", !0)
334
+ ]),
335
+ _: 1
336
+ })
337
+ ]),
338
+ default: k(() => [
339
+ R(u(N), { title: "下载" }, {
340
+ default: k(() => [
341
+ R(u(Y), {
342
+ type: "text",
343
+ size: "small"
344
+ }, {
345
+ icon: k(() => [
346
+ R(u(Fe))
347
+ ]),
348
+ _: 1
349
+ })
350
+ ]),
351
+ _: 1
352
+ })
353
+ ]),
354
+ _: 1
355
+ })) : I("", !0),
356
+ (p(!0), w(H, null, K(n.panel.actions ?? [], (a) => (p(), A(u(Y), {
357
+ key: a.id,
358
+ type: "link",
359
+ size: "small",
360
+ onClick: (t) => n.$emit("action", a.id)
361
+ }, {
362
+ default: k(() => [
363
+ U(L(a.label ?? a.id), 1)
364
+ ]),
365
+ _: 2
366
+ }, 1032, ["onClick"]))), 128))
367
+ ])
368
+ ];
369
+ }),
370
+ default: k(() => [
371
+ n.filterSummary ? (p(), w("div", dt, L(n.filterSummary), 1)) : I("", !0),
372
+ S.value ? (p(), w("div", ct, [
373
+ P("div", ut, [
374
+ R(u(Le), { class: "dv-panel__failure-icon" }),
375
+ P("div", pt, [
376
+ P("div", ft, L(S.value.title), 1),
377
+ S.value.detail ? (p(), w("div", {
378
+ key: 0,
379
+ class: "dv-panel__failure-detail",
380
+ title: S.value.detail
381
+ }, L(S.value.detail), 9, vt)) : I("", !0)
382
+ ]),
383
+ R(u(N), { title: "重试" }, {
384
+ default: k(() => [
385
+ R(u(Y), {
386
+ class: "dv-panel__retry",
387
+ size: "small",
388
+ "aria-label": "重试",
389
+ onClick: M[1] || (M[1] = (o) => n.$emit("retry"))
390
+ }, {
391
+ icon: k(() => [
392
+ R(u(X))
393
+ ]),
394
+ default: k(() => [
395
+ mt
396
+ ]),
397
+ _: 1
398
+ })
399
+ ]),
400
+ _: 1
401
+ })
402
+ ])
403
+ ])) : n.state.status === "loading" && !n.state.viewModel ? (p(), w("div", gt, [
404
+ R(u(de))
405
+ ])) : n.state.status === "empty" ? (p(), w(H, { key: 3 }, [
406
+ s.value ? (p(), w("div", ht, "暂无数据")) : (p(), A(u(Ne), {
407
+ key: 1,
408
+ class: "dv-panel__state",
409
+ description: "暂无数据"
410
+ }))
411
+ ], 64)) : n.state.viewModel ? (p(), w("div", yt, [
412
+ (p(), A(pe(n.renderer), {
413
+ ref_key: "rendererRef",
414
+ ref: x,
415
+ context: n.context,
416
+ panel: n.panel,
417
+ "view-model": n.state.viewModel,
418
+ onVisualizationEvent: M[2] || (M[2] = (o) => n.$emit("visualizationEvent", o))
419
+ }, null, 40, ["context", "panel", "view-model"])),
420
+ n.state.isRefreshing ? (p(), w("div", _t, [
421
+ R(u(de))
422
+ ])) : I("", !0)
423
+ ])) : (p(), w("div", bt, "等待加载")),
424
+ n.state.lastSuccessfulAt ? (p(), w("div", wt, "更新于 " + L(l.value), 1)) : I("", !0)
425
+ ]),
426
+ _: 1
427
+ }, 8, ["class", "body-style"]));
428
+ }
429
+ }), xt = /* @__PURE__ */ B(Mt, [["__scopeId", "data-v-912acf36"]]);
430
+ function Ct(r, g = {}) {
431
+ const i = Re(r.snapshot);
432
+ let e;
433
+ return fe(() => {
434
+ e = r.subscribe((y) => {
435
+ i.value = y;
436
+ }), g.autoLoad !== !1 && r.load();
437
+ }), ve(() => e == null ? void 0 : e()), {
438
+ snapshot: i,
439
+ context: $(() => i.value.context),
440
+ panelStates: $(() => i.value.panelStates),
441
+ isLoading: $(() => i.value.isGlobalLoading),
442
+ loadPanels: (y) => r.loadPanels(y),
443
+ refreshAll: () => r.refreshAll(),
444
+ refreshPanels: (y, x) => r.refreshPanels(y, x),
445
+ refreshPanel: (y) => r.refreshPanel(y),
446
+ retryPanel: (y) => r.retryPanel(y),
447
+ setVariables: (y, x) => r.setVariables(y, x)
448
+ };
449
+ }
450
+ function St(r, g, i) {
451
+ const e = URL.createObjectURL(new Blob([r], { type: g }));
452
+ ye(e, i), window.setTimeout(() => URL.revokeObjectURL(e), 0);
453
+ }
454
+ function kt(r, g) {
455
+ ye(r, g);
456
+ }
457
+ function ye(r, g) {
458
+ const i = document.createElement("a");
459
+ i.href = r, i.download = g, i.hidden = !0, document.body.append(i), i.click(), i.remove();
460
+ }
461
+ const Rt = {
462
+ key: 0,
463
+ class: "dv-dashboard__header"
464
+ }, It = { key: 0 }, $t = { class: "dv-dashboard__grid" }, Pt = ["data-panel-id"], Dt = /* @__PURE__ */ O({
465
+ __name: "DashboardRenderer",
466
+ props: {
467
+ runtime: {},
468
+ rendererRegistry: {},
469
+ panelComponents: {},
470
+ autoLoad: { type: Boolean, default: !0 },
471
+ lazyLoad: { type: Boolean, default: !0 },
472
+ lazyLoadRootMargin: { default: "600px 0px" },
473
+ syncUrl: { type: Boolean, default: !0 },
474
+ showHeader: { type: Boolean, default: !0 }
475
+ },
476
+ setup(r, { expose: g }) {
477
+ const i = r, e = /* @__PURE__ */ new Map(), y = j(), x = /* @__PURE__ */ new Set(), C = /* @__PURE__ */ new Set();
478
+ let s, S = !1, D = !1;
479
+ Ie(() => {
480
+ i.syncUrl && typeof window < "u" && i.runtime.restoreContext(window.location.search);
481
+ });
482
+ const {
483
+ context: c,
484
+ panelStates: l,
485
+ isLoading: f,
486
+ loadPanels: d,
487
+ refreshAll: n,
488
+ refreshPanels: M,
489
+ refreshPanel: o,
490
+ retryPanel: a,
491
+ setVariables: t
492
+ } = Ct(i.runtime, { autoLoad: i.autoLoad && !i.lazyLoad });
493
+ fe(() => {
494
+ var v;
495
+ if (!(!i.autoLoad || !i.lazyLoad)) {
496
+ if (typeof IntersectionObserver > "u") {
497
+ n();
498
+ return;
499
+ }
500
+ S = !0, s = new IntersectionObserver(_e, {
501
+ rootMargin: i.lazyLoadRootMargin
502
+ }), (v = y.value) == null || v.querySelectorAll(".dv-dashboard__cell").forEach((m) => s == null ? void 0 : s.observe(m));
503
+ }
504
+ }), ve(() => {
505
+ s == null || s.disconnect(), s = void 0, S = !1, x.clear(), C.clear();
506
+ });
507
+ const h = $(
508
+ () => (i.runtime.config.variables ?? []).map((v) => `${v.label}: ${_(c.value.variables[v.id])}`).join(" · ")
509
+ );
510
+ function _(v) {
511
+ return Array.isArray(v) ? v.join(", ") : String(v ?? "--");
512
+ }
513
+ function z(v) {
514
+ const m = v.layout.span;
515
+ return {
516
+ "--dv-panel-xs": String(m.xs),
517
+ "--dv-panel-sm": String(m.sm ?? m.xs),
518
+ "--dv-panel-md": String(m.md ?? m.sm ?? m.xs),
519
+ "--dv-panel-lg": String(m.lg ?? m.md ?? m.sm ?? m.xs),
520
+ "--dv-panel-xl": String(m.xl ?? m.lg ?? m.md ?? m.sm ?? m.xs)
521
+ };
522
+ }
523
+ function F(v) {
524
+ var b;
525
+ const m = ((b = i.panelComponents) == null ? void 0 : b[v.id]) ?? i.rendererRegistry.require(v.rendererId).component;
526
+ return $e(Pe(m));
527
+ }
528
+ function W(v, m) {
529
+ m ? e.set(v, m) : e.delete(v);
530
+ }
531
+ function _e(v) {
532
+ v.forEach((m) => {
533
+ const b = m.target.dataset.panelId;
534
+ b && (m.isIntersecting ? (x.add(b), C.add(b)) : (x.delete(b), C.delete(b)));
535
+ }), !(!C.size || D) && (D = !0, queueMicrotask(() => {
536
+ D = !1;
537
+ const m = Array.from(C);
538
+ C.clear(), d(m);
539
+ }));
540
+ }
541
+ function oe() {
542
+ return S ? M(x, { deferUnselected: !0 }) : n();
543
+ }
544
+ async function be(v) {
545
+ const m = t(v, S ? x : void 0);
546
+ if (i.syncUrl && typeof window < "u") {
547
+ const b = Ge(i.runtime.config, i.runtime.context, window.location.search);
548
+ window.history.replaceState(
549
+ window.history.state,
550
+ "",
551
+ `${window.location.pathname}${b}${window.location.hash}`
552
+ );
553
+ }
554
+ await m;
555
+ }
556
+ function ie(v) {
557
+ var se;
558
+ const m = i.runtime.config.panels.find((we) => we.id === v), b = (se = l.value[v]) == null ? void 0 : se.dataset;
559
+ if (!b) return;
560
+ const T = We(b, m, c.value);
561
+ St(T, "text/csv;charset=utf-8", Ze(i.runtime.config.id, m.id));
562
+ }
563
+ function re(v) {
564
+ var b;
565
+ const m = (b = e.get(v)) == null ? void 0 : b.exportPng();
566
+ m && kt(m, `${i.runtime.config.id}-${v}.png`);
567
+ }
568
+ return g({ refreshAll: oe, refreshPanel: o, exportCsv: ie, exportPng: re }), (v, m) => (p(), w("section", {
569
+ ref_key: "dashboardElement",
570
+ ref: y,
571
+ class: "dv-dashboard"
572
+ }, [
573
+ v.showHeader ? (p(), w("header", Rt, [
574
+ P("div", null, [
575
+ P("h1", null, L(v.runtime.config.title), 1),
576
+ v.runtime.config.description ? (p(), w("p", It, L(v.runtime.config.description), 1)) : I("", !0)
577
+ ])
578
+ ])) : I("", !0),
579
+ v.runtime.config.filterBar ? (p(), A(nt, {
580
+ key: 1,
581
+ config: v.runtime.config.filterBar,
582
+ context: u(c),
583
+ loading: u(f),
584
+ onChange: be,
585
+ onRefresh: oe
586
+ }, null, 8, ["config", "context", "loading"])) : I("", !0),
587
+ P("div", $t, [
588
+ (p(!0), w(H, null, K(v.runtime.config.panels, (b) => (p(), w("div", {
589
+ key: b.id,
590
+ class: "dv-dashboard__cell",
591
+ "data-panel-id": b.id,
592
+ style: ue(z(b))
593
+ }, [
594
+ R(xt, {
595
+ ref_for: !0,
596
+ ref: (T) => W(b.id, T),
597
+ context: u(c),
598
+ definition: v.runtime.dataRuntime.registries.rendererDefinitions.require(b.rendererId),
599
+ "filter-summary": h.value,
600
+ panel: b,
601
+ "refresh-disabled": u(f),
602
+ renderer: F(b),
603
+ state: u(l)[b.id],
604
+ onAction: (T) => v.runtime.executePanelAction(b.id, T),
605
+ onExportCsv: (T) => ie(b.id),
606
+ onExportPng: (T) => re(b.id),
607
+ onRefresh: (T) => u(o)(b.id),
608
+ onRetry: (T) => u(a)(b.id),
609
+ onVisualizationEvent: m[0] || (m[0] = (T) => v.runtime.dispatchEvent(T))
610
+ }, null, 8, ["context", "definition", "filter-summary", "panel", "refresh-disabled", "renderer", "state", "onAction", "onExportCsv", "onExportPng", "onRefresh", "onRetry"])
611
+ ], 12, Pt))), 128))
612
+ ])
613
+ ], 512));
614
+ }
615
+ }), rn = /* @__PURE__ */ B(Dt, [["__scopeId", "data-v-6d4b5bdb"]]);
616
+ function ne(r) {
617
+ return r.type === "percent" ? Z.PERCENT : r.type === "decimal" ? Z.DECIMAL : Z.COMMAS;
618
+ }
619
+ function ae(r) {
620
+ return typeof r == "object" && r !== null ? r : {};
621
+ }
622
+ const At = { class: "dv-chart-renderer dv-bar-renderer" }, zt = /* @__PURE__ */ O({
623
+ __name: "BarRenderer",
624
+ props: {
625
+ viewModel: {},
626
+ panel: {},
627
+ context: {}
628
+ },
629
+ emits: ["visualizationEvent"],
630
+ setup(r, { expose: g, emit: i }) {
631
+ const e = r, y = i, x = j();
632
+ function C(c, l, f = !1) {
633
+ const d = f ? E.formatAxis(c, l.format, e.context) : E.formatTooltip(c, l.format, e.context), n = l.format.type === "currency" || l.format.type === "percent" || l.format.unit;
634
+ return c != null && c !== "" && l.unit && !n ? `${d}${l.unit}` : d;
635
+ }
636
+ const s = $(() => ({
637
+ categories: [...e.viewModel.categories],
638
+ colors: [...te],
639
+ orientation: e.viewModel.orientation,
640
+ ...e.viewModel.visibleCount !== void 0 ? { visibleCount: e.viewModel.visibleCount } : {},
641
+ grid: {
642
+ top: 18,
643
+ right: e.viewModel.orientation === "horizontal" && e.viewModel.showLabels ? 78 : 18,
644
+ bottom: 10,
645
+ left: 16,
646
+ containLabel: !0
647
+ },
648
+ categoryAxis: {
649
+ ...Q,
650
+ ...e.viewModel.orientation === "horizontal" && e.viewModel.visibleCount !== void 0 ? { inverse: !0 } : {},
651
+ axisLabel: { ...Q.axisLabel, interval: 0 }
652
+ },
653
+ valueAxis: {
654
+ ...G,
655
+ splitNumber: 4,
656
+ axisLabel: {
657
+ ...G.axisLabel,
658
+ hideOverlap: !0,
659
+ ...e.viewModel.series[0] ? { formatter: (c) => C(c, e.viewModel.series[0], !0) } : {}
660
+ }
661
+ },
662
+ tooltip: {
663
+ ...ee,
664
+ axisPointer: { type: "shadow", shadowStyle: { color: "rgba(91, 114, 238, 0.055)" } }
665
+ },
666
+ ...e.viewModel.stacked ? { stack: "total" } : {},
667
+ series: e.viewModel.series.map((c) => ({
668
+ name: c.label,
669
+ data: [...c.values],
670
+ formatType: ne(c.format),
671
+ valueFormatter: (l) => C(l, c),
672
+ showLabel: e.viewModel.showLabels,
673
+ itemStyle: {
674
+ borderRadius: e.viewModel.orientation === "horizontal" ? [0, 5, 5, 0] : [5, 5, 0, 0]
675
+ }
676
+ }))
677
+ }));
678
+ function S(c) {
679
+ const l = ae(c), f = typeof l.seriesIndex == "number" ? l.seriesIndex : 0, d = e.panel.binding.type === "bar" ? e.panel.binding : void 0;
680
+ d && y("visualizationEvent", {
681
+ type: "dataPointClick",
682
+ panelId: e.panel.id,
683
+ datasetId: d.datasetId,
684
+ fields: Object.freeze({
685
+ [d.categoryField]: l.name,
686
+ ...d.seriesField ? { [d.seriesField]: l.seriesName } : {},
687
+ [d.valueFields[d.seriesField ? 0 : f] ?? d.valueFields[0]]: l.value
688
+ })
689
+ });
690
+ }
691
+ function D() {
692
+ var c;
693
+ return (c = x.value) == null ? void 0 : c.exportPng();
694
+ }
695
+ return g({ exportPng: D }), (c, l) => (p(), w("div", At, [
696
+ R(u(De), {
697
+ ref_key: "chartRef",
698
+ ref: x,
699
+ option: s.value,
700
+ size: u(J).SMALL,
701
+ onDataPointClick: S
702
+ }, null, 8, ["option", "size"])
703
+ ]));
704
+ }
705
+ }), Lt = /* @__PURE__ */ B(zt, [["__scopeId", "data-v-4f111bdf"]]), Tt = { class: "dv-chart-renderer dv-line-renderer" }, Ft = /* @__PURE__ */ O({
706
+ __name: "LineRenderer",
707
+ props: {
708
+ viewModel: {},
709
+ panel: {},
710
+ context: {}
711
+ },
712
+ emits: ["visualizationEvent"],
713
+ setup(r, { expose: g, emit: i }) {
714
+ const e = r, y = i, x = j();
715
+ function C(l, f) {
716
+ const d = E.formatAxis(l, f.format, e.context);
717
+ return s(d, f);
718
+ }
719
+ function s(l, f) {
720
+ const d = f.format.type === "currency" || f.format.type === "percent" || f.format.unit;
721
+ return f.unit && !d ? `${l}${f.unit}` : l;
722
+ }
723
+ const S = $(() => {
724
+ const l = Array.from(
725
+ new Map(e.viewModel.series.map((d) => [d.axisKey, d])).values()
726
+ ), f = new Map(l.map((d, n) => [d.axisKey, n]));
727
+ return {
728
+ colors: [...te],
729
+ grid: { top: 18, right: l.length > 1 ? 24 : 16, bottom: 10, left: 16, containLabel: !0 },
730
+ tooltip: {
731
+ ...ee,
732
+ axisPointer: { type: "line", lineStyle: { color: "#b8c1d1", type: "dashed" } }
733
+ },
734
+ xAxis: {
735
+ data: e.viewModel.categories.map(String),
736
+ ...Q,
737
+ ...e.viewModel.categoryFormat ? {
738
+ valueFormatter: (d) => E.formatAxis(d, e.viewModel.categoryFormat, e.context)
739
+ } : {}
740
+ },
741
+ yAxis: l.map((d, n) => ({
742
+ ...G,
743
+ position: n === 0 ? "left" : "right",
744
+ show: n < 2,
745
+ axisLabel: {
746
+ ...G.axisLabel,
747
+ formatter: (M) => C(M, d)
748
+ },
749
+ splitLine: {
750
+ show: n === 0,
751
+ lineStyle: { color: "#edf0f5", type: "dashed" }
752
+ }
753
+ })),
754
+ series: e.viewModel.series.map((d, n) => ({
755
+ name: d.label,
756
+ data: d.values.map((M) => M ?? void 0),
757
+ formatType: ne(d.format),
758
+ valueFormatter: (M) => {
759
+ const o = E.formatTooltip(M, d.format, e.context);
760
+ return M == null || M === "" ? o : s(o, d);
761
+ },
762
+ showLabel: e.viewModel.showLabels,
763
+ smooth: e.viewModel.smooth,
764
+ yAxisIndex: f.get(d.axisKey) ?? 0,
765
+ showSymbol: !1,
766
+ symbol: "circle",
767
+ symbolSize: 7,
768
+ lineStyle: { width: n === 0 ? 3 : 2.25 },
769
+ ...n === 0 ? {
770
+ areaStyle: {
771
+ opacity: 1,
772
+ color: {
773
+ type: "linear",
774
+ x: 0,
775
+ y: 0,
776
+ x2: 0,
777
+ y2: 1,
778
+ colorStops: [
779
+ { offset: 0, color: "rgba(79, 107, 237, 0.22)" },
780
+ { offset: 1, color: "rgba(79, 107, 237, 0.015)" }
781
+ ]
782
+ }
783
+ }
784
+ } : {}
785
+ })),
786
+ markLine: {
787
+ xAxis: e.viewModel.annotations.filter((d) => d.type === "category").map((d) => String(d.value)),
788
+ yAxis: e.viewModel.annotations.filter((d) => d.type === "value").map((d) => String(d.value))
789
+ }
790
+ };
791
+ });
792
+ function D(l) {
793
+ const f = ae(l), d = typeof f.seriesIndex == "number" ? f.seriesIndex : 0, n = e.panel.binding.type === "line" ? e.panel.binding : void 0;
794
+ n && y("visualizationEvent", {
795
+ type: "dataPointClick",
796
+ panelId: e.panel.id,
797
+ datasetId: n.datasetId,
798
+ fields: Object.freeze({
799
+ [n.xField]: f.name,
800
+ ...n.seriesField ? { [n.seriesField]: f.seriesName } : {},
801
+ [n.yFields[n.seriesField ? 0 : d] ?? n.yFields[0]]: f.value
802
+ })
803
+ });
804
+ }
805
+ function c() {
806
+ var l;
807
+ return (l = x.value) == null ? void 0 : l.exportPng();
808
+ }
809
+ return g({ exportPng: c }), (l, f) => (p(), w("div", Tt, [
810
+ R(u(Ae), {
811
+ ref_key: "chartRef",
812
+ ref: x,
813
+ option: S.value,
814
+ size: u(J).SMALL,
815
+ onDataPointClick: D
816
+ }, null, 8, ["option", "size"])
817
+ ]));
818
+ }
819
+ }), Et = /* @__PURE__ */ B(Ft, [["__scopeId", "data-v-efc34766"]]), Vt = { class: "dv-metric" }, Ot = { class: "dv-metric__value" }, Bt = { class: "dv-metric__number" }, Ut = {
820
+ key: 0,
821
+ class: "dv-metric__unit"
822
+ }, Nt = {
823
+ key: 0,
824
+ class: "dv-metric__comparison"
825
+ }, jt = /* @__PURE__ */ O({
826
+ __name: "MetricRenderer",
827
+ props: {
828
+ viewModel: {},
829
+ panel: {},
830
+ context: {}
831
+ },
832
+ setup(r) {
833
+ const g = r, i = $(
834
+ () => E.formatDisplay(g.viewModel.value, g.viewModel.format, g.context)
835
+ ), e = $(
836
+ () => g.viewModel.format.type === "currency" || g.viewModel.format.type === "percent" ? void 0 : g.viewModel.unit
837
+ ), y = $(() => {
838
+ const s = g.viewModel.comparison;
839
+ return s ? E.formatDisplay(s.value, s.format, g.context) : "";
840
+ }), x = $(() => {
841
+ var s, S;
842
+ return ((s = g.viewModel.comparison) == null ? void 0 : s.direction) === "up" ? me : ((S = g.viewModel.comparison) == null ? void 0 : S.direction) === "down" ? ge : he;
843
+ }), C = $(() => {
844
+ const s = g.viewModel.comparison;
845
+ return !s || s.direction === "flat" ? "neutral" : s.colorMode === "direction" ? s.direction === "up" ? "unfavorable" : "favorable" : s.meaning === "neutral" ? "neutral" : s.meaning === "positive" && s.direction === "up" || s.meaning === "negative" && s.direction === "down" ? "favorable" : "unfavorable";
846
+ });
847
+ return (s, S) => (p(), w("div", Vt, [
848
+ P("div", Ot, [
849
+ P("span", Bt, L(i.value), 1),
850
+ e.value ? (p(), w("span", Ut, L(e.value), 1)) : I("", !0)
851
+ ]),
852
+ s.viewModel.comparison ? (p(), w("div", Nt, [
853
+ P("span", null, L(s.viewModel.comparison.label), 1),
854
+ P("strong", {
855
+ class: q(`dv-metric__comparison--${C.value}`)
856
+ }, [
857
+ (p(), A(pe(x.value))),
858
+ U(" " + L(y.value), 1)
859
+ ], 2)
860
+ ])) : I("", !0)
861
+ ]));
862
+ }
863
+ }), Yt = /* @__PURE__ */ B(jt, [["__scopeId", "data-v-efa26253"]]), Ht = { class: "dv-chart-renderer dv-pie-renderer" }, qt = /* @__PURE__ */ O({
864
+ __name: "PieRenderer",
865
+ props: {
866
+ viewModel: {},
867
+ panel: {},
868
+ context: {}
869
+ },
870
+ emits: ["visualizationEvent"],
871
+ setup(r, { expose: g, emit: i }) {
872
+ const e = r, y = i, x = j();
873
+ function C(c) {
874
+ const l = E.formatTooltip(c, e.viewModel.valueFormat, e.context), f = e.viewModel.valueFormat.type === "currency" || e.viewModel.valueFormat.type === "percent" || e.viewModel.valueFormat.unit;
875
+ return e.viewModel.unit && !f ? `${l}${e.viewModel.unit}` : l;
876
+ }
877
+ const s = $(() => ({
878
+ colors: [...te],
879
+ donut: e.viewModel.donut,
880
+ showLegend: e.viewModel.showLegend,
881
+ showLabels: !1,
882
+ center: ["50%", "43%"],
883
+ radius: e.viewModel.donut ? ["50%", "70%"] : "70%",
884
+ itemStyle: { borderColor: "#fff", borderWidth: 3, borderRadius: 4 },
885
+ tooltip: { ...ee },
886
+ series: e.viewModel.items.map((c) => ({
887
+ name: c.label,
888
+ data: c.value,
889
+ formatType: ne(e.viewModel.valueFormat),
890
+ valueFormatter: C
891
+ })),
892
+ ...e.viewModel.donut ? {
893
+ aggregation: {
894
+ total: e.viewModel.items.reduce((c, l) => c + l.value, 0),
895
+ label: e.panel.title.replace(/占比$/, ""),
896
+ valueFormatter: C,
897
+ ...e.viewModel.unit ? { unit: e.viewModel.unit } : {}
898
+ }
899
+ } : {}
900
+ }));
901
+ function S(c) {
902
+ const l = ae(c), f = e.panel.binding.type === "pie" ? e.panel.binding : void 0;
903
+ f && y("visualizationEvent", {
904
+ type: "dataPointClick",
905
+ panelId: e.panel.id,
906
+ datasetId: f.datasetId,
907
+ fields: Object.freeze({ [f.nameField]: l.name, [f.valueField]: l.value })
908
+ });
909
+ }
910
+ function D() {
911
+ var c;
912
+ return (c = x.value) == null ? void 0 : c.exportPng();
913
+ }
914
+ return g({ exportPng: D }), (c, l) => (p(), w("div", Ht, [
915
+ R(u(ze), {
916
+ ref_key: "chartRef",
917
+ ref: x,
918
+ option: s.value,
919
+ size: u(J).SMALL,
920
+ onDataPointClick: S
921
+ }, null, 8, ["option", "size"])
922
+ ]));
923
+ }
924
+ }), Kt = /* @__PURE__ */ B(qt, [["__scopeId", "data-v-ccdee116"]]), Gt = { class: "dv-table-scroll" }, Wt = /* @__PURE__ */ O({
925
+ __name: "TableRenderer",
926
+ props: {
927
+ viewModel: {},
928
+ panel: {},
929
+ context: {}
930
+ },
931
+ emits: ["visualizationEvent"],
932
+ setup(r, { emit: g }) {
933
+ const i = r, e = g, y = $(
934
+ () => i.viewModel.columns.map((a) => ({
935
+ title: a.label,
936
+ dataIndex: a.field,
937
+ key: a.field,
938
+ ...a.width ? { width: a.width } : {},
939
+ sorter: a.sortable,
940
+ ...a.filterable ? {
941
+ filters: Array.from(new Set(i.viewModel.rows.map((t) => String(t[a.field] ?? "")))).slice(0, 50).map((t) => ({ text: t || "--", value: t })),
942
+ onFilter: (t, h) => String(h[a.field] ?? "") === String(t)
943
+ } : {},
944
+ customRender: ({ text: t }) => C(t, a)
945
+ }))
946
+ );
947
+ function x(a, t) {
948
+ return E.formatDisplay(
949
+ a,
950
+ t.format ?? {
951
+ type: t.dataType === "date" ? "date" : t.dataType === "datetime" ? "datetime" : "number"
952
+ },
953
+ i.context
954
+ );
955
+ }
956
+ function C(a, t) {
957
+ const h = x(a, t);
958
+ return t.display ? t.display.type === "progress" ? S(a, h, t.display) : t.display.type === "trend" ? D(a, h, t.display) : c(a, h, t.display) : h;
959
+ }
960
+ function s(a) {
961
+ return typeof a == "number" && Number.isFinite(a) ? a : void 0;
962
+ }
963
+ function S(a, t, h) {
964
+ const _ = s(a);
965
+ if (_ === void 0) return t;
966
+ const z = h.max ?? 1, F = Math.min(100, Math.max(0, _ / z * 100));
967
+ return V("div", { class: "dv-table__progress-cell" }, [
968
+ V(He, { percent: F, showInfo: !1, size: "small", strokeWidth: 6 }),
969
+ V("span", { class: "dv-table__cell-value" }, t)
970
+ ]);
971
+ }
972
+ function D(a, t, h) {
973
+ const _ = s(a);
974
+ if (_ === void 0) return t;
975
+ const z = _ > 0 ? h.positiveTone ?? "success" : _ < 0 ? h.negativeTone ?? "danger" : h.zeroTone ?? "neutral", F = _ > 0 ? me : _ < 0 ? ge : he;
976
+ return V("span", { class: ["dv-table__trend", `dv-table__trend--${z}`] }, [V(F), V("span", t)]);
977
+ }
978
+ function c(a, t, h) {
979
+ var z;
980
+ const _ = ((z = h.toneByValue) == null ? void 0 : z[String(a ?? "")]) ?? h.defaultTone ?? "neutral";
981
+ return l(t, _);
982
+ }
983
+ function l(a, t, h) {
984
+ return V(
985
+ qe,
986
+ { class: ["dv-table__tag", `dv-table__tag--${t}`] },
987
+ { default: () => [V("span", a)] }
988
+ );
989
+ }
990
+ const f = /* @__PURE__ */ new WeakMap();
991
+ let d = 0;
992
+ function n(a) {
993
+ const t = f.get(a);
994
+ if (t) return t;
995
+ const h = `row-${++d}`;
996
+ return f.set(a, h), h;
997
+ }
998
+ function M(a) {
999
+ return {
1000
+ onClick: () => e("visualizationEvent", {
1001
+ type: "rowClick",
1002
+ panelId: i.panel.id,
1003
+ datasetId: i.panel.binding.datasetId,
1004
+ fields: a
1005
+ })
1006
+ };
1007
+ }
1008
+ function o() {
1009
+ }
1010
+ return (a, t) => (p(), w("div", Gt, [
1011
+ R(u(Ke), {
1012
+ class: "dv-table",
1013
+ columns: y.value,
1014
+ "data-source": [...a.viewModel.rows],
1015
+ pagination: a.viewModel.showPagination ? { pageSize: a.viewModel.pageSize, showSizeChanger: !1 } : !1,
1016
+ "row-key": n,
1017
+ scroll: { x: "max-content" },
1018
+ size: "small",
1019
+ onChange: o,
1020
+ "custom-row": M
1021
+ }, null, 8, ["columns", "data-source", "pagination"])
1022
+ ]));
1023
+ }
1024
+ }), Zt = /* @__PURE__ */ B(Wt, [["__scopeId", "data-v-c8a717c4"]]);
1025
+ function sn(r) {
1026
+ return r.registerMany([
1027
+ { id: "metric", component: Yt },
1028
+ { id: "line", component: Et },
1029
+ { id: "bar", component: Lt },
1030
+ { id: "pie", component: Kt },
1031
+ { id: "table", component: Zt }
1032
+ ]), r;
1033
+ }
1034
+ class Qt extends Qe {
1035
+ constructor() {
1036
+ super("VueVisualizationRenderer");
1037
+ }
1038
+ }
1039
+ function ln() {
1040
+ return new Qt();
1041
+ }
1042
+ export {
1043
+ Lt as BarRenderer,
1044
+ nt as DashboardFilterBar,
1045
+ xt as DashboardPanel,
1046
+ rn as DashboardRenderer,
1047
+ Et as LineRenderer,
1048
+ Yt as MetricRenderer,
1049
+ Kt as PieRenderer,
1050
+ Q as STANDARD_CATEGORY_AXIS,
1051
+ te as STANDARD_CHART_COLORS,
1052
+ ee as STANDARD_CHART_TOOLTIP,
1053
+ G as STANDARD_VALUE_AXIS,
1054
+ Zt as TableRenderer,
1055
+ Qt as VueRendererRegistry,
1056
+ ae as chartEventFields,
1057
+ ln as createVueRendererRegistry,
1058
+ St as downloadBlob,
1059
+ kt as downloadDataUrl,
1060
+ sn as registerStandardVueRenderers,
1061
+ ne as toChartFormat,
1062
+ Ct as useDashboardRuntime
1063
+ };
1064
+ //# sourceMappingURL=index.js.map