@carto/ps-react-ui 4.8.0 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/range-l4fNHLEg.js +213 -0
  2. package/dist/range-l4fNHLEg.js.map +1 -0
  3. package/dist/resolve-theme-color-BdojIw0K.js +47 -0
  4. package/dist/resolve-theme-color-BdojIw0K.js.map +1 -0
  5. package/dist/table-CQCAnDLb.js +388 -0
  6. package/dist/table-CQCAnDLb.js.map +1 -0
  7. package/dist/types/widgets-v2/bar/types.d.ts +8 -3
  8. package/dist/types/widgets-v2/category/types.d.ts +8 -4
  9. package/dist/types/widgets-v2/formula/types.d.ts +10 -7
  10. package/dist/types/widgets-v2/histogram/types.d.ts +7 -3
  11. package/dist/types/widgets-v2/index.d.ts +1 -0
  12. package/dist/types/widgets-v2/pie/types.d.ts +10 -3
  13. package/dist/types/widgets-v2/range/range-ui.d.ts +12 -4
  14. package/dist/types/widgets-v2/range/range.d.ts +13 -8
  15. package/dist/types/widgets-v2/scatterplot/types.d.ts +7 -3
  16. package/dist/types/widgets-v2/table/style.d.ts +0 -4
  17. package/dist/types/widgets-v2/table/table-ui.d.ts +7 -1
  18. package/dist/types/widgets-v2/table/table.d.ts +1 -1
  19. package/dist/types/widgets-v2/table/types.d.ts +13 -2
  20. package/dist/types/widgets-v2/timeseries/types.d.ts +7 -3
  21. package/dist/types/widgets-v2/types.d.ts +25 -0
  22. package/dist/types/widgets-v2/utils/index.d.ts +1 -0
  23. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  24. package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
  25. package/dist/widgets-v2/bar.js +58 -55
  26. package/dist/widgets-v2/bar.js.map +1 -1
  27. package/dist/widgets-v2/histogram.js +65 -62
  28. package/dist/widgets-v2/histogram.js.map +1 -1
  29. package/dist/widgets-v2/pie.js +100 -94
  30. package/dist/widgets-v2/pie.js.map +1 -1
  31. package/dist/widgets-v2/range.js +1 -1
  32. package/dist/widgets-v2/scatterplot.js +107 -101
  33. package/dist/widgets-v2/scatterplot.js.map +1 -1
  34. package/dist/widgets-v2/table.js +2 -2
  35. package/dist/widgets-v2/timeseries.js +85 -79
  36. package/dist/widgets-v2/timeseries.js.map +1 -1
  37. package/dist/widgets-v2/utils.js +4 -3
  38. package/dist/widgets-v2.js +2 -2
  39. package/dist/widgets-v2.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/widgets-v2/bar/options.test.ts +19 -2
  42. package/src/widgets-v2/bar/options.ts +9 -3
  43. package/src/widgets-v2/bar/types.ts +8 -3
  44. package/src/widgets-v2/category/types.ts +9 -4
  45. package/src/widgets-v2/formula/types.ts +11 -7
  46. package/src/widgets-v2/histogram/options.test.ts +16 -2
  47. package/src/widgets-v2/histogram/options.ts +5 -4
  48. package/src/widgets-v2/histogram/types.ts +7 -3
  49. package/src/widgets-v2/index.ts +3 -0
  50. package/src/widgets-v2/pie/options.test.ts +20 -4
  51. package/src/widgets-v2/pie/options.ts +21 -17
  52. package/src/widgets-v2/pie/types.ts +10 -3
  53. package/src/widgets-v2/range/range-ui.test.tsx +8 -2
  54. package/src/widgets-v2/range/range-ui.tsx +81 -14
  55. package/src/widgets-v2/range/range.tsx +14 -8
  56. package/src/widgets-v2/scatterplot/options.test.ts +15 -3
  57. package/src/widgets-v2/scatterplot/options.ts +15 -11
  58. package/src/widgets-v2/scatterplot/types.ts +7 -3
  59. package/src/widgets-v2/table/style.ts +2 -5
  60. package/src/widgets-v2/table/table-ui.tsx +40 -7
  61. package/src/widgets-v2/table/table.tsx +6 -1
  62. package/src/widgets-v2/table/types.ts +13 -2
  63. package/src/widgets-v2/timeseries/options.test.ts +17 -2
  64. package/src/widgets-v2/timeseries/options.ts +10 -3
  65. package/src/widgets-v2/timeseries/types.ts +7 -3
  66. package/src/widgets-v2/types.ts +25 -0
  67. package/src/widgets-v2/utils/index.ts +1 -0
  68. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  69. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  70. package/dist/merge-options-DCkkHZIf.js +0 -34
  71. package/dist/merge-options-DCkkHZIf.js.map +0 -1
  72. package/dist/range-DsqTjSpg.js +0 -186
  73. package/dist/range-DsqTjSpg.js.map +0 -1
  74. package/dist/table-HIpXuq4G.js +0 -390
  75. package/dist/table-HIpXuq4G.js.map +0 -1
