drizzle-cube 0.2.9 → 0.2.11
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/chartConfigs.d.ts +3 -1
- package/dist/client/charts.js +15 -15
- package/dist/client/chunks/{chart-activitygridchart-Cz4bEf3V.js → chart-activitygridchart-D17Fxiuf.js} +841 -732
- package/dist/client/chunks/chart-activitygridchart-D17Fxiuf.js.map +1 -0
- package/dist/client/chunks/{chart-activitygridchart-config-DVH-sdYZ.js → chart-activitygridchart-config-AVBoHdRn.js} +6 -6
- package/dist/client/chunks/{chart-activitygridchart-config-DVH-sdYZ.js.map → chart-activitygridchart-config-AVBoHdRn.js.map} +1 -1
- package/dist/client/chunks/{chart-areachart-config-C2iwLEgm.js → chart-areachart-config-D9pPUKHZ.js} +16 -3
- package/dist/client/chunks/chart-areachart-config-D9pPUKHZ.js.map +1 -0
- package/dist/client/chunks/chart-areachart-udSbAzl1.js +239 -0
- package/dist/client/chunks/chart-areachart-udSbAzl1.js.map +1 -0
- package/dist/client/chunks/chart-axisformatcontrols-DqSa245M.js +196 -0
- package/dist/client/chunks/chart-axisformatcontrols-DqSa245M.js.map +1 -0
- package/dist/client/chunks/chart-barchart-CDIpqCKS.js +216 -0
- package/dist/client/chunks/chart-barchart-CDIpqCKS.js.map +1 -0
- package/dist/client/chunks/{chart-barchart-config-CAsUZfHw.js → chart-barchart-config-iniz62ni.js} +16 -3
- package/dist/client/chunks/chart-barchart-config-iniz62ni.js.map +1 -0
- package/dist/client/chunks/chart-bubblechart-CivK_yfh.js +214 -0
- package/dist/client/chunks/chart-bubblechart-CivK_yfh.js.map +1 -0
- package/dist/client/chunks/{chart-bubblechart-config-DRuY0m7S.js → chart-bubblechart-config-yLq2oyR3.js} +19 -5
- package/dist/client/chunks/{chart-bubblechart-config-DRuY0m7S.js.map → chart-bubblechart-config-yLq2oyR3.js.map} +1 -1
- package/dist/client/chunks/{chart-charttooltip-k8soCd2n.js → chart-charttooltip-BVEdz4Q-.js} +4 -4
- package/dist/client/chunks/{chart-charttooltip-k8soCd2n.js.map → chart-charttooltip-BVEdz4Q-.js.map} +1 -1
- package/dist/client/chunks/chart-datatable-NHE7BTMr.js +283 -0
- package/dist/client/chunks/chart-datatable-NHE7BTMr.js.map +1 -0
- package/dist/client/chunks/{chart-datatable-config-C0MoGDgo.js → chart-datatable-config-DmEA3A-7.js} +11 -3
- package/dist/client/chunks/{chart-datatable-config-C0MoGDgo.js.map → chart-datatable-config-DmEA3A-7.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-CTcuIO9G.js → chart-kpidelta-D-FR2o4V.js} +2 -2
- package/dist/client/chunks/{chart-kpidelta-CTcuIO9G.js.map → chart-kpidelta-D-FR2o4V.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-config-Bq2Ph_Sp.js → chart-kpidelta-config-DtSDG4Kl.js} +2 -2
- package/dist/client/chunks/{chart-kpidelta-config-Bq2Ph_Sp.js.map → chart-kpidelta-config-DtSDG4Kl.js.map} +1 -1
- package/dist/client/chunks/{chart-kpinumber-slEXt8C-.js → chart-kpinumber-DSH8RJxb.js} +4 -4
- package/dist/client/chunks/{chart-kpinumber-slEXt8C-.js.map → chart-kpinumber-DSH8RJxb.js.map} +1 -1
- package/dist/client/chunks/{chart-kpinumber-config-OMNhJXdH.js → chart-kpinumber-config-Da2LFeKM.js} +2 -2
- package/dist/client/chunks/{chart-kpinumber-config-OMNhJXdH.js.map → chart-kpinumber-config-Da2LFeKM.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-giq03TOK.js → chart-kpitext-Z9oh0bJq.js} +3 -3
- package/dist/client/chunks/{chart-kpitext-giq03TOK.js.map → chart-kpitext-Z9oh0bJq.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-config-BLiwQIVN.js → chart-kpitext-config-DjvigyfE.js} +2 -2
- package/dist/client/chunks/{chart-kpitext-config-BLiwQIVN.js.map → chart-kpitext-config-DjvigyfE.js.map} +1 -1
- package/dist/client/chunks/chart-linechart-D4r0uD1j.js +198 -0
- package/dist/client/chunks/chart-linechart-D4r0uD1j.js.map +1 -0
- package/dist/client/chunks/{chart-linechart-config-CVbDAvCB.js → chart-linechart-config-DLVS2Zxc.js} +18 -5
- package/dist/client/chunks/chart-linechart-config-DLVS2Zxc.js.map +1 -0
- package/dist/client/chunks/{chart-markdownchart-config-uttA9Th4.js → chart-markdownchart-config-CgOA3YSw.js} +2 -2
- package/dist/client/chunks/{chart-markdownchart-config-uttA9Th4.js.map → chart-markdownchart-config-CgOA3YSw.js.map} +1 -1
- package/dist/client/chunks/{chart-piechart-CZRDQxeB.js → chart-piechart-BhttUWuH.js} +61 -55
- package/dist/client/chunks/chart-piechart-BhttUWuH.js.map +1 -0
- package/dist/client/chunks/{chart-piechart-config-J748ISAR.js → chart-piechart-config-DgwOeKHr.js} +13 -5
- package/dist/client/chunks/{chart-piechart-config-J748ISAR.js.map → chart-piechart-config-DgwOeKHr.js.map} +1 -1
- package/dist/client/chunks/chart-radarchart-DnqlfoGr.js +131 -0
- package/dist/client/chunks/chart-radarchart-DnqlfoGr.js.map +1 -0
- package/dist/client/chunks/{chart-radarchart-config-CU_MwXOg.js → chart-radarchart-config-BAV8D5PR.js} +13 -5
- package/dist/client/chunks/{chart-radarchart-config-CU_MwXOg.js.map → chart-radarchart-config-BAV8D5PR.js.map} +1 -1
- package/dist/client/chunks/chart-radialbarchart-BFxxiqLw.js +120 -0
- package/dist/client/chunks/chart-radialbarchart-BFxxiqLw.js.map +1 -0
- package/dist/client/chunks/{chart-radialbarchart-config-D0eEa2hb.js → chart-radialbarchart-config-CKozBBEC.js} +11 -3
- package/dist/client/chunks/{chart-radialbarchart-config-D0eEa2hb.js.map → chart-radialbarchart-config-CKozBBEC.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-C83KgqYY.js → chart-scatterchart-MN4SM-w7.js} +86 -84
- package/dist/client/chunks/chart-scatterchart-MN4SM-w7.js.map +1 -0
- package/dist/client/chunks/{chart-scatterchart-config-Bh0qBq9F.js → chart-scatterchart-config-UdHmbZ3s.js} +19 -5
- package/dist/client/chunks/{chart-scatterchart-config-Bh0qBq9F.js.map → chart-scatterchart-config-UdHmbZ3s.js.map} +1 -1
- package/dist/client/chunks/chart-treemapchart-Nozh2m26.js +265 -0
- package/dist/client/chunks/chart-treemapchart-Nozh2m26.js.map +1 -0
- package/dist/client/chunks/{chart-treemapchart-config-Bl0wYGhB.js → chart-treemapchart-config-D17VOwTM.js} +13 -5
- package/dist/client/chunks/{chart-treemapchart-config-Bl0wYGhB.js.map → chart-treemapchart-config-D17VOwTM.js.map} +1 -1
- package/dist/client/chunks/{charts-BUq4jszb.js → charts-BSDHSv4l.js} +42 -42
- package/dist/client/chunks/charts-BSDHSv4l.js.map +1 -0
- package/dist/client/chunks/components-CbDovlG-.js +13923 -0
- package/dist/client/chunks/components-CbDovlG-.js.map +1 -0
- package/dist/client/chunks/{index-CSeLP8gq.js → index-th92_8oL.js} +2 -2
- package/dist/client/chunks/{index-CSeLP8gq.js.map → index-th92_8oL.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisAIPanel.d.ts +25 -0
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +3 -1
- package/dist/client/components/AnalysisBuilder/AnalysisChartConfigPanel.d.ts +2 -5
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +9 -0
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +17 -0
- package/dist/client/components/AnalysisBuilder/types.d.ts +49 -1
- package/dist/client/components/PortletAnalysisModal.d.ts +25 -0
- package/dist/client/components/charts/AxisFormatControls.d.ts +35 -0
- package/dist/client/components.js +3 -3
- package/dist/client/hooks.js +10 -10
- package/dist/client/icons.js +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +51 -3466
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers/CubeProvider.d.ts +1 -1
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +13 -0
- package/dist/client/utils/chartUtils.d.ts +20 -0
- package/dist/client/utils/pivotUtils.d.ts +11 -1
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +2 -1
- package/dist/client/chunks/chart-activitygridchart-Cz4bEf3V.js.map +0 -1
- package/dist/client/chunks/chart-areachart-DLdolSnU.js +0 -204
- package/dist/client/chunks/chart-areachart-DLdolSnU.js.map +0 -1
- package/dist/client/chunks/chart-areachart-config-C2iwLEgm.js.map +0 -1
- package/dist/client/chunks/chart-barchart-Bdjz8DJp.js +0 -171
- package/dist/client/chunks/chart-barchart-Bdjz8DJp.js.map +0 -1
- package/dist/client/chunks/chart-barchart-config-CAsUZfHw.js.map +0 -1
- package/dist/client/chunks/chart-bubblechart-BlQkmqkI.js +0 -210
- package/dist/client/chunks/chart-bubblechart-BlQkmqkI.js.map +0 -1
- package/dist/client/chunks/chart-datatable-zyVFtRJ_.js +0 -249
- package/dist/client/chunks/chart-datatable-zyVFtRJ_.js.map +0 -1
- package/dist/client/chunks/chart-linechart-BfnU6L-D.js +0 -155
- package/dist/client/chunks/chart-linechart-BfnU6L-D.js.map +0 -1
- package/dist/client/chunks/chart-linechart-config-CVbDAvCB.js.map +0 -1
- package/dist/client/chunks/chart-piechart-CZRDQxeB.js.map +0 -1
- package/dist/client/chunks/chart-radarchart-D5yRnY9j.js +0 -124
- package/dist/client/chunks/chart-radarchart-D5yRnY9j.js.map +0 -1
- package/dist/client/chunks/chart-radialbarchart-Djtcn7aH.js +0 -109
- package/dist/client/chunks/chart-radialbarchart-Djtcn7aH.js.map +0 -1
- package/dist/client/chunks/chart-scatterchart-C83KgqYY.js.map +0 -1
- package/dist/client/chunks/chart-treemapchart-BDKnKGTz.js +0 -253
- package/dist/client/chunks/chart-treemapchart-BDKnKGTz.js.map +0 -1
- package/dist/client/chunks/charts-BUq4jszb.js.map +0 -1
- package/dist/client/chunks/components-DnhfrXo3.js +0 -9846
- package/dist/client/chunks/components-DnhfrXo3.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { jsx as y, jsxs as ee } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as ce, useState as C, useEffect as te, useLayoutEffect as be } from "react";
|
|
3
|
+
import { u as Ae, g as Fe, w as we, s as D, b as Se, c as de, i as ve, p as ue, C as me, l as xe, e as ye, d as ze, m as Te, q as $e, h as fe, o as pe, a as se, j as he, k as ge, f as T } from "./chart-activitygridchart-D17Fxiuf.js";
|
|
4
|
+
function Re({
|
|
5
|
+
data: $,
|
|
6
|
+
chartConfig: r,
|
|
7
|
+
displayConfig: p = {},
|
|
8
|
+
queryObject: H,
|
|
9
|
+
height: q = "100%",
|
|
10
|
+
colorPalette: L
|
|
11
|
+
}) {
|
|
12
|
+
const U = ce(null), A = ce(null), [, re] = C(null), [N, E] = C({ width: 0, height: 0 }), [k, W] = C(!1), [le, ie] = C("light"), { getFieldLabel: F } = Ae();
|
|
13
|
+
te(() => (ie(Fe()), we((o) => {
|
|
14
|
+
ie(o);
|
|
15
|
+
})), []);
|
|
16
|
+
const s = {
|
|
17
|
+
showLegend: p?.showLegend ?? !0,
|
|
18
|
+
showGrid: p?.showGrid ?? !0,
|
|
19
|
+
showTooltip: p?.showTooltip ?? !0,
|
|
20
|
+
minBubbleSize: p?.minBubbleSize ?? 5,
|
|
21
|
+
maxBubbleSize: p?.maxBubbleSize ?? 50,
|
|
22
|
+
bubbleOpacity: p?.bubbleOpacity ?? 0.7,
|
|
23
|
+
xAxisFormat: p?.xAxisFormat,
|
|
24
|
+
leftYAxisFormat: p?.leftYAxisFormat
|
|
25
|
+
};
|
|
26
|
+
return be(() => {
|
|
27
|
+
let i = 0;
|
|
28
|
+
const o = 10;
|
|
29
|
+
let d, u;
|
|
30
|
+
const a = () => {
|
|
31
|
+
if (A.current) {
|
|
32
|
+
const { width: h, height: n } = A.current.getBoundingClientRect();
|
|
33
|
+
if (h > 0 && n > 0)
|
|
34
|
+
return E({ width: h, height: n }), W(!0), !0;
|
|
35
|
+
}
|
|
36
|
+
return !1;
|
|
37
|
+
};
|
|
38
|
+
if (!a() && i < o) {
|
|
39
|
+
const h = () => {
|
|
40
|
+
!a() && i < o && (i++, u = setTimeout(() => {
|
|
41
|
+
d = requestAnimationFrame(h);
|
|
42
|
+
}, 50 * i));
|
|
43
|
+
};
|
|
44
|
+
d = requestAnimationFrame(h);
|
|
45
|
+
}
|
|
46
|
+
return () => {
|
|
47
|
+
d && cancelAnimationFrame(d), u && clearTimeout(u);
|
|
48
|
+
};
|
|
49
|
+
}, []), te(() => {
|
|
50
|
+
let i = null;
|
|
51
|
+
const o = () => {
|
|
52
|
+
if (A.current) {
|
|
53
|
+
const { width: d, height: u } = A.current.getBoundingClientRect();
|
|
54
|
+
d > 0 && u > 0 && (E({ width: d, height: u }), k || W(!0));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return A.current && (i = new ResizeObserver((d) => {
|
|
58
|
+
for (const u of d) {
|
|
59
|
+
const { width: a, height: w } = u.contentRect;
|
|
60
|
+
a > 0 && w > 0 && (E({ width: a, height: w }), k || W(!0));
|
|
61
|
+
}
|
|
62
|
+
}), i.observe(A.current), o()), window.addEventListener("resize", o), () => {
|
|
63
|
+
i && i.disconnect(), window.removeEventListener("resize", o);
|
|
64
|
+
};
|
|
65
|
+
}, [k]), te(() => {
|
|
66
|
+
if (!$ || $.length === 0 || !U.current || !k || N.width === 0 || (D(U.current).selectAll("*").remove(), !r?.xAxis || !r?.yAxis || !r?.series))
|
|
67
|
+
return;
|
|
68
|
+
const i = Array.isArray(r.xAxis) ? r.xAxis[0] : r.xAxis, o = Array.isArray(r.yAxis) ? r.yAxis[0] : r.yAxis, d = Array.isArray(r.series) ? r.series[0] : r.series, u = Array.isArray(r.sizeField) ? r.sizeField[0] : r.sizeField || o, a = Array.isArray(r.colorField) ? r.colorField[0] : r.colorField;
|
|
69
|
+
if (!i || !o || !d || !u)
|
|
70
|
+
return;
|
|
71
|
+
const w = Se(H, i), h = H?.timeDimensions?.some(
|
|
72
|
+
(e) => e.dimension === i
|
|
73
|
+
) || !1, n = $.map((e) => {
|
|
74
|
+
const t = e[i];
|
|
75
|
+
let l, m;
|
|
76
|
+
if (h && t) {
|
|
77
|
+
const c = String(t);
|
|
78
|
+
let f;
|
|
79
|
+
if (c.match(/^\d{4}-\d{2}-\d{2}[T ]/)) {
|
|
80
|
+
let b = c;
|
|
81
|
+
c.includes(" ") && (b = c.replace(" ", "T").replace("+00", "Z").replace(/\+\d{2}:\d{2}$/, "Z")), !b.endsWith("Z") && !b.includes("+") && (b = b + "Z"), f = new Date(b);
|
|
82
|
+
} else
|
|
83
|
+
f = new Date(c);
|
|
84
|
+
l = isNaN(f.getTime()) ? parseFloat(c) : f.getTime(), m = de(t, w);
|
|
85
|
+
} else {
|
|
86
|
+
const c = de(t, w) || t;
|
|
87
|
+
l = typeof c == "string" ? parseFloat(c) : c, m = String(c);
|
|
88
|
+
}
|
|
89
|
+
const x = ue(e[o]), z = ue(e[u]), R = e[d];
|
|
90
|
+
return {
|
|
91
|
+
x: l,
|
|
92
|
+
xLabel: m,
|
|
93
|
+
// Store formatted label for tooltip display
|
|
94
|
+
y: x,
|
|
95
|
+
// Type assertion: filter below ensures this is never null
|
|
96
|
+
size: z !== null ? Math.abs(z) : 0,
|
|
97
|
+
// Ensure positive size
|
|
98
|
+
color: a ? e[a] : R,
|
|
99
|
+
series: R,
|
|
100
|
+
label: `${R || "Unknown"}`,
|
|
101
|
+
isValid: ve(l) && x !== null && z !== null && z > 0
|
|
102
|
+
};
|
|
103
|
+
}).filter((e) => e.isValid && e.size > 0);
|
|
104
|
+
if (n.length === 0) return;
|
|
105
|
+
const V = {
|
|
106
|
+
...me,
|
|
107
|
+
left: me.left + 30,
|
|
108
|
+
// Add extra 30px left margin for Y-axis label
|
|
109
|
+
bottom: s.showLegend && a ? 100 : 40
|
|
110
|
+
// Add extra space for legend
|
|
111
|
+
}, B = N.width - V.left - V.right, S = N.height - V.top - V.bottom, ae = D(U.current).attr("width", N.width).attr("height", N.height), v = ae.append("g").attr("transform", `translate(${V.left},${V.top})`), _ = xe().domain(ye(n, (e) => e.x)).range([0, B]).nice(), I = xe().domain(ye(n, (e) => e.y)).range([S, 0]).nice(), j = ze().domain([0, Te(n, (e) => e.size)]).range([s.minBubbleSize, s.maxBubbleSize]);
|
|
112
|
+
let Y, G = !1, Z = [];
|
|
113
|
+
if (a && n.length > 0) {
|
|
114
|
+
const e = n.map((t) => {
|
|
115
|
+
const l = t.color;
|
|
116
|
+
return typeof l == "string" ? parseFloat(l) : l;
|
|
117
|
+
}).filter((t) => !isNaN(t));
|
|
118
|
+
if (G = e.length === n.length && e.every((t) => typeof t == "number"), G) {
|
|
119
|
+
const t = Math.min(...e), l = Math.max(...e);
|
|
120
|
+
Y = $e().domain([t, l]).range(L?.gradient || fe);
|
|
121
|
+
} else
|
|
122
|
+
Z = [...new Set(n.map((t) => String(t.color)))], Y = pe().domain(Z).range(L?.colors || se);
|
|
123
|
+
} else
|
|
124
|
+
Y = pe().domain(["default"]).range([se[0]]);
|
|
125
|
+
const X = (e, t) => getComputedStyle(document.documentElement).getPropertyValue(e).trim() || t, ne = le !== "light", g = ne ? X("--dc-text-muted", "#cbd5e1") : X("--dc-text-secondary", "#374151"), M = ne ? X("--dc-border", "#475569") : "#9ca3af";
|
|
126
|
+
if (s.showGrid) {
|
|
127
|
+
const e = v.append("g").attr("class", "grid").attr("transform", `translate(0,${S})`).call(
|
|
128
|
+
he(_).tickSize(-S).tickFormat(() => "")
|
|
129
|
+
);
|
|
130
|
+
e.selectAll("line").style("stroke", M).style("stroke-dasharray", "3,3").style("opacity", 0.3), e.select(".domain").style("stroke", "none");
|
|
131
|
+
const t = v.append("g").attr("class", "grid").call(
|
|
132
|
+
ge(I).tickSize(-B).tickFormat(() => "")
|
|
133
|
+
);
|
|
134
|
+
t.selectAll("line").style("stroke", M).style("stroke-dasharray", "3,3").style("opacity", 0.3), t.select(".domain").style("stroke", "none");
|
|
135
|
+
}
|
|
136
|
+
const Q = he(_);
|
|
137
|
+
h ? Q.tickFormat((e) => {
|
|
138
|
+
const t = new Date(e);
|
|
139
|
+
if (isNaN(t.getTime())) return String(e);
|
|
140
|
+
switch (w?.toLowerCase()) {
|
|
141
|
+
case "year":
|
|
142
|
+
return String(t.getUTCFullYear());
|
|
143
|
+
case "quarter": {
|
|
144
|
+
const l = Math.floor(t.getUTCMonth() / 3) + 1;
|
|
145
|
+
return `${t.getUTCFullYear()}-Q${l}`;
|
|
146
|
+
}
|
|
147
|
+
case "month":
|
|
148
|
+
return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
149
|
+
case "week":
|
|
150
|
+
case "day":
|
|
151
|
+
return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}-${String(t.getUTCDate()).padStart(2, "0")}`;
|
|
152
|
+
case "hour":
|
|
153
|
+
return `${String(t.getUTCMonth() + 1).padStart(2, "0")}-${String(t.getUTCDate()).padStart(2, "0")} ${String(t.getUTCHours()).padStart(2, "0")}:00`;
|
|
154
|
+
default:
|
|
155
|
+
return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
156
|
+
}
|
|
157
|
+
}) : s.xAxisFormat && Q.tickFormat((e) => T(e, s.xAxisFormat));
|
|
158
|
+
const J = v.append("g").attr("transform", `translate(0,${S})`).call(Q);
|
|
159
|
+
J.selectAll("text").style("fill", g), J.selectAll("line, path").style("stroke", M), J.append("text").attr("x", B / 2).attr("y", 35).attr("fill", g).style("text-anchor", "middle").style("font-size", "12px").text(s.xAxisFormat?.label || F(i));
|
|
160
|
+
const oe = ge(I);
|
|
161
|
+
s.leftYAxisFormat && oe.tickFormat((e) => T(e, s.leftYAxisFormat));
|
|
162
|
+
const K = v.append("g").call(oe);
|
|
163
|
+
K.selectAll("text").style("fill", g), K.selectAll("line, path").style("stroke", M), K.append("text").attr("transform", "rotate(-90)").attr("y", -35).attr("x", -S / 2).attr("fill", g).style("text-anchor", "middle").style("font-size", "12px").text(s.leftYAxisFormat?.label || F(o));
|
|
164
|
+
const O = D("body").append("div").attr("class", "bubble-chart-tooltip").style("position", "absolute").style("padding", "8px").style("background", "rgba(0, 0, 0, 0.8)").style("color", "white").style("border-radius", "4px").style("font-size", "12px").style("pointer-events", "none").style("opacity", 0).style("z-index", 1e3), P = v.selectAll(".bubble").data(n).enter().append("circle").attr("class", "bubble").attr("cx", (e) => _(e.x)).attr("cy", (e) => I(e.y)).attr("r", (e) => j(e.size)).style("fill", (e) => a && e.color !== void 0 ? Y(G ? e.color : String(e.color)) : se[0]).style("opacity", s.bubbleOpacity).style("stroke", "#fff").style("stroke-width", 1).style("cursor", "pointer");
|
|
165
|
+
if (s.showTooltip && P.on("mouseover", function(e, t) {
|
|
166
|
+
D(this).transition().duration(200).style("opacity", 1).attr("r", j(t.size) * 1.1);
|
|
167
|
+
const l = [
|
|
168
|
+
`<strong>${t.series || "Unknown"}</strong>`,
|
|
169
|
+
`${F(i)}: ${t.xLabel || (s.xAxisFormat ? T(t.x, s.xAxisFormat) : t.x)}`,
|
|
170
|
+
`${F(o)}: ${s.leftYAxisFormat ? T(t.y, s.leftYAxisFormat) : t.y}`,
|
|
171
|
+
`${F(u)}: ${s.leftYAxisFormat ? T(t.size, s.leftYAxisFormat) : t.size}`,
|
|
172
|
+
a && t.color ? `${F(a)}: ${t.color}` : ""
|
|
173
|
+
].filter(Boolean).join("<br>");
|
|
174
|
+
O.html(l).style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px").transition().duration(200).style("opacity", 1), re(t.label);
|
|
175
|
+
}).on("mousemove", function(e) {
|
|
176
|
+
O.style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px");
|
|
177
|
+
}).on("mouseout", function(e, t) {
|
|
178
|
+
D(this).transition().duration(200).style("opacity", s.bubbleOpacity).attr("r", j(t.size)), O.transition().duration(200).style("opacity", 0), re(null);
|
|
179
|
+
}), s.showLegend && a)
|
|
180
|
+
if (G) {
|
|
181
|
+
const l = Math.min(...n.map((f) => f.color)), m = Math.max(...n.map((f) => f.color)), x = v.append("g").attr("class", "color-legend").attr("transform", `translate(${B / 2 - 200 / 2}, ${S + 60})`), R = ae.append("defs").append("linearGradient").attr("id", "color-scale-gradient").attr("x1", "0%").attr("y1", "0%").attr("x2", "100%").attr("y2", "0%"), c = L?.gradient || fe;
|
|
182
|
+
c.forEach((f, b) => {
|
|
183
|
+
R.append("stop").attr("offset", `${b / (c.length - 1) * 100}%`).attr("stop-color", f);
|
|
184
|
+
}), x.append("rect").attr("width", 200).attr("height", 20).style("fill", "url(#color-scale-gradient)").style("stroke", "#ccc").style("stroke-width", 1), x.append("text").attr("x", 0).attr("y", 35).attr("text-anchor", "start").style("font-size", "11px").style("fill", g).text(s.leftYAxisFormat ? T(l, s.leftYAxisFormat) : l.toFixed(2)), x.append("text").attr("x", 200).attr("y", 35).attr("text-anchor", "end").style("font-size", "11px").style("fill", g).text(s.leftYAxisFormat ? T(m, s.leftYAxisFormat) : m.toFixed(2)), x.append("text").attr("x", 200 / 2).attr("y", -5).attr("text-anchor", "middle").style("font-size", "12px").style("font-weight", "bold").style("fill", g).text(F(a));
|
|
185
|
+
} else {
|
|
186
|
+
const e = Z;
|
|
187
|
+
if (e.length > 0) {
|
|
188
|
+
const l = v.append("g").attr("class", "legend").attr("transform", `translate(${B / 2 - e.length * 80 / 2}, ${S + 60})`).selectAll(".legend-item").data(e).enter().append("g").attr("class", "legend-item").attr("transform", (m, x) => `translate(${x * 80}, 0)`).style("cursor", "pointer");
|
|
189
|
+
l.append("circle").attr("cx", 5).attr("cy", 5).attr("r", 5).style("fill", (m) => Y(m)).style("opacity", s.bubbleOpacity), l.append("text").attr("x", 15).attr("y", 5).attr("dy", ".35em").style("font-size", "11px").style("fill", g).text((m) => String(m)), l.on("mouseover", function(m, x) {
|
|
190
|
+
P.transition().duration(200).style("opacity", (z) => a && String(z.color) === x ? 1 : 0.2);
|
|
191
|
+
}).on("mouseout", function() {
|
|
192
|
+
P.transition().duration(200).style("opacity", s.bubbleOpacity);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return () => {
|
|
197
|
+
O.remove();
|
|
198
|
+
};
|
|
199
|
+
}, [$, r, p, H, N, k, s.showLegend, s.showGrid, s.showTooltip, s.minBubbleSize, s.maxBubbleSize, s.bubbleOpacity, L, le]), !$ || $.length === 0 ? /* @__PURE__ */ y("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: q }, children: /* @__PURE__ */ ee("div", { className: "text-center", children: [
|
|
200
|
+
/* @__PURE__ */ y("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
|
|
201
|
+
/* @__PURE__ */ y("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display in bubble chart" })
|
|
202
|
+
] }) }) : r?.xAxis && r?.yAxis && r?.series ? /* @__PURE__ */ y("div", { className: "w-full flex-1 flex flex-col relative", style: { height: q, minHeight: "250px", overflow: "hidden" }, children: /* @__PURE__ */ ee("div", { ref: A, className: "w-full h-full relative", children: [
|
|
203
|
+
/* @__PURE__ */ y("svg", { ref: U, className: "w-full h-full" }),
|
|
204
|
+
!k && /* @__PURE__ */ y("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ y("div", { className: "text-dc-text-muted text-sm", children: "Measuring chart dimensions..." }) })
|
|
205
|
+
] }) }) : /* @__PURE__ */ y("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: q }, children: /* @__PURE__ */ ee("div", { className: "text-center", children: [
|
|
206
|
+
/* @__PURE__ */ y("div", { className: "text-sm font-semibold mb-1", children: "Configuration Required" }),
|
|
207
|
+
/* @__PURE__ */ y("div", { className: "text-xs", children: "Bubble chart requires xAxis, yAxis, series, and sizeField dimensions" }),
|
|
208
|
+
/* @__PURE__ */ y("div", { className: "text-xs mt-1", children: "Optional: colorField for bubble coloring" })
|
|
209
|
+
] }) });
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
Re as default
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=chart-bubblechart-CivK_yfh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-bubblechart-CivK_yfh.js","sources":["../../../src/client/components/charts/BubbleChart.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, type ScaleOrdinal, type ScaleQuantize } from 'd3'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport { getTheme, watchThemeChanges, type Theme } from '../../theme'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n xLabel?: string // Formatted label for time dimensions\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nexport default function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [, setHoveredBubble] = useState<string | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const [currentTheme, setCurrentTheme] = useState<Theme>('light')\n const { getFieldLabel } = useCubeContext()\n\n // Watch for theme changes\n useEffect(() => {\n setCurrentTheme(getTheme())\n const unwatch = watchThemeChanges((theme) => {\n setCurrentTheme(theme)\n })\n return unwatch\n }, [])\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7,\n xAxisFormat: displayConfig?.xAxisFormat,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: NodeJS.Timeout\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n return\n }\n\n // Transform data for bubble chart\n // Null handling: Filter out bubbles where x, y, or size are null\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n\n // Check if x-axis field is a time dimension\n const isTimeDimension = queryObject?.timeDimensions?.some(\n (td: { dimension: string }) => td.dimension === xAxisField\n ) || false\n\n const bubbleData: BubbleData[] = data\n .map(item => {\n const rawXValue = item[xAxisField]\n let xNum: number\n let xLabel: string\n\n if (isTimeDimension && rawXValue) {\n // For time dimensions, convert to timestamp for proper numeric positioning\n const dateStr = String(rawXValue)\n // Try to parse as date - handle ISO format and PostgreSQL format\n let date: Date\n if (dateStr.match(/^\\d{4}-\\d{2}-\\d{2}[T ]/)) {\n // Full timestamp format\n let isoStr = dateStr\n if (dateStr.includes(' ')) {\n isoStr = dateStr.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateStr)\n }\n\n xNum = isNaN(date.getTime()) ? parseFloat(dateStr) : date.getTime()\n xLabel = formatTimeValue(rawXValue, xGranularity)\n } else {\n // Non-time value - use as-is\n const formattedValue = formatTimeValue(rawXValue, xGranularity) || rawXValue\n xNum = typeof formattedValue === 'string' ? parseFloat(formattedValue) : formattedValue\n xLabel = String(formattedValue)\n }\n\n const yValue = parseNumericValue(item[yAxisField])\n const sizeValue = parseNumericValue(item[sizeFieldName])\n const seriesValue = item[seriesField]\n\n return {\n x: xNum,\n xLabel, // Store formatted label for tooltip display\n y: yValue as number, // Type assertion: filter below ensures this is never null\n size: sizeValue !== null ? Math.abs(sizeValue) : 0, // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`,\n isValid: isValidNumericValue(xNum) && yValue !== null && sizeValue !== null && sizeValue > 0\n }\n })\n .filter(d => d.isValid && d.size > 0) // Filter out bubbles with invalid coordinates or no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use series colors\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(colorPalette?.colors || CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = currentTheme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const gridColor = isDark\n ? getThemeColor('--dc-border', '#475569') // Lighter grid for dark mode\n : '#9ca3af' // Much darker gray for light mode visibility\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n const xGrid = g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n\n xGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n xGrid.select('.domain')\n .style('stroke', 'none')\n\n // Y-axis grid\n const yGrid = g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n\n yGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n yGrid.select('.domain')\n .style('stroke', 'none')\n }\n\n // Add X axis with proper time formatting if needed\n const xAxisGenerator = axisBottom(xScale)\n\n // If it's a time dimension, format the tick labels\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => {\n const date = new Date(d as number)\n if (isNaN(date.getTime())) return String(d)\n\n // Format based on granularity\n switch (xGranularity?.toLowerCase()) {\n case 'year':\n return String(date.getUTCFullYear())\n case 'quarter': {\n const q = Math.floor(date.getUTCMonth() / 3) + 1\n return `${date.getUTCFullYear()}-Q${q}`\n }\n case 'month':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n case 'week':\n case 'day':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`\n case 'hour':\n return `${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n }\n })\n } else if (safeDisplayConfig.xAxisFormat) {\n // Apply custom formatting for non-time X-axis\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.xAxisFormat))\n }\n\n const xAxis = g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxisGenerator)\n\n xAxis.selectAll('text')\n .style('fill', textColor)\n\n xAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n xAxis.append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.xAxisFormat?.label || getFieldLabel(xAxisField))\n\n // Add Y axis with optional formatting\n const yAxisGenerator = axisLeft(yScale)\n if (safeDisplayConfig.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.leftYAxisFormat))\n }\n const yAxis = g.append('g')\n .call(yAxisGenerator)\n\n yAxis.selectAll('text')\n .style('fill', textColor)\n\n yAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n yAxis.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.leftYAxisFormat?.label || getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.xLabel || (safeDisplayConfig.xAxisFormat ? formatAxisValue(d.x, safeDisplayConfig.xAxisFormat) : d.x)}`,\n `${getFieldLabel(yAxisField)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.y, safeDisplayConfig.leftYAxisFormat) : d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.size, safeDisplayConfig.leftYAxisFormat) : d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n\n setHoveredBubble(d.label)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n\n setHoveredBubble(null)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(minValue, safeDisplayConfig.leftYAxisFormat) : minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(maxValue, safeDisplayConfig.leftYAxisFormat) : maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, displayConfig, queryObject, dimensions, dimensionsReady, safeDisplayConfig.showLegend, safeDisplayConfig.showGrid, safeDisplayConfig.showTooltip, safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize, safeDisplayConfig.bubbleOpacity, colorPalette, currentTheme])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full flex-1 flex flex-col relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-dc-text-muted text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n}"],"names":["BubbleChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","svgRef","useRef","containerRef","setHoveredBubble","useState","dimensions","setDimensions","dimensionsReady","setDimensionsReady","currentTheme","setCurrentTheme","getFieldLabel","useCubeContext","useEffect","getTheme","watchThemeChanges","theme","safeDisplayConfig","useLayoutEffect","retryCount","maxRetries","rafId","timeoutId","updateDimensions","width","retryWithRaf","resizeObserver","entries","entry","select","xAxisField","yAxisField","seriesField","sizeFieldName","colorFieldName","xGranularity","getFieldGranularity","isTimeDimension","td","bubbleData","item","rawXValue","xNum","xLabel","dateStr","date","isoStr","formatTimeValue","formattedValue","yValue","parseNumericValue","sizeValue","seriesValue","isValidNumericValue","d","margin","CHART_MARGINS","chartHeight","svg","g","xScale","scaleLinear","extent","yScale","sizeScale","scaleSqrt","max","colorScale","isNumericColorField","uniqueColors","colorValues","value","val","minValue","maxValue","scaleQuantize","CHART_COLORS_GRADIENT","scaleOrdinal","CHART_COLORS","getThemeColor","varName","fallback","isDark","textColor","gridColor","xGrid","axisBottom","yGrid","axisLeft","xAxisGenerator","q","formatAxisValue","xAxis","yAxisGenerator","yAxis","tooltip","bubbles","event","tooltipContent","_event","legend","gradient","gradientColors","color","i","legendItems","legendItem","_d","legendKey","jsx","jsxs"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as e } from "./chart-activitygridchart-config-
|
|
2
|
-
const
|
|
1
|
+
import { g as e } from "./chart-activitygridchart-config-AVBoHdRn.js";
|
|
2
|
+
const a = {
|
|
3
3
|
icon: e("bubble"),
|
|
4
4
|
description: "Compare three dimensions of data",
|
|
5
5
|
useCase: "Best for showing relationships between three variables (X, Y, and size), market analysis",
|
|
@@ -50,9 +50,23 @@ const s = {
|
|
|
50
50
|
emptyText: "Drop a field for bubble color (optional)"
|
|
51
51
|
}
|
|
52
52
|
],
|
|
53
|
-
displayOptions: ["showLegend", "showGrid", "showTooltip", "minBubbleSize", "maxBubbleSize", "bubbleOpacity", "hideHeader"]
|
|
53
|
+
displayOptions: ["showLegend", "showGrid", "showTooltip", "minBubbleSize", "maxBubbleSize", "bubbleOpacity", "hideHeader"],
|
|
54
|
+
displayOptionsConfig: [
|
|
55
|
+
{
|
|
56
|
+
key: "xAxisFormat",
|
|
57
|
+
label: "X-Axis Format",
|
|
58
|
+
type: "axisFormat",
|
|
59
|
+
description: "Number formatting for X-axis"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
key: "leftYAxisFormat",
|
|
63
|
+
label: "Y-Axis Format",
|
|
64
|
+
type: "axisFormat",
|
|
65
|
+
description: "Number formatting for Y-axis and values"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
54
68
|
};
|
|
55
69
|
export {
|
|
56
|
-
|
|
70
|
+
a as bubbleChartConfig
|
|
57
71
|
};
|
|
58
|
-
//# sourceMappingURL=chart-bubblechart-config-
|
|
72
|
+
//# sourceMappingURL=chart-bubblechart-config-yLq2oyR3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-bubblechart-config-
|
|
1
|
+
{"version":3,"file":"chart-bubblechart-config-yLq2oyR3.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 displayOptionsConfig: [\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis and values'\n }\n ]\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;AAAA,EACzH,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
package/dist/client/chunks/{chart-charttooltip-k8soCd2n.js → chart-charttooltip-BVEdz4Q-.js}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import { Tooltip as e } from "recharts";
|
|
3
|
-
import {
|
|
3
|
+
import { n as p } from "./chart-activitygridchart-D17Fxiuf.js";
|
|
4
4
|
const i = (r, o) => r == null ? ["No data", o] : [p(r), o];
|
|
5
|
-
function
|
|
5
|
+
function d({ formatter: r, labelFormatter: o }) {
|
|
6
6
|
return /* @__PURE__ */ t(
|
|
7
7
|
e,
|
|
8
8
|
{
|
|
@@ -21,6 +21,6 @@ function f({ formatter: r, labelFormatter: o }) {
|
|
|
21
21
|
);
|
|
22
22
|
}
|
|
23
23
|
export {
|
|
24
|
-
|
|
24
|
+
d as C
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=chart-charttooltip-
|
|
26
|
+
//# sourceMappingURL=chart-charttooltip-BVEdz4Q-.js.map
|
package/dist/client/chunks/{chart-charttooltip-k8soCd2n.js.map → chart-charttooltip-BVEdz4Q-.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-charttooltip-
|
|
1
|
+
{"version":3,"file":"chart-charttooltip-BVEdz4Q-.js","sources":["../../../src/client/components/charts/ChartTooltip.tsx"],"sourcesContent":["import React from 'react'\nimport { Tooltip } from 'recharts'\nimport { formatNumericValue } from '../../utils/chartUtils'\n\ninterface ChartTooltipProps {\n formatter?: (value: any, name: any, props: any) => [React.ReactText, React.ReactText]\n labelFormatter?: (label: any) => React.ReactText\n}\n\n// Default formatter that rounds numeric values to at most 2 decimal places\nconst defaultFormatter = (value: any, name: any): [React.ReactText, React.ReactText] => {\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n return [formatNumericValue(value), name]\n}\n\nexport default function ChartTooltip({ formatter, labelFormatter }: ChartTooltipProps) {\n return (\n <Tooltip\n formatter={formatter || defaultFormatter}\n labelFormatter={labelFormatter}\n contentStyle={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n padding: '8px 12px'\n }}\n />\n )\n}"],"names":["defaultFormatter","value","name","formatNumericValue","ChartTooltip","formatter","labelFormatter","jsx","Tooltip"],"mappings":";;;AAUA,MAAMA,IAAmB,CAACC,GAAYC,MAChCD,KAAU,OACL,CAAC,WAAWC,CAAI,IAElB,CAACC,EAAmBF,CAAK,GAAGC,CAAI;AAGzC,SAAwBE,EAAa,EAAE,WAAAC,GAAW,gBAAAC,KAAqC;AACrF,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWH,KAAaL;AAAA,MACxB,gBAAAM;AAAA,MACA,cAAc;AAAA,QACZ,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EAAA;AAGN;"}
|