@carto/ps-react-ui 4.11.0 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{change-column-BiuuHCDN.js → change-column-DjjwoPt1.js} +256 -269
- package/dist/change-column-DjjwoPt1.js.map +1 -0
- package/dist/{data-zoom-layout--YiY6ko_.js → data-zoom-layout-CkVnm6ej.js} +4 -5
- package/dist/{data-zoom-layout--YiY6ko_.js.map → data-zoom-layout-CkVnm6ej.js.map} +1 -1
- package/dist/echart-BMPpj7n_.js +250 -0
- package/dist/echart-BMPpj7n_.js.map +1 -0
- package/dist/{png-item-CS4z1iSH.js → png-item-BE9uEqlD.js} +2 -2
- package/dist/png-item-BE9uEqlD.js.map +1 -0
- package/dist/{spread-CPis22AE.js → spread-DYNpzgh_.js} +9 -11
- package/dist/{spread-CPis22AE.js.map → spread-DYNpzgh_.js.map} +1 -1
- package/dist/{table-CQCAnDLb.js → table-C9IMbTr0.js} +50 -53
- package/dist/table-C9IMbTr0.js.map +1 -0
- package/dist/types/widgets-v2/echart/edge-label-clamp.d.ts +57 -0
- package/dist/types/widgets-v2/echart/edge-label-clamp.test.d.ts +1 -0
- package/dist/widgets-v2/actions.js +2 -2
- package/dist/widgets-v2/bar.js +91 -105
- package/dist/widgets-v2/bar.js.map +1 -1
- package/dist/widgets-v2/category.js +27 -29
- package/dist/widgets-v2/category.js.map +1 -1
- package/dist/widgets-v2/echart.js +1 -1
- package/dist/widgets-v2/formula.js +24 -25
- package/dist/widgets-v2/formula.js.map +1 -1
- package/dist/widgets-v2/histogram.js +98 -112
- package/dist/widgets-v2/histogram.js.map +1 -1
- package/dist/widgets-v2/markdown.js +25 -27
- package/dist/widgets-v2/markdown.js.map +1 -1
- package/dist/widgets-v2/pie.js +7 -10
- package/dist/widgets-v2/pie.js.map +1 -1
- package/dist/widgets-v2/scatterplot.js +9 -12
- package/dist/widgets-v2/scatterplot.js.map +1 -1
- package/dist/widgets-v2/spread.js +14 -16
- package/dist/widgets-v2/spread.js.map +1 -1
- package/dist/widgets-v2/table.js +38 -40
- package/dist/widgets-v2/table.js.map +1 -1
- package/dist/widgets-v2/timeseries.js +106 -121
- package/dist/widgets-v2/timeseries.js.map +1 -1
- package/dist/widgets-v2/utils.js +1 -1
- package/dist/widgets-v2.js +43 -46
- package/dist/widgets-v2.js.map +1 -1
- package/package.json +1 -1
- package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +1 -1
- package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +1 -1
- package/src/widgets-v2/actions/download/download.tsx +1 -1
- package/src/widgets-v2/actions/download/icons.tsx +1 -1
- package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +3 -3
- package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +2 -2
- package/src/widgets-v2/actions/relative-data/relative-data.tsx +1 -1
- package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +1 -1
- package/src/widgets-v2/actions/searcher/searcher.tsx +2 -2
- package/src/widgets-v2/actions/show-all/show-all.tsx +1 -1
- package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +1 -1
- package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +1 -1
- package/src/widgets-v2/bar/options.test.ts +31 -4
- package/src/widgets-v2/bar/options.ts +18 -22
- package/src/widgets-v2/echart/echart-ui.test.tsx +70 -0
- package/src/widgets-v2/echart/echart-ui.tsx +28 -0
- package/src/widgets-v2/echart/edge-label-clamp.test.ts +198 -0
- package/src/widgets-v2/echart/edge-label-clamp.ts +216 -0
- package/src/widgets-v2/histogram/options.test.ts +11 -4
- package/src/widgets-v2/histogram/options.ts +17 -21
- package/src/widgets-v2/table/table-ui.tsx +4 -4
- package/src/widgets-v2/timeseries/options.test.ts +9 -4
- package/src/widgets-v2/timeseries/options.ts +17 -22
- package/src/widgets-v2/toolbox/toolbox.tsx +1 -1
- package/src/widgets-v2/wrapper/widget-wrapper.tsx +1 -1
- package/dist/change-column-BiuuHCDN.js.map +0 -1
- package/dist/echart-CU0KmClP.js +0 -176
- package/dist/echart-CU0KmClP.js.map +0 -1
- package/dist/png-item-CS4z1iSH.js.map +0 -1
- package/dist/table-CQCAnDLb.js.map +0 -1
package/dist/echart-CU0KmClP.js
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { jsx as j } from "react/jsx-runtime";
|
|
2
|
-
import { c as k } from "react/compiler-runtime";
|
|
3
|
-
import { useRef as M, useEffectEvent as w, useEffect as T } from "react";
|
|
4
|
-
import { u as N, a as D, m as L } from "./widget-store-registry-_W4Z4xp-.js";
|
|
5
|
-
import { u as U } from "./widget-context-DTGO0Yta.js";
|
|
6
|
-
import "zustand";
|
|
7
|
-
import { Box as P } from "@mui/material";
|
|
8
|
-
import * as C from "echarts";
|
|
9
|
-
const z = /* @__PURE__ */ new Map();
|
|
10
|
-
let g = null;
|
|
11
|
-
function K() {
|
|
12
|
-
return typeof ResizeObserver > "u" ? null : (g ??= new ResizeObserver((r) => {
|
|
13
|
-
for (const e of r)
|
|
14
|
-
z.get(e.target)?.();
|
|
15
|
-
}), g);
|
|
16
|
-
}
|
|
17
|
-
const W = () => {
|
|
18
|
-
};
|
|
19
|
-
function $(r, e) {
|
|
20
|
-
const t = K();
|
|
21
|
-
return t ? (z.set(r, e), t.observe(r), () => {
|
|
22
|
-
z.delete(r), g && (g.unobserve(r), z.size === 0 && (g.disconnect(), g = null));
|
|
23
|
-
}) : W;
|
|
24
|
-
}
|
|
25
|
-
function se() {
|
|
26
|
-
g && g.disconnect(), z.clear(), g = null;
|
|
27
|
-
}
|
|
28
|
-
const B = {
|
|
29
|
-
root: {
|
|
30
|
-
width: "100%",
|
|
31
|
-
minHeight: 0
|
|
32
|
-
}
|
|
33
|
-
}, G = {
|
|
34
|
-
renderer: "svg",
|
|
35
|
-
height: 304
|
|
36
|
-
};
|
|
37
|
-
function H(r) {
|
|
38
|
-
const e = k(21), {
|
|
39
|
-
option: t,
|
|
40
|
-
replaceMerge: s,
|
|
41
|
-
onEvents: c,
|
|
42
|
-
init: a,
|
|
43
|
-
onInstance: b,
|
|
44
|
-
className: x,
|
|
45
|
-
sx: y
|
|
46
|
-
} = r, h = M(null), i = M(null), l = M(null), A = M(null);
|
|
47
|
-
let v;
|
|
48
|
-
e[0] !== b ? (v = (n) => {
|
|
49
|
-
b?.(n);
|
|
50
|
-
}, e[0] = b, e[1] = v) : v = e[1];
|
|
51
|
-
const f = w(v);
|
|
52
|
-
let E;
|
|
53
|
-
e[2] !== a || e[3] !== f ? (E = () => {
|
|
54
|
-
if (!h.current)
|
|
55
|
-
return;
|
|
56
|
-
const n = C.init(h.current, null, {
|
|
57
|
-
...G,
|
|
58
|
-
...a
|
|
59
|
-
});
|
|
60
|
-
return i.current = n, f(n), () => {
|
|
61
|
-
f(null), n.dispose(), i.current = null;
|
|
62
|
-
};
|
|
63
|
-
}, e[2] = a, e[3] = f, e[4] = E) : E = e[4];
|
|
64
|
-
let u;
|
|
65
|
-
e[5] !== a ? (u = [a], e[5] = a, e[6] = u) : u = e[6], T(E, u);
|
|
66
|
-
let F, d;
|
|
67
|
-
e[7] !== t || e[8] !== s ? (F = () => {
|
|
68
|
-
const n = J(t), I = q(t), S = new Set(s ?? []);
|
|
69
|
-
n !== l.current && S.add("series"), I !== A.current && S.add("dataset"), l.current = n, A.current = I, i.current?.setOption(t, {
|
|
70
|
-
notMerge: !1,
|
|
71
|
-
lazyUpdate: !0,
|
|
72
|
-
replaceMerge: S.size > 0 ? Array.from(S) : void 0
|
|
73
|
-
});
|
|
74
|
-
}, d = [t, s], e[7] = t, e[8] = s, e[9] = F, e[10] = d) : (F = e[9], d = e[10]), T(F, d);
|
|
75
|
-
let _, m;
|
|
76
|
-
e[11] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (_ = () => {
|
|
77
|
-
const n = h.current;
|
|
78
|
-
if (n)
|
|
79
|
-
return $(n, () => {
|
|
80
|
-
i.current?.resize();
|
|
81
|
-
});
|
|
82
|
-
}, m = [], e[11] = _, e[12] = m) : (_ = e[11], m = e[12]), T(_, m);
|
|
83
|
-
let O, p;
|
|
84
|
-
e[13] !== c ? (O = () => {
|
|
85
|
-
const n = i.current;
|
|
86
|
-
if (!(!n || !c)) {
|
|
87
|
-
for (const [I, S] of Object.entries(c))
|
|
88
|
-
n.on(I, S);
|
|
89
|
-
return () => {
|
|
90
|
-
for (const [I, S] of Object.entries(c))
|
|
91
|
-
n.off(I, S);
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}, p = [c], e[13] = c, e[14] = O, e[15] = p) : (O = e[14], p = e[15]), T(O, p);
|
|
95
|
-
let o;
|
|
96
|
-
e[16] !== y ? (o = {
|
|
97
|
-
...B.root,
|
|
98
|
-
...y
|
|
99
|
-
}, e[16] = y, e[17] = o) : o = e[17];
|
|
100
|
-
let R;
|
|
101
|
-
return e[18] !== x || e[19] !== o ? (R = /* @__PURE__ */ j(P, { ref: h, className: x, sx: o }), e[18] = x, e[19] = o, e[20] = R) : R = e[20], R;
|
|
102
|
-
}
|
|
103
|
-
function J(r) {
|
|
104
|
-
const e = r.series;
|
|
105
|
-
return Array.isArray(e) ? e.map((t) => {
|
|
106
|
-
if (t == null || typeof t != "object") return String(t);
|
|
107
|
-
const s = t;
|
|
108
|
-
return [
|
|
109
|
-
s.type,
|
|
110
|
-
s.datasetIndex,
|
|
111
|
-
s.name,
|
|
112
|
-
s.stack,
|
|
113
|
-
// `encode` is small; stringify is cheap and stable for plain objects.
|
|
114
|
-
JSON.stringify(s.encode ?? null)
|
|
115
|
-
].join("|");
|
|
116
|
-
}).join("||") : e ? "1" : "";
|
|
117
|
-
}
|
|
118
|
-
function q(r) {
|
|
119
|
-
const e = r.dataset;
|
|
120
|
-
return Array.isArray(e) ? String(e.length) : e ? "1" : "";
|
|
121
|
-
}
|
|
122
|
-
const Q = ["toolbox"], V = (r) => ({
|
|
123
|
-
data: r.data,
|
|
124
|
-
configTransforms: r.configTransforms,
|
|
125
|
-
formatter: r.formatter,
|
|
126
|
-
labelFormatter: r.labelFormatter
|
|
127
|
-
});
|
|
128
|
-
function oe(r) {
|
|
129
|
-
const e = k(22), {
|
|
130
|
-
optionFactory: t,
|
|
131
|
-
onEvents: s,
|
|
132
|
-
init: c,
|
|
133
|
-
className: a
|
|
134
|
-
} = r, b = U(), x = N(b, V);
|
|
135
|
-
let y;
|
|
136
|
-
e[0] !== b ? (y = (o) => L(b, o), e[0] = b, e[1] = y) : y = e[1];
|
|
137
|
-
const h = y, {
|
|
138
|
-
data: i,
|
|
139
|
-
configTransforms: l,
|
|
140
|
-
formatter: A,
|
|
141
|
-
labelFormatter: v
|
|
142
|
-
} = x;
|
|
143
|
-
let f;
|
|
144
|
-
e[2] !== t ? (f = t(void 0, void 0), e[2] = t, e[3] = f) : f = e[3];
|
|
145
|
-
const E = f;
|
|
146
|
-
let u;
|
|
147
|
-
e[4] !== l || e[5] !== E ? (u = D(E, l), e[4] = l, e[5] = E, e[6] = u) : u = e[6];
|
|
148
|
-
const F = u;
|
|
149
|
-
let d;
|
|
150
|
-
if (e[7] !== l) {
|
|
151
|
-
const o = new Set(Q);
|
|
152
|
-
for (const R of l)
|
|
153
|
-
if (R.enabled && R.replaceMergeKeys?.length)
|
|
154
|
-
for (const n of R.replaceMergeKeys)
|
|
155
|
-
o.add(n);
|
|
156
|
-
d = Array.from(o).sort(), e[7] = l, e[8] = d;
|
|
157
|
-
} else
|
|
158
|
-
d = e[8];
|
|
159
|
-
const _ = d;
|
|
160
|
-
let m;
|
|
161
|
-
e[9] !== t || e[10] !== i || e[11] !== A || e[12] !== v || e[13] !== F ? (m = t(F, i, {
|
|
162
|
-
formatter: A,
|
|
163
|
-
labelFormatter: v
|
|
164
|
-
}), e[9] = t, e[10] = i, e[11] = A, e[12] = v, e[13] = F, e[14] = m) : m = e[14];
|
|
165
|
-
const O = m;
|
|
166
|
-
let p;
|
|
167
|
-
return e[15] !== a || e[16] !== c || e[17] !== s || e[18] !== h || e[19] !== O || e[20] !== _ ? (p = /* @__PURE__ */ j(H, { option: O, replaceMerge: _, onEvents: s, init: c, onInstance: h, className: a }), e[15] = a, e[16] = c, e[17] = s, e[18] = h, e[19] = O, e[20] = _, e[21] = p) : p = e[21], p;
|
|
168
|
-
}
|
|
169
|
-
export {
|
|
170
|
-
G as D,
|
|
171
|
-
oe as E,
|
|
172
|
-
se as _,
|
|
173
|
-
H as a,
|
|
174
|
-
$ as o
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=echart-CU0KmClP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"echart-CU0KmClP.js","sources":["../src/widgets-v2/echart/shared-resize-observer.ts","../src/widgets-v2/echart/style.ts","../src/widgets-v2/echart/echart-ui.tsx","../src/widgets-v2/echart/echart.tsx"],"sourcesContent":["type ResizeCallback = () => void\n\nconst callbacks = new Map<Element, ResizeCallback>()\nlet observer: ResizeObserver | null = null\n\n/**\n * Returns the singleton ResizeObserver, lazily constructing it on first use.\n * Returns `null` when `ResizeObserver` is not available in the global scope\n * (SSR, very old browsers, or tests that intentionally remove it).\n */\nfunction getObserver(): ResizeObserver | null {\n if (typeof ResizeObserver === 'undefined') return null\n observer ??= new ResizeObserver((entries) => {\n for (const entry of entries) {\n const callback = callbacks.get(entry.target)\n callback?.()\n }\n })\n return observer\n}\n\nconst NOOP_CLEANUP = (): void => undefined\n\nexport function observeResize(\n element: Element,\n callback: ResizeCallback,\n): () => void {\n const ro = getObserver()\n // Gracefully degrade when no ResizeObserver is available — consumers\n // still see one initial measure() pass via their own effect; we just\n // skip the subsequent resize-driven re-measures.\n if (!ro) return NOOP_CLEANUP\n callbacks.set(element, callback)\n ro.observe(element)\n return () => {\n callbacks.delete(element)\n if (observer) {\n observer.unobserve(element)\n // Disconnect the singleton once the last subscriber leaves so the\n // observer doesn't outlive its consumers in SSR teardown / micro-\n // frontend unmount scenarios. A subsequent observeResize() will\n // lazily re-create it via getObserver().\n if (callbacks.size === 0) {\n observer.disconnect()\n observer = null\n }\n }\n }\n}\n\n/** @internal — for tests only. */\nexport function __resetSharedResizeObserver(): void {\n if (observer) observer.disconnect()\n callbacks.clear()\n observer = null\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n width: '100%',\n minHeight: 0,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, useEffectEvent, useRef } from 'react'\nimport { Box, type SxProps, type Theme } from '@mui/material'\nimport * as echarts from 'echarts'\nimport { observeResize } from './shared-resize-observer'\nimport { styles } from './style'\n\nexport const DEFAULT_INIT_OPTS = {\n renderer: 'svg',\n height: 304,\n} satisfies echarts.EChartsInitOpts\n\nexport type EchartsEventHandler = (event: unknown) => void\n\nexport interface EchartUIProps {\n option: echarts.EChartsOption\n /**\n * Keys to merge as arrays (replace by index) instead of by id. The middleware\n * memoizes this content-stably, so identical sets don't re-trigger setOption.\n */\n replaceMerge?: readonly string[]\n /**\n * Opaque ECharts event passthrough — handlers fire untransformed.\n *\n * **Must be referentially stable** (memoize it with `useMemo` /\n * `useCallback`, or hoist to module scope). The binding effect depends on\n * the `onEvents` object identity; an inline `{ click: handler }` literal\n * recreates the object on every render and causes every listener to be\n * detached and re-attached each commit.\n */\n onEvents?: Record<string, EchartsEventHandler>\n /**\n * Init options forwarded to echarts.init. Captured at mount only — to change\n * `renderer` or `height` after mount, unmount and remount the chart.\n * Defaults: `{ renderer: 'svg', height: 304 }`.\n */\n init?: echarts.EChartsInitOpts\n /**\n * Optional callback fired once after the ECharts instance is created\n * (`onInstance(chart)`) and once when it's about to be disposed\n * (`onInstance(null)`). Used by `Widget.Echart` to publish the live\n * instance to the per-widget registry so other actions (e.g.\n * `ZoomToggle`'s disable handler) can reach it without DOM lookups.\n * No need to memoize — the bridge wraps it in `useEffectEvent` so an\n * unstable reference does not re-init the chart.\n */\n onInstance?: (chart: echarts.ECharts | null) => void\n className?: string\n sx?: SxProps<Theme>\n}\n\nexport function EchartUI({\n option,\n replaceMerge,\n onEvents,\n init,\n onInstance,\n className,\n sx,\n}: EchartUIProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const chartRef = useRef<echarts.ECharts | null>(null)\n\n // Structural fingerprint of the last applied series / dataset arrays.\n // Used to decide whether the next `setOption` should *replace* those\n // components (when their shape changed) or *merge* them (when only\n // styling-level fields differ — e.g. a new `itemStyle.color` callback\n // from a selection update). Replacing wipes ECharts' per-series runtime\n // state (hover, animation cache, brush areas), so we want to do it only\n // when the structure actually moved.\n const seriesFingerprintRef = useRef<string | null>(null)\n const datasetFingerprintRef = useRef<string | null>(null)\n\n // Stable notify wrapper — always reads the latest `onInstance` prop\n // without forcing the init effect below to re-run when the parent\n // passes a fresh function reference. The init effect now only fires\n // when `init` actually changes (documented as mount-only anyway).\n const notifyInstance = useEffectEvent(\n (chart: echarts.ECharts | null): void => {\n onInstance?.(chart)\n },\n )\n\n // Init / dispose. `init` is captured once at mount.\n useEffect(() => {\n if (!containerRef.current) return undefined\n const chart = echarts.init(containerRef.current, null, {\n ...DEFAULT_INIT_OPTS,\n ...init,\n })\n chartRef.current = chart\n notifyInstance(chart)\n return () => {\n // Notify observers *before* disposal so any queued imperative\n // dispatches (e.g. ZoomToggle's `setOption` cleanup) see the\n // instance disappear before its DOM is torn down.\n notifyInstance(null)\n chart.dispose()\n chartRef.current = null\n }\n }, [init])\n\n // Apply option / replaceMerge changes via merge mode (no remount required).\n useEffect(() => {\n const seriesFp = computeSeriesFingerprint(option)\n const datasetFp = computeDatasetFingerprint(option)\n const augmented = new Set<string>(replaceMerge ?? [])\n if (seriesFp !== seriesFingerprintRef.current) augmented.add('series')\n if (datasetFp !== datasetFingerprintRef.current) augmented.add('dataset')\n seriesFingerprintRef.current = seriesFp\n datasetFingerprintRef.current = datasetFp\n chartRef.current?.setOption(option, {\n notMerge: false,\n lazyUpdate: true,\n replaceMerge: augmented.size > 0 ? Array.from(augmented) : undefined,\n })\n }, [option, replaceMerge])\n\n // Resize via shared singleton observer.\n useEffect(() => {\n const node = containerRef.current\n if (!node) return undefined\n return observeResize(node, () => {\n chartRef.current?.resize()\n })\n }, [])\n\n // Bind / unbind opaque event handlers.\n useEffect(() => {\n const chart = chartRef.current\n if (!chart || !onEvents) return undefined\n for (const [event, handler] of Object.entries(onEvents)) {\n chart.on(event, handler)\n }\n return () => {\n for (const [event, handler] of Object.entries(onEvents)) {\n chart.off(event, handler)\n }\n }\n }, [onEvents])\n\n return (\n <Box\n ref={containerRef}\n className={className}\n sx={{ ...styles.root, ...sx }}\n />\n )\n}\n\n/**\n * Cheap structural digest of the option's `series` array — covers the fields\n * that actually demand a `replaceMerge` (length, type, datasetIndex, name,\n * stack, encode). Excludes runtime-style fields like `itemStyle` (callbacks\n * have unstable identity but don't change structure).\n */\nfunction computeSeriesFingerprint(option: echarts.EChartsOption): string {\n const series = option.series\n if (!Array.isArray(series)) return series ? '1' : ''\n return series\n .map((s) => {\n if (s == null || typeof s !== 'object') return String(s)\n const o = s as Record<string, unknown>\n return [\n o.type,\n o.datasetIndex,\n o.name,\n o.stack,\n // `encode` is small; stringify is cheap and stable for plain objects.\n JSON.stringify(o.encode ?? null),\n ].join('|')\n })\n .join('||')\n}\n\n/**\n * Structural digest of the option's `dataset` array — count is the only\n * thing that needs `replaceMerge` here. Row-level changes are picked up by\n * ECharts' default merge.\n */\nfunction computeDatasetFingerprint(option: echarts.EChartsOption): string {\n const dataset = option.dataset\n if (!Array.isArray(dataset)) return dataset ? '1' : ''\n return String(dataset.length)\n}\n","import { useCallback, useMemo } from 'react'\nimport type * as echarts from 'echarts'\nimport {\n applyTransforms,\n setEchartInstance,\n useWidgetId,\n useWidgetShallow,\n type Transform,\n} from '../stores'\nimport { EchartUI, type EchartsEventHandler } from './echart-ui'\n\n/**\n * Default ECharts `replaceMerge` keys for every widget. `dataZoom` and\n * `brush` are omitted so ZoomToggle / BrushToggle's user-driven runtime\n * state (slider range, brushed areas in `multiple` mode) survives unrelated\n * re-renders. `series` and `dataset` are also omitted: EchartUI fingerprints\n * them per-render and adds them to `replaceMerge` only when their shape\n * actually changes, keeping ECharts' per-series runtime state alive when\n * only callback-style fields differ.\n *\n * Lives in this module (not the generic store) because it's an ECharts\n * concept. Module-private — callers should not need it.\n */\nconst DEFAULT_REPLACE_MERGE: readonly string[] = ['toolbox']\n\n/**\n * Reactive context passed to every {@link OptionFactory} call so the\n * factory can rebuild render-time pieces (axis label / tooltip formatters)\n * from the live store. Drives RelativeData / consumer-formatter changes\n * through to the chart without rebuilding the structural option.\n */\nexport interface OptionFactoryContext {\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}\n\n/**\n * The per-widget option factory — a single callable that owns BOTH phases\n * of option construction:\n *\n * - **Structural phase** — when `option == null`, return the theme-aware\n * structural option (tooltip / legend / color palette / series\n * template, optionally merged with a consumer-supplied `optionsOverride`).\n * No data is read. `<Widget.Echart>` calls the factory with\n * `(undefined, undefined)` synchronously during render to derive the\n * structural base; `configTransforms` (Stack/Zoom/Brush) then mutate it\n * in the same render pass.\n * - **Merge phase** — when `option` is defined, fuse `data` into the\n * post-configTransforms option at fusion time. `<Widget.Echart>` calls\n * the factory with `(transformed, data, ctx)` on every render.\n *\n * The two phases share a closure (the factory creator captures `theme`,\n * `formatter`, `labelFormatter`, `seriesNames`, `selection`, `optionsOverride`,\n * …), so structural and merge agree on the same widget configuration.\n *\n * The third arg `ctx` carries the **live** store-side formatters at the\n * call site — distinct from the closure-time formatters because actions\n * like RelativeData can install a percent formatter on the store after\n * the factory was constructed. The merge phase reads from `ctx`; the\n * structural phase typically uses the closure-time values.\n */\nexport type OptionFactory = (\n option: echarts.EChartsOption | undefined,\n data: unknown,\n ctx?: OptionFactoryContext,\n) => echarts.EChartsOption\n\nexport interface EchartProps {\n /**\n * The per-widget {@link OptionFactory}. Required — `<Widget.Echart>`\n * derives the structural option from it (so configTransforms have a base\n * to mutate) and fuses `state.data` into the post-pipeline option at\n * render time. Wrap the factory creator in `useMemo` so its identity is\n * stable across renders.\n */\n optionFactory: OptionFactory\n onEvents?: Record<string, EchartsEventHandler>\n init?: echarts.EChartsInitOpts\n className?: string\n}\n\ninterface EchartSlice {\n data: unknown\n configTransforms: readonly Transform[]\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}\n\nconst echartSelector = (s: {\n data: unknown\n configTransforms: readonly Transform[]\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}): EchartSlice => ({\n data: s.data,\n configTransforms: s.configTransforms,\n formatter: s.formatter,\n labelFormatter: s.labelFormatter,\n})\n\n/**\n * Stateful Echart bridge — owns the entire ECharts coupling. The whole\n * option pipeline lives here, not in the store:\n *\n * 1. **Structural** — `optionFactory(undefined, undefined)` produces the\n * theme-aware base. Memoized on the factory identity, so the consumer's\n * `useMemo` ID gates the rebuild.\n * 2. **Transformed** — `applyTransforms(structural, configTransforms)`\n * applies any registered configTransforms (Stack/Zoom/Brush) over the\n * structural base. Memoized on `[structural, configTransforms]`.\n * 3. **`replaceMerge`** — derived from the enabled configTransforms'\n * `replaceMergeKeys`, deduped and sorted, seeded with\n * {@link DEFAULT_REPLACE_MERGE}. Memoized on `[configTransforms]` so\n * ECharts sees a stable array reference across non-transform changes.\n * 4. **Merge** — `optionFactory(transformed, data, ctx)` fuses post-\n * pipeline data into the option. Reactive `ctx` carries the live store\n * formatters so RelativeData's percent formatter flows through without\n * a structural rebuild.\n *\n * The `<Widget.Provider>` doesn't know about the factory at all: it stays\n * a renderer-agnostic shell. The `ProviderProps` surface has no ECharts\n * coupling, so non-Echart widgets don't transitively import the type.\n */\nexport function Echart({\n optionFactory,\n onEvents,\n init,\n className,\n}: EchartProps) {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, echartSelector)\n\n // Publish the live ECharts instance to the per-id registry so actions\n // (e.g. `ZoomToggle`'s disable handler) can reach it imperatively. The\n // callback identity is stable across renders (only `id` is in deps), so\n // EchartUI's init effect doesn't see a fresh `onInstance` and re-init.\n const onInstance = useCallback(\n (chart: echarts.ECharts | null) => setEchartInstance(id, chart),\n [id],\n )\n\n // Destructure so React Compiler sees specific deps instead of inferring\n // the whole `slice` object. `useWidgetShallow` already shallow-compares\n // the slice, so per-field deps drive each memo exactly when its inputs\n // change.\n const {\n data: sliceData,\n configTransforms,\n formatter: sliceFormatter,\n labelFormatter: sliceLabelFormatter,\n } = slice\n\n const structural = useMemo(\n () => optionFactory(undefined, undefined),\n [optionFactory],\n )\n\n const transformed = useMemo(\n () =>\n applyTransforms(structural, configTransforms) as echarts.EChartsOption,\n [structural, configTransforms],\n )\n\n const replaceMerge = useMemo(() => {\n const keys = new Set<string>(DEFAULT_REPLACE_MERGE)\n for (const xf of configTransforms) {\n if (xf.enabled && xf.replaceMergeKeys?.length) {\n for (const k of xf.replaceMergeKeys) keys.add(k)\n }\n }\n return Array.from(keys).sort()\n }, [configTransforms])\n\n const option = useMemo(\n () =>\n optionFactory(transformed, sliceData, {\n formatter: sliceFormatter,\n labelFormatter: sliceLabelFormatter,\n }),\n [\n optionFactory,\n transformed,\n sliceData,\n sliceFormatter,\n sliceLabelFormatter,\n ],\n )\n\n return (\n <EchartUI\n option={option}\n replaceMerge={replaceMerge}\n onEvents={onEvents}\n init={init}\n onInstance={onInstance}\n className={className}\n />\n )\n}\n"],"names":["callbacks","Map","observer","getObserver","ResizeObserver","entries","entry","callback","get","target","NOOP_CLEANUP","observeResize","element","ro","set","observe","delete","unobserve","size","disconnect","__resetSharedResizeObserver","clear","styles","root","width","minHeight","DEFAULT_INIT_OPTS","renderer","height","EchartUI","t0","$","_c","option","replaceMerge","onEvents","init","onInstance","className","sx","containerRef","useRef","chartRef","seriesFingerprintRef","datasetFingerprintRef","t1","chart","notifyInstance","useEffectEvent","t2","current","chart_0","echarts","dispose","t3","useEffect","t4","t5","seriesFp","computeSeriesFingerprint","datasetFp","computeDatasetFingerprint","augmented","Set","add","setOption","notMerge","lazyUpdate","Array","from","undefined","t6","t7","Symbol","for","node","resize","t8","t9","chart_1","event","handler","Object","on","event_0","handler_0","off","t10","t11","Box","series","isArray","map","s","String","o","type","datasetIndex","name","stack","JSON","stringify","encode","join","dataset","length","DEFAULT_REPLACE_MERGE","echartSelector","data","configTransforms","formatter","labelFormatter","Echart","optionFactory","id","useWidgetId","slice","useWidgetShallow","setEchartInstance","sliceData","sliceFormatter","sliceLabelFormatter","structural","applyTransforms","transformed","keys","xf","enabled","replaceMergeKeys","k","sort"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"png-item-CS4z1iSH.js","sources":["../src/widgets-v2/actions/download/icons.tsx","../src/widgets-v2/actions/download/png-item.tsx"],"sourcesContent":["import { SvgIcon, type SvgIconProps } from '@mui/material'\nimport ImageOutlined from '@mui/icons-material/ImageOutlined'\n\n/**\n * Generic \"image\" glyph used for the PNG download item. Wraps MUI's\n * `ImageOutlined` so callers can swap it via the per-widget download\n * config's `icon` override without pulling MUI directly.\n */\nexport function PNGIcon(props: SvgIconProps) {\n return <ImageOutlined {...props} />\n}\n\n/**\n * \"CSV\" rectangle with the letters spelled inside — matches v1 visual and is\n * easier to recognise in a download menu than a generic table glyph.\n */\nexport function CSVIcon(props: SvgIconProps) {\n return (\n <SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n d='M4.313 11.25h2.25v-1.125H4.688v-2.25h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v3c0 .213.072.39.216.534a.726.726 0 0 0 .534.216Zm2.925 0h2.25c.212 0 .39-.072.534-.216a.726.726 0 0 0 .216-.534V9.375a.931.931 0 0 0-.216-.59.658.658 0 0 0-.534-.273H8.363v-.637h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v1.125c0 .213.072.403.216.572a.675.675 0 0 0 .534.253h1.126v.675H7.238v1.125Zm4.95 0h1.124l1.313-4.5H13.5l-.75 2.588L12 6.75h-1.125l1.313 4.5ZM3 15c-.413 0-.766-.147-1.06-.44a1.445 1.445 0 0 1-.44-1.06v-9c0-.412.147-.766.44-1.06C2.235 3.148 2.588 3 3 3h12c.412 0 .766.147 1.06.44.293.294.44.648.44 1.06v9c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3Zm0-1.5h12v-9H3v9Z'\n />\n </SvgIcon>\n )\n}\n","import { downloadDOMToPNG } from './exports'\nimport { PNGIcon } from './icons'\nimport type { DownloadItem } from './types'\n\nexport interface BuildPngDownloadItemArgs {\n /** Base filename (without extension). The item appends `.png`. */\n filename: string\n /**\n * Reads the capture element to rasterise. Called at click time so the\n * download config doesn't capture a stale reference. Wire it to\n * `() => getCaptureEl(id)` from `widgets-v2/stores`.\n */\n getCaptureEl: () => HTMLElement | null\n /** html2canvas `scale`. Default 2. */\n pixelRatio?: number\n /** html2canvas `backgroundColor`. Default transparent (`null`). */\n backgroundColor?: string | null\n /** Override the menu label. Default `'PNG'`. */\n label?: string\n}\n\n/**\n * Builds the standard PNG `DownloadItem` used by every per-widget download\n * config. Centralised so the menu label, icon, error message, and filename\n * suffix stay consistent across widgets without each `create*DownloadConfig`\n * re-deriving the same shape.\n */\nexport function buildPngDownloadItem(\n args: BuildPngDownloadItemArgs,\n): DownloadItem {\n return {\n id: 'png',\n label: args.label ?? 'PNG',\n icon: <PNGIcon fontSize='small' />,\n resolve: async () => {\n const el = args.getCaptureEl()\n if (!el) {\n throw new Error('[widgets-v2] No PNG capture element available')\n }\n const handle = await downloadDOMToPNG({\n element: el,\n pixelRatio: args.pixelRatio,\n backgroundColor: args.backgroundColor,\n })\n return {\n url: handle.url,\n filename: `${args.filename}.png`,\n revoke: handle.revoke,\n }\n },\n }\n}\n"],"names":["PNGIcon","props","$","_c","t0","jsx","ImageOutlined","CSVIcon","Symbol","for","t1","SvgIcon","buildPngDownloadItem","args","id","label","icon","resolve","el","getCaptureEl","Error","handle","downloadDOMToPNG","element","pixelRatio","backgroundColor","url","filename","revoke"],"mappings":";;;;;AAQO,SAAAA,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAAA,MAAAC;AAAA,SAAAF,SAAAD,KACEG,IAAA,gBAAAC,EAACC,GAAA,EAAa,GAAKL,EAAAA,CAAK,GAAIC,OAAAD,GAAAC,OAAAE,KAAAA,IAAAF,EAAA,CAAA,GAA5BE;AAA4B;AAO9B,SAAAG,EAAAN,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAAA,MAAAC;AAAA,EAAAF,EAAA,CAAA,MAAAM,uBAAAC,IAAA,2BAAA,KAGDL,IAAA,gBAAAC,EAAA,QAAA,EACO,MAAA,gBACH,GAAA,gtBAA8sB,GAChtBH,OAAAE,KAAAA,IAAAF,EAAA,CAAA;AAAA,MAAAQ;AAAA,SAAAR,SAAAD,KAJJS,sBAACC,GAAA,EAAgB,SAAA,aAAW,GAAKV,GAC/BG,UAAAA,GAIF,GAAUF,OAAAD,GAAAC,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GALVQ;AAKU;ACIP,SAASE,EACdC,GACc;AACd,SAAO;AAAA,IACLC,IAAI;AAAA,IACJC,OAAOF,EAAKE,SAAS;AAAA,IACrBC,MAAM,gBAAAX,EAACL,GAAA,EAAQ,UAAS,QAAA,CAAO;AAAA,IAC/BiB,SAAS,YAAY;AACnB,YAAMC,IAAKL,EAAKM,aAAAA;AAChB,UAAI,CAACD;AACH,cAAM,IAAIE,MAAM,+CAA+C;AAEjE,YAAMC,IAAS,MAAMC,EAAiB;AAAA,QACpCC,SAASL;AAAAA,QACTM,YAAYX,EAAKW;AAAAA,QACjBC,iBAAiBZ,EAAKY;AAAAA,MAAAA,CACvB;AACD,aAAO;AAAA,QACLC,KAAKL,EAAOK;AAAAA,QACZC,UAAU,GAAGd,EAAKc,QAAQ;AAAA,QAC1BC,QAAQP,EAAOO;AAAAA,MAAAA;AAAAA,IAEnB;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|