@carto/ps-react-ui 4.11.0 → 4.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{change-column-BiuuHCDN.js → change-column-DjjwoPt1.js} +256 -269
  2. package/dist/change-column-DjjwoPt1.js.map +1 -0
  3. package/dist/{data-zoom-layout--YiY6ko_.js → data-zoom-layout-CkVnm6ej.js} +4 -5
  4. package/dist/{data-zoom-layout--YiY6ko_.js.map → data-zoom-layout-CkVnm6ej.js.map} +1 -1
  5. package/dist/{png-item-CS4z1iSH.js → png-item-BE9uEqlD.js} +2 -2
  6. package/dist/png-item-BE9uEqlD.js.map +1 -0
  7. package/dist/{spread-CPis22AE.js → spread-DYNpzgh_.js} +9 -11
  8. package/dist/{spread-CPis22AE.js.map → spread-DYNpzgh_.js.map} +1 -1
  9. package/dist/{table-CQCAnDLb.js → table-C9IMbTr0.js} +50 -53
  10. package/dist/table-C9IMbTr0.js.map +1 -0
  11. package/dist/widgets-v2/actions.js +2 -2
  12. package/dist/widgets-v2/bar.js +8 -10
  13. package/dist/widgets-v2/bar.js.map +1 -1
  14. package/dist/widgets-v2/category.js +27 -29
  15. package/dist/widgets-v2/category.js.map +1 -1
  16. package/dist/widgets-v2/formula.js +24 -25
  17. package/dist/widgets-v2/formula.js.map +1 -1
  18. package/dist/widgets-v2/histogram.js +10 -13
  19. package/dist/widgets-v2/histogram.js.map +1 -1
  20. package/dist/widgets-v2/markdown.js +25 -27
  21. package/dist/widgets-v2/markdown.js.map +1 -1
  22. package/dist/widgets-v2/pie.js +7 -10
  23. package/dist/widgets-v2/pie.js.map +1 -1
  24. package/dist/widgets-v2/scatterplot.js +9 -12
  25. package/dist/widgets-v2/scatterplot.js.map +1 -1
  26. package/dist/widgets-v2/spread.js +14 -16
  27. package/dist/widgets-v2/spread.js.map +1 -1
  28. package/dist/widgets-v2/table.js +38 -40
  29. package/dist/widgets-v2/table.js.map +1 -1
  30. package/dist/widgets-v2/timeseries.js +8 -11
  31. package/dist/widgets-v2/timeseries.js.map +1 -1
  32. package/dist/widgets-v2/utils.js +1 -1
  33. package/dist/widgets-v2.js +42 -45
  34. package/dist/widgets-v2.js.map +1 -1
  35. package/package.json +3 -3
  36. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +1 -1
  37. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +1 -1
  38. package/src/widgets-v2/actions/download/download.tsx +1 -1
  39. package/src/widgets-v2/actions/download/icons.tsx +1 -1
  40. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +3 -3
  41. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +2 -2
  42. package/src/widgets-v2/actions/relative-data/relative-data.tsx +1 -1
  43. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +1 -1
  44. package/src/widgets-v2/actions/searcher/searcher.tsx +2 -2
  45. package/src/widgets-v2/actions/show-all/show-all.tsx +1 -1
  46. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +1 -1
  47. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +1 -1
  48. package/src/widgets-v2/table/table-ui.tsx +4 -4
  49. package/src/widgets-v2/toolbox/toolbox.tsx +1 -1
  50. package/src/widgets-v2/wrapper/widget-wrapper.tsx +1 -1
  51. package/dist/change-column-BiuuHCDN.js.map +0 -1
  52. package/dist/png-item-CS4z1iSH.js.map +0 -1
  53. package/dist/table-CQCAnDLb.js.map +0 -1
@@ -5,10 +5,7 @@ import { u as be } from "./widget-context-DTGO0Yta.js";
5
5
  import { v as ye, u as Ce, i as fe } from "./widget-store-registry-_W4Z4xp-.js";
6
6
  import "zustand";
7
7
  import { Box as pe, TableCell as ne, Checkbox as ue, TableRow as ge, TablePagination as Pe, TableSortLabel as we, TableHead as xe, TableBody as ze, TableContainer as Ae, Table as ke, IconButton as se } from "@mui/material";
