@object-ui/plugin-dashboard 5.4.0 → 5.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @object-ui/plugin-dashboard
|
|
2
2
|
|
|
3
|
+
## 5.4.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @object-ui/types@5.4.2
|
|
8
|
+
- @object-ui/core@5.4.2
|
|
9
|
+
- @object-ui/i18n@5.4.2
|
|
10
|
+
- @object-ui/react@5.4.2
|
|
11
|
+
- @object-ui/components@5.4.2
|
|
12
|
+
- @object-ui/fields@5.4.2
|
|
13
|
+
|
|
14
|
+
## 5.4.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- @object-ui/types@5.4.1
|
|
19
|
+
- @object-ui/core@5.4.1
|
|
20
|
+
- @object-ui/i18n@5.4.1
|
|
21
|
+
- @object-ui/react@5.4.1
|
|
22
|
+
- @object-ui/components@5.4.1
|
|
23
|
+
- @object-ui/fields@5.4.1
|
|
24
|
+
|
|
3
25
|
## 5.4.0
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1092,7 +1092,14 @@ var Ge = ({ title: e, value: t, icon: n, trend: r, trendValue: i, description: a
|
|
|
1092
1092
|
groupBy: t.groupBy || "_all",
|
|
1093
1093
|
filter: G
|
|
1094
1094
|
}), a = Array.isArray(r) ? r : [];
|
|
1095
|
-
|
|
1095
|
+
if (a.length === 0) i = 0;
|
|
1096
|
+
else if (t.function === "count") {
|
|
1097
|
+
let e = `${t.field}_count`;
|
|
1098
|
+
i = a.reduce((n, r) => n + (Number(r[e]) || Number(r[t.field]) || Number(r.count) || 0), 0);
|
|
1099
|
+
} else {
|
|
1100
|
+
let e = a[0];
|
|
1101
|
+
i = e[`${t.field}_${t.function}`] ?? e[t.field] ?? e.value ?? 0;
|
|
1102
|
+
}
|
|
1096
1103
|
} else if (typeof n.find == "function") {
|
|
1097
1104
|
let t = await n.find(e, { $filter: G });
|
|
1098
1105
|
i = (Array.isArray(t) ? t : t?.data || t?.records || []).length;
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@object-ui/core`),require(`@object-ui/react`),require(`@object-ui/i18n`),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/fields`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`@object-ui/react`,`@object-ui/i18n`,`@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/fields`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginDashboard={},e.ObjectUICore,e.ObjectUIReact,e.ObjectUII18n,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.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};a=((e,t,n)=>(n=e==null?{}:m(v(e)),b(t||!e||!e.__esModule?h(n,`default`,{value:e,enumerable:!0}):n,e)))(a,1);function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&e.provider===`object`}function S({id:e,disabled:t,gridSpan:n,className:r,children:a}){let{attributes:o,listeners:s,setNodeRef:d,transform:f,transition:p,isDragging:m,isOver:h}=(0,c.useSortable)({id:e,disabled:t});return(0,u.jsx)(`div`,{ref:d,style:{transform:l.CSS.Transform.toString(f),transition:p,opacity:m?.4:1,...n?{gridColumn:`span ${n.w}`,gridRow:`span ${n.h}`}:{}},className:(0,i.cn)(`h-full w-full`,r,!t&&`cursor-grab active:cursor-grabbing`,h&&!m&&`ring-2 ring-primary ring-offset-2 rounded-lg`),"data-sortable-widget-id":e,...o,...s,children:a})}function C(e){return e?(0,i.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,a.forwardRef)(({schema:e,className:t,dataSource:l,onRefresh:d,recordCount:f,userActions:p,designMode:m,selectedWidgetId:h,onWidgetClick:g,onWidgetsReorder:_,modalHandler:v,scriptHandlers:y,hideHeaderText:b,...E},O)=>{let k=(()=>{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})(),A=k,j=e.gap||4,[M,N]=(0,a.useState)(!1),[P,F]=(0,a.useState)(!1),I=(0,a.useRef)(null),{executeAction:L,engine:R}=(0,n.useActionEngine)({actions:(0,a.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:z,dashboardDescription:B,dashboardActionLabel:V,widgetTitle:H,widgetDescription:U,fieldLabel:W}=(0,n.useObjectLabel)(),{t:G}=(0,r.useObjectTranslation)(),ee=(0,a.useCallback)((e,t,n)=>n&&(!t||t===`value`||t===`count`||n===`count`)?G(`report.aggregate.${n}`,{defaultValue:n}):e?W(e,t,t):t,[G,W]),K=e.name,q=(0,a.useCallback)(e=>K?V(K,e.actionUrl||e.label,e.label):e.label,[K,V]),J=(0,a.useCallback)(e=>{let t=w(e.title);return!K||!e.id||t===void 0?t:H(K,e.id,t)},[K,H]),te=(0,a.useCallback)(e=>{let t=w(e.description);return!K||!e.id?t:U(K,e.id,t)},[K,U]);(0,a.useEffect)(()=>{let e=R.getRunner();if(v&&e.setModalHandler(v),y)for(let[t,n]of Object.entries(y))e.registerScript(t,n)},[R,v,y]),(0,a.useEffect)(()=>{let e=()=>F(window.innerWidth<768);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let ne=(0,a.useCallback)(()=>{d&&(N(!0),d(),setTimeout(()=>N(!1),600))},[d]);(0,a.useEffect)(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!d))return I.current=setInterval(ne,e.refreshInterval*1e3),()=>{I.current&&clearInterval(I.current)}},[e.refreshInterval,d,ne]);let Y=(0,a.useCallback)((e,t)=>{!m||!g||!t||(e.stopPropagation(),g(t))},[m,g]),re=(0,a.useCallback)((t,n,r)=>{if(!m||!g)return;let i=e.widgets||[];if(t.key===`Enter`||t.key===` `)t.preventDefault(),g(n??null);else if(t.key===`ArrowRight`||t.key===`ArrowDown`){t.preventDefault();let e=r+1<i.length?i[r+1]:null;e?.id&&g(e.id)}else if(t.key===`ArrowLeft`||t.key===`ArrowUp`){t.preventDefault();let e=r-1>=0?i[r-1]:null;e?.id&&g(e.id)}else t.key===`Escape`&&(t.preventDefault(),g(null))},[m,g,e.widgets]),X=(0,a.useCallback)(e=>{!m||!g||e.target===e.currentTarget&&g(null)},[m,g]),Z=!!(m&&_),Q=(0,s.useSensors)((0,s.useSensor)(s.PointerSensor,{activationConstraint:{distance:5}})),ie=(0,a.useCallback)(t=>{if(!Z)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||_?.((0,c.arrayMove)(i,a,o))},[Z,e.widgets,_]),ae=(e,t,r)=>{let o=e.layout?{...e.layout,w:Math.min(e.layout.w,A)}: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||J(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||J(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||J(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]||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:ee(l,c,s?.function)}],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:ee(e.object,a,e.aggregate)}],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:ee(e.object,a,e.aggregate)}],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}})(),c=e.type===`metric`,d=J(e),f=te(e),p=e.id||d||`widget-${t}`,g=m&&h===e.id,_=m?{"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=>Y(t,e.id),onKeyDown:n=>re(n,e.id,t)}:{},v=m?(0,i.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=!P&&o&&!Z?{gridColumn:`span ${o.w}`,gridRow:`span ${o.h}`}:void 0,b=c?(0,u.jsxs)(`div`,{className:(0,i.cn)(`h-full w-full`,m&&`relative`,v),style:y,..._,children:[(0,u.jsx)(n.SchemaRenderer,{schema:s,className:(0,i.cn)(`h-full w-full`,m&&`pointer-events-none`),dataSource:l}),m&&(0,u.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]}):(0,u.jsxs)(i.Card,{className:(0,i.cn)(`overflow-hidden border-border/50 shadow-sm transition-all hover:shadow-md`,`bg-card/50 backdrop-blur-sm`,r&&`w-full`,m&&`relative`,v),style:y,..._,children:[d&&(0,u.jsxs)(i.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 px-3 sm:px-6`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm sm:text-base font-medium tracking-tight truncate`,title:d,children:d}),f&&(0,u.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:f})]}),(0,u.jsx)(i.CardContent,{className:`p-0`,children:(0,u.jsx)(`div`,{className:(0,i.cn)(`h-full w-full`,`p-3 sm:p-4 md:p-6`,m&&`pointer-events-none`),children:(0,u.jsx)(n.SchemaRenderer,{schema:s,dataSource:l})})}),m&&(0,u.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]});return Z&&e.id?(0,u.jsx)(S,{id:e.id,gridSpan:!P&&o?{w:o.w,h:o.h}:void 0,children:b},p):(0,u.jsx)(a.Fragment,{children:b},p)},oe=e.header&&(0,u.jsxs)(`div`,{className:`col-span-full mb-4`,children:[!b&&e.header.showTitle!==!1&&e.title&&(0,u.jsx)(`h2`,{className:`text-lg font-semibold tracking-tight`,children:K?z({name:K,label:w(e.title)}):w(e.title)}),!b&&e.header.showDescription!==!1&&e.description&&(0,u.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:K?B({name:K,description:w(e.description)}):w(e.description)}),e.header.actions&&e.header.actions.length>0&&(0,u.jsx)(`div`,{className:`flex gap-2 mt-3`,children:e.header.actions.map((e,t)=>{let n=C(e.icon);return(0,u.jsxs)(i.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 L(n||r);e?.success||console.warn(`[DashboardRenderer] action failed`,e?.error);return}console.warn(`[DashboardRenderer] Unknown header actionType="${t}" for "${r}"`)},children:[n&&(0,u.jsx)(n,{className:`w-4 h-4 mr-1.5`}),q(e)]},t)})})]}),se=f!==void 0&&(0,u.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[f.toLocaleString(),` records`]}),ce=p?JSON.stringify(p):void 0,le=d&&(0,u.jsxs)(`div`,{className:(0,i.cn)(`flex items-center justify-end gap-3 mb-2`,!P&&`col-span-full`),children:[se,(0,u.jsxs)(i.Button,{variant:`outline`,size:`sm`,onClick:ne,disabled:M,"aria-label":`Refresh dashboard`,children:[(0,u.jsx)(o.RefreshCw,{className:(0,i.cn)(`h-4 w-4 mr-2`,M&&`animate-spin`)}),M?`Refreshing…`:`Refresh All`]})]}),ue=(0,a.useMemo)(()=>(e.widgets??[]).map(e=>e.id).filter(e=>!!e),[e.widgets]),de=(0,a.useMemo)(()=>(e.widgets??[]).filter(e=>e.type===`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]),fe=(0,a.useMemo)(()=>(e.widgets??[]).filter(e=>e.type!==`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]);if(P){let n=e.widgets?.filter(e=>e.type===`metric`)||[],r=e.widgets?.filter(e=>e.type!==`metric`)||[],a=(0,u.jsxs)(`div`,{ref:O,className:(0,i.cn)(`flex flex-col gap-4 px-4`,t),"data-user-actions":ce,onClick:X,...E,children:[oe,le,n.length>0&&(0,u.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,onClick:X,children:(0,u.jsx)(c.SortableContext,{items:de,strategy:c.rectSortingStrategy,disabled:!Z,children:n.map((e,t)=>ae(e,t))})}),r.length>0&&(0,u.jsx)(`div`,{className:`flex flex-col gap-4`,onClick:X,children:(0,u.jsx)(c.SortableContext,{items:fe,strategy:c.verticalListSortingStrategy,disabled:!Z,children:r.map((e,t)=>ae(e,t,!0))})})]});return Z?(0,u.jsx)(s.DndContext,{sensors:Q,collisionDetection:s.closestCenter,onDragEnd:ie,children:a}):a}let pe=e.columns!=null||k!==4,me=(0,u.jsxs)(`div`,{ref:O,className:(0,i.cn)(`grid auto-rows-min`,!pe&&`grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`,t),style:{...pe&&{gridTemplateColumns:`repeat(${A}, minmax(0, 1fr))`},gap:`${j*.25}rem`},"data-user-actions":ce,onClick:X,...E,children:[oe,le,(0,u.jsx)(c.SortableContext,{items:ue,strategy:c.rectSortingStrategy,disabled:!Z,children:e.widgets?.map((e,t)=>ae(e,t))})]});return Z?(0,u.jsx)(s.DndContext,{sensors:Q,collisionDetection:s.closestCenter,onDragEnd:ie,children:me}):me});function k({editMode:e}){let t=(0,n.useDnd)();return a.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:r,onSchemaChange:s,onRefresh:c})=>{let{width:l,containerRef:f,mounted:p}=(0,d.useContainerWidth)(),[m,h]=a.useState(!1),[g,_]=a.useState(!1),v=(0,n.useHasDndProvider)(),y=a.useRef(null),b=a.useCallback(()=>{c&&(_(!0),c(),setTimeout(()=>_(!1),600))},[c]);a.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]=a.useState(()=>M(e)),w=a.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]);a.useEffect(()=>{C(M(e))},[w]);let T=a.useCallback((e,t)=>{C(t),r?.(e)},[r]),E=a.useCallback(()=>{s?s(j(e,S.lg)):globalThis.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=a.useCallback(()=>{C(M(e))},[e]),O=a.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,u.jsxs)(`div`,{ref:f,className:(0,i.cn)(`w-full`,t),"data-testid":`grid-layout`,children:[v&&(0,u.jsx)(k,{editMode:m}),(0,u.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,u.jsx)(`h2`,{className:`text-2xl font-bold`,children:e.title||`Dashboard`}),(0,u.jsx)(`div`,{className:`flex gap-2`,children:m?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(i.Button,{onClick:E,size:`sm`,variant:`default`,children:[(0,u.jsx)(o.Save,{className:`h-4 w-4 mr-2`}),`Save Layout`]}),(0,u.jsxs)(i.Button,{onClick:D,size:`sm`,variant:`outline`,children:[(0,u.jsx)(o.X,{className:`h-4 w-4 mr-2`}),`Reset`]}),(0,u.jsx)(i.Button,{onClick:()=>h(!1),size:`sm`,variant:`ghost`,children:`Cancel`})]}):(0,u.jsxs)(u.Fragment,{children:[c&&(0,u.jsxs)(i.Button,{onClick:b,size:`sm`,variant:`outline`,disabled:g,"aria-label":`Refresh dashboard`,children:[(0,u.jsx)(o.RefreshCw,{className:(0,i.cn)(`h-4 w-4 mr-2`,g&&`animate-spin`)}),g?`Refreshing…`:`Refresh All`]}),(0,u.jsxs)(i.Button,{onClick:()=>h(!0),size:`sm`,variant:`outline`,children:[(0,u.jsx)(o.Edit,{className:`h-4 w-4 mr-2`}),`Edit Layout`]})]})})]}),p&&(0,u.jsx)(d.ResponsiveGridLayout,{className:`layout`,width:l,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 r=e.id||`widget-${t}`,a=O(e);return(0,u.jsx)(`div`,{className:`h-full`,children:e.type===`metric`?(0,u.jsxs)(`div`,{className:`h-full w-full relative`,children:[m&&(0,u.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,u.jsx)(o.GripVertical,{className:`h-4 w-4`})}),(0,u.jsx)(n.SchemaRenderer,{schema:a,className:`h-full w-full`})]}):(0,u.jsxs)(i.Card,{className:(0,i.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,u.jsxs)(i.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 flex flex-row items-center justify-between`,children:[(0,u.jsx)(i.CardTitle,{className:`text-base font-medium tracking-tight truncate`,title:e.title,children:e.title}),m&&(0,u.jsx)(`div`,{className:`drag-handle cursor-move p-1 hover:bg-muted/40 rounded`,children:(0,u.jsx)(o.GripVertical,{className:`h-4 w-4`})})]}),(0,u.jsx)(i.CardContent,{className:`p-0 h-full`,children:(0,u.jsx)(`div`,{className:(0,i.cn)(`h-full w-full overflow-auto p-4`),children:(0,u.jsx)(n.SchemaRenderer,{schema:a})})})]})},r)})})]})},P=(0,r.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:r,className:s,description:c,loading:l,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,a.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,a.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,a.useMemo)(()=>{if(typeof r==`string`){let e=(0,i.getLazyIcon)(r);return e?(0,u.jsx)(e,{className:`h-4 w-4`}):null}return r},[r]);return(0,u.jsxs)(i.Card,{className:(0,i.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,u.jsxs)(i.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm font-medium truncate`,children:L(e)}),C&&(0,u.jsx)(`div`,{className:(0,i.cn)(`flex h-8 w-8 items-center justify-center rounded-md shrink-0`,y),children:C})]}),(0,u.jsx)(i.CardContent,{children:l?(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-loading`,children:[(0,u.jsx)(o.Loader2,{className:`h-4 w-4 animate-spin`}),(0,u.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-error`,role:`alert`,children:[(0,u.jsx)(o.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,u.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`text-2xl font-bold truncate`,children:S}),(n||c)&&(0,u.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,u.jsxs)(`span`,{className:(0,i.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,u.jsx)(o.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),n.direction===`down`&&(0,u.jsx)(o.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),n.direction===`neutral`&&(0,u.jsx)(o.MinusIcon,{className:`h-3 w-3 mr-1`}),n.value,`%`]}),(0,u.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:r,trendValue:a,description:s,className:c,loading:l,error:d,...f})=>{let p=n?(0,i.getLazyIcon)(n):null;return(0,u.jsxs)(i.Card,{className:(0,i.cn)(`h-full`,c),...f,children:[(0,u.jsxs)(i.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm font-medium`,children:B(e)}),p&&(0,u.jsx)(p,{className:`h-4 w-4 text-muted-foreground`})]}),(0,u.jsx)(i.CardContent,{children:l?(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-card-loading`,children:[(0,u.jsx)(o.Loader2,{className:`h-4 w-4 animate-spin`}),(0,u.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-card-error`,role:`alert`,children:[(0,u.jsx)(o.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,u.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),(r||a||s)&&(0,u.jsxs)(`p`,{className:`text-xs text-muted-foreground flex items-center mt-1`,children:[r&&a&&(0,u.jsxs)(`span`,{className:(0,i.cn)(`flex items-center mr-2`,r===`up`&&`text-green-500`,r===`down`&&`text-red-500`,r===`neutral`&&`text-yellow-500`),children:[r===`up`&&(0,u.jsx)(o.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),r===`down`&&(0,u.jsx)(o.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),r===`neutral`&&(0,u.jsx)(o.MinusIcon,{className:`h-3 w-3 mr-1`}),a]}),B(s)]})]})})]})},H=({objectName:e,aggregate:r,filter:o,label:s,fallbackValue:c,trend:l,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,a.useContext)(n.SchemaRendererContext),w=m||C?.dataSource,[T,E]=(0,a.useState)(!1),[D,O]=(0,a.useState)(null),[k,A]=(0,a.useState)(!1),[j,M]=(0,a.useState)(null),[N,P]=(0,a.useState)(null);(0,a.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,a.useMemo)(()=>{let e=r?.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,r?.field]),I=(0,a.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]),L=(0,a.useMemo)(()=>{if(_)return _;if(F?.type===`currency`)return F.defaultCurrency||F.currency||void 0},[_,F]),R=(0,a.useMemo)(()=>r?JSON.stringify(r):``,[r]),B=(0,a.useMemo)(()=>(0,t.resolveDateMacros)(o),[o]),V=(0,a.useCallback)(async(t,n)=>{if(!(!t||!e)){n.current&&(A(!0),M(null));try{let i;if(r&&typeof t.aggregate==`function`){let n=await t.aggregate(e,{field:r.field,function:r.function,groupBy:r.groupBy||`_all`,filter:B}),a=Array.isArray(n)?n:[];i=a.length===0?0:r.function===`count`?a.reduce((e,t)=>e+(Number(t[r.field])||Number(t.count)||0),0):a[0][r.field]??0}else if(typeof t.find==`function`){let n=await t.find(e,{$filter:B});i=(Array.isArray(n)?n:n?.data||n?.records||[]).length}else return;n.current&&O(i)}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,R,(0,a.useMemo)(()=>B?JSON.stringify(B):``,[B])]);(0,a.useEffect)(()=>{let t={current:!0};return w&&e?V(w,t):(O(null),M(null)),()=>{t.current=!1}},[w,e,V]);let H=D===null?w?`—`:c??`—`:D;b&&typeof H==`number`&&isFinite(H)&&H>=0&&H<=1&&(H=1-H);let U=(0,t.isDrillEnabled)(x)&&!!e&&!!w,W=(0,a.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]),G=(0,a.useMemo)(()=>{if(!U)return null;let t=x?.target??`drawer`,r=x?.report,a=r&&typeof r==`object`&&(Array.isArray(r.columns)||`objectName`in r),o;if(a){let e=r.filter,t=e?B?{$and:[e,B]}:e:B;o=(0,u.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,u.jsx)(n.SchemaRenderer,{schema:{type:`spec-report`,...r,filter:t}})})}else o=(0,u.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,u.jsx)(n.SchemaRenderer,{schema:{type:`object-data-table`,objectName:e,filter:B,pageSize:25,drillDown:{enabled:!1}}})});return t===`dialog`?(0,u.jsx)(i.Dialog,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,u.jsxs)(i.DialogContent,{className:`max-w-5xl`,children:[(0,u.jsx)(i.DialogHeader,{children:(0,u.jsx)(i.DialogTitle,{children:W})}),o]})}):(0,u.jsx)(i.Sheet,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,u.jsxs)(i.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-5xl flex flex-col`,children:[(0,u.jsx)(i.SheetHeader,{children:(0,u.jsx)(i.SheetTitle,{children:W})}),(0,u.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:o})]})})},[U,x,e,B,W]);return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(z,{label:s,value:H,trend:l,icon:d,className:f,description:p,loading:k,error:j,colorVariant:h,format:I,currency:L,prefix:v,suffix:y,onClick:U?()=>E(!0):void 0}),T&&G]})};function U(){try{let{t:e}=(0,r.useObjectTranslation)(),t=e(`dashboard.total`);return!t||t===`dashboard.total`?`Total`:t}catch{return`Total`}}function W(){try{let{t:e}=(0,r.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);return!t||t===`dashboard.noDataAvailable`?`No data available`:t}catch{return`No data available`}}function G(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 ee=`—`;function K(e,t){return e===``?ee:t?.[e]??e}function q(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 J=({schema:e,className:n,rowLabels:r,columnLabels:o,rowFieldLabel:s,onDrillDown:c})=>{let{title:l,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:r?.[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,a.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=q(i,m);a[e][r]=o,t.push(...i),!s[r]&&s[r]}o[e]=q(t,m)}for(let e of i){let t=[];for(let i of r){let r=n[i]?.[e]??[];t.push(...r)}s[e]=q(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:q(c,m)}},[D,d,f,p,m]),P=e=>G(e,v);return D.length===0?(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,n),children:[l&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:l}),(0,u.jsx)(i.DataEmptyState,{"data-testid":`pivot-empty-state`,className:`py-8 gap-2 [&>h3]:hidden`,icon:(0,u.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,u.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`})]}),iconWrapperClassName:``,title:``,description:S})]}):(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,n),children:[l&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:l}),(0,u.jsxs)(`table`,{className:`w-full text-sm border-collapse table-auto`,role:`table`,children:[(0,u.jsx)(`thead`,{children:(0,u.jsxs)(`tr`,{className:`border-b border-border`,children:[(0,u.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,u.jsx)(`th`,{className:(0,i.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:K(e,o)},e)}),g&&(0,u.jsx)(`th`,{className:`text-right p-2 font-semibold text-muted-foreground bg-muted/20 whitespace-nowrap`,children:x})]})}),(0,u.jsx)(`tbody`,{children:O.map(e=>(0,u.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-muted/30`,children:[(0,u.jsx)(`td`,{className:(0,i.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:K(e,r)}),k.map(t=>{let n=A[e]?.[t]??0,r=()=>w({scope:`cell`,rowKey:e,colKey:t,value:n});return(0,u.jsx)(`td`,{className:(0,i.cn)(`text-right p-2 tabular-nums`,y?.[t],E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?r:void 0,onKeyDown:C?T(r):void 0,"aria-label":C?`Drill into ${d}=${e||`(empty)`}, ${f}=${t||`(empty)`}`:void 0,children:P(n)},t)}),g&&(0,u.jsx)(`td`,{className:(0,i.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,u.jsx)(`tfoot`,{children:(0,u.jsxs)(`tr`,{className:`border-t-2 border-border font-semibold bg-muted/40`,children:[(0,u.jsx)(`td`,{className:`p-2`,children:x}),k.map(e=>(0,u.jsx)(`td`,{className:(0,i.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,u.jsx)(`td`,{className:(0,i.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 te(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 ne(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:o,className:s})=>{let c=(0,a.useContext)(n.SchemaRendererContext),l=o||c?.dataSource,d=(0,n.useDataScope)(e.bind),{fieldLabel:f,fieldOptionLabel:m}=(0,r.useSafeFieldLabel)(),h=`No data available`,g=`No data source available for`;try{let{t:e}=(0,r.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,a.useState)([]),[y,b]=(0,a.useState)(null),[x,S]=(0,a.useState)(()=>!(Array.isArray(e.data)&&e.data.length>0)&&!!e.objectName),[C,w]=(0,a.useState)(null);(0,a.useEffect)(()=>{let n=!0;return e.objectName&&!d&&(!e.data||e.data.length===0)?(async()=>{if(!l||!e.objectName){n&&S(!1);return}n&&(S(!0),w(null));try{let r;if(typeof l.find==`function`){let n=ne(e,y),i={$filter:(0,t.resolveDateMacros)(e.filter)};n.length&&(i.$expand=n),r=(0,t.extractRecords)(await l.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&&S(!1),()=>{n=!1}},[e.objectName,l,d,e.data,e.filter,y]),(0,a.useEffect)(()=>{let t=!0;if(!(!l||!e.objectName||typeof l.getObjectSchema!=`function`))return l.getObjectSchema(e.objectName).then(e=>{t&&b(e)}).catch(()=>{}),()=>{t=!1}},[e.objectName,l]);let T=d||e.data||_,E=Array.isArray(T)?T:[],D=(0,a.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?f(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 l=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,u.jsx)((0,p.getCellRenderer)((0,p.resolveCellRendererType)(o)),{value:e,field:o})};return{...e,...o,align:c,cell:l}};if(e.columns&&e.columns.length>0){let n=te(e.columns);return(t?n.map(e=>({...e,header:f(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,f,m]);if(x&&E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-loading`,children:(0,u.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`})]}),[1,2,3,4].map(e=>(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`})]},e))]})});if(C)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-error`,children:(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`table-error-message`,children:[(0,u.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,u.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,u.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,u.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:C})]})});if(!l&&e.objectName&&E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),children:(0,u.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,u.jsxs)(`p`,{className:`text-xs`,children:[g,` “`,e.objectName,`”`]})})});if(E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-empty-state`,children:(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:[(0,u.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,u.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,u.jsx)(`line`,{x1:`3`,y1:`9`,x2:`21`,y2:`9`}),(0,u.jsx)(`line`,{x1:`9`,y1:`21`,x2:`9`,y2:`9`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:h})]})});let O={...e,type:`data-table`,data:E,columns:D};return(0,u.jsxs)(`div`,{className:(0,i.cn)(`relative`,s),children:[(0,u.jsx)(i.RefreshIndicator,{active:x&&E.length>0}),(0,u.jsx)(n.SchemaRenderer,{schema:O,className:s})]})},re=({open:e,onClose:t,title:r,target:a=`drawer`,objectName:o,filter:s,dataSource:c,columns:l,maxRows:d,className:f,report:p})=>{let m=p&&typeof p==`object`&&(Array.isArray(p.columns)||`objectName`in p),h=(0,u.jsx)(`div`,{className:(0,i.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,u.jsx)(n.SchemaRenderer,{schema:{...p,type:`spec-report`,report:{...p,filter:t},filter:t}})})():(0,u.jsx)(Y,{schema:{type:`object-data-table`,objectName:o,filter:s,columns:l?.map(e=>({accessorKey:e,header:e})),pagination:!0,searchable:!1,pageSize:d},dataSource:c})});return a===`dialog`?(0,u.jsx)(i.Dialog,{open:e,onOpenChange:e=>!e&&t(),children:(0,u.jsxs)(i.DialogContent,{className:`max-w-5xl`,children:[(0,u.jsx)(i.DialogHeader,{children:(0,u.jsx)(i.DialogTitle,{children:r})}),h]})}):(0,u.jsx)(i.Sheet,{open:e,onOpenChange:e=>!e&&t(),children:(0,u.jsxs)(i.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col`,children:[(0,u.jsx)(i.SheetHeader,{children:(0,u.jsx)(i.SheetTitle,{children:r})}),(0,u.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:h})]})})},X=({schema:e,dataSource:o,className:s})=>{let c=(0,a.useContext)(n.SchemaRendererContext),l=o||c?.dataSource,d=(0,n.useDataScope)(e.bind),[f,p]=(0,a.useState)([]),[m,h]=(0,a.useState)(!1),[g,_]=(0,a.useState)(null),[v,y]=(0,a.useState)({}),[b,x]=(0,a.useState)({}),[S,C]=(0,a.useState)(null),{fieldLabel:w,fieldOptionLabel:T}=(0,r.useSafeFieldLabel)(),E=(0,a.useRef)(w),D=(0,a.useRef)(T);(0,a.useEffect)(()=>{E.current=w,D.current=T},[w,T]),(0,a.useEffect)(()=>{if(!l||!e.objectName)return;let t=l.getObjectSchema;if(typeof t!=`function`)return;let n=!0;return Promise.resolve(t.call(l,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}},[l,e.objectName]),(0,a.useEffect)(()=>{let n=!0;return e.objectName&&!d&&(!e.data||e.data.length===0)&&(async()=>{if(!(!l||!e.objectName)){n&&(h(!0),_(null));try{let r;if(typeof l.find==`function`)r=(0,t.extractRecords)(await l.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,l,d,e.data,e.filter]);let O=d||e.data||f,k=Array.isArray(O)?O:[];if(m&&k.length===0)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`pivot-loading`,children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-6 w-24`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`})]}),[1,2,3].map(e=>(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-5 w-24`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`})]},e))]})]});if(g)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`pivot-error`,children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`pivot-error-message`,children:[(0,u.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,u.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,u.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,u.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:g})]})]});if(!l&&e.objectName&&k.length===0)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,u.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,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(J,{schema:A,className:s,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,u.jsx)(re,{open:!0,onClose:()=>C(null),title:(0,t.resolveDrillTitle)(P,S,e.title||`Details`),target:P?.target??`drawer`,objectName:e.objectName,filter:r,dataSource:l,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:r,onFieldChange:a}){let{draft:o,isDirty:s,updateField:c,discard:l}=(0,i.useConfigDraft)(n,{onUpdate:a});return(0,u.jsx)(i.ConfigPanelRenderer,{open:e,onClose:t,schema:Z,draft:o,isDirty:s,onFieldChange:c,onSave:()=>r(o),onDiscard:l})}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,r){return{key:e,label:t,type:`custom`,render:(a,o,s)=>(0,u.jsx)(i.ConfigRow,{label:t,children:(0,u.jsx)(`div`,{"data-testid":`config-field-${e}`,children:(0,u.jsx)(i.Combobox,{options:r??[],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 r=e&&e.length>0,a=r?{key:`object`,label:`Data source`,type:`custom`,render:(t,n)=>(0,u.jsx)(i.ConfigRow,{label:`Data source`,children:(0,u.jsx)(`div`,{"data-testid":`config-field-object`,children:(0,u.jsx)(i.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=r?{...$(`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=r?{...$(`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=r?$(`rowField`,`Field`,`Select row field…`,t):{key:`rowField`,label:`Field`,type:`input`,placeholder:`e.g. owner`},l=r?$(`columnField`,`Field`,`Select column field…`,t):{key:`columnField`,label:`Field`,type:`input`,placeholder:`e.g. stage`},d=r?$(`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:[l,{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:r,onFieldChange:o,headerExtra:s,availableObjects:c,availableFields:l}){let{draft:d,isDirty:f,updateField:p,discard:m}=(0,i.useConfigDraft)(a.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,u.jsx)(i.ConfigPanelRenderer,{open:e,onClose:t,schema:a.useMemo(()=>xe(c,l,d.type),[c,l,d.type]),draft:d,isDirty:f,onFieldChange:p,onSave:()=>r(Ce(d)),onDiscard:m,headerExtra:s})}function Te({schema:e,config:t,onConfigSave:n,onWidgetSave:r,onRefresh:s,recordCount:c,defaultConfigOpen:l=!1,className:d}){let[f,p]=(0,a.useState)(l),[m,h]=(0,a.useState)(null),[g,_]=(0,a.useState)(e),[v,y]=(0,a.useState)(0);(0,a.useEffect)(()=>{_(e),y(e=>e+1)},[e]);let b=a.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,a.useCallback)(e=>{h(e),p(!0)},[]),S=(0,a.useCallback)(()=>{h(null)},[]),C=(0,a.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,a.useCallback)(e=>{if(m&&r){let{drillDownEnabled:t,drillDownTarget:n,...i}=e,a={...i};(t||n)&&(a.options={...i.options||{},drillDown:{...i.options?.drillDown||{},...t===void 0?{}:{enabled:!!t},...n===void 0?{}:{target:n}}}),r(m,a)}h(null),y(e=>e+1)},[m,r]),T=(0,a.useCallback)(()=>{p(e=>!e),h(null)},[]);return(0,u.jsxs)(`div`,{className:(0,i.cn)(`flex h-full w-full`,d),"data-testid":`dashboard-with-config`,children:[(0,u.jsxs)(`div`,{className:`flex-1 min-w-0 overflow-auto relative`,children:[(0,u.jsx)(`div`,{className:`absolute top-2 right-2 z-10`,children:(0,u.jsxs)(i.Button,{size:`sm`,variant:f?`default`:`outline`,onClick:T,"data-testid":`dashboard-config-toggle`,children:[(0,u.jsx)(o.Settings,{className:`h-3.5 w-3.5 mr-1`}),`Settings`]})}),(0,u.jsx)(O,{schema:g,onRefresh:s,recordCount:c,designMode:f,selectedWidgetId:m,onWidgetClick:x})]}),f&&(0,u.jsx)(`div`,{className:`relative shrink-0`,children:m&&b?(0,u.jsx)(we,{open:!0,onClose:S,config:b,onSave:w,onFieldChange:C}):(0,u.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`,J,{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`,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:J,ObjectPivotTable:X,ObjectDataTable:Y,DashboardConfigPanel:Q,WidgetConfigPanel:we,DashboardWithConfig:Te};e.DashboardConfigPanel=Q,e.DashboardGridLayout=N,e.DashboardRenderer=O,e.DashboardWithConfig=Te,e.DrillDownDrawer=re,e.MetricCard=V,e.MetricWidget=z,e.ObjectDataTable=Y,e.ObjectMetricWidget=H,e.ObjectPivotTable=X,e.PivotTable=J,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/i18n`),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/fields`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`@object-ui/react`,`@object-ui/i18n`,`@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/fields`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginDashboard={},e.ObjectUICore,e.ObjectUIReact,e.ObjectUII18n,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.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};a=((e,t,n)=>(n=e==null?{}:m(v(e)),b(t||!e||!e.__esModule?h(n,`default`,{value:e,enumerable:!0}):n,e)))(a,1);function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&e.provider===`object`}function S({id:e,disabled:t,gridSpan:n,className:r,children:a}){let{attributes:o,listeners:s,setNodeRef:d,transform:f,transition:p,isDragging:m,isOver:h}=(0,c.useSortable)({id:e,disabled:t});return(0,u.jsx)(`div`,{ref:d,style:{transform:l.CSS.Transform.toString(f),transition:p,opacity:m?.4:1,...n?{gridColumn:`span ${n.w}`,gridRow:`span ${n.h}`}:{}},className:(0,i.cn)(`h-full w-full`,r,!t&&`cursor-grab active:cursor-grabbing`,h&&!m&&`ring-2 ring-primary ring-offset-2 rounded-lg`),"data-sortable-widget-id":e,...o,...s,children:a})}function C(e){return e?(0,i.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,a.forwardRef)(({schema:e,className:t,dataSource:l,onRefresh:d,recordCount:f,userActions:p,designMode:m,selectedWidgetId:h,onWidgetClick:g,onWidgetsReorder:_,modalHandler:v,scriptHandlers:y,hideHeaderText:b,...E},O)=>{let k=(()=>{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})(),A=k,j=e.gap||4,[M,N]=(0,a.useState)(!1),[P,F]=(0,a.useState)(!1),I=(0,a.useRef)(null),{executeAction:L,engine:R}=(0,n.useActionEngine)({actions:(0,a.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:z,dashboardDescription:B,dashboardActionLabel:V,widgetTitle:H,widgetDescription:U,fieldLabel:W}=(0,n.useObjectLabel)(),{t:G}=(0,r.useObjectTranslation)(),ee=(0,a.useCallback)((e,t,n)=>n&&(!t||t===`value`||t===`count`||n===`count`)?G(`report.aggregate.${n}`,{defaultValue:n}):e?W(e,t,t):t,[G,W]),K=e.name,q=(0,a.useCallback)(e=>K?V(K,e.actionUrl||e.label,e.label):e.label,[K,V]),J=(0,a.useCallback)(e=>{let t=w(e.title);return!K||!e.id||t===void 0?t:H(K,e.id,t)},[K,H]),te=(0,a.useCallback)(e=>{let t=w(e.description);return!K||!e.id?t:U(K,e.id,t)},[K,U]);(0,a.useEffect)(()=>{let e=R.getRunner();if(v&&e.setModalHandler(v),y)for(let[t,n]of Object.entries(y))e.registerScript(t,n)},[R,v,y]),(0,a.useEffect)(()=>{let e=()=>F(window.innerWidth<768);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let ne=(0,a.useCallback)(()=>{d&&(N(!0),d(),setTimeout(()=>N(!1),600))},[d]);(0,a.useEffect)(()=>{if(!(!e.refreshInterval||e.refreshInterval<=0||!d))return I.current=setInterval(ne,e.refreshInterval*1e3),()=>{I.current&&clearInterval(I.current)}},[e.refreshInterval,d,ne]);let Y=(0,a.useCallback)((e,t)=>{!m||!g||!t||(e.stopPropagation(),g(t))},[m,g]),re=(0,a.useCallback)((t,n,r)=>{if(!m||!g)return;let i=e.widgets||[];if(t.key===`Enter`||t.key===` `)t.preventDefault(),g(n??null);else if(t.key===`ArrowRight`||t.key===`ArrowDown`){t.preventDefault();let e=r+1<i.length?i[r+1]:null;e?.id&&g(e.id)}else if(t.key===`ArrowLeft`||t.key===`ArrowUp`){t.preventDefault();let e=r-1>=0?i[r-1]:null;e?.id&&g(e.id)}else t.key===`Escape`&&(t.preventDefault(),g(null))},[m,g,e.widgets]),X=(0,a.useCallback)(e=>{!m||!g||e.target===e.currentTarget&&g(null)},[m,g]),Z=!!(m&&_),Q=(0,s.useSensors)((0,s.useSensor)(s.PointerSensor,{activationConstraint:{distance:5}})),ie=(0,a.useCallback)(t=>{if(!Z)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||_?.((0,c.arrayMove)(i,a,o))},[Z,e.widgets,_]),ae=(e,t,r)=>{let o=e.layout?{...e.layout,w:Math.min(e.layout.w,A)}: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||J(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||J(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||J(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]||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:ee(l,c,s?.function)}],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:ee(e.object,a,e.aggregate)}],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:ee(e.object,a,e.aggregate)}],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}})(),c=e.type===`metric`,d=J(e),f=te(e),p=e.id||d||`widget-${t}`,g=m&&h===e.id,_=m?{"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=>Y(t,e.id),onKeyDown:n=>re(n,e.id,t)}:{},v=m?(0,i.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=!P&&o&&!Z?{gridColumn:`span ${o.w}`,gridRow:`span ${o.h}`}:void 0,b=c?(0,u.jsxs)(`div`,{className:(0,i.cn)(`h-full w-full`,m&&`relative`,v),style:y,..._,children:[(0,u.jsx)(n.SchemaRenderer,{schema:s,className:(0,i.cn)(`h-full w-full`,m&&`pointer-events-none`),dataSource:l}),m&&(0,u.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]}):(0,u.jsxs)(i.Card,{className:(0,i.cn)(`overflow-hidden border-border/50 shadow-sm transition-all hover:shadow-md`,`bg-card/50 backdrop-blur-sm`,r&&`w-full`,m&&`relative`,v),style:y,..._,children:[d&&(0,u.jsxs)(i.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 px-3 sm:px-6`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm sm:text-base font-medium tracking-tight truncate`,title:d,children:d}),f&&(0,u.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:f})]}),(0,u.jsx)(i.CardContent,{className:`p-0`,children:(0,u.jsx)(`div`,{className:(0,i.cn)(`h-full w-full`,`p-3 sm:p-4 md:p-6`,m&&`pointer-events-none`),children:(0,u.jsx)(n.SchemaRenderer,{schema:s,dataSource:l})})}),m&&(0,u.jsx)(`div`,{className:`absolute inset-0 z-10`,"aria-hidden":`true`,"data-testid":`widget-click-overlay`})]});return Z&&e.id?(0,u.jsx)(S,{id:e.id,gridSpan:!P&&o?{w:o.w,h:o.h}:void 0,children:b},p):(0,u.jsx)(a.Fragment,{children:b},p)},oe=e.header&&(0,u.jsxs)(`div`,{className:`col-span-full mb-4`,children:[!b&&e.header.showTitle!==!1&&e.title&&(0,u.jsx)(`h2`,{className:`text-lg font-semibold tracking-tight`,children:K?z({name:K,label:w(e.title)}):w(e.title)}),!b&&e.header.showDescription!==!1&&e.description&&(0,u.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:K?B({name:K,description:w(e.description)}):w(e.description)}),e.header.actions&&e.header.actions.length>0&&(0,u.jsx)(`div`,{className:`flex gap-2 mt-3`,children:e.header.actions.map((e,t)=>{let n=C(e.icon);return(0,u.jsxs)(i.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 L(n||r);e?.success||console.warn(`[DashboardRenderer] action failed`,e?.error);return}console.warn(`[DashboardRenderer] Unknown header actionType="${t}" for "${r}"`)},children:[n&&(0,u.jsx)(n,{className:`w-4 h-4 mr-1.5`}),q(e)]},t)})})]}),se=f!==void 0&&(0,u.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[f.toLocaleString(),` records`]}),ce=p?JSON.stringify(p):void 0,le=d&&(0,u.jsxs)(`div`,{className:(0,i.cn)(`flex items-center justify-end gap-3 mb-2`,!P&&`col-span-full`),children:[se,(0,u.jsxs)(i.Button,{variant:`outline`,size:`sm`,onClick:ne,disabled:M,"aria-label":`Refresh dashboard`,children:[(0,u.jsx)(o.RefreshCw,{className:(0,i.cn)(`h-4 w-4 mr-2`,M&&`animate-spin`)}),M?`Refreshing…`:`Refresh All`]})]}),ue=(0,a.useMemo)(()=>(e.widgets??[]).map(e=>e.id).filter(e=>!!e),[e.widgets]),de=(0,a.useMemo)(()=>(e.widgets??[]).filter(e=>e.type===`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]),fe=(0,a.useMemo)(()=>(e.widgets??[]).filter(e=>e.type!==`metric`).map(e=>e.id).filter(e=>!!e),[e.widgets]);if(P){let n=e.widgets?.filter(e=>e.type===`metric`)||[],r=e.widgets?.filter(e=>e.type!==`metric`)||[],a=(0,u.jsxs)(`div`,{ref:O,className:(0,i.cn)(`flex flex-col gap-4 px-4`,t),"data-user-actions":ce,onClick:X,...E,children:[oe,le,n.length>0&&(0,u.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,onClick:X,children:(0,u.jsx)(c.SortableContext,{items:de,strategy:c.rectSortingStrategy,disabled:!Z,children:n.map((e,t)=>ae(e,t))})}),r.length>0&&(0,u.jsx)(`div`,{className:`flex flex-col gap-4`,onClick:X,children:(0,u.jsx)(c.SortableContext,{items:fe,strategy:c.verticalListSortingStrategy,disabled:!Z,children:r.map((e,t)=>ae(e,t,!0))})})]});return Z?(0,u.jsx)(s.DndContext,{sensors:Q,collisionDetection:s.closestCenter,onDragEnd:ie,children:a}):a}let pe=e.columns!=null||k!==4,me=(0,u.jsxs)(`div`,{ref:O,className:(0,i.cn)(`grid auto-rows-min`,!pe&&`grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`,t),style:{...pe&&{gridTemplateColumns:`repeat(${A}, minmax(0, 1fr))`},gap:`${j*.25}rem`},"data-user-actions":ce,onClick:X,...E,children:[oe,le,(0,u.jsx)(c.SortableContext,{items:ue,strategy:c.rectSortingStrategy,disabled:!Z,children:e.widgets?.map((e,t)=>ae(e,t))})]});return Z?(0,u.jsx)(s.DndContext,{sensors:Q,collisionDetection:s.closestCenter,onDragEnd:ie,children:me}):me});function k({editMode:e}){let t=(0,n.useDnd)();return a.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:r,onSchemaChange:s,onRefresh:c})=>{let{width:l,containerRef:f,mounted:p}=(0,d.useContainerWidth)(),[m,h]=a.useState(!1),[g,_]=a.useState(!1),v=(0,n.useHasDndProvider)(),y=a.useRef(null),b=a.useCallback(()=>{c&&(_(!0),c(),setTimeout(()=>_(!1),600))},[c]);a.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]=a.useState(()=>M(e)),w=a.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]);a.useEffect(()=>{C(M(e))},[w]);let T=a.useCallback((e,t)=>{C(t),r?.(e)},[r]),E=a.useCallback(()=>{s?s(j(e,S.lg)):globalThis.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=a.useCallback(()=>{C(M(e))},[e]),O=a.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,u.jsxs)(`div`,{ref:f,className:(0,i.cn)(`w-full`,t),"data-testid":`grid-layout`,children:[v&&(0,u.jsx)(k,{editMode:m}),(0,u.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,u.jsx)(`h2`,{className:`text-2xl font-bold`,children:e.title||`Dashboard`}),(0,u.jsx)(`div`,{className:`flex gap-2`,children:m?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(i.Button,{onClick:E,size:`sm`,variant:`default`,children:[(0,u.jsx)(o.Save,{className:`h-4 w-4 mr-2`}),`Save Layout`]}),(0,u.jsxs)(i.Button,{onClick:D,size:`sm`,variant:`outline`,children:[(0,u.jsx)(o.X,{className:`h-4 w-4 mr-2`}),`Reset`]}),(0,u.jsx)(i.Button,{onClick:()=>h(!1),size:`sm`,variant:`ghost`,children:`Cancel`})]}):(0,u.jsxs)(u.Fragment,{children:[c&&(0,u.jsxs)(i.Button,{onClick:b,size:`sm`,variant:`outline`,disabled:g,"aria-label":`Refresh dashboard`,children:[(0,u.jsx)(o.RefreshCw,{className:(0,i.cn)(`h-4 w-4 mr-2`,g&&`animate-spin`)}),g?`Refreshing…`:`Refresh All`]}),(0,u.jsxs)(i.Button,{onClick:()=>h(!0),size:`sm`,variant:`outline`,children:[(0,u.jsx)(o.Edit,{className:`h-4 w-4 mr-2`}),`Edit Layout`]})]})})]}),p&&(0,u.jsx)(d.ResponsiveGridLayout,{className:`layout`,width:l,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 r=e.id||`widget-${t}`,a=O(e);return(0,u.jsx)(`div`,{className:`h-full`,children:e.type===`metric`?(0,u.jsxs)(`div`,{className:`h-full w-full relative`,children:[m&&(0,u.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,u.jsx)(o.GripVertical,{className:`h-4 w-4`})}),(0,u.jsx)(n.SchemaRenderer,{schema:a,className:`h-full w-full`})]}):(0,u.jsxs)(i.Card,{className:(0,i.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,u.jsxs)(i.CardHeader,{className:`pb-2 border-b border-border/40 bg-muted/20 flex flex-row items-center justify-between`,children:[(0,u.jsx)(i.CardTitle,{className:`text-base font-medium tracking-tight truncate`,title:e.title,children:e.title}),m&&(0,u.jsx)(`div`,{className:`drag-handle cursor-move p-1 hover:bg-muted/40 rounded`,children:(0,u.jsx)(o.GripVertical,{className:`h-4 w-4`})})]}),(0,u.jsx)(i.CardContent,{className:`p-0 h-full`,children:(0,u.jsx)(`div`,{className:(0,i.cn)(`h-full w-full overflow-auto p-4`),children:(0,u.jsx)(n.SchemaRenderer,{schema:a})})})]})},r)})})]})},P=(0,r.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:r,className:s,description:c,loading:l,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,a.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,a.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,a.useMemo)(()=>{if(typeof r==`string`){let e=(0,i.getLazyIcon)(r);return e?(0,u.jsx)(e,{className:`h-4 w-4`}):null}return r},[r]);return(0,u.jsxs)(i.Card,{className:(0,i.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,u.jsxs)(i.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm font-medium truncate`,children:L(e)}),C&&(0,u.jsx)(`div`,{className:(0,i.cn)(`flex h-8 w-8 items-center justify-center rounded-md shrink-0`,y),children:C})]}),(0,u.jsx)(i.CardContent,{children:l?(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-loading`,children:[(0,u.jsx)(o.Loader2,{className:`h-4 w-4 animate-spin`}),(0,u.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-error`,role:`alert`,children:[(0,u.jsx)(o.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,u.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`text-2xl font-bold truncate`,children:S}),(n||c)&&(0,u.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,u.jsxs)(`span`,{className:(0,i.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,u.jsx)(o.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),n.direction===`down`&&(0,u.jsx)(o.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),n.direction===`neutral`&&(0,u.jsx)(o.MinusIcon,{className:`h-3 w-3 mr-1`}),n.value,`%`]}),(0,u.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:r,trendValue:a,description:s,className:c,loading:l,error:d,...f})=>{let p=n?(0,i.getLazyIcon)(n):null;return(0,u.jsxs)(i.Card,{className:(0,i.cn)(`h-full`,c),...f,children:[(0,u.jsxs)(i.CardHeader,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,u.jsx)(i.CardTitle,{className:`text-sm font-medium`,children:B(e)}),p&&(0,u.jsx)(p,{className:`h-4 w-4 text-muted-foreground`})]}),(0,u.jsx)(i.CardContent,{children:l?(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,"data-testid":`metric-card-loading`,children:[(0,u.jsx)(o.Loader2,{className:`h-4 w-4 animate-spin`}),(0,u.jsx)(`span`,{className:`text-sm`,children:`Loading…`})]}):d?(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`metric-card-error`,role:`alert`,children:[(0,u.jsx)(o.AlertCircle,{className:`h-4 w-4 text-destructive shrink-0`}),(0,u.jsx)(`span`,{className:`text-xs text-destructive truncate`,children:d})]}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),(r||a||s)&&(0,u.jsxs)(`p`,{className:`text-xs text-muted-foreground flex items-center mt-1`,children:[r&&a&&(0,u.jsxs)(`span`,{className:(0,i.cn)(`flex items-center mr-2`,r===`up`&&`text-green-500`,r===`down`&&`text-red-500`,r===`neutral`&&`text-yellow-500`),children:[r===`up`&&(0,u.jsx)(o.ArrowUpIcon,{className:`h-3 w-3 mr-1`}),r===`down`&&(0,u.jsx)(o.ArrowDownIcon,{className:`h-3 w-3 mr-1`}),r===`neutral`&&(0,u.jsx)(o.MinusIcon,{className:`h-3 w-3 mr-1`}),a]}),B(s)]})]})})]})},H=({objectName:e,aggregate:r,filter:o,label:s,fallbackValue:c,trend:l,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,a.useContext)(n.SchemaRendererContext),w=m||C?.dataSource,[T,E]=(0,a.useState)(!1),[D,O]=(0,a.useState)(null),[k,A]=(0,a.useState)(!1),[j,M]=(0,a.useState)(null),[N,P]=(0,a.useState)(null);(0,a.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,a.useMemo)(()=>{let e=r?.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,r?.field]),I=(0,a.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]),L=(0,a.useMemo)(()=>{if(_)return _;if(F?.type===`currency`)return F.defaultCurrency||F.currency||void 0},[_,F]),R=(0,a.useMemo)(()=>r?JSON.stringify(r):``,[r]),B=(0,a.useMemo)(()=>(0,t.resolveDateMacros)(o),[o]),V=(0,a.useCallback)(async(t,n)=>{if(!(!t||!e)){n.current&&(A(!0),M(null));try{let i;if(r&&typeof t.aggregate==`function`){let n=await t.aggregate(e,{field:r.field,function:r.function,groupBy:r.groupBy||`_all`,filter:B}),a=Array.isArray(n)?n:[];if(a.length===0)i=0;else if(r.function===`count`){let e=`${r.field}_count`;i=a.reduce((t,n)=>t+(Number(n[e])||Number(n[r.field])||Number(n.count)||0),0)}else{let e=a[0];i=e[`${r.field}_${r.function}`]??e[r.field]??e.value??0}}else if(typeof t.find==`function`){let n=await t.find(e,{$filter:B});i=(Array.isArray(n)?n:n?.data||n?.records||[]).length}else return;n.current&&O(i)}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,R,(0,a.useMemo)(()=>B?JSON.stringify(B):``,[B])]);(0,a.useEffect)(()=>{let t={current:!0};return w&&e?V(w,t):(O(null),M(null)),()=>{t.current=!1}},[w,e,V]);let H=D===null?w?`—`:c??`—`:D;b&&typeof H==`number`&&isFinite(H)&&H>=0&&H<=1&&(H=1-H);let U=(0,t.isDrillEnabled)(x)&&!!e&&!!w,W=(0,a.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]),G=(0,a.useMemo)(()=>{if(!U)return null;let t=x?.target??`drawer`,r=x?.report,a=r&&typeof r==`object`&&(Array.isArray(r.columns)||`objectName`in r),o;if(a){let e=r.filter,t=e?B?{$and:[e,B]}:e:B;o=(0,u.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,u.jsx)(n.SchemaRenderer,{schema:{type:`spec-report`,...r,filter:t}})})}else o=(0,u.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,u.jsx)(n.SchemaRenderer,{schema:{type:`object-data-table`,objectName:e,filter:B,pageSize:25,drillDown:{enabled:!1}}})});return t===`dialog`?(0,u.jsx)(i.Dialog,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,u.jsxs)(i.DialogContent,{className:`max-w-5xl`,children:[(0,u.jsx)(i.DialogHeader,{children:(0,u.jsx)(i.DialogTitle,{children:W})}),o]})}):(0,u.jsx)(i.Sheet,{open:!0,onOpenChange:e=>!e&&E(!1),children:(0,u.jsxs)(i.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-5xl flex flex-col`,children:[(0,u.jsx)(i.SheetHeader,{children:(0,u.jsx)(i.SheetTitle,{children:W})}),(0,u.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:o})]})})},[U,x,e,B,W]);return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(z,{label:s,value:H,trend:l,icon:d,className:f,description:p,loading:k,error:j,colorVariant:h,format:I,currency:L,prefix:v,suffix:y,onClick:U?()=>E(!0):void 0}),T&&G]})};function U(){try{let{t:e}=(0,r.useObjectTranslation)(),t=e(`dashboard.total`);return!t||t===`dashboard.total`?`Total`:t}catch{return`Total`}}function W(){try{let{t:e}=(0,r.useObjectTranslation)(),t=e(`dashboard.noDataAvailable`);return!t||t===`dashboard.noDataAvailable`?`No data available`:t}catch{return`No data available`}}function G(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 ee=`—`;function K(e,t){return e===``?ee:t?.[e]??e}function q(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 J=({schema:e,className:n,rowLabels:r,columnLabels:o,rowFieldLabel:s,onDrillDown:c})=>{let{title:l,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:r?.[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,a.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=q(i,m);a[e][r]=o,t.push(...i),!s[r]&&s[r]}o[e]=q(t,m)}for(let e of i){let t=[];for(let i of r){let r=n[i]?.[e]??[];t.push(...r)}s[e]=q(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:q(c,m)}},[D,d,f,p,m]),P=e=>G(e,v);return D.length===0?(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,n),children:[l&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:l}),(0,u.jsx)(i.DataEmptyState,{"data-testid":`pivot-empty-state`,className:`py-8 gap-2 [&>h3]:hidden`,icon:(0,u.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,className:`h-8 w-8 opacity-40`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,u.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`}),(0,u.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`})]}),iconWrapperClassName:``,title:``,description:S})]}):(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,n),children:[l&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:l}),(0,u.jsxs)(`table`,{className:`w-full text-sm border-collapse table-auto`,role:`table`,children:[(0,u.jsx)(`thead`,{children:(0,u.jsxs)(`tr`,{className:`border-b border-border`,children:[(0,u.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,u.jsx)(`th`,{className:(0,i.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:K(e,o)},e)}),g&&(0,u.jsx)(`th`,{className:`text-right p-2 font-semibold text-muted-foreground bg-muted/20 whitespace-nowrap`,children:x})]})}),(0,u.jsx)(`tbody`,{children:O.map(e=>(0,u.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-muted/30`,children:[(0,u.jsx)(`td`,{className:(0,i.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:K(e,r)}),k.map(t=>{let n=A[e]?.[t]??0,r=()=>w({scope:`cell`,rowKey:e,colKey:t,value:n});return(0,u.jsx)(`td`,{className:(0,i.cn)(`text-right p-2 tabular-nums`,y?.[t],E),role:C?`button`:void 0,tabIndex:C?0:void 0,onClick:C?r:void 0,onKeyDown:C?T(r):void 0,"aria-label":C?`Drill into ${d}=${e||`(empty)`}, ${f}=${t||`(empty)`}`:void 0,children:P(n)},t)}),g&&(0,u.jsx)(`td`,{className:(0,i.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,u.jsx)(`tfoot`,{children:(0,u.jsxs)(`tr`,{className:`border-t-2 border-border font-semibold bg-muted/40`,children:[(0,u.jsx)(`td`,{className:`p-2`,children:x}),k.map(e=>(0,u.jsx)(`td`,{className:(0,i.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,u.jsx)(`td`,{className:(0,i.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 te(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 ne(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:o,className:s})=>{let c=(0,a.useContext)(n.SchemaRendererContext),l=o||c?.dataSource,d=(0,n.useDataScope)(e.bind),{fieldLabel:f,fieldOptionLabel:m}=(0,r.useSafeFieldLabel)(),h=`No data available`,g=`No data source available for`;try{let{t:e}=(0,r.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,a.useState)([]),[y,b]=(0,a.useState)(null),[x,S]=(0,a.useState)(()=>!(Array.isArray(e.data)&&e.data.length>0)&&!!e.objectName),[C,w]=(0,a.useState)(null);(0,a.useEffect)(()=>{let n=!0;return e.objectName&&!d&&(!e.data||e.data.length===0)?(async()=>{if(!l||!e.objectName){n&&S(!1);return}n&&(S(!0),w(null));try{let r;if(typeof l.find==`function`){let n=ne(e,y),i={$filter:(0,t.resolveDateMacros)(e.filter)};n.length&&(i.$expand=n),r=(0,t.extractRecords)(await l.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&&S(!1),()=>{n=!1}},[e.objectName,l,d,e.data,e.filter,y]),(0,a.useEffect)(()=>{let t=!0;if(!(!l||!e.objectName||typeof l.getObjectSchema!=`function`))return l.getObjectSchema(e.objectName).then(e=>{t&&b(e)}).catch(()=>{}),()=>{t=!1}},[e.objectName,l]);let T=d||e.data||_,E=Array.isArray(T)?T:[],D=(0,a.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?f(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 l=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,u.jsx)((0,p.getCellRenderer)((0,p.resolveCellRendererType)(o)),{value:e,field:o})};return{...e,...o,align:c,cell:l}};if(e.columns&&e.columns.length>0){let n=te(e.columns);return(t?n.map(e=>({...e,header:f(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,f,m]);if(x&&E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-loading`,children:(0,u.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-1/4`})]}),[1,2,3,4].map(e=>(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-1/4`})]},e))]})});if(C)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-error`,children:(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`table-error-message`,children:[(0,u.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,u.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,u.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,u.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:C})]})});if(!l&&e.objectName&&E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),children:(0,u.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,u.jsxs)(`p`,{className:`text-xs`,children:[g,` “`,e.objectName,`”`]})})});if(E.length===0)return(0,u.jsx)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`table-empty-state`,children:(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:[(0,u.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,u.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,u.jsx)(`line`,{x1:`3`,y1:`9`,x2:`21`,y2:`9`}),(0,u.jsx)(`line`,{x1:`9`,y1:`21`,x2:`9`,y2:`9`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:h})]})});let O={...e,type:`data-table`,data:E,columns:D};return(0,u.jsxs)(`div`,{className:(0,i.cn)(`relative`,s),children:[(0,u.jsx)(i.RefreshIndicator,{active:x&&E.length>0}),(0,u.jsx)(n.SchemaRenderer,{schema:O,className:s})]})},re=({open:e,onClose:t,title:r,target:a=`drawer`,objectName:o,filter:s,dataSource:c,columns:l,maxRows:d,className:f,report:p})=>{let m=p&&typeof p==`object`&&(Array.isArray(p.columns)||`objectName`in p),h=(0,u.jsx)(`div`,{className:(0,i.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,u.jsx)(n.SchemaRenderer,{schema:{...p,type:`spec-report`,report:{...p,filter:t},filter:t}})})():(0,u.jsx)(Y,{schema:{type:`object-data-table`,objectName:o,filter:s,columns:l?.map(e=>({accessorKey:e,header:e})),pagination:!0,searchable:!1,pageSize:d},dataSource:c})});return a===`dialog`?(0,u.jsx)(i.Dialog,{open:e,onOpenChange:e=>!e&&t(),children:(0,u.jsxs)(i.DialogContent,{className:`max-w-5xl`,children:[(0,u.jsx)(i.DialogHeader,{children:(0,u.jsx)(i.DialogTitle,{children:r})}),h]})}):(0,u.jsx)(i.Sheet,{open:e,onOpenChange:e=>!e&&t(),children:(0,u.jsxs)(i.SheetContent,{side:`right`,className:`w-full sm:max-w-2xl md:max-w-3xl lg:max-w-4xl flex flex-col`,children:[(0,u.jsx)(i.SheetHeader,{children:(0,u.jsx)(i.SheetTitle,{children:r})}),(0,u.jsx)(`div`,{className:`flex-1 overflow-hidden mt-2`,children:h})]})})},X=({schema:e,dataSource:o,className:s})=>{let c=(0,a.useContext)(n.SchemaRendererContext),l=o||c?.dataSource,d=(0,n.useDataScope)(e.bind),[f,p]=(0,a.useState)([]),[m,h]=(0,a.useState)(!1),[g,_]=(0,a.useState)(null),[v,y]=(0,a.useState)({}),[b,x]=(0,a.useState)({}),[S,C]=(0,a.useState)(null),{fieldLabel:w,fieldOptionLabel:T}=(0,r.useSafeFieldLabel)(),E=(0,a.useRef)(w),D=(0,a.useRef)(T);(0,a.useEffect)(()=>{E.current=w,D.current=T},[w,T]),(0,a.useEffect)(()=>{if(!l||!e.objectName)return;let t=l.getObjectSchema;if(typeof t!=`function`)return;let n=!0;return Promise.resolve(t.call(l,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}},[l,e.objectName]),(0,a.useEffect)(()=>{let n=!0;return e.objectName&&!d&&(!e.data||e.data.length===0)&&(async()=>{if(!(!l||!e.objectName)){n&&(h(!0),_(null));try{let r;if(typeof l.find==`function`)r=(0,t.extractRecords)(await l.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,l,d,e.data,e.filter]);let O=d||e.data||f,k=Array.isArray(O)?O:[];if(m&&k.length===0)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`pivot-loading`,children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`space-y-2 p-2`,children:[(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-6 w-24`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-6 w-20`})]}),[1,2,3].map(e=>(0,u.jsxs)(`div`,{className:`flex gap-2`,children:[(0,u.jsx)(i.Skeleton,{className:`h-5 w-24`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`}),(0,u.jsx)(i.Skeleton,{className:`h-5 w-20`})]},e))]})]});if(g)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),"data-testid":`pivot-error`,children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8 text-destructive`,"data-testid":`pivot-error-message`,children:[(0,u.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,u.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,u.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,u.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,u.jsx)(`p`,{className:`text-xs`,children:g})]})]});if(!l&&e.objectName&&k.length===0)return(0,u.jsxs)(`div`,{className:(0,i.cn)(`overflow-auto`,s),children:[e.title&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:e.title}),(0,u.jsx)(`div`,{className:`flex flex-col items-center justify-center py-8 text-muted-foreground`,children:(0,u.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,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(J,{schema:A,className:s,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,u.jsx)(re,{open:!0,onClose:()=>C(null),title:(0,t.resolveDrillTitle)(P,S,e.title||`Details`),target:P?.target??`drawer`,objectName:e.objectName,filter:r,dataSource:l,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:r,onFieldChange:a}){let{draft:o,isDirty:s,updateField:c,discard:l}=(0,i.useConfigDraft)(n,{onUpdate:a});return(0,u.jsx)(i.ConfigPanelRenderer,{open:e,onClose:t,schema:Z,draft:o,isDirty:s,onFieldChange:c,onSave:()=>r(o),onDiscard:l})}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,r){return{key:e,label:t,type:`custom`,render:(a,o,s)=>(0,u.jsx)(i.ConfigRow,{label:t,children:(0,u.jsx)(`div`,{"data-testid":`config-field-${e}`,children:(0,u.jsx)(i.Combobox,{options:r??[],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 r=e&&e.length>0,a=r?{key:`object`,label:`Data source`,type:`custom`,render:(t,n)=>(0,u.jsx)(i.ConfigRow,{label:`Data source`,children:(0,u.jsx)(`div`,{"data-testid":`config-field-object`,children:(0,u.jsx)(i.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=r?{...$(`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=r?{...$(`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=r?$(`rowField`,`Field`,`Select row field…`,t):{key:`rowField`,label:`Field`,type:`input`,placeholder:`e.g. owner`},l=r?$(`columnField`,`Field`,`Select column field…`,t):{key:`columnField`,label:`Field`,type:`input`,placeholder:`e.g. stage`},d=r?$(`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:[l,{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:r,onFieldChange:o,headerExtra:s,availableObjects:c,availableFields:l}){let{draft:d,isDirty:f,updateField:p,discard:m}=(0,i.useConfigDraft)(a.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,u.jsx)(i.ConfigPanelRenderer,{open:e,onClose:t,schema:a.useMemo(()=>xe(c,l,d.type),[c,l,d.type]),draft:d,isDirty:f,onFieldChange:p,onSave:()=>r(Ce(d)),onDiscard:m,headerExtra:s})}function Te({schema:e,config:t,onConfigSave:n,onWidgetSave:r,onRefresh:s,recordCount:c,defaultConfigOpen:l=!1,className:d}){let[f,p]=(0,a.useState)(l),[m,h]=(0,a.useState)(null),[g,_]=(0,a.useState)(e),[v,y]=(0,a.useState)(0);(0,a.useEffect)(()=>{_(e),y(e=>e+1)},[e]);let b=a.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,a.useCallback)(e=>{h(e),p(!0)},[]),S=(0,a.useCallback)(()=>{h(null)},[]),C=(0,a.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,a.useCallback)(e=>{if(m&&r){let{drillDownEnabled:t,drillDownTarget:n,...i}=e,a={...i};(t||n)&&(a.options={...i.options||{},drillDown:{...i.options?.drillDown||{},...t===void 0?{}:{enabled:!!t},...n===void 0?{}:{target:n}}}),r(m,a)}h(null),y(e=>e+1)},[m,r]),T=(0,a.useCallback)(()=>{p(e=>!e),h(null)},[]);return(0,u.jsxs)(`div`,{className:(0,i.cn)(`flex h-full w-full`,d),"data-testid":`dashboard-with-config`,children:[(0,u.jsxs)(`div`,{className:`flex-1 min-w-0 overflow-auto relative`,children:[(0,u.jsx)(`div`,{className:`absolute top-2 right-2 z-10`,children:(0,u.jsxs)(i.Button,{size:`sm`,variant:f?`default`:`outline`,onClick:T,"data-testid":`dashboard-config-toggle`,children:[(0,u.jsx)(o.Settings,{className:`h-3.5 w-3.5 mr-1`}),`Settings`]})}),(0,u.jsx)(O,{schema:g,onRefresh:s,recordCount:c,designMode:f,selectedWidgetId:m,onWidgetClick:x})]}),f&&(0,u.jsx)(`div`,{className:`relative shrink-0`,children:m&&b?(0,u.jsx)(we,{open:!0,onClose:S,config:b,onSave:w,onFieldChange:C}):(0,u.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`,J,{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`,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:J,ObjectPivotTable:X,ObjectDataTable:Y,DashboardConfigPanel:Q,WidgetConfigPanel:we,DashboardWithConfig:Te};e.DashboardConfigPanel=Q,e.DashboardGridLayout=N,e.DashboardRenderer=O,e.DashboardWithConfig=Te,e.DrillDownDrawer=re,e.MetricCard=V,e.MetricWidget=z,e.ObjectDataTable=Y,e.ObjectMetricWidget=H,e.ObjectPivotTable=X,e.PivotTable=J,e.WidgetConfigPanel=we,e.dashboardComponents=Ee});
|
|
@@ -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;;;;;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,
|
|
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,CA+QhE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-dashboard",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.2",
|
|
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": "5.4.
|
|
27
|
-
"@object-ui/core": "5.4.
|
|
28
|
-
"@object-ui/i18n": "5.4.
|
|
29
|
-
"@object-ui/fields": "5.4.
|
|
30
|
-
"@object-ui/react": "5.4.
|
|
31
|
-
"@object-ui/types": "5.4.
|
|
26
|
+
"@object-ui/components": "5.4.2",
|
|
27
|
+
"@object-ui/core": "5.4.2",
|
|
28
|
+
"@object-ui/i18n": "5.4.2",
|
|
29
|
+
"@object-ui/fields": "5.4.2",
|
|
30
|
+
"@object-ui/react": "5.4.2",
|
|
31
|
+
"@object-ui/types": "5.4.2"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": "^18.0.0 || ^19.0.0",
|