@@ -0,0 +1,388 @@
1
+ import { jsxs as ee, Fragment as Se, jsx as f } from "react/jsx-runtime";
2
+ import { c as me } from "react/compiler-runtime";
3
+ import "react";
4
+ import { u as be } from "./widget-context-DTGO0Yta.js";
5
+ import { v as ye, u as Ce, i as fe } from "./widget-store-registry-_W4Z4xp-.js";
6
+ import "zustand";
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";
12
+ const Ee = {
13
+ fontWeight: 600,
14
+ color: "text.primary"
15
+ }, ve = {
16
+ selectAll: "Select all rows",
17
+ selectRow: (t) => `Select row ${t}`,
18
+ rowsPerPage: "Rows per page:",
19
+ paginationOf: (t, e, i) => /* @__PURE__ */ ee(Se, { children: [
20
+ /* @__PURE__ */ f(pe, { component: "span", sx: Ee, children: `${t}–${e}` }),
21
+ ` of ${i}`
22
+ ] }),
23
+ firstPage: "First page",
24
+ previousPage: "Previous page",
25
+ nextPage: "Next page",
26
+ lastPage: "Last page"
27
+ }, Le = 10, $e = [10, 25, 50, 100], $ = {
28
+ container: {
29
+ width: "100%",
30
+ overflowX: "auto"
31
+ },
32
+ table: {
33
+ minWidth: 0
34
+ },
35
+ headerCell: {
36
+ fontWeight: 600,
37
+ backgroundColor: "background.paper"
38
+ },
39
+ /**
40
+ * Strip the bottom border from the last body row so the body flushes
41
+ * against the pagination border instead of doubling it up. Mirrors v1.
42
+ */
43
+ row: {
44
+ "&:last-child td, &:last-child th": {
45
+ border: 0
46
+ }
47
+ },
48
+ rowClickable: {
49
+ cursor: "pointer"
50
+ },
51
+ pagination: {
52
+ borderTop: "1px solid",
53
+ borderColor: "divider"
54
+ },
55
+ paginationActions: {
56
+ display: "flex",
57
+ alignItems: "center",
58
+ gap: 0.25,
59
+ ml: 1
60
+ },
61
+ empty: {
62
+ textAlign: "center",
63
+ color: "text.secondary",
64
+ py: 3
65
+ }
66
+ };
67
+ function je(t) {
68
+ const e = me(82), {
69
+ columns: i,
70
+ rows: n,
71
+ total: c,
72
+ page: l,
73
+ pageSize: g,
74
+ pageSizeOptions: p,
75
+ sort: d,
76
+ keyColumn: M,
77
+ selection: u,
78
+ selectable: j,
79
+ onSortChange: b,
80
+ onPageChange: T,
81
+ onPageSizeChange: w,
82
+ onSelectionChange: C,
83
+ onRowClick: V,
84
+ onRowHover: m,
85
+ labels: R,
86
+ emptyContent: D,
87
+ size: a
88
+ } = 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.`);
90
+ let N;
91
+ e[0] !== R ? (N = {
92
+ ...ve,
93
+ ...R
94
+ }, e[0] = R, e[1] = N) : N = e[1];
95
+ const h = N, _ = Math.min(...O), H = c > _;
96
+ let v;
97
+ e[2] !== h ? (v = Ne(h), e[2] = h, e[3] = v) : v = e[3];
98
+ const U = v;
99
+ let z;
100
+ e[4] !== u ? (z = u ?? [], e[4] = u, e[5] = z) : z = e[5];
101
+ let B;
102
+ e[6] !== z ? (B = new Set(z), e[6] = z, e[7] = B) : B = e[7];
103
+ const y = B;
104
+ let s;
105
+ e[8] !== E ? (s = (o, r) => o[E] ?? r, e[8] = E, e[9] = s) : s = e[9];
106
+ const I = s;
107
+ let W;
108
+ e[10] !== I || e[11] !== n ? (W = n.map(I), e[10] = I, e[11] = n, e[12] = W) : W = e[12];
109
+ const S = W;
110
+ let A;
111
+ e[13] !== S || e[14] !== y ? (A = S.length > 0 && S.every((o) => y.has(o)), e[13] = S, e[14] = y, e[15] = A) : A = e[15];
112
+ const P = A;
113
+ let L;
114
+ e[16] !== P || e[17] !== S || e[18] !== y ? (L = !P && S.some((o) => y.has(o)), e[16] = P, e[17] = S, e[18] = y, e[19] = L) : L = e[19];
115
+ const ae = L;
116
+ let oe;
117
+ e[20] !== b || e[21] !== d?.columnId || e[22] !== d?.direction ? (oe = (o) => {
118
+ if (!b)
119
+ return;
120
+ const k = d?.columnId === o && d?.direction === "asc" ? "desc" : "asc";
121
+ b({
122
+ columnId: o,
123
+ direction: k
124
+ });
125
+ }, e[20] = b, e[21] = d?.columnId, e[22] = d?.direction, e[23] = oe) : oe = e[23];
126
+ const te = oe;
127
+ let ie;
128
+ e[24] !== P || e[25] !== C || e[26] !== S || e[27] !== u ? (ie = () => {
129
+ if (C)
130
+ if (P)
131
+ C((u ?? []).filter((o) => !S.includes(o)));
132
+ else {
133
+ const o = new Set(u ?? []);
134
+ for (const r of S)
135
+ o.add(r);
136
+ C([...o]);
137
+ }
138
+ }, e[24] = P, e[25] = C, e[26] = S, e[27] = u, e[28] = ie) : ie = e[28];
139
+ const ce = ie;
140
+ let re;
141
+ e[29] !== C || e[30] !== u ? (re = (o) => {
142
+ if (!C)
143
+ 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;
148
+ let G;
149
+ 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
+ "aria-label": h.selectAll
151
+ } }) }) : null, e[32] = h, e[33] = P, e[34] = ce, e[35] = x, e[36] = ae, e[37] = G) : G = e[37];
152
+ let K;
153
+ if (e[38] !== i || e[39] !== te || e[40] !== b || e[41] !== d?.columnId || e[42] !== d?.direction) {
154
+ 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);
160
+ }, 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
+ } else
162
+ K = e[43];
163
+ let Z;
164
+ e[49] !== G || e[50] !== K ? (Z = /* @__PURE__ */ f(xe, { children: /* @__PURE__ */ ee(ge, { children: [
165
+ G,
166
+ K
167
+ ] }) }), e[49] = G, e[50] = K, e[51] = Z) : Z = e[51];
168
+ 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);
171
+ return /* @__PURE__ */ ee(ge, { hover: !0, selected: J, onClick: () => V?.(o), onMouseEnter: () => m?.(o), onMouseLeave: () => m?.(null), sx: {
172
+ ...$.row,
173
+ ...V ? $.rowClickable : null
174
+ }, children: [
175
+ x ? /* @__PURE__ */ f(ne, { padding: "checkbox", children: /* @__PURE__ */ f(ue, { checked: J, onClick: (F) => {
176
+ F.stopPropagation(), de(k);
177
+ }, inputProps: {
178
+ "aria-label": h.selectRow(k)
179
+ } }) }) : null,
180
+ i.map((F) => /* @__PURE__ */ f(ne, { align: F.align, children: F.formatter ? F.formatter(o[F.id], o) : De(o[F.id]) }, F.id))
181
+ ] }, k);
182
+ }), 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, e[62] = X) : X = e[62];
183
+ let q;
184
+ e[63] !== X ? (q = /* @__PURE__ */ f(ze, { children: X }), e[63] = X, e[64] = q) : q = e[64];
185
+ let Q;
186
+ e[65] !== a || e[66] !== Z || e[67] !== q ? (Q = /* @__PURE__ */ f(Ae, { children: /* @__PURE__ */ ee(ke, { stickyHeader: !0, size: a, sx: $.table, children: [
187
+ Z,
188
+ q
189
+ ] }) }), e[65] = a, e[66] = Z, e[67] = q, e[68] = Q) : Q = e[68];
190
+ 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);
194
+ }, labelRowsPerPage: h.rowsPerPage, labelDisplayedRows: (o) => {
195
+ const {
196
+ from: r,
197
+ to: k,
198
+ count: J
199
+ } = 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: [
204
+ Q,
205
+ Y
206
+ ] }), e[79] = Q, e[80] = Y, e[81] = le) : le = e[81], le;
207
+ }
208
+ function De(t) {
209
+ return t == null ? "" : typeof t == "string" || typeof t == "number" ? t : typeof t == "boolean" ? String(t) : Array.isArray(t) || typeof t == "object" ? JSON.stringify(t) : "";
210
+ }
211
+ function Ne(t) {
212
+ return function({
213
+ count: i,
214
+ page: n,
215
+ rowsPerPage: c,
216
+ onPageChange: l
217
+ }) {
218
+ const g = Math.max(0, Math.ceil(i / c) - 1);
219
+ 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" }) })
224
+ ] });
225
+ };
226
+ }
227
+ function Be(t, e, i) {
228
+ if (t == null && e == null) return 0;
229
+ if (t == null) return 1;
230
+ if (e == null) return -1;
231
+ let n = 0;
232
+ return typeof t == "string" && typeof e == "string" ? n = t.localeCompare(e) : typeof t == "number" && typeof e == "number" ? n = t - e : typeof t == "boolean" && typeof e == "boolean" ? n = t === e ? 0 : t ? 1 : -1 : (typeof t == "object" || typeof e == "object") && (n = JSON.stringify(t).localeCompare(JSON.stringify(e))), i === "asc" ? n : -n;
233
+ }
234
+ function We(t, e, i) {
235
+ return [...t].sort((n, c) => Be(n[e], c[e], i));
236
+ }
237
+ function Fe(t, e, i) {
238
+ if (i <= 0) return t.slice();
239
+ const n = e * i;
240
+ return t.slice(n, n + i);
241
+ }
242
+ function Me(t, e) {
243
+ 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));
248
+ }
249
+ for (const l of t)
250
+ c.has(l.id) || n.push(l);
251
+ return n;
252
+ }
253
+ function He(t, e) {
254
+ const i = e.sort?.columnId != null ? We(t, e.sort.columnId, e.sort.direction) : t, n = Fe(i, e.page, e.pageSize);
255
+ return {
256
+ sorted: i,
257
+ visible: n
258
+ };
259
+ }
260
+ function ot(t, e) {
261
+ const n = [e.map((c) => he(Ue(c.label))).join(",")];
262
+ for (const c of t) {
263
+ const l = e.map((g) => he(Je(c[g.id])));
264
+ n.push(l.join(","));
265
+ }
266
+ return n.join(`
267
+ `);
268
+ }
269
+ function he(t) {
270
+ return /[",\n\r]/.test(t) ? `"${t.replace(/"/g, '""')}"` : t;
271
+ }
272
+ function Ue(t) {
273
+ return typeof t == "string" ? t : typeof t == "number" || typeof t == "boolean" ? String(t) : "";
274
+ }
275
+ function Je(t) {
276
+ 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
+ }
278
+ function it(t) {
279
+ const e = me(57);
280
+ let i, n, c, l, g, p, d, M, u, j, b, T, w;
281
+ e[0] !== t ? ({
282
+ columns: i,
283
+ visibleColumns: w,
284
+ initialPageSize: j,
285
+ selection: u,
286
+ onSelectionChange: p,
287
+ onRowClick: l,
288
+ onRowHover: g,
289
+ remote: b,
290
+ total: M,
291
+ onSortChange: d,
292
+ onPageChange: n,
293
+ onPageSizeChange: c,
294
+ ...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]);
296
+ const C = j === void 0 ? Le : j, V = b === void 0 ? !1 : b, m = be(), R = ye(m, Ve);
297
+ let D;
298
+ e[14] !== C ? (D = (s) => ({
299
+ sort: s.sort,
300
+ page: s.page ?? 0,
301
+ pageSize: s.pageSize ?? C,
302
+ columnOrder: s.columnOrder
303
+ }), e[14] = C, e[15] = D) : D = e[15];
304
+ const a = Ce(m, D);
305
+ let O;
306
+ if (e[16] !== i || e[17] !== a.columnOrder || e[18] !== w) {
307
+ const s = Me(i, a.columnOrder);
308
+ O = w == null ? s : s.slice(0, w), e[16] = i, e[17] = a.columnOrder, e[18] = w, e[19] = O;
309
+ } else
310
+ O = e[19];
311
+ const E = O;
312
+ let x;
313
+ e: {
314
+ if (V) {
315
+ let A;
316
+ e[20] !== R ? (A = R ?? [], e[20] = R, e[21] = A) : A = e[21];
317
+ const P = M ?? 0;
318
+ let L;
319
+ e[22] !== A || e[23] !== P ? (L = {
320
+ rows: A,
321
+ totalRows: P
322
+ }, e[22] = A, e[23] = P, e[24] = L) : L = e[24], x = L;
323
+ break e;
324
+ }
325
+ let s;
326
+ e[25] !== R || e[26] !== a.page || e[27] !== a.pageSize || e[28] !== a.sort ? (s = He(R ?? [], {
327
+ sort: a.sort,
328
+ page: a.page,
329
+ pageSize: a.pageSize
330
+ }), e[25] = R, e[26] = a.page, e[27] = a.pageSize, e[28] = a.sort, e[29] = s) : s = e[29];
331
+ const {
332
+ sorted: I,
333
+ visible: W
334
+ } = s;
335
+ let S;
336
+ e[30] !== I.length || e[31] !== W ? (S = {
337
+ rows: W,
338
+ totalRows: I.length
339
+ }, e[30] = I.length, e[31] = W, e[32] = S) : S = e[32], x = S;
340
+ }
341
+ const {
342
+ rows: N,
343
+ totalRows: h
344
+ } = x;
345
+ let _;
346
+ e[33] !== m || e[34] !== d ? (_ = (s) => {
347
+ fe(m).setState({
348
+ sort: s,
349
+ page: 0
350
+ }), d?.(s);
351
+ }, e[33] = m, e[34] = d, e[35] = _) : _ = e[35];
352
+ const H = _;
353
+ let v;
354
+ e[36] !== m || e[37] !== n ? (v = (s) => {
355
+ fe(m).setState({
356
+ page: s
357
+ }), n?.(s);
358
+ }, e[36] = m, e[37] = n, e[38] = v) : v = e[38];
359
+ const U = v;
360
+ let z;
361
+ e[39] !== m || e[40] !== c ? (z = (s) => {
362
+ fe(m).setState({
363
+ pageSize: s,
364
+ page: 0
365
+ }), c?.(s);
366
+ }, e[39] = m, e[40] = c, e[41] = z) : z = e[41];
367
+ const B = z;
368
+ 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;
370
+ }
371
+ function Ve(t) {
372
+ return t.data;
373
+ }
374
+ export {
375
+ ve as D,
376
+ it as T,
377
+ Le as a,
378
+ $e as b,
379
+ je as c,
380
+ Be as d,
381
+ He as e,
382
+ We as f,
383
+ Fe as p,
384
+ Me as r,
385
+ $ as s,
386
+ ot as t
387
+ };
388
+ //# sourceMappingURL=table-CQCAnDLb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-CQCAnDLb.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 FirstPageIcon from '@mui/icons-material/FirstPage'\nimport KeyboardArrowLeft from '@mui/icons-material/KeyboardArrowLeft'\nimport KeyboardArrowRight from '@mui/icons-material/KeyboardArrowRight'\nimport LastPageIcon from '@mui/icons-material/LastPage'\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,5 +1,6 @@
1
1
  import { Theme } from '@mui/material';
