drizzle-cube 0.2.8 → 0.2.9
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/dist/client/charts.js +2 -2
- package/dist/client/chunks/chart-activitygridchart-config-DVH-sdYZ.js +244 -0
- package/dist/client/chunks/chart-activitygridchart-config-DVH-sdYZ.js.map +1 -0
- package/dist/client/chunks/{chart-areachart-config-DWN1E5ej.js → chart-areachart-config-C2iwLEgm.js} +2 -2
- package/dist/client/chunks/{chart-areachart-config-DWN1E5ej.js.map → chart-areachart-config-C2iwLEgm.js.map} +1 -1
- package/dist/client/chunks/{chart-barchart-config-DZA0xTns.js → chart-barchart-config-CAsUZfHw.js} +2 -2
- package/dist/client/chunks/{chart-barchart-config-DZA0xTns.js.map → chart-barchart-config-CAsUZfHw.js.map} +1 -1
- package/dist/client/chunks/{chart-bubblechart-config-C79lfDSO.js → chart-bubblechart-config-DRuY0m7S.js} +2 -2
- package/dist/client/chunks/{chart-bubblechart-config-C79lfDSO.js.map → chart-bubblechart-config-DRuY0m7S.js.map} +1 -1
- package/dist/client/chunks/{chart-datatable-config-DqGw99R3.js → chart-datatable-config-C0MoGDgo.js} +2 -2
- package/dist/client/chunks/{chart-datatable-config-DqGw99R3.js.map → chart-datatable-config-C0MoGDgo.js.map} +1 -1
- package/dist/client/chunks/{chart-datatable-Mo4gYCwa.js → chart-datatable-zyVFtRJ_.js} +2 -2
- package/dist/client/chunks/{chart-datatable-Mo4gYCwa.js.map → chart-datatable-zyVFtRJ_.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-config-B-Y-LHmd.js → chart-kpidelta-config-Bq2Ph_Sp.js} +2 -2
- package/dist/client/chunks/{chart-kpidelta-config-B-Y-LHmd.js.map → chart-kpidelta-config-Bq2Ph_Sp.js.map} +1 -1
- package/dist/client/chunks/{chart-kpinumber-config-BaNaJMI6.js → chart-kpinumber-config-OMNhJXdH.js} +2 -2
- package/dist/client/chunks/{chart-kpinumber-config-BaNaJMI6.js.map → chart-kpinumber-config-OMNhJXdH.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-config-BNywYqEW.js → chart-kpitext-config-BLiwQIVN.js} +2 -2
- package/dist/client/chunks/{chart-kpitext-config-BNywYqEW.js.map → chart-kpitext-config-BLiwQIVN.js.map} +1 -1
- package/dist/client/chunks/{chart-linechart-config-BL_1mjHF.js → chart-linechart-config-CVbDAvCB.js} +2 -2
- package/dist/client/chunks/{chart-linechart-config-BL_1mjHF.js.map → chart-linechart-config-CVbDAvCB.js.map} +1 -1
- package/dist/client/chunks/{chart-markdownchart-config-DtZOfYu4.js → chart-markdownchart-config-uttA9Th4.js} +2 -2
- package/dist/client/chunks/{chart-markdownchart-config-DtZOfYu4.js.map → chart-markdownchart-config-uttA9Th4.js.map} +1 -1
- package/dist/client/chunks/{chart-piechart-config-Bg4jeIFo.js → chart-piechart-config-J748ISAR.js} +2 -2
- package/dist/client/chunks/{chart-piechart-config-Bg4jeIFo.js.map → chart-piechart-config-J748ISAR.js.map} +1 -1
- package/dist/client/chunks/{chart-radarchart-config-d6dLkI7B.js → chart-radarchart-config-CU_MwXOg.js} +2 -2
- package/dist/client/chunks/{chart-radarchart-config-d6dLkI7B.js.map → chart-radarchart-config-CU_MwXOg.js.map} +1 -1
- package/dist/client/chunks/{chart-radialbarchart-config-BGf97-BV.js → chart-radialbarchart-config-D0eEa2hb.js} +2 -2
- package/dist/client/chunks/{chart-radialbarchart-config-BGf97-BV.js.map → chart-radialbarchart-config-D0eEa2hb.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-config-DEIB74ot.js → chart-scatterchart-config-Bh0qBq9F.js} +2 -2
- package/dist/client/chunks/{chart-scatterchart-config-DEIB74ot.js.map → chart-scatterchart-config-Bh0qBq9F.js.map} +1 -1
- package/dist/client/chunks/{chart-treemapchart-config-ppKPTB96.js → chart-treemapchart-config-Bl0wYGhB.js} +2 -2
- package/dist/client/chunks/{chart-treemapchart-config-ppKPTB96.js.map → chart-treemapchart-config-Bl0wYGhB.js.map} +1 -1
- package/dist/client/chunks/{charts-MJLpxe3r.js → charts-BUq4jszb.js} +18 -18
- package/dist/client/chunks/{charts-MJLpxe3r.js.map → charts-BUq4jszb.js.map} +1 -1
- package/dist/client/chunks/{components-CXA6-jJq.js → components-DnhfrXo3.js} +22 -21
- package/dist/client/chunks/{components-CXA6-jJq.js.map → components-DnhfrXo3.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterSection.d.ts +3 -1
- package/dist/client/components/AnalysisBuilder/AnalysisQueryPanel.d.ts +2 -1
- package/dist/client/components/AnalysisBuilder/AnalysisResultsPanel.d.ts +2 -1
- package/dist/client/components/AnalysisBuilder/BreakdownItemCard.d.ts +3 -1
- package/dist/client/components/AnalysisBuilder/BreakdownSection.d.ts +3 -2
- package/dist/client/components/AnalysisBuilder/MetricItemCard.d.ts +3 -1
- package/dist/client/components/AnalysisBuilder/MetricsSection.d.ts +3 -2
- package/dist/client/components/AnalysisBuilder/types.d.ts +42 -0
- package/dist/client/components.js +3 -3
- package/dist/client/icons/registry.d.ts +1 -1
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +2138 -1874
- package/dist/client/index.js.map +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +1 -1
- package/dist/client/chunks/chart-activitygridchart-config-BngZDVh_.js +0 -236
- package/dist/client/chunks/chart-activitygridchart-config-BngZDVh_.js.map +0 -1
package/dist/client/charts.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as t, r as e, f as s, b as o, k as C, l as h, m as f, i as l, q as p, p as d, n as i, o as R, a as c, u as m } from "./chunks/charts-
|
|
1
|
+
import { L as t, r as e, f as s, b as o, k as C, l as h, m as f, i as l, q as p, p as d, n as i, o as R, a as c, u as m } from "./chunks/charts-BUq4jszb.js";
|
|
2
2
|
import { a as g, C as x, N as u, P as A } from "./chunks/chart-activitygridchart-Cz4bEf3V.js";
|
|
3
3
|
import { default as L } from "./chunks/chart-barchart-Bdjz8DJp.js";
|
|
4
4
|
import { default as y } from "./chunks/chart-linechart-BfnU6L-D.js";
|
|
@@ -8,7 +8,7 @@ import { default as N } from "./chunks/chart-scatterchart-C83KgqYY.js";
|
|
|
8
8
|
import { default as V } from "./chunks/chart-radarchart-D5yRnY9j.js";
|
|
9
9
|
import { default as D } from "./chunks/chart-radialbarchart-Djtcn7aH.js";
|
|
10
10
|
import { default as H } from "./chunks/chart-treemapchart-BDKnKGTz.js";
|
|
11
|
-
import { default as k } from "./chunks/chart-datatable-
|
|
11
|
+
import { default as k } from "./chunks/chart-datatable-zyVFtRJ_.js";
|
|
12
12
|
export {
|
|
13
13
|
g as CHART_COLORS,
|
|
14
14
|
x as CHART_MARGINS,
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { jsx as y } from "react/jsx-runtime";
|
|
2
|
+
import { d, a as f, b as g, c as u, e as b, f as v, g as k, h as l, i as m, j as T, k as D, l as w, m as C, n as A, o as I, p as x, q as M, r as B, s as F, t as N, u as O, v as R, w as S, x as _, y as G, z as K, A as j, B as q, C as L, D as z, E as P, F as U, G as V, H, I as W, J as E, K as Z, L as J, M as Q, N as X, O as Y, P as aa, Q as ta, R as ea, S as oa, T as ia, U as ca, V as ra, W as na, X as sa, Y as da, Z as ya, _ as ga, $ as ua, a0 as la, a1 as ma, a2 as ha, a3 as pa, a4 as $a, a5 as fa, a6 as ba, a7 as va, a8 as ka, a9 as Ta, aa as Da, ab as wa, ac as h } from "./icons-B2XSxpVK.js";
|
|
3
|
+
const p = {
|
|
4
|
+
// Action icons
|
|
5
|
+
close: { icon: wa, category: "action" },
|
|
6
|
+
add: { icon: Da, category: "action" },
|
|
7
|
+
edit: { icon: Ta, category: "action" },
|
|
8
|
+
delete: { icon: ka, category: "action" },
|
|
9
|
+
refresh: { icon: d, category: "action" },
|
|
10
|
+
copy: { icon: va, category: "action" },
|
|
11
|
+
duplicate: { icon: ba, category: "action" },
|
|
12
|
+
settings: { icon: fa, category: "action" },
|
|
13
|
+
filter: { icon: $a, category: "action" },
|
|
14
|
+
share: { icon: pa, category: "action" },
|
|
15
|
+
expand: { icon: l, category: "action" },
|
|
16
|
+
collapse: { icon: m, category: "action" },
|
|
17
|
+
search: { icon: ha, category: "action" },
|
|
18
|
+
menu: { icon: ma, category: "action" },
|
|
19
|
+
run: { icon: la, category: "action" },
|
|
20
|
+
check: { icon: ua, category: "action" },
|
|
21
|
+
link: { icon: ga, category: "action" },
|
|
22
|
+
eye: { icon: ya, category: "action" },
|
|
23
|
+
eyeOff: { icon: da, category: "action" },
|
|
24
|
+
adjustments: { icon: sa, category: "action" },
|
|
25
|
+
desktop: { icon: na, category: "action" },
|
|
26
|
+
table: { icon: ra, category: "action" },
|
|
27
|
+
sun: { icon: ca, category: "action" },
|
|
28
|
+
moon: { icon: ia, category: "action" },
|
|
29
|
+
ellipsisHorizontal: { icon: oa, category: "action" },
|
|
30
|
+
documentText: { icon: ea, category: "action" },
|
|
31
|
+
bookOpen: { icon: ta, category: "action" },
|
|
32
|
+
codeBracket: { icon: aa, category: "action" },
|
|
33
|
+
// Field type icons (solid for visual distinction)
|
|
34
|
+
measure: { icon: Y, category: "field" },
|
|
35
|
+
dimension: { icon: X, category: "field" },
|
|
36
|
+
timeDimension: { icon: Q, category: "field" },
|
|
37
|
+
segment: { icon: J, category: "field" },
|
|
38
|
+
// Chart type icons (Tabler - keeping existing visuals)
|
|
39
|
+
chartBar: { icon: Z, category: "chart" },
|
|
40
|
+
chartLine: { icon: E, category: "chart" },
|
|
41
|
+
chartArea: { icon: W, category: "chart" },
|
|
42
|
+
chartPie: { icon: H, category: "chart" },
|
|
43
|
+
chartScatter: { icon: V, category: "chart" },
|
|
44
|
+
chartBubble: { icon: U, category: "chart" },
|
|
45
|
+
chartRadar: { icon: P, category: "chart" },
|
|
46
|
+
chartRadialBar: { icon: z, category: "chart" },
|
|
47
|
+
chartTreemap: { icon: L, category: "chart" },
|
|
48
|
+
chartTable: { icon: q, category: "chart" },
|
|
49
|
+
chartActivityGrid: { icon: j, category: "chart" },
|
|
50
|
+
chartKpiNumber: { icon: K, category: "chart" },
|
|
51
|
+
chartKpiDelta: { icon: G, category: "chart" },
|
|
52
|
+
chartKpiText: { icon: _, category: "chart" },
|
|
53
|
+
chartMarkdown: { icon: S, category: "chart" },
|
|
54
|
+
// Measure type icons (solid)
|
|
55
|
+
measureCount: { icon: R, category: "measure" },
|
|
56
|
+
measureCountDistinct: { icon: O, category: "measure" },
|
|
57
|
+
measureCountDistinctApprox: { icon: N, category: "measure" },
|
|
58
|
+
measureSum: { icon: F, category: "measure" },
|
|
59
|
+
measureAvg: { icon: B, category: "measure" },
|
|
60
|
+
measureMin: { icon: g, category: "measure" },
|
|
61
|
+
measureMax: { icon: u, category: "measure" },
|
|
62
|
+
measureRunningTotal: { icon: M, category: "measure" },
|
|
63
|
+
measureCalculated: { icon: x, category: "measure" },
|
|
64
|
+
measureNumber: { icon: I, category: "measure" },
|
|
65
|
+
// State icons
|
|
66
|
+
success: { icon: A, category: "state" },
|
|
67
|
+
warning: { icon: C, category: "state" },
|
|
68
|
+
error: { icon: w, category: "state" },
|
|
69
|
+
info: { icon: D, category: "state" },
|
|
70
|
+
loading: { icon: d, category: "state" },
|
|
71
|
+
sparkles: { icon: T, category: "state" },
|
|
72
|
+
// Navigation icons
|
|
73
|
+
chevronUp: { icon: m, category: "navigation" },
|
|
74
|
+
chevronDown: { icon: l, category: "navigation" },
|
|
75
|
+
chevronLeft: { icon: k, category: "navigation" },
|
|
76
|
+
chevronRight: { icon: v, category: "navigation" },
|
|
77
|
+
chevronUpDown: { icon: b, category: "navigation" },
|
|
78
|
+
arrowUp: { icon: u, category: "navigation" },
|
|
79
|
+
arrowDown: { icon: g, category: "navigation" },
|
|
80
|
+
arrowRight: { icon: f, category: "navigation" },
|
|
81
|
+
arrowPath: { icon: d, category: "navigation" }
|
|
82
|
+
};
|
|
83
|
+
let o = { ...p };
|
|
84
|
+
const r = /* @__PURE__ */ new Map();
|
|
85
|
+
function Ma() {
|
|
86
|
+
return o;
|
|
87
|
+
}
|
|
88
|
+
function n(a) {
|
|
89
|
+
const e = r.get(a);
|
|
90
|
+
if (e)
|
|
91
|
+
return e;
|
|
92
|
+
const t = o[a];
|
|
93
|
+
if (!t)
|
|
94
|
+
return console.warn(`Icon "${a}" not found in registry, using fallback`), ({ className: s, ...$ }) => /* @__PURE__ */ y(h, { icon: o.info.icon, className: s, ...$ });
|
|
95
|
+
const i = ({ className: c, ...s }) => /* @__PURE__ */ y(h, { icon: t.icon, className: c, ...s });
|
|
96
|
+
return r.set(a, i), i;
|
|
97
|
+
}
|
|
98
|
+
function Ba(a) {
|
|
99
|
+
return o[a]?.icon ?? o.info.icon;
|
|
100
|
+
}
|
|
101
|
+
function Fa(a, e) {
|
|
102
|
+
o[a] && (o[a] = {
|
|
103
|
+
...o[a],
|
|
104
|
+
icon: e
|
|
105
|
+
}, r.delete(a));
|
|
106
|
+
}
|
|
107
|
+
function Na(a) {
|
|
108
|
+
for (const [e, t] of Object.entries(a))
|
|
109
|
+
if (t && e in o) {
|
|
110
|
+
const i = e;
|
|
111
|
+
if ("body" in t)
|
|
112
|
+
o[i] = {
|
|
113
|
+
...o[i],
|
|
114
|
+
icon: t
|
|
115
|
+
};
|
|
116
|
+
else {
|
|
117
|
+
const c = t;
|
|
118
|
+
o[i] = {
|
|
119
|
+
...o[i],
|
|
120
|
+
...c,
|
|
121
|
+
icon: c.icon ?? o[i].icon
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
r.delete(i);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function Oa() {
|
|
128
|
+
o = { ...p }, r.clear();
|
|
129
|
+
}
|
|
130
|
+
function Ra(a) {
|
|
131
|
+
const e = {};
|
|
132
|
+
for (const [t, i] of Object.entries(o))
|
|
133
|
+
i.category === a && (e[t] = n(t));
|
|
134
|
+
return e;
|
|
135
|
+
}
|
|
136
|
+
function Sa(a) {
|
|
137
|
+
const t = {
|
|
138
|
+
count: "measureCount",
|
|
139
|
+
countDistinct: "measureCountDistinct",
|
|
140
|
+
countDistinctApprox: "measureCountDistinctApprox",
|
|
141
|
+
sum: "measureSum",
|
|
142
|
+
avg: "measureAvg",
|
|
143
|
+
min: "measureMin",
|
|
144
|
+
max: "measureMax",
|
|
145
|
+
runningTotal: "measureRunningTotal",
|
|
146
|
+
calculated: "measureCalculated",
|
|
147
|
+
number: "measureNumber"
|
|
148
|
+
}[a || ""] || "measureCount";
|
|
149
|
+
return n(t);
|
|
150
|
+
}
|
|
151
|
+
function Ca(a) {
|
|
152
|
+
const t = {
|
|
153
|
+
bar: "chartBar",
|
|
154
|
+
line: "chartLine",
|
|
155
|
+
area: "chartArea",
|
|
156
|
+
pie: "chartPie",
|
|
157
|
+
scatter: "chartScatter",
|
|
158
|
+
bubble: "chartBubble",
|
|
159
|
+
radar: "chartRadar",
|
|
160
|
+
radialBar: "chartRadialBar",
|
|
161
|
+
treemap: "chartTreemap",
|
|
162
|
+
table: "chartTable",
|
|
163
|
+
activityGrid: "chartActivityGrid",
|
|
164
|
+
kpiNumber: "chartKpiNumber",
|
|
165
|
+
kpiDelta: "chartKpiDelta",
|
|
166
|
+
kpiText: "chartKpiText",
|
|
167
|
+
markdown: "chartMarkdown"
|
|
168
|
+
}[a] || "chartBar";
|
|
169
|
+
return n(t);
|
|
170
|
+
}
|
|
171
|
+
function _a(a) {
|
|
172
|
+
const t = {
|
|
173
|
+
measure: "measure",
|
|
174
|
+
dimension: "dimension",
|
|
175
|
+
timeDimension: "timeDimension",
|
|
176
|
+
time: "timeDimension",
|
|
177
|
+
segment: "segment"
|
|
178
|
+
}[a] || "dimension";
|
|
179
|
+
return n(t);
|
|
180
|
+
}
|
|
181
|
+
const Aa = {
|
|
182
|
+
icon: Ca("activityGrid"),
|
|
183
|
+
description: "GitHub-style activity grid showing temporal patterns across different time scales",
|
|
184
|
+
useCase: "Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities",
|
|
185
|
+
dropZones: [
|
|
186
|
+
{
|
|
187
|
+
key: "dateField",
|
|
188
|
+
label: "Time Dimension",
|
|
189
|
+
description: "Time field that determines grid structure (granularity affects layout)",
|
|
190
|
+
mandatory: !0,
|
|
191
|
+
maxItems: 1,
|
|
192
|
+
acceptTypes: ["timeDimension"],
|
|
193
|
+
emptyText: "Drop a time dimension (granularity affects grid structure)"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
key: "valueField",
|
|
197
|
+
label: "Activity Measure",
|
|
198
|
+
description: "Measure used for activity intensity (color coding)",
|
|
199
|
+
mandatory: !0,
|
|
200
|
+
maxItems: 1,
|
|
201
|
+
acceptTypes: ["measure"],
|
|
202
|
+
emptyText: "Drop a measure for activity intensity"
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
displayOptions: ["showLabels", "showTooltip", "hideHeader"],
|
|
206
|
+
displayOptionsConfig: [
|
|
207
|
+
{
|
|
208
|
+
key: "fitToWidth",
|
|
209
|
+
label: "Fit to Width",
|
|
210
|
+
type: "boolean",
|
|
211
|
+
defaultValue: !1,
|
|
212
|
+
description: "Automatically size blocks to fill portlet width and height while maintaining aspect ratio"
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
validate: (a) => {
|
|
216
|
+
const { dateField: e, valueField: t } = a;
|
|
217
|
+
return !e || Array.isArray(e) && e.length === 0 ? {
|
|
218
|
+
isValid: !1,
|
|
219
|
+
message: "Time dimension is required for activity grid"
|
|
220
|
+
} : !t || Array.isArray(t) && t.length === 0 ? {
|
|
221
|
+
isValid: !1,
|
|
222
|
+
message: "Activity measure is required for intensity mapping"
|
|
223
|
+
} : { isValid: !0 };
|
|
224
|
+
}
|
|
225
|
+
}, Ga = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
226
|
+
__proto__: null,
|
|
227
|
+
activityGridChartConfig: Aa
|
|
228
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
229
|
+
export {
|
|
230
|
+
Ga as A,
|
|
231
|
+
p as D,
|
|
232
|
+
Sa as a,
|
|
233
|
+
n as b,
|
|
234
|
+
_a as c,
|
|
235
|
+
Ba as d,
|
|
236
|
+
Oa as e,
|
|
237
|
+
Ma as f,
|
|
238
|
+
Ca as g,
|
|
239
|
+
Ra as h,
|
|
240
|
+
Aa as i,
|
|
241
|
+
Na as r,
|
|
242
|
+
Fa as s
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=chart-activitygridchart-config-DVH-sdYZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-activitygridchart-config-DVH-sdYZ.js","sources":["../../../src/client/icons/defaultIcons.ts","../../../src/client/icons/registry.tsx","../../../src/client/components/charts/ActivityGridChart.config.tsx"],"sourcesContent":["/**\n * Default icon definitions using Iconify icon sets\n * Uses HeroIcons (outline/solid) and Tabler icons via Iconify\n */\n\n// HeroIcons Outline\nimport xMark from '@iconify-icons/heroicons-outline/x-mark'\nimport plus from '@iconify-icons/heroicons-outline/plus'\nimport pencil from '@iconify-icons/heroicons-outline/pencil'\nimport trash from '@iconify-icons/heroicons-outline/trash'\nimport arrowPath from '@iconify-icons/heroicons-outline/arrow-path'\nimport clipboardDocument from '@iconify-icons/heroicons-outline/clipboard-document'\nimport documentDuplicate from '@iconify-icons/heroicons-outline/document-duplicate'\nimport cog from '@iconify-icons/heroicons-outline/cog'\nimport funnel from '@iconify-icons/heroicons-outline/funnel'\nimport share from '@iconify-icons/heroicons-outline/share'\nimport chevronUp from '@iconify-icons/heroicons-outline/chevron-up'\nimport chevronDown from '@iconify-icons/heroicons-outline/chevron-down'\nimport chevronLeft from '@iconify-icons/heroicons-outline/chevron-left'\nimport chevronRight from '@iconify-icons/heroicons-outline/chevron-right'\nimport magnifyingGlass from '@iconify-icons/heroicons-outline/magnifying-glass'\nimport bars3 from '@iconify-icons/heroicons-outline/bars-3'\nimport checkCircle from '@iconify-icons/heroicons-outline/check-circle'\nimport exclamationTriangle from '@iconify-icons/heroicons-outline/exclaimation-triangle'\nimport exclamationCircle from '@iconify-icons/heroicons-outline/exclamation-circle'\nimport sparkles from '@iconify-icons/heroicons-outline/sparkles'\nimport eye from '@iconify-icons/heroicons-outline/eye'\nimport eyeSlash from '@iconify-icons/heroicons-outline/eye-slash'\nimport adjustmentsHorizontal from '@iconify-icons/heroicons-outline/adjustments-horizontal'\nimport computerDesktop from '@iconify-icons/heroicons-outline/computer-desktop'\nimport tableCells from '@iconify-icons/heroicons-outline/table-cells'\nimport link from '@iconify-icons/heroicons-outline/link'\nimport arrowRight from '@iconify-icons/heroicons-outline/arrow-right'\nimport sun from '@iconify-icons/heroicons-outline/sun'\nimport moon from '@iconify-icons/heroicons-outline/moon'\nimport ellipsisHorizontal from '@iconify-icons/heroicons-outline/ellipsis-horizontal'\nimport documentText from '@iconify-icons/heroicons-outline/document-text'\nimport bookOpen from '@iconify-icons/heroicons-outline/book-open'\nimport codeBracket from '@iconify-icons/heroicons-outline/code-bracket'\n\n// HeroIcons Solid (for field type indicators and measures)\nimport chartBarSolid from '@iconify-icons/heroicons-solid/chart-bar'\nimport tagSolid from '@iconify-icons/heroicons-solid/tag'\nimport calendarSolid from '@iconify-icons/heroicons-solid/calendar'\nimport rectangleGroupSolid from '@iconify-icons/heroicons-solid/rectangle-group'\nimport playSolid from '@iconify-icons/heroicons-solid/play'\nimport checkSolid from '@iconify-icons/heroicons-solid/check'\nimport scaleSolid from '@iconify-icons/heroicons-solid/scale'\nimport arrowDownCircleSolid from '@iconify-icons/heroicons-solid/arrow-down-circle'\nimport arrowUpCircleSolid from '@iconify-icons/heroicons-solid/arrow-up-circle'\nimport arrowTrendingUpSolid from '@iconify-icons/heroicons-solid/arrow-trending-up'\nimport beakerSolid from '@iconify-icons/heroicons-solid/beaker'\nimport bars3BottomLeftSolid from '@iconify-icons/heroicons-solid/bars-3-bottom-left'\nimport fingerPrintSolid from '@iconify-icons/heroicons-solid/finger-print'\nimport chartBarSquareSolid from '@iconify-icons/heroicons-solid/chart-bar-square'\nimport plusCircleSolid from '@iconify-icons/heroicons-solid/plus-circle'\nimport hashtagSolid from '@iconify-icons/heroicons-solid/hashtag'\n\n// Tabler icons for chart types (already using these)\nimport chartBarTabler from '@iconify-icons/tabler/chart-bar'\nimport chartLine from '@iconify-icons/tabler/chart-line'\nimport chartAreaLine from '@iconify-icons/tabler/chart-area-line'\nimport chartPie from '@iconify-icons/tabler/chart-pie'\nimport chartDots2 from '@iconify-icons/tabler/chart-dots-2'\nimport chartBubble from '@iconify-icons/tabler/chart-bubble'\nimport chartRadar from '@iconify-icons/tabler/chart-radar'\nimport radar2 from '@iconify-icons/tabler/radar-2'\nimport chartTreemap from '@iconify-icons/tabler/chart-treemap'\nimport table from '@iconify-icons/tabler/table'\nimport calendarStats from '@iconify-icons/tabler/calendar-stats'\nimport number from '@iconify-icons/tabler/number'\nimport trendingUp from '@iconify-icons/tabler/trending-up'\nimport typography from '@iconify-icons/tabler/typography'\nimport fileText from '@iconify-icons/tabler/file-text'\nimport infoCircle from '@iconify-icons/tabler/info-circle'\nimport selector from '@iconify-icons/tabler/selector'\n\nimport type { IconRegistry } from './types'\n\n/**\n * Default icon registry with all icons used in drizzle-cube\n */\nexport const DEFAULT_ICONS: IconRegistry = {\n // Action icons\n close: { icon: xMark, category: 'action' },\n add: { icon: plus, category: 'action' },\n edit: { icon: pencil, category: 'action' },\n delete: { icon: trash, category: 'action' },\n refresh: { icon: arrowPath, category: 'action' },\n copy: { icon: clipboardDocument, category: 'action' },\n duplicate: { icon: documentDuplicate, category: 'action' },\n settings: { icon: cog, category: 'action' },\n filter: { icon: funnel, category: 'action' },\n share: { icon: share, category: 'action' },\n expand: { icon: chevronDown, category: 'action' },\n collapse: { icon: chevronUp, category: 'action' },\n search: { icon: magnifyingGlass, category: 'action' },\n menu: { icon: bars3, category: 'action' },\n run: { icon: playSolid, category: 'action' },\n check: { icon: checkSolid, category: 'action' },\n link: { icon: link, category: 'action' },\n eye: { icon: eye, category: 'action' },\n eyeOff: { icon: eyeSlash, category: 'action' },\n adjustments: { icon: adjustmentsHorizontal, category: 'action' },\n desktop: { icon: computerDesktop, category: 'action' },\n table: { icon: tableCells, category: 'action' },\n sun: { icon: sun, category: 'action' },\n moon: { icon: moon, category: 'action' },\n ellipsisHorizontal: { icon: ellipsisHorizontal, category: 'action' },\n documentText: { icon: documentText, category: 'action' },\n bookOpen: { icon: bookOpen, category: 'action' },\n codeBracket: { icon: codeBracket, category: 'action' },\n\n // Field type icons (solid for visual distinction)\n measure: { icon: chartBarSolid, category: 'field' },\n dimension: { icon: tagSolid, category: 'field' },\n timeDimension: { icon: calendarSolid, category: 'field' },\n segment: { icon: rectangleGroupSolid, category: 'field' },\n\n // Chart type icons (Tabler - keeping existing visuals)\n chartBar: { icon: chartBarTabler, category: 'chart' },\n chartLine: { icon: chartLine, category: 'chart' },\n chartArea: { icon: chartAreaLine, category: 'chart' },\n chartPie: { icon: chartPie, category: 'chart' },\n chartScatter: { icon: chartDots2, category: 'chart' },\n chartBubble: { icon: chartBubble, category: 'chart' },\n chartRadar: { icon: chartRadar, category: 'chart' },\n chartRadialBar: { icon: radar2, category: 'chart' },\n chartTreemap: { icon: chartTreemap, category: 'chart' },\n chartTable: { icon: table, category: 'chart' },\n chartActivityGrid: { icon: calendarStats, category: 'chart' },\n chartKpiNumber: { icon: number, category: 'chart' },\n chartKpiDelta: { icon: trendingUp, category: 'chart' },\n chartKpiText: { icon: typography, category: 'chart' },\n chartMarkdown: { icon: fileText, category: 'chart' },\n\n // Measure type icons (solid)\n measureCount: { icon: bars3BottomLeftSolid, category: 'measure' },\n measureCountDistinct: { icon: fingerPrintSolid, category: 'measure' },\n measureCountDistinctApprox: { icon: chartBarSquareSolid, category: 'measure' },\n measureSum: { icon: plusCircleSolid, category: 'measure' },\n measureAvg: { icon: scaleSolid, category: 'measure' },\n measureMin: { icon: arrowDownCircleSolid, category: 'measure' },\n measureMax: { icon: arrowUpCircleSolid, category: 'measure' },\n measureRunningTotal: { icon: arrowTrendingUpSolid, category: 'measure' },\n measureCalculated: { icon: beakerSolid, category: 'measure' },\n measureNumber: { icon: hashtagSolid, category: 'measure' },\n\n // State icons\n success: { icon: checkCircle, category: 'state' },\n warning: { icon: exclamationTriangle, category: 'state' },\n error: { icon: exclamationCircle, category: 'state' },\n info: { icon: infoCircle, category: 'state' },\n loading: { icon: arrowPath, category: 'state' },\n sparkles: { icon: sparkles, category: 'state' },\n\n // Navigation icons\n chevronUp: { icon: chevronUp, category: 'navigation' },\n chevronDown: { icon: chevronDown, category: 'navigation' },\n chevronLeft: { icon: chevronLeft, category: 'navigation' },\n chevronRight: { icon: chevronRight, category: 'navigation' },\n chevronUpDown: { icon: selector, category: 'navigation' },\n arrowUp: { icon: arrowUpCircleSolid, category: 'navigation' },\n arrowDown: { icon: arrowDownCircleSolid, category: 'navigation' },\n arrowRight: { icon: arrowRight, category: 'navigation' },\n arrowPath: { icon: arrowPath, category: 'navigation' },\n}\n","/**\n * Icon Registry - Centralized icon management following the theme pattern\n * Allows users to override any icon with their own implementations\n */\n\nimport { Icon } from '@iconify/react'\nimport type { IconifyIcon } from '@iconify/types'\nimport type { ComponentType } from 'react'\nimport { DEFAULT_ICONS } from './defaultIcons'\nimport type { IconRegistry, IconName, IconDefinition, IconCategory, IconProps, PartialIconRegistry } from './types'\n\n// Internal mutable registry - starts with defaults\nlet _registry: IconRegistry = { ...DEFAULT_ICONS }\n\n// Cache for icon components to avoid recreating on every getIcon() call\n// This prevents React from unmounting/remounting icons on each render\nconst _iconComponentCache = new Map<IconName, ComponentType<IconProps>>()\n\n/**\n * Get the full icon registry\n */\nexport function getIconRegistry(): IconRegistry {\n return _registry\n}\n\n/**\n * Get a specific icon as a React component\n * @param name The icon name from the registry\n * @returns A React component that renders the icon (cached for stable references)\n */\nexport function getIcon(name: IconName): ComponentType<IconProps> {\n // Check cache first for stable component references\n const cached = _iconComponentCache.get(name)\n if (cached) {\n return cached\n }\n\n const iconDef = _registry[name]\n if (!iconDef) {\n console.warn(`Icon \"${name}\" not found in registry, using fallback`)\n // Create and cache fallback component\n const FallbackIcon = ({ className, ...props }: IconProps) => (\n <Icon icon={_registry.info.icon} className={className} {...props} />\n )\n return FallbackIcon\n }\n\n // Create and cache the icon component\n const IconComponent = ({ className, ...props }: IconProps) => (\n <Icon icon={iconDef.icon} className={className} {...props} />\n )\n _iconComponentCache.set(name, IconComponent)\n return IconComponent\n}\n\n/**\n * Get icon data directly (for use with Iconify's Icon component)\n * @param name The icon name from the registry\n * @returns The IconifyIcon data\n */\nexport function getIconData(name: IconName): IconifyIcon {\n return _registry[name]?.icon ?? _registry.info.icon\n}\n\n/**\n * Override a single icon in the registry\n * @param name The icon name to override\n * @param icon The new IconifyIcon data\n */\nexport function setIcon(name: IconName, icon: IconifyIcon): void {\n if (_registry[name]) {\n _registry[name] = {\n ..._registry[name],\n icon\n }\n // Clear cache for this icon so it gets recreated with new definition\n _iconComponentCache.delete(name)\n }\n}\n\n/**\n * Register multiple icon overrides at once\n * @param overrides Partial registry with icons to override\n */\nexport function registerIcons(overrides: PartialIconRegistry): void {\n for (const [key, value] of Object.entries(overrides)) {\n if (value && key in _registry) {\n const iconKey = key as IconName\n\n // Check if it's a raw IconifyIcon or a full IconDefinition\n if ('body' in value) {\n // It's an IconifyIcon\n _registry[iconKey] = {\n ..._registry[iconKey],\n icon: value as IconifyIcon\n }\n } else {\n // It's a partial IconDefinition\n const partial = value as Partial<IconDefinition>\n _registry[iconKey] = {\n ..._registry[iconKey],\n ...partial,\n icon: partial.icon ?? _registry[iconKey].icon\n }\n }\n // Clear cache for this icon so it gets recreated with new definition\n _iconComponentCache.delete(iconKey)\n }\n }\n}\n\n/**\n * Reset the registry to default icons\n */\nexport function resetIcons(): void {\n _registry = { ...DEFAULT_ICONS }\n // Clear all cached icon components\n _iconComponentCache.clear()\n}\n\n/**\n * Get all icons in a specific category\n * @param category The icon category to filter by\n * @returns Record of icon names to their components\n */\nexport function getIconsByCategory(category: IconCategory): Record<string, ComponentType<IconProps>> {\n const result: Record<string, ComponentType<IconProps>> = {}\n\n for (const [key, value] of Object.entries(_registry)) {\n if (value.category === category) {\n result[key] = getIcon(key as IconName)\n }\n }\n\n return result\n}\n\n/**\n * Helper to get measure type icon component\n * @param measureType The measure type (count, avg, sum, etc.)\n * @returns React component for the icon\n */\nexport function getMeasureTypeIcon(measureType: string | undefined): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n count: 'measureCount',\n countDistinct: 'measureCountDistinct',\n countDistinctApprox: 'measureCountDistinctApprox',\n sum: 'measureSum',\n avg: 'measureAvg',\n min: 'measureMin',\n max: 'measureMax',\n runningTotal: 'measureRunningTotal',\n calculated: 'measureCalculated',\n number: 'measureNumber'\n }\n\n const iconName = typeMap[measureType || ''] || 'measureCount'\n return getIcon(iconName)\n}\n\n/**\n * Helper to get chart type icon component\n * @param chartType The chart type (bar, line, pie, etc.)\n * @returns React component for the icon\n */\nexport function getChartTypeIcon(chartType: string): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n bar: 'chartBar',\n line: 'chartLine',\n area: 'chartArea',\n pie: 'chartPie',\n scatter: 'chartScatter',\n bubble: 'chartBubble',\n radar: 'chartRadar',\n radialBar: 'chartRadialBar',\n treemap: 'chartTreemap',\n table: 'chartTable',\n activityGrid: 'chartActivityGrid',\n kpiNumber: 'chartKpiNumber',\n kpiDelta: 'chartKpiDelta',\n kpiText: 'chartKpiText',\n markdown: 'chartMarkdown'\n }\n\n const iconName = typeMap[chartType] || 'chartBar'\n return getIcon(iconName)\n}\n\n/**\n * Helper to get field type icon component\n * @param fieldType The field type (measure, dimension, timeDimension)\n * @returns React component for the icon\n */\nexport function getFieldTypeIcon(fieldType: string): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n measure: 'measure',\n dimension: 'dimension',\n timeDimension: 'timeDimension',\n time: 'timeDimension',\n segment: 'segment'\n }\n\n const iconName = typeMap[fieldType] || 'dimension'\n return getIcon(iconName)\n}\n","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('activityGrid'),\n description: 'GitHub-style activity grid showing temporal patterns across different time scales',\n useCase: 'Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'fitToWidth',\n label: 'Fit to Width',\n type: 'boolean',\n defaultValue: false,\n description: 'Automatically size blocks to fill portlet width and height while maintaining aspect ratio'\n }\n ],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["DEFAULT_ICONS","xMark","plus","pencil","trash","arrowPath","clipboardDocument","documentDuplicate","cog","funnel","share","chevronDown","chevronUp","magnifyingGlass","bars3","playSolid","checkSolid","link","eye","eyeSlash","adjustmentsHorizontal","computerDesktop","tableCells","sun","moon","ellipsisHorizontal","documentText","bookOpen","codeBracket","chartBarSolid","tagSolid","calendarSolid","rectangleGroupSolid","chartBarTabler","chartLine","chartAreaLine","chartPie","chartDots2","chartBubble","chartRadar","radar2","chartTreemap","table","calendarStats","number","trendingUp","typography","fileText","bars3BottomLeftSolid","fingerPrintSolid","chartBarSquareSolid","plusCircleSolid","scaleSolid","arrowDownCircleSolid","arrowUpCircleSolid","arrowTrendingUpSolid","beakerSolid","hashtagSolid","checkCircle","exclamationTriangle","exclamationCircle","infoCircle","sparkles","chevronLeft","chevronRight","selector","arrowRight","_registry","_iconComponentCache","getIconRegistry","getIcon","name","cached","iconDef","className","props","jsx","Icon","IconComponent","getIconData","setIcon","icon","registerIcons","overrides","key","value","iconKey","partial","resetIcons","getIconsByCategory","category","result","getMeasureTypeIcon","measureType","iconName","getChartTypeIcon","chartType","getFieldTypeIcon","fieldType","activityGridChartConfig","config","dateField","valueField"],"mappings":"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"}
|
package/dist/client/chunks/{chart-areachart-config-DWN1E5ej.js → chart-areachart-config-C2iwLEgm.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as e } from "./chart-activitygridchart-config-
|
|
1
|
+
import { g as e } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
2
2
|
const s = {
|
|
3
3
|
icon: e("area"),
|
|
4
4
|
description: "Emphasize magnitude of change over time",
|
|
@@ -62,4 +62,4 @@ const s = {
|
|
|
62
62
|
export {
|
|
63
63
|
s as areaChartConfig
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=chart-areachart-config-
|
|
65
|
+
//# sourceMappingURL=chart-areachart-config-C2iwLEgm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-areachart-config-
|
|
1
|
+
{"version":3,"file":"chart-areachart-config-C2iwLEgm.js","sources":["../../../src/client/components/charts/AreaChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('area'),\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple area series'\n },\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n }\n ]\n}"],"names":["areaChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,MAAM;AAAA,EAC7B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
package/dist/client/chunks/{chart-barchart-config-DZA0xTns.js → chart-barchart-config-CAsUZfHw.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as e } from "./chart-activitygridchart-config-
|
|
1
|
+
import { g as e } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
2
2
|
const i = {
|
|
3
3
|
icon: e("bar"),
|
|
4
4
|
description: "Compare values across categories",
|
|
@@ -55,4 +55,4 @@ const i = {
|
|
|
55
55
|
export {
|
|
56
56
|
i as barChartConfig
|
|
57
57
|
};
|
|
58
|
-
//# sourceMappingURL=chart-barchart-config-
|
|
58
|
+
//# sourceMappingURL=chart-barchart-config-CAsUZfHw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-barchart-config-
|
|
1
|
+
{"version":3,"file":"chart-barchart-config-CAsUZfHw.js","sources":["../../../src/client/components/charts/BarChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bar'),\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple bar series'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n }\n ]\n}"],"names":["barChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAkC;AAAA,EAC7C,MAAMC,EAAiB,KAAK;AAAA,EAC5B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as e } from "./chart-activitygridchart-config-
|
|
1
|
+
import { g as e } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
2
2
|
const s = {
|
|
3
3
|
icon: e("bubble"),
|
|
4
4
|
description: "Compare three dimensions of data",
|
|
@@ -55,4 +55,4 @@ const s = {
|
|
|
55
55
|
export {
|
|
56
56
|
s as bubbleChartConfig
|
|
57
57
|
};
|
|
58
|
-
//# sourceMappingURL=chart-bubblechart-config-
|
|
58
|
+
//# sourceMappingURL=chart-bubblechart-config-DRuY0m7S.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-bubblechart-config-
|
|
1
|
+
{"version":3,"file":"chart-bubblechart-config-DRuY0m7S.js","sources":["../../../src/client/components/charts/BubbleChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bubble'),\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity', 'hideHeader']\n}"],"names":["bubbleChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAqC;AAAA,EAChD,MAAMC,EAAiB,QAAQ;AAAA,EAC/B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,SAAS;AAAA,MACpC,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,iBAAiB,iBAAiB,iBAAiB,YAAY;AAC3H;"}
|
package/dist/client/chunks/{chart-datatable-config-DqGw99R3.js → chart-datatable-config-C0MoGDgo.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as e } from "./chart-activitygridchart-config-
|
|
1
|
+
import { g as e } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
2
2
|
const s = {
|
|
3
3
|
icon: e("table"),
|
|
4
4
|
description: "Display detailed tabular data",
|
|
@@ -18,4 +18,4 @@ const s = {
|
|
|
18
18
|
export {
|
|
19
19
|
s as dataTableConfig
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=chart-datatable-config-
|
|
21
|
+
//# sourceMappingURL=chart-datatable-config-C0MoGDgo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-datatable-config-
|
|
1
|
+
{"version":3,"file":"chart-datatable-config-C0MoGDgo.js","sources":["../../../src/client/components/charts/DataTable.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('table'),\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: ['hideHeader']\n}"],"names":["dataTableConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,OAAO;AAAA,EAC9B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAC/B;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as r, jsxs as m } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo as y } from "react";
|
|
3
3
|
import { c as N, u as k } from "./chart-activitygridchart-Cz4bEf3V.js";
|
|
4
|
-
import { a as C } from "./chart-activitygridchart-config-
|
|
4
|
+
import { a as C } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
5
5
|
function D(e) {
|
|
6
6
|
if (!e?.timeDimensions?.length) return null;
|
|
7
7
|
const t = e.timeDimensions.find((a) => a.granularity);
|
|
@@ -246,4 +246,4 @@ function L(e) {
|
|
|
246
246
|
export {
|
|
247
247
|
B as default
|
|
248
248
|
};
|
|
249
|
-
//# sourceMappingURL=chart-datatable-
|
|
249
|
+
//# sourceMappingURL=chart-datatable-zyVFtRJ_.js.map
|
package/dist/client/chunks/{chart-datatable-Mo4gYCwa.js.map → chart-datatable-zyVFtRJ_.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-datatable-Mo4gYCwa.js","sources":["../../../src/client/utils/pivotUtils.ts","../../../src/client/components/charts/DataTable.tsx"],"sourcesContent":["/**\n * Pivot utilities for DataTable time dimension pivoting\n *\n * When a query includes a time dimension with granularity, transforms flat data\n * into a pivoted structure with time periods as columns.\n */\n\nimport type { CubeQuery } from '../types'\nimport type { CubeMeta } from '../hooks/useCubeMeta'\nimport { formatTimeValue } from './chartUtils'\n\n/**\n * Configuration for pivoting based on query structure\n */\nexport interface PivotConfig {\n /** Time dimension field name (e.g., \"Sales.date\") */\n timeDimension: string\n /** Time granularity (e.g., \"month\", \"day\", \"year\") */\n granularity: string\n /** Non-time dimension fields */\n dimensions: string[]\n /** Measure fields */\n measures: string[]\n}\n\n/**\n * Column definition for pivoted table\n */\nexport interface PivotColumn {\n /** Column key for data access */\n key: string\n /** Display label for column header */\n label: string\n /** Whether this is a time column (vs row identifier column) */\n isTimeColumn: boolean\n /** Whether this is the measure column */\n isMeasureColumn?: boolean\n}\n\n/**\n * Row in the pivoted table\n */\nexport interface PivotRow {\n /** Unique row identifier */\n id: string\n /** The measure field name (for icon lookup) */\n measureField: string\n /** Values keyed by column key */\n values: Record<string, any>\n /** Whether this is the first row in a dimension group (for row spanning) */\n isFirstInGroup?: boolean\n /** Number of rows to span for dimension cells (only set on first row in group) */\n dimensionRowSpan?: number\n}\n\n/**\n * Result of pivoting table data\n */\nexport interface PivotedTableData {\n /** Whether data was pivoted (has time dimension with granularity) */\n isPivoted: boolean\n /** Column definitions for the pivoted table */\n columns: PivotColumn[]\n /** Rows of pivoted data */\n rows: PivotRow[]\n}\n\n/**\n * Determines if a query has a time dimension with granularity that should trigger pivoting\n * @param queryObject The CubeQuery object\n * @returns PivotConfig if pivoting should occur, null otherwise\n */\nexport function hasTimeDimensionForPivot(queryObject?: CubeQuery): PivotConfig | null {\n if (!queryObject?.timeDimensions?.length) return null\n\n // Find the first time dimension with granularity\n const timeDim = queryObject.timeDimensions.find(td => td.granularity)\n if (!timeDim?.granularity) return null\n\n // Must have at least one measure to pivot\n if (!queryObject.measures?.length) return null\n\n return {\n timeDimension: timeDim.dimension,\n granularity: timeDim.granularity,\n dimensions: queryObject.dimensions || [],\n measures: queryObject.measures\n }\n}\n\n/**\n * Extracts unique time values from data and sorts them chronologically\n */\nfunction extractAndSortTimeValues(\n data: any[],\n timeDimension: string,\n granularity: string\n): string[] {\n const timeSet = new Set<string>()\n\n data.forEach(row => {\n const rawTime = row[timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, granularity)\n timeSet.add(formattedTime)\n }\n })\n\n // Sort chronologically - ISO date strings sort correctly alphabetically\n return Array.from(timeSet).sort()\n}\n\n/**\n * Builds column definitions for pivoted table\n * Order: Measure (if multiple) -> Dimensions -> Time columns\n */\nfunction buildColumns(\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotColumn[] {\n const columns: PivotColumn[] = []\n\n // Add measure column first (if multiple measures)\n if (config.measures.length > 1) {\n columns.push({\n key: '__measure__',\n label: 'Measure',\n isTimeColumn: false,\n isMeasureColumn: true\n })\n }\n\n // Add dimension columns\n config.dimensions.forEach(dim => {\n columns.push({\n key: dim,\n label: getFieldLabel(dim),\n isTimeColumn: false\n })\n })\n\n // Add time columns (already sorted chronologically)\n timeValues.forEach(timeVal => {\n columns.push({\n key: timeVal,\n label: timeVal,\n isTimeColumn: true\n })\n })\n\n return columns\n}\n\n/**\n * Groups data by dimension values, then by time period\n * Returns Map<dimensionKey, Map<formattedTime, dataRow>>\n */\nfunction groupByDimensions(\n data: any[],\n config: PivotConfig\n): Map<string, Map<string, any>> {\n const grouped = new Map<string, Map<string, any>>()\n\n data.forEach(row => {\n // Build dimension key from all dimension values\n const dimKey = config.dimensions.length > 0\n ? config.dimensions.map(dim => String(row[dim] ?? '')).join('|')\n : '__all__'\n\n // Get or create time map for this dimension combo\n if (!grouped.has(dimKey)) {\n grouped.set(dimKey, new Map())\n }\n\n // Store data point by formatted time value\n const rawTime = row[config.timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, config.granularity)\n grouped.get(dimKey)!.set(formattedTime, row)\n }\n })\n\n return grouped\n}\n\n/**\n * Builds pivoted rows from grouped data\n * Rows are grouped by measure first (all Revenue rows together, all Quantity rows together)\n * Then within each measure group, rows are ordered by dimension values\n */\nfunction buildPivotedRows(\n data: any[],\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotRow[] {\n // Group data by dimensions and time\n const grouped = groupByDimensions(data, config)\n const dimensionKeys = Array.from(grouped.keys())\n\n const rows: PivotRow[] = []\n const measureCount = config.measures.length\n const dimensionCount = dimensionKeys.length\n\n // Iterate over measures first, then dimensions\n // This groups all rows for one measure together\n config.measures.forEach((measure) => {\n dimensionKeys.forEach((dimensionKey, dimIndex) => {\n const timeData = grouped.get(dimensionKey)!\n const rowId = measureCount > 1\n ? `${measure}|${dimensionKey}`\n : dimensionKey\n\n const values: Record<string, any> = {}\n\n // Add dimension values\n const dimValues = dimensionKey === '__all__' ? [] : dimensionKey.split('|')\n config.dimensions.forEach((dim, idx) => {\n values[dim] = dimValues[idx] ?? ''\n })\n\n // Add measure name if multiple measures (for display in Measure column)\n if (measureCount > 1) {\n values['__measure__'] = getFieldLabel(measure)\n }\n\n // Add time period values\n timeValues.forEach(timeVal => {\n const dataPoint = timeData.get(timeVal)\n values[timeVal] = dataPoint?.[measure] ?? null\n })\n\n // Track grouping for row spanning (when multiple measures)\n // First row of each measure group should span all dimension rows\n const isFirstInGroup = dimIndex === 0\n const measureRowSpan = isFirstInGroup && measureCount > 1 ? dimensionCount : undefined\n\n rows.push({\n id: rowId,\n measureField: measure,\n values,\n isFirstInGroup,\n dimensionRowSpan: measureRowSpan\n })\n })\n })\n\n return rows\n}\n\n/**\n * Pivots flat data into time-columned table structure\n *\n * @param data Raw data array from query result\n * @param config Pivot configuration\n * @param getFieldLabel Function to get display label for a field\n * @param meta Optional cube metadata for looking up measure types\n * @returns Pivoted table data structure\n */\nexport function pivotTableData(\n data: any[],\n config: PivotConfig,\n getFieldLabel: (field: string) => string,\n _meta?: CubeMeta | null\n): PivotedTableData {\n if (!data || data.length === 0) {\n return { isPivoted: true, columns: [], rows: [] }\n }\n\n // Extract unique time values and sort chronologically\n const timeValues = extractAndSortTimeValues(data, config.timeDimension, config.granularity)\n\n // Build column definitions\n const columns = buildColumns(config, timeValues, getFieldLabel)\n\n // Build pivoted rows\n const rows = buildPivotedRows(data, config, timeValues, getFieldLabel)\n\n return { isPivoted: true, columns, rows }\n}\n\n/**\n * Looks up the measure type from metadata\n *\n * @param measureField The fully qualified measure field name (e.g., \"Sales.revenue\")\n * @param meta Cube metadata\n * @returns The measure type (e.g., \"sum\", \"count\", \"avg\") or undefined\n */\nexport function getMeasureType(measureField: string, meta: CubeMeta | null): string | undefined {\n if (!meta?.cubes) return undefined\n\n for (const cube of meta.cubes) {\n const measure = cube.measures.find(m => m.name === measureField)\n if (measure) {\n return measure.type\n }\n }\n\n return undefined\n}\n","/**\n * Data Table component with time dimension pivoting\n *\n * When a query includes a time dimension with granularity, the table\n * automatically pivots to show time periods as columns.\n */\n\nimport { useMemo } from 'react'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport { getMeasureTypeIcon } from '../../icons'\nimport {\n hasTimeDimensionForPivot,\n pivotTableData,\n getMeasureType,\n type PivotedTableData,\n type PivotColumn,\n type PivotRow\n} from '../../utils/pivotUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function DataTable({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = 300\n}: ChartProps) {\n const { getFieldLabel, meta } = useCubeContext()\n\n // Detect if we should pivot based on query structure\n const pivotConfig = useMemo(\n () => hasTimeDimensionForPivot(queryObject),\n [queryObject]\n )\n\n // Check if pivoting is enabled (default: true when time dimension present)\n const enablePivot = displayConfig?.pivotTimeDimension !== false\n\n // Compute pivoted data if applicable\n const pivotedData = useMemo<PivotedTableData | null>(() => {\n if (!pivotConfig || !enablePivot) return null\n return pivotTableData(data, pivotConfig, getFieldLabel, meta)\n }, [data, pivotConfig, enablePivot, getFieldLabel, meta])\n\n // Empty state\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n // Render pivoted table if applicable\n if (pivotedData?.isPivoted && pivotedData.columns.length > 0) {\n return (\n <PivotedTable\n pivotedData={pivotedData}\n height={height}\n meta={meta}\n />\n )\n }\n\n // Fallback to flat table rendering\n return (\n <FlatTable\n data={data}\n chartConfig={chartConfig}\n height={height}\n getFieldLabel={getFieldLabel}\n />\n )\n}\n\n/**\n * Pivoted table component - renders time dimension as columns\n */\nfunction PivotedTable({\n pivotedData,\n height,\n meta\n}: {\n pivotedData: PivotedTableData\n height: number | string\n meta: any\n}) {\n const { columns, rows } = pivotedData\n\n if (columns.length === 0 || rows.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((col: PivotColumn) => (\n <th\n key={col.key}\n className={`px-3 py-2 text-xs font-medium text-dc-text-muted uppercase tracking-wider whitespace-nowrap ${\n col.isTimeColumn ? 'text-right' : 'text-left'\n }`}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {rows.map((row: PivotRow) => (\n <PivotedTableRow\n key={row.id}\n row={row}\n columns={columns}\n meta={meta}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Single row in the pivoted table\n * Supports row spanning for measure cells when grouped by measure\n */\nfunction PivotedTableRow({\n row,\n columns,\n meta\n}: {\n row: PivotRow\n columns: PivotColumn[]\n meta: any\n}) {\n // Get measure icon for this row\n const measureType = getMeasureType(row.measureField, meta)\n const MeasureIcon = getMeasureTypeIcon(measureType)\n\n return (\n <tr className=\"hover:bg-dc-surface-secondary\">\n {columns.map((col: PivotColumn) => {\n const value = row.values[col.key]\n\n // Measure column - show icon + label with row spanning\n if (col.isMeasureColumn) {\n // Skip this cell if not first in measure group\n if (row.isFirstInGroup === false) {\n return null\n }\n\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text align-top\"\n rowSpan={row.dimensionRowSpan}\n >\n <div className=\"flex items-center\">\n <MeasureIcon className=\"w-3.5 h-3.5 mr-1.5 text-dc-text-muted shrink-0\" />\n <span>{value}</span>\n </div>\n </td>\n )\n }\n\n // Time column - right-aligned, formatted values\n if (col.isTimeColumn) {\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-right text-dc-text\"\n >\n {formatPivotCellValue(value)}\n </td>\n )\n }\n\n // Dimension column - left-aligned (no row spanning)\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatPivotCellValue(value)}\n </td>\n )\n })}\n </tr>\n )\n}\n\n/**\n * Format cell value for pivoted table display\n * Shows \"-\" for null/undefined values\n */\nfunction formatPivotCellValue(value: any): string {\n if (value === null || value === undefined) return '-'\n if (typeof value === 'number') {\n // Format with locale and up to 2 decimal places\n if (Number.isInteger(value)) {\n return value.toLocaleString()\n }\n return parseFloat(value.toFixed(2)).toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n\n/**\n * Flat table component - original non-pivoted table rendering\n */\nfunction FlatTable({\n data,\n chartConfig,\n height,\n getFieldLabel\n}: {\n data: any[]\n chartConfig?: { xAxis?: string[] }\n height: number | string\n getFieldLabel: (field: string) => string\n}) {\n // Use chartConfig.xAxis to filter columns, or show all if not specified\n const allColumns = Object.keys(data[0] || {})\n const columns = chartConfig?.xAxis && chartConfig.xAxis.length > 0\n ? chartConfig.xAxis.filter(col => allColumns.includes(col))\n : allColumns\n\n if (columns.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No columns available</div>\n <div className=\"text-xs text-dc-text-secondary\">Data structure is invalid</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((column) => (\n <th\n key={column}\n className=\"px-3 py-2 text-left text-xs font-medium text-dc-text-muted uppercase tracking-wider\"\n >\n {getFieldLabel(column)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {data.map((row, index) => (\n <tr key={index} className=\"hover:bg-dc-surface-secondary\">\n {columns.map((column) => (\n <td\n key={column}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatCellValue(row[column])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Format cell value for flat table display\n */\nfunction formatCellValue(value: any): string {\n if (value == null) return ''\n if (typeof value === 'number') {\n return value.toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n"],"names":["hasTimeDimensionForPivot","queryObject","timeDim","td","extractAndSortTimeValues","data","timeDimension","granularity","timeSet","row","rawTime","formattedTime","formatTimeValue","buildColumns","config","timeValues","getFieldLabel","columns","dim","timeVal","groupByDimensions","grouped","dimKey","buildPivotedRows","dimensionKeys","rows","measureCount","dimensionCount","measure","dimensionKey","dimIndex","timeData","rowId","values","dimValues","idx","dataPoint","isFirstInGroup","measureRowSpan","pivotTableData","_meta","getMeasureType","measureField","meta","cube","m","DataTable","chartConfig","displayConfig","height","useCubeContext","pivotConfig","useMemo","enablePivot","pivotedData","jsx","jsxs","PivotedTable","FlatTable","col","PivotedTableRow","measureType","MeasureIcon","getMeasureTypeIcon","value","formatPivotCellValue","allColumns","column","index","formatCellValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-datatable-zyVFtRJ_.js","sources":["../../../src/client/utils/pivotUtils.ts","../../../src/client/components/charts/DataTable.tsx"],"sourcesContent":["/**\n * Pivot utilities for DataTable time dimension pivoting\n *\n * When a query includes a time dimension with granularity, transforms flat data\n * into a pivoted structure with time periods as columns.\n */\n\nimport type { CubeQuery } from '../types'\nimport type { CubeMeta } from '../hooks/useCubeMeta'\nimport { formatTimeValue } from './chartUtils'\n\n/**\n * Configuration for pivoting based on query structure\n */\nexport interface PivotConfig {\n /** Time dimension field name (e.g., \"Sales.date\") */\n timeDimension: string\n /** Time granularity (e.g., \"month\", \"day\", \"year\") */\n granularity: string\n /** Non-time dimension fields */\n dimensions: string[]\n /** Measure fields */\n measures: string[]\n}\n\n/**\n * Column definition for pivoted table\n */\nexport interface PivotColumn {\n /** Column key for data access */\n key: string\n /** Display label for column header */\n label: string\n /** Whether this is a time column (vs row identifier column) */\n isTimeColumn: boolean\n /** Whether this is the measure column */\n isMeasureColumn?: boolean\n}\n\n/**\n * Row in the pivoted table\n */\nexport interface PivotRow {\n /** Unique row identifier */\n id: string\n /** The measure field name (for icon lookup) */\n measureField: string\n /** Values keyed by column key */\n values: Record<string, any>\n /** Whether this is the first row in a dimension group (for row spanning) */\n isFirstInGroup?: boolean\n /** Number of rows to span for dimension cells (only set on first row in group) */\n dimensionRowSpan?: number\n}\n\n/**\n * Result of pivoting table data\n */\nexport interface PivotedTableData {\n /** Whether data was pivoted (has time dimension with granularity) */\n isPivoted: boolean\n /** Column definitions for the pivoted table */\n columns: PivotColumn[]\n /** Rows of pivoted data */\n rows: PivotRow[]\n}\n\n/**\n * Determines if a query has a time dimension with granularity that should trigger pivoting\n * @param queryObject The CubeQuery object\n * @returns PivotConfig if pivoting should occur, null otherwise\n */\nexport function hasTimeDimensionForPivot(queryObject?: CubeQuery): PivotConfig | null {\n if (!queryObject?.timeDimensions?.length) return null\n\n // Find the first time dimension with granularity\n const timeDim = queryObject.timeDimensions.find(td => td.granularity)\n if (!timeDim?.granularity) return null\n\n // Must have at least one measure to pivot\n if (!queryObject.measures?.length) return null\n\n return {\n timeDimension: timeDim.dimension,\n granularity: timeDim.granularity,\n dimensions: queryObject.dimensions || [],\n measures: queryObject.measures\n }\n}\n\n/**\n * Extracts unique time values from data and sorts them chronologically\n */\nfunction extractAndSortTimeValues(\n data: any[],\n timeDimension: string,\n granularity: string\n): string[] {\n const timeSet = new Set<string>()\n\n data.forEach(row => {\n const rawTime = row[timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, granularity)\n timeSet.add(formattedTime)\n }\n })\n\n // Sort chronologically - ISO date strings sort correctly alphabetically\n return Array.from(timeSet).sort()\n}\n\n/**\n * Builds column definitions for pivoted table\n * Order: Measure (if multiple) -> Dimensions -> Time columns\n */\nfunction buildColumns(\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotColumn[] {\n const columns: PivotColumn[] = []\n\n // Add measure column first (if multiple measures)\n if (config.measures.length > 1) {\n columns.push({\n key: '__measure__',\n label: 'Measure',\n isTimeColumn: false,\n isMeasureColumn: true\n })\n }\n\n // Add dimension columns\n config.dimensions.forEach(dim => {\n columns.push({\n key: dim,\n label: getFieldLabel(dim),\n isTimeColumn: false\n })\n })\n\n // Add time columns (already sorted chronologically)\n timeValues.forEach(timeVal => {\n columns.push({\n key: timeVal,\n label: timeVal,\n isTimeColumn: true\n })\n })\n\n return columns\n}\n\n/**\n * Groups data by dimension values, then by time period\n * Returns Map<dimensionKey, Map<formattedTime, dataRow>>\n */\nfunction groupByDimensions(\n data: any[],\n config: PivotConfig\n): Map<string, Map<string, any>> {\n const grouped = new Map<string, Map<string, any>>()\n\n data.forEach(row => {\n // Build dimension key from all dimension values\n const dimKey = config.dimensions.length > 0\n ? config.dimensions.map(dim => String(row[dim] ?? '')).join('|')\n : '__all__'\n\n // Get or create time map for this dimension combo\n if (!grouped.has(dimKey)) {\n grouped.set(dimKey, new Map())\n }\n\n // Store data point by formatted time value\n const rawTime = row[config.timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, config.granularity)\n grouped.get(dimKey)!.set(formattedTime, row)\n }\n })\n\n return grouped\n}\n\n/**\n * Builds pivoted rows from grouped data\n * Rows are grouped by measure first (all Revenue rows together, all Quantity rows together)\n * Then within each measure group, rows are ordered by dimension values\n */\nfunction buildPivotedRows(\n data: any[],\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotRow[] {\n // Group data by dimensions and time\n const grouped = groupByDimensions(data, config)\n const dimensionKeys = Array.from(grouped.keys())\n\n const rows: PivotRow[] = []\n const measureCount = config.measures.length\n const dimensionCount = dimensionKeys.length\n\n // Iterate over measures first, then dimensions\n // This groups all rows for one measure together\n config.measures.forEach((measure) => {\n dimensionKeys.forEach((dimensionKey, dimIndex) => {\n const timeData = grouped.get(dimensionKey)!\n const rowId = measureCount > 1\n ? `${measure}|${dimensionKey}`\n : dimensionKey\n\n const values: Record<string, any> = {}\n\n // Add dimension values\n const dimValues = dimensionKey === '__all__' ? [] : dimensionKey.split('|')\n config.dimensions.forEach((dim, idx) => {\n values[dim] = dimValues[idx] ?? ''\n })\n\n // Add measure name if multiple measures (for display in Measure column)\n if (measureCount > 1) {\n values['__measure__'] = getFieldLabel(measure)\n }\n\n // Add time period values\n timeValues.forEach(timeVal => {\n const dataPoint = timeData.get(timeVal)\n values[timeVal] = dataPoint?.[measure] ?? null\n })\n\n // Track grouping for row spanning (when multiple measures)\n // First row of each measure group should span all dimension rows\n const isFirstInGroup = dimIndex === 0\n const measureRowSpan = isFirstInGroup && measureCount > 1 ? dimensionCount : undefined\n\n rows.push({\n id: rowId,\n measureField: measure,\n values,\n isFirstInGroup,\n dimensionRowSpan: measureRowSpan\n })\n })\n })\n\n return rows\n}\n\n/**\n * Pivots flat data into time-columned table structure\n *\n * @param data Raw data array from query result\n * @param config Pivot configuration\n * @param getFieldLabel Function to get display label for a field\n * @param meta Optional cube metadata for looking up measure types\n * @returns Pivoted table data structure\n */\nexport function pivotTableData(\n data: any[],\n config: PivotConfig,\n getFieldLabel: (field: string) => string,\n _meta?: CubeMeta | null\n): PivotedTableData {\n if (!data || data.length === 0) {\n return { isPivoted: true, columns: [], rows: [] }\n }\n\n // Extract unique time values and sort chronologically\n const timeValues = extractAndSortTimeValues(data, config.timeDimension, config.granularity)\n\n // Build column definitions\n const columns = buildColumns(config, timeValues, getFieldLabel)\n\n // Build pivoted rows\n const rows = buildPivotedRows(data, config, timeValues, getFieldLabel)\n\n return { isPivoted: true, columns, rows }\n}\n\n/**\n * Looks up the measure type from metadata\n *\n * @param measureField The fully qualified measure field name (e.g., \"Sales.revenue\")\n * @param meta Cube metadata\n * @returns The measure type (e.g., \"sum\", \"count\", \"avg\") or undefined\n */\nexport function getMeasureType(measureField: string, meta: CubeMeta | null): string | undefined {\n if (!meta?.cubes) return undefined\n\n for (const cube of meta.cubes) {\n const measure = cube.measures.find(m => m.name === measureField)\n if (measure) {\n return measure.type\n }\n }\n\n return undefined\n}\n","/**\n * Data Table component with time dimension pivoting\n *\n * When a query includes a time dimension with granularity, the table\n * automatically pivots to show time periods as columns.\n */\n\nimport { useMemo } from 'react'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport { getMeasureTypeIcon } from '../../icons'\nimport {\n hasTimeDimensionForPivot,\n pivotTableData,\n getMeasureType,\n type PivotedTableData,\n type PivotColumn,\n type PivotRow\n} from '../../utils/pivotUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function DataTable({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = 300\n}: ChartProps) {\n const { getFieldLabel, meta } = useCubeContext()\n\n // Detect if we should pivot based on query structure\n const pivotConfig = useMemo(\n () => hasTimeDimensionForPivot(queryObject),\n [queryObject]\n )\n\n // Check if pivoting is enabled (default: true when time dimension present)\n const enablePivot = displayConfig?.pivotTimeDimension !== false\n\n // Compute pivoted data if applicable\n const pivotedData = useMemo<PivotedTableData | null>(() => {\n if (!pivotConfig || !enablePivot) return null\n return pivotTableData(data, pivotConfig, getFieldLabel, meta)\n }, [data, pivotConfig, enablePivot, getFieldLabel, meta])\n\n // Empty state\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n // Render pivoted table if applicable\n if (pivotedData?.isPivoted && pivotedData.columns.length > 0) {\n return (\n <PivotedTable\n pivotedData={pivotedData}\n height={height}\n meta={meta}\n />\n )\n }\n\n // Fallback to flat table rendering\n return (\n <FlatTable\n data={data}\n chartConfig={chartConfig}\n height={height}\n getFieldLabel={getFieldLabel}\n />\n )\n}\n\n/**\n * Pivoted table component - renders time dimension as columns\n */\nfunction PivotedTable({\n pivotedData,\n height,\n meta\n}: {\n pivotedData: PivotedTableData\n height: number | string\n meta: any\n}) {\n const { columns, rows } = pivotedData\n\n if (columns.length === 0 || rows.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((col: PivotColumn) => (\n <th\n key={col.key}\n className={`px-3 py-2 text-xs font-medium text-dc-text-muted uppercase tracking-wider whitespace-nowrap ${\n col.isTimeColumn ? 'text-right' : 'text-left'\n }`}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {rows.map((row: PivotRow) => (\n <PivotedTableRow\n key={row.id}\n row={row}\n columns={columns}\n meta={meta}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Single row in the pivoted table\n * Supports row spanning for measure cells when grouped by measure\n */\nfunction PivotedTableRow({\n row,\n columns,\n meta\n}: {\n row: PivotRow\n columns: PivotColumn[]\n meta: any\n}) {\n // Get measure icon for this row\n const measureType = getMeasureType(row.measureField, meta)\n const MeasureIcon = getMeasureTypeIcon(measureType)\n\n return (\n <tr className=\"hover:bg-dc-surface-secondary\">\n {columns.map((col: PivotColumn) => {\n const value = row.values[col.key]\n\n // Measure column - show icon + label with row spanning\n if (col.isMeasureColumn) {\n // Skip this cell if not first in measure group\n if (row.isFirstInGroup === false) {\n return null\n }\n\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text align-top\"\n rowSpan={row.dimensionRowSpan}\n >\n <div className=\"flex items-center\">\n <MeasureIcon className=\"w-3.5 h-3.5 mr-1.5 text-dc-text-muted shrink-0\" />\n <span>{value}</span>\n </div>\n </td>\n )\n }\n\n // Time column - right-aligned, formatted values\n if (col.isTimeColumn) {\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-right text-dc-text\"\n >\n {formatPivotCellValue(value)}\n </td>\n )\n }\n\n // Dimension column - left-aligned (no row spanning)\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatPivotCellValue(value)}\n </td>\n )\n })}\n </tr>\n )\n}\n\n/**\n * Format cell value for pivoted table display\n * Shows \"-\" for null/undefined values\n */\nfunction formatPivotCellValue(value: any): string {\n if (value === null || value === undefined) return '-'\n if (typeof value === 'number') {\n // Format with locale and up to 2 decimal places\n if (Number.isInteger(value)) {\n return value.toLocaleString()\n }\n return parseFloat(value.toFixed(2)).toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n\n/**\n * Flat table component - original non-pivoted table rendering\n */\nfunction FlatTable({\n data,\n chartConfig,\n height,\n getFieldLabel\n}: {\n data: any[]\n chartConfig?: { xAxis?: string[] }\n height: number | string\n getFieldLabel: (field: string) => string\n}) {\n // Use chartConfig.xAxis to filter columns, or show all if not specified\n const allColumns = Object.keys(data[0] || {})\n const columns = chartConfig?.xAxis && chartConfig.xAxis.length > 0\n ? chartConfig.xAxis.filter(col => allColumns.includes(col))\n : allColumns\n\n if (columns.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No columns available</div>\n <div className=\"text-xs text-dc-text-secondary\">Data structure is invalid</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((column) => (\n <th\n key={column}\n className=\"px-3 py-2 text-left text-xs font-medium text-dc-text-muted uppercase tracking-wider\"\n >\n {getFieldLabel(column)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {data.map((row, index) => (\n <tr key={index} className=\"hover:bg-dc-surface-secondary\">\n {columns.map((column) => (\n <td\n key={column}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatCellValue(row[column])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Format cell value for flat table display\n */\nfunction formatCellValue(value: any): string {\n if (value == null) return ''\n if (typeof value === 'number') {\n return value.toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n"],"names":["hasTimeDimensionForPivot","queryObject","timeDim","td","extractAndSortTimeValues","data","timeDimension","granularity","timeSet","row","rawTime","formattedTime","formatTimeValue","buildColumns","config","timeValues","getFieldLabel","columns","dim","timeVal","groupByDimensions","grouped","dimKey","buildPivotedRows","dimensionKeys","rows","measureCount","dimensionCount","measure","dimensionKey","dimIndex","timeData","rowId","values","dimValues","idx","dataPoint","isFirstInGroup","measureRowSpan","pivotTableData","_meta","getMeasureType","measureField","meta","cube","m","DataTable","chartConfig","displayConfig","height","useCubeContext","pivotConfig","useMemo","enablePivot","pivotedData","jsx","jsxs","PivotedTable","FlatTable","col","PivotedTableRow","measureType","MeasureIcon","getMeasureTypeIcon","value","formatPivotCellValue","allColumns","column","index","formatCellValue"],"mappings":"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"}
|
package/dist/client/chunks/{chart-kpidelta-config-B-Y-LHmd.js → chart-kpidelta-config-Bq2Ph_Sp.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as a } from "./chart-activitygridchart-config-
|
|
1
|
+
import { g as a } from "./chart-activitygridchart-config-DVH-sdYZ.js";
|
|
2
2
|
const i = {
|
|
3
3
|
icon: a("kpiDelta"),
|
|
4
4
|
description: "Display change between latest and previous values with trend indicators",
|
|
@@ -95,4 +95,4 @@ const i = {
|
|
|
95
95
|
export {
|
|
96
96
|
i as kpiDeltaConfig
|
|
97
97
|
};
|
|
98
|
-
//# sourceMappingURL=chart-kpidelta-config-
|
|
98
|
+
//# sourceMappingURL=chart-kpidelta-config-Bq2Ph_Sp.js.map
|