@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 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 P, useCallback as F, useContext as te, useEffect as I, useMemo as L, useRef as ne, useState as R } from "react";
6
- import { AlertCircle as z, ArrowDownIcon as re, ArrowUpIcon as B, Edit as V, GripVertical as H, Loader2 as U, MinusIcon as W, RefreshCw as ie, Save as ae, Settings as G, X as oe } from "lucide-react";
7
- import { DndContext as se, PointerSensor as ce, closestCenter as K, useSensor as le, useSensors as ue } from "@dnd-kit/core";
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 $ = P(({ 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) => {
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] = R(!1), [O, k] = R(!1), j = ne(null), { executeAction: M, engine: N } = c({ actions: L(() => (e.header?.actions ?? []).map((e) => ({
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: P, dashboardDescription: te, dashboardActionLabel: z, widgetTitle: re, widgetDescription: B, fieldLabel: V } = f(), H = e.name, U = F((e) => H ? z(H, e.actionUrl || e.label, e.label) : e.label, [H, z]), W = F((e) => {
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 !H || !e.id || t === void 0 ? t : re(H, e.id, t);
85
- }, [H, re]), ae = F((e) => {
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 !H || !e.id ? t : B(H, e.id, t);
88
- }, [H, B]);
89
- I(() => {
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
- ]), I(() => {
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 G = F(() => {
100
+ let U = P(() => {
101
101
  r && (D(!0), r(), setTimeout(() => D(!1), 600));
102
102
  }, [r]);
103
- I(() => {
104
- if (!(!e.refreshInterval || e.refreshInterval <= 0 || !r)) return j.current = setInterval(G, e.refreshInterval * 1e3), () => {
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
- G
110
+ U
111
111
  ]);
112
- let oe = F((e, t) => {
112
+ let W = P((e, t) => {
113
113
  !s || !u || !t || (e.stopPropagation(), u(t));
114
- }, [s, u]), me = F((t, n, r) => {
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 = F((e) => {
131
+ ]), q = P((e) => {
132
132
  !s || !u || e.target === e.currentTarget && u(null);
133
- }, [s, u]), J = !!(s && d), ge = ue(le(ce, { activationConstraint: { distance: 5 } })), _e = F((t) => {
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 || W(e) || "",
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 || W(e) || ""
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 || W(e) || "",
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 ? V(l, c, c) : c
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: V(e.object, a, a)
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 ? V(e.object, a, a) : a
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 = W(e), d = ae(e), f = e.id || u || `widget-${t}`, p = s && l === e.id, v = s ? {
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) => oe(t, e.id),
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: H ? P({
437
- name: H,
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: H ? te({
444
- name: H,
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" }), U(e)]
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: G,
491
+ onClick: U,
486
492
  disabled: E,
487
493
  "aria-label": "Refresh dashboard",
488
- children: [/* @__PURE__ */ Y(ie, { className: A("h-4 w-4 mr-2", E && "animate-spin") }), E ? "Refreshing…" : "Refresh All"]
494
+ children: [/* @__PURE__ */ Y(oe, { className: A("h-4 w-4 mr-2", E && "animate-spin") }), E ? "Refreshing…" : "Refresh All"]
489
495
  })]
490
- }), Ce = L(() => (e.widgets ?? []).map((e) => e.id).filter((e) => !!e), [e.widgets]), we = L(() => (e.widgets ?? []).filter((e) => e.type === "metric").map((e) => e.id).filter((e) => !!e), [e.widgets]), Te = L(() => (e.widgets ?? []).filter((e) => e.type !== "metric").map((e) => e.id).filter((e) => !!e), [e.widgets]);
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(se, {
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(se, {
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(ae, { className: "h-4 w-4 mr-2" }), "Save Layout"]
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(oe, { className: "h-4 w-4 mr-2" }), "Reset"]
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(ie, { className: A("h-4 w-4 mr-2", f && "animate-spin") }), f ? "Refreshing…" : "Refresh All"]
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(V, { className: "h-4 w-4 mr-2" }), "Edit Layout"]
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(H, { className: "h-4 w-4" })
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(H, { className: "h-4 w-4" })
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 = L(() => {
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 = L(() => {
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 = L(() => {
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(U, { className: "h-4 w-4 animate-spin" }), /* @__PURE__ */ Y("span", {
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(z, { className: "h-4 w-4 text-destructive shrink-0" }), /* @__PURE__ */ Y("span", {
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(B, { className: "h-3 w-3 mr-1" }),
990
- n.direction === "down" && /* @__PURE__ */ Y(re, { className: "h-3 w-3 mr-1" }),
991
- n.direction === "neutral" && /* @__PURE__ */ Y(W, { className: "h-3 w-3 mr-1" }),
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(U, { className: "h-4 w-4 animate-spin" }), /* @__PURE__ */ Y("span", {
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(z, { className: "h-4 w-4 text-destructive shrink-0" }), /* @__PURE__ */ Y("span", {
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(B, { className: "h-3 w-3 mr-1" }),
1042
- r === "down" && /* @__PURE__ */ Y(re, { className: "h-3 w-3 mr-1" }),
1043
- r === "neutral" && /* @__PURE__ */ Y(W, { className: "h-3 w-3 mr-1" }),
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, drillDown: b, title: k }) => {
1050
- let A = te(s), j = m || A?.dataSource, [M, N] = R(!1), [ee, P] = R(null), [ne, z] = R(!1), [re, B] = R(null), [V, H] = R(null);
1051
- I(() => {
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 (!(!j || !e || typeof j.getObjectSchema != "function")) return j.getObjectSchema(e).then((e) => {
1054
- t && H(e);
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
- }, [j, e]);
1059
- let U = L(() => {
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]), W = L(() => {
1070
+ }, [V, t?.field]), oe = I(() => {
1065
1071
  if (g) return g;
1066
- if (U) {
1067
- if (U.type === "currency") {
1068
- let e = U.precision ?? U.scale ?? 0;
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 (U.type === "percent") return "0,0%";
1072
- if (U.type === "number" || U.type === "integer") return "0,0";
1077
+ if (H.type === "percent") return "0,0%";
1078
+ if (H.type === "number" || H.type === "integer") return "0,0";
1073
1079
  }
1074
- }, [g, U]), ie = L(() => {
1080
+ }, [g, H]), se = I(() => {
1075
1081
  if (_) return _;
1076
- if (U?.type === "currency") return U.defaultCurrency || U.currency || void 0;
1077
- }, [_, U]), ae = L(() => t ? JSON.stringify(t) : "", [t]), G = L(() => i(n), [n]), oe = F(async (n, r) => {
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: G
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: G });
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 && P(i);
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
- ae,
1104
- L(() => G ? JSON.stringify(G) : "", [G])
1109
+ U,
1110
+ I(() => W ? JSON.stringify(W) : "", [W])
1105
1111
  ]);
1106
- I(() => {
1112
+ F(() => {
1107
1113
  let t = { current: !0 };
1108
- return j && e ? oe(j, t) : (P(null), B(null)), () => {
1114
+ return M && e ? ce(M, t) : (re(null), B(null)), () => {
1109
1115
  t.current = !1;
1110
1116
  };
1111
1117
  }, [
1112
- j,
1118
+ M,
1113
1119
  e,
1114
- oe
1120
+ ce
1115
1121
  ]);
1116
- let se = ee === null ? j ? "—" : l ?? "—" : ee, ce = r(b) && !!e && !!j, K = L(() => {
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(b, {}, (typeof k == "string" ? k : k?.defaultValue || "") || e || "Details");
1126
+ return a(k, {}, (typeof A == "string" ? A : A?.defaultValue || "") || e || "Details");
1119
1127
  }, [
1120
- b,
1128
+ k,
1121
1129
  c,
1122
- k
1123
- ]), le = L(() => {
1124
- if (!ce) return null;
1125
- let t = b?.target ?? "drawer", n = /* @__PURE__ */ Y("div", {
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: G,
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 && N(!1),
1156
+ onOpenChange: (e) => !e && ee(!1),
1138
1157
  children: /* @__PURE__ */ X(S, {
1139
- className: "max-w-4xl",
1140
- children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children: K }) }), n]
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 && N(!1),
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-4xl flex flex-col",
1148
- children: [/* @__PURE__ */ Y(D, { children: /* @__PURE__ */ Y(O, { children: K }) }), /* @__PURE__ */ Y("div", {
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: n
1169
+ children: i
1151
1170
  })]
1152
1171
  })
1153
1172
  });
1154
1173
  }, [
1155
- ce,
1156
- b,
1174
+ K,
1175
+ k,
1157
1176
  e,
1158
- G,
1159
- K
1177
+ W,
1178
+ le
1160
1179
  ]);
1161
1180
  return /* @__PURE__ */ X(J, { children: [/* @__PURE__ */ Y(Ve, {
1162
1181
  label: c,
1163
- value: se,
1182
+ value: G,
1164
1183
  trend: u,
1165
1184
  icon: d,
1166
1185
  className: f,
1167
1186
  description: p,
1168
- loading: ne,
1169
- error: re,
1187
+ loading: R,
1188
+ error: ie,
1170
1189
  colorVariant: h,
1171
- format: W,
1172
- currency: ie,
1190
+ format: oe,
1191
+ currency: se,
1173
1192
  prefix: v,
1174
1193
  suffix: y,
1175
- onClick: ce ? () => N(!0) : void 0
1176
- }), M && le] });
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 } = L(() => {
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 = te(s), c = t || a?.dataSource, u = l(e.bind), { fieldLabel: d, fieldOptionLabel: f } = be(), p = "No data available", m = "No data source available for";
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] = R([]), [_, v] = R(null), [y, b] = R(!1), [x, S] = R(null);
1495
- I(() => {
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
- ]), I(() => {
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 = L(() => {
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: o, columns: s, maxRows: c, className: l }) => {
1773
- let u = {
1774
- type: "object-data-table",
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: /* @__PURE__ */ Y(et, {
1788
- schema: u,
1789
- dataSource: o
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-4xl",
1797
- children: [/* @__PURE__ */ Y(C, { children: /* @__PURE__ */ Y(w, { children: n }) }), d]
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: d
1837
+ children: p
1808
1838
  })]
1809
1839
  })
1810
1840
  });
1811
1841
  }, nt = ({ schema: e, dataSource: o, className: c }) => {
1812
- let u = te(s), d = o || u?.dataSource, f = l(e.bind), [p, m] = R([]), [h, g] = R(!1), [_, v] = R(null), [y, b] = R({}), [x, S] = R({}), [C, w] = R(null), { fieldLabel: T, fieldOptionLabel: E } = be(), D = ne(T), O = ne(E);
1813
- I(() => {
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]), I(() => {
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]), I(() => {
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, P = e.columnField ? y[e.columnField] : void 0, F = e.rowField ? x[e.rowField] : void 0, L = e.drillDown;
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: P,
1967
- rowFieldLabel: F,
1968
- onDrillDown: r(L) ? (e) => w(e) : void 0
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(L, C, {
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(L, C, e.title || "Details"),
1982
- target: L?.target ?? "drawer",
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: L?.columns,
1987
- maxRows: L?.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] = R(o), [u, d] = R(null), [f, m] = R(e), [h, g] = R(0);
2695
- I(() => {
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 = F((e) => {
2751
+ }, [u, h]), v = P((e) => {
2721
2752
  d(e), l(!0);
2722
- }, []), y = F(() => {
2753
+ }, []), y = P(() => {
2723
2754
  d(null);
2724
- }, []), b = F((e, t) => {
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 = F((e) => {
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 = F(() => {
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(G, { className: "h-3.5 w-3.5 mr-1" }), "Settings"]
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,
@@ -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,gIAouB7B,CAAC"}
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;AAc1B,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;CACpB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAmD1D,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,CAiOhE,CAAC"}
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,CA+N5D,CAAC"}
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.0.12",
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.0.12",
27
- "@object-ui/core": "4.0.12",
28
- "@object-ui/i18n": "4.0.12",
29
- "@object-ui/fields": "4.0.12",
30
- "@object-ui/react": "4.0.12",
31
- "@object-ui/types": "4.0.12"
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",