@carto/ps-react-ui 4.6.1 → 4.6.2
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/widgets/actions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as b, jsxs as ne, Fragment as he } from "react/jsx-runtime";
|
|
2
2
|
import { c as U } from "react/compiler-runtime";
|
|
3
|
-
import { IconButton as K, DialogContent as Ae, Dialog as
|
|
3
|
+
import { IconButton as K, DialogContent as Ae, Dialog as We, Typography as Pe, DialogTitle as Be, CircularProgress as Re, MenuItem as xe, ListItemIcon as $e, ListItemText as Ee, Menu as Ce, useTheme as Fe, Box as ke, TextField as Me, InputAdornment as be, SvgIcon as Ge } from "@mui/material";
|
|
4
4
|
import { w as g } from "../widget-store-Bw5zRUGg.js";
|
|
5
5
|
import { u as Q } from "../use-widget-selector-DFl2hW0R.js";
|
|
6
6
|
import { FullscreenOutlined as Ze, Close as Ve, FileDownloadOutlined as He, PercentOutlined as Ne, SubdirectoryArrowLeftOutlined as je, ZoomInOutlined as Ue, CheckBoxOutlined as Ke, SearchOutlined as Le, ClearOutlined as Ye, HighlightAltOutlined as qe } from "@mui/icons-material";
|
|
@@ -38,7 +38,7 @@ function tn(n) {
|
|
|
38
38
|
Icon: m,
|
|
39
39
|
IconButtonProps: S,
|
|
40
40
|
DialogContentProps: _,
|
|
41
|
-
DialogProps:
|
|
41
|
+
DialogProps: T
|
|
42
42
|
} = n, o = _ === void 0 ? ut : _;
|
|
43
43
|
let l, r;
|
|
44
44
|
e[0] !== o ? ({
|
|
@@ -50,9 +50,9 @@ function tn(n) {
|
|
|
50
50
|
title: a
|
|
51
51
|
} = Q(t, ft);
|
|
52
52
|
let u;
|
|
53
|
-
e[3] !== t ? (u = (
|
|
53
|
+
e[3] !== t ? (u = (W) => {
|
|
54
54
|
g.setWidget(t, {
|
|
55
|
-
isFullScreen:
|
|
55
|
+
isFullScreen: W.isFullScreen
|
|
56
56
|
});
|
|
57
57
|
}, e[3] = t, e[4] = u) : u = e[4];
|
|
58
58
|
const i = u;
|
|
@@ -71,7 +71,7 @@ function tn(n) {
|
|
|
71
71
|
}), e[13] = i, e[14] = k) : k = e[14];
|
|
72
72
|
const A = `fullscreen-dialog-title-${t}`;
|
|
73
73
|
let w;
|
|
74
|
-
e[15] !== a ? (w = /* @__PURE__ */ b(
|
|
74
|
+
e[15] !== a ? (w = /* @__PURE__ */ b(Pe, { variant: "subtitle1", component: "span", children: a }), e[15] = a, e[16] = w) : w = e[16];
|
|
75
75
|
let D;
|
|
76
76
|
e[17] !== i ? (D = () => i({
|
|
77
77
|
isFullScreen: !1
|
|
@@ -85,18 +85,18 @@ function tn(n) {
|
|
|
85
85
|
w,
|
|
86
86
|
E
|
|
87
87
|
] }), e[22] = A, e[23] = w, e[24] = E, e[25] = z) : z = e[25];
|
|
88
|
-
let
|
|
89
|
-
e[26] !== r ? (
|
|
88
|
+
let y;
|
|
89
|
+
e[26] !== r ? (y = {
|
|
90
90
|
...ve.content,
|
|
91
91
|
...r
|
|
92
|
-
}, e[26] = r, e[27] =
|
|
92
|
+
}, e[26] = r, e[27] = y) : y = e[27];
|
|
93
93
|
let h;
|
|
94
|
-
e[28] !== l || e[29] !== p || e[30] !==
|
|
94
|
+
e[28] !== l || e[29] !== p || e[30] !== y ? (h = /* @__PURE__ */ b(Ae, { sx: y, ...l, children: p }), e[28] = l, e[29] = p, e[30] = y, e[31] = h) : h = e[31];
|
|
95
95
|
let I;
|
|
96
|
-
e[32] !==
|
|
96
|
+
e[32] !== T || e[33] !== z || e[34] !== h || e[35] !== O || e[36] !== C || e[37] !== k ? (I = /* @__PURE__ */ ne(We, { maxWidth: !1, open: O, keepMounted: !0, "aria-labelledby": C, ...T, onClose: k, children: [
|
|
97
97
|
z,
|
|
98
98
|
h
|
|
99
|
-
] }), e[32] =
|
|
99
|
+
] }), e[32] = T, e[33] = z, e[34] = h, e[35] = O, e[36] = C, e[37] = k, e[38] = I) : I = e[38];
|
|
100
100
|
let L;
|
|
101
101
|
return e[39] !== I || e[40] !== v ? (L = /* @__PURE__ */ ne(he, { children: [
|
|
102
102
|
v,
|
|
@@ -118,29 +118,29 @@ function nn(n) {
|
|
|
118
118
|
Icon: m,
|
|
119
119
|
IconButtonProps: S
|
|
120
120
|
} = n, _ = p === void 0 ? mt : p, {
|
|
121
|
-
data:
|
|
121
|
+
data: T
|
|
122
122
|
} = Q(t, gt), [o, l] = ge(!1), [r, s] = ge(null);
|
|
123
123
|
let a;
|
|
124
|
-
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (a = (
|
|
125
|
-
|
|
124
|
+
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (a = (W) => {
|
|
125
|
+
W.stopPropagation(), s(W.currentTarget);
|
|
126
126
|
}, e[0] = a) : a = e[0];
|
|
127
127
|
const u = a;
|
|
128
128
|
let i;
|
|
129
|
-
e[1] !== t ? (i = (
|
|
129
|
+
e[1] !== t ? (i = (W, P) => {
|
|
130
130
|
const B = document.createElement("a");
|
|
131
|
-
B.href =
|
|
131
|
+
B.href = W, B.download = P.filename ?? t, B.style.display = "none", document.body.appendChild(B), B.click(), document.body.removeChild(B), P.callback?.(B.href);
|
|
132
132
|
}, e[1] = t, e[2] = i) : i = e[2];
|
|
133
133
|
const c = i;
|
|
134
134
|
let d;
|
|
135
|
-
e[3] !==
|
|
136
|
-
|
|
137
|
-
const B = await
|
|
135
|
+
e[3] !== T || e[4] !== c ? (d = async (W, P) => {
|
|
136
|
+
W.stopPropagation(), l(!0), s(null);
|
|
137
|
+
const B = await P.modifier(T);
|
|
138
138
|
if (!B) {
|
|
139
139
|
l(!1);
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
142
|
-
c(B,
|
|
143
|
-
}, e[3] =
|
|
142
|
+
c(B, P), l(!1);
|
|
143
|
+
}, e[3] = T, e[4] = c, e[5] = d) : d = e[5];
|
|
144
144
|
const v = d, O = _.ariaLabel ?? "download options", C = o || f.length === 0, k = o || r ? "active" : "";
|
|
145
145
|
let A;
|
|
146
146
|
e[6] !== m || e[7] !== o ? (A = o ? /* @__PURE__ */ b(Re, { size: 18, color: "inherit" }) : m ?? /* @__PURE__ */ b(He, {}), e[6] = m, e[7] = o, e[8] = A) : A = e[8];
|
|
@@ -155,27 +155,27 @@ function nn(n) {
|
|
|
155
155
|
horizontal: "right"
|
|
156
156
|
}, e[15] = D, e[16] = x) : (D = e[15], x = e[16]);
|
|
157
157
|
const E = !!r;
|
|
158
|
-
let z,
|
|
159
|
-
e[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (z = () => s(null),
|
|
158
|
+
let z, y;
|
|
159
|
+
e[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (z = () => s(null), y = {
|
|
160
160
|
sx: {
|
|
161
161
|
paddingBottom: 0
|
|
162
162
|
}
|
|
163
|
-
}, e[17] = z, e[18] =
|
|
163
|
+
}, e[17] = z, e[18] = y) : (z = e[17], y = e[18]);
|
|
164
164
|
let h;
|
|
165
165
|
if (e[19] !== v || e[20] !== f) {
|
|
166
|
-
let
|
|
167
|
-
e[22] !== v ? (
|
|
168
|
-
v(B,
|
|
166
|
+
let W;
|
|
167
|
+
e[22] !== v ? (W = (P) => /* @__PURE__ */ ne(xe, { disabled: P.disabled, onClick: (B) => {
|
|
168
|
+
v(B, P);
|
|
169
169
|
}, children: [
|
|
170
|
-
|
|
170
|
+
P.icon && /* @__PURE__ */ b($e, { sx: {
|
|
171
171
|
color: "text.primary"
|
|
172
|
-
}, children:
|
|
173
|
-
/* @__PURE__ */ b(Ee, { children:
|
|
174
|
-
] },
|
|
172
|
+
}, children: P.icon }),
|
|
173
|
+
/* @__PURE__ */ b(Ee, { children: P.label })
|
|
174
|
+
] }, P.id), e[22] = v, e[23] = W) : W = e[23], h = f.map(W), e[19] = v, e[20] = f, e[21] = h;
|
|
175
175
|
} else
|
|
176
176
|
h = e[21];
|
|
177
177
|
let I;
|
|
178
|
-
e[24] !== r || e[25] !== E || e[26] !== h ? (I = /* @__PURE__ */ b(Ce, { variant: "menu", elevation: 8, anchorOrigin: D, transformOrigin: x, anchorEl: r, open: E, onClose: z, MenuListProps:
|
|
178
|
+
e[24] !== r || e[25] !== E || e[26] !== h ? (I = /* @__PURE__ */ b(Ce, { variant: "menu", elevation: 8, anchorOrigin: D, transformOrigin: x, anchorEl: r, open: E, onClose: z, MenuListProps: y, children: h }), e[24] = r, e[25] = E, e[26] = h, e[27] = I) : I = e[27];
|
|
179
179
|
let L;
|
|
180
180
|
return e[28] !== I || e[29] !== w ? (L = /* @__PURE__ */ ne(he, { children: [
|
|
181
181
|
w,
|
|
@@ -227,49 +227,54 @@ function on(n) {
|
|
|
227
227
|
labels: m,
|
|
228
228
|
Icon: S,
|
|
229
229
|
IconButtonProps: _
|
|
230
|
-
} = n,
|
|
230
|
+
} = n, T = f === void 0 ? 10 : f, o = p === void 0 ? !1 : p, l = le(void 0);
|
|
231
231
|
let r;
|
|
232
|
-
e[0] !== o ? (r = (
|
|
233
|
-
isRelative:
|
|
232
|
+
e[0] !== o ? (r = (y) => ({
|
|
233
|
+
isRelative: y?.isRelative ?? o
|
|
234
234
|
}), e[0] = o, e[1] = r) : r = e[1];
|
|
235
235
|
const {
|
|
236
236
|
isRelative: s
|
|
237
237
|
} = Q(t, r);
|
|
238
238
|
let a, u;
|
|
239
239
|
e[2] !== o || e[3] !== t ? (a = () => {
|
|
240
|
-
|
|
240
|
+
const y = g.getWidget(t);
|
|
241
|
+
y?.isRelative === void 0 && (o ? g.setWidget(t, {
|
|
242
|
+
isRelative: !0,
|
|
243
|
+
originalFormatter: y?.formatter,
|
|
244
|
+
originalMax: y?.max
|
|
245
|
+
}) : g.setWidget(t, {
|
|
241
246
|
isRelative: o
|
|
242
|
-
});
|
|
247
|
+
}));
|
|
243
248
|
}, u = [t, o], e[2] = o, e[3] = t, e[4] = a, e[5] = u) : (a = e[4], u = e[5]), $(a, u);
|
|
244
249
|
let i, c;
|
|
245
|
-
e[6] !== o || e[7] !== t || e[8] !==
|
|
250
|
+
e[6] !== o || e[7] !== t || e[8] !== T ? (i = () => (g.registerTool(t, {
|
|
246
251
|
id: ce,
|
|
247
|
-
order:
|
|
252
|
+
order: T,
|
|
248
253
|
enabled: o,
|
|
249
254
|
fn: pt
|
|
250
|
-
}), () => g.unregisterTool(t, ce)), c = [t,
|
|
255
|
+
}), () => g.unregisterTool(t, ce)), c = [t, T, o], e[6] = o, e[7] = t, e[8] = T, e[9] = i, e[10] = c) : (i = e[9], c = e[10]), $(i, c);
|
|
251
256
|
let d, v;
|
|
252
257
|
e[11] !== t || e[12] !== s ? (d = () => {
|
|
253
258
|
g.setToolEnabled(t, ce, s);
|
|
254
259
|
}, v = [t, s], e[11] = t, e[12] = s, e[13] = d, e[14] = v) : (d = e[13], v = e[14]), $(d, v);
|
|
255
260
|
let O;
|
|
256
|
-
e[15] !== t || e[16] !==
|
|
261
|
+
e[15] !== t || e[16] !== T ? (O = () => (g.registerTool(t, {
|
|
257
262
|
id: Ie,
|
|
258
263
|
type: "config",
|
|
259
|
-
order:
|
|
264
|
+
order: T,
|
|
260
265
|
enabled: !0,
|
|
261
|
-
fn: (
|
|
262
|
-
const h =
|
|
266
|
+
fn: (y) => {
|
|
267
|
+
const h = y, I = g.getWidget(t), L = I?.sourceData != null && !(Array.isArray(I.sourceData) && I.sourceData.length === 0);
|
|
263
268
|
if (I?.isRelative) {
|
|
264
269
|
if (!L)
|
|
265
270
|
return h;
|
|
266
271
|
if (!l.current) {
|
|
267
|
-
const
|
|
268
|
-
l.current = (
|
|
272
|
+
const W = I?.locale;
|
|
273
|
+
l.current = (P) => new Intl.NumberFormat(W, {
|
|
269
274
|
style: "percent",
|
|
270
275
|
minimumFractionDigits: 1,
|
|
271
276
|
maximumFractionDigits: 1
|
|
272
|
-
}).format(
|
|
277
|
+
}).format(P / 100);
|
|
273
278
|
}
|
|
274
279
|
return {
|
|
275
280
|
...h,
|
|
@@ -284,18 +289,18 @@ function on(n) {
|
|
|
284
289
|
} : h;
|
|
285
290
|
}
|
|
286
291
|
}), () => {
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
formatter:
|
|
290
|
-
max:
|
|
292
|
+
const y = g.getWidget(t);
|
|
293
|
+
y?.isRelative && "originalFormatter" in y && g.setWidget(t, {
|
|
294
|
+
formatter: y.originalFormatter,
|
|
295
|
+
max: y.originalMax
|
|
291
296
|
}), l.current = void 0, g.unregisterTool(t, Ie);
|
|
292
|
-
}), e[15] = t, e[16] =
|
|
297
|
+
}), e[15] = t, e[16] = T, e[17] = O) : O = e[17];
|
|
293
298
|
let C;
|
|
294
|
-
e[18] !== o || e[19] !== t || e[20] !==
|
|
299
|
+
e[18] !== o || e[19] !== t || e[20] !== T ? (C = [t, T, o], e[18] = o, e[19] = t, e[20] = T, e[21] = C) : C = e[21], $(O, C);
|
|
295
300
|
let k;
|
|
296
301
|
e[22] !== t || e[23] !== s ? (k = () => {
|
|
297
|
-
const
|
|
298
|
-
if (l.current = void 0,
|
|
302
|
+
const y = !s;
|
|
303
|
+
if (l.current = void 0, y) {
|
|
299
304
|
const h = g.getWidget(t);
|
|
300
305
|
g.setWidget(t, {
|
|
301
306
|
isRelative: !0,
|
|
@@ -341,7 +346,7 @@ function ln(n) {
|
|
|
341
346
|
defaultZoomEnd: m,
|
|
342
347
|
labels: S,
|
|
343
348
|
Icon: _,
|
|
344
|
-
ResetIcon:
|
|
349
|
+
ResetIcon: T,
|
|
345
350
|
IconButtonProps: o
|
|
346
351
|
} = n, l = f === void 0 ? !1 : f, r = p === void 0 ? 0 : p, s = m === void 0 ? 100 : m, a = Fe();
|
|
347
352
|
let u;
|
|
@@ -418,16 +423,16 @@ function ln(n) {
|
|
|
418
423
|
}, e[28] = t, e[29] = E) : E = e[29];
|
|
419
424
|
let z;
|
|
420
425
|
e[30] !== t || e[31] !== d || e[32] !== c ? (z = [t, c, d], e[30] = t, e[31] = d, e[32] = c, e[33] = z) : z = e[33], $(E, z);
|
|
421
|
-
let
|
|
422
|
-
e[34] !== t || e[35] !== i || e[36] !== d || e[37] !== c ? (
|
|
426
|
+
let y;
|
|
427
|
+
e[34] !== t || e[35] !== i || e[36] !== d || e[37] !== c ? (y = () => {
|
|
423
428
|
const R = !i;
|
|
424
429
|
g.setWidget(t, {
|
|
425
430
|
zoom: R,
|
|
426
431
|
zoomStart: R ? c : 0,
|
|
427
432
|
zoomEnd: R ? d : 100
|
|
428
433
|
});
|
|
429
|
-
}, e[34] = t, e[35] = i, e[36] = d, e[37] = c, e[38] =
|
|
430
|
-
const h =
|
|
434
|
+
}, e[34] = t, e[35] = i, e[36] = d, e[37] = c, e[38] = y) : y = e[38];
|
|
435
|
+
const h = y;
|
|
431
436
|
let I;
|
|
432
437
|
e[39] !== s || e[40] !== r || e[41] !== t ? (I = () => {
|
|
433
438
|
g.setWidget(t, {
|
|
@@ -436,7 +441,7 @@ function ln(n) {
|
|
|
436
441
|
zoomEnd: s
|
|
437
442
|
});
|
|
438
443
|
}, e[39] = s, e[40] = r, e[41] = t, e[42] = I) : I = e[42];
|
|
439
|
-
const L = I,
|
|
444
|
+
const L = I, W = S?.enable ?? "Enable zoom", P = S?.disable ?? "Disable zoom", B = S?.reset ?? "Reset zoom", H = i ? P : W, Z = S?.ariaLabel ?? H;
|
|
440
445
|
let F;
|
|
441
446
|
e[43] !== _ ? (F = _ ?? /* @__PURE__ */ b(Ue, {}), e[43] = _, e[44] = F) : F = e[44];
|
|
442
447
|
let G;
|
|
@@ -444,7 +449,7 @@ function ln(n) {
|
|
|
444
449
|
let V;
|
|
445
450
|
e[51] !== G || e[52] !== H ? (V = /* @__PURE__ */ b(ee, { title: H, children: G }), e[51] = G, e[52] = H, e[53] = V) : V = e[53];
|
|
446
451
|
let M;
|
|
447
|
-
e[54] !== o || e[55] !==
|
|
452
|
+
e[54] !== o || e[55] !== T || e[56] !== L || e[57] !== B || e[58] !== i ? (M = i && /* @__PURE__ */ b(ee, { title: B, children: /* @__PURE__ */ b(K, { size: "small", "aria-label": B, onClick: L, ...o, children: T ?? /* @__PURE__ */ b(je, {}) }) }), e[54] = o, e[55] = T, e[56] = L, e[57] = B, e[58] = i, e[59] = M) : M = e[59];
|
|
448
453
|
let J;
|
|
449
454
|
return e[60] !== V || e[61] !== M ? (J = /* @__PURE__ */ ne(ke, { sx: ye.container, children: [
|
|
450
455
|
V,
|
|
@@ -464,34 +469,34 @@ function rn(n) {
|
|
|
464
469
|
Icon: m,
|
|
465
470
|
IconButtonProps: S
|
|
466
471
|
} = n, _ = f === void 0 ? !1 : f, {
|
|
467
|
-
storeIsStacked:
|
|
472
|
+
storeIsStacked: T,
|
|
468
473
|
option: o
|
|
469
474
|
} = Q(t, Tt);
|
|
470
475
|
let l;
|
|
471
476
|
e: {
|
|
472
477
|
if (!o) {
|
|
473
|
-
let
|
|
474
|
-
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (
|
|
478
|
+
let P;
|
|
479
|
+
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (P = {
|
|
475
480
|
hasMultiSeries: !1,
|
|
476
481
|
hasStackInSeries: !1
|
|
477
|
-
}, e[0] =
|
|
482
|
+
}, e[0] = P) : P = e[0], l = P;
|
|
478
483
|
break e;
|
|
479
484
|
}
|
|
480
|
-
let
|
|
481
|
-
e[1] !== o.series ? (
|
|
482
|
-
const h =
|
|
485
|
+
let y;
|
|
486
|
+
e[1] !== o.series ? (y = Array.isArray(o.series) ? o.series : [o.series], e[1] = o.series, e[2] = y) : y = e[2];
|
|
487
|
+
const h = y, I = h.length > 1;
|
|
483
488
|
let L;
|
|
484
489
|
e[3] !== h ? (L = h.some(yt), e[3] = h, e[4] = L) : L = e[4];
|
|
485
|
-
let
|
|
486
|
-
e[5] !== I || e[6] !== L ? (
|
|
490
|
+
let W;
|
|
491
|
+
e[5] !== I || e[6] !== L ? (W = {
|
|
487
492
|
hasMultiSeries: I,
|
|
488
493
|
hasStackInSeries: L
|
|
489
|
-
}, e[5] = I, e[6] = L, e[7] =
|
|
494
|
+
}, e[5] = I, e[6] = L, e[7] = W) : W = e[7], l = W;
|
|
490
495
|
}
|
|
491
496
|
const {
|
|
492
497
|
hasMultiSeries: r,
|
|
493
498
|
hasStackInSeries: s
|
|
494
|
-
} = l, a = s || _, u =
|
|
499
|
+
} = l, a = s || _, u = T ?? a;
|
|
495
500
|
let i, c;
|
|
496
501
|
e[8] !== t ? (i = () => (g.registerTool(t, {
|
|
497
502
|
id: ue,
|
|
@@ -505,11 +510,11 @@ function rn(n) {
|
|
|
505
510
|
g.setToolEnabled(t, ue, u && r);
|
|
506
511
|
}, v = [t, u, r], e[11] = r, e[12] = t, e[13] = u, e[14] = d, e[15] = v) : (d = e[14], v = e[15]), $(d, v);
|
|
507
512
|
let O, C;
|
|
508
|
-
e[16] !== a || e[17] !== t || e[18] !==
|
|
509
|
-
|
|
513
|
+
e[16] !== a || e[17] !== t || e[18] !== T ? (O = () => {
|
|
514
|
+
T === void 0 && g.setWidget(t, {
|
|
510
515
|
isStacked: a
|
|
511
516
|
});
|
|
512
|
-
}, C = [a, t,
|
|
517
|
+
}, C = [a, t, T], e[16] = a, e[17] = t, e[18] = T, e[19] = O, e[20] = C) : (O = e[19], C = e[20]), $(O, C);
|
|
513
518
|
let k;
|
|
514
519
|
e[21] !== t || e[22] !== u ? (k = () => {
|
|
515
520
|
g.setWidget(t, {
|
|
@@ -565,19 +570,19 @@ function sn(n) {
|
|
|
565
570
|
labels: m,
|
|
566
571
|
Icon: S,
|
|
567
572
|
IconButtonProps: _
|
|
568
|
-
} = n,
|
|
573
|
+
} = n, T = p === void 0 ? 30 : p, {
|
|
569
574
|
storeIsLocked: o
|
|
570
575
|
} = Q(t, _t), l = o ?? !1;
|
|
571
576
|
let r, s;
|
|
572
|
-
e[0] !== t || e[1] !==
|
|
577
|
+
e[0] !== t || e[1] !== T ? (r = () => (g.registerTool(t, {
|
|
573
578
|
id: ie,
|
|
574
|
-
order:
|
|
579
|
+
order: T,
|
|
575
580
|
enabled: !1,
|
|
576
581
|
fn: (A) => {
|
|
577
582
|
const D = g.getWidget(t)?.lockedItems ?? [];
|
|
578
583
|
return D.length === 0 ? A : xt(A, D);
|
|
579
584
|
}
|
|
580
|
-
}), () => g.unregisterTool(t, ie)), s = [t,
|
|
585
|
+
}), () => g.unregisterTool(t, ie)), s = [t, T], e[0] = t, e[1] = T, e[2] = r, e[3] = s) : (r = e[2], s = e[3]), $(r, s);
|
|
581
586
|
let a, u;
|
|
582
587
|
e[4] !== t || e[5] !== l || e[6] !== f.length ? (a = () => {
|
|
583
588
|
if (l && f.length === 0) {
|
|
@@ -630,8 +635,8 @@ function an(n) {
|
|
|
630
635
|
labels: m,
|
|
631
636
|
TextFieldProps: S,
|
|
632
637
|
ClearIcon: _,
|
|
633
|
-
debounceDelay:
|
|
634
|
-
} = n, o = p === void 0 ? 20 : p, l =
|
|
638
|
+
debounceDelay: T
|
|
639
|
+
} = n, o = p === void 0 ? 20 : p, l = T === void 0 ? Et : T, r = le(null), s = le(null), {
|
|
635
640
|
enabled: a,
|
|
636
641
|
searchText: u
|
|
637
642
|
} = Q(t, Ct), i = le(a), c = f ?? kt;
|
|
@@ -668,10 +673,10 @@ function an(n) {
|
|
|
668
673
|
e[14] !== a ? (E = () => {
|
|
669
674
|
a && !i.current && r.current && r.current.focus(), i.current = a;
|
|
670
675
|
}, x = [a], e[14] = a, e[15] = x, e[16] = E) : (x = e[15], E = e[16]), $(E, x);
|
|
671
|
-
let z,
|
|
676
|
+
let z, y;
|
|
672
677
|
e[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (z = () => () => {
|
|
673
678
|
s.current && clearTimeout(s.current);
|
|
674
|
-
},
|
|
679
|
+
}, y = [], e[17] = z, e[18] = y) : (z = e[17], y = e[18]), $(z, y);
|
|
675
680
|
let h;
|
|
676
681
|
e[19] !== D || e[20] !== v ? (h = (V) => {
|
|
677
682
|
const M = V.target.value;
|
|
@@ -682,21 +687,21 @@ function an(n) {
|
|
|
682
687
|
e[22] !== t || e[23] !== v ? (L = () => {
|
|
683
688
|
v(""), g.triggerToolPipeline(t), r.current && r.current.focus();
|
|
684
689
|
}, e[22] = t, e[23] = v, e[24] = L) : L = e[24];
|
|
685
|
-
const
|
|
690
|
+
const W = L;
|
|
686
691
|
if (!a)
|
|
687
692
|
return null;
|
|
688
|
-
const
|
|
693
|
+
const P = m?.placeholder ?? "Search...", B = m?.clearAriaLabel ?? "Clear search";
|
|
689
694
|
let H;
|
|
690
695
|
e[25] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (H = /* @__PURE__ */ b(be, { position: "start", children: /* @__PURE__ */ b(Le, {}) }), e[25] = H) : H = e[25];
|
|
691
696
|
let Z;
|
|
692
|
-
e[26] !== _ || e[27] !== B || e[28] !==
|
|
697
|
+
e[26] !== _ || e[27] !== B || e[28] !== W || e[29] !== u ? (Z = u ? /* @__PURE__ */ b(be, { position: "end", children: /* @__PURE__ */ b(K, { size: "small", "aria-label": B, onClick: W, edge: "end", children: _ ?? /* @__PURE__ */ b(Ye, { fontSize: "small" }) }) }) : null, e[26] = _, e[27] = B, e[28] = W, e[29] = u, e[30] = Z) : Z = e[30];
|
|
693
698
|
let F;
|
|
694
699
|
e[31] !== Z ? (F = {
|
|
695
700
|
startAdornment: H,
|
|
696
701
|
endAdornment: Z
|
|
697
702
|
}, e[31] = Z, e[32] = F) : F = e[32];
|
|
698
703
|
let G;
|
|
699
|
-
return e[33] !== S || e[34] !== I || e[35] !==
|
|
704
|
+
return e[33] !== S || e[34] !== I || e[35] !== P || e[36] !== u || e[37] !== F ? (G = /* @__PURE__ */ b(Me, { inputRef: r, size: "small", fullWidth: !0, variant: "filled", placeholder: P, value: u, onChange: I, InputProps: F, ...S }), e[33] = S, e[34] = I, e[35] = P, e[36] = u, e[37] = F, e[38] = G) : G = e[38], G;
|
|
700
705
|
}
|
|
701
706
|
function Ct(n) {
|
|
702
707
|
return {
|
|
@@ -717,8 +722,8 @@ function cn(n) {
|
|
|
717
722
|
Icon: m,
|
|
718
723
|
IconButtonProps: S
|
|
719
724
|
} = n, _ = f === void 0 ? !1 : f, {
|
|
720
|
-
storeIsEnabled:
|
|
721
|
-
} = Q(t, Lt), o =
|
|
725
|
+
storeIsEnabled: T
|
|
726
|
+
} = Q(t, Lt), o = T ?? _;
|
|
722
727
|
let l, r;
|
|
723
728
|
e[0] !== _ || e[1] !== t ? (l = () => {
|
|
724
729
|
g.getWidget(t)?.isSearchEnabled === void 0 && g.setWidget(t, {
|
|
@@ -762,7 +767,7 @@ function zt(n) {
|
|
|
762
767
|
listeners: m,
|
|
763
768
|
setNodeRef: S,
|
|
764
769
|
transform: _,
|
|
765
|
-
transition:
|
|
770
|
+
transition: T,
|
|
766
771
|
isDragging: o
|
|
767
772
|
} = rt(f);
|
|
768
773
|
let l;
|
|
@@ -772,12 +777,12 @@ function zt(n) {
|
|
|
772
777
|
} : null), e[2] = _, e[3] = l) : l = e[3];
|
|
773
778
|
const r = o ? 0.5 : 1, s = o ? "grabbing" : "grab";
|
|
774
779
|
let a;
|
|
775
|
-
e[4] !== l || e[5] !== r || e[6] !== s || e[7] !==
|
|
780
|
+
e[4] !== l || e[5] !== r || e[6] !== s || e[7] !== T ? (a = {
|
|
776
781
|
transform: l,
|
|
777
|
-
transition:
|
|
782
|
+
transition: T,
|
|
778
783
|
opacity: r,
|
|
779
784
|
cursor: s
|
|
780
|
-
}, e[4] = l, e[5] = r, e[6] = s, e[7] =
|
|
785
|
+
}, e[4] = l, e[5] = r, e[6] = s, e[7] = T, e[8] = a) : a = e[8];
|
|
781
786
|
const u = a;
|
|
782
787
|
let i;
|
|
783
788
|
e[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (i = {
|
|
@@ -802,9 +807,9 @@ function dn(n) {
|
|
|
802
807
|
Icon: p,
|
|
803
808
|
IconButtonProps: m,
|
|
804
809
|
MenuProps: S
|
|
805
|
-
} = n, [_,
|
|
810
|
+
} = n, [_, T] = ge(null), {
|
|
806
811
|
columns: o
|
|
807
|
-
} = Q(t,
|
|
812
|
+
} = Q(t, Pt);
|
|
808
813
|
let l;
|
|
809
814
|
e[0] !== t ? (l = (M) => {
|
|
810
815
|
const R = g.getWidget(t)?.columns;
|
|
@@ -813,7 +818,7 @@ function dn(n) {
|
|
|
813
818
|
const j = M, N = j.columns;
|
|
814
819
|
if (!N || N.length === 0 || N.length === R.length && N.every((q, X) => q.id === R[X]?.id))
|
|
815
820
|
return M;
|
|
816
|
-
const oe = new Map(N.map(
|
|
821
|
+
const oe = new Map(N.map(Wt)), te = [];
|
|
817
822
|
for (const q of R) {
|
|
818
823
|
const X = oe.get(q.id);
|
|
819
824
|
X && (te.push(X), oe.delete(q.id));
|
|
@@ -845,12 +850,12 @@ function dn(n) {
|
|
|
845
850
|
}), () => g.unregisterTool(t, Te)), d = [t, r], e[5] = t, e[6] = r, e[7] = c, e[8] = d) : (c = e[7], d = e[8]), $(c, d);
|
|
846
851
|
let v;
|
|
847
852
|
e[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (v = (M) => {
|
|
848
|
-
M.stopPropagation(),
|
|
853
|
+
M.stopPropagation(), T(M.currentTarget);
|
|
849
854
|
}, e[9] = v) : v = e[9];
|
|
850
855
|
const O = v;
|
|
851
856
|
let C;
|
|
852
857
|
e[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (C = () => {
|
|
853
|
-
|
|
858
|
+
T(null);
|
|
854
859
|
}, e[10] = C) : C = e[10];
|
|
855
860
|
const k = C;
|
|
856
861
|
let A;
|
|
@@ -872,18 +877,18 @@ function dn(n) {
|
|
|
872
877
|
const w = A;
|
|
873
878
|
if (!o || o.length < 2)
|
|
874
879
|
return null;
|
|
875
|
-
const D = f?.tooltip ?? "Change column", x = !!_, E = f?.ariaLabel ?? D, z = x ? "change-column-menu" : void 0,
|
|
880
|
+
const D = f?.tooltip ?? "Change column", x = !!_, E = f?.ariaLabel ?? D, z = x ? "change-column-menu" : void 0, y = x ? "true" : void 0;
|
|
876
881
|
let h;
|
|
877
882
|
e[14] !== p ? (h = p ?? /* @__PURE__ */ b(Ge, { children: /* @__PURE__ */ b(Ot, {}) }), e[14] = p, e[15] = h) : h = e[15];
|
|
878
883
|
let I;
|
|
879
|
-
e[16] !== m || e[17] !== x || e[18] !== z || e[19] !==
|
|
884
|
+
e[16] !== m || e[17] !== x || e[18] !== z || e[19] !== y || e[20] !== h || e[21] !== E ? (I = /* @__PURE__ */ b(K, { size: "small", "aria-label": E, "aria-controls": z, "aria-haspopup": "true", "aria-expanded": y, onClick: O, "data-active": x, sx: re.trigger, ...m, children: h }), e[16] = m, e[17] = x, e[18] = z, e[19] = y, e[20] = h, e[21] = E, e[22] = I) : I = e[22];
|
|
880
885
|
let L;
|
|
881
886
|
e[23] !== I || e[24] !== D ? (L = /* @__PURE__ */ b(ee, { title: D, children: I }), e[23] = I, e[24] = D, e[25] = L) : L = e[25];
|
|
882
|
-
let
|
|
883
|
-
e[26] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (
|
|
887
|
+
let W, P, B;
|
|
888
|
+
e[26] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (W = {
|
|
884
889
|
vertical: "bottom",
|
|
885
890
|
horizontal: "right"
|
|
886
|
-
},
|
|
891
|
+
}, P = {
|
|
887
892
|
vertical: "top",
|
|
888
893
|
horizontal: "right"
|
|
889
894
|
}, B = {
|
|
@@ -892,13 +897,13 @@ function dn(n) {
|
|
|
892
897
|
overflow: "hidden"
|
|
893
898
|
}
|
|
894
899
|
}
|
|
895
|
-
}, e[26] =
|
|
900
|
+
}, e[26] = W, e[27] = P, e[28] = B) : (W = e[26], P = e[27], B = e[28]);
|
|
896
901
|
let H;
|
|
897
902
|
e[29] !== o ? (H = o.map(wt), e[29] = o, e[30] = H) : H = e[30];
|
|
898
903
|
let Z;
|
|
899
904
|
e[31] !== i || e[32] !== H ? (Z = /* @__PURE__ */ b(at, { items: i, strategy: ct, children: H }), e[31] = i, e[32] = H, e[33] = Z) : Z = e[33];
|
|
900
905
|
let F;
|
|
901
|
-
e[34] !== S || e[35] !== _ || e[36] !== x || e[37] !== Z ? (F = /* @__PURE__ */ b(Ce, { id: "change-column-menu", anchorEl: _, open: x, onClose: k, anchorOrigin:
|
|
906
|
+
e[34] !== S || e[35] !== _ || e[36] !== x || e[37] !== Z ? (F = /* @__PURE__ */ b(Ce, { id: "change-column-menu", anchorEl: _, open: x, onClose: k, anchorOrigin: W, transformOrigin: P, slotProps: B, ...S, children: Z }), e[34] = S, e[35] = _, e[36] = x, e[37] = Z, e[38] = F) : F = e[38];
|
|
902
907
|
let G;
|
|
903
908
|
e[39] !== w || e[40] !== a || e[41] !== F ? (G = /* @__PURE__ */ b(ot, { sensors: a, collisionDetection: lt, onDragEnd: w, children: F }), e[39] = w, e[40] = a, e[41] = F, e[42] = G) : G = e[42];
|
|
904
909
|
let V;
|
|
@@ -913,10 +918,10 @@ function wt(n) {
|
|
|
913
918
|
function At(n) {
|
|
914
919
|
return n.id;
|
|
915
920
|
}
|
|
916
|
-
function
|
|
921
|
+
function Wt(n) {
|
|
917
922
|
return [n.id, n];
|
|
918
923
|
}
|
|
919
|
-
function
|
|
924
|
+
function Pt(n) {
|
|
920
925
|
return {
|
|
921
926
|
columns: n?.columns
|
|
922
927
|
};
|
|
@@ -948,7 +953,7 @@ function un(n) {
|
|
|
948
953
|
dataIndex: [],
|
|
949
954
|
seriesIndex: 0
|
|
950
955
|
}, e[0] = _) : _ = e[0];
|
|
951
|
-
const
|
|
956
|
+
const T = le(_), {
|
|
952
957
|
brush: o
|
|
953
958
|
} = Q(t, $t);
|
|
954
959
|
let l;
|
|
@@ -988,22 +993,22 @@ function un(n) {
|
|
|
988
993
|
e[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (u = (h) => {
|
|
989
994
|
const L = h.batch?.flatMap(Rt) ?? [];
|
|
990
995
|
if (!L.length) {
|
|
991
|
-
|
|
996
|
+
T.current = {
|
|
992
997
|
dataIndex: [],
|
|
993
998
|
seriesIndex: 0
|
|
994
999
|
};
|
|
995
1000
|
return;
|
|
996
1001
|
}
|
|
997
|
-
const
|
|
998
|
-
|
|
999
|
-
dataIndex:
|
|
1000
|
-
seriesIndex:
|
|
1002
|
+
const W = L[0]?.seriesIndex ?? 0, P = Array.from(new Set(L.filter((B) => B.seriesIndex === void 0 || B.seriesIndex === W).flatMap(Bt)));
|
|
1003
|
+
T.current = {
|
|
1004
|
+
dataIndex: P,
|
|
1005
|
+
seriesIndex: W
|
|
1001
1006
|
};
|
|
1002
1007
|
}, e[9] = u) : u = e[9];
|
|
1003
1008
|
const i = u;
|
|
1004
1009
|
let c;
|
|
1005
1010
|
e[10] !== t || e[11] !== f ? (c = () => {
|
|
1006
|
-
f?.(
|
|
1011
|
+
f?.(T.current), g.setWidget(t, {
|
|
1007
1012
|
brush: !1
|
|
1008
1013
|
});
|
|
1009
1014
|
}, e[10] = t, e[11] = f, e[12] = c) : c = e[12];
|
|
@@ -1015,8 +1020,8 @@ function un(n) {
|
|
|
1015
1020
|
order: 25,
|
|
1016
1021
|
enabled: !1,
|
|
1017
1022
|
fn: (h) => {
|
|
1018
|
-
const I = h, L = I.option,
|
|
1019
|
-
...
|
|
1023
|
+
const I = h, L = I.option, W = I.onEvents ?? {}, P = pe(), B = {
|
|
1024
|
+
...W,
|
|
1020
1025
|
brushSelected: i,
|
|
1021
1026
|
brushEnd: d
|
|
1022
1027
|
};
|
|
@@ -1024,7 +1029,7 @@ function un(n) {
|
|
|
1024
1029
|
...I,
|
|
1025
1030
|
option: {
|
|
1026
1031
|
...L,
|
|
1027
|
-
...
|
|
1032
|
+
...P
|
|
1028
1033
|
},
|
|
1029
1034
|
onEvents: B
|
|
1030
1035
|
};
|
|
@@ -1039,8 +1044,8 @@ function un(n) {
|
|
|
1039
1044
|
e[21] !== m ? (E = m ?? /* @__PURE__ */ b(qe, {}), e[21] = m, e[22] = E) : E = e[22];
|
|
1040
1045
|
let z;
|
|
1041
1046
|
e[23] !== S || e[24] !== o || e[25] !== r || e[26] !== x || e[27] !== E ? (z = /* @__PURE__ */ b(K, { size: "small", "aria-label": x, onClick: r, sx: _e.trigger, "data-active": o, ...S, children: E }), e[23] = S, e[24] = o, e[25] = r, e[26] = x, e[27] = E, e[28] = z) : z = e[28];
|
|
1042
|
-
let
|
|
1043
|
-
return e[29] !== z || e[30] !== D ? (
|
|
1047
|
+
let y;
|
|
1048
|
+
return e[29] !== z || e[30] !== D ? (y = /* @__PURE__ */ b(ke, { sx: _e.container, children: /* @__PURE__ */ b(ee, { title: D, children: z }) }), e[29] = z, e[30] = D, e[31] = y) : y = e[31], y;
|
|
1044
1049
|
}
|
|
1045
1050
|
function Bt(n) {
|
|
1046
1051
|
return n.dataIndex ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sources":["../../src/widgets/actions/fullscreen/styles.ts","../../src/widgets/actions/fullscreen/fullscreen.tsx","../../src/widgets/actions/download/download.tsx","../../src/widgets/actions/shared/styles.ts","../../src/widgets/actions/relative-data/utils.ts","../../src/widgets/actions/relative-data/relative-data.tsx","../../src/widgets/actions/zoom-toggle/style.ts","../../src/widgets/actions/zoom-toggle/zoom-toggle.tsx","../../src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx","../../src/widgets/actions/stack-toggle/stack-toggle.tsx","../../src/widgets/actions/lock-selection/lock-selection.tsx","../../src/widgets/actions/searcher/searcher.tsx","../../src/widgets/actions/searcher/searcher-toggle.tsx","../../src/widgets/actions/change-column/change-column-icon.tsx","../../src/widgets/actions/change-column/sortable-column-item.tsx","../../src/widgets/actions/change-column/change-column.tsx","../../src/widgets/actions/brush-toggle/style.ts","../../src/widgets/actions/brush-toggle/brush-toggle.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n title: {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n },\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { Close, FullscreenOutlined } from '@mui/icons-material'\nimport type {\n FullScreenConfig,\n FullScreenProps,\n FullScreenState,\n} from './types'\nimport { styles } from './styles'\n\nconst EMPTY_DIALOG_CONTENT_PROPS: NonNullable<\n FullScreenProps['DialogContentProps']\n> = {}\n\n/**\n * Displays widget content in a fullscreen modal dialog.\n *\n * Manages fullscreen state via the widget store and renders a MUI Dialog\n * with the widget title and a close button.\n *\n * @example\n * ```tsx\n * <FullScreen id=\"my-widget\" labels={{ ariaLabel: 'Expand chart' }}>\n * <ChartContent id=\"my-widget\" />\n * </FullScreen>\n * ```\n */\nexport function FullScreen({\n id,\n labels,\n children,\n Icon,\n IconButtonProps,\n DialogContentProps: {\n sx,\n ...DialogContentProps\n } = EMPTY_DIALOG_CONTENT_PROPS,\n DialogProps,\n}: FullScreenProps) {\n const { isFullScreen, title } = useWidgetSelector(id, (w) => ({\n isFullScreen: (w as FullScreenState | undefined)?.isFullScreen,\n title: (w as FullScreenState | undefined)?.title,\n }))\n const updateFullScreenConfig = (updates: Partial<FullScreenConfig>) => {\n widgetStoreActions.setWidget<FullScreenState>(id, {\n isFullScreen: updates.isFullScreen,\n })\n }\n\n return (\n <>\n <IconButton\n {...IconButtonProps}\n onClick={() => updateFullScreenConfig({ isFullScreen: true })}\n >\n {Icon ?? <FullscreenOutlined />}\n </IconButton>\n <Dialog\n maxWidth={false}\n open={!!isFullScreen}\n keepMounted\n aria-labelledby={labels?.ariaLabel ?? `fullscreen-dialog-title-${id}`}\n {...DialogProps}\n onClose={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <DialogTitle\n id={`fullscreen-dialog-title-${id}`}\n sx={styles.title.container}\n >\n <Typography variant='subtitle1' component='span'>\n {title}\n </Typography>\n <IconButton\n onClick={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n ...styles.content,\n ...sx,\n }}\n {...DialogContentProps}\n >\n {children}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material'\nimport type { DownloadItem, DownloadProps } from './types'\nimport { FileDownloadOutlined } from '@mui/icons-material'\nimport { useState, type MouseEvent } from 'react'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nconst EMPTY_LABELS: NonNullable<DownloadProps['labels']> = {}\n\n/**\n * Dropdown menu action for exporting widget data in various formats (CSV, PNG, etc.).\n *\n * Reads widget data from the store and triggers downloads using the modifier\n * function defined in each `DownloadItem`.\n *\n * @example\n * ```tsx\n * <Download id={widgetId} items={barDownloadConfig({ refUI })} />\n * ```\n */\nexport function Download({\n id,\n items,\n labels = EMPTY_LABELS,\n Icon,\n IconButtonProps,\n}: DownloadProps) {\n const { data } = useWidgetSelector(id, (w) => ({\n data: w?.data,\n }))\n\n const [isDownloading, setIsDownloading] = useState(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n\n const handleToggle = (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }\n\n const handleDownload = (data: string, option: DownloadItem) => {\n const link = document.createElement('a')\n link.href = data\n link.download = option.filename ?? id\n link.style.display = 'none'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n option.callback?.(link.href)\n }\n\n const handleClick = async (\n event: MouseEvent<HTMLElement>,\n option: DownloadItem,\n ) => {\n event.stopPropagation()\n\n setIsDownloading(true)\n setAnchorEl(null)\n\n const result = await option.modifier(data)\n\n if (!result) {\n setIsDownloading(false)\n return\n }\n\n handleDownload(result, option)\n setIsDownloading(false)\n }\n\n return (\n <>\n <IconButton\n size='small'\n aria-label={labels.ariaLabel ?? 'download options'}\n aria-controls='options-menu'\n aria-haspopup='true'\n onClick={handleToggle}\n {...IconButtonProps}\n disabled={isDownloading || items.length === 0}\n className={isDownloading || anchorEl ? 'active' : ''}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n (Icon ?? <FileDownloadOutlined />)\n )}\n </IconButton>\n <Menu\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n MenuListProps={{\n sx: {\n paddingBottom: 0,\n },\n }}\n >\n {items.map((option) => (\n <MenuItem\n key={option.id}\n disabled={option.disabled}\n onClick={(e) => void handleClick(e, option)}\n >\n {option.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {option.icon}\n </ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\n/**\n * Shared styles for widget action buttons\n */\nexport const actionButtonStyles = {\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { EchartWidgetData } from '../../echart/types'\n\n/**\n * Calculates the sum of all numeric values in the data\n */\nexport function calculateTotal(data: EchartWidgetData): number {\n return data.reduce((total, series) => {\n return series.reduce((seriesTotal, item) => {\n if (Array.isArray(item)) {\n const value = item.at(-1) as number\n return typeof value === 'number' ? seriesTotal + value : seriesTotal\n }\n\n return Object.entries(item).reduce((itemTotal: number, [key, value]) => {\n if (key === 'name') {\n return itemTotal\n }\n return typeof value === 'number' ? itemTotal + value : itemTotal\n }, seriesTotal)\n }, total)\n }, 0)\n}\n\n/**\n * Transforms data to relative (percentage) values\n */\nexport function toRelativeData(\n data: EchartWidgetData,\n total: number,\n): EchartWidgetData {\n if (total === 0) return data\n\n return data.map((series) =>\n series.map((item) => {\n if (Array.isArray(item)) {\n return item.map((value: number, index) => {\n if (index === item.length - 1 && typeof value === 'number') {\n return (value / total) * 100\n }\n return value\n }) as typeof item\n }\n\n const transformed: Record<string, string | number> = {}\n\n for (const [key, value] of Object.entries(item)) {\n if (key === 'name') {\n transformed[key] = value\n continue\n }\n transformed[key] =\n typeof value === 'number' ? (value / total) * 100 : value\n }\n\n return transformed\n }),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { PercentOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { RelativeDataProps, RelativeDataState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { calculateTotal, toRelativeData } from './utils'\nimport type { EchartWidgetData } from '../../../widgets/echart'\n\nexport const RELATIVE_DATA_TOOL_ID = 'relative-data'\nexport const RELATIVE_DATA_CONFIG_TOOL_ID = 'relative-data-config'\n\n/**\n * Widget action to toggle between relative (percentage) and absolute data display.\n *\n * Registers two transformation tools in the widget pipeline when mounted:\n * - A data tool that converts values to percentages (enabled/disabled via store)\n * - A config tool that is **always enabled** and reads `isRelative` from the store\n * to decide whether to apply the percentage formatter or restore the original one.\n * The config tool must always participate because the original formatter may have\n * been set via `setWidget` (not in the base config), so disabling the tool would\n * leave the percentage formatter stuck on the widget.\n *\n * @example\n * ```tsx\n * <RelativeData\n * id=\"my-widget\"\n * order={20}\n * defaultIsRelative={false}\n * />\n * ```\n */\nexport function RelativeData({\n id,\n order = 10,\n defaultIsRelative = false,\n labels,\n Icon,\n IconButtonProps,\n}: RelativeDataProps) {\n const percentFormatterRef = useRef<((value: number) => string) | undefined>(\n undefined,\n )\n\n // Read isRelative from widget store root — single source of truth\n const { isRelative } = useWidgetSelector(id, (w) => ({\n isRelative:\n (w as RelativeDataState | undefined)?.isRelative ?? defaultIsRelative,\n }))\n\n // Initialize store with default value on mount\n useEffect(() => {\n const current = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (current?.isRelative === undefined) {\n widgetStoreActions.setWidget(id, { isRelative: defaultIsRelative })\n }\n }, [id, defaultIsRelative])\n\n // Register data tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_TOOL_ID,\n order,\n enabled: defaultIsRelative,\n fn: (data) => {\n const echartData = data as EchartWidgetData\n const total = calculateTotal(echartData)\n return toRelativeData(echartData, total)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, RELATIVE_DATA_TOOL_ID)\n }, [id, order, defaultIsRelative])\n\n // Sync data tool enabled — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, RELATIVE_DATA_TOOL_ID, isRelative)\n }, [id, isRelative])\n\n // Register config tool — ALWAYS enabled.\n // Reads isRelative, originalFormatter, originalMax from the store at execution time:\n // - isRelative=true → applies percentage formatter and max=100\n // - isRelative=false → restores original formatter/max from store\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_CONFIG_TOOL_ID,\n type: 'config',\n order,\n enabled: true,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n\n const hasSourceData =\n widget?.sourceData != null &&\n !(Array.isArray(widget.sourceData) && widget.sourceData.length === 0)\n\n if (widget?.isRelative) {\n // Don't apply percentage formatter when there's no source data\n if (!hasSourceData) return config\n\n if (!percentFormatterRef.current) {\n const locale = widget?.locale\n percentFormatterRef.current = (value: number) =>\n new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value / 100)\n }\n return { ...config, formatter: percentFormatterRef.current, max: 100 }\n }\n\n // Not in relative mode — restore originals from store if captured.\n // Use `in` because originalFormatter may have been captured as undefined\n // (widget had no formatter before toggling relative on).\n percentFormatterRef.current = undefined\n if (widget != null && 'originalFormatter' in widget) {\n return {\n ...config,\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n }\n }\n return config\n },\n })\n return () => {\n // Restore original formatter/max if unmounting while in relative mode\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (widget?.isRelative && 'originalFormatter' in widget) {\n widgetStoreActions.setWidget(id, {\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n })\n }\n percentFormatterRef.current = undefined\n widgetStoreActions.unregisterTool(id, RELATIVE_DATA_CONFIG_TOOL_ID)\n }\n }, [id, order, defaultIsRelative])\n\n const handleToggle = useCallback(() => {\n const newIsRelative = !isRelative\n percentFormatterRef.current = undefined\n\n if (newIsRelative) {\n // Capture current formatter/max in store before switching to relative\n const widget = widgetStoreActions.getWidget(id)\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: widget?.formatter,\n originalMax: (widget as unknown as Record<string, unknown>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: false })\n }\n }, [isRelative, id])\n\n const tooltipLabel = isRelative\n ? (labels?.absolute ?? 'Show absolute values')\n : (labels?.relative ?? 'Show relative values')\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isRelative}\n {...IconButtonProps}\n >\n {Icon ?? <PercentOutlined />}\n </IconButton>\n </Tooltip>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton, useTheme } from '@mui/material'\nimport {\n SubdirectoryArrowLeftOutlined,\n ZoomInOutlined,\n} from '@mui/icons-material'\nimport { useEffect, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ZoomToggleProps, ZoomState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartZoomConfig } from '../../echart/utils'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const ZOOM_TOGGLE_TOOL_ID = 'zoom-toggle'\n\n/**\n * Widget action to toggle EChart zoom functionality.\n *\n * Registers as a config pipeline tool so that zoom configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Zoom state (enabled, range) is stored in the widget store root, and the tool\n * derives its `enabled` flag from the store. This keeps state accessible across\n * component instances.\n *\n * When zoom is active, displays an inline reset button to disable zoom.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <ZoomToggle\n * id=\"my-widget\"\n * defaultZoom={false}\n * zoomStart={0}\n * zoomEnd={100}\n * />\n * ```\n */\nexport function ZoomToggle({\n id,\n defaultZoom = false,\n defaultZoomStart = 0,\n defaultZoomEnd = 100,\n labels,\n Icon,\n ResetIcon,\n IconButtonProps,\n}: ZoomToggleProps) {\n const theme = useTheme()\n\n // Read zoom state from widget store root — single source of truth\n const { zoom, zoomStart, zoomEnd } = useWidgetSelector(id, (w) => ({\n zoom: (w as ZoomState | undefined)?.zoom ?? defaultZoom,\n zoomStart: (w as ZoomState | undefined)?.zoomStart ?? defaultZoomStart,\n zoomEnd: (w as ZoomState | undefined)?.zoomEnd ?? defaultZoomEnd,\n }))\n\n // Initialize store with default values on mount\n useEffect(() => {\n const current = widgetStoreActions.getWidget<ZoomState>(id)\n if (current?.zoom === undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: defaultZoom,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n }, [id, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Handle dataZoom event — update store (source of truth)\n const handleDataZoom = useCallback(\n (event: unknown) => {\n const zoomEvent = event as {\n start?: number\n end?: number\n batch?: {\n start?: number\n end?: number\n }[]\n }\n\n const start = zoomEvent.start ?? zoomEvent.batch?.[0]?.start\n const end = zoomEvent.end ?? zoomEvent.batch?.[0]?.end\n\n if (start !== undefined && end !== undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: start,\n zoomEnd: end,\n })\n }\n },\n [id],\n )\n\n // Register config tool once — fn reads zoom range from the store at execution time.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: ZOOM_TOGGLE_TOOL_ID,\n type: 'config',\n order: 20,\n enabled: defaultZoom,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const widget = widgetStoreActions.getWidget<ZoomState>(id)\n const start = widget?.zoomStart ?? 0\n const end = widget?.zoomEnd ?? 100\n\n const legend = option?.legend as { show?: boolean } | undefined\n const hasLegend = legend?.show !== false && legend !== undefined\n\n const sliderHeight = parseInt(theme?.spacing?.(4) ?? '32')\n const sliderGap = 8\n const legendBottomOffset = hasLegend ? 28 : 0\n\n const zoomConfig = getEChartZoomConfig(\n { start, end },\n {\n inside: true,\n xSlider: true,\n ySlider: false,\n bottomOffset: legendBottomOffset,\n },\n theme,\n )\n\n const grid = option?.grid as { bottom?: number | string } | undefined\n const currentGridBottom =\n typeof grid?.bottom === 'number'\n ? grid.bottom\n : parseInt(grid?.bottom ?? '24')\n\n const gridBottom = currentGridBottom + sliderHeight + sliderGap\n\n const onEvents = { ...currentOnEvents, dataZoom: handleDataZoom }\n\n return {\n ...config,\n option: {\n ...option,\n ...zoomConfig,\n grid: { ...grid, bottom: gridBottom },\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, ZOOM_TOGGLE_TOOL_ID)\n }, [id, theme, handleDataZoom, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, ZOOM_TOGGLE_TOOL_ID, zoom)\n }, [id, zoom])\n\n // Trigger pipeline when zoom range changes — fn reads from store at execution time,\n // but the pipeline only re-runs when registeredTools reference changes.\n // setToolEnabled handles the zoom on/off case, this handles range-only changes.\n useEffect(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, [id, zoomStart, zoomEnd])\n\n const handleToggle = () => {\n const newZoom = !zoom\n widgetStoreActions.setWidget(id, {\n zoom: newZoom,\n zoomStart: newZoom ? zoomStart : 0,\n zoomEnd: newZoom ? zoomEnd : 100,\n })\n }\n\n const handleReset = () => {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n\n const enableLabel = labels?.enable ?? 'Enable zoom'\n const disableLabel = labels?.disable ?? 'Disable zoom'\n const resetLabel = labels?.reset ?? 'Reset zoom'\n const tooltipLabel = zoom ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={zoom}\n {...IconButtonProps}\n >\n {Icon ?? <ZoomInOutlined />}\n </IconButton>\n </Tooltip>\n {zoom && (\n <Tooltip title={resetLabel}>\n <IconButton\n size='small'\n aria-label={resetLabel}\n onClick={handleReset}\n {...IconButtonProps}\n >\n {ResetIcon ?? <SubdirectoryArrowLeftOutlined />}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n )\n}\n","export const GroupedBarChartIcon = () => (\n <svg\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M4 20V8H8V20H4ZM9 20V13H13V20H9ZM16 20V4H20V20H16Z'\n fill='currentColor'\n />\n </svg>\n)\n","import { IconButton } from '@mui/material'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { StackToggleProps, StackToggleState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { GroupedBarChartIcon } from './grouped-bar-chart-icon'\nimport { getEChartStackConfig } from '../../echart/utils'\nimport { DEFAULT_STACK_GROUP } from '../../echart/const'\nimport type { EchartWidgetState } from '../../echart/types'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const STACK_TOGGLE_TOOL_ID = 'stack-toggle'\n\n/**\n * Widget action to toggle stacking behavior in ECharts bar and histogram widgets.\n *\n * Registers as a config pipeline tool so that stack configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * @example\n * ```tsx\n * <StackToggle\n * id=\"my-widget\"\n * defaultIsStacked={false}\n * />\n * ```\n */\nexport function StackToggle({\n id,\n defaultIsStacked = false,\n labels,\n Icon,\n IconButtonProps,\n}: StackToggleProps) {\n const { storeIsStacked, option } = useWidgetSelector(id, (w) => ({\n storeIsStacked: (w as StackToggleState | undefined)?.isStacked,\n option: (w as EchartWidgetState | undefined)?.option,\n }))\n\n const { hasMultiSeries, hasStackInSeries } = useMemo(() => {\n if (!option) return { hasMultiSeries: false, hasStackInSeries: false }\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n return {\n hasMultiSeries: series.length > 1,\n hasStackInSeries: series.some((s) => (s as { stack?: string })?.stack),\n }\n }, [option])\n\n // If series already has stack defined, default to stacked=true\n const effectiveDefaultIsStacked = hasStackInSeries || defaultIsStacked\n const isStacked = storeIsStacked ?? effectiveDefaultIsStacked\n\n // Register config tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: STACK_TOGGLE_TOOL_ID,\n type: 'config',\n order: 10,\n enabled: false,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n if (!option) return currentConfig\n\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n const updatedSeries = series.map((s) => {\n const existingStack = (s as { stack?: string })?.stack\n const stackGroup =\n typeof existingStack === 'string'\n ? existingStack\n : DEFAULT_STACK_GROUP\n return { ...s, ...getEChartStackConfig(stackGroup) }\n })\n\n return { ...config, option: { ...option, series: updatedSeries } }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, STACK_TOGGLE_TOOL_ID)\n }, [id])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(\n id,\n STACK_TOGGLE_TOOL_ID,\n isStacked && hasMultiSeries,\n )\n }, [id, isStacked, hasMultiSeries])\n\n // Initialize store with default value only if not already configured\n useEffect(() => {\n if (storeIsStacked !== undefined) return\n widgetStoreActions.setWidget(id, { isStacked: effectiveDefaultIsStacked })\n }, [effectiveDefaultIsStacked, id, storeIsStacked])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isStacked: !isStacked })\n }, [isStacked, id])\n\n const tooltipLabel = isStacked\n ? (labels?.unstacked ?? 'Disable stacking')\n : (labels?.stacked ?? 'Enable stacking')\n\n // Early return if there's only one series - stacking doesn't apply\n if (!hasMultiSeries) {\n return null\n }\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isStacked}\n {...IconButtonProps}\n >\n {Icon ?? <GroupedBarChartIcon />}\n </IconButton>\n </Tooltip>\n )\n}\n","import { IconButton } from '@mui/material'\nimport { CheckBoxOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { LockSelectionProps, LockSelectionState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetData } from '../../echart/types'\n\nexport const LOCK_SELECTION_TOOL_ID = 'lock-selection'\n\n/**\n * Widget action button to lock the current selection.\n *\n * When locked, the widget data is filtered to only show the selected items.\n * The button is only visible when there are selected items.\n * Registers a transformation tool in the widget pipeline when mounted.\n *\n * @example\n * ```tsx\n * <LockSelection\n * id=\"my-widget\"\n * order={30}\n * selectedItems={selectedItems}\n * />\n * ```\n */\nexport function LockSelection({\n id,\n selectedItems,\n order = 30,\n labels,\n Icon,\n IconButtonProps,\n}: LockSelectionProps) {\n const { storeIsLocked } = useWidgetSelector(id, (w) => ({\n storeIsLocked: (w as LockSelectionState | undefined)?.isLocked,\n }))\n\n const isLocked = storeIsLocked ?? false\n\n // Register tool once — fn reads lockedItems from the store at execution time\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: LOCK_SELECTION_TOOL_ID,\n order,\n enabled: false,\n fn: (data) => {\n const widget = widgetStoreActions.getWidget<LockSelectionState>(id)\n const items = widget?.lockedItems ?? []\n if (items.length === 0) return data\n\n return filterDataByLockedItems(data as EchartWidgetData, items)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, LOCK_SELECTION_TOOL_ID)\n }, [id, order])\n\n // Sync enabled from store — lightweight, no re-registration.\n // When selectedItems is empty (e.g., remount with no active selection),\n // disable the tool and clear stale lock state.\n useEffect(() => {\n if (isLocked && selectedItems.length === 0) {\n widgetStoreActions.setWidget(id, { isLocked: false, lockedItems: [] })\n return\n }\n widgetStoreActions.setToolEnabled(id, LOCK_SELECTION_TOOL_ID, isLocked)\n }, [id, isLocked, selectedItems.length])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n // Unlock: clear locked items and disable tool\n widgetStoreActions.setWidget(id, {\n isLocked: false,\n lockedItems: [],\n })\n } else {\n // Lock: save selected items and enable tool\n widgetStoreActions.setWidget(id, {\n isLocked: true,\n lockedItems: selectedItems,\n })\n }\n }, [id, isLocked, selectedItems])\n\n // Don't render if no selections\n if (selectedItems.length === 0) {\n return null\n }\n\n const tooltipLabel = isLocked\n ? (labels?.unlock ?? 'Unlock selection')\n : (labels?.lock ?? 'Lock selection')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isLocked}\n {...IconButtonProps}\n >\n {Icon ?? <CheckBoxOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Filters widget data to only include items with names matching the locked items.\n */\nfunction filterDataByLockedItems(\n data: EchartWidgetData,\n lockedItems: string[],\n): EchartWidgetData {\n return data.map((series) =>\n series.filter((item) => {\n const name = item.name\n return typeof name === 'string' && lockedItems.includes(name)\n }),\n )\n}\n","import { TextField, InputAdornment, IconButton } from '@mui/material'\nimport { ClearOutlined, SearchOutlined } from '@mui/icons-material'\nimport { useEffect, useRef, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { SearcherProps, SearcherFilterFn, SearcherState } from './types'\nimport type { EchartWidgetData } from '../../echart/types'\nimport { LOCK_SELECTION_TOOL_ID } from '../lock-selection/lock-selection'\n\nexport const SEARCHER_TOOL_ID = 'searcher'\n\nconst DEBOUNCE_DELAY = 300\n\n/**\n * Search input component that works with SearcherToggle.\n *\n * Registers a transformation tool in the widget pipeline when mounted.\n * Reads the enabled state from the widget store using the provided id.\n * Uses a debounced search to filter data via the transformation pipeline.\n * Auto-focuses when enabled becomes true.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * order={10}\n * labels={{ placeholder: 'Search categories...' }}\n * />\n * ```\n */\nexport function Searcher({\n id,\n filterFn,\n order = 20,\n labels,\n TextFieldProps,\n ClearIcon,\n debounceDelay = DEBOUNCE_DELAY,\n}: SearcherProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Read enabled state and search text from widget store\n const { enabled, searchText } = useWidgetSelector(id, (w) => ({\n enabled: (w as SearcherState | undefined)?.isSearchEnabled ?? false,\n searchText: (w as SearcherState | undefined)?.searchText ?? '',\n }))\n const prevEnabledRef = useRef(enabled)\n\n const filter = filterFn ?? defaultFilterFn\n\n const setSearchText = useCallback(\n (text: string) => {\n widgetStoreActions.setWidget(id, { searchText: text })\n },\n [id],\n )\n\n // Register tool once — fn reads searchText from the store at execution time.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: SEARCHER_TOOL_ID,\n order,\n enabled: false,\n fn: async (data) => {\n const widget = widgetStoreActions.getWidget<SearcherState>(id)\n const currentSearchText = widget?.searchText ?? ''\n\n // Execute filter (can be sync or async)\n const result = filter(data as EchartWidgetData, currentSearchText)\n\n // Return result directly (pipeline will handle Promise)\n return result\n },\n disables: [LOCK_SELECTION_TOOL_ID],\n })\n\n return () => widgetStoreActions.unregisterTool(id, SEARCHER_TOOL_ID)\n }, [id, order, filter])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, SEARCHER_TOOL_ID, enabled)\n }, [id, enabled])\n\n // Trigger pipeline re-execution when search text changes (debounced).\n // The fn reads searchText from the store, so we just need to trigger the pipeline.\n const debouncedTriggerPipeline = useCallback(() => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, debounceDelay)\n }, [id, debounceDelay])\n\n // Auto-focus when enabled becomes true\n useEffect(() => {\n // Transition from disabled to enabled - focus input\n if (enabled && !prevEnabledRef.current && inputRef.current) {\n inputRef.current.focus()\n }\n\n prevEnabledRef.current = enabled\n }, [enabled])\n\n // Cleanup debounce timeout on unmount\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setSearchText(newValue)\n debouncedTriggerPipeline()\n },\n [debouncedTriggerPipeline, setSearchText],\n )\n\n const handleClear = useCallback(() => {\n setSearchText('')\n widgetStoreActions.triggerToolPipeline(id)\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }, [id, setSearchText])\n\n if (!enabled) {\n return null\n }\n\n const placeholder = labels?.placeholder ?? 'Search...'\n const clearAriaLabel = labels?.clearAriaLabel ?? 'Clear search'\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={placeholder}\n value={searchText}\n onChange={handleChange}\n InputProps={{\n startAdornment: (\n <InputAdornment position='start'>\n <SearchOutlined />\n </InputAdornment>\n ),\n endAdornment: searchText ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n aria-label={clearAriaLabel}\n onClick={handleClear}\n edge='end'\n >\n {ClearIcon ?? <ClearOutlined fontSize='small' />}\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n {...TextFieldProps}\n />\n )\n}\n\n/**\n * Default filter function that searches all string fields case-insensitively.\n * Note: Should be synchronous for the new pipeline architecture.\n */\nconst defaultFilterFn: SearcherFilterFn = (\n data: EchartWidgetData,\n searchText: string,\n) => {\n if (!searchText.trim()) return Promise.resolve(data)\n\n const lowerSearch = searchText.toLowerCase()\n\n return Promise.resolve(\n data.map((series) =>\n series.filter((item) =>\n Object.values(item).some((value) =>\n String(value).toLowerCase().includes(lowerSearch),\n ),\n ),\n ),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { SearcherToggleProps, SearcherState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Widget action button to toggle search functionality.\n *\n * Stores the enabled state in the widget store using the provided id.\n * When search is active, the button shows an active state with a light background.\n * Use in conjunction with the Searcher component to display the search input.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * data={widgetData}\n * />\n * ```\n */\nexport function SearcherToggle({\n id,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: SearcherToggleProps) {\n const { storeIsEnabled } = useWidgetSelector(id, (w) => ({\n storeIsEnabled: (w as SearcherState | undefined)?.isSearchEnabled,\n }))\n\n const isEnabled = storeIsEnabled ?? defaultEnabled\n\n // Initialize store with default value on mount\n useEffect(() => {\n const currentValue =\n widgetStoreActions.getWidget<SearcherState>(id)?.isSearchEnabled\n if (currentValue === undefined) {\n widgetStoreActions.setWidget(id, { isSearchEnabled: defaultEnabled })\n }\n }, [defaultEnabled, id])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isSearchEnabled: !isEnabled })\n }, [id, isEnabled])\n\n const tooltipLabel = isEnabled\n ? (labels?.disable ?? 'Disable search')\n : (labels?.enable ?? 'Enable search')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isEnabled}\n {...IconButtonProps}\n >\n {Icon ?? <SearchOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n","export const ChangeColumnIcon = () => (\n <svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 18 18'>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </svg>\n)\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport type { TableColumn } from '../../table/types'\n\nexport interface SortableColumnItemProps {\n column: TableColumn\n}\n\n/**\n * A draggable menu item for column reordering.\n * Uses @dnd-kit/sortable for drag-and-drop functionality.\n */\nexport function SortableColumnItem({ column }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id })\n\n const style = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n role='menuitem'\n tabIndex={0}\n sx={{\n '&:focus-visible': {\n outline: (theme) => `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }}\n >\n <ListItemText>{column.label}</ListItemText>\n </MenuItem>\n )\n}\n","import {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { IconButton, Menu, SvgIcon } from '@mui/material'\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type MouseEvent,\n} from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ChangeColumnProps } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport type { TableColumn, TableWidgetState } from '../../table/types'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const CHANGE_COLUMN_TOOL_ID = 'change-column'\n\n/**\n * Widget action to reorder columns in a table widget via drag-and-drop.\n *\n * This action reads the columns from the widget store and allows users to\n * drag and drop columns to reorder them. All columns are displayed and\n * can be reordered.\n *\n * Registers as a config pipeline tool so that column order is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Returns null if there are fewer than 2 columns.\n *\n * @example\n * ```tsx\n * <ChangeColumn id=\"my-table-widget\" />\n * ```\n */\nexport function ChangeColumn({\n id,\n labels,\n Icon,\n IconButtonProps,\n MenuProps,\n}: ChangeColumnProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const { columns } = useWidgetSelector(id, (w) => ({\n columns: (w as TableWidgetState | undefined)?.columns,\n }))\n\n /**\n * Config tool function that reorders columns to match the current widget state.\n * Reads desired order from the widget store (set by handleDragEnd via setWidget).\n * Preserves referential identity when the order already matches to prevent\n * re-render loops in the config pipeline.\n */\n const reorderFn = useCallback(\n (currentConfig: unknown): unknown => {\n const widgetState = widgetStoreActions.getWidget<TableWidgetState>(id)\n const currentColumns = widgetState?.columns\n if (!currentColumns || currentColumns.length === 0) return currentConfig\n\n const config = currentConfig as Record<string, unknown>\n const configColumns = config.columns as TableColumn[] | undefined\n if (!configColumns || configColumns.length === 0) return currentConfig\n\n // Check if config columns are already in the same order as widget columns\n const alreadyMatches =\n configColumns.length === currentColumns.length &&\n configColumns.every((col, i) => col.id === currentColumns[i]?.id)\n if (alreadyMatches) return currentConfig\n\n // Reorder config columns to match widget column order\n const columnMap = new Map(configColumns.map((col) => [col.id, col]))\n const reordered: TableColumn[] = []\n\n for (const widgetCol of currentColumns) {\n const col = columnMap.get(widgetCol.id)\n if (col) {\n reordered.push(col)\n columnMap.delete(widgetCol.id)\n }\n }\n\n // Append any new columns not in the widget order\n for (const col of columnMap.values()) {\n reordered.push(col)\n }\n\n // If result matches current widget columns, reuse the same array reference\n // to prevent downstream subscribers from detecting a change\n const matchesWidget =\n reordered.length === currentColumns.length &&\n reordered.every((col, i) => col.id === currentColumns[i]?.id)\n\n return { ...config, columns: matchesWidget ? currentColumns : reordered }\n },\n [id],\n )\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const columnIds = useMemo(\n () => columns?.map((col) => col.id) ?? [],\n [columns],\n )\n\n // Register config tool on mount\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: CHANGE_COLUMN_TOOL_ID,\n type: 'config',\n order: 100,\n enabled: true,\n fn: reorderFn,\n })\n return () => widgetStoreActions.unregisterTool(id, CHANGE_COLUMN_TOOL_ID)\n }, [id, reorderFn])\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }, [])\n\n const handleClose = useCallback(() => {\n setAnchorEl(null)\n }, [])\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id || !columns) return\n const oldIndex = columns.findIndex((col) => col.id === active.id)\n const newIndex = columns.findIndex((col) => col.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n const newColumns = arrayMove(columns, oldIndex, newIndex)\n widgetStoreActions.setWidget(id, { columns: newColumns })\n }\n }\n\n // Return null if there are fewer than 2 columns\n if (!columns || columns.length < 2) {\n return null\n }\n\n const tooltipLabel = labels?.tooltip ?? 'Change column'\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-haspopup='true'\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleToggle}\n data-active={isOpen}\n sx={actionButtonStyles.trigger}\n {...IconButtonProps}\n >\n {Icon ?? (\n <SvgIcon>\n <ChangeColumnIcon />\n </SvgIcon>\n )}\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: { overflow: 'hidden' },\n },\n }}\n {...MenuProps}\n >\n <SortableContext\n items={columnIds}\n strategy={verticalListSortingStrategy}\n >\n {columns.map((column) => (\n <SortableColumnItem key={column.id} column={column} />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton } from '@mui/material'\nimport { HighlightAltOutlined } from '@mui/icons-material'\nimport { useEffect, useCallback, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { BrushSelectedItems, BrushToggleProps, BrushState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartBrushConfig } from '../../echart/utils'\nimport type { EchartOptionsProps, EchartWidgetState } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const BRUSH_TOGGLE_TOOL_ID = 'brush-toggle'\n\n/**\n * Widget action to toggle EChart brush selection functionality.\n *\n * Registers as a config pipeline tool so that brush configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Brush state is stored in the widget store root, and the tool derives its\n * `enabled` flag from the store. This keeps state accessible across component instances.\n *\n * When brush is active, users can drag across bars to select a range.\n * Selection clearing is handled via the chart's brush interactions/toolbox configuration.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <BrushToggle\n * id=\"my-widget\"\n * onBrushSelected={(items) => console.log(items)}\n * />\n * ```\n */\nexport function BrushToggle({\n id,\n onBrushSelected,\n labels,\n Icon,\n IconButtonProps,\n}: BrushToggleProps) {\n const selected = useRef<BrushSelectedItems>({ dataIndex: [], seriesIndex: 0 })\n\n // Read brush state from widget store root — single source of truth\n const { brush } = useWidgetSelector(id, (w) => ({\n brush: (w as BrushState | undefined)?.brush ?? false,\n }))\n\n const handleToggle = useCallback(() => {\n const newBrush = !brush\n widgetStoreActions.setWidget(id, { brush: newBrush })\n\n if (newBrush) {\n onBrushSelected?.({ dataIndex: [], seriesIndex: 0 }) // Clear selection when enabling brush\n }\n }, [brush, id, onBrushSelected])\n\n // Re-dispatch brush action after every ECharts render while brush is active\n useEffect(() => {\n if (!brush) return\n\n const instance =\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.instance?.current\n if (!instance) return\n\n const handleRendered = () => {\n const config = getEChartBrushConfig()\n instance.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: {\n brushType: config.brush.brushType,\n brushMode: config.brush.brushMode,\n },\n })\n }\n\n // Dispatch immediately for the initial activation\n handleRendered()\n\n // Re-dispatch after each render (covers setOption with notMerge:true)\n instance.on('rendered', handleRendered)\n\n return () => {\n instance.off('rendered', handleRendered)\n }\n }, [brush, id])\n\n // Handle brushSelected event to capture selected bar indices\n const handleBrushSelected = useCallback((event: unknown) => {\n const brushEvent = event as {\n batch?: {\n selected?: {\n dataIndex?: number[]\n seriesIndex?: number\n }[]\n }[]\n }\n\n const allSelected =\n brushEvent.batch?.flatMap((batchItem) => batchItem.selected ?? []) ?? []\n\n if (!allSelected.length) {\n selected.current = {\n dataIndex: [],\n seriesIndex: 0,\n }\n return\n }\n\n // Use the first seriesIndex as the primary one (matches previous behavior)\n const primarySeriesIndex = allSelected[0]?.seriesIndex ?? 0\n\n const mergedDataIndex = Array.from(\n new Set(\n allSelected\n .filter(\n (item) =>\n item.seriesIndex === undefined ||\n item.seriesIndex === primarySeriesIndex,\n )\n .flatMap((item) => item.dataIndex ?? []),\n ),\n )\n\n selected.current = {\n dataIndex: mergedDataIndex,\n seriesIndex: primarySeriesIndex,\n }\n }, [])\n\n const handleBrushEnd = useCallback(() => {\n onBrushSelected?.(selected.current)\n widgetStoreActions.setWidget(id, { brush: false }) // Disable brush after selection is made\n }, [onBrushSelected, id])\n\n // Register config tool once — fn closure depends on event handlers.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: BRUSH_TOGGLE_TOOL_ID,\n type: 'config',\n order: 25,\n enabled: false,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const brushConfig = getEChartBrushConfig()\n\n const onEvents = {\n ...currentOnEvents,\n brushSelected: handleBrushSelected,\n brushEnd: handleBrushEnd,\n }\n\n return {\n ...config,\n option: {\n ...option,\n ...brushConfig,\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, BRUSH_TOGGLE_TOOL_ID)\n }, [id, handleBrushSelected, handleBrushEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, BRUSH_TOGGLE_TOOL_ID, brush)\n }, [id, brush])\n\n const enableLabel = labels?.enable ?? 'Enable brush selection'\n const disableLabel = labels?.disable ?? 'Disable brush selection'\n const tooltipLabel = brush ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={brush}\n {...IconButtonProps}\n >\n {Icon ?? <HighlightAltOutlined />}\n </IconButton>\n </Tooltip>\n </Box>\n )\n}\n"],"names":["styles","title","container","display","alignItems","justifyContent","gap","content","flexDirection","spacing","EMPTY_DIALOG_CONTENT_PROPS","FullScreen","t0","$","_c","id","labels","children","Icon","IconButtonProps","DialogContentProps","t1","DialogProps","t2","undefined","sx","isFullScreen","useWidgetSelector","_temp","t3","updates","widgetStoreActions","setWidget","updateFullScreenConfig","t4","t5","FullscreenOutlined","t6","IconButton","t7","t8","ariaLabel","t9","t10","t11","Typography","t12","t13","Symbol","for","Close","t14","jsx","t15","DialogTitle","t16","t17","DialogContent","t18","Dialog","t19","w","EMPTY_LABELS","Download","items","data","isDownloading","setIsDownloading","useState","anchorEl","setAnchorEl","event","stopPropagation","currentTarget","handleToggle","data_0","option","link","document","createElement","href","download","filename","style","body","appendChild","click","removeChild","callback","handleDownload","event_0","option_0","result","modifier","handleClick","length","CircularProgress","FileDownloadOutlined","vertical","horizontal","Boolean","paddingBottom","option_1","jsxs","MenuItem","disabled","e","icon","ListItemIcon","color","ListItemText","label","map","Menu","actionButtonStyles","trigger","background","theme","palette","primary","relatedLight","calculateTotal","reduce","total","series","seriesTotal","item","Array","isArray","value","at","Object","entries","itemTotal","key","toRelativeData","index","transformed","RELATIVE_DATA_TOOL_ID","RELATIVE_DATA_CONFIG_TOOL_ID","RelativeData","order","defaultIsRelative","percentFormatterRef","useRef","isRelative","getWidget","useEffect","registerTool","enabled","fn","unregisterTool","setToolEnabled","type","currentConfig","config","widget","hasSourceData","sourceData","current","locale","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","formatter","max","originalFormatter","originalMax","widget_0","newIsRelative","widget_1","tooltipLabel","absolute","relative","PercentOutlined","Tooltip","echartData","ZOOM_TOGGLE_TOOL_ID","ZoomToggle","defaultZoom","defaultZoomStart","defaultZoomEnd","ResetIcon","useTheme","zoom","zoomStart","zoomEnd","zoomEvent","start","batch","end","handleDataZoom","currentOnEvents","onEvents","start_0","end_0","legend","hasLegend","show","sliderHeight","parseInt","zoomConfig","getEChartZoomConfig","inside","xSlider","ySlider","bottomOffset","legendBottomOffset","grid","gridBottom","bottom","dataZoom","triggerToolPipeline","newZoom","handleReset","enableLabel","enable","disableLabel","disable","resetLabel","reset","ZoomInOutlined","t20","SubdirectoryArrowLeftOutlined","t21","Box","GroupedBarChartIcon","STACK_TOGGLE_TOOL_ID","StackToggle","defaultIsStacked","storeIsStacked","bb0","hasMultiSeries","hasStackInSeries","some","_temp2","effectiveDefaultIsStacked","isStacked","_temp4","unstacked","stacked","updatedSeries","_temp3","s_0","existingStack","s","stack","getEChartStackConfig","DEFAULT_STACK_GROUP","LOCK_SELECTION_TOOL_ID","LockSelection","selectedItems","storeIsLocked","isLocked","lockedItems","filterDataByLockedItems","unlock","lock","CheckBoxOutlined","filter","name","includes","SEARCHER_TOOL_ID","DEBOUNCE_DELAY","Searcher","filterFn","TextFieldProps","ClearIcon","debounceDelay","inputRef","debounceTimeoutRef","searchText","prevEnabledRef","defaultFilterFn","text","setSearchText","currentSearchText","disables","clearTimeout","setTimeout","debouncedTriggerPipeline","focus","newValue","target","handleChange","handleClear","placeholder","clearAriaLabel","InputAdornment","SearchOutlined","ClearOutlined","startAdornment","endAdornment","TextField","isSearchEnabled","trim","Promise","resolve","lowerSearch","toLowerCase","values","String","SearcherToggle","defaultEnabled","storeIsEnabled","isEnabled","ChangeColumnIcon","SortableColumnItem","column","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","CSS","Transform","toString","x","opacity","cursor","outline","outlineOffset","main","CHANGE_COLUMN_TOOL_ID","ChangeColumn","MenuProps","columns","currentColumns","configColumns","every","col","i","columnMap","Map","reordered","widgetCol","col_1","get","push","delete","col_2","matchesWidget","col_3","i_0","reorderFn","coordinateGetter","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","columnIds","handleClose","active","over","oldIndex","findIndex","col_5","newIndex","col_6","newColumns","arrayMove","handleDragEnd","tooltip","isOpen","SvgIcon","paper","overflow","SortableContext","verticalListSortingStrategy","DndContext","closestCenter","t22","col_4","col_0","BRUSH_TOGGLE_TOOL_ID","BrushToggle","onBrushSelected","dataIndex","seriesIndex","selected","brush","newBrush","instance","handleRendered","getEChartBrushConfig","dispatchAction","brushOption","brushType","brushMode","on","off","allSelected","flatMap","primarySeriesIndex","mergedDataIndex","from","Set","handleBrushSelected","handleBrushEnd","config_0","brushConfig","brushSelected","brushEnd","HighlightAltOutlined","item_0","batchItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actions.js","sources":["../../src/widgets/actions/fullscreen/styles.ts","../../src/widgets/actions/fullscreen/fullscreen.tsx","../../src/widgets/actions/download/download.tsx","../../src/widgets/actions/shared/styles.ts","../../src/widgets/actions/relative-data/utils.ts","../../src/widgets/actions/relative-data/relative-data.tsx","../../src/widgets/actions/zoom-toggle/style.ts","../../src/widgets/actions/zoom-toggle/zoom-toggle.tsx","../../src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx","../../src/widgets/actions/stack-toggle/stack-toggle.tsx","../../src/widgets/actions/lock-selection/lock-selection.tsx","../../src/widgets/actions/searcher/searcher.tsx","../../src/widgets/actions/searcher/searcher-toggle.tsx","../../src/widgets/actions/change-column/change-column-icon.tsx","../../src/widgets/actions/change-column/sortable-column-item.tsx","../../src/widgets/actions/change-column/change-column.tsx","../../src/widgets/actions/brush-toggle/style.ts","../../src/widgets/actions/brush-toggle/brush-toggle.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n title: {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n },\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { Close, FullscreenOutlined } from '@mui/icons-material'\nimport type {\n FullScreenConfig,\n FullScreenProps,\n FullScreenState,\n} from './types'\nimport { styles } from './styles'\n\nconst EMPTY_DIALOG_CONTENT_PROPS: NonNullable<\n FullScreenProps['DialogContentProps']\n> = {}\n\n/**\n * Displays widget content in a fullscreen modal dialog.\n *\n * Manages fullscreen state via the widget store and renders a MUI Dialog\n * with the widget title and a close button.\n *\n * @example\n * ```tsx\n * <FullScreen id=\"my-widget\" labels={{ ariaLabel: 'Expand chart' }}>\n * <ChartContent id=\"my-widget\" />\n * </FullScreen>\n * ```\n */\nexport function FullScreen({\n id,\n labels,\n children,\n Icon,\n IconButtonProps,\n DialogContentProps: {\n sx,\n ...DialogContentProps\n } = EMPTY_DIALOG_CONTENT_PROPS,\n DialogProps,\n}: FullScreenProps) {\n const { isFullScreen, title } = useWidgetSelector(id, (w) => ({\n isFullScreen: (w as FullScreenState | undefined)?.isFullScreen,\n title: (w as FullScreenState | undefined)?.title,\n }))\n const updateFullScreenConfig = (updates: Partial<FullScreenConfig>) => {\n widgetStoreActions.setWidget<FullScreenState>(id, {\n isFullScreen: updates.isFullScreen,\n })\n }\n\n return (\n <>\n <IconButton\n {...IconButtonProps}\n onClick={() => updateFullScreenConfig({ isFullScreen: true })}\n >\n {Icon ?? <FullscreenOutlined />}\n </IconButton>\n <Dialog\n maxWidth={false}\n open={!!isFullScreen}\n keepMounted\n aria-labelledby={labels?.ariaLabel ?? `fullscreen-dialog-title-${id}`}\n {...DialogProps}\n onClose={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <DialogTitle\n id={`fullscreen-dialog-title-${id}`}\n sx={styles.title.container}\n >\n <Typography variant='subtitle1' component='span'>\n {title}\n </Typography>\n <IconButton\n onClick={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n ...styles.content,\n ...sx,\n }}\n {...DialogContentProps}\n >\n {children}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material'\nimport type { DownloadItem, DownloadProps } from './types'\nimport { FileDownloadOutlined } from '@mui/icons-material'\nimport { useState, type MouseEvent } from 'react'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nconst EMPTY_LABELS: NonNullable<DownloadProps['labels']> = {}\n\n/**\n * Dropdown menu action for exporting widget data in various formats (CSV, PNG, etc.).\n *\n * Reads widget data from the store and triggers downloads using the modifier\n * function defined in each `DownloadItem`.\n *\n * @example\n * ```tsx\n * <Download id={widgetId} items={barDownloadConfig({ refUI })} />\n * ```\n */\nexport function Download({\n id,\n items,\n labels = EMPTY_LABELS,\n Icon,\n IconButtonProps,\n}: DownloadProps) {\n const { data } = useWidgetSelector(id, (w) => ({\n data: w?.data,\n }))\n\n const [isDownloading, setIsDownloading] = useState(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n\n const handleToggle = (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }\n\n const handleDownload = (data: string, option: DownloadItem) => {\n const link = document.createElement('a')\n link.href = data\n link.download = option.filename ?? id\n link.style.display = 'none'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n option.callback?.(link.href)\n }\n\n const handleClick = async (\n event: MouseEvent<HTMLElement>,\n option: DownloadItem,\n ) => {\n event.stopPropagation()\n\n setIsDownloading(true)\n setAnchorEl(null)\n\n const result = await option.modifier(data)\n\n if (!result) {\n setIsDownloading(false)\n return\n }\n\n handleDownload(result, option)\n setIsDownloading(false)\n }\n\n return (\n <>\n <IconButton\n size='small'\n aria-label={labels.ariaLabel ?? 'download options'}\n aria-controls='options-menu'\n aria-haspopup='true'\n onClick={handleToggle}\n {...IconButtonProps}\n disabled={isDownloading || items.length === 0}\n className={isDownloading || anchorEl ? 'active' : ''}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n (Icon ?? <FileDownloadOutlined />)\n )}\n </IconButton>\n <Menu\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n MenuListProps={{\n sx: {\n paddingBottom: 0,\n },\n }}\n >\n {items.map((option) => (\n <MenuItem\n key={option.id}\n disabled={option.disabled}\n onClick={(e) => void handleClick(e, option)}\n >\n {option.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {option.icon}\n </ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\n/**\n * Shared styles for widget action buttons\n */\nexport const actionButtonStyles = {\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { EchartWidgetData } from '../../echart/types'\n\n/**\n * Calculates the sum of all numeric values in the data\n */\nexport function calculateTotal(data: EchartWidgetData): number {\n return data.reduce((total, series) => {\n return series.reduce((seriesTotal, item) => {\n if (Array.isArray(item)) {\n const value = item.at(-1) as number\n return typeof value === 'number' ? seriesTotal + value : seriesTotal\n }\n\n return Object.entries(item).reduce((itemTotal: number, [key, value]) => {\n if (key === 'name') {\n return itemTotal\n }\n return typeof value === 'number' ? itemTotal + value : itemTotal\n }, seriesTotal)\n }, total)\n }, 0)\n}\n\n/**\n * Transforms data to relative (percentage) values\n */\nexport function toRelativeData(\n data: EchartWidgetData,\n total: number,\n): EchartWidgetData {\n if (total === 0) return data\n\n return data.map((series) =>\n series.map((item) => {\n if (Array.isArray(item)) {\n return item.map((value: number, index) => {\n if (index === item.length - 1 && typeof value === 'number') {\n return (value / total) * 100\n }\n return value\n }) as typeof item\n }\n\n const transformed: Record<string, string | number> = {}\n\n for (const [key, value] of Object.entries(item)) {\n if (key === 'name') {\n transformed[key] = value\n continue\n }\n transformed[key] =\n typeof value === 'number' ? (value / total) * 100 : value\n }\n\n return transformed\n }),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { PercentOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { RelativeDataProps, RelativeDataState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { calculateTotal, toRelativeData } from './utils'\nimport type { EchartWidgetData } from '../../../widgets/echart'\n\nexport const RELATIVE_DATA_TOOL_ID = 'relative-data'\nexport const RELATIVE_DATA_CONFIG_TOOL_ID = 'relative-data-config'\n\n/**\n * Widget action to toggle between relative (percentage) and absolute data display.\n *\n * Registers two transformation tools in the widget pipeline when mounted:\n * - A data tool that converts values to percentages (enabled/disabled via store)\n * - A config tool that is **always enabled** and reads `isRelative` from the store\n * to decide whether to apply the percentage formatter or restore the original one.\n * The config tool must always participate because the original formatter may have\n * been set via `setWidget` (not in the base config), so disabling the tool would\n * leave the percentage formatter stuck on the widget.\n *\n * @example\n * ```tsx\n * <RelativeData\n * id=\"my-widget\"\n * order={20}\n * defaultIsRelative={false}\n * />\n * ```\n */\nexport function RelativeData({\n id,\n order = 10,\n defaultIsRelative = false,\n labels,\n Icon,\n IconButtonProps,\n}: RelativeDataProps) {\n const percentFormatterRef = useRef<((value: number) => string) | undefined>(\n undefined,\n )\n\n // Read isRelative from widget store root — single source of truth\n const { isRelative } = useWidgetSelector(id, (w) => ({\n isRelative:\n (w as RelativeDataState | undefined)?.isRelative ?? defaultIsRelative,\n }))\n\n // Initialize store with default value on mount.\n // When defaultIsRelative=true, capture originals so toggling OFF can restore them.\n useEffect(() => {\n const current = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (current?.isRelative === undefined) {\n if (defaultIsRelative) {\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: current?.formatter,\n originalMax: (current as unknown as Record<string, number>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: defaultIsRelative })\n }\n }\n }, [id, defaultIsRelative])\n\n // Register data tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_TOOL_ID,\n order,\n enabled: defaultIsRelative,\n fn: (data) => {\n const echartData = data as EchartWidgetData\n const total = calculateTotal(echartData)\n return toRelativeData(echartData, total)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, RELATIVE_DATA_TOOL_ID)\n }, [id, order, defaultIsRelative])\n\n // Sync data tool enabled — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, RELATIVE_DATA_TOOL_ID, isRelative)\n }, [id, isRelative])\n\n // Register config tool — ALWAYS enabled.\n // Reads isRelative, originalFormatter, originalMax from the store at execution time:\n // - isRelative=true → applies percentage formatter and max=100\n // - isRelative=false → restores original formatter/max from store\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_CONFIG_TOOL_ID,\n type: 'config',\n order,\n enabled: true,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n\n const hasSourceData =\n widget?.sourceData != null &&\n !(Array.isArray(widget.sourceData) && widget.sourceData.length === 0)\n\n if (widget?.isRelative) {\n // Don't apply percentage formatter when there's no source data\n if (!hasSourceData) return config\n\n if (!percentFormatterRef.current) {\n const locale = widget?.locale\n percentFormatterRef.current = (value: number) =>\n new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value / 100)\n }\n return { ...config, formatter: percentFormatterRef.current, max: 100 }\n }\n\n // Not in relative mode — restore originals from store if captured.\n // Use `in` because originalFormatter may have been captured as undefined\n // (widget had no formatter before toggling relative on).\n percentFormatterRef.current = undefined\n if (widget != null && 'originalFormatter' in widget) {\n return {\n ...config,\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n }\n }\n return config\n },\n })\n return () => {\n // Restore original formatter/max if unmounting while in relative mode\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (widget?.isRelative && 'originalFormatter' in widget) {\n widgetStoreActions.setWidget(id, {\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n })\n }\n percentFormatterRef.current = undefined\n widgetStoreActions.unregisterTool(id, RELATIVE_DATA_CONFIG_TOOL_ID)\n }\n }, [id, order, defaultIsRelative])\n\n const handleToggle = useCallback(() => {\n const newIsRelative = !isRelative\n percentFormatterRef.current = undefined\n\n if (newIsRelative) {\n // Capture current formatter/max in store before switching to relative\n const widget = widgetStoreActions.getWidget(id)\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: widget?.formatter,\n originalMax: (widget as unknown as Record<string, unknown>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: false })\n }\n }, [isRelative, id])\n\n const tooltipLabel = isRelative\n ? (labels?.absolute ?? 'Show absolute values')\n : (labels?.relative ?? 'Show relative values')\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isRelative}\n {...IconButtonProps}\n >\n {Icon ?? <PercentOutlined />}\n </IconButton>\n </Tooltip>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton, useTheme } from '@mui/material'\nimport {\n SubdirectoryArrowLeftOutlined,\n ZoomInOutlined,\n} from '@mui/icons-material'\nimport { useEffect, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ZoomToggleProps, ZoomState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartZoomConfig } from '../../echart/utils'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const ZOOM_TOGGLE_TOOL_ID = 'zoom-toggle'\n\n/**\n * Widget action to toggle EChart zoom functionality.\n *\n * Registers as a config pipeline tool so that zoom configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Zoom state (enabled, range) is stored in the widget store root, and the tool\n * derives its `enabled` flag from the store. This keeps state accessible across\n * component instances.\n *\n * When zoom is active, displays an inline reset button to disable zoom.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <ZoomToggle\n * id=\"my-widget\"\n * defaultZoom={false}\n * zoomStart={0}\n * zoomEnd={100}\n * />\n * ```\n */\nexport function ZoomToggle({\n id,\n defaultZoom = false,\n defaultZoomStart = 0,\n defaultZoomEnd = 100,\n labels,\n Icon,\n ResetIcon,\n IconButtonProps,\n}: ZoomToggleProps) {\n const theme = useTheme()\n\n // Read zoom state from widget store root — single source of truth\n const { zoom, zoomStart, zoomEnd } = useWidgetSelector(id, (w) => ({\n zoom: (w as ZoomState | undefined)?.zoom ?? defaultZoom,\n zoomStart: (w as ZoomState | undefined)?.zoomStart ?? defaultZoomStart,\n zoomEnd: (w as ZoomState | undefined)?.zoomEnd ?? defaultZoomEnd,\n }))\n\n // Initialize store with default values on mount\n useEffect(() => {\n const current = widgetStoreActions.getWidget<ZoomState>(id)\n if (current?.zoom === undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: defaultZoom,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n }, [id, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Handle dataZoom event — update store (source of truth)\n const handleDataZoom = useCallback(\n (event: unknown) => {\n const zoomEvent = event as {\n start?: number\n end?: number\n batch?: {\n start?: number\n end?: number\n }[]\n }\n\n const start = zoomEvent.start ?? zoomEvent.batch?.[0]?.start\n const end = zoomEvent.end ?? zoomEvent.batch?.[0]?.end\n\n if (start !== undefined && end !== undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: start,\n zoomEnd: end,\n })\n }\n },\n [id],\n )\n\n // Register config tool once — fn reads zoom range from the store at execution time.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: ZOOM_TOGGLE_TOOL_ID,\n type: 'config',\n order: 20,\n enabled: defaultZoom,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const widget = widgetStoreActions.getWidget<ZoomState>(id)\n const start = widget?.zoomStart ?? 0\n const end = widget?.zoomEnd ?? 100\n\n const legend = option?.legend as { show?: boolean } | undefined\n const hasLegend = legend?.show !== false && legend !== undefined\n\n const sliderHeight = parseInt(theme?.spacing?.(4) ?? '32')\n const sliderGap = 8\n const legendBottomOffset = hasLegend ? 28 : 0\n\n const zoomConfig = getEChartZoomConfig(\n { start, end },\n {\n inside: true,\n xSlider: true,\n ySlider: false,\n bottomOffset: legendBottomOffset,\n },\n theme,\n )\n\n const grid = option?.grid as { bottom?: number | string } | undefined\n const currentGridBottom =\n typeof grid?.bottom === 'number'\n ? grid.bottom\n : parseInt(grid?.bottom ?? '24')\n\n const gridBottom = currentGridBottom + sliderHeight + sliderGap\n\n const onEvents = { ...currentOnEvents, dataZoom: handleDataZoom }\n\n return {\n ...config,\n option: {\n ...option,\n ...zoomConfig,\n grid: { ...grid, bottom: gridBottom },\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, ZOOM_TOGGLE_TOOL_ID)\n }, [id, theme, handleDataZoom, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, ZOOM_TOGGLE_TOOL_ID, zoom)\n }, [id, zoom])\n\n // Trigger pipeline when zoom range changes — fn reads from store at execution time,\n // but the pipeline only re-runs when registeredTools reference changes.\n // setToolEnabled handles the zoom on/off case, this handles range-only changes.\n useEffect(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, [id, zoomStart, zoomEnd])\n\n const handleToggle = () => {\n const newZoom = !zoom\n widgetStoreActions.setWidget(id, {\n zoom: newZoom,\n zoomStart: newZoom ? zoomStart : 0,\n zoomEnd: newZoom ? zoomEnd : 100,\n })\n }\n\n const handleReset = () => {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n\n const enableLabel = labels?.enable ?? 'Enable zoom'\n const disableLabel = labels?.disable ?? 'Disable zoom'\n const resetLabel = labels?.reset ?? 'Reset zoom'\n const tooltipLabel = zoom ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={zoom}\n {...IconButtonProps}\n >\n {Icon ?? <ZoomInOutlined />}\n </IconButton>\n </Tooltip>\n {zoom && (\n <Tooltip title={resetLabel}>\n <IconButton\n size='small'\n aria-label={resetLabel}\n onClick={handleReset}\n {...IconButtonProps}\n >\n {ResetIcon ?? <SubdirectoryArrowLeftOutlined />}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n )\n}\n","export const GroupedBarChartIcon = () => (\n <svg\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M4 20V8H8V20H4ZM9 20V13H13V20H9ZM16 20V4H20V20H16Z'\n fill='currentColor'\n />\n </svg>\n)\n","import { IconButton } from '@mui/material'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { StackToggleProps, StackToggleState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { GroupedBarChartIcon } from './grouped-bar-chart-icon'\nimport { getEChartStackConfig } from '../../echart/utils'\nimport { DEFAULT_STACK_GROUP } from '../../echart/const'\nimport type { EchartWidgetState } from '../../echart/types'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const STACK_TOGGLE_TOOL_ID = 'stack-toggle'\n\n/**\n * Widget action to toggle stacking behavior in ECharts bar and histogram widgets.\n *\n * Registers as a config pipeline tool so that stack configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * @example\n * ```tsx\n * <StackToggle\n * id=\"my-widget\"\n * defaultIsStacked={false}\n * />\n * ```\n */\nexport function StackToggle({\n id,\n defaultIsStacked = false,\n labels,\n Icon,\n IconButtonProps,\n}: StackToggleProps) {\n const { storeIsStacked, option } = useWidgetSelector(id, (w) => ({\n storeIsStacked: (w as StackToggleState | undefined)?.isStacked,\n option: (w as EchartWidgetState | undefined)?.option,\n }))\n\n const { hasMultiSeries, hasStackInSeries } = useMemo(() => {\n if (!option) return { hasMultiSeries: false, hasStackInSeries: false }\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n return {\n hasMultiSeries: series.length > 1,\n hasStackInSeries: series.some((s) => (s as { stack?: string })?.stack),\n }\n }, [option])\n\n // If series already has stack defined, default to stacked=true\n const effectiveDefaultIsStacked = hasStackInSeries || defaultIsStacked\n const isStacked = storeIsStacked ?? effectiveDefaultIsStacked\n\n // Register config tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: STACK_TOGGLE_TOOL_ID,\n type: 'config',\n order: 10,\n enabled: false,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n if (!option) return currentConfig\n\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n const updatedSeries = series.map((s) => {\n const existingStack = (s as { stack?: string })?.stack\n const stackGroup =\n typeof existingStack === 'string'\n ? existingStack\n : DEFAULT_STACK_GROUP\n return { ...s, ...getEChartStackConfig(stackGroup) }\n })\n\n return { ...config, option: { ...option, series: updatedSeries } }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, STACK_TOGGLE_TOOL_ID)\n }, [id])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(\n id,\n STACK_TOGGLE_TOOL_ID,\n isStacked && hasMultiSeries,\n )\n }, [id, isStacked, hasMultiSeries])\n\n // Initialize store with default value only if not already configured\n useEffect(() => {\n if (storeIsStacked !== undefined) return\n widgetStoreActions.setWidget(id, { isStacked: effectiveDefaultIsStacked })\n }, [effectiveDefaultIsStacked, id, storeIsStacked])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isStacked: !isStacked })\n }, [isStacked, id])\n\n const tooltipLabel = isStacked\n ? (labels?.unstacked ?? 'Disable stacking')\n : (labels?.stacked ?? 'Enable stacking')\n\n // Early return if there's only one series - stacking doesn't apply\n if (!hasMultiSeries) {\n return null\n }\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isStacked}\n {...IconButtonProps}\n >\n {Icon ?? <GroupedBarChartIcon />}\n </IconButton>\n </Tooltip>\n )\n}\n","import { IconButton } from '@mui/material'\nimport { CheckBoxOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { LockSelectionProps, LockSelectionState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetData } from '../../echart/types'\n\nexport const LOCK_SELECTION_TOOL_ID = 'lock-selection'\n\n/**\n * Widget action button to lock the current selection.\n *\n * When locked, the widget data is filtered to only show the selected items.\n * The button is only visible when there are selected items.\n * Registers a transformation tool in the widget pipeline when mounted.\n *\n * @example\n * ```tsx\n * <LockSelection\n * id=\"my-widget\"\n * order={30}\n * selectedItems={selectedItems}\n * />\n * ```\n */\nexport function LockSelection({\n id,\n selectedItems,\n order = 30,\n labels,\n Icon,\n IconButtonProps,\n}: LockSelectionProps) {\n const { storeIsLocked } = useWidgetSelector(id, (w) => ({\n storeIsLocked: (w as LockSelectionState | undefined)?.isLocked,\n }))\n\n const isLocked = storeIsLocked ?? false\n\n // Register tool once — fn reads lockedItems from the store at execution time\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: LOCK_SELECTION_TOOL_ID,\n order,\n enabled: false,\n fn: (data) => {\n const widget = widgetStoreActions.getWidget<LockSelectionState>(id)\n const items = widget?.lockedItems ?? []\n if (items.length === 0) return data\n\n return filterDataByLockedItems(data as EchartWidgetData, items)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, LOCK_SELECTION_TOOL_ID)\n }, [id, order])\n\n // Sync enabled from store — lightweight, no re-registration.\n // When selectedItems is empty (e.g., remount with no active selection),\n // disable the tool and clear stale lock state.\n useEffect(() => {\n if (isLocked && selectedItems.length === 0) {\n widgetStoreActions.setWidget(id, { isLocked: false, lockedItems: [] })\n return\n }\n widgetStoreActions.setToolEnabled(id, LOCK_SELECTION_TOOL_ID, isLocked)\n }, [id, isLocked, selectedItems.length])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n // Unlock: clear locked items and disable tool\n widgetStoreActions.setWidget(id, {\n isLocked: false,\n lockedItems: [],\n })\n } else {\n // Lock: save selected items and enable tool\n widgetStoreActions.setWidget(id, {\n isLocked: true,\n lockedItems: selectedItems,\n })\n }\n }, [id, isLocked, selectedItems])\n\n // Don't render if no selections\n if (selectedItems.length === 0) {\n return null\n }\n\n const tooltipLabel = isLocked\n ? (labels?.unlock ?? 'Unlock selection')\n : (labels?.lock ?? 'Lock selection')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isLocked}\n {...IconButtonProps}\n >\n {Icon ?? <CheckBoxOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Filters widget data to only include items with names matching the locked items.\n */\nfunction filterDataByLockedItems(\n data: EchartWidgetData,\n lockedItems: string[],\n): EchartWidgetData {\n return data.map((series) =>\n series.filter((item) => {\n const name = item.name\n return typeof name === 'string' && lockedItems.includes(name)\n }),\n )\n}\n","import { TextField, InputAdornment, IconButton } from '@mui/material'\nimport { ClearOutlined, SearchOutlined } from '@mui/icons-material'\nimport { useEffect, useRef, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { SearcherProps, SearcherFilterFn, SearcherState } from './types'\nimport type { EchartWidgetData } from '../../echart/types'\nimport { LOCK_SELECTION_TOOL_ID } from '../lock-selection/lock-selection'\n\nexport const SEARCHER_TOOL_ID = 'searcher'\n\nconst DEBOUNCE_DELAY = 300\n\n/**\n * Search input component that works with SearcherToggle.\n *\n * Registers a transformation tool in the widget pipeline when mounted.\n * Reads the enabled state from the widget store using the provided id.\n * Uses a debounced search to filter data via the transformation pipeline.\n * Auto-focuses when enabled becomes true.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * order={10}\n * labels={{ placeholder: 'Search categories...' }}\n * />\n * ```\n */\nexport function Searcher({\n id,\n filterFn,\n order = 20,\n labels,\n TextFieldProps,\n ClearIcon,\n debounceDelay = DEBOUNCE_DELAY,\n}: SearcherProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Read enabled state and search text from widget store\n const { enabled, searchText } = useWidgetSelector(id, (w) => ({\n enabled: (w as SearcherState | undefined)?.isSearchEnabled ?? false,\n searchText: (w as SearcherState | undefined)?.searchText ?? '',\n }))\n const prevEnabledRef = useRef(enabled)\n\n const filter = filterFn ?? defaultFilterFn\n\n const setSearchText = useCallback(\n (text: string) => {\n widgetStoreActions.setWidget(id, { searchText: text })\n },\n [id],\n )\n\n // Register tool once — fn reads searchText from the store at execution time.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: SEARCHER_TOOL_ID,\n order,\n enabled: false,\n fn: async (data) => {\n const widget = widgetStoreActions.getWidget<SearcherState>(id)\n const currentSearchText = widget?.searchText ?? ''\n\n // Execute filter (can be sync or async)\n const result = filter(data as EchartWidgetData, currentSearchText)\n\n // Return result directly (pipeline will handle Promise)\n return result\n },\n disables: [LOCK_SELECTION_TOOL_ID],\n })\n\n return () => widgetStoreActions.unregisterTool(id, SEARCHER_TOOL_ID)\n }, [id, order, filter])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, SEARCHER_TOOL_ID, enabled)\n }, [id, enabled])\n\n // Trigger pipeline re-execution when search text changes (debounced).\n // The fn reads searchText from the store, so we just need to trigger the pipeline.\n const debouncedTriggerPipeline = useCallback(() => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, debounceDelay)\n }, [id, debounceDelay])\n\n // Auto-focus when enabled becomes true\n useEffect(() => {\n // Transition from disabled to enabled - focus input\n if (enabled && !prevEnabledRef.current && inputRef.current) {\n inputRef.current.focus()\n }\n\n prevEnabledRef.current = enabled\n }, [enabled])\n\n // Cleanup debounce timeout on unmount\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setSearchText(newValue)\n debouncedTriggerPipeline()\n },\n [debouncedTriggerPipeline, setSearchText],\n )\n\n const handleClear = useCallback(() => {\n setSearchText('')\n widgetStoreActions.triggerToolPipeline(id)\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }, [id, setSearchText])\n\n if (!enabled) {\n return null\n }\n\n const placeholder = labels?.placeholder ?? 'Search...'\n const clearAriaLabel = labels?.clearAriaLabel ?? 'Clear search'\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={placeholder}\n value={searchText}\n onChange={handleChange}\n InputProps={{\n startAdornment: (\n <InputAdornment position='start'>\n <SearchOutlined />\n </InputAdornment>\n ),\n endAdornment: searchText ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n aria-label={clearAriaLabel}\n onClick={handleClear}\n edge='end'\n >\n {ClearIcon ?? <ClearOutlined fontSize='small' />}\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n {...TextFieldProps}\n />\n )\n}\n\n/**\n * Default filter function that searches all string fields case-insensitively.\n * Note: Should be synchronous for the new pipeline architecture.\n */\nconst defaultFilterFn: SearcherFilterFn = (\n data: EchartWidgetData,\n searchText: string,\n) => {\n if (!searchText.trim()) return Promise.resolve(data)\n\n const lowerSearch = searchText.toLowerCase()\n\n return Promise.resolve(\n data.map((series) =>\n series.filter((item) =>\n Object.values(item).some((value) =>\n String(value).toLowerCase().includes(lowerSearch),\n ),\n ),\n ),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { SearcherToggleProps, SearcherState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Widget action button to toggle search functionality.\n *\n * Stores the enabled state in the widget store using the provided id.\n * When search is active, the button shows an active state with a light background.\n * Use in conjunction with the Searcher component to display the search input.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * data={widgetData}\n * />\n * ```\n */\nexport function SearcherToggle({\n id,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: SearcherToggleProps) {\n const { storeIsEnabled } = useWidgetSelector(id, (w) => ({\n storeIsEnabled: (w as SearcherState | undefined)?.isSearchEnabled,\n }))\n\n const isEnabled = storeIsEnabled ?? defaultEnabled\n\n // Initialize store with default value on mount\n useEffect(() => {\n const currentValue =\n widgetStoreActions.getWidget<SearcherState>(id)?.isSearchEnabled\n if (currentValue === undefined) {\n widgetStoreActions.setWidget(id, { isSearchEnabled: defaultEnabled })\n }\n }, [defaultEnabled, id])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isSearchEnabled: !isEnabled })\n }, [id, isEnabled])\n\n const tooltipLabel = isEnabled\n ? (labels?.disable ?? 'Disable search')\n : (labels?.enable ?? 'Enable search')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isEnabled}\n {...IconButtonProps}\n >\n {Icon ?? <SearchOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n","export const ChangeColumnIcon = () => (\n <svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 18 18'>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </svg>\n)\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport type { TableColumn } from '../../table/types'\n\nexport interface SortableColumnItemProps {\n column: TableColumn\n}\n\n/**\n * A draggable menu item for column reordering.\n * Uses @dnd-kit/sortable for drag-and-drop functionality.\n */\nexport function SortableColumnItem({ column }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id })\n\n const style = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n role='menuitem'\n tabIndex={0}\n sx={{\n '&:focus-visible': {\n outline: (theme) => `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }}\n >\n <ListItemText>{column.label}</ListItemText>\n </MenuItem>\n )\n}\n","import {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { IconButton, Menu, SvgIcon } from '@mui/material'\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type MouseEvent,\n} from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ChangeColumnProps } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport type { TableColumn, TableWidgetState } from '../../table/types'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const CHANGE_COLUMN_TOOL_ID = 'change-column'\n\n/**\n * Widget action to reorder columns in a table widget via drag-and-drop.\n *\n * This action reads the columns from the widget store and allows users to\n * drag and drop columns to reorder them. All columns are displayed and\n * can be reordered.\n *\n * Registers as a config pipeline tool so that column order is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Returns null if there are fewer than 2 columns.\n *\n * @example\n * ```tsx\n * <ChangeColumn id=\"my-table-widget\" />\n * ```\n */\nexport function ChangeColumn({\n id,\n labels,\n Icon,\n IconButtonProps,\n MenuProps,\n}: ChangeColumnProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const { columns } = useWidgetSelector(id, (w) => ({\n columns: (w as TableWidgetState | undefined)?.columns,\n }))\n\n /**\n * Config tool function that reorders columns to match the current widget state.\n * Reads desired order from the widget store (set by handleDragEnd via setWidget).\n * Preserves referential identity when the order already matches to prevent\n * re-render loops in the config pipeline.\n */\n const reorderFn = useCallback(\n (currentConfig: unknown): unknown => {\n const widgetState = widgetStoreActions.getWidget<TableWidgetState>(id)\n const currentColumns = widgetState?.columns\n if (!currentColumns || currentColumns.length === 0) return currentConfig\n\n const config = currentConfig as Record<string, unknown>\n const configColumns = config.columns as TableColumn[] | undefined\n if (!configColumns || configColumns.length === 0) return currentConfig\n\n // Check if config columns are already in the same order as widget columns\n const alreadyMatches =\n configColumns.length === currentColumns.length &&\n configColumns.every((col, i) => col.id === currentColumns[i]?.id)\n if (alreadyMatches) return currentConfig\n\n // Reorder config columns to match widget column order\n const columnMap = new Map(configColumns.map((col) => [col.id, col]))\n const reordered: TableColumn[] = []\n\n for (const widgetCol of currentColumns) {\n const col = columnMap.get(widgetCol.id)\n if (col) {\n reordered.push(col)\n columnMap.delete(widgetCol.id)\n }\n }\n\n // Append any new columns not in the widget order\n for (const col of columnMap.values()) {\n reordered.push(col)\n }\n\n // If result matches current widget columns, reuse the same array reference\n // to prevent downstream subscribers from detecting a change\n const matchesWidget =\n reordered.length === currentColumns.length &&\n reordered.every((col, i) => col.id === currentColumns[i]?.id)\n\n return { ...config, columns: matchesWidget ? currentColumns : reordered }\n },\n [id],\n )\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const columnIds = useMemo(\n () => columns?.map((col) => col.id) ?? [],\n [columns],\n )\n\n // Register config tool on mount\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: CHANGE_COLUMN_TOOL_ID,\n type: 'config',\n order: 100,\n enabled: true,\n fn: reorderFn,\n })\n return () => widgetStoreActions.unregisterTool(id, CHANGE_COLUMN_TOOL_ID)\n }, [id, reorderFn])\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }, [])\n\n const handleClose = useCallback(() => {\n setAnchorEl(null)\n }, [])\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id || !columns) return\n const oldIndex = columns.findIndex((col) => col.id === active.id)\n const newIndex = columns.findIndex((col) => col.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n const newColumns = arrayMove(columns, oldIndex, newIndex)\n widgetStoreActions.setWidget(id, { columns: newColumns })\n }\n }\n\n // Return null if there are fewer than 2 columns\n if (!columns || columns.length < 2) {\n return null\n }\n\n const tooltipLabel = labels?.tooltip ?? 'Change column'\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-haspopup='true'\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleToggle}\n data-active={isOpen}\n sx={actionButtonStyles.trigger}\n {...IconButtonProps}\n >\n {Icon ?? (\n <SvgIcon>\n <ChangeColumnIcon />\n </SvgIcon>\n )}\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: { overflow: 'hidden' },\n },\n }}\n {...MenuProps}\n >\n <SortableContext\n items={columnIds}\n strategy={verticalListSortingStrategy}\n >\n {columns.map((column) => (\n <SortableColumnItem key={column.id} column={column} />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton } from '@mui/material'\nimport { HighlightAltOutlined } from '@mui/icons-material'\nimport { useEffect, useCallback, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { BrushSelectedItems, BrushToggleProps, BrushState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartBrushConfig } from '../../echart/utils'\nimport type { EchartOptionsProps, EchartWidgetState } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const BRUSH_TOGGLE_TOOL_ID = 'brush-toggle'\n\n/**\n * Widget action to toggle EChart brush selection functionality.\n *\n * Registers as a config pipeline tool so that brush configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Brush state is stored in the widget store root, and the tool derives its\n * `enabled` flag from the store. This keeps state accessible across component instances.\n *\n * When brush is active, users can drag across bars to select a range.\n * Selection clearing is handled via the chart's brush interactions/toolbox configuration.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <BrushToggle\n * id=\"my-widget\"\n * onBrushSelected={(items) => console.log(items)}\n * />\n * ```\n */\nexport function BrushToggle({\n id,\n onBrushSelected,\n labels,\n Icon,\n IconButtonProps,\n}: BrushToggleProps) {\n const selected = useRef<BrushSelectedItems>({ dataIndex: [], seriesIndex: 0 })\n\n // Read brush state from widget store root — single source of truth\n const { brush } = useWidgetSelector(id, (w) => ({\n brush: (w as BrushState | undefined)?.brush ?? false,\n }))\n\n const handleToggle = useCallback(() => {\n const newBrush = !brush\n widgetStoreActions.setWidget(id, { brush: newBrush })\n\n if (newBrush) {\n onBrushSelected?.({ dataIndex: [], seriesIndex: 0 }) // Clear selection when enabling brush\n }\n }, [brush, id, onBrushSelected])\n\n // Re-dispatch brush action after every ECharts render while brush is active\n useEffect(() => {\n if (!brush) return\n\n const instance =\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.instance?.current\n if (!instance) return\n\n const handleRendered = () => {\n const config = getEChartBrushConfig()\n instance.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: {\n brushType: config.brush.brushType,\n brushMode: config.brush.brushMode,\n },\n })\n }\n\n // Dispatch immediately for the initial activation\n handleRendered()\n\n // Re-dispatch after each render (covers setOption with notMerge:true)\n instance.on('rendered', handleRendered)\n\n return () => {\n instance.off('rendered', handleRendered)\n }\n }, [brush, id])\n\n // Handle brushSelected event to capture selected bar indices\n const handleBrushSelected = useCallback((event: unknown) => {\n const brushEvent = event as {\n batch?: {\n selected?: {\n dataIndex?: number[]\n seriesIndex?: number\n }[]\n }[]\n }\n\n const allSelected =\n brushEvent.batch?.flatMap((batchItem) => batchItem.selected ?? []) ?? []\n\n if (!allSelected.length) {\n selected.current = {\n dataIndex: [],\n seriesIndex: 0,\n }\n return\n }\n\n // Use the first seriesIndex as the primary one (matches previous behavior)\n const primarySeriesIndex = allSelected[0]?.seriesIndex ?? 0\n\n const mergedDataIndex = Array.from(\n new Set(\n allSelected\n .filter(\n (item) =>\n item.seriesIndex === undefined ||\n item.seriesIndex === primarySeriesIndex,\n )\n .flatMap((item) => item.dataIndex ?? []),\n ),\n )\n\n selected.current = {\n dataIndex: mergedDataIndex,\n seriesIndex: primarySeriesIndex,\n }\n }, [])\n\n const handleBrushEnd = useCallback(() => {\n onBrushSelected?.(selected.current)\n widgetStoreActions.setWidget(id, { brush: false }) // Disable brush after selection is made\n }, [onBrushSelected, id])\n\n // Register config tool once — fn closure depends on event handlers.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: BRUSH_TOGGLE_TOOL_ID,\n type: 'config',\n order: 25,\n enabled: false,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const brushConfig = getEChartBrushConfig()\n\n const onEvents = {\n ...currentOnEvents,\n brushSelected: handleBrushSelected,\n brushEnd: handleBrushEnd,\n }\n\n return {\n ...config,\n option: {\n ...option,\n ...brushConfig,\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, BRUSH_TOGGLE_TOOL_ID)\n }, [id, handleBrushSelected, handleBrushEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, BRUSH_TOGGLE_TOOL_ID, brush)\n }, [id, brush])\n\n const enableLabel = labels?.enable ?? 'Enable brush selection'\n const disableLabel = labels?.disable ?? 'Disable brush selection'\n const tooltipLabel = brush ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={brush}\n {...IconButtonProps}\n >\n {Icon ?? <HighlightAltOutlined />}\n </IconButton>\n </Tooltip>\n </Box>\n )\n}\n"],"names":["styles","title","container","display","alignItems","justifyContent","gap","content","flexDirection","spacing","EMPTY_DIALOG_CONTENT_PROPS","FullScreen","t0","$","_c","id","labels","children","Icon","IconButtonProps","DialogContentProps","t1","DialogProps","t2","undefined","sx","isFullScreen","useWidgetSelector","_temp","t3","updates","widgetStoreActions","setWidget","updateFullScreenConfig","t4","t5","FullscreenOutlined","t6","IconButton","t7","t8","ariaLabel","t9","t10","t11","Typography","t12","t13","Symbol","for","Close","t14","jsx","t15","DialogTitle","t16","t17","DialogContent","t18","Dialog","t19","w","EMPTY_LABELS","Download","items","data","isDownloading","setIsDownloading","useState","anchorEl","setAnchorEl","event","stopPropagation","currentTarget","handleToggle","data_0","option","link","document","createElement","href","download","filename","style","body","appendChild","click","removeChild","callback","handleDownload","event_0","option_0","result","modifier","handleClick","length","CircularProgress","FileDownloadOutlined","vertical","horizontal","Boolean","paddingBottom","option_1","jsxs","MenuItem","disabled","e","icon","ListItemIcon","color","ListItemText","label","map","Menu","actionButtonStyles","trigger","background","theme","palette","primary","relatedLight","calculateTotal","reduce","total","series","seriesTotal","item","Array","isArray","value","at","Object","entries","itemTotal","key","toRelativeData","index","transformed","RELATIVE_DATA_TOOL_ID","RELATIVE_DATA_CONFIG_TOOL_ID","RelativeData","order","defaultIsRelative","percentFormatterRef","useRef","isRelative","current","getWidget","originalFormatter","formatter","originalMax","max","useEffect","registerTool","enabled","fn","unregisterTool","setToolEnabled","type","currentConfig","config","widget","hasSourceData","sourceData","locale","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","widget_0","newIsRelative","widget_1","tooltipLabel","absolute","relative","PercentOutlined","Tooltip","echartData","ZOOM_TOGGLE_TOOL_ID","ZoomToggle","defaultZoom","defaultZoomStart","defaultZoomEnd","ResetIcon","useTheme","zoom","zoomStart","zoomEnd","zoomEvent","start","batch","end","handleDataZoom","currentOnEvents","onEvents","start_0","end_0","legend","hasLegend","show","sliderHeight","parseInt","zoomConfig","getEChartZoomConfig","inside","xSlider","ySlider","bottomOffset","legendBottomOffset","grid","gridBottom","bottom","dataZoom","triggerToolPipeline","newZoom","handleReset","enableLabel","enable","disableLabel","disable","resetLabel","reset","ZoomInOutlined","t20","SubdirectoryArrowLeftOutlined","t21","Box","GroupedBarChartIcon","STACK_TOGGLE_TOOL_ID","StackToggle","defaultIsStacked","storeIsStacked","bb0","hasMultiSeries","hasStackInSeries","some","_temp2","effectiveDefaultIsStacked","isStacked","_temp4","unstacked","stacked","updatedSeries","_temp3","s_0","existingStack","s","stack","getEChartStackConfig","DEFAULT_STACK_GROUP","LOCK_SELECTION_TOOL_ID","LockSelection","selectedItems","storeIsLocked","isLocked","lockedItems","filterDataByLockedItems","unlock","lock","CheckBoxOutlined","filter","name","includes","SEARCHER_TOOL_ID","DEBOUNCE_DELAY","Searcher","filterFn","TextFieldProps","ClearIcon","debounceDelay","inputRef","debounceTimeoutRef","searchText","prevEnabledRef","defaultFilterFn","text","setSearchText","currentSearchText","disables","clearTimeout","setTimeout","debouncedTriggerPipeline","focus","newValue","target","handleChange","handleClear","placeholder","clearAriaLabel","InputAdornment","SearchOutlined","ClearOutlined","startAdornment","endAdornment","TextField","isSearchEnabled","trim","Promise","resolve","lowerSearch","toLowerCase","values","String","SearcherToggle","defaultEnabled","storeIsEnabled","isEnabled","ChangeColumnIcon","SortableColumnItem","column","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","CSS","Transform","toString","x","opacity","cursor","outline","outlineOffset","main","CHANGE_COLUMN_TOOL_ID","ChangeColumn","MenuProps","columns","currentColumns","configColumns","every","col","i","columnMap","Map","reordered","widgetCol","col_1","get","push","delete","col_2","matchesWidget","col_3","i_0","reorderFn","coordinateGetter","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","columnIds","handleClose","active","over","oldIndex","findIndex","col_5","newIndex","col_6","newColumns","arrayMove","handleDragEnd","tooltip","isOpen","SvgIcon","paper","overflow","SortableContext","verticalListSortingStrategy","DndContext","closestCenter","t22","col_4","col_0","BRUSH_TOGGLE_TOOL_ID","BrushToggle","onBrushSelected","dataIndex","seriesIndex","selected","brush","newBrush","instance","handleRendered","getEChartBrushConfig","dispatchAction","brushOption","brushType","brushMode","on","off","allSelected","flatMap","primarySeriesIndex","mergedDataIndex","from","Set","handleBrushSelected","handleBrushEnd","config_0","brushConfig","brushSelected","brushEnd","HighlightAltOutlined","item_0","batchItem"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -406,6 +406,29 @@ describe('RelativeData', () => {
|
|
|
406
406
|
expect(widget?.formatter).toBeUndefined()
|
|
407
407
|
})
|
|
408
408
|
|
|
409
|
+
test('removes percentage formatter when defaultIsRelative=true and toggling to absolute', async () => {
|
|
410
|
+
// Widget starts with defaultIsRelative=true and no formatter
|
|
411
|
+
useWidgetStore.getState().setWidget(widgetId, { sourceData: mockData })
|
|
412
|
+
|
|
413
|
+
render(<RelativeData id={widgetId} defaultIsRelative />)
|
|
414
|
+
|
|
415
|
+
// Pipeline runs with isRelative=true — applies percentage formatter
|
|
416
|
+
await useWidgetStore.getState().executeConfigPipeline(widgetId, {})
|
|
417
|
+
|
|
418
|
+
let widget = useWidgetStore.getState().getWidget(widgetId)
|
|
419
|
+
expect(widget?.formatter).toBeDefined()
|
|
420
|
+
expect(typeof widget?.formatter).toBe('function')
|
|
421
|
+
|
|
422
|
+
// Toggle to absolute (first toggle is OFF when defaultIsRelative=true)
|
|
423
|
+
const button = screen.getByRole('button')
|
|
424
|
+
fireEvent.click(button)
|
|
425
|
+
|
|
426
|
+
await useWidgetStore.getState().executeConfigPipeline(widgetId, {})
|
|
427
|
+
|
|
428
|
+
widget = useWidgetStore.getState().getWidget(widgetId)
|
|
429
|
+
expect(widget?.formatter).toBeUndefined()
|
|
430
|
+
})
|
|
431
|
+
|
|
409
432
|
test('stores originalFormatter/originalMax in widget root on toggle', () => {
|
|
410
433
|
const customFormatter = (value: number) => `$${value}`
|
|
411
434
|
useWidgetStore
|
|
@@ -50,11 +50,20 @@ export function RelativeData({
|
|
|
50
50
|
(w as RelativeDataState | undefined)?.isRelative ?? defaultIsRelative,
|
|
51
51
|
}))
|
|
52
52
|
|
|
53
|
-
// Initialize store with default value on mount
|
|
53
|
+
// Initialize store with default value on mount.
|
|
54
|
+
// When defaultIsRelative=true, capture originals so toggling OFF can restore them.
|
|
54
55
|
useEffect(() => {
|
|
55
56
|
const current = widgetStoreActions.getWidget<RelativeDataState>(id)
|
|
56
57
|
if (current?.isRelative === undefined) {
|
|
57
|
-
|
|
58
|
+
if (defaultIsRelative) {
|
|
59
|
+
widgetStoreActions.setWidget(id, {
|
|
60
|
+
isRelative: true,
|
|
61
|
+
originalFormatter: current?.formatter,
|
|
62
|
+
originalMax: (current as unknown as Record<string, number>)?.max,
|
|
63
|
+
})
|
|
64
|
+
} else {
|
|
65
|
+
widgetStoreActions.setWidget(id, { isRelative: defaultIsRelative })
|
|
66
|
+
}
|
|
58
67
|
}
|
|
59
68
|
}, [id, defaultIsRelative])
|
|
60
69
|
|