8
- import Te from "@mui/icons-material/FirstPage";
9
- import Re from "@mui/icons-material/KeyboardArrowLeft";
10
- import Ie from "@mui/icons-material/KeyboardArrowRight";
11
- import Oe from "@mui/icons-material/LastPage";
8
+ import { FirstPage as Te, KeyboardArrowLeft as Re, KeyboardArrowRight as Ie, LastPage as Oe } from "@mui/icons-material";
12
9
  const Ee = {
13
10
  fontWeight: 600,
14
11
  color: "text.primary"
@@ -69,7 +66,7 @@ function je(t) {
69
66
  columns: i,
70
67
  rows: n,
71
68
  total: c,
72
- page: l,
69
+ page: r,
73
70
  pageSize: g,
74
71
  pageSizeOptions: p,
75
72
  sort: d,
@@ -86,7 +83,7 @@ function je(t) {
86
83
  emptyContent: D,
87
84
  size: a
88
85
  } = t, O = p === void 0 ? $e : p, E = M === void 0 ? "id" : M, x = j === void 0 ? !1 : j;
89
- process.env.NODE_ENV !== "production" && n.some((r) => r[E] == null) && console.error(`<TableUI>: rows are missing the identity column \`${E}\`. Set the \`keyColumn\` prop to a column present on every row, or add the column to the data.`);
86
+ process.env.NODE_ENV !== "production" && n.some((l) => l[E] == null) && console.error(`<TableUI>: rows are missing the identity column \`${E}\`. Set the \`keyColumn\` prop to a column present on every row, or add the column to the data.`);
90
87
  let N;
91
88
  e[0] !== R ? (N = {
92
89
  ...ve,
@@ -102,7 +99,7 @@ function je(t) {
102
99
  e[6] !== z ? (B = new Set(z), e[6] = z, e[7] = B) : B = e[7];
103
100
  const y = B;
104
101
  let s;
105
- e[8] !== E ? (s = (o, r) => o[E] ?? r, e[8] = E, e[9] = s) : s = e[9];
102
+ e[8] !== E ? (s = (o, l) => o[E] ?? l, e[8] = E, e[9] = s) : s = e[9];
106
103
  const I = s;
107
104
  let W;
108
105
  e[10] !== I || e[11] !== n ? (W = n.map(I), e[10] = I, e[11] = n, e[12] = W) : W = e[12];
@@ -131,20 +128,20 @@ function je(t) {
131
128
  C((u ?? []).filter((o) => !S.includes(o)));
132
129
  else {
133
130
  const o = new Set(u ?? []);
134
- for (const r of S)
135
- o.add(r);
131
+ for (const l of S)
132
+ o.add(l);
136
133
  C([...o]);
137
134
  }
138
135
  }, e[24] = P, e[25] = C, e[26] = S, e[27] = u, e[28] = ie) : ie = e[28];
139
136
  const ce = ie;
140
- let re;
141
- e[29] !== C || e[30] !== u ? (re = (o) => {
137
+ let le;
138
+ e[29] !== C || e[30] !== u ? (le = (o) => {
142
139
  if (!C)
143
140
  return;
144
- const r = new Set(u ?? []);
145
- r.has(o) ? r.delete(o) : r.add(o), C([...r]);
146
- }, e[29] = C, e[30] = u, e[31] = re) : re = e[31];
147
- const de = re;
141
+ const l = new Set(u ?? []);
142
+ l.has(o) ? l.delete(o) : l.add(o), C([...l]);
143
+ }, e[29] = C, e[30] = u, e[31] = le) : le = e[31];
144
+ const de = le;
148
145
  let G;
149
146
  e[32] !== h || e[33] !== P || e[34] !== ce || e[35] !== x || e[36] !== ae ? (G = x ? /* @__PURE__ */ f(ne, { padding: "checkbox", sx: $.headerCell, children: /* @__PURE__ */ f(ue, { checked: P, indeterminate: ae, onChange: ce, inputProps: {
150
147
  "aria-label": h.selectAll
@@ -152,11 +149,11 @@ function je(t) {
152
149
  let K;
153
150
  if (e[38] !== i || e[39] !== te || e[40] !== b || e[41] !== d?.columnId || e[42] !== d?.direction) {
154
151
  let o;
155
- e[44] !== te || e[45] !== b || e[46] !== d?.columnId || e[47] !== d?.direction ? (o = (r) => {
156
- const k = d?.columnId === r.id, J = k ? d?.direction : void 0;
157
- return /* @__PURE__ */ f(ne, { align: r.align, sortDirection: J, sx: $.headerCell, style: r.width != null ? {
158
- width: r.width
159
- } : void 0, children: r.sortable && b ? /* @__PURE__ */ f(we, { active: k, direction: J ?? "asc", onClick: () => te(r.id), children: r.label }) : r.label }, r.id);
152
+ e[44] !== te || e[45] !== b || e[46] !== d?.columnId || e[47] !== d?.direction ? (o = (l) => {
153
+ const k = d?.columnId === l.id, J = k ? d?.direction : void 0;
154
+ return /* @__PURE__ */ f(ne, { align: l.align, sortDirection: J, sx: $.headerCell, style: l.width != null ? {
155
+ width: l.width
156
+ } : void 0, children: l.sortable && b ? /* @__PURE__ */ f(we, { active: k, direction: J ?? "asc", onClick: () => te(l.id), children: l.label }) : l.label }, l.id);
160
157
  }, e[44] = te, e[45] = b, e[46] = d?.columnId, e[47] = d?.direction, e[48] = o) : o = e[48], K = i.map(o), e[38] = i, e[39] = te, e[40] = b, e[41] = d?.columnId, e[42] = d?.direction, e[43] = K;
161
158
  } else
162
159
  K = e[43];
@@ -166,8 +163,8 @@ function je(t) {
166
163
  K
167
164
  ] }) }), e[49] = G, e[50] = K, e[51] = Z) : Z = e[51];
168
165
  let X;
169
- e[52] !== h || e[53] !== i || e[54] !== D || e[55] !== de || e[56] !== V || e[57] !== m || e[58] !== I || e[59] !== n || e[60] !== x || e[61] !== y ? (X = n.length === 0 ? /* @__PURE__ */ f(ge, { children: /* @__PURE__ */ f(ne, { colSpan: i.length + (x ? 1 : 0), sx: $.empty, children: D ?? null }) }) : n.map((o, r) => {
170
- const k = I(o, r), J = y.has(k);
166
+ e[52] !== h || e[53] !== i || e[54] !== D || e[55] !== de || e[56] !== V || e[57] !== m || e[58] !== I || e[59] !== n || e[60] !== x || e[61] !== y ? (X = n.length === 0 ? /* @__PURE__ */ f(ge, { children: /* @__PURE__ */ f(ne, { colSpan: i.length + (x ? 1 : 0), sx: $.empty, children: D ?? null }) }) : n.map((o, l) => {
167
+ const k = I(o, l), J = y.has(k);
171
168
  return /* @__PURE__ */ ee(ge, { hover: !0, selected: J, onClick: () => V?.(o), onMouseEnter: () => m?.(o), onMouseLeave: () => m?.(null), sx: {
172
169
  ...$.row,
173
170
  ...V ? $.rowClickable : null
@@ -188,22 +185,22 @@ function je(t) {
188
185
  q
189
186
  ] }) }), e[65] = a, e[66] = Z, e[67] = q, e[68] = Q) : Q = e[68];
190
187
  let Y;
191
- e[69] !== U || e[70] !== h || e[71] !== T || e[72] !== w || e[73] !== l || e[74] !== g || e[75] !== O || e[76] !== H || e[77] !== c ? (Y = H ? /* @__PURE__ */ f(Pe, { component: "div", count: c, page: l, rowsPerPage: g, rowsPerPageOptions: [...O], onPageChange: (o, r) => T?.(r), onRowsPerPageChange: (o) => {
192
- const r = parseInt(o.target.value, 10);
193
- w?.(r);
188
+ e[69] !== U || e[70] !== h || e[71] !== T || e[72] !== w || e[73] !== r || e[74] !== g || e[75] !== O || e[76] !== H || e[77] !== c ? (Y = H ? /* @__PURE__ */ f(Pe, { component: "div", count: c, page: r, rowsPerPage: g, rowsPerPageOptions: [...O], onPageChange: (o, l) => T?.(l), onRowsPerPageChange: (o) => {
189
+ const l = parseInt(o.target.value, 10);
190
+ w?.(l);
194
191
  }, labelRowsPerPage: h.rowsPerPage, labelDisplayedRows: (o) => {
195
192
  const {
196
- from: r,
193
+ from: l,
197
194
  to: k,
198
195
  count: J
199
196
  } = o;
200
- return h.paginationOf(r, k, J);
201
- }, ActionsComponent: U, sx: $.pagination }) : null, e[69] = U, e[70] = h, e[71] = T, e[72] = w, e[73] = l, e[74] = g, e[75] = O, e[76] = H, e[77] = c, e[78] = Y) : Y = e[78];
202
- let le;
203
- return e[79] !== Q || e[80] !== Y ? (le = /* @__PURE__ */ ee(pe, { sx: $.container, children: [
197
+ return h.paginationOf(l, k, J);
198
+ }, ActionsComponent: U, sx: $.pagination }) : null, e[69] = U, e[70] = h, e[71] = T, e[72] = w, e[73] = r, e[74] = g, e[75] = O, e[76] = H, e[77] = c, e[78] = Y) : Y = e[78];
199
+ let re;
200
+ return e[79] !== Q || e[80] !== Y ? (re = /* @__PURE__ */ ee(pe, { sx: $.container, children: [
204
201
  Q,
205
202
  Y
206
- ] }), e[79] = Q, e[80] = Y, e[81] = le) : le = e[81], le;
203
+ ] }), e[79] = Q, e[80] = Y, e[81] = re) : re = e[81], re;
207
204
  }
208
205
  function De(t) {
209
206
  return t == null ? "" : typeof t == "string" || typeof t == "number" ? t : typeof t == "boolean" ? String(t) : Array.isArray(t) || typeof t == "object" ? JSON.stringify(t) : "";
@@ -213,14 +210,14 @@ function Ne(t) {
213
210
  count: i,
214
211
  page: n,
215
212
  rowsPerPage: c,
216
- onPageChange: l
213
+ onPageChange: r
217
214
  }) {
218
215
  const g = Math.max(0, Math.ceil(i / c) - 1);
219
216
  return /* @__PURE__ */ ee(pe, { sx: $.paginationActions, children: [
220
- /* @__PURE__ */ f(se, { size: "small", onClick: (p) => l(p, 0), disabled: n === 0, "aria-label": t.firstPage, children: /* @__PURE__ */ f(Te, { fontSize: "small" }) }),
221
- /* @__PURE__ */ f(se, { size: "small", onClick: (p) => l(p, n - 1), disabled: n === 0, "aria-label": t.previousPage, children: /* @__PURE__ */ f(Re, { fontSize: "small" }) }),
222
- /* @__PURE__ */ f(se, { size: "small", onClick: (p) => l(p, n + 1), disabled: n >= g, "aria-label": t.nextPage, children: /* @__PURE__ */ f(Ie, { fontSize: "small" }) }),
223
- /* @__PURE__ */ f(se, { size: "small", onClick: (p) => l(p, g), disabled: n >= g, "aria-label": t.lastPage, children: /* @__PURE__ */ f(Oe, { fontSize: "small" }) })
217
+ /* @__PURE__ */ f(se, { size: "small", onClick: (p) => r(p, 0), disabled: n === 0, "aria-label": t.firstPage, children: /* @__PURE__ */ f(Te, { fontSize: "small" }) }),
218
+ /* @__PURE__ */ f(se, { size: "small", onClick: (p) => r(p, n - 1), disabled: n === 0, "aria-label": t.previousPage, children: /* @__PURE__ */ f(Re, { fontSize: "small" }) }),
219
+ /* @__PURE__ */ f(se, { size: "small", onClick: (p) => r(p, n + 1), disabled: n >= g, "aria-label": t.nextPage, children: /* @__PURE__ */ f(Ie, { fontSize: "small" }) }),
220
+ /* @__PURE__ */ f(se, { size: "small", onClick: (p) => r(p, g), disabled: n >= g, "aria-label": t.lastPage, children: /* @__PURE__ */ f(Oe, { fontSize: "small" }) })
224
221
  ] });
225
222
  };
226
223
  }
@@ -241,13 +238,13 @@ function Fe(t, e, i) {
241
238
  }
242
239
  function Me(t, e) {
243
240
  if (!e || e.length === 0) return t;
244
- const i = new Map(t.map((l) => [l.id, l])), n = [], c = /* @__PURE__ */ new Set();
245
- for (const l of e) {
246
- const g = i.get(l);
247
- g && !c.has(l) && (n.push(g), c.add(l));
241
+ const i = new Map(t.map((r) => [r.id, r])), n = [], c = /* @__PURE__ */ new Set();
242
+ for (const r of e) {
243
+ const g = i.get(r);
244
+ g && !c.has(r) && (n.push(g), c.add(r));
248
245
  }
249
- for (const l of t)
250
- c.has(l.id) || n.push(l);
246
+ for (const r of t)
247
+ c.has(r.id) || n.push(r);
251
248
  return n;
252
249
  }
253
250
  function He(t, e) {
@@ -257,11 +254,11 @@ function He(t, e) {
257
254
  visible: n
258
255
  };
259
256
  }
260
- function ot(t, e) {
257
+ function et(t, e) {
261
258
  const n = [e.map((c) => he(Ue(c.label))).join(",")];
262
259
  for (const c of t) {
263
- const l = e.map((g) => he(Je(c[g.id])));
264
- n.push(l.join(","));
260
+ const r = e.map((g) => he(Je(c[g.id])));
261
+ n.push(r.join(","));
265
262
  }
266
263
  return n.join(`
267
264
  `);
@@ -275,16 +272,16 @@ function Ue(t) {
275
272
  function Je(t) {
276
273
  return t == null ? "" : typeof t == "string" ? t : typeof t == "number" || typeof t == "boolean" ? String(t) : Array.isArray(t) || typeof t == "object" ? JSON.stringify(t) : "";
277
274
  }
278
- function it(t) {
275
+ function tt(t) {
279
276
  const e = me(57);
280
- let i, n, c, l, g, p, d, M, u, j, b, T, w;
277
+ let i, n, c, r, g, p, d, M, u, j, b, T, w;
281
278
  e[0] !== t ? ({
282
279
  columns: i,
283
280
  visibleColumns: w,
284
281
  initialPageSize: j,
285
282
  selection: u,
286
283
  onSelectionChange: p,
287
- onRowClick: l,
284
+ onRowClick: r,
288
285
  onRowHover: g,
289
286
  remote: b,
290
287
  total: M,
@@ -292,7 +289,7 @@ function it(t) {
292
289
  onPageChange: n,
293
290
  onPageSizeChange: c,
294
291
  ...T
295
- } = t, e[0] = t, e[1] = i, e[2] = n, e[3] = c, e[4] = l, e[5] = g, e[6] = p, e[7] = d, e[8] = M, e[9] = u, e[10] = j, e[11] = b, e[12] = T, e[13] = w) : (i = e[1], n = e[2], c = e[3], l = e[4], g = e[5], p = e[6], d = e[7], M = e[8], u = e[9], j = e[10], b = e[11], T = e[12], w = e[13]);
292
+ } = t, e[0] = t, e[1] = i, e[2] = n, e[3] = c, e[4] = r, e[5] = g, e[6] = p, e[7] = d, e[8] = M, e[9] = u, e[10] = j, e[11] = b, e[12] = T, e[13] = w) : (i = e[1], n = e[2], c = e[3], r = e[4], g = e[5], p = e[6], d = e[7], M = e[8], u = e[9], j = e[10], b = e[11], T = e[12], w = e[13]);
296
293
  const C = j === void 0 ? Le : j, V = b === void 0 ? !1 : b, m = be(), R = ye(m, Ve);
297
294
  let D;
298
295
  e[14] !== C ? (D = (s) => ({
@@ -366,14 +363,14 @@ function it(t) {
366
363
  }, e[39] = m, e[40] = c, e[41] = z) : z = e[41];
367
364
  const B = z;
368
365
  let y;
369
- return e[42] !== U || e[43] !== B || e[44] !== H || e[45] !== l || e[46] !== g || e[47] !== p || e[48] !== E || e[49] !== N || e[50] !== u || e[51] !== h || e[52] !== a.page || e[53] !== a.pageSize || e[54] !== a.sort || e[55] !== T ? (y = /* @__PURE__ */ f(je, { ...T, columns: E, rows: N, total: h, page: a.page, pageSize: a.pageSize, sort: a.sort, selection: u, onSortChange: H, onPageChange: U, onPageSizeChange: B, onSelectionChange: p, onRowClick: l, onRowHover: g }), e[42] = U, e[43] = B, e[44] = H, e[45] = l, e[46] = g, e[47] = p, e[48] = E, e[49] = N, e[50] = u, e[51] = h, e[52] = a.page, e[53] = a.pageSize, e[54] = a.sort, e[55] = T, e[56] = y) : y = e[56], y;
366
+ return e[42] !== U || e[43] !== B || e[44] !== H || e[45] !== r || e[46] !== g || e[47] !== p || e[48] !== E || e[49] !== N || e[50] !== u || e[51] !== h || e[52] !== a.page || e[53] !== a.pageSize || e[54] !== a.sort || e[55] !== T ? (y = /* @__PURE__ */ f(je, { ...T, columns: E, rows: N, total: h, page: a.page, pageSize: a.pageSize, sort: a.sort, selection: u, onSortChange: H, onPageChange: U, onPageSizeChange: B, onSelectionChange: p, onRowClick: r, onRowHover: g }), e[42] = U, e[43] = B, e[44] = H, e[45] = r, e[46] = g, e[47] = p, e[48] = E, e[49] = N, e[50] = u, e[51] = h, e[52] = a.page, e[53] = a.pageSize, e[54] = a.sort, e[55] = T, e[56] = y) : y = e[56], y;
370
367
  }
371
368
  function Ve(t) {
372
369
  return t.data;
373
370
  }
374
371
  export {
375
372
  ve as D,
376
- it as T,
373
+ tt as T,
377
374
  Le as a,
378
375
  $e as b,
379
376
  je as c,
@@ -383,6 +380,6 @@ export {
383
380
  Fe as p,
384
381
  Me as r,
385
382
  $ as s,
386
- ot as t
383
+ et as t
387
384
  };
388
- //# sourceMappingURL=table-CQCAnDLb.js.map
385
+ //# sourceMappingURL=table-C9IMbTr0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-C9IMbTr0.js","sources":["../src/widgets-v2/table/labels.tsx","../src/widgets-v2/table/types.ts","../src/widgets-v2/table/style.ts","../src/widgets-v2/table/table-ui.tsx","../src/widgets-v2/table/helpers.ts","../src/widgets-v2/table/table.tsx"],"sourcesContent":["import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface TableLabels {\n selectAll: string\n selectRow: (rowId: string | number) => string\n rowsPerPage: string\n /**\n * Renders the displayed-rows summary in the pagination footer. Returns\n * a `ReactNode` so the default can emphasise the active range\n * (`from-to`) with a bolder weight while keeping the trailing\n * ` of total` muted. Override to localise wording or restyle.\n */\n paginationOf: (from: number, to: number, total: number) => ReactNode\n /** aria-label for the first-page pagination button. */\n firstPage: string\n /** aria-label for the previous-page pagination button. */\n previousPage: string\n /** aria-label for the next-page pagination button. */\n nextPage: string\n /** aria-label for the last-page pagination button. */\n lastPage: string\n}\n\nconst boldRange: SxProps<Theme> = { fontWeight: 600, color: 'text.primary' }\n\nexport const DEFAULT_TABLE_LABELS: TableLabels = {\n selectAll: 'Select all rows',\n selectRow: (id) => `Select row ${id}`,\n rowsPerPage: 'Rows per page:',\n paginationOf: (from, to, total) => (\n <>\n <Box component='span' sx={boldRange}>{`${from}–${to}`}</Box>\n {` of ${total}`}\n </>\n ),\n firstPage: 'First page',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n lastPage: 'Last page',\n}\n","import type { ReactNode } from 'react'\nimport type { WidgetState } from '../stores'\n\n/**\n * Single row of tabular data.\n *\n * The default row-identity column is `id`. Consumers that don't have a\n * literal `id` field can point `<Table>` / `<TableUI>` at a different\n * column via the `keyColumn` prop; the library reads `row[keyColumn]`\n * for selection lookup, React keys, and aria labels.\n */\nexport interface TableRow extends Record<string, unknown> {\n /**\n * Default row identity. Required when no `keyColumn` is configured.\n * Omit when wiring `keyColumn` to a different column.\n */\n id?: string | number\n}\n\nexport type TableWidgetData = readonly TableRow[]\n\nexport type TableSortDirection = 'asc' | 'desc'\n\nexport interface TableSortState {\n columnId: string | null\n direction: TableSortDirection\n}\n\nexport interface TableColumn {\n /** Unique column identifier; matches the field name on each row. */\n id: string\n /** Header label. */\n label: ReactNode\n align?: 'left' | 'center' | 'right'\n width?: number | string\n sortable?: boolean\n /** Custom cell renderer. Falls back to a string-cast of the raw value. */\n formatter?: (value: unknown, row: TableRow) => ReactNode\n}\n\n/**\n * State extension carrying Table-specific UI state on the per-widget store.\n * Per R12: widget-specific UI state lives in widget-specific extensions of\n * `WidgetState`, not on the base type.\n */\nexport interface TableWidgetState extends WidgetState {\n /** Optional reordered column list driven by ChangeColumn. Falls back to props. */\n columnOrder?: readonly string[]\n sort?: TableSortState\n page: number\n pageSize: number\n}\n\nexport const DEFAULT_TABLE_PAGE_SIZE = 10\nexport const DEFAULT_TABLE_PAGE_SIZE_OPTIONS = [10, 25, 50, 100] as const\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n width: '100%',\n overflowX: 'auto',\n },\n\n table: {\n minWidth: 0,\n },\n headerCell: {\n fontWeight: 600,\n backgroundColor: 'background.paper',\n },\n /**\n * Strip the bottom border from the last body row so the body flushes\n * against the pagination border instead of doubling it up. Mirrors v1.\n */\n row: {\n '&:last-child td, &:last-child th': {\n border: 0,\n },\n },\n rowClickable: {\n cursor: 'pointer',\n },\n pagination: {\n borderTop: '1px solid',\n borderColor: 'divider',\n },\n paginationActions: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n ml: 1,\n },\n empty: {\n textAlign: 'center',\n color: 'text.secondary',\n py: 3,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, useMemo } from 'react'\nimport {\n Box,\n Checkbox,\n IconButton,\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow as MuiTableRow,\n TableSortLabel,\n type TableProps as MuiTableProps,\n} from '@mui/material'\nimport type { TablePaginationActionsProps } from '@mui/material/TablePagination/TablePaginationActions'\nimport { FirstPage as FirstPageIcon } from '@mui/icons-material'\nimport { KeyboardArrowLeft } from '@mui/icons-material'\nimport { KeyboardArrowRight } from '@mui/icons-material'\nimport { LastPage as LastPageIcon } from '@mui/icons-material'\nimport { DEFAULT_TABLE_LABELS, type TableLabels } from './labels'\nimport {\n DEFAULT_TABLE_PAGE_SIZE_OPTIONS,\n type TableColumn,\n type TableRow,\n type TableSortDirection,\n type TableSortState,\n} from './types'\nimport { styles } from './style'\n\nexport interface TableUIProps<T extends TableRow = TableRow> {\n columns: readonly TableColumn[]\n /** Already-paginated, already-sorted rows for the current view. */\n rows: readonly T[]\n /** Total row count (across all pages). Required for pagination footer. */\n total: number\n page: number\n pageSize: number\n pageSizeOptions?: readonly number[]\n sort?: TableSortState\n /**\n * Column name to use as the row identity. Drives selection lookup,\n * React keys, and aria labels. Defaults to `'id'` — point it at\n * another column when your rows don't carry an `id` field.\n */\n keyColumn?: string\n /** Selected row ids. Destination-owned. */\n selection?: readonly (string | number)[]\n selectable?: boolean\n onSortChange?: (next: TableSortState) => void\n onPageChange?: (page: number) => void\n onPageSizeChange?: (pageSize: number) => void\n onSelectionChange?: (next: readonly (string | number)[]) => void\n onRowClick?: (row: T) => void\n onRowHover?: (row: T | null) => void\n labels?: Partial<TableLabels>\n /** Row rendered when `rows` is empty for the current page. */\n emptyContent?: React.ReactNode\n /**\n * Forwarded to MUI's `<Table size>` — `'small'` for compact rows,\n * `'medium'` for the default density. Leave `undefined` (the default)\n * to let MUI's own default kick in.\n */\n size?: MuiTableProps['size']\n}\n\n/**\n * Pure renderer for a paginated, sortable, optionally-selectable table.\n * Has no widget-store coupling — `<Table>` (the bridge) reads from the store\n * and feeds this UI with already-projected data.\n */\nexport function TableUI<T extends TableRow = TableRow>({\n columns,\n rows,\n total,\n page,\n pageSize,\n pageSizeOptions = DEFAULT_TABLE_PAGE_SIZE_OPTIONS,\n sort,\n keyColumn = 'id',\n selection,\n selectable = false,\n onSortChange,\n onPageChange,\n onPageSizeChange,\n onSelectionChange,\n onRowClick,\n onRowHover,\n labels,\n emptyContent,\n size,\n}: TableUIProps<T>) {\n if (process.env.NODE_ENV !== 'production') {\n // Dev-time guard: a nullish identity collapses every row into the\n // same selection-set entry, which manifests as \"click one → all\n // appear selected\". Surface it loudly instead of silently degrading.\n const missing = rows.some((r) => r[keyColumn] == null)\n if (missing) {\n // eslint-disable-next-line no-console\n console.error(\n `<TableUI>: rows are missing the identity column \\`${keyColumn}\\`. ` +\n 'Set the `keyColumn` prop to a column present on every row, or ' +\n 'add the column to the data.',\n )\n }\n }\n const _labels = useMemo(\n () => ({ ...DEFAULT_TABLE_LABELS, ...labels }),\n [labels],\n )\n // Auto-hide the pagination footer when every row already fits in the\n // smallest available page size — the Rows-per-page selector + prev /\n // next buttons would just be inert noise. Consumers force the footer\n // on by passing a smaller `pageSizeOptions[0]` than `total`.\n const minPageSize = Math.min(...pageSizeOptions)\n const showPagination = total > minPageSize\n // Own the `ActionsComponent` slot ourselves so the Meridian theme's\n // `theme.components.MuiTablePagination.defaultProps.ActionsComponent`\n // (which depends on `react-intl`) doesn't leak into the library. The\n // MUI / Meridian style overrides for `MuiIconButton` /\n // `MuiTablePagination` still apply.\n const PaginationActions = useMemo(\n () => makePaginationActions(_labels),\n [_labels],\n )\n const selectionSet = useMemo(\n () => new Set<string | number>(selection ?? []),\n [selection],\n )\n // Resolve each row's identity from `keyColumn`, falling back to the row's\n // index when the cell is nullish. The dev-time guard above surfaces the\n // misconfiguration loudly, but in production we must NOT collapse every\n // nullish-keyed row into the same selection-set entry (that's the\n // \"click one → all selected\" bug) — a per-index fallback keeps ids\n // distinct and React keys stable for a given page.\n const resolveRowId = useCallback(\n (row: T, index: number): string | number =>\n (row[keyColumn] ?? index) as string | number,\n [keyColumn],\n )\n const pageRowIds = useMemo(() => rows.map(resolveRowId), [rows, resolveRowId])\n const allOnPageSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => selectionSet.has(id))\n const someOnPageSelected =\n !allOnPageSelected && pageRowIds.some((id) => selectionSet.has(id))\n\n const handleSort = (columnId: string) => {\n if (!onSortChange) return\n const sameCol = sort?.columnId === columnId\n const nextDir: TableSortDirection =\n sameCol && sort?.direction === 'asc' ? 'desc' : 'asc'\n onSortChange({ columnId, direction: nextDir })\n }\n\n const handleSelectAllOnPage = () => {\n if (!onSelectionChange) return\n if (allOnPageSelected) {\n onSelectionChange(\n (selection ?? []).filter((id) => !pageRowIds.includes(id)),\n )\n } else {\n const merged = new Set<string | number>(selection ?? [])\n for (const id of pageRowIds) merged.add(id)\n onSelectionChange([...merged])\n }\n }\n\n const handleSelectRow = (rowId: string | number) => {\n if (!onSelectionChange) return\n const next = new Set<string | number>(selection ?? [])\n if (next.has(rowId)) next.delete(rowId)\n else next.add(rowId)\n onSelectionChange([...next])\n }\n\n return (\n <Box sx={styles.container}>\n <TableContainer>\n <MuiTable stickyHeader size={size} sx={styles.table}>\n <TableHead>\n <MuiTableRow>\n {selectable ? (\n <TableCell padding='checkbox' sx={styles.headerCell}>\n <Checkbox\n checked={allOnPageSelected}\n indeterminate={someOnPageSelected}\n onChange={handleSelectAllOnPage}\n inputProps={{ 'aria-label': _labels.selectAll }}\n />\n </TableCell>\n ) : null}\n {columns.map((column) => {\n const isSorted = sort?.columnId === column.id\n const direction = isSorted ? sort?.direction : undefined\n return (\n <TableCell\n key={column.id}\n align={column.align}\n sortDirection={direction}\n sx={styles.headerCell}\n style={\n column.width != null ? { width: column.width } : undefined\n }\n >\n {column.sortable && onSortChange ? (\n <TableSortLabel\n active={isSorted}\n direction={direction ?? 'asc'}\n onClick={() => handleSort(column.id)}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n )\n })}\n </MuiTableRow>\n </TableHead>\n <TableBody>\n {rows.length === 0 ? (\n <MuiTableRow>\n <TableCell\n colSpan={columns.length + (selectable ? 1 : 0)}\n sx={styles.empty}\n >\n {emptyContent ?? null}\n </TableCell>\n </MuiTableRow>\n ) : (\n rows.map((row, index) => {\n const rowId = resolveRowId(row, index)\n const isSelected = selectionSet.has(rowId)\n return (\n <MuiTableRow\n key={rowId}\n hover\n selected={isSelected}\n onClick={() => onRowClick?.(row)}\n onMouseEnter={() => onRowHover?.(row)}\n onMouseLeave={() => onRowHover?.(null)}\n sx={{\n ...styles.row,\n ...(onRowClick ? styles.rowClickable : null),\n }}\n >\n {selectable ? (\n <TableCell padding='checkbox'>\n <Checkbox\n checked={isSelected}\n onClick={(e) => {\n e.stopPropagation()\n handleSelectRow(rowId)\n }}\n inputProps={{\n 'aria-label': _labels.selectRow(rowId),\n }}\n />\n </TableCell>\n ) : null}\n {columns.map((column) => (\n <TableCell key={column.id} align={column.align}>\n {column.formatter\n ? column.formatter(row[column.id], row)\n : stringifyCell(row[column.id])}\n </TableCell>\n ))}\n </MuiTableRow>\n )\n })\n )}\n </TableBody>\n </MuiTable>\n </TableContainer>\n {showPagination ? (\n <TablePagination\n component='div'\n count={total}\n page={page}\n rowsPerPage={pageSize}\n rowsPerPageOptions={[...pageSizeOptions]}\n onPageChange={(_, next) => onPageChange?.(next)}\n onRowsPerPageChange={(e) => {\n const next = parseInt(e.target.value, 10)\n onPageSizeChange?.(next)\n }}\n labelRowsPerPage={_labels.rowsPerPage}\n labelDisplayedRows={({ from, to, count }) =>\n _labels.paginationOf(from, to, count)\n }\n ActionsComponent={PaginationActions}\n sx={styles.pagination}\n />\n ) : null}\n </Box>\n )\n}\n\nfunction stringifyCell(value: unknown): React.ReactNode {\n if (value == null) return ''\n if (typeof value === 'string' || typeof value === 'number') return value\n if (typeof value === 'boolean') return String(value)\n if (Array.isArray(value) || typeof value === 'object') {\n return JSON.stringify(value)\n }\n return ''\n}\n\n/**\n * Build the `ActionsComponent` used by `<TablePagination>` — four MUI\n * `IconButton`s for first / previous / next / last. We provide this\n * ourselves so the Meridian theme's `defaultProps.ActionsComponent`\n * (which depends on `react-intl`) is bypassed at the call site without\n * disturbing the rest of the Meridian theme. The factory closes over\n * the merged label set so aria-labels stay consistent with the rest\n * of the table's i18n surface.\n */\nfunction makePaginationActions(labels: TableLabels) {\n return function PaginationActions({\n count,\n page,\n rowsPerPage,\n onPageChange,\n }: TablePaginationActionsProps) {\n const lastPage = Math.max(0, Math.ceil(count / rowsPerPage) - 1)\n return (\n <Box sx={styles.paginationActions}>\n <IconButton\n size='small'\n onClick={(e) => onPageChange(e, 0)}\n disabled={page === 0}\n aria-label={labels.firstPage}\n >\n <FirstPageIcon fontSize='small' />\n </IconButton>\n <IconButton\n size='small'\n onClick={(e) => onPageChange(e, page - 1)}\n disabled={page === 0}\n aria-label={labels.previousPage}\n >\n <KeyboardArrowLeft fontSize='small' />\n </IconButton>\n <IconButton\n size='small'\n onClick={(e) => onPageChange(e, page + 1)}\n disabled={page >= lastPage}\n aria-label={labels.nextPage}\n >\n <KeyboardArrowRight fontSize='small' />\n </IconButton>\n <IconButton\n size='small'\n onClick={(e) => onPageChange(e, lastPage)}\n disabled={page >= lastPage}\n aria-label={labels.lastPage}\n >\n <LastPageIcon fontSize='small' />\n </IconButton>\n </Box>\n )\n }\n}\n","import type {\n TableColumn,\n TableRow,\n TableSortDirection,\n TableWidgetData,\n} from './types'\n\n/**\n * Compares two values with a consistent ordering across primitive types.\n * Strings use locale comparison; numbers subtract; booleans rank false < true;\n * objects/arrays compare by JSON serialization. Null/undefined sort to the end\n * regardless of direction.\n */\nexport function compareValues(\n a: unknown,\n b: unknown,\n direction: TableSortDirection,\n): number {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n let cmp = 0\n if (typeof a === 'string' && typeof b === 'string') {\n cmp = a.localeCompare(b)\n } else if (typeof a === 'number' && typeof b === 'number') {\n cmp = a - b\n } else if (typeof a === 'boolean' && typeof b === 'boolean') {\n cmp = a === b ? 0 : a ? 1 : -1\n } else if (typeof a === 'object' || typeof b === 'object') {\n cmp = JSON.stringify(a).localeCompare(JSON.stringify(b))\n }\n return direction === 'asc' ? cmp : -cmp\n}\n\n/** Returns a new array sorted by the named column. Does not mutate the input. */\nexport function sortRows<T extends TableRow>(\n rows: readonly T[],\n columnId: string,\n direction: TableSortDirection,\n): T[] {\n return [...rows].sort((a, b) =>\n compareValues(a[columnId], b[columnId], direction),\n )\n}\n\n/** Returns the slice for the requested page. Out-of-range pages return []. */\nexport function paginateRows<T>(\n rows: readonly T[],\n page: number,\n pageSize: number,\n): T[] {\n if (pageSize <= 0) return rows.slice()\n const start = page * pageSize\n return rows.slice(start, start + pageSize)\n}\n\n/**\n * Resolves the effective column list. When the widget store has a\n * `columnOrder` set (e.g. ChangeColumn was used), the column array is\n * reordered to match. Unknown ids in the order are skipped; columns not\n * present in the order keep their original relative position at the end.\n */\nexport function resolveColumns(\n columns: readonly TableColumn[],\n columnOrder: readonly string[] | undefined,\n): readonly TableColumn[] {\n if (!columnOrder || columnOrder.length === 0) return columns\n const byId = new Map(columns.map((c) => [c.id, c]))\n const ordered: TableColumn[] = []\n const seen = new Set<string>()\n for (const id of columnOrder) {\n const c = byId.get(id)\n if (c && !seen.has(id)) {\n ordered.push(c)\n seen.add(id)\n }\n }\n for (const c of columns) {\n if (!seen.has(c.id)) ordered.push(c)\n }\n return ordered\n}\n\n/** Applies sort and pagination to the input data. Pure. */\nexport function deriveVisibleRows<T extends TableRow>(\n rows: readonly T[],\n options: {\n sort?: { columnId: string | null; direction: TableSortDirection }\n page: number\n pageSize: number\n },\n): { sorted: readonly T[]; visible: T[] } {\n const sorted =\n options.sort?.columnId != null\n ? sortRows(rows, options.sort.columnId, options.sort.direction)\n : rows\n const visible = paginateRows(sorted, options.page, options.pageSize)\n return { sorted, visible }\n}\n\nexport function tableDataToCsv(\n data: TableWidgetData,\n columns: readonly TableColumn[],\n): string {\n const head = columns.map((c) => csvEscape(stringifyHeader(c.label))).join(',')\n const lines = [head]\n for (const row of data) {\n const cells = columns.map((c) => csvEscape(stringifyCell(row[c.id])))\n lines.push(cells.join(','))\n }\n return lines.join('\\n')\n}\n\nfunction csvEscape(value: string): string {\n if (/[\",\\n\\r]/.test(value)) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n }\n return value\n}\n\nfunction stringifyHeader(label: unknown): string {\n if (typeof label === 'string') return label\n if (typeof label === 'number' || typeof label === 'boolean')\n return String(label)\n return ''\n}\n\nfunction stringifyCell(value: unknown): string {\n if (value == null) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value)\n if (Array.isArray(value) || typeof value === 'object')\n return JSON.stringify(value)\n return ''\n}\n","import { useCallback, useMemo } from 'react'\nimport {\n getWidgetStore,\n useWidget,\n useWidgetId,\n useWidgetShallow,\n} from '../stores'\nimport { TableUI, type TableUIProps } from './table-ui'\nimport {\n DEFAULT_TABLE_PAGE_SIZE,\n type TableColumn,\n type TableRow,\n type TableSortState,\n type TableWidgetState,\n} from './types'\nimport { deriveVisibleRows, resolveColumns } from './helpers'\n\nexport interface TableProps<T extends TableRow = TableRow> extends Pick<\n TableUIProps<T>,\n | 'pageSizeOptions'\n | 'selectable'\n | 'labels'\n | 'emptyContent'\n | 'size'\n | 'keyColumn'\n> {\n /**\n * Column definitions. Order can be overridden by ChangeColumn via the\n * `columnOrder` field on the extended widget state.\n */\n columns: readonly TableColumn[]\n /**\n * When set, render only the first `visibleColumns` entries **after**\n * applying the user's `columnOrder` from the store. Useful for showing\n * a compact projection while letting consumers (e.g. `Widget.ChangeColumn`)\n * see the full column list. When omitted, every column renders.\n */\n visibleColumns?: number\n /** Initial page size (only on first mount; afterwards lives on the store). */\n initialPageSize?: number\n /** Selected row ids (destination-owned). */\n selection?: readonly (string | number)[]\n onSelectionChange?: (next: readonly (string | number)[]) => void\n onRowClick?: (row: T) => void\n onRowHover?: (row: T | null) => void\n /**\n * When `true`, the bridge stops sorting and paginating locally and\n * renders `data` as-is — the consumer is then responsible for\n * refetching the slice that matches the active `page` / `pageSize` /\n * `sort` from the outbound callbacks below. `total` is required in\n * this mode (the server already knows the full row count; the\n * widget can't infer it from a partial page).\n */\n remote?: boolean\n /**\n * Server-reported total row count. Required when `remote === true`;\n * ignored in local mode (where the bridge derives total from the\n * sorted result of `deriveVisibleRows`).\n */\n total?: number\n /** Fires after the store-level sort write so the consumer can refetch. */\n onSortChange?: (next: TableSortState) => void\n /** Fires after the store-level page write so the consumer can refetch. */\n onPageChange?: (page: number) => void\n /** Fires after the store-level pageSize write so the consumer can refetch. */\n onPageSizeChange?: (pageSize: number) => void\n}\n\n/**\n * Bridge component — reads the widget store's `data`, applies sort + pagination\n * locally, and feeds `<TableUI />`. Sort, page, and pageSize live on the\n * extended widget state ({@link TableWidgetState}).\n */\nexport function Table<T extends TableRow = TableRow>({\n columns,\n visibleColumns,\n initialPageSize = DEFAULT_TABLE_PAGE_SIZE,\n selection,\n onSelectionChange,\n onRowClick,\n onRowHover,\n remote = false,\n total: remoteTotal,\n onSortChange,\n onPageChange,\n onPageSizeChange,\n ...uiProps\n}: TableProps<T>) {\n const id = useWidgetId()\n const data = useWidget(id, (s) => s.data as readonly T[] | undefined)\n const ui = useWidgetShallow<\n {\n sort: TableSortState | undefined\n page: number\n pageSize: number\n columnOrder: readonly string[] | undefined\n },\n TableWidgetState\n >(id, (s) => ({\n sort: s.sort,\n page: s.page ?? 0,\n pageSize: s.pageSize ?? initialPageSize,\n columnOrder: s.columnOrder,\n }))\n\n const orderedColumns = useMemo(() => {\n const reordered = resolveColumns(columns, ui.columnOrder)\n return visibleColumns == null\n ? reordered\n : reordered.slice(0, visibleColumns)\n }, [columns, ui.columnOrder, visibleColumns])\n\n // In remote mode the consumer already paginated / sorted server-side,\n // so pass `data` and `total` straight through. Local mode keeps the\n // bridge-driven sort + slice via `deriveVisibleRows`.\n const { rows, totalRows } = useMemo(() => {\n if (remote) {\n return {\n rows: data ?? [],\n totalRows: remoteTotal ?? 0,\n }\n }\n const { sorted, visible } = deriveVisibleRows(data ?? [], {\n sort: ui.sort,\n page: ui.page,\n pageSize: ui.pageSize,\n })\n return { rows: visible, totalRows: sorted.length }\n }, [remote, data, remoteTotal, ui.sort, ui.page, ui.pageSize])\n\n const handleSortChange = useCallback(\n (next: TableSortState) => {\n getWidgetStore(id).setState({\n sort: next,\n page: 0,\n } as Partial<TableWidgetState>)\n onSortChange?.(next)\n },\n [id, onSortChange],\n )\n\n const handlePageChange = useCallback(\n (page: number) => {\n getWidgetStore(id).setState({ page } as Partial<TableWidgetState>)\n onPageChange?.(page)\n },\n [id, onPageChange],\n )\n\n const handlePageSizeChange = useCallback(\n (pageSize: number) => {\n getWidgetStore(id).setState({\n pageSize,\n page: 0,\n } as Partial<TableWidgetState>)\n onPageSizeChange?.(pageSize)\n },\n [id, onPageSizeChange],\n )\n\n return (\n <TableUI\n {...uiProps}\n columns={orderedColumns}\n rows={rows}\n total={totalRows}\n page={ui.page}\n pageSize={ui.pageSize}\n sort={ui.sort}\n selection={selection}\n onSortChange={handleSortChange}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n onSelectionChange={onSelectionChange}\n onRowClick={onRowClick}\n onRowHover={onRowHover}\n />\n )\n}\n"],"names":["boldRange","fontWeight","color","DEFAULT_TABLE_LABELS","selectAll","selectRow","id","rowsPerPage","paginationOf","from","to","total","jsxs","Fragment","jsx","Box","firstPage","previousPage","nextPage","lastPage","DEFAULT_TABLE_PAGE_SIZE","DEFAULT_TABLE_PAGE_SIZE_OPTIONS","styles","container","width","overflowX","table","minWidth","headerCell","backgroundColor","row","border","rowClickable","cursor","pagination","borderTop","borderColor","paginationActions","display","alignItems","gap","ml","empty","textAlign","py","TableUI","t0","$","_c","columns","rows","page","pageSize","pageSizeOptions","t1","sort","keyColumn","t2","selection","selectable","t3","onSortChange","onPageChange","onPageSizeChange","onSelectionChange","onRowClick","onRowHover","labels","emptyContent","size","undefined","process","env","NODE_ENV","some","r","console","error","t4","_labels","minPageSize","Math","min","showPagination","t5","makePaginationActions","PaginationActions","t6","t7","Set","selectionSet","t8","index","resolveRowId","t9","map","pageRowIds","t10","length","every","has","allOnPageSelected","t11","id_0","someOnPageSelected","t12","columnId","direction","nextDir","handleSort","t13","filter","id_1","includes","merged","id_2","add","handleSelectAllOnPage","t14","rowId","next","delete","handleSelectRow","t15","TableCell","Checkbox","t16","t17","column","isSorted","align","sortable","TableSortLabel","label","TableHead","MuiTableRow","t18","row_0","index_0","rowId_0","isSelected","e","stopPropagation","column_0","formatter","stringifyCell","t19","TableBody","t20","TableContainer","MuiTable","t21","TablePagination","_","next_0","e_0","next_1","parseInt","target","value","t22","count","String","Array","isArray","JSON","stringify","max","ceil","IconButton","FirstPageIcon","KeyboardArrowLeft","KeyboardArrowRight","LastPageIcon","compareValues","a","b","cmp","localeCompare","sortRows","paginateRows","slice","start","resolveColumns","columnOrder","byId","Map","c","ordered","seen","get","push","deriveVisibleRows","options","sorted","visible","tableDataToCsv","data","lines","csvEscape","stringifyHeader","join","cells","test","replace","Table","remoteTotal","uiProps","visibleColumns","initialPageSize","remote","useWidgetId","useWidget","_temp","s_0","s","ui","useWidgetShallow","reordered","orderedColumns","bb0","totalRows","getWidgetStore","setState","handleSortChange","handlePageChange","handlePageSizeChange"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { B as s, C as e, D as o, a as A, b as E, c as S, d as t, e as _, f as r, g as T, h as l, i as D, j as d, F as c, L as g, R as n, S as B, k as O, l as C, m as F, n as U, Z as m, o as h, p as i, q as G, r as R, s as f, t as w, u as I, v as N } from "../change-column-BiuuHCDN.js";
1
+ import { B as s, C as e, D as o, a as A, b as E, c as S, d as t, e as _, f as r, g as T, h as l, i as D, j as d, F as c, L as g, R as n, S as B, k as O, l as C, m as F, n as U, Z as m, o as h, p as i, q as G, r as R, s as f, t as w, u as I, v as N } from "../change-column-DjjwoPt1.js";
2
2
  import { Z as k, a as u, c as x } from "../transforms-Cdx4fkU5.js";
3
3
  import { d as H, a as P, t as b, b as v } from "../exports-Cx-f6m6U.js";
4
- import { C as V, P as W, b as y } from "../png-item-CS4z1iSH.js";
4
+ import { C as V, P as W, b as y } from "../png-item-BE9uEqlD.js";
5
5
  export {
6
6
  s as BrushToggle,
7
7
  V as CSVIcon,
@@ -15,7 +15,6 @@ import "@dnd-kit/core";
15
15
  import "@dnd-kit/sortable";
16
16
  import "@dnd-kit/utilities";
17
17
  import "react-dom";
18
- import "@mui/icons-material/ZoomIn";
19
18
  import "../widget-context-DTGO0Yta.js";
20
19
  import "zustand";
21
20
  import "zustand/vanilla";
@@ -23,10 +22,9 @@ import "zustand/middleware";
23
22
  import "zustand/react/shallow";
24
23
  import { Z as j } from "../transforms-Cdx4fkU5.js";
25
24
  import { m as W, r as Y } from "../resolve-theme-color-BdojIw0K.js";
26
- import { p as q } from "../data-zoom-layout--YiY6ko_.js";
27
- import "@mui/icons-material/FileDownload";
25
+ import { p as q } from "../data-zoom-layout-CkVnm6ej.js";
28
26
  import { a as U } from "../exports-Cx-f6m6U.js";
29
- import { b as J, C as K } from "../png-item-CS4z1iSH.js";
27
+ import { b as J, C as K } from "../png-item-BE9uEqlD.js";
30
28
  function Q({
31
29
  theme: e,
32
30
  formatter: r,
@@ -119,7 +117,7 @@ function Q({
119
117
  }
120
118
  };
121
119
  }
122
- function Me(e) {
120
+ function Be(e) {
123
121
  const {
124
122
  theme: r,
125
123
  formatter: t,
@@ -277,7 +275,7 @@ const d = {
277
275
  }) => e(1.5)
278
276
  }
279
277
  }, ee = ["20%", "40%", "60%", "20%", "80%"];
280
- function Fe() {
278
+ function je() {
281
279
  const e = R(2);
282
280
  let r;
283
281
  e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ p(g, { sx: d.grid, children: ee.map(re) }), e[0] = r) : r = e[0];
@@ -296,7 +294,7 @@ function te(e) {
296
294
  function re(e, r) {
297
295
  return /* @__PURE__ */ p(A, { sx: d.bar, variant: "rectangular", height: e }, `bar-${r}`);
298
296
  }
299
- function Oe(e) {
297
+ function Me(e) {
300
298
  const r = [];
301
299
  return e.getCaptureEl && r.push(J({
302
300
  filename: e.filename,
@@ -323,9 +321,9 @@ function Oe(e) {
323
321
  }), r;
324
322
  }
325
323
  export {
326
- Fe as BarSkeleton,
324
+ je as BarSkeleton,
327
325
  Q as barOptions,
328
- Oe as createBarDownloadConfig,
329
- Me as createBarOptionFactory
326
+ Me as createBarDownloadConfig,
327
+ Be as createBarOptionFactory
330
328
  };
331
329
  //# sourceMappingURL=bar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bar.js","sources":["../../src/widgets-v2/bar/options.ts","../../src/widgets-v2/bar/skeleton.tsx","../../src/widgets-v2/bar/download.tsx"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n BarEChartsOption,\n BarOptionFactoryInput,\n BarOptionsInput,\n BarWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a bar widget — axes, grid,\n * tooltip styling, themed legend. Intentionally data-agnostic: no series,\n * no dataset, no `legend.show` (those depend on data and are added by the\n * option factory's merge phase). This separation is what lets data-side\n * pipeline transforms (Searcher, RelativeData) drive the rendered chart —\n * the merge happens at render time inside the Echart bridge.\n *\n * Styling matches the v1 `barConfig` look-and-feel: minimal axes (only\n * min/max y-labels rendered inside the plot via `niceNum`), themed tooltip,\n * scroll legend, and CARTO color palette. The y-axis min/max + label\n * formatter and the tooltip formatter are wired here for the no-data case;\n * {@link createBarOptionFactory} re-derives them at fusion time so reactive\n * formatter changes (RelativeData) and stack templates (StackToggle) flow\n * through to the chart.\n */\nexport function barOptions({\n theme,\n formatter,\n labelFormatter,\n}: BarOptionsInput): BarEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildBarTooltipFormatter(formatter, labelFormatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count.\n legend: {\n ...buildLegendConfig({ hasLegend: false, labelFormatter }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n ...(labelFormatter && {\n formatter: (v: string | number) => String(labelFormatter(v)),\n }),\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as BarEChartsOption\n}\n\n/**\n * Returns the bar widget's {@link OptionFactory} — a single closure that\n * handles BOTH option-construction phases:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link barOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store; configTransforms (StackToggle /\n * ZoomToggle / BrushToggle) then mutate it via the pipeline middleware.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`BarWidgetData`) into the option via the dataset API: one dataset\n * per series, each series referencing its dataset by index, encoded\n * by `name` (x) and `value` (y). Spreads any series-template fields\n * already on the incoming option (e.g. `{ stack: 'total' }` from\n * `addStack`) into every emitted series so configTransforms compose\n * end-to-end. Reactive `ctx.formatter` / `ctx.labelFormatter` drive\n * the y-axis min/max-only label and the tooltip formatter at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n *\n * Stable identity when the inputs don't change (consumers should wrap the\n * call in `useMemo` keyed on the same inputs).\n */\nexport function createBarOptionFactory(\n options: BarOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const series = options.series\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n // Structural phase: Provider seeds rawOptions with this branch. No data\n // is read; we just emit the theme-aware base (optionally with override).\n if (option == null) {\n const structural = barOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as BarWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n const hasLegend = seriesArr.length > 1\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n\n // Reactive (live store) formatters from ctx — distinct from the\n // closure-time `formatter` / `labelFormatter` captured for the\n // structural-build branch above. RelativeData can install a percent\n // formatter on the store after the factory was constructed; the merge\n // phase reads `ctx` to pick that up.\n const liveFormatter = ctx?.formatter\n const liveLabelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push the\n // slider above the legend (if any) and reserve room in the grid below.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // When a selection is active, dim non-selected bars by routing the\n // resolved palette color through `modifyAlpha`. Per-row `itemStyle` on\n // dataset object-rows is silently ignored when `series.encode` is in\n // play — the callback approach is the standard ECharts pattern for\n // per-data styling derived from a dataset.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bars would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n // Per-series `color` override: ECharts sets `params.color` from\n // `series[i].color` when resolving styles, so the dim callback\n // above keeps working — it just dims the user's colour rather\n // than the palette default.\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: {\n ...baseGrid,\n bottom: gridBottom,\n },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildBarTooltipFormatter(liveFormatter, liveLabelFormatter),\n },\n } as EChartsOption\n }\n}\n\nfunction buildBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as { name?: string | number; value?: number }\n const raw = row?.value\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : (item.name ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n\nfunction computeNiceBounds(seriesArr: BarWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n const niceMinVal = min < 0 ? niceNum(min) : 0\n const niceMaxVal = max <= 0 ? 1 : niceNum(max)\n return { niceMinVal, niceMaxVal }\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: '1 1 auto',\n alignItems: 'flex-end',\n width: '100%',\n },\n bar: {\n flex: 1,\n maxWidth: ({ spacing }) => spacing(12),\n '& + &': {\n marginLeft: ({ spacing }) => spacing(1),\n },\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst BAR_HEIGHTS = ['20%', '40%', '60%', '20%', '80%'] as const\n\n/**\n * Loading state for the Bar widget. Mirrors a bar chart's silhouette — five\n * vertical bars at staggered heights anchored to the bottom, plus a legend\n * stub — so the skeleton reads as \"a bar chart\" rather than a generic list.\n */\nexport function BarSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {BAR_HEIGHTS.map((height, i) => (\n <Skeleton\n key={`bar-${i}`}\n sx={styles.bar}\n variant='rectangular'\n height={height}\n />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n CSVIcon,\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { BarWidgetData } from './types'\n\nexport interface BarDownloadConfigArgs {\n filename: string\n getData: () => BarWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State` on its success path). When provided, a PNG item is\n * prepended to the returned list. Wire it to\n * `() => getCaptureEl(id)`.\n */\n getCaptureEl?: () => HTMLElement | null\n /** PNG `pixelRatio` (default 2). */\n pngPixelRatio?: number\n /** PNG `backgroundColor` (default transparent). */\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Bar widget. Always includes a CSV item\n * with one `name,value` block per series, separated by an empty row when\n * there are multiple. When `getCaptureEl` is supplied, also prepends a PNG\n * item that rasterises the captured element via `html2canvas`.\n */\nexport function createBarDownloadConfig(\n args: BarDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = []\n for (const [i, series] of data.entries()) {\n if (i > 0) rows.push([])\n rows.push(['name', 'value'])\n for (const d of series) rows.push([d.name, d.value])\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["barOptions","theme","formatter","labelFormatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildBarTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","v","String","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","createBarOptionFactory","options","optionsOverride","series","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","baseLegend","baseGrid","baseTooltip","baseYAxis","seriesTemplates","broadcastTemplate","liveFormatter","liveLabelFormatter","niceMinVal","niceMaxVal","computeNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","name","has","echarts","modifyAlpha","map","s","source","_","i","template","overrideColor","resolveThemeColor","datasetIndex","encode","x","y","barMaxWidth","emphasis","focus","itemStyle","createTooltipFormatter","item","raw","formattedValue","marker","seriesName","d","Number","isFinite","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","bar","maxWidth","marginLeft","legendItem","BAR_HEIGHTS","BarSkeleton","$","_c","t0","Symbol","for","jsx","Box","_temp","t1","_temp2","i_0","jsxs","Skeleton","createBarDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","label","icon","CSVIcon","resolve","getData","rows","entries","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
1
+ {"version":3,"file":"bar.js","sources":["../../src/widgets-v2/bar/options.ts","../../src/widgets-v2/bar/skeleton.tsx","../../src/widgets-v2/bar/download.tsx"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n BarEChartsOption,\n BarOptionFactoryInput,\n BarOptionsInput,\n BarWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a bar widget — axes, grid,\n * tooltip styling, themed legend. Intentionally data-agnostic: no series,\n * no dataset, no `legend.show` (those depend on data and are added by the\n * option factory's merge phase). This separation is what lets data-side\n * pipeline transforms (Searcher, RelativeData) drive the rendered chart —\n * the merge happens at render time inside the Echart bridge.\n *\n * Styling matches the v1 `barConfig` look-and-feel: minimal axes (only\n * min/max y-labels rendered inside the plot via `niceNum`), themed tooltip,\n * scroll legend, and CARTO color palette. The y-axis min/max + label\n * formatter and the tooltip formatter are wired here for the no-data case;\n * {@link createBarOptionFactory} re-derives them at fusion time so reactive\n * formatter changes (RelativeData) and stack templates (StackToggle) flow\n * through to the chart.\n */\nexport function barOptions({\n theme,\n formatter,\n labelFormatter,\n}: BarOptionsInput): BarEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildBarTooltipFormatter(formatter, labelFormatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count.\n legend: {\n ...buildLegendConfig({ hasLegend: false, labelFormatter }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n ...(labelFormatter && {\n formatter: (v: string | number) => String(labelFormatter(v)),\n }),\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as BarEChartsOption\n}\n\n/**\n * Returns the bar widget's {@link OptionFactory} — a single closure that\n * handles BOTH option-construction phases:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link barOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store; configTransforms (StackToggle /\n * ZoomToggle / BrushToggle) then mutate it via the pipeline middleware.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`BarWidgetData`) into the option via the dataset API: one dataset\n * per series, each series referencing its dataset by index, encoded\n * by `name` (x) and `value` (y). Spreads any series-template fields\n * already on the incoming option (e.g. `{ stack: 'total' }` from\n * `addStack`) into every emitted series so configTransforms compose\n * end-to-end. Reactive `ctx.formatter` / `ctx.labelFormatter` drive\n * the y-axis min/max-only label and the tooltip formatter at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n *\n * Stable identity when the inputs don't change (consumers should wrap the\n * call in `useMemo` keyed on the same inputs).\n */\nexport function createBarOptionFactory(\n options: BarOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const series = options.series\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n // Structural phase: Provider seeds rawOptions with this branch. No data\n // is read; we just emit the theme-aware base (optionally with override).\n if (option == null) {\n const structural = barOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as BarWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n const hasLegend = seriesArr.length > 1\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n\n // Reactive (live store) formatters from ctx — distinct from the\n // closure-time `formatter` / `labelFormatter` captured for the\n // structural-build branch above. RelativeData can install a percent\n // formatter on the store after the factory was constructed; the merge\n // phase reads `ctx` to pick that up.\n const liveFormatter = ctx?.formatter\n const liveLabelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push the\n // slider above the legend (if any) and reserve room in the grid below.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // When a selection is active, dim non-selected bars by routing the\n // resolved palette color through `modifyAlpha`. Per-row `itemStyle` on\n // dataset object-rows is silently ignored when `series.encode` is in\n // play — the callback approach is the standard ECharts pattern for\n // per-data styling derived from a dataset.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bars would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n // Per-series `color` override: ECharts sets `params.color` from\n // `series[i].color` when resolving styles, so the dim callback\n // above keeps working — it just dims the user's colour rather\n // than the palette default.\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: {\n ...baseGrid,\n bottom: gridBottom,\n },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildBarTooltipFormatter(liveFormatter, liveLabelFormatter),\n },\n } as EChartsOption\n }\n}\n\nfunction buildBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as { name?: string | number; value?: number }\n const raw = row?.value\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : (item.name ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n\nfunction computeNiceBounds(seriesArr: BarWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n const niceMinVal = min < 0 ? niceNum(min) : 0\n const niceMaxVal = max <= 0 ? 1 : niceNum(max)\n return { niceMinVal, niceMaxVal }\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: '1 1 auto',\n alignItems: 'flex-end',\n width: '100%',\n },\n bar: {\n flex: 1,\n maxWidth: ({ spacing }) => spacing(12),\n '& + &': {\n marginLeft: ({ spacing }) => spacing(1),\n },\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst BAR_HEIGHTS = ['20%', '40%', '60%', '20%', '80%'] as const\n\n/**\n * Loading state for the Bar widget. Mirrors a bar chart's silhouette — five\n * vertical bars at staggered heights anchored to the bottom, plus a legend\n * stub — so the skeleton reads as \"a bar chart\" rather than a generic list.\n */\nexport function BarSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {BAR_HEIGHTS.map((height, i) => (\n <Skeleton\n key={`bar-${i}`}\n sx={styles.bar}\n variant='rectangular'\n height={height}\n />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n CSVIcon,\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { BarWidgetData } from './types'\n\nexport interface BarDownloadConfigArgs {\n filename: string\n getData: () => BarWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State` on its success path). When provided, a PNG item is\n * prepended to the returned list. Wire it to\n * `() => getCaptureEl(id)`.\n */\n getCaptureEl?: () => HTMLElement | null\n /** PNG `pixelRatio` (default 2). */\n pngPixelRatio?: number\n /** PNG `backgroundColor` (default transparent). */\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Bar widget. Always includes a CSV item\n * with one `name,value` block per series, separated by an empty row when\n * there are multiple. When `getCaptureEl` is supplied, also prepends a PNG\n * item that rasterises the captured element via `html2canvas`.\n */\nexport function createBarDownloadConfig(\n args: BarDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = []\n for (const [i, series] of data.entries()) {\n if (i > 0) rows.push([])\n rows.push(['name', 'value'])\n for (const d of series) rows.push([d.name, d.value])\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["barOptions","theme","formatter","labelFormatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildBarTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","v","String","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","createBarOptionFactory","options","optionsOverride","series","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","baseLegend","baseGrid","baseTooltip","baseYAxis","seriesTemplates","broadcastTemplate","liveFormatter","liveLabelFormatter","niceMinVal","niceMaxVal","computeNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","name","has","echarts","modifyAlpha","map","s","source","_","i","template","overrideColor","resolveThemeColor","datasetIndex","encode","x","y","barMaxWidth","emphasis","focus","itemStyle","createTooltipFormatter","item","raw","formattedValue","marker","seriesName","d","Number","isFinite","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","bar","maxWidth","marginLeft","legendItem","BAR_HEIGHTS","BarSkeleton","$","_c","t0","Symbol","for","jsx","Box","_temp","t1","_temp2","i_0","jsxs","Skeleton","createBarDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","label","icon","CSVIcon","resolve","getData","rows","entries","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}