2
2
  import { EChartsOption } from 'echarts';
3
+ import { WidgetSeries } from '../types';
3
4
  /** A single category entry in a bar series. */
4
5
  export interface BarDatum {
5
6
  name: string | number;
@@ -17,14 +18,18 @@ export interface BarOptionsInput {
17
18
  * Combined inputs for the option factory creator. Carries everything the
18
19
  * widget needs across BOTH phases — the structural-build (`theme`,
19
20
  * `formatter`, `labelFormatter`, `optionsOverride`) AND the data merge
20
- * (`seriesNames`, `selection`).
21
+ * (`series`, `selection`).
21
22
  */
22
23
  export interface BarOptionFactoryInput {
23
24
  theme: Theme;
24
25
  formatter?: (value: number) => string;
25
26
  labelFormatter?: (value: string | number) => string | number;
26
- /** Series names — drives the legend and `series[i].name`. */
27
- seriesNames?: readonly string[];
27
+ /**
28
+ * Per-series metadata — drives the legend, `series[i].name`, and
29
+ * (when `color` is set) per-series `itemStyle.color`. Paired with the
30
+ * data series by index.
31
+ */
32
+ series?: readonly WidgetSeries[];
28
33
  /**
29
34
  * When set, every datum whose `name` is **not** in this list renders dimmed
30
35
  * (`itemStyle.opacity: 0.15`, matching `outOfBrush` styling). `null`/empty
@@ -1,3 +1,4 @@
1
+ import { WidgetSeries } from '../types';
1
2
  /** A single row in a Category widget. `name` is the category key. */
2
3
  export interface CategoryDataItem {
3
4
  name: string | number;
@@ -26,10 +27,13 @@ export type CategoryKey = string | number;
26
27
  * gracefully (extra entries ignored; missing entries get palette
27
28
  * defaults and are absent from the legend).
28
29
  */
29
- export interface CategorySeriesConfig {
30
- name: string;
31
- color?: string;
32
- }
30
+ /**
31
+ * Per-series metadata. Type alias of the cross-widget
32
+ * {@link WidgetSeries} shape (`{ name, color? }`) so Category, Formula,
33
+ * Spread, and the echart-based widgets all consume the same input
34
+ * shape. Kept as a named export for backwards compatibility.
35
+ */
36
+ export type CategorySeriesConfig = WidgetSeries;
33
37
  /**
34
38
  * Labels for the "Other" overflow row (rendered when `data.length`
35
39
  * exceeds `maxItems`). `{count}` in `otherCount` is replaced with the
@@ -1,10 +1,13 @@
1
- /** Series metadata rendered as a coloured avatar at the start of a row. */
2
- export interface FormulaSeries {
3
- /** Used for the avatar's first-letter glyph and as accessible label. */
4
- name: string;
5
- /** Avatar background colour (any MUI palette path or CSS colour). */
6
- color?: string;
7
- }
1
+ import { WidgetSeries } from '../types';
2
+ /**
3
+ * Series metadata rendered as a coloured avatar at the start of a row.
4
+ *
5
+ * Type alias of the cross-widget {@link WidgetSeries} shape so the same
6
+ * `{ name, color? }` object can drive Formula avatars, Spread avatars,
7
+ * Category legends, and echart-widget legends with no per-widget shape
8
+ * gymnastics. Kept as a named export for backwards compatibility.
9
+ */
10
+ export type FormulaSeries = WidgetSeries;
8
11
  export type DeltaSeverity = 'positive' | 'negative' | 'neutral';
9
12
  /** Comparative delta rendered as a coloured chip on the right of a row. */
10
13
  export interface FormulaDelta {
@@ -1,5 +1,6 @@
1
1
  import { Theme } from '@mui/material';
2
2
  import { EChartsOption } from 'echarts';
3
+ import { WidgetSeries } from '../types';
3
4
  /**
4
5
  * Histogram widget data — array of series, each a flat array of bin counts.
5
6
  * The option factory's merge phase (see {@link createHistogramOptionFactory})
@@ -16,15 +17,18 @@ export interface HistogramOptionsInput {
16
17
  * Combined inputs for the histogram option factory creator. Carries
17
18
  * everything the widget needs across BOTH phases — the structural-build
18
19
  * (`theme`, `formatter`, `optionsOverride`) AND the data merge (`ticks`,
19
- * `seriesNames`, `labelFormatter`, `selection`).
20
+ * `series`, `labelFormatter`, `selection`).
20
21
  */
21
22
  export interface HistogramOptionFactoryInput {
22
23
  theme: Theme;
23
24
  formatter?: (value: number) => string;
24
25
  /** Bin boundaries — length = bins + 1. */
25
26
  ticks: readonly number[];
26
- /** Optional series names — drives the legend. */
27
- seriesNames?: readonly string[];
27
+ /**
28
+ * Per-series metadata — drives the legend, `series[i].name`, and
29
+ * (when `color` is set) a per-series colour override on the bars.
30
+ */
31
+ series?: readonly WidgetSeries[];
28
32
  /**
29
33
  * Bin-range label transform (e.g. `"0–10"` → `"[0–10)"`). Distinct from
30
34
  * the standard `OptionFactoryContext.labelFormatter` (which operates on
@@ -105,3 +105,4 @@ export type { SpreadUIProps, SpreadDataItem, SpreadWidgetData } from './spread';
105
105
  export type { RangeProps, RangeUIProps, RangeDataItem, RangeWidgetData, RangeItemValue, } from './range';
106
106
  export type { CategoryProps, CategoryUIProps, CategoryDataItem, CategoryWidgetData, CategoryKey, CategorySeriesConfig, CategoryLabels, } from './category';
107
107
  export type { TableProps, TableUIProps, TableColumn, TableRow, TableWidgetData, TableWidgetState, TableSortDirection, TableSortState, } from './table';
108
+ export type { WidgetSeries } from './types';
@@ -1,5 +1,6 @@
1
1
  import { Theme } from '@mui/material';
2
2
  import { EChartsOption } from 'echarts';
3
+ import { WidgetSeries } from '../types';
3
4
  /** A single slice of a pie series. */
4
5
  export interface PieDatum {
5
6
  name: string | number;
@@ -19,7 +20,7 @@ export interface PieOptionsInput {
19
20
  * Combined inputs for the pie option factory creator. Carries everything
20
21
  * the widget needs across BOTH phases — the structural-build (`theme`,
21
22
  * `formatter`, `labelFormatter`, `optionsOverride`) AND the data merge
22
- * (`seriesNames`, `radius`, `selection`). The merger emits different
23
+ * (`series`, `radius`, `selection`). The merger emits different
23
24
  * chart shapes by series count: single → donut, multi → horizontal-bar
24
25
  * fallback (mirrors v1 pie); both branches read `theme` for styling.
25
26
  */
@@ -27,8 +28,14 @@ export interface PieOptionFactoryInput {
27
28
  theme: Theme;
28
29
  formatter?: (value: number) => string;
29
30
  labelFormatter?: (value: string | number) => string | number;
30
- /** Series names — drives the legend and series.name. */
31
- seriesNames?: readonly string[];
31
+ /**
32
+ * Per-series metadata — drives the legend, `series[i].name`, and (in
33
+ * the multi-series bar fallback) per-series colour overrides.
34
+ * Single-series donuts always use the per-slice palette regardless of
35
+ * any `series[0].color`, since the donut palette is keyed by data
36
+ * index, not series index.
37
+ */
38
+ series?: readonly WidgetSeries[];
32
39
  /**
33
40
  * Inner/outer radius (percent). Default `['58%', '74%']` produces a
34
41
  * donut sized to leave room for the wrappable bottom legend. Set