@object-ui/plugin-dashboard 4.0.12 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/dist/index.js +187 -156
- package/dist/index.umd.cjs +1 -1
- package/dist/packages/plugin-dashboard/src/DashboardRenderer.d.ts.map +1 -1
- package/dist/packages/plugin-dashboard/src/DrillDownDrawer.d.ts +8 -0
- package/dist/packages/plugin-dashboard/src/DrillDownDrawer.d.ts.map +1 -1
- package/dist/packages/plugin-dashboard/src/ObjectMetricWidget.d.ts +7 -0
- package/dist/packages/plugin-dashboard/src/ObjectMetricWidget.d.ts.map +1 -1
- package/dist/packages/plugin-dashboard/src/ObjectPivotTable.d.ts.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# @object-ui/plugin-dashboard
|
|
2
2
|
|
|
3
|
+
## 4.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @object-ui/types@4.2.1
|
|
8
|
+
- @object-ui/core@4.2.1
|
|
9
|
+
- @object-ui/i18n@4.2.1
|
|
10
|
+
- @object-ui/react@4.2.1
|
|
11
|
+
- @object-ui/components@4.2.1
|
|
12
|
+
- @object-ui/fields@4.2.1
|
|
13
|
+
|
|
14
|
+
## 4.2.0
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [eb738bd]
|
|
19
|
+
- Updated dependencies [650392e]
|
|
20
|
+
- Updated dependencies [84b4bf1]
|
|
21
|
+
- @object-ui/i18n@4.2.0
|
|
22
|
+
- @object-ui/components@4.2.0
|
|
23
|
+
- @object-ui/fields@4.2.0
|
|
24
|
+
- @object-ui/react@4.2.0
|
|
25
|
+
- @object-ui/types@4.2.0
|
|
26
|
+
- @object-ui/core@4.2.0
|
|
27
|
+
|
|
28
|
+
## 4.1.0
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- c26e0d5: Gauge widgets bound to an object (`type: 'gauge' | 'solid-gauge'` + `object`) now honor display options that were previously dropped on the floor when the renderer fell back to `object-metric`:
|
|
33
|
+
- `format` (e.g. `'0%'`), `currency`, `prefix`, `suffix` are now forwarded to the underlying metric widget.
|
|
34
|
+
- New `invert` option on `ObjectMetricWidget`: when the aggregated value is a rate in `[0, 1]`, displays `1 - value`. Useful for "compliance" / "uptime" gauges that aggregate the opposite signal (e.g. `avg(is_sla_violated)` → display the SLA compliance rate).
|
|
35
|
+
|
|
36
|
+
### Patch Changes
|
|
37
|
+
|
|
38
|
+
- @object-ui/types@4.1.0
|
|
39
|
+
- @object-ui/core@4.1.0
|
|
40
|
+
- @object-ui/i18n@4.1.0
|
|
41
|
+
- @object-ui/react@4.1.0
|
|
42
|
+
- @object-ui/components@4.1.0
|
|
43
|
+
- @object-ui/fields@4.1.0
|
|
44
|
+
|
|
3
45
|
## 4.0.12
|
|
4
46
|
|
|
5
47
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,9 @@ import { ComponentRegistry as e, computeDrillFilter as t, extractRecords as n, i
|
|
|
2
2
|
import { SchemaRenderer as o, SchemaRendererContext as s, useActionEngine as c, useDataScope as l, useDnd as u, useHasDndProvider as d, useObjectLabel as f } from "@object-ui/react";
|
|
3
3
|
import { Button as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _, Combobox as v, ConfigPanelRenderer as y, ConfigRow as b, Dialog as x, DialogContent as S, DialogHeader as C, DialogTitle as w, Sheet as T, SheetContent as E, SheetHeader as D, SheetTitle as O, Skeleton as k, cn as A, getLazyIcon as j, useConfigDraft as M } from "@object-ui/components";
|
|
4
4
|
import * as N from "react";
|
|
5
|
-
import { Fragment as ee, forwardRef as
|
|
6
|
-
import { AlertCircle as
|
|
7
|
-
import { DndContext as
|
|
5
|
+
import { Fragment as ee, forwardRef as te, useCallback as P, useContext as ne, useEffect as F, useMemo as I, useRef as re, useState as L } from "react";
|
|
6
|
+
import { AlertCircle as R, ArrowDownIcon as z, ArrowUpIcon as ie, Edit as B, GripVertical as V, Loader2 as ae, MinusIcon as H, RefreshCw as oe, Save as se, Settings as U, X as W } from "lucide-react";
|
|
7
|
+
import { DndContext as ce, PointerSensor as G, closestCenter as K, useSensor as le, useSensors as ue } from "@dnd-kit/core";
|
|
8
8
|
import { SortableContext as de, arrayMove as fe, rectSortingStrategy as pe, useSortable as me, verticalListSortingStrategy as he } from "@dnd-kit/sortable";
|
|
9
9
|
import { CSS as q } from "@dnd-kit/utilities";
|
|
10
10
|
import { Fragment as J, jsx as Y, jsxs as X } from "react/jsx-runtime";
|
|
@@ -65,7 +65,7 @@ var Oe = [
|
|
|
65
65
|
function Ae(e) {
|
|
66
66
|
return ke.has(e) ? { enabled: !0 } : void 0;
|
|
67
67
|
}
|
|
68
|
-
var $ =
|
|
68
|
+
var $ = te(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount: i, userActions: a, designMode: s, selectedWidgetId: l, onWidgetClick: u, onWidgetsReorder: d, modalHandler: v, scriptHandlers: y, hideHeaderText: b, ...x }, S) => {
|
|
69
69
|
let C = (() => {
|
|
70
70
|
if (e.columns != null) return e.columns;
|
|
71
71
|
let t = e.widgets ?? [], n = 0;
|
|
@@ -74,44 +74,44 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
74
74
|
t > n && (n = t), (e.layout?.w ?? 0) > n && (n = e.layout.w);
|
|
75
75
|
}
|
|
76
76
|
return n > 4 ? 12 : 4;
|
|
77
|
-
})(), w = C, T = e.gap || 4, [E, D] =
|
|
77
|
+
})(), w = C, T = e.gap || 4, [E, D] = L(!1), [O, k] = L(!1), j = re(null), { executeAction: M, engine: N } = c({ actions: I(() => (e.header?.actions ?? []).map((e) => ({
|
|
78
78
|
name: e.actionUrl || e.label,
|
|
79
79
|
type: e.actionType || "url",
|
|
80
80
|
target: e.actionUrl,
|
|
81
81
|
label: e.label
|
|
82
|
-
})), [e.header?.actions]) }), { dashboardLabel:
|
|
82
|
+
})), [e.header?.actions]) }), { dashboardLabel: te, dashboardDescription: ne, dashboardActionLabel: R, widgetTitle: z, widgetDescription: ie, fieldLabel: B } = f(), V = e.name, ae = P((e) => V ? R(V, e.actionUrl || e.label, e.label) : e.label, [V, R]), H = P((e) => {
|
|
83
83
|
let t = Q(e.title);
|
|
84
|
-
return !
|
|
85
|
-
}, [
|
|
84
|
+
return !V || !e.id || t === void 0 ? t : z(V, e.id, t);
|
|
85
|
+
}, [V, z]), se = P((e) => {
|
|
86
86
|
let t = Q(e.description);
|
|
87
|
-
return !
|
|
88
|
-
}, [
|
|
89
|
-
|
|
87
|
+
return !V || !e.id ? t : ie(V, e.id, t);
|
|
88
|
+
}, [V, ie]);
|
|
89
|
+
F(() => {
|
|
90
90
|
let e = N.getRunner();
|
|
91
91
|
if (v && e.setModalHandler(v), y) for (let [t, n] of Object.entries(y)) e.registerScript(t, n);
|
|
92
92
|
}, [
|
|
93
93
|
N,
|
|
94
94
|
v,
|
|
95
95
|
y
|
|
96
|
-
]),
|
|
96
|
+
]), F(() => {
|
|
97
97
|
let e = () => k(window.innerWidth < 768);
|
|
98
98
|
return e(), window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
|
|
99
99
|
}, []);
|
|
100
|
-
let
|
|
100
|
+
let U = P(() => {
|
|
101
101
|
r && (D(!0), r(), setTimeout(() => D(!1), 600));
|
|
102
102
|
}, [r]);
|
|
103
|
-
|
|
104
|
-
if (!(!e.refreshInterval || e.refreshInterval <= 0 || !r)) return j.current = setInterval(
|
|
103
|
+
F(() => {
|
|
104
|
+
if (!(!e.refreshInterval || e.refreshInterval <= 0 || !r)) return j.current = setInterval(U, e.refreshInterval * 1e3), () => {
|
|
105
105
|
j.current && clearInterval(j.current);
|
|
106
106
|
};
|
|
107
107
|
}, [
|
|
108
108
|
e.refreshInterval,
|
|
109
109
|
r,
|
|
110
|
-
|
|
110
|
+
U
|
|
111
111
|
]);
|
|
112
|
-
let
|
|
112
|
+
let W = P((e, t) => {
|
|
113
113
|
!s || !u || !t || (e.stopPropagation(), u(t));
|
|
114
|
-
}, [s, u]), me =
|
|
114
|
+
}, [s, u]), me = P((t, n, r) => {
|
|
115
115
|
if (!s || !u) return;
|
|
116
116
|
let i = e.widgets || [];
|
|
117
117
|
if (t.key === "Enter" || t.key === " ") t.preventDefault(), u(n ?? null);
|
|
@@ -128,9 +128,9 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
128
128
|
s,
|
|
129
129
|
u,
|
|
130
130
|
e.widgets
|
|
131
|
-
]), q =
|
|
131
|
+
]), q = P((e) => {
|
|
132
132
|
!s || !u || e.target === e.currentTarget && u(null);
|
|
133
|
-
}, [s, u]), J = !!(s && d), ge = ue(le(
|
|
133
|
+
}, [s, u]), J = !!(s && d), ge = ue(le(G, { activationConstraint: { distance: 5 } })), _e = P((t) => {
|
|
134
134
|
if (!J) return;
|
|
135
135
|
let { active: n, over: r } = t;
|
|
136
136
|
if (!r || n.id === r.id) return;
|
|
@@ -162,7 +162,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
162
162
|
objectName: e.object || (Z(t) ? t.object : void 0),
|
|
163
163
|
aggregate: r,
|
|
164
164
|
filter: (Z(t) ? t.filter : void 0) || e.filter,
|
|
165
|
-
label: n.label ||
|
|
165
|
+
label: n.label || H(e) || "",
|
|
166
166
|
fallbackValue: n.value,
|
|
167
167
|
trend: n.trend,
|
|
168
168
|
icon: n.icon,
|
|
@@ -173,7 +173,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
173
173
|
prefix: n.prefix,
|
|
174
174
|
suffix: n.suffix,
|
|
175
175
|
drillDown: n.drillDown ?? { enabled: !0 },
|
|
176
|
-
title: n.label ||
|
|
176
|
+
title: n.label || H(e) || ""
|
|
177
177
|
};
|
|
178
178
|
}
|
|
179
179
|
if ((t === "gauge" || t === "solid-gauge") && e.object) {
|
|
@@ -187,10 +187,16 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
187
187
|
objectName: e.object,
|
|
188
188
|
aggregate: t,
|
|
189
189
|
filter: e.filter,
|
|
190
|
-
label: n.label ||
|
|
190
|
+
label: n.label || H(e) || "",
|
|
191
191
|
fallbackValue: n.fallbackValue ?? n.value,
|
|
192
192
|
icon: n.icon,
|
|
193
|
-
description: n.description
|
|
193
|
+
description: n.description,
|
|
194
|
+
colorVariant: e.colorVariant,
|
|
195
|
+
format: n.format,
|
|
196
|
+
currency: n.currency,
|
|
197
|
+
prefix: n.prefix,
|
|
198
|
+
suffix: n.suffix,
|
|
199
|
+
invert: n.invert
|
|
194
200
|
};
|
|
195
201
|
}
|
|
196
202
|
let r = {}[t] || t;
|
|
@@ -210,7 +216,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
210
216
|
xAxisKey: i,
|
|
211
217
|
series: [{
|
|
212
218
|
dataKey: c,
|
|
213
|
-
label: l ?
|
|
219
|
+
label: l ? B(l, c, c) : c
|
|
214
220
|
}],
|
|
215
221
|
colors: Oe,
|
|
216
222
|
drillDown: n.drillDown ?? Ae(r),
|
|
@@ -231,7 +237,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
231
237
|
xAxisKey: i,
|
|
232
238
|
series: [{
|
|
233
239
|
dataKey: a,
|
|
234
|
-
label:
|
|
240
|
+
label: B(e.object, a, a)
|
|
235
241
|
}],
|
|
236
242
|
colors: Oe,
|
|
237
243
|
drillDown: n.drillDown ?? Ae(r),
|
|
@@ -245,7 +251,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
245
251
|
xAxisKey: i,
|
|
246
252
|
series: [{
|
|
247
253
|
dataKey: a,
|
|
248
|
-
label: e.object ?
|
|
254
|
+
label: e.object ? B(e.object, a, a) : a
|
|
249
255
|
}],
|
|
250
256
|
colors: Oe,
|
|
251
257
|
className: "h-[200px] sm:h-[250px] md:h-[300px]"
|
|
@@ -362,14 +368,14 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
362
368
|
...e,
|
|
363
369
|
...n
|
|
364
370
|
};
|
|
365
|
-
})(), c = e.type === "metric", u =
|
|
371
|
+
})(), c = e.type === "metric", u = H(e), d = se(e), f = e.id || u || `widget-${t}`, p = s && l === e.id, v = s ? {
|
|
366
372
|
"data-testid": `dashboard-preview-widget-${e.id}`,
|
|
367
373
|
"data-widget-id": e.id,
|
|
368
374
|
role: "button",
|
|
369
375
|
tabIndex: 0,
|
|
370
376
|
"aria-selected": p,
|
|
371
377
|
"aria-label": `Widget: ${u || `Widget ${t + 1}`}`,
|
|
372
|
-
onClick: (t) =>
|
|
378
|
+
onClick: (t) => W(t, e.id),
|
|
373
379
|
onKeyDown: (n) => me(n, e.id, t)
|
|
374
380
|
} : {}, y = s ? A("cursor-pointer rounded-lg transition-all outline-none", "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", p ? "ring-2 ring-primary shadow-md bg-primary/5 dark:bg-primary/10" : "hover:ring-2 hover:ring-primary/40 hover:shadow-sm") : void 0, b = !O && i && !J ? {
|
|
375
381
|
gridColumn: `span ${i.w}`,
|
|
@@ -433,15 +439,15 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
433
439
|
children: [
|
|
434
440
|
!b && e.header.showTitle !== !1 && e.title && /* @__PURE__ */ Y("h2", {
|
|
435
441
|
className: "text-lg font-semibold tracking-tight",
|
|
436
|
-
children:
|
|
437
|
-
name:
|
|
442
|
+
children: V ? te({
|
|
443
|
+
name: V,
|
|
438
444
|
label: Q(e.title)
|
|
439
445
|
}) : Q(e.title)
|
|
440
446
|
}),
|
|
441
447
|
!b && e.header.showDescription !== !1 && e.description && /* @__PURE__ */ Y("p", {
|
|
442
448
|
className: "text-sm text-muted-foreground mt-1",
|
|
443
|
-
children:
|
|
444
|
-
name:
|
|
449
|
+
children: V ? ne({
|
|
450
|
+
name: V,
|
|
445
451
|
description: Q(e.description)
|
|
446
452
|
}) : Q(e.description)
|
|
447
453
|
}),
|
|
@@ -469,7 +475,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
469
475
|
}
|
|
470
476
|
console.warn(`[DashboardRenderer] Unknown header actionType="${t}" for "${r}"`);
|
|
471
477
|
},
|
|
472
|
-
children: [n && /* @__PURE__ */ Y(n, { className: "w-4 h-4 mr-1.5" }),
|
|
478
|
+
children: [n && /* @__PURE__ */ Y(n, { className: "w-4 h-4 mr-1.5" }), ae(e)]
|
|
473
479
|
}, t);
|
|
474
480
|
})
|
|
475
481
|
})
|
|
@@ -482,12 +488,12 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
482
488
|
children: [be, /* @__PURE__ */ X(p, {
|
|
483
489
|
variant: "outline",
|
|
484
490
|
size: "sm",
|
|
485
|
-
onClick:
|
|
491
|
+
onClick: U,
|
|
486
492
|
disabled: E,
|
|
487
493
|
"aria-label": "Refresh dashboard",
|
|
488
|
-
children: [/* @__PURE__ */ Y(
|
|
494
|
+
children: [/* @__PURE__ */ Y(oe, { className: A("h-4 w-4 mr-2", E && "animate-spin") }), E ? "Refreshing…" : "Refresh All"]
|
|
489
495
|
})]
|
|
490
|
-
}), Ce =
|
|
496
|
+
}), Ce = I(() => (e.widgets ?? []).map((e) => e.id).filter((e) => !!e), [e.widgets]), we = I(() => (e.widgets ?? []).filter((e) => e.type === "metric").map((e) => e.id).filter((e) => !!e), [e.widgets]), Te = I(() => (e.widgets ?? []).filter((e) => e.type !== "metric").map((e) => e.id).filter((e) => !!e), [e.widgets]);
|
|
491
497
|
if (O) {
|
|
492
498
|
let n = e.widgets?.filter((e) => e.type === "metric") || [], r = e.widgets?.filter((e) => e.type !== "metric") || [], i = /* @__PURE__ */ X("div", {
|
|
493
499
|
ref: S,
|
|
@@ -520,7 +526,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
520
526
|
})
|
|
521
527
|
]
|
|
522
528
|
});
|
|
523
|
-
return J ? /* @__PURE__ */ Y(
|
|
529
|
+
return J ? /* @__PURE__ */ Y(ce, {
|
|
524
530
|
sensors: ge,
|
|
525
531
|
collisionDetection: K,
|
|
526
532
|
onDragEnd: _e,
|
|
@@ -548,7 +554,7 @@ var $ = P(({ schema: e, className: t, dataSource: n, onRefresh: r, recordCount:
|
|
|
548
554
|
})
|
|
549
555
|
]
|
|
550
556
|
});
|
|
551
|
-
return J ? /* @__PURE__ */ Y(
|
|
557
|
+
return J ? /* @__PURE__ */ Y(ce, {
|
|
552
558
|
sensors: ge,
|
|
553
559
|
collisionDetection: K,
|
|
554
560
|
onDragEnd: _e,
|
|
@@ -760,13 +766,13 @@ var Fe = ({ schema: e, className: t, onLayoutChange: n, onSchemaChange: r, onRef
|
|
|
760
766
|
onClick: E,
|
|
761
767
|
size: "sm",
|
|
762
768
|
variant: "default",
|
|
763
|
-
children: [/* @__PURE__ */ Y(
|
|
769
|
+
children: [/* @__PURE__ */ Y(se, { className: "h-4 w-4 mr-2" }), "Save Layout"]
|
|
764
770
|
}),
|
|
765
771
|
/* @__PURE__ */ X(p, {
|
|
766
772
|
onClick: D,
|
|
767
773
|
size: "sm",
|
|
768
774
|
variant: "outline",
|
|
769
|
-
children: [/* @__PURE__ */ Y(
|
|
775
|
+
children: [/* @__PURE__ */ Y(W, { className: "h-4 w-4 mr-2" }), "Reset"]
|
|
770
776
|
}),
|
|
771
777
|
/* @__PURE__ */ Y(p, {
|
|
772
778
|
onClick: () => u(!1),
|
|
@@ -780,12 +786,12 @@ var Fe = ({ schema: e, className: t, onLayoutChange: n, onSchemaChange: r, onRef
|
|
|
780
786
|
variant: "outline",
|
|
781
787
|
disabled: f,
|
|
782
788
|
"aria-label": "Refresh dashboard",
|
|
783
|
-
children: [/* @__PURE__ */ Y(
|
|
789
|
+
children: [/* @__PURE__ */ Y(oe, { className: A("h-4 w-4 mr-2", f && "animate-spin") }), f ? "Refreshing…" : "Refresh All"]
|
|
784
790
|
}), /* @__PURE__ */ X(p, {
|
|
785
791
|
onClick: () => u(!0),
|
|
786
792
|
size: "sm",
|
|
787
793
|
variant: "outline",
|
|
788
|
-
children: [/* @__PURE__ */ Y(
|
|
794
|
+
children: [/* @__PURE__ */ Y(B, { className: "h-4 w-4 mr-2" }), "Edit Layout"]
|
|
789
795
|
})] })
|
|
790
796
|
})]
|
|
791
797
|
}),
|
|
@@ -822,7 +828,7 @@ var Fe = ({ schema: e, className: t, onLayoutChange: n, onSchemaChange: r, onRef
|
|
|
822
828
|
className: "h-full w-full relative",
|
|
823
829
|
children: [l && /* @__PURE__ */ Y("div", {
|
|
824
830
|
className: "drag-handle absolute top-2 right-2 z-10 cursor-move p-1 bg-background/80 rounded border border-border",
|
|
825
|
-
children: /* @__PURE__ */ Y(
|
|
831
|
+
children: /* @__PURE__ */ Y(V, { className: "h-4 w-4" })
|
|
826
832
|
}), /* @__PURE__ */ Y(o, {
|
|
827
833
|
schema: r,
|
|
828
834
|
className: "h-full w-full"
|
|
@@ -837,7 +843,7 @@ var Fe = ({ schema: e, className: t, onLayoutChange: n, onSchemaChange: r, onRef
|
|
|
837
843
|
children: e.title
|
|
838
844
|
}), l && /* @__PURE__ */ Y("div", {
|
|
839
845
|
className: "drag-handle cursor-move p-1 hover:bg-muted/40 rounded",
|
|
840
|
-
children: /* @__PURE__ */ Y(
|
|
846
|
+
children: /* @__PURE__ */ Y(V, { className: "h-4 w-4" })
|
|
841
847
|
})]
|
|
842
848
|
}), /* @__PURE__ */ Y(h, {
|
|
843
849
|
className: "p-0 h-full",
|
|
@@ -920,7 +926,7 @@ var Be = {
|
|
|
920
926
|
warning: "bg-amber-500/10 text-amber-600 dark:text-amber-400",
|
|
921
927
|
danger: "bg-rose-500/10 text-rose-600 dark:text-rose-400"
|
|
922
928
|
}, Ve = ({ label: e, value: t, trend: n, icon: r, className: i, description: a, loading: o, error: s, colorVariant: c = "default", format: l, currency: u, prefix: d, suffix: f, onClick: p, ...v }) => {
|
|
923
|
-
let y = Be[c] || Be.default, { t: b } = Ie(), x =
|
|
929
|
+
let y = Be[c] || Be.default, { t: b } = Ie(), x = I(() => {
|
|
924
930
|
let e = ze(a) || ze(n?.label);
|
|
925
931
|
if (!e) return e;
|
|
926
932
|
let t = Le(e);
|
|
@@ -929,7 +935,7 @@ var Be = {
|
|
|
929
935
|
a,
|
|
930
936
|
n?.label,
|
|
931
937
|
b
|
|
932
|
-
]), S =
|
|
938
|
+
]), S = I(() => {
|
|
933
939
|
let e = typeof t == "number" || typeof t == "string" && t.trim() !== "" && isFinite(Number(t)) ? Re(t, l, u) : t ?? "", n = String(e);
|
|
934
940
|
return `${d && n.startsWith(d) ? "" : d ?? ""}${n}${f && n.endsWith(f) ? "" : f ?? ""}`;
|
|
935
941
|
}, [
|
|
@@ -938,7 +944,7 @@ var Be = {
|
|
|
938
944
|
u,
|
|
939
945
|
d,
|
|
940
946
|
f
|
|
941
|
-
]), C =
|
|
947
|
+
]), C = I(() => {
|
|
942
948
|
if (typeof r == "string") {
|
|
943
949
|
let e = j(r);
|
|
944
950
|
return e ? /* @__PURE__ */ Y(e, { className: "h-4 w-4" }) : null;
|
|
@@ -966,7 +972,7 @@ var Be = {
|
|
|
966
972
|
}), /* @__PURE__ */ Y(h, { children: o ? /* @__PURE__ */ X("div", {
|
|
967
973
|
className: "flex items-center gap-2 text-muted-foreground",
|
|
968
974
|
"data-testid": "metric-loading",
|
|
969
|
-
children: [/* @__PURE__ */ Y(
|
|
975
|
+
children: [/* @__PURE__ */ Y(ae, { className: "h-4 w-4 animate-spin" }), /* @__PURE__ */ Y("span", {
|
|
970
976
|
className: "text-sm",
|
|
971
977
|
children: "Loading…"
|
|
972
978
|
})]
|
|
@@ -974,7 +980,7 @@ var Be = {
|
|
|
974
980
|
className: "flex items-center gap-2",
|
|
975
981
|
"data-testid": "metric-error",
|
|
976
982
|
role: "alert",
|
|
977
|
-
children: [/* @__PURE__ */ Y(
|
|
983
|
+
children: [/* @__PURE__ */ Y(R, { className: "h-4 w-4 text-destructive shrink-0" }), /* @__PURE__ */ Y("span", {
|
|
978
984
|
className: "text-xs text-destructive truncate",
|
|
979
985
|
children: s
|
|
980
986
|
})]
|
|
@@ -986,9 +992,9 @@ var Be = {
|
|
|
986
992
|
children: [n && /* @__PURE__ */ X("span", {
|
|
987
993
|
className: A("flex items-center shrink-0 font-medium", n.direction === "up" && "text-emerald-600 dark:text-emerald-400", n.direction === "down" && "text-rose-600 dark:text-rose-400", n.direction === "neutral" && "text-muted-foreground"),
|
|
988
994
|
children: [
|
|
989
|
-
n.direction === "up" && /* @__PURE__ */ Y(
|
|
990
|
-
n.direction === "down" && /* @__PURE__ */ Y(
|
|
991
|
-
n.direction === "neutral" && /* @__PURE__ */ Y(
|
|
995
|
+
n.direction === "up" && /* @__PURE__ */ Y(ie, { className: "h-3 w-3 mr-1" }),
|
|
996
|
+
n.direction === "down" && /* @__PURE__ */ Y(z, { className: "h-3 w-3 mr-1" }),
|
|
997
|
+
n.direction === "neutral" && /* @__PURE__ */ Y(H, { className: "h-3 w-3 mr-1" }),
|
|
992
998
|
n.value,
|
|
993
999
|
"%"
|
|
994
1000
|
]
|
|
@@ -1018,7 +1024,7 @@ var Ue = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1018
1024
|
}), /* @__PURE__ */ Y(h, { children: s ? /* @__PURE__ */ X("div", {
|
|
1019
1025
|
className: "flex items-center gap-2 text-muted-foreground",
|
|
1020
1026
|
"data-testid": "metric-card-loading",
|
|
1021
|
-
children: [/* @__PURE__ */ Y(
|
|
1027
|
+
children: [/* @__PURE__ */ Y(ae, { className: "h-4 w-4 animate-spin" }), /* @__PURE__ */ Y("span", {
|
|
1022
1028
|
className: "text-sm",
|
|
1023
1029
|
children: "Loading…"
|
|
1024
1030
|
})]
|
|
@@ -1026,7 +1032,7 @@ var Ue = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1026
1032
|
className: "flex items-center gap-2",
|
|
1027
1033
|
"data-testid": "metric-card-error",
|
|
1028
1034
|
role: "alert",
|
|
1029
|
-
children: [/* @__PURE__ */ Y(
|
|
1035
|
+
children: [/* @__PURE__ */ Y(R, { className: "h-4 w-4 text-destructive shrink-0" }), /* @__PURE__ */ Y("span", {
|
|
1030
1036
|
className: "text-xs text-destructive truncate",
|
|
1031
1037
|
children: c
|
|
1032
1038
|
})]
|
|
@@ -1038,43 +1044,43 @@ var Ue = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1038
1044
|
children: [r && i && /* @__PURE__ */ X("span", {
|
|
1039
1045
|
className: A("flex items-center mr-2", r === "up" && "text-green-500", r === "down" && "text-red-500", r === "neutral" && "text-yellow-500"),
|
|
1040
1046
|
children: [
|
|
1041
|
-
r === "up" && /* @__PURE__ */ Y(
|
|
1042
|
-
r === "down" && /* @__PURE__ */ Y(
|
|
1043
|
-
r === "neutral" && /* @__PURE__ */ Y(
|
|
1047
|
+
r === "up" && /* @__PURE__ */ Y(ie, { className: "h-3 w-3 mr-1" }),
|
|
1048
|
+
r === "down" && /* @__PURE__ */ Y(z, { className: "h-3 w-3 mr-1" }),
|
|
1049
|
+
r === "neutral" && /* @__PURE__ */ Y(H, { className: "h-3 w-3 mr-1" }),
|
|
1044
1050
|
i
|
|
1045
1051
|
]
|
|
1046
1052
|
}), He(a)]
|
|
1047
1053
|
})] }) })]
|
|
1048
1054
|
});
|
|
1049
|
-
}, We = ({ objectName: e, aggregate: t, filter: n, label: c, fallbackValue: l, trend: u, icon: d, className: f, description: p, dataSource: m, colorVariant: h, format: g, currency: _, prefix: v, suffix: y,
|
|
1050
|
-
let
|
|
1051
|
-
|
|
1055
|
+
}, We = ({ objectName: e, aggregate: t, filter: n, label: c, fallbackValue: l, trend: u, icon: d, className: f, description: p, dataSource: m, colorVariant: h, format: g, currency: _, prefix: v, suffix: y, invert: b, drillDown: k, title: A }) => {
|
|
1056
|
+
let j = ne(s), M = m || j?.dataSource, [N, ee] = L(!1), [te, re] = L(null), [R, z] = L(!1), [ie, B] = L(null), [V, ae] = L(null);
|
|
1057
|
+
F(() => {
|
|
1052
1058
|
let t = !0;
|
|
1053
|
-
if (!(!
|
|
1054
|
-
t &&
|
|
1059
|
+
if (!(!M || !e || typeof M.getObjectSchema != "function")) return M.getObjectSchema(e).then((e) => {
|
|
1060
|
+
t && ae(e);
|
|
1055
1061
|
}).catch(() => {}), () => {
|
|
1056
1062
|
t = !1;
|
|
1057
1063
|
};
|
|
1058
|
-
}, [
|
|
1059
|
-
let
|
|
1064
|
+
}, [M, e]);
|
|
1065
|
+
let H = I(() => {
|
|
1060
1066
|
let e = t?.field;
|
|
1061
1067
|
if (!e || !V?.fields) return null;
|
|
1062
1068
|
let n = V.fields;
|
|
1063
1069
|
return Array.isArray(n) ? n.find((t) => t?.name === e) || null : n[e] || null;
|
|
1064
|
-
}, [V, t?.field]),
|
|
1070
|
+
}, [V, t?.field]), oe = I(() => {
|
|
1065
1071
|
if (g) return g;
|
|
1066
|
-
if (
|
|
1067
|
-
if (
|
|
1068
|
-
let e =
|
|
1072
|
+
if (H) {
|
|
1073
|
+
if (H.type === "currency") {
|
|
1074
|
+
let e = H.precision ?? H.scale ?? 0;
|
|
1069
1075
|
return e > 0 ? `0,0.${"0".repeat(e)}` : "0,0";
|
|
1070
1076
|
}
|
|
1071
|
-
if (
|
|
1072
|
-
if (
|
|
1077
|
+
if (H.type === "percent") return "0,0%";
|
|
1078
|
+
if (H.type === "number" || H.type === "integer") return "0,0";
|
|
1073
1079
|
}
|
|
1074
|
-
}, [g,
|
|
1080
|
+
}, [g, H]), se = I(() => {
|
|
1075
1081
|
if (_) return _;
|
|
1076
|
-
if (
|
|
1077
|
-
}, [_,
|
|
1082
|
+
if (H?.type === "currency") return H.defaultCurrency || H.currency || void 0;
|
|
1083
|
+
}, [_, H]), U = I(() => t ? JSON.stringify(t) : "", [t]), W = I(() => i(n), [n]), ce = P(async (n, r) => {
|
|
1078
1084
|
if (!(!n || !e)) {
|
|
1079
1085
|
r.current && (z(!0), B(null));
|
|
1080
1086
|
try {
|
|
@@ -1084,14 +1090,14 @@ var Ue = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1084
1090
|
field: t.field,
|
|
1085
1091
|
function: t.function,
|
|
1086
1092
|
groupBy: t.groupBy || "_all",
|
|
1087
|
-
filter:
|
|
1093
|
+
filter: W
|
|
1088
1094
|
}), a = Array.isArray(r) ? r : [];
|
|
1089
1095
|
i = a.length === 0 ? 0 : t.function === "count" ? a.reduce((e, n) => e + (Number(n[t.field]) || Number(n.count) || 0), 0) : a[0][t.field] ?? 0;
|
|
1090
1096
|
} else if (typeof n.find == "function") {
|
|
1091
|
-
let t = await n.find(e, { $filter:
|
|
1097
|
+
let t = await n.find(e, { $filter: W });
|
|
1092
1098
|
i = (Array.isArray(t) ? t : t?.data || t?.records || []).length;
|
|
1093
1099
|
} else return;
|
|
1094
|
-
r.current &&
|
|
1100
|
+
r.current && re(i);
|
|
1095
1101
|
} catch (e) {
|
|
1096
1102
|
console.error("[ObjectMetricWidget] Fetch error:", e), r.current && B(e instanceof Error ? e.message : "Failed to load metric");
|
|
1097
1103
|
} finally {
|
|
@@ -1100,80 +1106,93 @@ var Ue = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1100
1106
|
}
|
|
1101
1107
|
}, [
|
|
1102
1108
|
e,
|
|
1103
|
-
|
|
1104
|
-
|
|
1109
|
+
U,
|
|
1110
|
+
I(() => W ? JSON.stringify(W) : "", [W])
|
|
1105
1111
|
]);
|
|
1106
|
-
|
|
1112
|
+
F(() => {
|
|
1107
1113
|
let t = { current: !0 };
|
|
1108
|
-
return
|
|
1114
|
+
return M && e ? ce(M, t) : (re(null), B(null)), () => {
|
|
1109
1115
|
t.current = !1;
|
|
1110
1116
|
};
|
|
1111
1117
|
}, [
|
|
1112
|
-
|
|
1118
|
+
M,
|
|
1113
1119
|
e,
|
|
1114
|
-
|
|
1120
|
+
ce
|
|
1115
1121
|
]);
|
|
1116
|
-
let
|
|
1122
|
+
let G = te === null ? M ? "—" : l ?? "—" : te;
|
|
1123
|
+
b && typeof G == "number" && isFinite(G) && G >= 0 && G <= 1 && (G = 1 - G);
|
|
1124
|
+
let K = r(k) && !!e && !!M, le = I(() => {
|
|
1117
1125
|
let e = typeof c == "string" ? c : c?.defaultValue || "";
|
|
1118
|
-
return a(
|
|
1126
|
+
return a(k, {}, (typeof A == "string" ? A : A?.defaultValue || "") || e || "Details");
|
|
1119
1127
|
}, [
|
|
1120
|
-
|
|
1128
|
+
k,
|
|
1121
1129
|
c,
|
|
1122
|
-
|
|
1123
|
-
]),
|
|
1124
|
-
if (!
|
|
1125
|
-
let t =
|
|
1130
|
+
A
|
|
1131
|
+
]), ue = I(() => {
|
|
1132
|
+
if (!K) return null;
|
|
1133
|
+
let t = k?.target ?? "drawer", n = k?.report, r = n && typeof n == "object" && (Array.isArray(n.columns) || "objectName" in n), i;
|
|
1134
|
+
if (r) {
|
|
1135
|
+
let e = n.filter, t = e ? W ? { $and: [e, W] } : e : W;
|
|
1136
|
+
i = /* @__PURE__ */ Y("div", {
|
|
1137
|
+
className: "h-full overflow-auto",
|
|
1138
|
+
children: /* @__PURE__ */ Y(o, { schema: {
|
|
1139
|
+
type: "spec-report",
|
|
1140
|
+
...n,
|
|
1141
|
+
filter: t
|
|
1142
|
+
} })
|
|
1143
|
+
});
|
|
1144
|
+
} else i = /* @__PURE__ */ Y("div", {
|
|
1126
1145
|
className: "h-full overflow-auto",
|
|
1127
1146
|
children: /* @__PURE__ */ Y(o, { schema: {
|
|
1128
1147
|
type: "object-data-table",
|
|
1129
1148
|
objectName: e,
|
|
1130
|
-
filter:
|
|
1149
|
+
filter: W,
|
|
1131
1150
|
pageSize: 25,
|
|
1132
1151
|
drillDown: { enabled: !1 }
|
|
1133
1152
|
} })
|
|
1134
1153
|
});
|
|
1135
1154
|
return t === "modal" ? /* @__PURE__ */ Y(x, {
|
|
1136
1155
|
open: !0,
|
|
1137
|
-
onOpenChange: (e) => !e &&
|
|
1156
|
+
onOpenChange: (e) => !e && ee(!1),
|
|
1138
1157
|
children: /* @__PURE__ */ X(S, {
|
|
1139
|
-
className: "max-w-
|
|
1140
|
-
children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children:
|
|
1158
|
+
className: "max-w-5xl",
|
|
1159
|
+
children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children: le }) }), i]
|
|
1141
1160
|
})
|
|
1142
1161
|
}) : /* @__PURE__ */ Y(T, {
|
|
1143
1162
|
open: !0,
|
|
1144
|
-
onOpenChange: (e) => !e &&
|
|
1163
|
+
onOpenChange: (e) => !e && ee(!1),
|
|
1145
1164
|
children: /* @__PURE__ */ X(E, {
|
|
1146
1165
|
side: "right",
|
|
1147
|
-
className: "w-full sm:max-w-2xl md:max-w-3xl lg:max-w-
|
|
1148
|
-
children: [/* @__PURE__ */ Y(D, { children: /* @__PURE__ */ Y(O, { children:
|
|
1166
|
+
className: "w-full sm:max-w-2xl md:max-w-3xl lg:max-w-5xl flex flex-col",
|
|
1167
|
+
children: [/* @__PURE__ */ Y(D, { children: /* @__PURE__ */ Y(O, { children: le }) }), /* @__PURE__ */ Y("div", {
|
|
1149
1168
|
className: "flex-1 overflow-hidden mt-2",
|
|
1150
|
-
children:
|
|
1169
|
+
children: i
|
|
1151
1170
|
})]
|
|
1152
1171
|
})
|
|
1153
1172
|
});
|
|
1154
1173
|
}, [
|
|
1155
|
-
|
|
1156
|
-
|
|
1174
|
+
K,
|
|
1175
|
+
k,
|
|
1157
1176
|
e,
|
|
1158
|
-
|
|
1159
|
-
|
|
1177
|
+
W,
|
|
1178
|
+
le
|
|
1160
1179
|
]);
|
|
1161
1180
|
return /* @__PURE__ */ X(J, { children: [/* @__PURE__ */ Y(Ve, {
|
|
1162
1181
|
label: c,
|
|
1163
|
-
value:
|
|
1182
|
+
value: G,
|
|
1164
1183
|
trend: u,
|
|
1165
1184
|
icon: d,
|
|
1166
1185
|
className: f,
|
|
1167
1186
|
description: p,
|
|
1168
|
-
loading:
|
|
1169
|
-
error:
|
|
1187
|
+
loading: R,
|
|
1188
|
+
error: ie,
|
|
1170
1189
|
colorVariant: h,
|
|
1171
|
-
format:
|
|
1172
|
-
currency:
|
|
1190
|
+
format: oe,
|
|
1191
|
+
currency: se,
|
|
1173
1192
|
prefix: v,
|
|
1174
1193
|
suffix: y,
|
|
1175
|
-
onClick:
|
|
1176
|
-
}),
|
|
1194
|
+
onClick: K ? () => ee(!0) : void 0
|
|
1195
|
+
}), N && ue] });
|
|
1177
1196
|
};
|
|
1178
1197
|
//#endregion
|
|
1179
1198
|
//#region src/PivotTable.tsx
|
|
@@ -1234,7 +1253,7 @@ var Ze = ({ schema: e, className: t, rowLabels: n, columnLabels: i, rowFieldLabe
|
|
|
1234
1253
|
});
|
|
1235
1254
|
}, S = (e) => (t) => {
|
|
1236
1255
|
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), e());
|
|
1237
|
-
}, C = b ? "cursor-pointer hover:bg-accent/40 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]" : "", w = Array.isArray(f) ? f : [], { rowKeys: T, colKeys: E, matrix: D, rowTotals: O, colTotals: k, grandTotal: j } =
|
|
1256
|
+
}, C = b ? "cursor-pointer hover:bg-accent/40 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]" : "", w = Array.isArray(f) ? f : [], { rowKeys: T, colKeys: E, matrix: D, rowTotals: O, colTotals: k, grandTotal: j } = I(() => {
|
|
1238
1257
|
let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), n = {};
|
|
1239
1258
|
for (let r of w) {
|
|
1240
1259
|
let i = String(r[c] ?? ""), a = String(r[l] ?? ""), o = Number(r[u]) || 0;
|
|
@@ -1484,15 +1503,15 @@ function $e(e, t) {
|
|
|
1484
1503
|
return Array.from(a);
|
|
1485
1504
|
}
|
|
1486
1505
|
var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
1487
|
-
let a =
|
|
1506
|
+
let a = ne(s), c = t || a?.dataSource, u = l(e.bind), { fieldLabel: d, fieldOptionLabel: f } = be(), p = "No data available", m = "No data source available for";
|
|
1488
1507
|
try {
|
|
1489
1508
|
let { t: e } = ye(), t = e("dashboard.noDataAvailable");
|
|
1490
1509
|
t && t !== "dashboard.noDataAvailable" && (p = t);
|
|
1491
1510
|
let n = e("dashboard.noDataSourceFor");
|
|
1492
1511
|
n && n !== "dashboard.noDataSourceFor" && (m = n);
|
|
1493
1512
|
} catch {}
|
|
1494
|
-
let [h, g] =
|
|
1495
|
-
|
|
1513
|
+
let [h, g] = L([]), [_, v] = L(null), [y, b] = L(!1), [x, S] = L(null);
|
|
1514
|
+
F(() => {
|
|
1496
1515
|
let t = !0;
|
|
1497
1516
|
return e.objectName && !u && (!e.data || e.data.length === 0) && (async () => {
|
|
1498
1517
|
if (!(!c || !e.objectName)) {
|
|
@@ -1520,7 +1539,7 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1520
1539
|
e.data,
|
|
1521
1540
|
e.filter,
|
|
1522
1541
|
_
|
|
1523
|
-
]),
|
|
1542
|
+
]), F(() => {
|
|
1524
1543
|
let t = !0;
|
|
1525
1544
|
if (!(!c || !e.objectName || typeof c.getObjectSchema != "function")) return c.getObjectSchema(e.objectName).then((e) => {
|
|
1526
1545
|
t && v(e);
|
|
@@ -1528,7 +1547,7 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1528
1547
|
t = !1;
|
|
1529
1548
|
};
|
|
1530
1549
|
}, [e.objectName, c]);
|
|
1531
|
-
let C = u || e.data || h, w = Array.isArray(C) ? C : [], T =
|
|
1550
|
+
let C = u || e.data || h, w = Array.isArray(C) ? C : [], T = I(() => {
|
|
1532
1551
|
let t = e.objectName, n = {};
|
|
1533
1552
|
if (_?.fields) {
|
|
1534
1553
|
let e = _.fields;
|
|
@@ -1769,32 +1788,43 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1769
1788
|
},
|
|
1770
1789
|
className: r
|
|
1771
1790
|
});
|
|
1772
|
-
}, tt = ({ open: e, onClose: t, title: n, target: r = "drawer", objectName: i, filter: a, dataSource:
|
|
1773
|
-
let
|
|
1774
|
-
|
|
1775
|
-
objectName: i,
|
|
1776
|
-
filter: a,
|
|
1777
|
-
columns: s?.map((e) => ({
|
|
1778
|
-
accessorKey: e,
|
|
1779
|
-
header: e
|
|
1780
|
-
})),
|
|
1781
|
-
pagination: !0,
|
|
1782
|
-
searchable: !1,
|
|
1783
|
-
pageSize: c
|
|
1784
|
-
}, d = /* @__PURE__ */ Y("div", {
|
|
1785
|
-
className: A("overflow-auto", l),
|
|
1791
|
+
}, tt = ({ open: e, onClose: t, title: n, target: r = "drawer", objectName: i, filter: a, dataSource: s, columns: c, maxRows: l, className: u, report: d }) => {
|
|
1792
|
+
let f = d && typeof d == "object" && (Array.isArray(d.columns) || "objectName" in d), p = /* @__PURE__ */ Y("div", {
|
|
1793
|
+
className: A("overflow-auto", u),
|
|
1786
1794
|
"data-testid": "drill-down-body",
|
|
1787
|
-
children:
|
|
1788
|
-
|
|
1789
|
-
|
|
1795
|
+
children: f ? (() => {
|
|
1796
|
+
let e = d.filter, t = e ? a ? { $and: [e, a] } : e : a;
|
|
1797
|
+
return /* @__PURE__ */ Y(o, { schema: {
|
|
1798
|
+
...d,
|
|
1799
|
+
type: "spec-report",
|
|
1800
|
+
report: {
|
|
1801
|
+
...d,
|
|
1802
|
+
filter: t
|
|
1803
|
+
},
|
|
1804
|
+
filter: t
|
|
1805
|
+
} });
|
|
1806
|
+
})() : /* @__PURE__ */ Y(et, {
|
|
1807
|
+
schema: {
|
|
1808
|
+
type: "object-data-table",
|
|
1809
|
+
objectName: i,
|
|
1810
|
+
filter: a,
|
|
1811
|
+
columns: c?.map((e) => ({
|
|
1812
|
+
accessorKey: e,
|
|
1813
|
+
header: e
|
|
1814
|
+
})),
|
|
1815
|
+
pagination: !0,
|
|
1816
|
+
searchable: !1,
|
|
1817
|
+
pageSize: l
|
|
1818
|
+
},
|
|
1819
|
+
dataSource: s
|
|
1790
1820
|
})
|
|
1791
1821
|
});
|
|
1792
1822
|
return r === "dialog" ? /* @__PURE__ */ Y(x, {
|
|
1793
1823
|
open: e,
|
|
1794
1824
|
onOpenChange: (e) => !e && t(),
|
|
1795
1825
|
children: /* @__PURE__ */ X(S, {
|
|
1796
|
-
className: "max-w-
|
|
1797
|
-
children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children: n }) }),
|
|
1826
|
+
className: "max-w-5xl",
|
|
1827
|
+
children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children: n }) }), p]
|
|
1798
1828
|
})
|
|
1799
1829
|
}) : /* @__PURE__ */ Y(T, {
|
|
1800
1830
|
open: e,
|
|
@@ -1804,15 +1834,15 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1804
1834
|
className: "w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col",
|
|
1805
1835
|
children: [/* @__PURE__ */ Y(D, { children: /* @__PURE__ */ Y(O, { children: n }) }), /* @__PURE__ */ Y("div", {
|
|
1806
1836
|
className: "flex-1 overflow-hidden mt-2",
|
|
1807
|
-
children:
|
|
1837
|
+
children: p
|
|
1808
1838
|
})]
|
|
1809
1839
|
})
|
|
1810
1840
|
});
|
|
1811
1841
|
}, nt = ({ schema: e, dataSource: o, className: c }) => {
|
|
1812
|
-
let u =
|
|
1813
|
-
|
|
1842
|
+
let u = ne(s), d = o || u?.dataSource, f = l(e.bind), [p, m] = L([]), [h, g] = L(!1), [_, v] = L(null), [y, b] = L({}), [x, S] = L({}), [C, w] = L(null), { fieldLabel: T, fieldOptionLabel: E } = be(), D = re(T), O = re(E);
|
|
1843
|
+
F(() => {
|
|
1814
1844
|
D.current = T, O.current = E;
|
|
1815
|
-
}, [T, E]),
|
|
1845
|
+
}, [T, E]), F(() => {
|
|
1816
1846
|
if (!d || !e.objectName) return;
|
|
1817
1847
|
let t = d.getObjectSchema;
|
|
1818
1848
|
if (typeof t != "function") return;
|
|
@@ -1837,7 +1867,7 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1837
1867
|
}).catch(() => {}), () => {
|
|
1838
1868
|
n = !1;
|
|
1839
1869
|
};
|
|
1840
|
-
}, [d, e.objectName]),
|
|
1870
|
+
}, [d, e.objectName]), F(() => {
|
|
1841
1871
|
let t = !0;
|
|
1842
1872
|
return e.objectName && !f && (!e.data || e.data.length === 0) && (async () => {
|
|
1843
1873
|
if (!(!d || !e.objectName)) {
|
|
@@ -1958,17 +1988,17 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1958
1988
|
let N = {
|
|
1959
1989
|
...e,
|
|
1960
1990
|
data: M
|
|
1961
|
-
}, ee = e.rowField ? y[e.rowField] : void 0,
|
|
1991
|
+
}, ee = e.rowField ? y[e.rowField] : void 0, te = e.columnField ? y[e.columnField] : void 0, P = e.rowField ? x[e.rowField] : void 0, I = e.drillDown;
|
|
1962
1992
|
return /* @__PURE__ */ X(J, { children: [/* @__PURE__ */ Y(Ze, {
|
|
1963
1993
|
schema: N,
|
|
1964
1994
|
className: c,
|
|
1965
1995
|
rowLabels: ee,
|
|
1966
|
-
columnLabels:
|
|
1967
|
-
rowFieldLabel:
|
|
1968
|
-
onDrillDown: r(
|
|
1996
|
+
columnLabels: te,
|
|
1997
|
+
rowFieldLabel: P,
|
|
1998
|
+
onDrillDown: r(I) ? (e) => w(e) : void 0
|
|
1969
1999
|
}), (() => {
|
|
1970
2000
|
if (!C || !e.objectName) return null;
|
|
1971
|
-
let n = t(
|
|
2001
|
+
let n = t(I, C, {
|
|
1972
2002
|
rowField: e.rowField,
|
|
1973
2003
|
columnField: e.columnField
|
|
1974
2004
|
}), r = {
|
|
@@ -1978,13 +2008,14 @@ var et = ({ schema: e, dataSource: t, className: r }) => {
|
|
|
1978
2008
|
return /* @__PURE__ */ Y(tt, {
|
|
1979
2009
|
open: !0,
|
|
1980
2010
|
onClose: () => w(null),
|
|
1981
|
-
title: a(
|
|
1982
|
-
target:
|
|
2011
|
+
title: a(I, C, e.title || "Details"),
|
|
2012
|
+
target: I?.target ?? "drawer",
|
|
1983
2013
|
objectName: e.objectName,
|
|
1984
2014
|
filter: r,
|
|
1985
2015
|
dataSource: d,
|
|
1986
|
-
columns:
|
|
1987
|
-
maxRows:
|
|
2016
|
+
columns: I?.columns,
|
|
2017
|
+
maxRows: I?.maxRows,
|
|
2018
|
+
report: I?.report
|
|
1988
2019
|
});
|
|
1989
2020
|
})()] });
|
|
1990
2021
|
}, rt = {
|
|
@@ -2691,8 +2722,8 @@ function Et({ open: e, onClose: t, config: n, onSave: r, onFieldChange: i, heade
|
|
|
2691
2722
|
//#endregion
|
|
2692
2723
|
//#region src/DashboardWithConfig.tsx
|
|
2693
2724
|
function Dt({ schema: e, config: t, onConfigSave: n, onWidgetSave: r, onRefresh: i, recordCount: a, defaultConfigOpen: o = !1, className: s }) {
|
|
2694
|
-
let [c, l] =
|
|
2695
|
-
|
|
2725
|
+
let [c, l] = L(o), [u, d] = L(null), [f, m] = L(e), [h, g] = L(0);
|
|
2726
|
+
F(() => {
|
|
2696
2727
|
m(e), g((e) => e + 1);
|
|
2697
2728
|
}, [e]);
|
|
2698
2729
|
let _ = N.useMemo(() => {
|
|
@@ -2717,11 +2748,11 @@ function Dt({ schema: e, config: t, onConfigSave: n, onWidgetSave: r, onRefresh:
|
|
|
2717
2748
|
layoutW: e.layout?.w ?? 1,
|
|
2718
2749
|
layoutH: e.layout?.h ?? 1
|
|
2719
2750
|
};
|
|
2720
|
-
}, [u, h]), v =
|
|
2751
|
+
}, [u, h]), v = P((e) => {
|
|
2721
2752
|
d(e), l(!0);
|
|
2722
|
-
}, []), y =
|
|
2753
|
+
}, []), y = P(() => {
|
|
2723
2754
|
d(null);
|
|
2724
|
-
}, []), b =
|
|
2755
|
+
}, []), b = P((e, t) => {
|
|
2725
2756
|
u && m((n) => n.widgets ? {
|
|
2726
2757
|
...n,
|
|
2727
2758
|
widgets: n.widgets.map((n) => {
|
|
@@ -2762,7 +2793,7 @@ function Dt({ schema: e, config: t, onConfigSave: n, onWidgetSave: r, onRefresh:
|
|
|
2762
2793
|
};
|
|
2763
2794
|
})
|
|
2764
2795
|
} : n);
|
|
2765
|
-
}, [u]), x =
|
|
2796
|
+
}, [u]), x = P((e) => {
|
|
2766
2797
|
if (u && r) {
|
|
2767
2798
|
let { drillDownEnabled: t, drillDownTarget: n, ...i } = e, a = { ...i };
|
|
2768
2799
|
(t || n) && (a.options = {
|
|
@@ -2775,7 +2806,7 @@ function Dt({ schema: e, config: t, onConfigSave: n, onWidgetSave: r, onRefresh:
|
|
|
2775
2806
|
}), r(u, a);
|
|
2776
2807
|
}
|
|
2777
2808
|
d(null), g((e) => e + 1);
|
|
2778
|
-
}, [u, r]), S =
|
|
2809
|
+
}, [u, r]), S = P(() => {
|
|
2779
2810
|
l((e) => !e), d(null);
|
|
2780
2811
|
}, []);
|
|
2781
2812
|
return /* @__PURE__ */ X("div", {
|
|
@@ -2790,7 +2821,7 @@ function Dt({ schema: e, config: t, onConfigSave: n, onWidgetSave: r, onRefresh:
|
|
|
2790
2821
|
variant: c ? "default" : "outline",
|
|
2791
2822
|
onClick: S,
|
|
2792
2823
|
"data-testid": "dashboard-config-toggle",
|
|
2793
|
-
children: [/* @__PURE__ */ Y(
|
|
2824
|
+
children: [/* @__PURE__ */ Y(U, { className: "h-3.5 w-3.5 mr-1" }), "Settings"]
|
|
2794
2825
|
})
|
|
2795
2826
|
}), /* @__PURE__ */ Y($, {
|
|
2796
2827
|
schema: f,
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@object-ui/core`),require(`@object-ui/react`),require(`@object-ui/components`),require(`react`),require(`lucide-react`),require(`@dnd-kit/core`),require(`@dnd-kit/sortable`),require(`@dnd-kit/utilities`),require(`react/jsx-runtime`),require(`react-grid-layout`),require(`react-grid-layout/css/styles.css`),require(`@object-ui/i18n`),require(`@object-ui/fields`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`@object-ui/react`,`@object-ui/components`,`react`,`lucide-react`,`@dnd-kit/core`,`@dnd-kit/sortable`,`@dnd-kit/utilities`,`react/jsx-runtime`,`react-grid-layout`,`react-grid-layout/css/styles.css`,`@object-ui/i18n`,`@object-ui/fields`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginDashboard={},e.ObjectUICore,e.ObjectUIReact,e.ObjectUIComponents,e.React,e.lucide_react,e._dnd_kit_core,e._dnd_kit_sortable,e._dnd_kit_utilities,e.react_jsx_runtime,e.ReactGridLayout,e.react_grid_layout_css_styles_css,e.ObjectUII18n,e.ObjectUIFields))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f,p){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var m=Object.create,h=Object.defineProperty,g=Object.getOwnPropertyDescriptor,_=Object.getOwnPropertyNames,v=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty,b=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=_(t),a=0,o=i.length,s;a<o;a++)s=i[a],!y.call(e,s)&&s!==n&&h(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=g(t,s))||r.enumerable});return e};i=((e,t,n)=>(n=e==null?{}:m(v(e)),b(t||!e||!e.__esModule?h(n,`default`,{value:e,enumerable:!0}):n,e)))(i,1);function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&e.provider===`object`}function S({id:e,disabled:t,gridSpan:n,className:i,children:a}){let{attributes:o,listeners:u,setNodeRef:d,transform:f,transition:p,isDragging:m,isOver:h}=(0,s.useSortable)({id:e,disabled:t});return(0,l.jsx)(`div`,{ref:d,style:{transform:c.CSS.Transform.toString(f),transition:p,opacity:m?.4:1,...n?{gridColumn:`span ${n.w}`,gridRow:`span ${n.h}`}:{}},className:(0,r.cn)(`h-full w-full`,i,!t&&`cursor-grab active:cursor-grabbing`,h&&!m&&`ring-2 ring-primary ring-offset-2 rounded-lg`),"data-sortable-widget-id":e,...o,...u,children:a})}function C(e){return e?(0,r.getLazyIcon)(e):null}function w(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var T=[`hsl(var(--chart-1))`,`hsl(var(--chart-2))`,`hsl(var(--chart-3))`,`hsl(var(--chart-4))`,`hsl(var(--chart-5))`],E=new Set([`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`funnel`]);function D(e){return E.has(e)?{enabled:!0}:void 0}var O=(0,i.forwardRef)(({schema:e,className:t,dataSource:c,onRefresh:u,recordCount:d,userActions:f,designMode:p,selectedWidgetId:m,onWidgetClick:h,onWidgetsReorder:g,modalHandler:_,scriptHandlers:v,hideHeaderText:y,...b},E)=>{let O=(()=>{if(e.columns!=null)return e.columns;let t=e.widgets??[],n=0;for(let e of t){let t=(e.layout?.x??0)+(e.layout?.w??0);t>n&&(n=t),(e.layout?.w??0)>n&&(n=e.layout.w)}return n>4?12:4})(),k=O,A=e.gap||4,[j,M]=(0,i.useState)(!1),[N,P]=(0,i.useState)(!1),F=(0,i.useRef)(null),{executeAction:I,engine:L}=(0,n.useActionEngine)({actions:(0,i.useMemo)(()=>(e.header?.actions??[]).map(e=>({name:e.actionUrl||e.label,type:e.actionType||`url`,target:e.actionUrl,label:e.label})),[e.header?.actions])}),{dashboardLabel:R,dashboardDescription:z,dashboardActionLabel:B,widgetTitle:V,widgetDescription:H,fieldLabel:U}=(0,n.useObjectLabel)(),W=e.name,ee=(0,i.useCallback)(e=>W?B(W,e.actionUrl||e.label,e.label):e.label,[W,B]),G=(0,i.useCallback)(e=>{let t=w(e.title);return!W||!e.id||t===void 0?t:V(W,e.id,t)},[W,V]),te=(0,i.useCallback)(e=>{let t=w(e.description);return!W||!e.id?t:H(W,e.id,t)},[W,H]);(0,i.useEffect)(()=>{let e=L.getRunner();if(_&&e.setModalHandler(_),v)for(let[t,n]of Object.entries(v))e.registerScript(t,n)},[L,_,v]),(0,i.useEffect)(()=>{let e=()=>P(window.innerWidth<768);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let K=(0,i.useCallback)(()=>{u&&(M(!0),u(),setTimeout(()=>M(!1),600))},[u]);(0,i.useEffect)(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!u))return F.current=setInterval(K,e.refreshInterval*1e3),()=>{F.current&&clearInterval(F.current)}},[e.refreshInterval,u,K]);let q=(0,i.useCallback)((e,t)=>{!p||!h||!t||(e.stopPropagation(),h(t))},[p,h]),ne=(0,i.useCallback)((t,n,r)=>{if(!p||!h)return;let i=e.widgets||[];if(t.key===`Enter`||t.key===` `)t.preventDefault(),h(n??null);else if(t.key===`ArrowRight`||t.key===`ArrowDown`){t.preventDefault();let e=r+1<i.length?i[r+1]:null;e?.id&&h(e.id)}else if(t.key===`ArrowLeft`||t.key===`ArrowUp`){t.preventDefault();let e=r-1>=0?i[r-1]:null;e?.id&&h(e.id)}else t.key===`Escape`&&(t.preventDefault(),h(null))},[p,h,e.widgets]),J=(0,i.useCallback)(e=>{!p||!h||e.target===e.currentTarget&&h(null)},[p,h]),Y=!!(p&&g),X=(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:5}})),Z=(0,i.useCallback)(t=>{if(!Y)return;let{active:n,over:r}=t;if(!r||n.id===r.id)return;let i=e.widgets??[],a=i.findIndex(e=>e.id===n.id),o=i.findIndex(e=>e.id===r.id);a<0||o<0||g?.((0,s.arrayMove)(i,a,o))},[Y,e.widgets,g]),re=(e,t,a)=>{let o=e.layout?{...e.layout,w:Math.min(e.layout.w,k)}:void 0,s=(()=>{if(e.component)return e.component;let t=e.type,n=e.options||{};if(t===`metric`&&e.object){let t=n.data,r=x(t)&&t.aggregate?{field:e.valueField||t.aggregate.field,function:e.aggregate||t.aggregate.function,groupBy:e.categoryField??t.aggregate.groupBy??`_all`}:e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`_all`}:void 0;return{type:`object-metric`,objectName:e.object||(x(t)?t.object:void 0),aggregate:r,filter:(x(t)?t.filter:void 0)||e.filter,label:n.label||G(e)||``,fallbackValue:n.value,trend:n.trend,icon:n.icon,description:n.description,colorVariant:e.colorVariant,format:n.format,currency:n.currency,prefix:n.prefix,suffix:n.suffix,drillDown:n.drillDown??{enabled:!0},title:n.label||G(e)||``}}if((t===`gauge`||t===`solid-gauge`)&&e.object){let t=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`_all`}:void 0;return{type:`object-metric`,objectName:e.object,aggregate:t,filter:e.filter,label:n.label||G(e)||``,fallbackValue:n.fallbackValue??n.value,icon:n.icon,description:n.description}}let r={}[t]||t;if(r===`bar`||r===`horizontal-bar`||r===`line`||r===`area`||r===`pie`||r===`donut`||r===`scatter`||r===`funnel`){let t=e.data||n.data,i=e.categoryField||n.xField||`name`,a=e.valueField||n.yField||`value`;if(x(t)){let o=t.aggregate,s=o?{field:e.valueField||o.field,function:e.aggregate||o.function,groupBy:e.categoryField||o.groupBy}:void 0,c=s?.field||a,l=e.object||t.object;return{type:`object-chart`,chartType:r,objectName:l,aggregate:s,xAxisKey:i,series:[{dataKey:c,label:l?U(l,c,c):c}],colors:T,drillDown:n.drillDown??D(r),className:`h-[200px] sm:h-[250px] md:h-[300px]`}}if(!t&&e.object){let t=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`name`}:void 0,a=e.valueField||`value`;return{type:`object-chart`,chartType:r,objectName:e.object,aggregate:t,xAxisKey:i,series:[{dataKey:a,label:U(e.object,a,a)}],colors:T,drillDown:n.drillDown??D(r),className:`h-[200px] sm:h-[250px] md:h-[300px]`}}return{type:`chart`,chartType:r,data:Array.isArray(t)?t:t?.items||[],xAxisKey:i,series:[{dataKey:a,label:e.object?U(e.object,a,a):a}],colors:T,className:`h-[200px] sm:h-[250px] md:h-[300px]`}}if(t===`table`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`object-data-table`,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter,searchable:e.searchable??!1,pagination:e.pagination??!1,className:`border-0`}}return!t&&e.object?{type:`object-data-table`,...n,objectName:e.object,filter:e.filter,searchable:e.searchable??!1,pagination:e.pagination??!1,className:`border-0`}:{type:`data-table`,...n,data:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}if(t===`pivot`){let t=e.data||n.data,r=e,i={rowField:r.rowField??n.rowField,columnField:r.columnField??n.columnField,valueField:r.valueField??n.valueField,aggregation:r.aggregation??n.aggregation??`sum`,showRowTotals:r.showRowTotals??n.showRowTotals,showColumnTotals:r.showColumnTotals??n.showColumnTotals,format:r.format??n.format},a=(x(t)||!t&&e.object)&&n.drillDown===void 0?{...n,drillDown:{enabled:!0}}:n;if(x(t)){let{data:n,...r}=a;return{type:`object-pivot`,...r,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter}}return!t&&e.object?{type:`object-pivot`,...a,...i,objectName:e.object,filter:e.filter}:{type:`pivot`,...n,...i,data:Array.isArray(t)?t:t?.items||[]}}if(t===`list`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`object-data-table`,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter,searchable:!1,pagination:!1,className:`border-0`}}return!t&&e.object?{type:`object-data-table`,...n,objectName:e.object,filter:e.filter,searchable:!1,pagination:!1,className:`border-0`}:{type:`data-table`,...n,data:Array.isArray(t)?t:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}return t===`custom`?{type:`text`,value:"Custom widget — set `component` to a UIComponent schema.",variant:`caption`,align:`center`,className:`flex h-full w-full items-center justify-center rounded border border-dashed bg-muted/20 p-4 text-muted-foreground`}:{...e,...n}})(),u=e.type===`metric`,d=G(e),f=te(e),h=e.id||d||`widget-${t}`,g=p&&m===e.id,_=p?{"data-testid":`dashboard-preview-widget-${e.id}`,"data-widget-id":e.id,role:`button`,tabIndex:0,"aria-selected":g,"aria-label":`Widget: ${d||`Widget ${t+1}`}`,onClick:t=>q(t,e.id),onKeyDown:n=>ne(n,e.id,t)}:{},v=p?(0,r.cn)(`cursor-pointer rounded-lg transition-all outline-none`,`focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,g?`ring-2 ring-primary shadow-md bg-primary/5 dark:bg-primary/10`:`hover:ring-2 hover:ring-primary/40 hover:shadow-sm`):void 0,y=!N&&o&&!Y?{gridColumn:`span ${o.w}`,gridRow:`span ${o.h}`}:void 0,b=u?(0,l.jsxs)(`div`,{className:(0,r.cn)(`h-full w-full`,p&&`relative`,v),style:y,..._,children:[(0,l.jsx)(n.SchemaRenderer,{schema:s,className:(0,r.cn)(`h-full w-full`,p&&`pointer-events-none`),dataSource:c}),p&&(0,l.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]}):(0,l.jsxs)(r.Card,{className:(0,r.cn)(`overflow-hidden border-border/50 shadow-sm transition-all hover:shadow-md`,`bg-card/50 backdrop-blur-sm`,a&&`w-full`,p&&`relative`,v),style:y,..._,children:[d&&(0,l.jsxs)(r.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 px-3 sm:px-6`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm sm:text-base font-medium tracking-tight truncate`,title:d,children:d}),f&&(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:f})]}),(0,l.jsx)(r.CardContent,{className:`p-0`,children:(0,l.jsx)(`div`,{className:(0,r.cn)(`h-full w-full`,`p-3 sm:p-4 md:p-6`,p&&`pointer-events-none`),children:(0,l.jsx)(n.SchemaRenderer,{schema:s,dataSource:c})})}),p&&(0,l.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]});return Y&&e.id?(0,l.jsx)(S,{id:e.id,gridSpan:!N&&o?{w:o.w,h:o.h}:void 0,children:b},h):(0,l.jsx)(i.Fragment,{children:b},h)},Q=e.header&&(0,l.jsxs)(`div`,{className:`col-span-full mb-4`,children:[!y&&e.header.showTitle!==!1&&e.title&&(0,l.jsx)(`h2`,{className:`text-lg font-semibold tracking-tight`,children:W?R({name:W,label:w(e.title)}):w(e.title)}),!y&&e.header.showDescription!==!1&&e.description&&(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:W?z({name:W,description:w(e.description)}):w(e.description)}),e.header.actions&&e.header.actions.length>0&&(0,l.jsx)(`div`,{className:`flex gap-2 mt-3`,children:e.header.actions.map((e,t)=>{let n=C(e.icon);return(0,l.jsxs)(r.Button,{variant:`outline`,size:`sm`,onClick:async()=>{let{actionType:t,actionUrl:n,label:r}=e;if(!t||!n){console.warn(`[DashboardRenderer] Header action missing actionType/actionUrl:`,e);return}if(t===`url`){/^https?:\/\//.test(n)||n.startsWith(`//`)?window.location.assign(n):(window.history.pushState({},``,n),window.dispatchEvent(new PopStateEvent(`popstate`)));return}if(t===`modal`||t===`script`){let e=await I(n||r);e?.success||console.warn(`[DashboardRenderer] action failed`,e?.error);return}console.warn(`[DashboardRenderer] Unknown header actionType="${t}" for "${r}"`)},children:[n&&(0,l.jsx)(n,{className:`w-4 h-4 mr-1.5`}),ee(e)]},t)})})]}),ie=d!==void 0&&(0,l.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[d.toLocaleString(),` records`]}),ae=f?JSON.stringify(f):void 0,oe=u&&(0,l.jsxs)(`div`,{className:(0,r.cn)(`flex items-center justify-end gap-3 mb-2`,!N&&`col-span-full`),children:[ie,(0,l.jsxs)(r.Button,{variant:`outline`,size:`sm`,onClick:K,disabled:j,"aria-label":`Refresh dashboard`,children:[(0,l.jsx)(a.RefreshCw,{className:(0,r.cn)(`h-4 w-4 mr-2`,j&&`animate-spin`)}),j?`Refreshing…`:`Refresh All`]})]}),se=(0,i.useMemo)(()=>(e.widgets??[]).map(e=>e.id).filter(e=>!!e),[e.widgets]),ce=(0,i.useMemo)(()=>(e.widgets??[]).filter(e=>e.type===`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]),le=(0,i.useMemo)(()=>(e.widgets??[]).filter(e=>e.type!==`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]);if(N){let n=e.widgets?.filter(e=>e.type===`metric`)||[],i=e.widgets?.filter(e=>e.type!==`metric`)||[],a=(0,l.jsxs)(`div`,{ref:E,className:(0,r.cn)(`flex flex-col gap-4 px-4`,t),"data-user-actions":ae,onClick:J,...b,children:[Q,oe,n.length>0&&(0,l.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,onClick:J,children:(0,l.jsx)(s.SortableContext,{items:ce,strategy:s.rectSortingStrategy,disabled:!Y,children:n.map((e,t)=>re(e,t))})}),i.length>0&&(0,l.jsx)(`div`,{className:`flex flex-col gap-4`,onClick:J,children:(0,l.jsx)(s.SortableContext,{items:le,strategy:s.verticalListSortingStrategy,disabled:!Y,children:i.map((e,t)=>re(e,t,!0))})})]});return Y?(0,l.jsx)(o.DndContext,{sensors:X,collisionDetection:o.closestCenter,onDragEnd:Z,children:a}):a}let ue=e.columns!=null||O!==4,de=(0,l.jsxs)(`div`,{ref:E,className:(0,r.cn)(`grid auto-rows-min`,!ue&&`grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`,t),style:{...ue&&{gridTemplateColumns:`repeat(${k}, minmax(0, 1fr))`},gap:`${A*.25}rem`},"data-user-actions":ae,onClick:J,...b,children:[Q,oe,(0,l.jsx)(s.SortableContext,{items:se,strategy:s.rectSortingStrategy,disabled:!Y,children:e.widgets?.map((e,t)=>re(e,t))})]});return Y?(0,l.jsx)(o.DndContext,{sensors:X,collisionDetection:o.closestCenter,onDragEnd:Z,children:de}):de});function k({editMode:e}){let t=(0,n.useDnd)();return i.useEffect(()=>{if(e)return t.startDrag({id:`dashboard-layout`,type:`dashboard-widget`,data:{}}),()=>{t.endDrag()};t.endDrag(`dashboard`)},[e,t]),null}var A=[`hsl(var(--chart-1))`,`hsl(var(--chart-2))`,`hsl(var(--chart-3))`,`hsl(var(--chart-4))`,`hsl(var(--chart-5))`];function j(e,t){if(!e.widgets?.length)return e;let n=new Map(t.map(e=>[e.i,e])),r=e.widgets.map((e,t)=>{let r=e.id||`widget-${t}`,i=n.get(r);return i?{...e,layout:{x:i.x,y:i.y,w:i.w,h:i.h}}:e});return{...e,widgets:r}}function M(e){return{lg:e.widgets?.map((e,t)=>({i:e.id||`widget-${t}`,x:e.layout?.x??t%4*3,y:e.layout?.y??Math.floor(t/4)*4,w:e.layout?.w??3,h:e.layout?.h??4}))||[]}}var N=({schema:e,className:t,onLayoutChange:o,onSchemaChange:s,onRefresh:c})=>{let{width:d,containerRef:f,mounted:p}=(0,u.useContainerWidth)(),[m,h]=i.useState(!1),[g,_]=i.useState(!1),v=(0,n.useHasDndProvider)(),y=i.useRef(null),b=i.useCallback(()=>{c&&(_(!0),c(),setTimeout(()=>_(!1),600))},[c]);i.useEffect(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!c))return y.current=setInterval(b,e.refreshInterval*1e3),()=>{y.current&&clearInterval(y.current)}},[e.refreshInterval,c,b]);let[S,C]=i.useState(()=>M(e)),w=i.useMemo(()=>JSON.stringify(e.widgets?.map((e,t)=>({i:e.id||`widget-${t}`,x:e.layout?.x,y:e.layout?.y,w:e.layout?.w,h:e.layout?.h}))??[]),[e.widgets]);i.useEffect(()=>{C(M(e))},[w]);let T=i.useCallback((e,t)=>{C(t),o?.(e)},[o]),E=i.useCallback(()=>{s?s(j(e,S.lg)):process.env.NODE_ENV!==`production`&&console.warn("[DashboardGridLayout] Layout edits are in-memory only. Wire `onSchemaChange` to persist via your data adapter."),h(!1)},[s,e,S]),D=i.useCallback(()=>{C(M(e))},[e]),O=i.useCallback(e=>{if(e.component)return e.component;let t=e.type,n=e.options||{};if(t===`bar`||t===`horizontal-bar`||t===`line`||t===`area`||t===`pie`||t===`donut`||t===`scatter`||t===`funnel`){let r=e.data||n.data,i=e.categoryField||n.xField||`name`,a=e.valueField||n.yField||`value`;if(x(r)){let n=r.aggregate,o=n?{field:e.valueField||n.field,function:e.aggregate||n.function,groupBy:e.categoryField||n.groupBy}:void 0,s=o?.field||a;return{type:`object-chart`,chartType:t,objectName:e.object||r.object,aggregate:o,xAxisKey:i,series:[{dataKey:s}],colors:A,className:`h-full`}}if(!r&&e.object){let n=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`name`}:void 0;return{type:`object-chart`,chartType:t,objectName:e.object,aggregate:n,xAxisKey:i,series:[{dataKey:e.valueField||`value`}],colors:A,className:`h-full`}}return{type:`chart`,chartType:t,data:Array.isArray(r)?r:r?.items||[],xAxisKey:i,series:[{dataKey:a}],colors:A,className:`h-full`}}if(t===`table`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`data-table`,...i,objectName:e.object||t.object,dataProvider:t,data:[],searchable:!1,pagination:!1,className:`border-0`}}return!t&&e.object?{type:`data-table`,...n,objectName:e.object,data:[],searchable:!1,pagination:!1,className:`border-0`}:{type:`data-table`,...n,data:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}if(t===`pivot`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`pivot`,...i,objectName:e.object||t.object,dataProvider:t,data:[]}}return{type:`pivot`,...n,data:Array.isArray(t)?t:t?.items||[]}}return{...e,...n}},[]);return(0,l.jsxs)(`div`,{ref:f,className:(0,r.cn)(`w-full`,t),"data-testid":`grid-layout`,children:[v&&(0,l.jsx)(k,{editMode:m}),(0,l.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,l.jsx)(`h2`,{className:`text-2xl font-bold`,children:e.title||`Dashboard`}),(0,l.jsx)(`div`,{className:`flex gap-2`,children:m?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(r.Button,{onClick:E,size:`sm`,variant:`default`,children:[(0,l.jsx)(a.Save,{className:`h-4 w-4 mr-2`}),`Save Layout`]}),(0,l.jsxs)(r.Button,{onClick:D,size:`sm`,variant:`outline`,children:[(0,l.jsx)(a.X,{className:`h-4 w-4 mr-2`}),`Reset`]}),(0,l.jsx)(r.Button,{onClick:()=>h(!1),size:`sm`,variant:`ghost`,children:`Cancel`})]}):(0,l.jsxs)(l.Fragment,{children:[c&&(0,l.jsxs)(r.Button,{onClick:b,size:`sm`,variant:`outline`,disabled:g,"aria-label":`Refresh dashboard`,children:[(0,l.jsx)(a.RefreshCw,{className:(0,r.cn)(`h-4 w-4 mr-2`,g&&`animate-spin`)}),g?`Refreshing…`:`Refresh All`]}),(0,l.jsxs)(r.Button,{onClick:()=>h(!0),size:`sm`,variant:`outline`,children:[(0,l.jsx)(a.Edit,{className:`h-4 w-4 mr-2`}),`Edit Layout`]})]})})]}),p&&(0,l.jsx)(u.ResponsiveGridLayout,{className:`layout`,width:d,layouts:S,breakpoints:{lg:1200,md:996,sm:768,xs:480,xxs:0},cols:{lg:12,md:10,sm:6,xs:4,xxs:2},rowHeight:60,dragConfig:{enabled:m,handle:`.drag-handle`},resizeConfig:{enabled:m},onLayoutChange:T,children:e.widgets?.map((e,t)=>{let i=e.id||`widget-${t}`,o=O(e);return(0,l.jsx)(`div`,{className:`h-full`,children:e.type===`metric`?(0,l.jsxs)(`div`,{className:`h-full w-full relative`,children:[m&&(0,l.jsx)(`div`,{className:`drag-handle absolute top-2 right-2 z-10 cursor-move p-1 bg-background/80 rounded border border-border`,children:(0,l.jsx)(a.GripVertical,{className:`h-4 w-4`})}),(0,l.jsx)(n.SchemaRenderer,{schema:o,className:`h-full w-full`})]}):(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full overflow-hidden border-border/50 shadow-sm transition-all`,`bg-card/50 backdrop-blur-sm`,m&&`ring-2 ring-primary/20`),children:[e.title&&(0,l.jsxs)(r.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 flex flex-row items-center justify-between`,children:[(0,l.jsx)(r.CardTitle,{className:`text-base font-medium tracking-tight truncate`,title:e.title,children:e.title}),m&&(0,l.jsx)(`div`,{className:`drag-handle cursor-move p-1 hover:bg-muted/40 rounded`,children:(0,l.jsx)(a.GripVertical,{className:`h-4 w-4`})})]}),(0,l.jsx)(r.CardContent,{className:`p-0 h-full`,children:(0,l.jsx)(`div`,{className:(0,r.cn)(`h-full w-full overflow-auto p-4`),children:(0,l.jsx)(n.SchemaRenderer,{schema:o})})})]})},i)})})]})},P=(0,f.createSafeTranslation)({"dashboard.trend.vsLastQuarter":`vs last quarter`,"dashboard.trend.vsLastMonth":`vs last month`,"dashboard.trend.vsLastWeek":`vs last week`,"dashboard.trend.vsLastYear":`vs last year`,"dashboard.trend.vsYesterday":`vs yesterday`,"dashboard.trend.vsPreviousPeriod":`vs previous period`},`dashboard.trend.vsLastQuarter`);function F(e){switch(e.trim().toLowerCase().replace(/\s+/g,` `)){case`vs last quarter`:case`vs previous quarter`:return`dashboard.trend.vsLastQuarter`;case`vs last month`:case`vs previous month`:return`dashboard.trend.vsLastMonth`;case`vs last week`:case`vs previous week`:return`dashboard.trend.vsLastWeek`;case`vs last year`:case`vs previous year`:return`dashboard.trend.vsLastYear`;case`vs yesterday`:return`dashboard.trend.vsYesterday`;case`vs previous period`:case`vs prior period`:return`dashboard.trend.vsPreviousPeriod`;default:return}}function I(e,t,n){if(e==null)return``;if(typeof e==`string`){let r=Number(e);return!isFinite(r)||e.trim()===``?e:I(r,t,n)}if(!isFinite(e))return String(e);let r={$:`USD`,"¥":`JPY`,"€":`EUR`,"£":`GBP`},i=(t||``).trim(),a=!!n||i.length>0&&r[i[0]]!==void 0,o=i.endsWith(`%`),s=i.match(/0\.(0+)/),c=s?s[1].length:0;if(a){let t=n||r[i[0]]||`USD`;try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,minimumFractionDigits:c,maximumFractionDigits:c}).format(e)}catch{return`${t} ${e.toFixed(c)}`}}return o?`${(e>1?e:e*100).toFixed(c)}%`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:c,maximumFractionDigits:c}).format(e)}function L(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var R={default:`bg-muted text-muted-foreground`,blue:`bg-blue-500/10 text-blue-600 dark:text-blue-400`,teal:`bg-teal-500/10 text-teal-600 dark:text-teal-400`,orange:`bg-orange-500/10 text-orange-600 dark:text-orange-400`,purple:`bg-purple-500/10 text-purple-600 dark:text-purple-400`,success:`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`,warning:`bg-amber-500/10 text-amber-600 dark:text-amber-400`,danger:`bg-rose-500/10 text-rose-600 dark:text-rose-400`},z=({label:e,value:t,trend:n,icon:o,className:s,description:c,loading:u,error:d,colorVariant:f=`default`,format:p,currency:m,prefix:h,suffix:g,onClick:_,...v})=>{let y=R[f]||R.default,{t:b}=P(),x=(0,i.useMemo)(()=>{let e=L(c)||L(n?.label);if(!e)return e;let t=F(e);return t?b(t):e},[c,n?.label,b]),S=(0,i.useMemo)(()=>{let e=typeof t==`number`||typeof t==`string`&&t.trim()!==``&&isFinite(Number(t))?I(t,p,m):t??``,n=String(e);return`${h&&n.startsWith(h)?``:h??``}${n}${g&&n.endsWith(g)?``:g??``}`},[t,p,m,h,g]),C=(0,i.useMemo)(()=>{if(typeof o==`string`){let e=(0,r.getLazyIcon)(o);return e?(0,l.jsx)(e,{className:`h-4 w-4`}):null}return o},[o]);return(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full overflow-hidden`,_&&`cursor-pointer transition-colors hover:bg-accent/40 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none`,s),onClick:_,role:_?`button`:void 0,tabIndex:_?0:void 0,onKeyDown:_?e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),_())}:void 0,...v,children:[(0,l.jsxs)(r.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm font-medium truncate`,children:L(e)}),C&&(0,l.jsx)(`div`,{className:(0,r.cn)(`flex h-8 w-8 items-center justify-center rounded-md shrink-0`,y),children:C})]}),(0,l.jsx)(r.CardContent,{children:u?(0,l.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-loading`,children:[(0,l.jsx)(a.Loader2,{className:`h-4 w-4 animate-spin`}),(0,l.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-error`,role:`alert`,children:[(0,l.jsx)(a.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,l.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`div`,{className:`text-2xl font-bold truncate`,children:S}),(n||c)&&(0,l.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 min-w-0`,children:[n&&(0,l.jsxs)(`span`,{className:(0,r.cn)(`flex items-center shrink-0 font-medium`,n.direction===`up`&&`text-emerald-600 dark:text-emerald-400`,n.direction===`down`&&`text-rose-600 dark:text-rose-400`,n.direction===`neutral`&&`text-muted-foreground`),children:[n.direction===`up`&&(0,l.jsx)(a.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),n.direction===`down`&&(0,l.jsx)(a.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),n.direction===`neutral`&&(0,l.jsx)(a.MinusIcon,{className:`h-3 w-3 mr-1`}),n.value,`%`]}),(0,l.jsx)(`span`,{className:`truncate min-w-0`,children:x})]})]})})]})};function B(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var V=({title:e,value:t,icon:n,trend:i,trendValue:o,description:s,className:c,loading:u,error:d,...f})=>{let p=n?(0,r.getLazyIcon)(n):null;return(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full`,c),...f,children:[(0,l.jsxs)(r.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm font-medium`,children:B(e)}),p&&(0,l.jsx)(p,{className:`h-4 w-4 text-muted-foreground`})]}),(0,l.jsx)(r.CardContent,{children:u?(0,l.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-card-loading`,children:[(0,l.jsx)(a.Loader2,{className:`h-4 w-4 animate-spin`}),(0,l.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-card-error`,role:`alert`,children:[(0,l.jsx)(a.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,l.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),(i||o||s)&&(0,l.jsxs)(`p`,{className:`text-xs text-muted-foreground flex items-center mt-1`,children:[i&&o&&(0,l.jsxs)(`span`,{className:(0,r.cn)(`flex items-center mr-2`,i===`up`&&`text-green-500`,i===`down`&&`text-red-500`,i===`neutral`&&`text-yellow-500`),children:[i===`up`&&(0,l.jsx)(a.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),i===`down`&&(0,l.jsx)(a.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),i===`neutral`&&(0,l.jsx)(a.MinusIcon,{className:`h-3 w-3 mr-1`}),o]}),B(s)]})]})})]})},H=({objectName:e,aggregate:a,filter:o,label:s,fallbackValue:c,trend:u,icon:d,className:f,description:p,dataSource:m,colorVariant:h,format:g,currency:_,prefix:v,suffix:y,drillDown:b,title:x})=>{let S=(0,i.useContext)(n.SchemaRendererContext),C=m||S?.dataSource,[w,T]=(0,i.useState)(!1),[E,D]=(0,i.useState)(null),[O,k]=(0,i.useState)(!1),[A,j]=(0,i.useState)(null),[M,N]=(0,i.useState)(null);(0,i.useEffect)(()=>{let t=!0;if(!(!C||!e||typeof C.getObjectSchema!=`function`))return C.getObjectSchema(e).then(e=>{t&&N(e)}).catch(()=>{}),()=>{t=!1}},[C,e]);let P=(0,i.useMemo)(()=>{let e=a?.field;if(!e||!M?.fields)return null;let t=M.fields;return Array.isArray(t)?t.find(t=>t?.name===e)||null:t[e]||null},[M,a?.field]),F=(0,i.useMemo)(()=>{if(g)return g;if(P){if(P.type===`currency`){let e=P.precision??P.scale??0;return e>0?`0,0.${`0`.repeat(e)}`:`0,0`}if(P.type===`percent`)return`0,0%`;if(P.type===`number`||P.type===`integer`)return`0,0`}},[g,P]),I=(0,i.useMemo)(()=>{if(_)return _;if(P?.type===`currency`)return P.defaultCurrency||P.currency||void 0},[_,P]),L=(0,i.useMemo)(()=>a?JSON.stringify(a):``,[a]),R=(0,i.useMemo)(()=>(0,t.resolveDateMacros)(o),[o]),B=(0,i.useCallback)(async(t,n)=>{if(!(!t||!e)){n.current&&(k(!0),j(null));try{let r;if(a&&typeof t.aggregate==`function`){let n=await t.aggregate(e,{field:a.field,function:a.function,groupBy:a.groupBy||`_all`,filter:R}),i=Array.isArray(n)?n:[];r=i.length===0?0:a.function===`count`?i.reduce((e,t)=>e+(Number(t[a.field])||Number(t.count)||0),0):i[0][a.field]??0}else if(typeof t.find==`function`){let n=await t.find(e,{$filter:R});r=(Array.isArray(n)?n:n?.data||n?.records||[]).length}else return;n.current&&D(r)}catch(e){console.error(`[ObjectMetricWidget] Fetch error:`,e),n.current&&j(e instanceof Error?e.message:`Failed to load metric`)}finally{n.current&&k(!1)}}},[e,L,(0,i.useMemo)(()=>R?JSON.stringify(R):``,[R])]);(0,i.useEffect)(()=>{let t={current:!0};return C&&e?B(C,t):(D(null),j(null)),()=>{t.current=!1}},[C,e,B]);let V=E===null?C?`—`:c??`—`:E,H=(0,t.isDrillEnabled)(b)&&!!e&&!!C,U=(0,i.useMemo)(()=>{let e=typeof s==`string`?s:s?.defaultValue||``;return(0,t.resolveDrillTitle)(b,{},(typeof x==`string`?x:x?.defaultValue||``)||e||`Details`)},[b,s,x]),W=(0,i.useMemo)(()=>{if(!H)return null;let t=b?.target??`drawer`,i=(0,l.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,l.jsx)(n.SchemaRenderer,{schema:{type:`object-data-table`,objectName:e,filter:R,pageSize:25,drillDown:{enabled:!1}}})});return t===`modal`?(0,l.jsx)(r.Dialog,{open:!0,onOpenChange:e=>!e&&T(!1),children:(0,l.jsxs)(r.DialogContent,{className:`max-w-4xl`,children:[(0,l.jsx)(r.DialogHeader,{children:(0,l.jsx)(r.DialogTitle,{children:U})}),i]})}):(0,l.jsx)(r.Sheet,{open:!0,onOpenChange:e=>!e&&T(!1),children:(0,l.jsxs)(r.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col`,children:[(0,l.jsx)(r.SheetHeader,{children:(0,l.jsx)(r.SheetTitle,{children:U})}),(0,l.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:i})]})})},[H,b,e,R,U]);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(z,{label:s,value:V,trend:u,icon:d,className:f,description:p,loading:O,error:A,colorVariant:h,format:F,currency:I,prefix:v,suffix:y,onClick:H?()=>T(!0):void 0}),w&&W]})};function U(){try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.total`);return!t||t===`dashboard.total`?`Total`:t}catch{return`Total`}}function W(){try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);return!t||t===`dashboard.noDataAvailable`?`No data available`:t}catch{return`No data available`}}function ee(e,t){if(!t)return String(e);let n=``,r=``,i=!1,a,o=t,s=o.match(/^([^0-9.,#]*)/);if(s&&s[1]){let e=s[1];n=e.replace(`,`,``),e.includes(`,`)&&(i=!0),o=o.slice(s[1].length)}o.includes(`,`)&&(i=!0,o=o.replace(/,/g,``));let c=o.match(/\.(\d+)f?/);c&&(a=Number(c[1]),o=o.slice(c[0].length)),r=o.replace(/[0-9#.f]/g,``);let l=a===void 0?String(e):e.toFixed(a);if(i){let[e,t]=l.split(`.`),i=e.replace(/\B(?=(\d{3})+(?!\d))/g,`,`);return n+(t===void 0?i:`${i}.${t}`)+r}return n+l+r}var G=`—`;function te(e,t){return e===``?G:t?.[e]??e}function K(e,t){if(e.length===0)return 0;switch(t){case`sum`:return e.reduce((e,t)=>e+t,0);case`count`:return e.length;case`avg`:return e.reduce((e,t)=>e+t,0)/e.length;case`min`:return Math.min(...e);case`max`:return Math.max(...e);default:return e.reduce((e,t)=>e+t,0)}}var q=({schema:e,className:n,rowLabels:a,columnLabels:o,rowFieldLabel:s,onDrillDown:c})=>{let{title:u,rowField:d,columnField:f,valueField:p,aggregation:m=`sum`,data:h=[],showRowTotals:g=!1,showColumnTotals:_=!1,format:v,columnColors:y,drillDown:b}=e,x=U(),S=W(),C=(0,t.isDrillEnabled)(b)&&typeof c==`function`,w=e=>{C&&c({...e,rowLabel:e.rowKey===void 0?e.rowLabel:a?.[e.rowKey]??e.rowKey,colLabel:e.colKey===void 0?e.colLabel:o?.[e.colKey]??e.colKey})},T=e=>t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e())},E=C?`cursor-pointer hover:bg-accent/40 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]`:``,D=Array.isArray(h)?h:[],{rowKeys:O,colKeys:k,matrix:A,rowTotals:j,colTotals:M,grandTotal:N}=(0,i.useMemo)(()=>{let e=new Map,t=new Map,n={};for(let r of D){let i=String(r[d]??``),a=String(r[f]??``),o=Number(r[p])||0;e.set(i,!0),t.set(a,!0),n[i]||(n[i]={}),n[i][a]||(n[i][a]=[]),n[i][a].push(o)}let r=Array.from(e.keys()),i=Array.from(t.keys()),a={},o={},s={};for(let e of r){a[e]={};let t=[];for(let r of i){let i=n[e]?.[r]??[],o=K(i,m);a[e][r]=o,t.push(...i),!s[r]&&s[r]}o[e]=K(t,m)}for(let e of i){let t=[];for(let i of r){let r=n[i]?.[e]??[];t.push(...r)}s[e]=K(t,m)}let c=[];for(let e of D)c.push(Number(e[p])||0);return{rowKeys:r,colKeys:i,matrix:a,rowTotals:o,colTotals:s,grandTotal:K(c,m)}},[D,d,f,p,m]),P=e=>ee(e,v);return D.length===0?(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,n),children:[u&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:u}),(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,"data-testid":`pivot-empty-state`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:S})]})]}):(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,n),children:[u&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:u}),(0,l.jsxs)(`table`,{className:`w-full text-sm border-collapse table-auto`,role:`table`,children:[(0,l.jsx)(`thead`,{children:(0,l.jsxs)(`tr`,{className:`border-b border-border`,children:[(0,l.jsx)(`th`,{className:`text-left p-2 font-medium text-muted-foreground whitespace-nowrap`,children:s||d}),k.map(e=>{let t=()=>w({scope:`column`,colKey:e});return(0,l.jsx)(`th`,{className:(0,r.cn)(`text-right p-2 font-medium whitespace-nowrap`,e===``&&`italic text-muted-foreground/70`,y?.[e]??`text-muted-foreground`,E),title:e===``?`${f}: (empty)`:`${f}: ${e}`,role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?t:void 0,onKeyDown:C?T(t):void 0,"aria-label":C?`Drill into ${f}: ${e||`(empty)`}`:void 0,children:te(e,o)},e)}),g&&(0,l.jsx)(`th`,{className:`text-right p-2 font-semibold text-muted-foreground bg-muted/20 whitespace-nowrap`,children:x})]})}),(0,l.jsx)(`tbody`,{children:O.map(e=>(0,l.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-muted/30`,children:[(0,l.jsx)(`td`,{className:(0,r.cn)(`p-2 font-medium whitespace-nowrap`,e===``&&`italic text-muted-foreground/70`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`row`,rowKey:e}):void 0,onKeyDown:C?T(()=>w({scope:`row`,rowKey:e})):void 0,"aria-label":C?`Drill into ${d}: ${e||`(empty)`}`:void 0,children:te(e,a)}),k.map(t=>{let n=A[e]?.[t]??0,i=()=>w({scope:`cell`,rowKey:e,colKey:t,value:n});return(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums`,y?.[t],E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?i:void 0,onKeyDown:C?T(i):void 0,"aria-label":C?`Drill into ${d}=${e||`(empty)`}, ${f}=${t||`(empty)`}`:void 0,children:P(n)},t)}),g&&(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 font-semibold tabular-nums bg-muted/20`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`row`,rowKey:e,value:j[e]??0}):void 0,onKeyDown:C?T(()=>w({scope:`row`,rowKey:e,value:j[e]??0})):void 0,children:P(j[e]??0)})]},e))}),_&&(0,l.jsx)(`tfoot`,{children:(0,l.jsxs)(`tr`,{className:`border-t-2 border-border font-semibold bg-muted/40`,children:[(0,l.jsx)(`td`,{className:`p-2`,children:x}),k.map(e=>(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`column`,colKey:e,value:M[e]??0}):void 0,onKeyDown:C?T(()=>w({scope:`column`,colKey:e,value:M[e]??0})):void 0,children:P(M[e]??0)},e)),g&&(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums font-bold`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`total`,value:N}):void 0,onKeyDown:C?T(()=>w({scope:`total`,value:N})):void 0,children:P(N)})]})})]})]})};function ne(e){return e.map(e=>typeof e==`string`?{header:e.replace(/_/g,` `).replace(/([A-Z])/g,` $1`).trim().replace(/\b\w/g,e=>e.toUpperCase()),accessorKey:e}:e)}function J(e,t){if(!t?.fields)return[];let n={};if(Array.isArray(t.fields))for(let e of t.fields)e?.name&&(n[e.name]=e);else for(let[e,r]of Object.entries(t.fields))n[e]={name:e,...r};let r=e=>e===`lookup`||e===`reference`||e===`master_detail`||e===`user`||e===`owner`,i=Array.isArray(e.columns)?e.columns:[],a=new Set;if(i.length>0){let e=i.map(e=>typeof e==`string`?e:e.accessorKey||e.name).filter(Boolean);for(let t of e){let e=n[t];e&&r(e.type)&&a.add(t)}}else for(let[e,t]of Object.entries(n))r(t?.type)&&a.add(e);return Array.from(a)}var Y=({schema:e,dataSource:a,className:o})=>{let s=(0,i.useContext)(n.SchemaRendererContext),c=a||s?.dataSource,u=(0,n.useDataScope)(e.bind),{fieldLabel:d,fieldOptionLabel:m}=(0,f.useSafeFieldLabel)(),h=`No data available`,g=`No data source available for`;try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);t&&t!==`dashboard.noDataAvailable`&&(h=t);let n=e(`dashboard.noDataSourceFor`);n&&n!==`dashboard.noDataSourceFor`&&(g=n)}catch{}let[_,v]=(0,i.useState)([]),[y,b]=(0,i.useState)(null),[x,S]=(0,i.useState)(!1),[C,w]=(0,i.useState)(null);(0,i.useEffect)(()=>{let n=!0;return e.objectName&&!u&&(!e.data||e.data.length===0)&&(async()=>{if(!(!c||!e.objectName)){n&&(S(!0),w(null));try{let r;if(typeof c.find==`function`){let n=J(e,y),i={$filter:(0,t.resolveDateMacros)(e.filter)};n.length&&(i.$expand=n),r=(0,t.extractRecords)(await c.find(e.objectName,i))}else return;n&&v(r)}catch(e){console.error(`[ObjectDataTable] Fetch error:`,e),n&&w(e instanceof Error?e.message:`Failed to load data`)}finally{n&&S(!1)}}})(),()=>{n=!1}},[e.objectName,c,u,e.data,e.filter,y]),(0,i.useEffect)(()=>{let t=!0;if(!(!c||!e.objectName||typeof c.getObjectSchema!=`function`))return c.getObjectSchema(e.objectName).then(e=>{t&&b(e)}).catch(()=>{}),()=>{t=!1}},[e.objectName,c]);let T=u||e.data||_,E=Array.isArray(T)?T:[],D=(0,i.useMemo)(()=>{let t=e.objectName,n={};if(y?.fields){let e=y.fields;if(Array.isArray(e))for(let t of e)t?.name&&(n[t.name]=t);else for(let[t,r]of Object.entries(e))n[t]={name:t,...r}}let r=e=>{let n=e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g,` $1`);return t?d(t,e,n):n},i=e=>{let r=n[e.accessorKey],i=e.referenceTo??r?.referenceTo??(typeof r?.reference==`string`?r.reference:r?.reference?.to)??r?.target,a=e.options??r?.options;t&&a&&(r?.type===`select`||r?.type===`picklist`||r?.type===`dropdown`||r?.type===`status`)&&(a=a.map(n=>{if(n==null)return n;let r=typeof n==`object`?n.value:n,i=typeof n==`object`&&n.label||String(r);return{value:r,label:m(t,e.accessorKey,String(r),i),color:typeof n==`object`?n.color:void 0}}));let o={name:e.accessorKey,label:e.header,type:e.type??r?.type,options:a,referenceTo:i,format:e.format??r?.format,currency:e.currency??r?.currency??r?.defaultCurrency,decimals:e.decimals??r?.decimals??r?.precision??r?.scale},s=new Set([`currency`,`money`,`number`,`integer`,`decimal`,`float`,`percent`,`percentage`]),c=e.align??(s.has(o.type)||typeof o.format==`string`&&/^[\$¥€£]|%$|0/.test(o.format)?`right`:void 0);if(typeof e.cell==`function`)return{...e,...o,align:c};let u=e=>{if(e==null||e===``)return``;let t=o.format;if(typeof t==`string`&&/^\$|¥|€|£/.test(t)&&typeof e==`number`){let n={$:`USD`,"¥":`JPY`,"€":`EUR`,"£":`GBP`}[t[0]];return(0,p.formatCurrency)(e,o.currency||n)}if(typeof t==`string`&&/%/.test(t)&&typeof e==`number`){let n=(t.match(/0\.(0+)%/)||[,``])[1].length;return(0,p.formatPercent)((e>1?e/100:e)*100,n)}return typeof t==`string`&&/[YMDHms]/.test(t)?(0,p.formatDate)(e,t):(0,l.jsx)((0,p.getCellRenderer)((0,p.resolveCellRendererType)(o)),{value:e,field:o})};return{...e,...o,align:c,cell:u}};if(e.columns&&e.columns.length>0){let n=ne(e.columns);return(t?n.map(e=>({...e,header:d(t,e.accessorKey,e.header)})):n).map(i)}if(E.length===0)return[];let a=new Set([`id`,`organization_id`,`tenant_id`,`created_at`,`updated_at`,`created_by`,`updated_by`,`deleted_at`,`deleted_by`,`version`,`_id`,`__typename`]),o=(e,t)=>t&&(t.isSystem===!0||t.system===!0)?!0:a.has(e);return(Object.keys(n).length>0?Object.keys(n).filter(e=>!o(e,n[e])):Object.keys(E[0]).filter(e=>!e.startsWith(`_`)&&!o(e))).map(e=>i({header:r(e),accessorKey:e}))},[e.columns,e.objectName,E,y,d,m]);return x&&E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-loading`,children:(0,l.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`})]}),[1,2,3,4].map(e=>(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`})]},e))]})}):C?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-error`,children:(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`table-error-message`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-60`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,l.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,l.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:C})]})}):!c&&e.objectName&&E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),children:(0,l.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,l.jsxs)(`p`,{className:`text-xs`,children:[g,` “`,e.objectName,`”`]})})}):E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-empty-state`,children:(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,l.jsx)(`line`,{x1:`3`,y1:`9`,x2:`21`,y2:`9`}),(0,l.jsx)(`line`,{x1:`9`,y1:`21`,x2:`9`,y2:`9`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:h})]})}):(0,l.jsx)(n.SchemaRenderer,{schema:{...e,type:`data-table`,data:E,columns:D},className:o})},X=({open:e,onClose:t,title:n,target:i=`drawer`,objectName:a,filter:o,dataSource:s,columns:c,maxRows:u,className:d})=>{let f={type:`object-data-table`,objectName:a,filter:o,columns:c?.map(e=>({accessorKey:e,header:e})),pagination:!0,searchable:!1,pageSize:u},p=(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,d),"data-testid":`drill-down-body`,children:(0,l.jsx)(Y,{schema:f,dataSource:s})});return i===`dialog`?(0,l.jsx)(r.Dialog,{open:e,onOpenChange:e=>!e&&t(),children:(0,l.jsxs)(r.DialogContent,{className:`max-w-4xl`,children:[(0,l.jsx)(r.DialogHeader,{children:(0,l.jsx)(r.DialogTitle,{children:n})}),p]})}):(0,l.jsx)(r.Sheet,{open:e,onOpenChange:e=>!e&&t(),children:(0,l.jsxs)(r.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col`,children:[(0,l.jsx)(r.SheetHeader,{children:(0,l.jsx)(r.SheetTitle,{children:n})}),(0,l.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:p})]})})},Z=({schema:e,dataSource:a,className:o})=>{let s=(0,i.useContext)(n.SchemaRendererContext),c=a||s?.dataSource,u=(0,n.useDataScope)(e.bind),[d,p]=(0,i.useState)([]),[m,h]=(0,i.useState)(!1),[g,_]=(0,i.useState)(null),[v,y]=(0,i.useState)({}),[b,x]=(0,i.useState)({}),[S,C]=(0,i.useState)(null),{fieldLabel:w,fieldOptionLabel:T}=(0,f.useSafeFieldLabel)(),E=(0,i.useRef)(w),D=(0,i.useRef)(T);(0,i.useEffect)(()=>{E.current=w,D.current=T},[w,T]),(0,i.useEffect)(()=>{if(!c||!e.objectName)return;let t=c.getObjectSchema;if(typeof t!=`function`)return;let n=!0;return Promise.resolve(t.call(c,e.objectName)).then(t=>{if(!n||!t?.fields)return;let r=e.objectName,i={},a={};for(let[e,n]of Object.entries(t.fields)){let t=n?.label?String(n.label):e;a[e]=E.current(r,e,t);let o=n?.options;if(Array.isArray(o)&&o.length>0){let t={};for(let n of o)if(n&&n.value!==void 0&&n.label!==void 0){let i=String(n.value),a=String(n.label);t[i]=D.current(r,e,i,a)}Object.keys(t).length>0&&(i[e]=t)}}y(i),x(a)}).catch(()=>{}),()=>{n=!1}},[c,e.objectName]),(0,i.useEffect)(()=>{let n=!0;return e.objectName&&!u&&(!e.data||e.data.length===0)&&(async()=>{if(!(!c||!e.objectName)){n&&(h(!0),_(null));try{let r;if(typeof c.find==`function`)r=(0,t.extractRecords)(await c.find(e.objectName,{$filter:(0,t.resolveDateMacros)(e.filter)}));else return;n&&p(r)}catch(e){console.error(`[ObjectPivotTable] Fetch error:`,e),n&&_(e instanceof Error?e.message:`Failed to load data`)}finally{n&&h(!1)}}})(),()=>{n=!1}},[e.objectName,c,u,e.data,e.filter]);let O=u||e.data||d,k=Array.isArray(O)?O:[];if(m&&k.length===0)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`pivot-loading`,children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-6 w-24`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`})]}),[1,2,3].map(e=>(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-5 w-24`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`})]},e))]})]});if(g)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`pivot-error`,children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`pivot-error-message`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-60`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,l.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,l.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:g})]})]});if(!c&&e.objectName&&k.length===0)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,l.jsxs)(`p`,{className:`text-xs`,children:[`No data source available for “`,e.objectName,`”`]})})]});let A={...e,data:k},j=e.rowField?v[e.rowField]:void 0,M=e.columnField?v[e.columnField]:void 0,N=e.rowField?b[e.rowField]:void 0,P=e.drillDown,F=(0,t.isDrillEnabled)(P)?e=>C(e):void 0;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(q,{schema:A,className:o,rowLabels:j,columnLabels:M,rowFieldLabel:N,onDrillDown:F}),(()=>{if(!S||!e.objectName)return null;let n=(0,t.computeDrillFilter)(P,S,{rowField:e.rowField,columnField:e.columnField}),r={...e.filter||{},...n};return(0,l.jsx)(X,{open:!0,onClose:()=>C(null),title:(0,t.resolveDrillTitle)(P,S,e.title||`Details`),target:P?.target??`drawer`,objectName:e.objectName,filter:r,dataSource:c,columns:P?.columns,maxRows:P?.maxRows})})()]})},re={breadcrumb:[`Dashboard`,`Configuration`],sections:[{key:`layout`,title:`Layout`,collapsible:!0,fields:[{key:`columns`,label:`Columns`,type:`slider`,defaultValue:3,min:1,max:12,step:1},{key:`gap`,label:`Gap`,type:`slider`,defaultValue:4,min:0,max:16,step:1},{key:`rowHeight`,label:`Row height (px)`,type:`slider`,defaultValue:120,min:40,max:320,step:10}]},{key:`data`,title:`Data`,collapsible:!0,fields:[{key:`refreshInterval`,label:`Auto refresh`,type:`select`,defaultValue:`0`,options:[{value:`0`,label:`Off`},{value:`30`,label:`Every 30s`},{value:`60`,label:`Every 1 min`},{value:`300`,label:`Every 5 min`},{value:`900`,label:`Every 15 min`},{value:`1800`,label:`Every 30 min`},{value:`3600`,label:`Every 1 hour`}]}]},{key:`appearance`,title:`Appearance`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`title`,label:`Title`,type:`input`,placeholder:`Dashboard title`},{key:`description`,label:`Description`,type:`textarea`,placeholder:`Short summary shown under the title`},{key:`showDescription`,label:`Show description`,type:`switch`,defaultValue:!0},{key:`theme`,label:`Theme`,type:`select`,defaultValue:`auto`,options:[{value:`light`,label:`Light`},{value:`dark`,label:`Dark`},{value:`auto`,label:`Auto`}]}]}]};function Q({open:e,onClose:t,config:n,onSave:i,onFieldChange:a}){let{draft:o,isDirty:s,updateField:c,discard:u}=(0,r.useConfigDraft)(n,{onUpdate:a});return(0,l.jsx)(r.ConfigPanelRenderer,{open:e,onClose:t,schema:re,draft:o,isDirty:s,onFieldChange:c,onSave:()=>i(o),onDiscard:u})}var ie=[{value:`metric`,label:`Metric`},{value:`bar`,label:`Bar Chart`},{value:`horizontal-bar`,label:`Horizontal Bar`},{value:`line`,label:`Line Chart`},{value:`pie`,label:`Pie Chart`},{value:`donut`,label:`Donut Chart`},{value:`area`,label:`Area Chart`},{value:`scatter`,label:`Scatter Plot`},{value:`funnel`,label:`Funnel`},{value:`table`,label:`Table`},{value:`pivot`,label:`Pivot Table`}],ae=[{value:`default`,label:`Default`},{value:`blue`,label:`Blue`},{value:`teal`,label:`Teal`},{value:`orange`,label:`Orange`},{value:`purple`,label:`Purple`},{value:`success`,label:`Success`},{value:`warning`,label:`Warning`},{value:`danger`,label:`Danger`}],oe=[{value:`count`,label:`Count`},{value:`sum`,label:`Sum`},{value:`avg`,label:`Average`},{value:`min`,label:`Min`},{value:`max`,label:`Max`}],se=[`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`scatter`,`funnel`],ce=[`bar`,`horizontal-bar`,`line`,`area`,`scatter`],le=[`pie`,`donut`,`funnel`],ue=[`metric`,...se],de=[...se],fe=[`pivot`,`metric`,`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`funnel`];function pe(e){return!!e&&se.includes(e)}function me(e){return!!e&&ce.includes(e)}function he(e){return!!e&&de.includes(e)}function ge(e){return!!e&&ue.includes(e)}function _e(e){return!!e&&fe.includes(e)}var ve=[{value:`drawer`,label:`Side drawer`},{value:`dialog`,label:`Center dialog`}],ye=[{value:`group`,label:`Group`},{value:`value`,label:`Value`}],be=[{value:`asc`,label:`↑`},{value:`desc`,label:`↓`}];function $(e,t,n,i){return{key:e,label:t,type:`custom`,render:(a,o,s)=>(0,l.jsx)(r.ConfigRow,{label:t,children:(0,l.jsx)(`div`,{"data-testid":`config-field-${e}`,children:(0,l.jsx)(r.Combobox,{options:i??[],value:a??``,onValueChange:o,placeholder:n,searchPlaceholder:`Search fields…`,emptyText:`No fields found.`,className:`h-7 w-32 text-xs`,disabled:!s.object})})})}}function xe(e,t,n){let i=e&&e.length>0,a=i?{key:`object`,label:`Data source`,type:`custom`,render:(t,n)=>(0,l.jsx)(r.ConfigRow,{label:`Data source`,children:(0,l.jsx)(`div`,{"data-testid":`config-field-object`,children:(0,l.jsx)(r.Combobox,{options:e,value:t??``,onValueChange:n,placeholder:`Select object…`,searchPlaceholder:`Search objects…`,emptyText:`No objects found.`,className:`h-7 w-32 text-xs`})})})}:{key:`object`,label:`Data source`,type:`input`,placeholder:`Object name`},o=i?{...$(`categoryField`,`Category field`,`Select field…`,t),helpText:`Group records by this field (one bar/slice/segment per value).`,visibleWhen:e=>he(e.type)}:{key:`categoryField`,label:`Category field`,type:`input`,placeholder:`e.g. status`,helpText:`Group records by this field (one bar/slice/segment per value).`,visibleWhen:e=>he(e.type)},s=i?{...$(`valueField`,`Value field`,`Select field…`,t),helpText:`Field to aggregate (sum / average / min / max).`,visibleWhen:e=>ge(e.type)&&(e.aggregate??`count`)!==`count`}:{key:`valueField`,label:`Value field`,type:`input`,placeholder:`e.g. amount`,helpText:`Field to aggregate (sum / average / min / max).`,visibleWhen:e=>ge(e.type)&&(e.aggregate??`count`)!==`count`},c=i?$(`rowField`,`Field`,`Select row field…`,t):{key:`rowField`,label:`Field`,type:`input`,placeholder:`e.g. owner`},u=i?$(`columnField`,`Field`,`Select column field…`,t):{key:`columnField`,label:`Field`,type:`input`,placeholder:`e.g. stage`},d=i?$(`valueField`,`Field`,`Select value field…`,t):{key:`valueField`,label:`Field`,type:`input`,placeholder:`e.g. amount`};return{breadcrumb:[`Dashboard`,{pivot:`Pivot table`,table:`Table`}[n??``]??(pe(n)?`Chart`:`Widget`)],sections:[{key:`general`,title:`General`,fields:[{key:`title`,label:`Title`,type:`input`,placeholder:`Widget title`},{key:`description`,label:`Description`,type:`input`,placeholder:`Widget description`},{key:`type`,label:`Widget type`,type:`select`,options:ie,defaultValue:`metric`}]},{key:`data`,title:`Data Binding`,collapsible:!0,visibleWhen:e=>e.type!==`pivot`,fields:[a,o,s,{key:`aggregate`,label:`Aggregation`,type:`select`,options:oe,defaultValue:`count`,helpText:`Count ignores Value field; Sum / Avg / Min / Max require it.`,visibleWhen:e=>ge(e.type)}]},{key:`pivot-data`,title:`Data`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[a]},{key:`pivot-rows`,title:`Rows`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[c,{key:`rowSortBy`,label:`Sort by`,type:`icon-group`,options:ye,defaultValue:`group`},{key:`rowSortOrder`,label:`Sort order`,type:`icon-group`,options:be,defaultValue:`asc`},{key:`showRowLabels`,label:`Show label`,type:`switch`,defaultValue:!0},{key:`showRowTotals`,label:`Show totals`,type:`switch`,defaultValue:!1}]},{key:`pivot-columns`,title:`Columns`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[u,{key:`columnSortBy`,label:`Sort by`,type:`icon-group`,options:ye,defaultValue:`group`},{key:`columnSortOrder`,label:`Sort order`,type:`icon-group`,options:be,defaultValue:`asc`},{key:`showColumnLabels`,label:`Show label`,type:`switch`,defaultValue:!0},{key:`showColumnTotals`,label:`Show totals`,type:`switch`,defaultValue:!1}]},{key:`pivot-values`,title:`Values`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[d,{key:`aggregation`,label:`Aggregation`,type:`select`,options:oe,defaultValue:`sum`},{key:`format`,label:`Number format`,type:`input`,placeholder:`e.g. $,.2f`}]},{key:`chart-axis`,title:`Axis & Series`,collapsible:!0,visibleWhen:e=>me(e.type),fields:[{key:`xAxisLabel`,label:`X-axis label`,type:`input`,placeholder:`e.g. Month`},{key:`yAxisLabel`,label:`Y-axis label`,type:`input`,placeholder:`e.g. Revenue`},{key:`showLegend`,label:`Show legend`,type:`switch`,defaultValue:!0}]},{key:`chart-legend`,title:`Display`,collapsible:!0,visibleWhen:e=>!!e.type&&le.includes(e.type),fields:[{key:`showLegend`,label:`Show legend`,type:`switch`,defaultValue:!0}]},{key:`table-options`,title:`Table options`,collapsible:!0,visibleWhen:e=>e.type===`table`,fields:[{key:`searchable`,label:`Searchable`,type:`switch`,defaultValue:!1},{key:`pagination`,label:`Pagination`,type:`switch`,defaultValue:!1}]},{key:`layout`,title:`Layout`,collapsible:!0,fields:[{key:`layoutW`,label:`Width (columns)`,type:`slider`,min:1,max:12,step:1,defaultValue:1},{key:`layoutH`,label:`Height (rows)`,type:`slider`,min:1,max:6,step:1,defaultValue:1}]},{key:`drill-down`,title:`Drill-down`,collapsible:!0,defaultCollapsed:!0,visibleWhen:e=>_e(e.type),fields:[{key:`drillDownEnabled`,label:`Enable drill-down`,type:`switch`,defaultValue:!1,helpText:`When enabled, clicking a cell / segment opens a filtered list of underlying records.`},{key:`drillDownTarget`,label:`Open in`,type:`select`,options:ve,defaultValue:`drawer`,visibleWhen:e=>!!e.drillDownEnabled}]},{key:`behavior`,title:`Behavior`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`actionUrl`,label:`Click-through URL`,type:`input`,placeholder:`https://...`}]},{key:`appearance`,title:`Appearance`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`colorVariant`,label:`Color variant`,type:`select`,options:ae,defaultValue:`default`}]}]}}function Se(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`){let t=e;return t.defaultValue||t.key||``}return String(e)}function Ce(e){let t=e.type,n={...e};return he(t)||delete n.categoryField,ge(t)?(n.aggregate??`count`)===`count`&&delete n.valueField:(delete n.valueField,delete n.aggregate),me(t)||(delete n.xAxisLabel,delete n.yAxisLabel),t===`pivot`?(delete n.aggregate,delete n.categoryField):(delete n.rowField,delete n.columnField,delete n.aggregation,delete n.rowSortBy,delete n.rowSortOrder,delete n.columnSortBy,delete n.columnSortOrder,delete n.showRowLabels,delete n.showRowTotals,delete n.showColumnLabels,delete n.showColumnTotals,delete n.format),t!==`table`&&(delete n.searchable,delete n.pagination),_e(t)||(delete n.drillDownEnabled,delete n.drillDownTarget),n}function we({open:e,onClose:t,config:n,onSave:a,onFieldChange:o,headerExtra:s,availableObjects:c,availableFields:u}){let{draft:d,isDirty:f,updateField:p,discard:m}=(0,r.useConfigDraft)(i.useMemo(()=>({...n,title:typeof n.title==`object`?Se(n.title):n.title,description:typeof n.description==`object`?Se(n.description):n.description}),[n]),{onUpdate:o});return(0,l.jsx)(r.ConfigPanelRenderer,{open:e,onClose:t,schema:i.useMemo(()=>xe(c,u,d.type),[c,u,d.type]),draft:d,isDirty:f,onFieldChange:p,onSave:()=>a(Ce(d)),onDiscard:m,headerExtra:s})}function Te({schema:e,config:t,onConfigSave:n,onWidgetSave:o,onRefresh:s,recordCount:c,defaultConfigOpen:u=!1,className:d}){let[f,p]=(0,i.useState)(u),[m,h]=(0,i.useState)(null),[g,_]=(0,i.useState)(e),[v,y]=(0,i.useState)(0);(0,i.useEffect)(()=>{_(e),y(e=>e+1)},[e]);let b=i.useMemo(()=>{if(!m||!g.widgets)return null;let e=g.widgets.find(e=>(e.id||e.title)===m);if(!e)return null;let t=e.options||{};return{...t,id:e.id??``,title:e.title??``,description:e.description??``,type:e.type??``,object:e.object??``,categoryField:e.categoryField??t.categoryField??``,valueField:e.valueField??t.valueField??``,aggregate:e.aggregate??t.aggregate??``,colorVariant:e.colorVariant??t.colorVariant??`default`,actionUrl:e.actionUrl??t.actionUrl??``,drillDownEnabled:t.drillDown?.enabled??!!(e.object&&(e.type===`pivot`||e.type===`metric`||e.type===`bar`||e.type===`horizontal-bar`||e.type===`line`||e.type===`area`||e.type===`pie`||e.type===`donut`||e.type===`funnel`)),drillDownTarget:t.drillDown?.target??`drawer`,layoutW:e.layout?.w??1,layoutH:e.layout?.h??1}},[m,v]),x=(0,i.useCallback)(e=>{h(e),p(!0)},[]),S=(0,i.useCallback)(()=>{h(null)},[]),C=(0,i.useCallback)((e,t)=>{m&&_(n=>n.widgets?{...n,widgets:n.widgets.map(n=>{if((n.id||n.title)!==m)return n;if(e===`layoutW`)return{...n,layout:{...n.layout||{},w:t}};if(e===`layoutH`)return{...n,layout:{...n.layout||{},h:t}};if(e===`drillDownEnabled`||e===`drillDownTarget`){let r=n.options?.drillDown??{},i=e===`drillDownEnabled`?{...r,enabled:!!t}:{...r,target:t};return{...n,options:{...n.options||{},drillDown:i}}}return{...n,[e]:t}})}:n)},[m]),w=(0,i.useCallback)(e=>{if(m&&o){let{drillDownEnabled:t,drillDownTarget:n,...r}=e,i={...r};(t||n)&&(i.options={...r.options||{},drillDown:{...r.options?.drillDown||{},...t===void 0?{}:{enabled:!!t},...n===void 0?{}:{target:n}}}),o(m,i)}h(null),y(e=>e+1)},[m,o]),T=(0,i.useCallback)(()=>{p(e=>!e),h(null)},[]);return(0,l.jsxs)(`div`,{className:(0,r.cn)(`flex h-full w-full`,d),"data-testid":`dashboard-with-config`,children:[(0,l.jsxs)(`div`,{className:`flex-1 min-w-0 overflow-auto relative`,children:[(0,l.jsx)(`div`,{className:`absolute top-2 right-2 z-10`,children:(0,l.jsxs)(r.Button,{size:`sm`,variant:f?`default`:`outline`,onClick:T,"data-testid":`dashboard-config-toggle`,children:[(0,l.jsx)(a.Settings,{className:`h-3.5 w-3.5 mr-1`}),`Settings`]})}),(0,l.jsx)(O,{schema:g,onRefresh:s,recordCount:c,designMode:f,selectedWidgetId:m,onWidgetClick:x})]}),f&&(0,l.jsx)(`div`,{className:`relative shrink-0`,children:m&&b?(0,l.jsx)(we,{open:!0,onClose:S,config:b,onSave:w,onFieldChange:C}):(0,l.jsx)(Q,{open:!0,onClose:()=>p(!1),config:t,onSave:n})})]})}t.ComponentRegistry.register(`dashboard`,O,{namespace:`view`,label:`Dashboard`,category:`Complex`,icon:`layout-dashboard`,inputs:[{name:`columns`,type:`number`,label:`Columns`,defaultValue:3},{name:`gap`,type:`number`,label:`Gap`,defaultValue:4},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{columns:3,widgets:[]}}),t.ComponentRegistry.register(`metric`,z,{namespace:`plugin-dashboard`,label:`Metric Widget`,category:`Dashboard`,inputs:[{name:`label`,type:`string`,label:`Label`},{name:`value`,type:`string`,label:`Value`}]}),t.ComponentRegistry.register(`metric-card`,V,{namespace:`plugin-dashboard`,label:`Metric Card`,category:`Dashboard`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`value`,type:`string`,label:`Value`,required:!0},{name:`icon`,type:`string`,label:`Icon (Lucide name)`},{name:`trend`,type:`enum`,label:`Trend`,enum:[{label:`Up`,value:`up`},{label:`Down`,value:`down`},{label:`Neutral`,value:`neutral`}]},{name:`trendValue`,type:`string`,label:`Trend Value (e.g., +12%)`},{name:`description`,type:`string`,label:`Description`}],defaultProps:{title:`Metric`,value:`0`}}),t.ComponentRegistry.register(`object-metric`,H,{namespace:`plugin-dashboard`,label:`Object Metric`,category:`Dashboard`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`label`,type:`string`,label:`Label`},{name:`aggregate`,type:`object`,label:`Aggregate`,description:`Aggregation config: { field, function, groupBy }`},{name:`icon`,type:`string`,label:`Icon (Lucide name)`}],defaultProps:{label:`Metric`}}),t.ComponentRegistry.register(`pivot`,q,{namespace:`plugin-dashboard`,label:`Pivot Table`,category:`Dashboard`,icon:`table-2`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`rowField`,type:`string`,label:`Row Field`,required:!0},{name:`columnField`,type:`string`,label:`Column Field`,required:!0},{name:`valueField`,type:`string`,label:`Value Field`,required:!0},{name:`aggregation`,type:`enum`,label:`Aggregation`,enum:[{label:`Sum`,value:`sum`},{label:`Count`,value:`count`},{label:`Average`,value:`avg`},{label:`Min`,value:`min`},{label:`Max`,value:`max`}]},{name:`showRowTotals`,type:`boolean`,label:`Show Row Totals`},{name:`showColumnTotals`,type:`boolean`,label:`Show Column Totals`},{name:`format`,type:`string`,label:`Number Format`}],defaultProps:{rowField:``,columnField:``,valueField:``,aggregation:`sum`,data:[]}}),t.ComponentRegistry.register(`object-pivot`,Z,{namespace:`plugin-dashboard`,label:`Object Pivot Table`,category:`Dashboard`,icon:`table-2`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`title`,type:`string`,label:`Title`},{name:`rowField`,type:`string`,label:`Row Field`,required:!0},{name:`columnField`,type:`string`,label:`Column Field`,required:!0},{name:`valueField`,type:`string`,label:`Value Field`,required:!0},{name:`aggregation`,type:`enum`,label:`Aggregation`,enum:[{label:`Sum`,value:`sum`},{label:`Count`,value:`count`},{label:`Average`,value:`avg`},{label:`Min`,value:`min`},{label:`Max`,value:`max`}]},{name:`showRowTotals`,type:`boolean`,label:`Show Row Totals`},{name:`showColumnTotals`,type:`boolean`,label:`Show Column Totals`},{name:`filter`,type:`array`,label:`Filter`},{name:`format`,type:`string`,label:`Number Format`}],defaultProps:{rowField:``,columnField:``,valueField:``,aggregation:`sum`}}),t.ComponentRegistry.register(`dashboard-grid`,N,{namespace:`plugin-dashboard`,label:`Dashboard Grid (Editable)`,category:`Complex`,icon:`layout-grid`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{title:`Dashboard`,widgets:[]}}),t.ComponentRegistry.register(`object-data-table`,Y,{namespace:`plugin-dashboard`,label:`Object Data Table`,category:`Dashboard`,icon:`table`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`columns`,type:`array`,label:`Columns`},{name:`filter`,type:`array`,label:`Filter`},{name:`searchable`,type:`boolean`,label:`Searchable`},{name:`pagination`,type:`boolean`,label:`Pagination`}],defaultProps:{searchable:!1,pagination:!1}});var Ee={DashboardRenderer:O,DashboardGridLayout:N,MetricWidget:z,MetricCard:V,ObjectMetricWidget:H,PivotTable:q,ObjectPivotTable:Z,ObjectDataTable:Y,DashboardConfigPanel:Q,WidgetConfigPanel:we,DashboardWithConfig:Te};e.DashboardConfigPanel=Q,e.DashboardGridLayout=N,e.DashboardRenderer=O,e.DashboardWithConfig=Te,e.DrillDownDrawer=X,e.MetricCard=V,e.MetricWidget=z,e.ObjectDataTable=Y,e.ObjectMetricWidget=H,e.ObjectPivotTable=Z,e.PivotTable=q,e.WidgetConfigPanel=we,e.dashboardComponents=Ee});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@object-ui/core`),require(`@object-ui/react`),require(`@object-ui/components`),require(`react`),require(`lucide-react`),require(`@dnd-kit/core`),require(`@dnd-kit/sortable`),require(`@dnd-kit/utilities`),require(`react/jsx-runtime`),require(`react-grid-layout`),require(`react-grid-layout/css/styles.css`),require(`@object-ui/i18n`),require(`@object-ui/fields`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`@object-ui/react`,`@object-ui/components`,`react`,`lucide-react`,`@dnd-kit/core`,`@dnd-kit/sortable`,`@dnd-kit/utilities`,`react/jsx-runtime`,`react-grid-layout`,`react-grid-layout/css/styles.css`,`@object-ui/i18n`,`@object-ui/fields`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginDashboard={},e.ObjectUICore,e.ObjectUIReact,e.ObjectUIComponents,e.React,e.lucide_react,e._dnd_kit_core,e._dnd_kit_sortable,e._dnd_kit_utilities,e.react_jsx_runtime,e.ReactGridLayout,e.react_grid_layout_css_styles_css,e.ObjectUII18n,e.ObjectUIFields))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f,p){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var m=Object.create,h=Object.defineProperty,g=Object.getOwnPropertyDescriptor,_=Object.getOwnPropertyNames,v=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty,b=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=_(t),a=0,o=i.length,s;a<o;a++)s=i[a],!y.call(e,s)&&s!==n&&h(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=g(t,s))||r.enumerable});return e};i=((e,t,n)=>(n=e==null?{}:m(v(e)),b(t||!e||!e.__esModule?h(n,`default`,{value:e,enumerable:!0}):n,e)))(i,1);function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&e.provider===`object`}function S({id:e,disabled:t,gridSpan:n,className:i,children:a}){let{attributes:o,listeners:u,setNodeRef:d,transform:f,transition:p,isDragging:m,isOver:h}=(0,s.useSortable)({id:e,disabled:t});return(0,l.jsx)(`div`,{ref:d,style:{transform:c.CSS.Transform.toString(f),transition:p,opacity:m?.4:1,...n?{gridColumn:`span ${n.w}`,gridRow:`span ${n.h}`}:{}},className:(0,r.cn)(`h-full w-full`,i,!t&&`cursor-grab active:cursor-grabbing`,h&&!m&&`ring-2 ring-primary ring-offset-2 rounded-lg`),"data-sortable-widget-id":e,...o,...u,children:a})}function C(e){return e?(0,r.getLazyIcon)(e):null}function w(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var T=[`hsl(var(--chart-1))`,`hsl(var(--chart-2))`,`hsl(var(--chart-3))`,`hsl(var(--chart-4))`,`hsl(var(--chart-5))`],E=new Set([`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`funnel`]);function D(e){return E.has(e)?{enabled:!0}:void 0}var O=(0,i.forwardRef)(({schema:e,className:t,dataSource:c,onRefresh:u,recordCount:d,userActions:f,designMode:p,selectedWidgetId:m,onWidgetClick:h,onWidgetsReorder:g,modalHandler:_,scriptHandlers:v,hideHeaderText:y,...b},E)=>{let O=(()=>{if(e.columns!=null)return e.columns;let t=e.widgets??[],n=0;for(let e of t){let t=(e.layout?.x??0)+(e.layout?.w??0);t>n&&(n=t),(e.layout?.w??0)>n&&(n=e.layout.w)}return n>4?12:4})(),k=O,A=e.gap||4,[j,M]=(0,i.useState)(!1),[N,P]=(0,i.useState)(!1),F=(0,i.useRef)(null),{executeAction:ee,engine:I}=(0,n.useActionEngine)({actions:(0,i.useMemo)(()=>(e.header?.actions??[]).map(e=>({name:e.actionUrl||e.label,type:e.actionType||`url`,target:e.actionUrl,label:e.label})),[e.header?.actions])}),{dashboardLabel:L,dashboardDescription:R,dashboardActionLabel:z,widgetTitle:B,widgetDescription:V,fieldLabel:H}=(0,n.useObjectLabel)(),U=e.name,te=(0,i.useCallback)(e=>U?z(U,e.actionUrl||e.label,e.label):e.label,[U,z]),W=(0,i.useCallback)(e=>{let t=w(e.title);return!U||!e.id||t===void 0?t:B(U,e.id,t)},[U,B]),ne=(0,i.useCallback)(e=>{let t=w(e.description);return!U||!e.id?t:V(U,e.id,t)},[U,V]);(0,i.useEffect)(()=>{let e=I.getRunner();if(_&&e.setModalHandler(_),v)for(let[t,n]of Object.entries(v))e.registerScript(t,n)},[I,_,v]),(0,i.useEffect)(()=>{let e=()=>P(window.innerWidth<768);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let G=(0,i.useCallback)(()=>{u&&(M(!0),u(),setTimeout(()=>M(!1),600))},[u]);(0,i.useEffect)(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!u))return F.current=setInterval(G,e.refreshInterval*1e3),()=>{F.current&&clearInterval(F.current)}},[e.refreshInterval,u,G]);let K=(0,i.useCallback)((e,t)=>{!p||!h||!t||(e.stopPropagation(),h(t))},[p,h]),re=(0,i.useCallback)((t,n,r)=>{if(!p||!h)return;let i=e.widgets||[];if(t.key===`Enter`||t.key===` `)t.preventDefault(),h(n??null);else if(t.key===`ArrowRight`||t.key===`ArrowDown`){t.preventDefault();let e=r+1<i.length?i[r+1]:null;e?.id&&h(e.id)}else if(t.key===`ArrowLeft`||t.key===`ArrowUp`){t.preventDefault();let e=r-1>=0?i[r-1]:null;e?.id&&h(e.id)}else t.key===`Escape`&&(t.preventDefault(),h(null))},[p,h,e.widgets]),q=(0,i.useCallback)(e=>{!p||!h||e.target===e.currentTarget&&h(null)},[p,h]),J=!!(p&&g),Y=(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:5}})),X=(0,i.useCallback)(t=>{if(!J)return;let{active:n,over:r}=t;if(!r||n.id===r.id)return;let i=e.widgets??[],a=i.findIndex(e=>e.id===n.id),o=i.findIndex(e=>e.id===r.id);a<0||o<0||g?.((0,s.arrayMove)(i,a,o))},[J,e.widgets,g]),Z=(e,t,a)=>{let o=e.layout?{...e.layout,w:Math.min(e.layout.w,k)}:void 0,s=(()=>{if(e.component)return e.component;let t=e.type,n=e.options||{};if(t===`metric`&&e.object){let t=n.data,r=x(t)&&t.aggregate?{field:e.valueField||t.aggregate.field,function:e.aggregate||t.aggregate.function,groupBy:e.categoryField??t.aggregate.groupBy??`_all`}:e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`_all`}:void 0;return{type:`object-metric`,objectName:e.object||(x(t)?t.object:void 0),aggregate:r,filter:(x(t)?t.filter:void 0)||e.filter,label:n.label||W(e)||``,fallbackValue:n.value,trend:n.trend,icon:n.icon,description:n.description,colorVariant:e.colorVariant,format:n.format,currency:n.currency,prefix:n.prefix,suffix:n.suffix,drillDown:n.drillDown??{enabled:!0},title:n.label||W(e)||``}}if((t===`gauge`||t===`solid-gauge`)&&e.object){let t=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`_all`}:void 0;return{type:`object-metric`,objectName:e.object,aggregate:t,filter:e.filter,label:n.label||W(e)||``,fallbackValue:n.fallbackValue??n.value,icon:n.icon,description:n.description,colorVariant:e.colorVariant,format:n.format,currency:n.currency,prefix:n.prefix,suffix:n.suffix,invert:n.invert}}let r={}[t]||t;if(r===`bar`||r===`horizontal-bar`||r===`line`||r===`area`||r===`pie`||r===`donut`||r===`scatter`||r===`funnel`){let t=e.data||n.data,i=e.categoryField||n.xField||`name`,a=e.valueField||n.yField||`value`;if(x(t)){let o=t.aggregate,s=o?{field:e.valueField||o.field,function:e.aggregate||o.function,groupBy:e.categoryField||o.groupBy}:void 0,c=s?.field||a,l=e.object||t.object;return{type:`object-chart`,chartType:r,objectName:l,aggregate:s,xAxisKey:i,series:[{dataKey:c,label:l?H(l,c,c):c}],colors:T,drillDown:n.drillDown??D(r),className:`h-[200px] sm:h-[250px] md:h-[300px]`}}if(!t&&e.object){let t=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`name`}:void 0,a=e.valueField||`value`;return{type:`object-chart`,chartType:r,objectName:e.object,aggregate:t,xAxisKey:i,series:[{dataKey:a,label:H(e.object,a,a)}],colors:T,drillDown:n.drillDown??D(r),className:`h-[200px] sm:h-[250px] md:h-[300px]`}}return{type:`chart`,chartType:r,data:Array.isArray(t)?t:t?.items||[],xAxisKey:i,series:[{dataKey:a,label:e.object?H(e.object,a,a):a}],colors:T,className:`h-[200px] sm:h-[250px] md:h-[300px]`}}if(t===`table`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`object-data-table`,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter,searchable:e.searchable??!1,pagination:e.pagination??!1,className:`border-0`}}return!t&&e.object?{type:`object-data-table`,...n,objectName:e.object,filter:e.filter,searchable:e.searchable??!1,pagination:e.pagination??!1,className:`border-0`}:{type:`data-table`,...n,data:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}if(t===`pivot`){let t=e.data||n.data,r=e,i={rowField:r.rowField??n.rowField,columnField:r.columnField??n.columnField,valueField:r.valueField??n.valueField,aggregation:r.aggregation??n.aggregation??`sum`,showRowTotals:r.showRowTotals??n.showRowTotals,showColumnTotals:r.showColumnTotals??n.showColumnTotals,format:r.format??n.format},a=(x(t)||!t&&e.object)&&n.drillDown===void 0?{...n,drillDown:{enabled:!0}}:n;if(x(t)){let{data:n,...r}=a;return{type:`object-pivot`,...r,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter}}return!t&&e.object?{type:`object-pivot`,...a,...i,objectName:e.object,filter:e.filter}:{type:`pivot`,...n,...i,data:Array.isArray(t)?t:t?.items||[]}}if(t===`list`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`object-data-table`,...i,objectName:e.object||t.object,dataProvider:t,filter:t.filter||e.filter,searchable:!1,pagination:!1,className:`border-0`}}return!t&&e.object?{type:`object-data-table`,...n,objectName:e.object,filter:e.filter,searchable:!1,pagination:!1,className:`border-0`}:{type:`data-table`,...n,data:Array.isArray(t)?t:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}return t===`custom`?{type:`text`,value:"Custom widget — set `component` to a UIComponent schema.",variant:`caption`,align:`center`,className:`flex h-full w-full items-center justify-center rounded border border-dashed bg-muted/20 p-4 text-muted-foreground`}:{...e,...n}})(),u=e.type===`metric`,d=W(e),f=ne(e),h=e.id||d||`widget-${t}`,g=p&&m===e.id,_=p?{"data-testid":`dashboard-preview-widget-${e.id}`,"data-widget-id":e.id,role:`button`,tabIndex:0,"aria-selected":g,"aria-label":`Widget: ${d||`Widget ${t+1}`}`,onClick:t=>K(t,e.id),onKeyDown:n=>re(n,e.id,t)}:{},v=p?(0,r.cn)(`cursor-pointer rounded-lg transition-all outline-none`,`focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,g?`ring-2 ring-primary shadow-md bg-primary/5 dark:bg-primary/10`:`hover:ring-2 hover:ring-primary/40 hover:shadow-sm`):void 0,y=!N&&o&&!J?{gridColumn:`span ${o.w}`,gridRow:`span ${o.h}`}:void 0,b=u?(0,l.jsxs)(`div`,{className:(0,r.cn)(`h-full w-full`,p&&`relative`,v),style:y,..._,children:[(0,l.jsx)(n.SchemaRenderer,{schema:s,className:(0,r.cn)(`h-full w-full`,p&&`pointer-events-none`),dataSource:c}),p&&(0,l.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]}):(0,l.jsxs)(r.Card,{className:(0,r.cn)(`overflow-hidden border-border/50 shadow-sm transition-all hover:shadow-md`,`bg-card/50 backdrop-blur-sm`,a&&`w-full`,p&&`relative`,v),style:y,..._,children:[d&&(0,l.jsxs)(r.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 px-3 sm:px-6`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm sm:text-base font-medium tracking-tight truncate`,title:d,children:d}),f&&(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:f})]}),(0,l.jsx)(r.CardContent,{className:`p-0`,children:(0,l.jsx)(`div`,{className:(0,r.cn)(`h-full w-full`,`p-3 sm:p-4 md:p-6`,p&&`pointer-events-none`),children:(0,l.jsx)(n.SchemaRenderer,{schema:s,dataSource:c})})}),p&&(0,l.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]});return J&&e.id?(0,l.jsx)(S,{id:e.id,gridSpan:!N&&o?{w:o.w,h:o.h}:void 0,children:b},h):(0,l.jsx)(i.Fragment,{children:b},h)},Q=e.header&&(0,l.jsxs)(`div`,{className:`col-span-full mb-4`,children:[!y&&e.header.showTitle!==!1&&e.title&&(0,l.jsx)(`h2`,{className:`text-lg font-semibold tracking-tight`,children:U?L({name:U,label:w(e.title)}):w(e.title)}),!y&&e.header.showDescription!==!1&&e.description&&(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:U?R({name:U,description:w(e.description)}):w(e.description)}),e.header.actions&&e.header.actions.length>0&&(0,l.jsx)(`div`,{className:`flex gap-2 mt-3`,children:e.header.actions.map((e,t)=>{let n=C(e.icon);return(0,l.jsxs)(r.Button,{variant:`outline`,size:`sm`,onClick:async()=>{let{actionType:t,actionUrl:n,label:r}=e;if(!t||!n){console.warn(`[DashboardRenderer] Header action missing actionType/actionUrl:`,e);return}if(t===`url`){/^https?:\/\//.test(n)||n.startsWith(`//`)?window.location.assign(n):(window.history.pushState({},``,n),window.dispatchEvent(new PopStateEvent(`popstate`)));return}if(t===`modal`||t===`script`){let e=await ee(n||r);e?.success||console.warn(`[DashboardRenderer] action failed`,e?.error);return}console.warn(`[DashboardRenderer] Unknown header actionType="${t}" for "${r}"`)},children:[n&&(0,l.jsx)(n,{className:`w-4 h-4 mr-1.5`}),te(e)]},t)})})]}),ie=d!==void 0&&(0,l.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[d.toLocaleString(),` records`]}),ae=f?JSON.stringify(f):void 0,oe=u&&(0,l.jsxs)(`div`,{className:(0,r.cn)(`flex items-center justify-end gap-3 mb-2`,!N&&`col-span-full`),children:[ie,(0,l.jsxs)(r.Button,{variant:`outline`,size:`sm`,onClick:G,disabled:j,"aria-label":`Refresh dashboard`,children:[(0,l.jsx)(a.RefreshCw,{className:(0,r.cn)(`h-4 w-4 mr-2`,j&&`animate-spin`)}),j?`Refreshing…`:`Refresh All`]})]}),se=(0,i.useMemo)(()=>(e.widgets??[]).map(e=>e.id).filter(e=>!!e),[e.widgets]),ce=(0,i.useMemo)(()=>(e.widgets??[]).filter(e=>e.type===`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]),le=(0,i.useMemo)(()=>(e.widgets??[]).filter(e=>e.type!==`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]);if(N){let n=e.widgets?.filter(e=>e.type===`metric`)||[],i=e.widgets?.filter(e=>e.type!==`metric`)||[],a=(0,l.jsxs)(`div`,{ref:E,className:(0,r.cn)(`flex flex-col gap-4 px-4`,t),"data-user-actions":ae,onClick:q,...b,children:[Q,oe,n.length>0&&(0,l.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,onClick:q,children:(0,l.jsx)(s.SortableContext,{items:ce,strategy:s.rectSortingStrategy,disabled:!J,children:n.map((e,t)=>Z(e,t))})}),i.length>0&&(0,l.jsx)(`div`,{className:`flex flex-col gap-4`,onClick:q,children:(0,l.jsx)(s.SortableContext,{items:le,strategy:s.verticalListSortingStrategy,disabled:!J,children:i.map((e,t)=>Z(e,t,!0))})})]});return J?(0,l.jsx)(o.DndContext,{sensors:Y,collisionDetection:o.closestCenter,onDragEnd:X,children:a}):a}let ue=e.columns!=null||O!==4,de=(0,l.jsxs)(`div`,{ref:E,className:(0,r.cn)(`grid auto-rows-min`,!ue&&`grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`,t),style:{...ue&&{gridTemplateColumns:`repeat(${k}, minmax(0, 1fr))`},gap:`${A*.25}rem`},"data-user-actions":ae,onClick:q,...b,children:[Q,oe,(0,l.jsx)(s.SortableContext,{items:se,strategy:s.rectSortingStrategy,disabled:!J,children:e.widgets?.map((e,t)=>Z(e,t))})]});return J?(0,l.jsx)(o.DndContext,{sensors:Y,collisionDetection:o.closestCenter,onDragEnd:X,children:de}):de});function k({editMode:e}){let t=(0,n.useDnd)();return i.useEffect(()=>{if(e)return t.startDrag({id:`dashboard-layout`,type:`dashboard-widget`,data:{}}),()=>{t.endDrag()};t.endDrag(`dashboard`)},[e,t]),null}var A=[`hsl(var(--chart-1))`,`hsl(var(--chart-2))`,`hsl(var(--chart-3))`,`hsl(var(--chart-4))`,`hsl(var(--chart-5))`];function j(e,t){if(!e.widgets?.length)return e;let n=new Map(t.map(e=>[e.i,e])),r=e.widgets.map((e,t)=>{let r=e.id||`widget-${t}`,i=n.get(r);return i?{...e,layout:{x:i.x,y:i.y,w:i.w,h:i.h}}:e});return{...e,widgets:r}}function M(e){return{lg:e.widgets?.map((e,t)=>({i:e.id||`widget-${t}`,x:e.layout?.x??t%4*3,y:e.layout?.y??Math.floor(t/4)*4,w:e.layout?.w??3,h:e.layout?.h??4}))||[]}}var N=({schema:e,className:t,onLayoutChange:o,onSchemaChange:s,onRefresh:c})=>{let{width:d,containerRef:f,mounted:p}=(0,u.useContainerWidth)(),[m,h]=i.useState(!1),[g,_]=i.useState(!1),v=(0,n.useHasDndProvider)(),y=i.useRef(null),b=i.useCallback(()=>{c&&(_(!0),c(),setTimeout(()=>_(!1),600))},[c]);i.useEffect(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!c))return y.current=setInterval(b,e.refreshInterval*1e3),()=>{y.current&&clearInterval(y.current)}},[e.refreshInterval,c,b]);let[S,C]=i.useState(()=>M(e)),w=i.useMemo(()=>JSON.stringify(e.widgets?.map((e,t)=>({i:e.id||`widget-${t}`,x:e.layout?.x,y:e.layout?.y,w:e.layout?.w,h:e.layout?.h}))??[]),[e.widgets]);i.useEffect(()=>{C(M(e))},[w]);let T=i.useCallback((e,t)=>{C(t),o?.(e)},[o]),E=i.useCallback(()=>{s?s(j(e,S.lg)):process.env.NODE_ENV!==`production`&&console.warn("[DashboardGridLayout] Layout edits are in-memory only. Wire `onSchemaChange` to persist via your data adapter."),h(!1)},[s,e,S]),D=i.useCallback(()=>{C(M(e))},[e]),O=i.useCallback(e=>{if(e.component)return e.component;let t=e.type,n=e.options||{};if(t===`bar`||t===`horizontal-bar`||t===`line`||t===`area`||t===`pie`||t===`donut`||t===`scatter`||t===`funnel`){let r=e.data||n.data,i=e.categoryField||n.xField||`name`,a=e.valueField||n.yField||`value`;if(x(r)){let n=r.aggregate,o=n?{field:e.valueField||n.field,function:e.aggregate||n.function,groupBy:e.categoryField||n.groupBy}:void 0,s=o?.field||a;return{type:`object-chart`,chartType:t,objectName:e.object||r.object,aggregate:o,xAxisKey:i,series:[{dataKey:s}],colors:A,className:`h-full`}}if(!r&&e.object){let n=e.aggregate?{field:e.valueField||`value`,function:e.aggregate,groupBy:e.categoryField||`name`}:void 0;return{type:`object-chart`,chartType:t,objectName:e.object,aggregate:n,xAxisKey:i,series:[{dataKey:e.valueField||`value`}],colors:A,className:`h-full`}}return{type:`chart`,chartType:t,data:Array.isArray(r)?r:r?.items||[],xAxisKey:i,series:[{dataKey:a}],colors:A,className:`h-full`}}if(t===`table`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`data-table`,...i,objectName:e.object||t.object,dataProvider:t,data:[],searchable:!1,pagination:!1,className:`border-0`}}return!t&&e.object?{type:`data-table`,...n,objectName:e.object,data:[],searchable:!1,pagination:!1,className:`border-0`}:{type:`data-table`,...n,data:t?.items||[],searchable:!1,pagination:!1,className:`border-0`}}if(t===`pivot`){let t=e.data||n.data;if(x(t)){let{data:r,...i}=n;return{type:`pivot`,...i,objectName:e.object||t.object,dataProvider:t,data:[]}}return{type:`pivot`,...n,data:Array.isArray(t)?t:t?.items||[]}}return{...e,...n}},[]);return(0,l.jsxs)(`div`,{ref:f,className:(0,r.cn)(`w-full`,t),"data-testid":`grid-layout`,children:[v&&(0,l.jsx)(k,{editMode:m}),(0,l.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,l.jsx)(`h2`,{className:`text-2xl font-bold`,children:e.title||`Dashboard`}),(0,l.jsx)(`div`,{className:`flex gap-2`,children:m?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(r.Button,{onClick:E,size:`sm`,variant:`default`,children:[(0,l.jsx)(a.Save,{className:`h-4 w-4 mr-2`}),`Save Layout`]}),(0,l.jsxs)(r.Button,{onClick:D,size:`sm`,variant:`outline`,children:[(0,l.jsx)(a.X,{className:`h-4 w-4 mr-2`}),`Reset`]}),(0,l.jsx)(r.Button,{onClick:()=>h(!1),size:`sm`,variant:`ghost`,children:`Cancel`})]}):(0,l.jsxs)(l.Fragment,{children:[c&&(0,l.jsxs)(r.Button,{onClick:b,size:`sm`,variant:`outline`,disabled:g,"aria-label":`Refresh dashboard`,children:[(0,l.jsx)(a.RefreshCw,{className:(0,r.cn)(`h-4 w-4 mr-2`,g&&`animate-spin`)}),g?`Refreshing…`:`Refresh All`]}),(0,l.jsxs)(r.Button,{onClick:()=>h(!0),size:`sm`,variant:`outline`,children:[(0,l.jsx)(a.Edit,{className:`h-4 w-4 mr-2`}),`Edit Layout`]})]})})]}),p&&(0,l.jsx)(u.ResponsiveGridLayout,{className:`layout`,width:d,layouts:S,breakpoints:{lg:1200,md:996,sm:768,xs:480,xxs:0},cols:{lg:12,md:10,sm:6,xs:4,xxs:2},rowHeight:60,dragConfig:{enabled:m,handle:`.drag-handle`},resizeConfig:{enabled:m},onLayoutChange:T,children:e.widgets?.map((e,t)=>{let i=e.id||`widget-${t}`,o=O(e);return(0,l.jsx)(`div`,{className:`h-full`,children:e.type===`metric`?(0,l.jsxs)(`div`,{className:`h-full w-full relative`,children:[m&&(0,l.jsx)(`div`,{className:`drag-handle absolute top-2 right-2 z-10 cursor-move p-1 bg-background/80 rounded border border-border`,children:(0,l.jsx)(a.GripVertical,{className:`h-4 w-4`})}),(0,l.jsx)(n.SchemaRenderer,{schema:o,className:`h-full w-full`})]}):(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full overflow-hidden border-border/50 shadow-sm transition-all`,`bg-card/50 backdrop-blur-sm`,m&&`ring-2 ring-primary/20`),children:[e.title&&(0,l.jsxs)(r.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 flex flex-row items-center justify-between`,children:[(0,l.jsx)(r.CardTitle,{className:`text-base font-medium tracking-tight truncate`,title:e.title,children:e.title}),m&&(0,l.jsx)(`div`,{className:`drag-handle cursor-move p-1 hover:bg-muted/40 rounded`,children:(0,l.jsx)(a.GripVertical,{className:`h-4 w-4`})})]}),(0,l.jsx)(r.CardContent,{className:`p-0 h-full`,children:(0,l.jsx)(`div`,{className:(0,r.cn)(`h-full w-full overflow-auto p-4`),children:(0,l.jsx)(n.SchemaRenderer,{schema:o})})})]})},i)})})]})},P=(0,f.createSafeTranslation)({"dashboard.trend.vsLastQuarter":`vs last quarter`,"dashboard.trend.vsLastMonth":`vs last month`,"dashboard.trend.vsLastWeek":`vs last week`,"dashboard.trend.vsLastYear":`vs last year`,"dashboard.trend.vsYesterday":`vs yesterday`,"dashboard.trend.vsPreviousPeriod":`vs previous period`},`dashboard.trend.vsLastQuarter`);function F(e){switch(e.trim().toLowerCase().replace(/\s+/g,` `)){case`vs last quarter`:case`vs previous quarter`:return`dashboard.trend.vsLastQuarter`;case`vs last month`:case`vs previous month`:return`dashboard.trend.vsLastMonth`;case`vs last week`:case`vs previous week`:return`dashboard.trend.vsLastWeek`;case`vs last year`:case`vs previous year`:return`dashboard.trend.vsLastYear`;case`vs yesterday`:return`dashboard.trend.vsYesterday`;case`vs previous period`:case`vs prior period`:return`dashboard.trend.vsPreviousPeriod`;default:return}}function ee(e,t,n){if(e==null)return``;if(typeof e==`string`){let r=Number(e);return!isFinite(r)||e.trim()===``?e:ee(r,t,n)}if(!isFinite(e))return String(e);let r={$:`USD`,"¥":`JPY`,"€":`EUR`,"£":`GBP`},i=(t||``).trim(),a=!!n||i.length>0&&r[i[0]]!==void 0,o=i.endsWith(`%`),s=i.match(/0\.(0+)/),c=s?s[1].length:0;if(a){let t=n||r[i[0]]||`USD`;try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,minimumFractionDigits:c,maximumFractionDigits:c}).format(e)}catch{return`${t} ${e.toFixed(c)}`}}return o?`${(e>1?e:e*100).toFixed(c)}%`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:c,maximumFractionDigits:c}).format(e)}function I(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var L={default:`bg-muted text-muted-foreground`,blue:`bg-blue-500/10 text-blue-600 dark:text-blue-400`,teal:`bg-teal-500/10 text-teal-600 dark:text-teal-400`,orange:`bg-orange-500/10 text-orange-600 dark:text-orange-400`,purple:`bg-purple-500/10 text-purple-600 dark:text-purple-400`,success:`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`,warning:`bg-amber-500/10 text-amber-600 dark:text-amber-400`,danger:`bg-rose-500/10 text-rose-600 dark:text-rose-400`},R=({label:e,value:t,trend:n,icon:o,className:s,description:c,loading:u,error:d,colorVariant:f=`default`,format:p,currency:m,prefix:h,suffix:g,onClick:_,...v})=>{let y=L[f]||L.default,{t:b}=P(),x=(0,i.useMemo)(()=>{let e=I(c)||I(n?.label);if(!e)return e;let t=F(e);return t?b(t):e},[c,n?.label,b]),S=(0,i.useMemo)(()=>{let e=typeof t==`number`||typeof t==`string`&&t.trim()!==``&&isFinite(Number(t))?ee(t,p,m):t??``,n=String(e);return`${h&&n.startsWith(h)?``:h??``}${n}${g&&n.endsWith(g)?``:g??``}`},[t,p,m,h,g]),C=(0,i.useMemo)(()=>{if(typeof o==`string`){let e=(0,r.getLazyIcon)(o);return e?(0,l.jsx)(e,{className:`h-4 w-4`}):null}return o},[o]);return(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full overflow-hidden`,_&&`cursor-pointer transition-colors hover:bg-accent/40 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none`,s),onClick:_,role:_?`button`:void 0,tabIndex:_?0:void 0,onKeyDown:_?e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),_())}:void 0,...v,children:[(0,l.jsxs)(r.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm font-medium truncate`,children:I(e)}),C&&(0,l.jsx)(`div`,{className:(0,r.cn)(`flex h-8 w-8 items-center justify-center rounded-md shrink-0`,y),children:C})]}),(0,l.jsx)(r.CardContent,{children:u?(0,l.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-loading`,children:[(0,l.jsx)(a.Loader2,{className:`h-4 w-4 animate-spin`}),(0,l.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-error`,role:`alert`,children:[(0,l.jsx)(a.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,l.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`div`,{className:`text-2xl font-bold truncate`,children:S}),(n||c)&&(0,l.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 min-w-0`,children:[n&&(0,l.jsxs)(`span`,{className:(0,r.cn)(`flex items-center shrink-0 font-medium`,n.direction===`up`&&`text-emerald-600 dark:text-emerald-400`,n.direction===`down`&&`text-rose-600 dark:text-rose-400`,n.direction===`neutral`&&`text-muted-foreground`),children:[n.direction===`up`&&(0,l.jsx)(a.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),n.direction===`down`&&(0,l.jsx)(a.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),n.direction===`neutral`&&(0,l.jsx)(a.MinusIcon,{className:`h-3 w-3 mr-1`}),n.value,`%`]}),(0,l.jsx)(`span`,{className:`truncate min-w-0`,children:x})]})]})})]})};function z(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var B=({title:e,value:t,icon:n,trend:i,trendValue:o,description:s,className:c,loading:u,error:d,...f})=>{let p=n?(0,r.getLazyIcon)(n):null;return(0,l.jsxs)(r.Card,{className:(0,r.cn)(`h-full`,c),...f,children:[(0,l.jsxs)(r.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,l.jsx)(r.CardTitle,{className:`text-sm font-medium`,children:z(e)}),p&&(0,l.jsx)(p,{className:`h-4 w-4 text-muted-foreground`})]}),(0,l.jsx)(r.CardContent,{children:u?(0,l.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-card-loading`,children:[(0,l.jsx)(a.Loader2,{className:`h-4 w-4 animate-spin`}),(0,l.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-card-error`,role:`alert`,children:[(0,l.jsx)(a.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,l.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),(i||o||s)&&(0,l.jsxs)(`p`,{className:`text-xs text-muted-foreground flex items-center mt-1`,children:[i&&o&&(0,l.jsxs)(`span`,{className:(0,r.cn)(`flex items-center mr-2`,i===`up`&&`text-green-500`,i===`down`&&`text-red-500`,i===`neutral`&&`text-yellow-500`),children:[i===`up`&&(0,l.jsx)(a.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),i===`down`&&(0,l.jsx)(a.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),i===`neutral`&&(0,l.jsx)(a.MinusIcon,{className:`h-3 w-3 mr-1`}),o]}),z(s)]})]})})]})},V=({objectName:e,aggregate:a,filter:o,label:s,fallbackValue:c,trend:u,icon:d,className:f,description:p,dataSource:m,colorVariant:h,format:g,currency:_,prefix:v,suffix:y,invert:b,drillDown:x,title:S})=>{let C=(0,i.useContext)(n.SchemaRendererContext),w=m||C?.dataSource,[T,E]=(0,i.useState)(!1),[D,O]=(0,i.useState)(null),[k,A]=(0,i.useState)(!1),[j,M]=(0,i.useState)(null),[N,P]=(0,i.useState)(null);(0,i.useEffect)(()=>{let t=!0;if(!(!w||!e||typeof w.getObjectSchema!=`function`))return w.getObjectSchema(e).then(e=>{t&&P(e)}).catch(()=>{}),()=>{t=!1}},[w,e]);let F=(0,i.useMemo)(()=>{let e=a?.field;if(!e||!N?.fields)return null;let t=N.fields;return Array.isArray(t)?t.find(t=>t?.name===e)||null:t[e]||null},[N,a?.field]),ee=(0,i.useMemo)(()=>{if(g)return g;if(F){if(F.type===`currency`){let e=F.precision??F.scale??0;return e>0?`0,0.${`0`.repeat(e)}`:`0,0`}if(F.type===`percent`)return`0,0%`;if(F.type===`number`||F.type===`integer`)return`0,0`}},[g,F]),I=(0,i.useMemo)(()=>{if(_)return _;if(F?.type===`currency`)return F.defaultCurrency||F.currency||void 0},[_,F]),L=(0,i.useMemo)(()=>a?JSON.stringify(a):``,[a]),z=(0,i.useMemo)(()=>(0,t.resolveDateMacros)(o),[o]),B=(0,i.useCallback)(async(t,n)=>{if(!(!t||!e)){n.current&&(A(!0),M(null));try{let r;if(a&&typeof t.aggregate==`function`){let n=await t.aggregate(e,{field:a.field,function:a.function,groupBy:a.groupBy||`_all`,filter:z}),i=Array.isArray(n)?n:[];r=i.length===0?0:a.function===`count`?i.reduce((e,t)=>e+(Number(t[a.field])||Number(t.count)||0),0):i[0][a.field]??0}else if(typeof t.find==`function`){let n=await t.find(e,{$filter:z});r=(Array.isArray(n)?n:n?.data||n?.records||[]).length}else return;n.current&&O(r)}catch(e){console.error(`[ObjectMetricWidget] Fetch error:`,e),n.current&&M(e instanceof Error?e.message:`Failed to load metric`)}finally{n.current&&A(!1)}}},[e,L,(0,i.useMemo)(()=>z?JSON.stringify(z):``,[z])]);(0,i.useEffect)(()=>{let t={current:!0};return w&&e?B(w,t):(O(null),M(null)),()=>{t.current=!1}},[w,e,B]);let V=D===null?w?`—`:c??`—`:D;b&&typeof V==`number`&&isFinite(V)&&V>=0&&V<=1&&(V=1-V);let H=(0,t.isDrillEnabled)(x)&&!!e&&!!w,U=(0,i.useMemo)(()=>{let e=typeof s==`string`?s:s?.defaultValue||``;return(0,t.resolveDrillTitle)(x,{},(typeof S==`string`?S:S?.defaultValue||``)||e||`Details`)},[x,s,S]),te=(0,i.useMemo)(()=>{if(!H)return null;let t=x?.target??`drawer`,i=x?.report,a=i&&typeof i==`object`&&(Array.isArray(i.columns)||`objectName`in i),o;if(a){let e=i.filter,t=e?z?{$and:[e,z]}:e:z;o=(0,l.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,l.jsx)(n.SchemaRenderer,{schema:{type:`spec-report`,...i,filter:t}})})}else o=(0,l.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,l.jsx)(n.SchemaRenderer,{schema:{type:`object-data-table`,objectName:e,filter:z,pageSize:25,drillDown:{enabled:!1}}})});return t===`modal`?(0,l.jsx)(r.Dialog,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,l.jsxs)(r.DialogContent,{className:`max-w-5xl`,children:[(0,l.jsx)(r.DialogHeader,{children:(0,l.jsx)(r.DialogTitle,{children:U})}),o]})}):(0,l.jsx)(r.Sheet,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,l.jsxs)(r.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-5xl flex flex-col`,children:[(0,l.jsx)(r.SheetHeader,{children:(0,l.jsx)(r.SheetTitle,{children:U})}),(0,l.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:o})]})})},[H,x,e,z,U]);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(R,{label:s,value:V,trend:u,icon:d,className:f,description:p,loading:k,error:j,colorVariant:h,format:ee,currency:I,prefix:v,suffix:y,onClick:H?()=>E(!0):void 0}),T&&te]})};function H(){try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.total`);return!t||t===`dashboard.total`?`Total`:t}catch{return`Total`}}function U(){try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);return!t||t===`dashboard.noDataAvailable`?`No data available`:t}catch{return`No data available`}}function te(e,t){if(!t)return String(e);let n=``,r=``,i=!1,a,o=t,s=o.match(/^([^0-9.,#]*)/);if(s&&s[1]){let e=s[1];n=e.replace(`,`,``),e.includes(`,`)&&(i=!0),o=o.slice(s[1].length)}o.includes(`,`)&&(i=!0,o=o.replace(/,/g,``));let c=o.match(/\.(\d+)f?/);c&&(a=Number(c[1]),o=o.slice(c[0].length)),r=o.replace(/[0-9#.f]/g,``);let l=a===void 0?String(e):e.toFixed(a);if(i){let[e,t]=l.split(`.`),i=e.replace(/\B(?=(\d{3})+(?!\d))/g,`,`);return n+(t===void 0?i:`${i}.${t}`)+r}return n+l+r}var W=`—`;function ne(e,t){return e===``?W:t?.[e]??e}function G(e,t){if(e.length===0)return 0;switch(t){case`sum`:return e.reduce((e,t)=>e+t,0);case`count`:return e.length;case`avg`:return e.reduce((e,t)=>e+t,0)/e.length;case`min`:return Math.min(...e);case`max`:return Math.max(...e);default:return e.reduce((e,t)=>e+t,0)}}var K=({schema:e,className:n,rowLabels:a,columnLabels:o,rowFieldLabel:s,onDrillDown:c})=>{let{title:u,rowField:d,columnField:f,valueField:p,aggregation:m=`sum`,data:h=[],showRowTotals:g=!1,showColumnTotals:_=!1,format:v,columnColors:y,drillDown:b}=e,x=H(),S=U(),C=(0,t.isDrillEnabled)(b)&&typeof c==`function`,w=e=>{C&&c({...e,rowLabel:e.rowKey===void 0?e.rowLabel:a?.[e.rowKey]??e.rowKey,colLabel:e.colKey===void 0?e.colLabel:o?.[e.colKey]??e.colKey})},T=e=>t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e())},E=C?`cursor-pointer hover:bg-accent/40 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]`:``,D=Array.isArray(h)?h:[],{rowKeys:O,colKeys:k,matrix:A,rowTotals:j,colTotals:M,grandTotal:N}=(0,i.useMemo)(()=>{let e=new Map,t=new Map,n={};for(let r of D){let i=String(r[d]??``),a=String(r[f]??``),o=Number(r[p])||0;e.set(i,!0),t.set(a,!0),n[i]||(n[i]={}),n[i][a]||(n[i][a]=[]),n[i][a].push(o)}let r=Array.from(e.keys()),i=Array.from(t.keys()),a={},o={},s={};for(let e of r){a[e]={};let t=[];for(let r of i){let i=n[e]?.[r]??[],o=G(i,m);a[e][r]=o,t.push(...i),!s[r]&&s[r]}o[e]=G(t,m)}for(let e of i){let t=[];for(let i of r){let r=n[i]?.[e]??[];t.push(...r)}s[e]=G(t,m)}let c=[];for(let e of D)c.push(Number(e[p])||0);return{rowKeys:r,colKeys:i,matrix:a,rowTotals:o,colTotals:s,grandTotal:G(c,m)}},[D,d,f,p,m]),P=e=>te(e,v);return D.length===0?(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,n),children:[u&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:u}),(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,"data-testid":`pivot-empty-state`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`}),(0,l.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:S})]})]}):(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,n),children:[u&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:u}),(0,l.jsxs)(`table`,{className:`w-full text-sm border-collapse table-auto`,role:`table`,children:[(0,l.jsx)(`thead`,{children:(0,l.jsxs)(`tr`,{className:`border-b border-border`,children:[(0,l.jsx)(`th`,{className:`text-left p-2 font-medium text-muted-foreground whitespace-nowrap`,children:s||d}),k.map(e=>{let t=()=>w({scope:`column`,colKey:e});return(0,l.jsx)(`th`,{className:(0,r.cn)(`text-right p-2 font-medium whitespace-nowrap`,e===``&&`italic text-muted-foreground/70`,y?.[e]??`text-muted-foreground`,E),title:e===``?`${f}: (empty)`:`${f}: ${e}`,role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?t:void 0,onKeyDown:C?T(t):void 0,"aria-label":C?`Drill into ${f}: ${e||`(empty)`}`:void 0,children:ne(e,o)},e)}),g&&(0,l.jsx)(`th`,{className:`text-right p-2 font-semibold text-muted-foreground bg-muted/20 whitespace-nowrap`,children:x})]})}),(0,l.jsx)(`tbody`,{children:O.map(e=>(0,l.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-muted/30`,children:[(0,l.jsx)(`td`,{className:(0,r.cn)(`p-2 font-medium whitespace-nowrap`,e===``&&`italic text-muted-foreground/70`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`row`,rowKey:e}):void 0,onKeyDown:C?T(()=>w({scope:`row`,rowKey:e})):void 0,"aria-label":C?`Drill into ${d}: ${e||`(empty)`}`:void 0,children:ne(e,a)}),k.map(t=>{let n=A[e]?.[t]??0,i=()=>w({scope:`cell`,rowKey:e,colKey:t,value:n});return(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums`,y?.[t],E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?i:void 0,onKeyDown:C?T(i):void 0,"aria-label":C?`Drill into ${d}=${e||`(empty)`}, ${f}=${t||`(empty)`}`:void 0,children:P(n)},t)}),g&&(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 font-semibold tabular-nums bg-muted/20`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`row`,rowKey:e,value:j[e]??0}):void 0,onKeyDown:C?T(()=>w({scope:`row`,rowKey:e,value:j[e]??0})):void 0,children:P(j[e]??0)})]},e))}),_&&(0,l.jsx)(`tfoot`,{children:(0,l.jsxs)(`tr`,{className:`border-t-2 border-border font-semibold bg-muted/40`,children:[(0,l.jsx)(`td`,{className:`p-2`,children:x}),k.map(e=>(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`column`,colKey:e,value:M[e]??0}):void 0,onKeyDown:C?T(()=>w({scope:`column`,colKey:e,value:M[e]??0})):void 0,children:P(M[e]??0)},e)),g&&(0,l.jsx)(`td`,{className:(0,r.cn)(`text-right p-2 tabular-nums font-bold`,E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?()=>w({scope:`total`,value:N}):void 0,onKeyDown:C?T(()=>w({scope:`total`,value:N})):void 0,children:P(N)})]})})]})]})};function re(e){return e.map(e=>typeof e==`string`?{header:e.replace(/_/g,` `).replace(/([A-Z])/g,` $1`).trim().replace(/\b\w/g,e=>e.toUpperCase()),accessorKey:e}:e)}function q(e,t){if(!t?.fields)return[];let n={};if(Array.isArray(t.fields))for(let e of t.fields)e?.name&&(n[e.name]=e);else for(let[e,r]of Object.entries(t.fields))n[e]={name:e,...r};let r=e=>e===`lookup`||e===`reference`||e===`master_detail`||e===`user`||e===`owner`,i=Array.isArray(e.columns)?e.columns:[],a=new Set;if(i.length>0){let e=i.map(e=>typeof e==`string`?e:e.accessorKey||e.name).filter(Boolean);for(let t of e){let e=n[t];e&&r(e.type)&&a.add(t)}}else for(let[e,t]of Object.entries(n))r(t?.type)&&a.add(e);return Array.from(a)}var J=({schema:e,dataSource:a,className:o})=>{let s=(0,i.useContext)(n.SchemaRendererContext),c=a||s?.dataSource,u=(0,n.useDataScope)(e.bind),{fieldLabel:d,fieldOptionLabel:m}=(0,f.useSafeFieldLabel)(),h=`No data available`,g=`No data source available for`;try{let{t:e}=(0,f.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);t&&t!==`dashboard.noDataAvailable`&&(h=t);let n=e(`dashboard.noDataSourceFor`);n&&n!==`dashboard.noDataSourceFor`&&(g=n)}catch{}let[_,v]=(0,i.useState)([]),[y,b]=(0,i.useState)(null),[x,S]=(0,i.useState)(!1),[C,w]=(0,i.useState)(null);(0,i.useEffect)(()=>{let n=!0;return e.objectName&&!u&&(!e.data||e.data.length===0)&&(async()=>{if(!(!c||!e.objectName)){n&&(S(!0),w(null));try{let r;if(typeof c.find==`function`){let n=q(e,y),i={$filter:(0,t.resolveDateMacros)(e.filter)};n.length&&(i.$expand=n),r=(0,t.extractRecords)(await c.find(e.objectName,i))}else return;n&&v(r)}catch(e){console.error(`[ObjectDataTable] Fetch error:`,e),n&&w(e instanceof Error?e.message:`Failed to load data`)}finally{n&&S(!1)}}})(),()=>{n=!1}},[e.objectName,c,u,e.data,e.filter,y]),(0,i.useEffect)(()=>{let t=!0;if(!(!c||!e.objectName||typeof c.getObjectSchema!=`function`))return c.getObjectSchema(e.objectName).then(e=>{t&&b(e)}).catch(()=>{}),()=>{t=!1}},[e.objectName,c]);let T=u||e.data||_,E=Array.isArray(T)?T:[],D=(0,i.useMemo)(()=>{let t=e.objectName,n={};if(y?.fields){let e=y.fields;if(Array.isArray(e))for(let t of e)t?.name&&(n[t.name]=t);else for(let[t,r]of Object.entries(e))n[t]={name:t,...r}}let r=e=>{let n=e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g,` $1`);return t?d(t,e,n):n},i=e=>{let r=n[e.accessorKey],i=e.referenceTo??r?.referenceTo??(typeof r?.reference==`string`?r.reference:r?.reference?.to)??r?.target,a=e.options??r?.options;t&&a&&(r?.type===`select`||r?.type===`picklist`||r?.type===`dropdown`||r?.type===`status`)&&(a=a.map(n=>{if(n==null)return n;let r=typeof n==`object`?n.value:n,i=typeof n==`object`&&n.label||String(r);return{value:r,label:m(t,e.accessorKey,String(r),i),color:typeof n==`object`?n.color:void 0}}));let o={name:e.accessorKey,label:e.header,type:e.type??r?.type,options:a,referenceTo:i,format:e.format??r?.format,currency:e.currency??r?.currency??r?.defaultCurrency,decimals:e.decimals??r?.decimals??r?.precision??r?.scale},s=new Set([`currency`,`money`,`number`,`integer`,`decimal`,`float`,`percent`,`percentage`]),c=e.align??(s.has(o.type)||typeof o.format==`string`&&/^[\$¥€£]|%$|0/.test(o.format)?`right`:void 0);if(typeof e.cell==`function`)return{...e,...o,align:c};let u=e=>{if(e==null||e===``)return``;let t=o.format;if(typeof t==`string`&&/^\$|¥|€|£/.test(t)&&typeof e==`number`){let n={$:`USD`,"¥":`JPY`,"€":`EUR`,"£":`GBP`}[t[0]];return(0,p.formatCurrency)(e,o.currency||n)}if(typeof t==`string`&&/%/.test(t)&&typeof e==`number`){let n=(t.match(/0\.(0+)%/)||[,``])[1].length;return(0,p.formatPercent)((e>1?e/100:e)*100,n)}return typeof t==`string`&&/[YMDHms]/.test(t)?(0,p.formatDate)(e,t):(0,l.jsx)((0,p.getCellRenderer)((0,p.resolveCellRendererType)(o)),{value:e,field:o})};return{...e,...o,align:c,cell:u}};if(e.columns&&e.columns.length>0){let n=re(e.columns);return(t?n.map(e=>({...e,header:d(t,e.accessorKey,e.header)})):n).map(i)}if(E.length===0)return[];let a=new Set([`id`,`organization_id`,`tenant_id`,`created_at`,`updated_at`,`created_by`,`updated_by`,`deleted_at`,`deleted_by`,`version`,`_id`,`__typename`]),o=(e,t)=>t&&(t.isSystem===!0||t.system===!0)?!0:a.has(e);return(Object.keys(n).length>0?Object.keys(n).filter(e=>!o(e,n[e])):Object.keys(E[0]).filter(e=>!e.startsWith(`_`)&&!o(e))).map(e=>i({header:r(e),accessorKey:e}))},[e.columns,e.objectName,E,y,d,m]);return x&&E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-loading`,children:(0,l.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-1/4`})]}),[1,2,3,4].map(e=>(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-1/4`})]},e))]})}):C?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-error`,children:(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`table-error-message`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-60`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,l.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,l.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:C})]})}):!c&&e.objectName&&E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),children:(0,l.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,l.jsxs)(`p`,{className:`text-xs`,children:[g,` “`,e.objectName,`”`]})})}):E.length===0?(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`table-empty-state`,children:(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,l.jsx)(`line`,{x1:`3`,y1:`9`,x2:`21`,y2:`9`}),(0,l.jsx)(`line`,{x1:`9`,y1:`21`,x2:`9`,y2:`9`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:h})]})}):(0,l.jsx)(n.SchemaRenderer,{schema:{...e,type:`data-table`,data:E,columns:D},className:o})},Y=({open:e,onClose:t,title:i,target:a=`drawer`,objectName:o,filter:s,dataSource:c,columns:u,maxRows:d,className:f,report:p})=>{let m=p&&typeof p==`object`&&(Array.isArray(p.columns)||`objectName`in p),h=(0,l.jsx)(`div`,{className:(0,r.cn)(`overflow-auto`,f),"data-testid":`drill-down-body`,children:m?(()=>{let e=p.filter,t=e?s?{$and:[e,s]}:e:s;return(0,l.jsx)(n.SchemaRenderer,{schema:{...p,type:`spec-report`,report:{...p,filter:t},filter:t}})})():(0,l.jsx)(J,{schema:{type:`object-data-table`,objectName:o,filter:s,columns:u?.map(e=>({accessorKey:e,header:e})),pagination:!0,searchable:!1,pageSize:d},dataSource:c})});return a===`dialog`?(0,l.jsx)(r.Dialog,{open:e,onOpenChange:e=>!e&&t(),children:(0,l.jsxs)(r.DialogContent,{className:`max-w-5xl`,children:[(0,l.jsx)(r.DialogHeader,{children:(0,l.jsx)(r.DialogTitle,{children:i})}),h]})}):(0,l.jsx)(r.Sheet,{open:e,onOpenChange:e=>!e&&t(),children:(0,l.jsxs)(r.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col`,children:[(0,l.jsx)(r.SheetHeader,{children:(0,l.jsx)(r.SheetTitle,{children:i})}),(0,l.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:h})]})})},X=({schema:e,dataSource:a,className:o})=>{let s=(0,i.useContext)(n.SchemaRendererContext),c=a||s?.dataSource,u=(0,n.useDataScope)(e.bind),[d,p]=(0,i.useState)([]),[m,h]=(0,i.useState)(!1),[g,_]=(0,i.useState)(null),[v,y]=(0,i.useState)({}),[b,x]=(0,i.useState)({}),[S,C]=(0,i.useState)(null),{fieldLabel:w,fieldOptionLabel:T}=(0,f.useSafeFieldLabel)(),E=(0,i.useRef)(w),D=(0,i.useRef)(T);(0,i.useEffect)(()=>{E.current=w,D.current=T},[w,T]),(0,i.useEffect)(()=>{if(!c||!e.objectName)return;let t=c.getObjectSchema;if(typeof t!=`function`)return;let n=!0;return Promise.resolve(t.call(c,e.objectName)).then(t=>{if(!n||!t?.fields)return;let r=e.objectName,i={},a={};for(let[e,n]of Object.entries(t.fields)){let t=n?.label?String(n.label):e;a[e]=E.current(r,e,t);let o=n?.options;if(Array.isArray(o)&&o.length>0){let t={};for(let n of o)if(n&&n.value!==void 0&&n.label!==void 0){let i=String(n.value),a=String(n.label);t[i]=D.current(r,e,i,a)}Object.keys(t).length>0&&(i[e]=t)}}y(i),x(a)}).catch(()=>{}),()=>{n=!1}},[c,e.objectName]),(0,i.useEffect)(()=>{let n=!0;return e.objectName&&!u&&(!e.data||e.data.length===0)&&(async()=>{if(!(!c||!e.objectName)){n&&(h(!0),_(null));try{let r;if(typeof c.find==`function`)r=(0,t.extractRecords)(await c.find(e.objectName,{$filter:(0,t.resolveDateMacros)(e.filter)}));else return;n&&p(r)}catch(e){console.error(`[ObjectPivotTable] Fetch error:`,e),n&&_(e instanceof Error?e.message:`Failed to load data`)}finally{n&&h(!1)}}})(),()=>{n=!1}},[e.objectName,c,u,e.data,e.filter]);let O=u||e.data||d,k=Array.isArray(O)?O:[];if(m&&k.length===0)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`pivot-loading`,children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-6 w-24`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-6 w-20`})]}),[1,2,3].map(e=>(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(r.Skeleton,{className:`h-5 w-24`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`}),(0,l.jsx)(r.Skeleton,{className:`h-5 w-20`})]},e))]})]});if(g)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),"data-testid":`pivot-error`,children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`pivot-error-message`,children:[(0,l.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 mb-2 opacity-60`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,l.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,l.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,l.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,l.jsx)(`p`,{className:`text-xs`,children:g})]})]});if(!c&&e.objectName&&k.length===0)return(0,l.jsxs)(`div`,{className:(0,r.cn)(`overflow-auto`,o),children:[e.title&&(0,l.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,l.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,l.jsxs)(`p`,{className:`text-xs`,children:[`No data source available for “`,e.objectName,`”`]})})]});let A={...e,data:k},j=e.rowField?v[e.rowField]:void 0,M=e.columnField?v[e.columnField]:void 0,N=e.rowField?b[e.rowField]:void 0,P=e.drillDown,F=(0,t.isDrillEnabled)(P)?e=>C(e):void 0;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(K,{schema:A,className:o,rowLabels:j,columnLabels:M,rowFieldLabel:N,onDrillDown:F}),(()=>{if(!S||!e.objectName)return null;let n=(0,t.computeDrillFilter)(P,S,{rowField:e.rowField,columnField:e.columnField}),r={...e.filter||{},...n};return(0,l.jsx)(Y,{open:!0,onClose:()=>C(null),title:(0,t.resolveDrillTitle)(P,S,e.title||`Details`),target:P?.target??`drawer`,objectName:e.objectName,filter:r,dataSource:c,columns:P?.columns,maxRows:P?.maxRows,report:P?.report})})()]})},Z={breadcrumb:[`Dashboard`,`Configuration`],sections:[{key:`layout`,title:`Layout`,collapsible:!0,fields:[{key:`columns`,label:`Columns`,type:`slider`,defaultValue:3,min:1,max:12,step:1},{key:`gap`,label:`Gap`,type:`slider`,defaultValue:4,min:0,max:16,step:1},{key:`rowHeight`,label:`Row height (px)`,type:`slider`,defaultValue:120,min:40,max:320,step:10}]},{key:`data`,title:`Data`,collapsible:!0,fields:[{key:`refreshInterval`,label:`Auto refresh`,type:`select`,defaultValue:`0`,options:[{value:`0`,label:`Off`},{value:`30`,label:`Every 30s`},{value:`60`,label:`Every 1 min`},{value:`300`,label:`Every 5 min`},{value:`900`,label:`Every 15 min`},{value:`1800`,label:`Every 30 min`},{value:`3600`,label:`Every 1 hour`}]}]},{key:`appearance`,title:`Appearance`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`title`,label:`Title`,type:`input`,placeholder:`Dashboard title`},{key:`description`,label:`Description`,type:`textarea`,placeholder:`Short summary shown under the title`},{key:`showDescription`,label:`Show description`,type:`switch`,defaultValue:!0},{key:`theme`,label:`Theme`,type:`select`,defaultValue:`auto`,options:[{value:`light`,label:`Light`},{value:`dark`,label:`Dark`},{value:`auto`,label:`Auto`}]}]}]};function Q({open:e,onClose:t,config:n,onSave:i,onFieldChange:a}){let{draft:o,isDirty:s,updateField:c,discard:u}=(0,r.useConfigDraft)(n,{onUpdate:a});return(0,l.jsx)(r.ConfigPanelRenderer,{open:e,onClose:t,schema:Z,draft:o,isDirty:s,onFieldChange:c,onSave:()=>i(o),onDiscard:u})}var ie=[{value:`metric`,label:`Metric`},{value:`bar`,label:`Bar Chart`},{value:`horizontal-bar`,label:`Horizontal Bar`},{value:`line`,label:`Line Chart`},{value:`pie`,label:`Pie Chart`},{value:`donut`,label:`Donut Chart`},{value:`area`,label:`Area Chart`},{value:`scatter`,label:`Scatter Plot`},{value:`funnel`,label:`Funnel`},{value:`table`,label:`Table`},{value:`pivot`,label:`Pivot Table`}],ae=[{value:`default`,label:`Default`},{value:`blue`,label:`Blue`},{value:`teal`,label:`Teal`},{value:`orange`,label:`Orange`},{value:`purple`,label:`Purple`},{value:`success`,label:`Success`},{value:`warning`,label:`Warning`},{value:`danger`,label:`Danger`}],oe=[{value:`count`,label:`Count`},{value:`sum`,label:`Sum`},{value:`avg`,label:`Average`},{value:`min`,label:`Min`},{value:`max`,label:`Max`}],se=[`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`scatter`,`funnel`],ce=[`bar`,`horizontal-bar`,`line`,`area`,`scatter`],le=[`pie`,`donut`,`funnel`],ue=[`metric`,...se],de=[...se],fe=[`pivot`,`metric`,`bar`,`horizontal-bar`,`line`,`area`,`pie`,`donut`,`funnel`];function pe(e){return!!e&&se.includes(e)}function me(e){return!!e&&ce.includes(e)}function he(e){return!!e&&de.includes(e)}function ge(e){return!!e&&ue.includes(e)}function _e(e){return!!e&&fe.includes(e)}var ve=[{value:`drawer`,label:`Side drawer`},{value:`dialog`,label:`Center dialog`}],ye=[{value:`group`,label:`Group`},{value:`value`,label:`Value`}],be=[{value:`asc`,label:`↑`},{value:`desc`,label:`↓`}];function $(e,t,n,i){return{key:e,label:t,type:`custom`,render:(a,o,s)=>(0,l.jsx)(r.ConfigRow,{label:t,children:(0,l.jsx)(`div`,{"data-testid":`config-field-${e}`,children:(0,l.jsx)(r.Combobox,{options:i??[],value:a??``,onValueChange:o,placeholder:n,searchPlaceholder:`Search fields…`,emptyText:`No fields found.`,className:`h-7 w-32 text-xs`,disabled:!s.object})})})}}function xe(e,t,n){let i=e&&e.length>0,a=i?{key:`object`,label:`Data source`,type:`custom`,render:(t,n)=>(0,l.jsx)(r.ConfigRow,{label:`Data source`,children:(0,l.jsx)(`div`,{"data-testid":`config-field-object`,children:(0,l.jsx)(r.Combobox,{options:e,value:t??``,onValueChange:n,placeholder:`Select object…`,searchPlaceholder:`Search objects…`,emptyText:`No objects found.`,className:`h-7 w-32 text-xs`})})})}:{key:`object`,label:`Data source`,type:`input`,placeholder:`Object name`},o=i?{...$(`categoryField`,`Category field`,`Select field…`,t),helpText:`Group records by this field (one bar/slice/segment per value).`,visibleWhen:e=>he(e.type)}:{key:`categoryField`,label:`Category field`,type:`input`,placeholder:`e.g. status`,helpText:`Group records by this field (one bar/slice/segment per value).`,visibleWhen:e=>he(e.type)},s=i?{...$(`valueField`,`Value field`,`Select field…`,t),helpText:`Field to aggregate (sum / average / min / max).`,visibleWhen:e=>ge(e.type)&&(e.aggregate??`count`)!==`count`}:{key:`valueField`,label:`Value field`,type:`input`,placeholder:`e.g. amount`,helpText:`Field to aggregate (sum / average / min / max).`,visibleWhen:e=>ge(e.type)&&(e.aggregate??`count`)!==`count`},c=i?$(`rowField`,`Field`,`Select row field…`,t):{key:`rowField`,label:`Field`,type:`input`,placeholder:`e.g. owner`},u=i?$(`columnField`,`Field`,`Select column field…`,t):{key:`columnField`,label:`Field`,type:`input`,placeholder:`e.g. stage`},d=i?$(`valueField`,`Field`,`Select value field…`,t):{key:`valueField`,label:`Field`,type:`input`,placeholder:`e.g. amount`};return{breadcrumb:[`Dashboard`,{pivot:`Pivot table`,table:`Table`}[n??``]??(pe(n)?`Chart`:`Widget`)],sections:[{key:`general`,title:`General`,fields:[{key:`title`,label:`Title`,type:`input`,placeholder:`Widget title`},{key:`description`,label:`Description`,type:`input`,placeholder:`Widget description`},{key:`type`,label:`Widget type`,type:`select`,options:ie,defaultValue:`metric`}]},{key:`data`,title:`Data Binding`,collapsible:!0,visibleWhen:e=>e.type!==`pivot`,fields:[a,o,s,{key:`aggregate`,label:`Aggregation`,type:`select`,options:oe,defaultValue:`count`,helpText:`Count ignores Value field; Sum / Avg / Min / Max require it.`,visibleWhen:e=>ge(e.type)}]},{key:`pivot-data`,title:`Data`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[a]},{key:`pivot-rows`,title:`Rows`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[c,{key:`rowSortBy`,label:`Sort by`,type:`icon-group`,options:ye,defaultValue:`group`},{key:`rowSortOrder`,label:`Sort order`,type:`icon-group`,options:be,defaultValue:`asc`},{key:`showRowLabels`,label:`Show label`,type:`switch`,defaultValue:!0},{key:`showRowTotals`,label:`Show totals`,type:`switch`,defaultValue:!1}]},{key:`pivot-columns`,title:`Columns`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[u,{key:`columnSortBy`,label:`Sort by`,type:`icon-group`,options:ye,defaultValue:`group`},{key:`columnSortOrder`,label:`Sort order`,type:`icon-group`,options:be,defaultValue:`asc`},{key:`showColumnLabels`,label:`Show label`,type:`switch`,defaultValue:!0},{key:`showColumnTotals`,label:`Show totals`,type:`switch`,defaultValue:!1}]},{key:`pivot-values`,title:`Values`,collapsible:!0,visibleWhen:e=>e.type===`pivot`,fields:[d,{key:`aggregation`,label:`Aggregation`,type:`select`,options:oe,defaultValue:`sum`},{key:`format`,label:`Number format`,type:`input`,placeholder:`e.g. $,.2f`}]},{key:`chart-axis`,title:`Axis & Series`,collapsible:!0,visibleWhen:e=>me(e.type),fields:[{key:`xAxisLabel`,label:`X-axis label`,type:`input`,placeholder:`e.g. Month`},{key:`yAxisLabel`,label:`Y-axis label`,type:`input`,placeholder:`e.g. Revenue`},{key:`showLegend`,label:`Show legend`,type:`switch`,defaultValue:!0}]},{key:`chart-legend`,title:`Display`,collapsible:!0,visibleWhen:e=>!!e.type&&le.includes(e.type),fields:[{key:`showLegend`,label:`Show legend`,type:`switch`,defaultValue:!0}]},{key:`table-options`,title:`Table options`,collapsible:!0,visibleWhen:e=>e.type===`table`,fields:[{key:`searchable`,label:`Searchable`,type:`switch`,defaultValue:!1},{key:`pagination`,label:`Pagination`,type:`switch`,defaultValue:!1}]},{key:`layout`,title:`Layout`,collapsible:!0,fields:[{key:`layoutW`,label:`Width (columns)`,type:`slider`,min:1,max:12,step:1,defaultValue:1},{key:`layoutH`,label:`Height (rows)`,type:`slider`,min:1,max:6,step:1,defaultValue:1}]},{key:`drill-down`,title:`Drill-down`,collapsible:!0,defaultCollapsed:!0,visibleWhen:e=>_e(e.type),fields:[{key:`drillDownEnabled`,label:`Enable drill-down`,type:`switch`,defaultValue:!1,helpText:`When enabled, clicking a cell / segment opens a filtered list of underlying records.`},{key:`drillDownTarget`,label:`Open in`,type:`select`,options:ve,defaultValue:`drawer`,visibleWhen:e=>!!e.drillDownEnabled}]},{key:`behavior`,title:`Behavior`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`actionUrl`,label:`Click-through URL`,type:`input`,placeholder:`https://...`}]},{key:`appearance`,title:`Appearance`,collapsible:!0,defaultCollapsed:!0,fields:[{key:`colorVariant`,label:`Color variant`,type:`select`,options:ae,defaultValue:`default`}]}]}}function Se(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`){let t=e;return t.defaultValue||t.key||``}return String(e)}function Ce(e){let t=e.type,n={...e};return he(t)||delete n.categoryField,ge(t)?(n.aggregate??`count`)===`count`&&delete n.valueField:(delete n.valueField,delete n.aggregate),me(t)||(delete n.xAxisLabel,delete n.yAxisLabel),t===`pivot`?(delete n.aggregate,delete n.categoryField):(delete n.rowField,delete n.columnField,delete n.aggregation,delete n.rowSortBy,delete n.rowSortOrder,delete n.columnSortBy,delete n.columnSortOrder,delete n.showRowLabels,delete n.showRowTotals,delete n.showColumnLabels,delete n.showColumnTotals,delete n.format),t!==`table`&&(delete n.searchable,delete n.pagination),_e(t)||(delete n.drillDownEnabled,delete n.drillDownTarget),n}function we({open:e,onClose:t,config:n,onSave:a,onFieldChange:o,headerExtra:s,availableObjects:c,availableFields:u}){let{draft:d,isDirty:f,updateField:p,discard:m}=(0,r.useConfigDraft)(i.useMemo(()=>({...n,title:typeof n.title==`object`?Se(n.title):n.title,description:typeof n.description==`object`?Se(n.description):n.description}),[n]),{onUpdate:o});return(0,l.jsx)(r.ConfigPanelRenderer,{open:e,onClose:t,schema:i.useMemo(()=>xe(c,u,d.type),[c,u,d.type]),draft:d,isDirty:f,onFieldChange:p,onSave:()=>a(Ce(d)),onDiscard:m,headerExtra:s})}function Te({schema:e,config:t,onConfigSave:n,onWidgetSave:o,onRefresh:s,recordCount:c,defaultConfigOpen:u=!1,className:d}){let[f,p]=(0,i.useState)(u),[m,h]=(0,i.useState)(null),[g,_]=(0,i.useState)(e),[v,y]=(0,i.useState)(0);(0,i.useEffect)(()=>{_(e),y(e=>e+1)},[e]);let b=i.useMemo(()=>{if(!m||!g.widgets)return null;let e=g.widgets.find(e=>(e.id||e.title)===m);if(!e)return null;let t=e.options||{};return{...t,id:e.id??``,title:e.title??``,description:e.description??``,type:e.type??``,object:e.object??``,categoryField:e.categoryField??t.categoryField??``,valueField:e.valueField??t.valueField??``,aggregate:e.aggregate??t.aggregate??``,colorVariant:e.colorVariant??t.colorVariant??`default`,actionUrl:e.actionUrl??t.actionUrl??``,drillDownEnabled:t.drillDown?.enabled??!!(e.object&&(e.type===`pivot`||e.type===`metric`||e.type===`bar`||e.type===`horizontal-bar`||e.type===`line`||e.type===`area`||e.type===`pie`||e.type===`donut`||e.type===`funnel`)),drillDownTarget:t.drillDown?.target??`drawer`,layoutW:e.layout?.w??1,layoutH:e.layout?.h??1}},[m,v]),x=(0,i.useCallback)(e=>{h(e),p(!0)},[]),S=(0,i.useCallback)(()=>{h(null)},[]),C=(0,i.useCallback)((e,t)=>{m&&_(n=>n.widgets?{...n,widgets:n.widgets.map(n=>{if((n.id||n.title)!==m)return n;if(e===`layoutW`)return{...n,layout:{...n.layout||{},w:t}};if(e===`layoutH`)return{...n,layout:{...n.layout||{},h:t}};if(e===`drillDownEnabled`||e===`drillDownTarget`){let r=n.options?.drillDown??{},i=e===`drillDownEnabled`?{...r,enabled:!!t}:{...r,target:t};return{...n,options:{...n.options||{},drillDown:i}}}return{...n,[e]:t}})}:n)},[m]),w=(0,i.useCallback)(e=>{if(m&&o){let{drillDownEnabled:t,drillDownTarget:n,...r}=e,i={...r};(t||n)&&(i.options={...r.options||{},drillDown:{...r.options?.drillDown||{},...t===void 0?{}:{enabled:!!t},...n===void 0?{}:{target:n}}}),o(m,i)}h(null),y(e=>e+1)},[m,o]),T=(0,i.useCallback)(()=>{p(e=>!e),h(null)},[]);return(0,l.jsxs)(`div`,{className:(0,r.cn)(`flex h-full w-full`,d),"data-testid":`dashboard-with-config`,children:[(0,l.jsxs)(`div`,{className:`flex-1 min-w-0 overflow-auto relative`,children:[(0,l.jsx)(`div`,{className:`absolute top-2 right-2 z-10`,children:(0,l.jsxs)(r.Button,{size:`sm`,variant:f?`default`:`outline`,onClick:T,"data-testid":`dashboard-config-toggle`,children:[(0,l.jsx)(a.Settings,{className:`h-3.5 w-3.5 mr-1`}),`Settings`]})}),(0,l.jsx)(O,{schema:g,onRefresh:s,recordCount:c,designMode:f,selectedWidgetId:m,onWidgetClick:x})]}),f&&(0,l.jsx)(`div`,{className:`relative shrink-0`,children:m&&b?(0,l.jsx)(we,{open:!0,onClose:S,config:b,onSave:w,onFieldChange:C}):(0,l.jsx)(Q,{open:!0,onClose:()=>p(!1),config:t,onSave:n})})]})}t.ComponentRegistry.register(`dashboard`,O,{namespace:`view`,label:`Dashboard`,category:`Complex`,icon:`layout-dashboard`,inputs:[{name:`columns`,type:`number`,label:`Columns`,defaultValue:3},{name:`gap`,type:`number`,label:`Gap`,defaultValue:4},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{columns:3,widgets:[]}}),t.ComponentRegistry.register(`metric`,R,{namespace:`plugin-dashboard`,label:`Metric Widget`,category:`Dashboard`,inputs:[{name:`label`,type:`string`,label:`Label`},{name:`value`,type:`string`,label:`Value`}]}),t.ComponentRegistry.register(`metric-card`,B,{namespace:`plugin-dashboard`,label:`Metric Card`,category:`Dashboard`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`value`,type:`string`,label:`Value`,required:!0},{name:`icon`,type:`string`,label:`Icon (Lucide name)`},{name:`trend`,type:`enum`,label:`Trend`,enum:[{label:`Up`,value:`up`},{label:`Down`,value:`down`},{label:`Neutral`,value:`neutral`}]},{name:`trendValue`,type:`string`,label:`Trend Value (e.g., +12%)`},{name:`description`,type:`string`,label:`Description`}],defaultProps:{title:`Metric`,value:`0`}}),t.ComponentRegistry.register(`object-metric`,V,{namespace:`plugin-dashboard`,label:`Object Metric`,category:`Dashboard`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`label`,type:`string`,label:`Label`},{name:`aggregate`,type:`object`,label:`Aggregate`,description:`Aggregation config: { field, function, groupBy }`},{name:`icon`,type:`string`,label:`Icon (Lucide name)`}],defaultProps:{label:`Metric`}}),t.ComponentRegistry.register(`pivot`,K,{namespace:`plugin-dashboard`,label:`Pivot Table`,category:`Dashboard`,icon:`table-2`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`rowField`,type:`string`,label:`Row Field`,required:!0},{name:`columnField`,type:`string`,label:`Column Field`,required:!0},{name:`valueField`,type:`string`,label:`Value Field`,required:!0},{name:`aggregation`,type:`enum`,label:`Aggregation`,enum:[{label:`Sum`,value:`sum`},{label:`Count`,value:`count`},{label:`Average`,value:`avg`},{label:`Min`,value:`min`},{label:`Max`,value:`max`}]},{name:`showRowTotals`,type:`boolean`,label:`Show Row Totals`},{name:`showColumnTotals`,type:`boolean`,label:`Show Column Totals`},{name:`format`,type:`string`,label:`Number Format`}],defaultProps:{rowField:``,columnField:``,valueField:``,aggregation:`sum`,data:[]}}),t.ComponentRegistry.register(`object-pivot`,X,{namespace:`plugin-dashboard`,label:`Object Pivot Table`,category:`Dashboard`,icon:`table-2`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`title`,type:`string`,label:`Title`},{name:`rowField`,type:`string`,label:`Row Field`,required:!0},{name:`columnField`,type:`string`,label:`Column Field`,required:!0},{name:`valueField`,type:`string`,label:`Value Field`,required:!0},{name:`aggregation`,type:`enum`,label:`Aggregation`,enum:[{label:`Sum`,value:`sum`},{label:`Count`,value:`count`},{label:`Average`,value:`avg`},{label:`Min`,value:`min`},{label:`Max`,value:`max`}]},{name:`showRowTotals`,type:`boolean`,label:`Show Row Totals`},{name:`showColumnTotals`,type:`boolean`,label:`Show Column Totals`},{name:`filter`,type:`array`,label:`Filter`},{name:`format`,type:`string`,label:`Number Format`}],defaultProps:{rowField:``,columnField:``,valueField:``,aggregation:`sum`}}),t.ComponentRegistry.register(`dashboard-grid`,N,{namespace:`plugin-dashboard`,label:`Dashboard Grid (Editable)`,category:`Complex`,icon:`layout-grid`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{title:`Dashboard`,widgets:[]}}),t.ComponentRegistry.register(`object-data-table`,J,{namespace:`plugin-dashboard`,label:`Object Data Table`,category:`Dashboard`,icon:`table`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`columns`,type:`array`,label:`Columns`},{name:`filter`,type:`array`,label:`Filter`},{name:`searchable`,type:`boolean`,label:`Searchable`},{name:`pagination`,type:`boolean`,label:`Pagination`}],defaultProps:{searchable:!1,pagination:!1}});var Ee={DashboardRenderer:O,DashboardGridLayout:N,MetricWidget:R,MetricCard:B,ObjectMetricWidget:V,PivotTable:K,ObjectPivotTable:X,ObjectDataTable:J,DashboardConfigPanel:Q,WidgetConfigPanel:we,DashboardWithConfig:Te};e.DashboardConfigPanel=Q,e.DashboardGridLayout=N,e.DashboardRenderer=O,e.DashboardWithConfig=Te,e.DrillDownDrawer=Y,e.MetricCard=B,e.MetricWidget=R,e.ObjectDataTable=J,e.ObjectMetricWidget=V,e.ObjectPivotTable=X,e.PivotTable=K,e.WidgetConfigPanel=we,e.dashboardComponents=Ee});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardRenderer.d.ts","sourceRoot":"","sources":["../../../../src/DashboardRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyG5F,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,IAAI,CAAC;IAC9D,mGAAmG;IACnG,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;IACrH;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"DashboardRenderer.d.ts","sourceRoot":"","sources":["../../../../src/DashboardRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyG5F,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,IAAI,CAAC;IAC9D,mGAAmG;IACnG,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;IACrH;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,gIA0uB7B,CAAC"}
|
|
@@ -18,6 +18,14 @@ export interface DrillDownDrawerProps {
|
|
|
18
18
|
maxRows?: number;
|
|
19
19
|
/** Optional className on the inner container. */
|
|
20
20
|
className?: string;
|
|
21
|
+
/**
|
|
22
|
+
* M3: drill into an analytical `SpecReport` instead of the raw record list.
|
|
23
|
+
* When provided the drawer body renders a `spec-report` schema via
|
|
24
|
+
* `SchemaRenderer`. The widget's `filter` is merged in as an `$and` so the
|
|
25
|
+
* metric's scope flows into the report. The report itself can drill
|
|
26
|
+
* further (into a list / record) via its own row-click protocol.
|
|
27
|
+
*/
|
|
28
|
+
report?: Record<string, unknown>;
|
|
21
29
|
}
|
|
22
30
|
export declare const DrillDownDrawer: React.FC<DrillDownDrawerProps>;
|
|
23
31
|
//# sourceMappingURL=DrillDownDrawer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrillDownDrawer.d.ts","sourceRoot":"","sources":["../../../../src/DrillDownDrawer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DrillDownDrawer.d.ts","sourceRoot":"","sources":["../../../../src/DrillDownDrawer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwE1D,CAAC"}
|
|
@@ -63,6 +63,13 @@ export interface ObjectMetricWidgetProps {
|
|
|
63
63
|
prefix?: string;
|
|
64
64
|
/** Static suffix appended after the formatted value (e.g. `' /mo'`). */
|
|
65
65
|
suffix?: string;
|
|
66
|
+
/**
|
|
67
|
+
* When true, the displayed value is `1 - value` (clamped to `[0, 1]`).
|
|
68
|
+
* Useful for "compliance" / "uptime" style gauges that aggregate the
|
|
69
|
+
* opposite signal (e.g. `avg(is_violated)` → display "compliance rate").
|
|
70
|
+
* Only applied when the fetched value is a finite number in `[0, 1]`.
|
|
71
|
+
*/
|
|
72
|
+
invert?: boolean;
|
|
66
73
|
/**
|
|
67
74
|
* Drill-down config. When enabled, clicking the metric card opens a
|
|
68
75
|
* drawer (or modal) showing the underlying records that contributed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectMetricWidget.d.ts","sourceRoot":"","sources":["../../../../src/ObjectMetricWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAgE,MAAM,OAAO,CAAC;AAIrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIxD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,wBAAwB;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,iBAAiB;IACjB,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzD,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;KACvC,CAAC;IACF,6BAA6B;IAC7B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAChC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,+CAA+C;IAC/C,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpG,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"ObjectMetricWidget.d.ts","sourceRoot":"","sources":["../../../../src/ObjectMetricWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAgE,MAAM,OAAO,CAAC;AAIrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIxD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,wBAAwB;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,iBAAiB;IACjB,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzD,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;KACvC,CAAC;IACF,6BAA6B;IAC7B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAChC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,+CAA+C;IAC/C,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpG,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAkQhE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectPivotTable.d.ts","sourceRoot":"","sources":["../../../../src/ObjectPivotTable.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAkD,MAAM,OAAO,CAAC;AAQvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,gBAAgB,GAAG;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,GAAG,CAAC;KACd,CAAC;IACF,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"ObjectPivotTable.d.ts","sourceRoot":"","sources":["../../../../src/ObjectPivotTable.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAkD,MAAM,OAAO,CAAC;AAQvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,gBAAgB,GAAG;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,GAAG,CAAC;KACd,CAAC;IACF,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAgO5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-dashboard",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Dashboard plugin for Object UI",
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
"react": "19.2.6",
|
|
24
24
|
"react-dom": "19.2.6",
|
|
25
25
|
"tailwind-merge": "^3.6.0",
|
|
26
|
-
"@object-ui/components": "4.
|
|
27
|
-
"@object-ui/
|
|
28
|
-
"@object-ui/
|
|
29
|
-
"@object-ui/
|
|
30
|
-
"@object-ui/
|
|
31
|
-
"@object-ui/types": "4.
|
|
26
|
+
"@object-ui/components": "4.2.1",
|
|
27
|
+
"@object-ui/i18n": "4.2.1",
|
|
28
|
+
"@object-ui/fields": "4.2.1",
|
|
29
|
+
"@object-ui/react": "4.2.1",
|
|
30
|
+
"@object-ui/core": "4.2.1",
|
|
31
|
+
"@object-ui/types": "4.2.1"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": "^18.0.0 || ^19.0.0",
|