@object-ui/plugin-report 17.6.0 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2136 -0
- package/README.md +98 -14
- package/dist/DatasetReportRenderer.d.ts +17 -3
- package/dist/LiveReportExporter.d.ts +19 -0
- package/dist/ReportExportEngine.d.ts +18 -3
- package/dist/ReportRenderer.d.ts +2 -2
- package/dist/displayLocale.d.ts +70 -0
- package/dist/formatValue.d.ts +19 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.js +537 -461
- package/dist/index.umd.cjs +22 -22
- package/dist/useDatasetDimensionLabels.d.ts +5 -3
- package/package.json +12 -15
package/dist/index.umd.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@object-ui/core"),require("react"),require("@object-ui/types"),require("@object-ui/react"),require("@object-ui/components"),require("react/jsx-runtime"),require("lucide-react"),require("@object-ui/fields"),require("@object-ui/i18n")):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`react`,`@object-ui/types`,`@object-ui/react`,`@object-ui/components`,`react/jsx-runtime`,`lucide-react`,`@object-ui/fields`,`@object-ui/i18n`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginReport={},e.ObjectUICore,e.React,e.ObjectUITypes,e.ObjectUIReact,e.ObjectUIComponents,e.react_jsx_runtime,e.lucide_react,e._object_ui_fields,e._object_ui_i18n))})(this,function(e,t,n,r,i,a,o,s,c,l){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var u=Object.create,d=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=p(t),a=0,o=i.length,s;a<o;a++)s=i[a],!h.call(e,s)&&s!==n&&d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=f(t,s))||r.enumerable});return e};n=((e,t,n)=>(n=e==null?{}:u(m(e)),g(t||!e||!e.__esModule||!h.call(e,`default`)?d(n,`default`,{value:e,enumerable:!0}):n,e)))(n,1);var _=({schema:e})=>{let{title:n,description:r,data:i,columns:s}=e;e.chart?.type;let c=!!e.chart;return(0,o.jsxs)(a.Card,{className:`h-full flex flex-col ${e.className||``}`,children:[(0,o.jsxs)(a.CardHeader,{children:[n&&(0,o.jsx)(a.CardTitle,{children:n}),r&&(0,o.jsx)(a.CardDescription,{children:r})]}),(0,o.jsxs)(a.CardContent,{className:`flex-1 overflow-auto space-y-4`,children:[c&&(()=>{let n=e.chart?.type,r=n?t.ComponentRegistry.get(n):null;return r||=t.ComponentRegistry.get(`chart`),r?(0,o.jsx)(`div`,{className:`min-h-[300px] border rounded-lg p-4 bg-background/50`,children:(0,o.jsx)(r,{schema:{...e.chart,data:e.chart.data||i}})}):(0,o.jsxs)(`div`,{className:`min-h-[100px] border rounded-md p-4 bg-muted/20 text-muted-foreground flex items-center justify-center`,children:[`Unknown component type: `,n||`chart`]})})(),i&&i.length>0&&(0,o.jsx)(`div`,{className:`border rounded-lg`,children:(()=>{let e=t.ComponentRegistry.get(`grid`)||t.ComponentRegistry.get(`table`);return e?(0,o.jsx)(e,{schema:{type:`grid`,rowData:i,columnDefs:s,domLayout:`autoHeight`}}):(0,o.jsx)(`div`,{className:`overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm text-left`,children:[(0,o.jsx)(`thead`,{className:`text-xs uppercase bg-muted`,children:(0,o.jsx)(`tr`,{children:s?.map(e=>(0,o.jsx)(`th`,{className:`px-6 py-3`,children:e.headerName||e.label||e.field},e.field))})}),(0,o.jsx)(`tbody`,{children:i.map((e,t)=>(0,o.jsx)(`tr`,{className:`bg-background border-b`,children:s?.map(t=>(0,o.jsx)(`td`,{className:`px-6 py-4`,children:e[t.field]},t.field))},t))})]})})})()})]})]})};function v(e,t,n){let r=e.fields||[],i=r.map(e=>e.label||e.name),a=t.map(e=>r.map(t=>{let n=e[t.name];return n=
|
|
2
|
-
`))?`"${n.replace(/"/g,`""`)}"`:n??``}));
|
|
3
|
-
`),n?.filename||`${e.title||`report`}.csv`,`text/csv`)}function
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@object-ui/core"),require("react"),require("@object-ui/types"),require("@object-ui/react"),require("@object-ui/components"),require("react/jsx-runtime"),require("lucide-react"),require("@object-ui/fields"),require("@object-ui/i18n")):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`react`,`@object-ui/types`,`@object-ui/react`,`@object-ui/components`,`react/jsx-runtime`,`lucide-react`,`@object-ui/fields`,`@object-ui/i18n`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginReport={},e.ObjectUICore,e.React,e.ObjectUITypes,e.ObjectUIReact,e.ObjectUIComponents,e.react_jsx_runtime,e.lucide_react,e._object_ui_fields,e._object_ui_i18n))})(this,function(e,t,n,r,i,a,o,s,c,l){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var u=Object.create,d=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=p(t),a=0,o=i.length,s;a<o;a++)s=i[a],!h.call(e,s)&&s!==n&&d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=f(t,s))||r.enumerable});return e};n=((e,t,n)=>(n=e==null?{}:u(m(e)),g(t||!e||!e.__esModule||!h.call(e,`default`)?d(n,`default`,{value:e,enumerable:!0}):n,e)))(n,1);var _=({schema:e})=>{let{title:n,description:r,data:i,columns:s}=e;e.chart?.type;let c=!!e.chart;return(0,o.jsxs)(a.Card,{className:`h-full flex flex-col ${e.className||``}`,children:[(0,o.jsxs)(a.CardHeader,{children:[n&&(0,o.jsx)(a.CardTitle,{children:n}),r&&(0,o.jsx)(a.CardDescription,{children:r})]}),(0,o.jsxs)(a.CardContent,{className:`flex-1 overflow-auto space-y-4`,children:[c&&(()=>{let n=e.chart?.type,r=n?t.ComponentRegistry.get(n):null;return r||=t.ComponentRegistry.get(`chart`),r?(0,o.jsx)(`div`,{className:`min-h-[300px] border rounded-lg p-4 bg-background/50`,children:(0,o.jsx)(r,{schema:{...e.chart,data:e.chart.data||i}})}):(0,o.jsxs)(`div`,{className:`min-h-[100px] border rounded-md p-4 bg-muted/20 text-muted-foreground flex items-center justify-center`,children:[`Unknown component type: `,n||`chart`]})})(),i&&i.length>0&&(0,o.jsx)(`div`,{className:`border rounded-lg`,children:(()=>{let e=t.ComponentRegistry.get(`grid`)||t.ComponentRegistry.get(`table`);return e?(0,o.jsx)(e,{schema:{type:`grid`,rowData:i,columnDefs:s,domLayout:`autoHeight`}}):(0,o.jsx)(`div`,{className:`overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm text-left`,children:[(0,o.jsx)(`thead`,{className:`text-xs uppercase bg-muted`,children:(0,o.jsx)(`tr`,{children:s?.map(e=>(0,o.jsx)(`th`,{className:`px-6 py-3`,children:e.headerName||e.label||e.field},e.field))})}),(0,o.jsx)(`tbody`,{children:i.map((e,t)=>(0,o.jsx)(`tr`,{className:`bg-background border-b`,children:s?.map(t=>(0,o.jsx)(`td`,{className:`px-6 py-4`,children:e[t.field]},t.field))},t))})]})})})()})]})]})};function v(e,t,n){try{return e.toLocaleString(t,n)}catch{return e.toLocaleString(`en`,n)}}function y(e,t,n){let r=e.fields||[],i=r.map(e=>e.label||e.name),a=t.map(e=>r.map(t=>{let n=e[t.name];return n=E(n),typeof n==`string`&&(n.includes(`,`)||n.includes(`"`)||n.includes(`
|
|
2
|
+
`))?`"${n.replace(/"/g,`""`)}"`:n??``}));k([...n?.includeHeaders===!1?[]:[i.join(`,`)],...a.map(e=>e.join(`,`))].join(`
|
|
3
|
+
`),n?.filename||`${e.title||`report`}.csv`,`text/csv`)}function b(e,t,n){let r={title:e.title,description:e.description,generatedAt:new Date().toISOString(),data:t};k(JSON.stringify(r,null,2),n?.filename||`${e.title||`report`}.json`,`application/json`)}function x(e,t,n,r=`en`){let i=e.fields||[],a=O(n?.orientation),o=D(n?.pageSize);k(`<!DOCTYPE html>
|
|
4
4
|
<html>
|
|
5
5
|
<head>
|
|
6
6
|
<meta charset="utf-8">
|
|
7
|
-
<title>${
|
|
7
|
+
<title>${T(e.title||`Report`)}</title>
|
|
8
8
|
<style>
|
|
9
|
-
@page { size: ${
|
|
9
|
+
@page { size: ${o} ${a}; margin: 20mm; }
|
|
10
10
|
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; color: #333; }
|
|
11
11
|
h1 { font-size: 24px; margin-bottom: 8px; }
|
|
12
12
|
.description { color: #666; margin-bottom: 24px; }
|
|
@@ -18,21 +18,21 @@
|
|
|
18
18
|
</style>
|
|
19
19
|
</head>
|
|
20
20
|
<body>
|
|
21
|
-
<h1>${
|
|
22
|
-
${e.description?`<p class="description">${
|
|
23
|
-
<p class="meta">Generated: ${new Date().toLocaleString()}</p>
|
|
21
|
+
<h1>${T(e.title||`Report`)}</h1>
|
|
22
|
+
${e.description?`<p class="description">${T(e.description)}</p>`:``}
|
|
23
|
+
<p class="meta">Generated: ${new Date().toLocaleString(r)}</p>
|
|
24
24
|
<table>
|
|
25
|
-
<thead><tr>${
|
|
26
|
-
<tbody>${t.map(e=>`<tr>${
|
|
25
|
+
<thead><tr>${i.map(e=>`<th>${T(e.label||e.name)}</th>`).join(``)}</tr></thead>
|
|
26
|
+
<tbody>${t.map(e=>`<tr>${i.map(t=>`<td>${T(String(e[t.name]??``))}</td>`).join(``)}</tr>`).join(``)}</tbody>
|
|
27
27
|
</table>
|
|
28
28
|
</body>
|
|
29
|
-
</html>`,n?.filename||`${e.title||`report`}.html`,`text/html`)}function
|
|
29
|
+
</html>`,n?.filename||`${e.title||`report`}.html`,`text/html`)}function S(e,t,n,r=`en`){let i=e.fields||[],a=O(n?.orientation),o=D(n?.pageSize),s=window.open(``,`_blank`);if(!s){x(e,t,{...n,format:`html`,filename:n?.filename?.replace(/\.pdf$/,`.html`)||`${e.title||`report`}.html`},r);return}s.document.write(`<!DOCTYPE html>
|
|
30
30
|
<html>
|
|
31
31
|
<head>
|
|
32
32
|
<meta charset="utf-8">
|
|
33
|
-
<title>${
|
|
33
|
+
<title>${T(e.title||`Report`)}</title>
|
|
34
34
|
<style>
|
|
35
|
-
@page { size: ${
|
|
35
|
+
@page { size: ${o} ${a}; margin: 20mm; }
|
|
36
36
|
@media print { .no-print { display: none; } }
|
|
37
37
|
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; color: #333; }
|
|
38
38
|
h1 { font-size: 24px; margin-bottom: 8px; }
|
|
@@ -45,15 +45,15 @@ ${e.description?`<p class="description">${w(e.description)}</p>`:``}
|
|
|
45
45
|
</style>
|
|
46
46
|
</head>
|
|
47
47
|
<body>
|
|
48
|
-
<h1>${
|
|
49
|
-
${e.description?`<p class="description">${
|
|
50
|
-
<p class="meta">Generated: ${new Date().toLocaleString()}</p>
|
|
48
|
+
<h1>${T(e.title||`Report`)}</h1>
|
|
49
|
+
${e.description?`<p class="description">${T(e.description)}</p>`:``}
|
|
50
|
+
<p class="meta">Generated: ${new Date().toLocaleString(r)}</p>
|
|
51
51
|
<table>
|
|
52
|
-
<thead><tr>${
|
|
53
|
-
<tbody>${t.map(e=>`<tr>${
|
|
52
|
+
<thead><tr>${i.map(e=>`<th>${T(e.label||e.name)}</th>`).join(``)}</tr></thead>
|
|
53
|
+
<tbody>${t.map(e=>`<tr>${i.map(t=>`<td>${T(String(e[t.name]??``))}</td>`).join(``)}</tr>`).join(``)}</tbody>
|
|
54
54
|
</table>
|
|
55
55
|
</body>
|
|
56
|
-
</html>`),
|
|
57
|
-
`)||n.includes(` `))?`"${n.replace(/"/g,`""`)}"`:n??``}));
|
|
58
|
-
`),n?.filename||`${e.title||`report`}.tsv`,`text/tab-separated-values`)}function C(e,t,n,r){switch(e){case`csv`:v(t,n,r);break;case`json`:y(t,n,r);break;case`html`:b(t,n,r);break;case`pdf`:x(t,n,r);break;case`excel`:S(t,n,r);break;default:console.warn(`Unsupported export format: ${e}`)}}function w(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function T(e){if(typeof e==`string`&&e.length>0){let t=e.charAt(0);if(t===`=`||t===`+`||t===`-`||t===`@`||t===`|`)return`\t${e}`}return e}function E(e){return[`A4`,`A3`,`Letter`,`Legal`].includes(e||``)?e:`A4`}function D(e){return e===`landscape`?`landscape`:`portrait`}function O(e,t,n){let r=new Blob([e],{type:`${n};charset=utf-8`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}function k(e,t){if(e==null||e===``)return``;let n=t?.type,r=t?.format;if(n===`date`||r===`date`||A(e))return j(e);if(n===`number`||typeof e==`number`){let t=typeof e==`number`?e:Number(e);return isNaN(t)?String(e):r===`currency`||r===`currency_cny`?`¥${t.toLocaleString(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:0})}`:r===`currency_usd`?`$${t.toLocaleString(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:0})}`:r===`percent`?`${t.toLocaleString(`en-US`,{minimumFractionDigits:1,maximumFractionDigits:1})}%`:t.toLocaleString(`en-US`)}return String(e)}function A(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2})?/.test(e)}function j(e){try{let t=new Date(e);return isNaN(t.getTime())?String(e):`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}catch{return String(e)}}function M(e,t){if(!t||t.length===0||!e||e.length===0)return null;let n=t[0],r=n.field,i=new Map;for(let t of e){let e=String(t[r]??`(empty)`);i.has(e)||i.set(e,[]),i.get(e).push(t)}let a=[];for(let[e,t]of i)a.push({key:e,label:`${n.label||r}: ${e}`,rows:t});let o=n.sort===`desc`?-1:1;return a.sort((e,t)=>e.key.localeCompare(t.key)*o),a}function N(e,t,n){if(!e)return 0;let r=e.map(e=>Number(e[t])||0);switch(n){case`count`:return e.length;case`sum`:return r.reduce((e,t)=>e+t,0);case`avg`:return r.length>0?(r.reduce((e,t)=>e+t,0)/r.length).toFixed(2):0;case`min`:return r.length>0?Math.min(...r):0;case`max`:return r.length>0?Math.max(...r):0;case`distinct`:return new Set(e.map(e=>e[t])).size;default:return``}}var P=({schema:e,onRefresh:t})=>{let{report:r,data:u,showToolbar:d=!0,allowExport:f=!0,allowPrint:p=!0,loading:m=!1}=e,h=(0,l.useSafeTranslate)(),g=e=>{if(!r){console.warn(`ReportViewer: Cannot export, no report defined`);return}C(e,r,u||[],r.exportConfigs?.[e])},_=h(`common.printDialogHint`,`Opens your browser’s print dialog (not a PDF export)`),v=()=>{window.print()},y=()=>{t?.()},b=(e,t)=>N(u,e,t),x=(e,t)=>{let n=r?.conditionalFormatting;if(!(!n||!Array.isArray(n)))for(let r of n){if(r.field!==e)continue;let n=String(t??``),i=String(r.value??``),a=!1;switch(r.operator){case`equals`:a=n===i;break;case`not_equals`:a=n!==i;break;case`contains`:a=n.includes(i);break;case`greater_than`:a=Number(t)>Number(r.value);break;case`less_than`:a=Number(t)<Number(r.value)}if(a){let e={};return r.backgroundColor&&(e.backgroundColor=r.backgroundColor),r.textColor&&(e.color=r.textColor),e}}},S=(e,t)=>{if(e==null||e===``)return``;if(t.renderAs===`badge`&&(!t.type||t.type===`string`||t.type===`text`)){let n=t.colorMap?.[String(e)]||``;return(0,o.jsx)(a.Badge,{className:n,children:String(e)})}if(t.aggregation)return k(e,t);if(t.type){let n={...t};t.colorMap&&!n.options&&(n.options=Object.entries(t.colorMap).map(([e,t])=>({value:e,label:e,color:t})));let r=(0,c.getCellRenderer)((0,c.resolveCellRendererType)(n));return(0,o.jsx)(r,{value:e,field:n})}return k(e,t)};return r?(0,o.jsxs)(`div`,{className:`space-y-4`,children:[d&&(0,o.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-4 bg-card rounded-lg border`,children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`h2`,{className:`text-lg font-semibold`,children:r.title}),r.description&&(0,o.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:r.description})]}),(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,"data-print-hide":!0,children:[r.refreshInterval&&(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:y,children:[(0,o.jsx)(s.RefreshCw,{className:`h-4 w-4 mr-2`}),`Refresh`]}),p&&(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:v,"aria-label":`Print: ${_}`,title:_,children:[(0,o.jsx)(s.Printer,{className:`h-4 w-4 mr-2`}),`Print`]}),f&&r.showExportButtons&&(0,o.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>g(`pdf`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`PDF`]}),(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>g(`excel`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`Excel`]}),(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>g(`csv`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`CSV`]})]})]})]}),(0,o.jsxs)(a.Card,{children:[(0,o.jsxs)(a.CardHeader,{children:[!d&&r.title&&(0,o.jsx)(a.CardTitle,{children:r.title}),!d&&r.description&&(0,o.jsx)(a.CardDescription,{children:r.description})]}),(0,o.jsxs)(a.CardContent,{className:`space-y-6`,children:[m&&(0,o.jsxs)(`div`,{className:`space-y-6`,children:[(0,o.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[1,2,3].map(e=>(0,o.jsx)(a.Card,{children:(0,o.jsxs)(a.CardContent,{className:`p-4 space-y-2`,children:[(0,o.jsx)(a.Skeleton,{className:`h-4 w-20`}),(0,o.jsx)(a.Skeleton,{className:`h-8 w-28`})]})},e))}),(0,o.jsxs)(`div`,{className:`space-y-2`,children:[(0,o.jsx)(a.Skeleton,{className:`h-10 w-full`}),[1,2,3,4,5].map(e=>(0,o.jsx)(a.Skeleton,{className:`h-8 w-full`},e))]})]}),!m&&r.sections?.map((e,t)=>e.visible===!1?null:(0,o.jsxs)(`div`,{className:`space-y-2`,children:[e.title&&e.type!==`header`&&(0,o.jsx)(`h3`,{className:`text-lg font-semibold border-b pb-2`,children:e.title}),e.type===`header`&&e.title&&(0,o.jsx)(`div`,{className:`text-2xl font-bold py-4`,children:e.title}),e.type===`summary`&&(0,o.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:r.fields?.filter(e=>e.showInSummary).map((e,t)=>(0,o.jsx)(a.Card,{children:(0,o.jsxs)(a.CardContent,{className:`p-4`,children:[(0,o.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:e.label||e.name}),(0,o.jsx)(`div`,{className:`text-2xl font-bold`,children:k(b(e.name,e.aggregation),e)})]})},t))}),e.type===`table`&&(0,o.jsx)(`div`,{className:`border rounded-lg overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm min-w-[600px]`,children:[(0,o.jsx)(`thead`,{className:`bg-muted`,children:(0,o.jsx)(`tr`,{children:e.columns?.map((e,t)=>(0,o.jsx)(`th`,{className:`px-4 py-2 font-medium ${e.type===`number`?`text-right`:`text-left`}`,children:e.label||e.name},t))})}),(0,o.jsx)(`tbody`,{children:(()=>{let t=M(u||[],r.groupBy||[]);return t?t.map(t=>(0,o.jsxs)(n.default.Fragment,{children:[(0,o.jsx)(`tr`,{className:`bg-muted/60`,children:(0,o.jsxs)(`td`,{colSpan:e.columns?.length||1,className:`px-4 py-2 font-semibold text-sm`,children:[t.label,` (`,t.rows.length,`)`]})}),t.rows.map((t,n)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:e.columns?.map((e,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${e.type===`number`?`text-right tabular-nums`:``}`,style:x(e.name,t[e.name]),children:S(t[e.name],e)},n))},n))]},t.key)):u?.map((t,n)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:e.columns?.map((e,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${e.type===`number`?`text-right tabular-nums`:``}`,style:x(e.name,t[e.name]),children:S(t[e.name],e)},n))},n))})()})]})}),e.type===`text`&&e.text&&(0,o.jsx)(`div`,{className:`prose max-w-none`,children:(0,o.jsx)(`p`,{children:e.text})}),e.type===`page-break`&&(0,o.jsx)(`div`,{className:`border-t-2 border-dashed my-8 print:page-break-after-always`}),Array.isArray(e.content)?e.content.map((e,t)=>(0,o.jsx)(i.SchemaRenderer,{schema:(0,i.toRenderableSchema)(e)},t)):e.content&&(0,o.jsx)(i.SchemaRenderer,{schema:(0,i.toRenderableSchema)(e.content)})]},t)),!r.sections&&u&&u.length>0&&(0,o.jsx)(`div`,{className:`border rounded-lg overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm min-w-[600px]`,children:[(0,o.jsx)(`thead`,{className:`bg-muted`,children:(0,o.jsx)(`tr`,{children:r.fields?.map((e,t)=>(0,o.jsx)(`th`,{className:`px-4 py-2 font-medium ${e.type===`number`?`text-right`:`text-left`}`,children:e.label||e.name},t))})}),(0,o.jsx)(`tbody`,{children:u.map((e,t)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:r.fields?.map((t,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${t.type===`number`?`text-right tabular-nums`:``}`,style:x(t.name,e[t.name]),children:S(e[t.name],t)},n))},t))})]})})]})]})]}):(0,o.jsx)(a.Card,{children:(0,o.jsx)(a.CardContent,{className:`p-8 text-center text-muted-foreground`,children:`No report to display`})})};function F(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataset==`string`&&t.dataset.length>0||t.type===`joined`&&Array.isArray(t.blocks)&&t.blocks.some(e=>typeof e?.dataset==`string`)}var I=new Set,ee=()=>globalThis.process?.env?.NODE_ENV!==`production`;function L(e,t){if(!ee())return;let n=e.filter;if(n===void 0)return;let r=`${t}:${n&&typeof n==`object`?Object.keys(n).sort().join(`,`):String(n)}`;I.has(r)||(I.add(r),console.warn(`[ObjectUI] ${t} carries \`filter\`, which is not an authorable key. Did you mean \`filter\` → \`runtimeFilter\`? NO filter was applied — it renders UNFILTERED, showing rows the report was scoped to exclude. \`ReportSchema\` (\`@objectstack/spec\`) is strict and rejects \`filter\`, so this document did not come through the validated path; the renderer no longer reads it either. Fix the producer: rename \`filter\` to \`runtimeFilter\`. (objectui#5137)`))}function te(e){return`Report \`${e.name??`(unnamed)`}\``}function R(e,t){return e?typeof e==`string`?e:typeof e==`object`&&typeof e.default==`string`?e.default:t:t}function z(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&!!e):[]}function B(e){if(!Array.isArray(e))return;let t={};for(let n of e){let e=n&&typeof n==`object`?n.by:void 0;typeof e!=`string`||!e||(t[e]=n.direction===`desc`?`desc`:`asc`)}return Object.keys(t).length>0?t:void 0}function ne(e,t,n){if(!e)return;let r=new Set([...t,...n]),i={};for(let[t,n]of Object.entries(e))r.has(t)&&(i[t]=n);return Object.keys(i).length>0?i:void 0}function V(e,t,r,i,a,o,s){let[c,l]=n.useState({status:`idle`,rows:[]}),u=ne(s,t,r),d=JSON.stringify(i??null),f=JSON.stringify(o??null),p=JSON.stringify(u??null),m=`${e}|${t.join(`,`)}|${r.join(`,`)}|${d}|${f}|${p}`;return n.useEffect(()=>{let n=a;if(!n||typeof n.queryDataset!=`function`){l({status:`error`,rows:[],error:`This data source does not support dataset queries.`});return}if(!e||r.length===0){l({status:`idle`,rows:[]});return}let s=!1;return l({status:`loading`,rows:[]}),n.queryDataset(e,{dimensions:t,measures:r,...i&&Object.keys(i).length>0?{runtimeFilter:i}:{},...o?{totals:{groupings:o}}:{},...u?{order:u}:{}}).then(e=>{s||l({status:`ok`,rows:Array.isArray(e?.rows)?e.rows:[],fields:Array.isArray(e?.fields)?e.fields:[],object:e?.object,dimensionFields:e?.dimensionFields,drillRawRows:Array.isArray(e?.drillRawRows)?e.drillRawRows:void 0,drillRanges:Array.isArray(e?.drillRanges)?e.drillRanges:void 0,totals:Array.isArray(e?.totals)?e.totals:void 0})}).catch(e=>{s||l({status:`error`,rows:[],error:String(e?.message??e)})}),()=>{s=!0}},[m]),c}function H({dataset:e}){return(0,o.jsxs)(`div`,{className:`flex items-center justify-center rounded-md border border-dashed bg-muted/20 p-4 text-xs text-muted-foreground`,children:[`This report binds the “`,e,`” dataset — choose at least one measure (values) to render.`]})}function U({status:e,error:t}){return e===`error`?(0,o.jsxs)(`div`,{role:`alert`,className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive`,children:[(0,o.jsx)(s.AlertTriangle,{className:`h-3.5 w-3.5 mt-0.5 shrink-0`}),(0,o.jsx)(`span`,{className:`break-words`,children:t})]}):(0,o.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Loader2,{className:`h-4 w-4 animate-spin`}),` Running report…`]})}function W(){return(0,o.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-2 rounded-md border border-dashed bg-muted/20 p-6 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Table2,{className:`h-6 w-6`}),` The dataset returned no rows for this report’s scope.`]})}var G=`cursor-pointer hover:bg-accent/40`;function K({dataset:e,rows:n,values:r,runtimeFilter:a,dataSource:s,onDrill:c,order:u,withTotals:d}){let f=V(e,n,r,a,s,d&&n.length>0?[[]]:void 0,u),{fieldLabel:p}=(0,l.useSafeFieldLabel)(),m=(0,l.useSafeTranslate)(),h=(0,l.useDisplayLocale)(),g=(0,i.useDatasetDimensionLabels)(f.object,f.dimensionFields,n);if(r.length===0)return(0,o.jsx)(H,{dataset:e});if(f.status===`loading`||f.status===`idle`)return(0,o.jsx)(U,{status:f.status});if(f.status===`error`)return(0,o.jsx)(U,{status:`error`,error:f.error});if(f.rows.length===0)return(0,o.jsx)(W,{});let _=!!c&&n.length>0,v=f.dimensionFields?n.filter(e=>e in f.dimensionFields):[],y=(r,i)=>{let o={};for(let e of n)o[e]=r[e];let s=f.drillRanges?.[i],l=!!s&&Object.keys(s).length>0,u=f.object&&(v.length>0||l)?(0,t.buildDatasetDrillFilter)(f.drillRawRows?.[i],v,f.dimensionFields??{},a,s):void 0;c({dataset:e,groupKey:o,runtimeFilter:a,object:f.object,objectFilter:u})},{measureField:b,headerLabel:x}=(0,t.buildDatasetFieldHelpers)(f.fields,f.object,p),S=[...n,...r],C=(0,t.relabelDimensions)(f.rows,g),w=d?f.totals?.find(e=>Array.isArray(e.dimensions)&&e.dimensions.length===0)?.rows?.[0]:void 0,T=m(`report.total`,`Total`);return(0,o.jsx)(`div`,{className:`overflow-auto max-h-[70vh] rounded-md border`,children:(0,o.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,o.jsx)(`thead`,{className:`bg-muted/40`,children:(0,o.jsx)(`tr`,{children:S.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium whitespace-nowrap`,children:x(e)},e))})}),(0,o.jsxs)(`tbody`,{children:[C.map((e,n)=>(0,o.jsx)(`tr`,{className:`border-t${_?` ${G}`:``}`,"data-testid":_?`dataset-drill-row`:void 0,onClick:_?()=>y(f.rows[n],n):void 0,children:S.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 tabular-nums whitespace-nowrap`,children:r.includes(n)?(0,t.formatMeasure)(e[n],b(n)?.format,b(n)?.currency,b(n)?.percentScale,h):(0,t.formatDimensionValue)(e[n],h)},n))},n)),w&&(0,o.jsxs)(`tr`,{className:`border-t bg-muted/30 font-medium`,"data-testid":`dataset-report-total-row`,children:[n.length>0&&(0,o.jsx)(`td`,{colSpan:n.length,className:`px-2 py-1 whitespace-nowrap`,children:T}),r.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 tabular-nums whitespace-nowrap`,children:(0,t.formatMeasure)(w[e],b(e)?.format,b(e)?.currency,b(e)?.percentScale,h)},e))]})]})]})})}function q(e){switch(e){case`summary`:return`summary`;case`matrix`:return`matrix`;case`joined`:return`joined`;default:return`tabular`}}function re(e){switch(e){case`bar`:case`column`:case`horizontal-bar`:case`line`:case`area`:case`pie`:case`donut`:case`funnel`:case`scatter`:case`treemap`:case`sankey`:case`radar`:case`combo`:return{kind:`series`,chartType:e};case`gauge`:case`solid-gauge`:case`metric`:case`kpi`:case`bullet`:return{kind:`single_value`};case`table`:case`pivot`:return{kind:`tabular`};default:return{kind:`unsupported`,type:String(e)}}}function ie(e){let[,r]=n.useReducer(e=>e+1,0);return n.useEffect(()=>{if(t.ComponentRegistry.get(e))return;let n=typeof t.ComponentRegistry.subscribe==`function`?t.ComponentRegistry.subscribe(()=>{t.ComponentRegistry.get(e)&&r()}):void 0,i=t.ComponentRegistry.loadLazy?.(e);return i&&typeof i.then==`function`&&i.then(()=>r()).catch(()=>{}),n},[e]),t.ComponentRegistry.get(e)}function ae(e,t,n){if(!(!Array.isArray(e)||!t))for(let r of e){if(!r||typeof r!=`object`)continue;let{name:e,label:i}=r;if(e===t)return(0,l.pickLocalized)(i,n)||void 0}}function oe({dataset:e,chart:r,runtimeFilter:a,dataSource:c,order:u}){let d=typeof r.xAxis==`string`?r.xAxis:``,f=typeof r.yAxis==`string`?r.yAxis:``,p=re(r.type),m=p.kind===`series`||p.kind===`single_value`,h=V(e,p.kind===`series`&&d?[d]:[],m&&f?[f]:[],a,c,void 0,u),g=ie(`chart`),{fieldLabel:_,fieldOptionLabel:v}=(0,l.useSafeFieldLabel)(),y=(0,l.useSafeTranslate)(),b=(0,l.useDisplayLocale)(),{language:x}=(0,l.useObjectTranslation)(),S=n.useMemo(()=>d?[d]:[],[d]),C=(0,i.useDatasetDimensionMeta)(h.object,h.dimensionFields,S),{categoryColors:w,dimensionLabels:T,categoryOrder:E}=n.useMemo(()=>{if(!C)return{categoryColors:null,dimensionLabels:null,categoryOrder:null};let{metaByPath:e,relabel:n}=C,r=n[0]?.path,i=r?e[r]:void 0,a=r?(0,t.localizeFieldOptions)(i?.options,(0,t.dimensionOptionTranslator)(i,v)):void 0;return{categoryColors:(0,t.buildOptionColorMap)(a),dimensionLabels:(0,t.deriveDimensionLabelMaps)(e,n,v),categoryOrder:(0,t.buildCategoryOrder)(a)}},[C,v]),D=typeof r.title==`string`?r.title:void 0;if(p.kind===`tabular`)return null;if(p.kind===`unsupported`)return(0,o.jsxs)(`div`,{className:`rounded-md border border-dashed bg-muted/20 px-3 py-2 text-xs text-muted-foreground`,"data-testid":`dataset-report-chart-unsupported`,children:[`Chart type “`,p.type,`” is not a spec chart type — the grouped table below carries this report’s numbers.`]});if(p.kind===`series`&&!d||!f)return null;if(h.status===`loading`||h.status===`idle`)return(0,o.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Loader2,{className:`h-4 w-4 animate-spin`}),` Loading chart…`]});if(h.status===`error`||h.rows.length===0)return null;let{measureField:O,headerLabel:k}=(0,t.buildDatasetFieldHelpers)(h.fields,h.object,_),A=ae(r.series,f,x)??k(f);if(p.kind===`single_value`){let e=O(f);return(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-metric`,children:[D?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:D}):null,(0,o.jsxs)(`div`,{className:`flex flex-col gap-0.5 py-2`,children:[(0,o.jsx)(`span`,{className:`text-2xl font-semibold tabular-nums`,children:(0,t.formatMeasure)(h.rows[0]?.[f],e?.format,e?.currency,e?.percentScale,b)}),(0,o.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:A})]})]})}if(!g)return null;let{data:j,xAxisKey:M,series:N}=(0,t.buildChartSeries)((0,t.relabelDimensions)(h.rows,T),[d],[f],h.fields,{nullCategoryLabel:y(`chart.nullCategory`,`(None)`)}),P=(0,t.mergeAuthoredSeries)(N,r.series).map(e=>e.dataKey===f?{...e,label:A}:e),{title:F,...I}=(0,t.chartConfigPresentation)(r,w);return(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-chart`,children:[D?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:D}):null,(0,o.jsx)(g,{schema:{chartType:p.chartType,data:j,xAxisKey:M,series:P,height:280,isAnimationActive:!1,...I,...E?{categoryOrder:E}:{}}})]})}function J(e,n){return(0,t.pivotBucketId)(e.map(e=>(0,t.pivotDimensionValue)(n[e])))}function Y(e,n,r){return e.map(e=>(0,t.formatDimensionValue)(n[e],r)).join(` / `)}function X({dataset:e,rows:r,columnsAcross:a,values:s,runtimeFilter:c,dataSource:u,onDrill:d,order:f}){let p=V(e,[...r,...a],s,c,u,[r,a,[]],f),m=(0,l.useSafeTranslate)(),{fieldLabel:h}=(0,l.useSafeFieldLabel)(),g=(0,l.useDisplayLocale)(),_=(0,i.useDatasetDimensionLabels)(p.object,p.dimensionFields,[...r,...a]),v=n.useMemo(()=>{if(p.status!==`ok`)return null;let e=[],n=[],i=new Set,o=new Set,s=new Map;return(0,t.relabelDimensions)(p.rows,_).forEach((c,l)=>{let u=p.rows[l],d=J(r,c),f=J(a,c);if(!i.has(d)){i.add(d);let t={},n={};for(let e of r)t[e]=u[e],n[e]=c[e];e.push({id:d,label:Y(r,c,g),key:t,display:n})}if(!o.has(f)){o.add(f);let e={},t={};for(let n of a)e[n]=u[n],t[n]=c[n];n.push({id:f,label:Y(a,c,g),key:e,display:t})}s.set((0,t.pivotCellKey)(d,f),{row:u,index:l})}),{rowHeaders:e,colHeaders:n,cells:s}},[p,r,a,_,g]);if(s.length===0)return(0,o.jsx)(H,{dataset:e});if(p.status===`loading`||p.status===`idle`)return(0,o.jsx)(U,{status:p.status});if(p.status===`error`)return(0,o.jsx)(U,{status:`error`,error:p.error});if(!v||v.rowHeaders.length===0)return(0,o.jsx)(W,{});let{measureField:y,headerLabel:b}=(0,t.buildDatasetFieldHelpers)(p.fields,p.object,h),x=m(`report.total`,`Total`),S=!!d,C=p.dimensionFields?[...r,...a].filter(e=>e in p.dimensionFields):[],w=(n,r,i)=>{let a=p.drillRanges?.[i],o=!!a&&Object.keys(a).length>0,s=p.object&&(C.length>0||o)?(0,t.buildDatasetDrillFilter)(p.drillRawRows?.[i],C,p.dimensionFields??{},c,a):void 0;d({dataset:e,groupKey:{...n,...r},runtimeFilter:c,object:p.object,objectFilter:s})},T=v.colHeaders.flatMap(e=>s.map(t=>({col:e,measure:t,header:s.length===1?e.label:`${e.label} · ${b(t)}`}))),E=e=>{let n=p.totals?.find(t=>Array.isArray(t.dimensions)&&t.dimensions.join(`,`)===e.join(`,`))?.rows;return n&&(0,t.relabelDimensions)(n,_)},D=new Map;for(let e of E(r)??[])D.set(J(r,e),e);let O=new Map;for(let e of E(a)??[])O.set(J(a,e),e);let k=E([])?.[0],A=D.size>0,j=O.size>0;return(0,o.jsx)(`div`,{className:`overflow-auto max-h-[70vh] rounded-md border`,"data-testid":`dataset-matrix`,children:(0,o.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,o.jsx)(`thead`,{className:`bg-muted/40`,children:(0,o.jsxs)(`tr`,{children:[r.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium whitespace-nowrap`,children:b(e)},e)),T.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-right font-medium whitespace-nowrap`,children:e.header},`${e.col.id}-${e.measure}`)),A&&s.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-right font-medium whitespace-nowrap`,"data-testid":`matrix-total-col-header`,children:s.length===1?x:`${x} · ${b(e)}`},`total-${e}`))]})}),(0,o.jsxs)(`tbody`,{children:[v.rowHeaders.map(e=>(0,o.jsxs)(`tr`,{className:`border-t`,children:[r.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 whitespace-nowrap font-medium`,children:(0,t.formatDimensionValue)(e.display[n],g)},n)),T.map(n=>{let r=v.cells.get((0,t.pivotCellKey)(e.id,n.col.id)),i=r?.row[n.measure],a=S&&r!=null;return(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap${a?` ${G}`:``}`,"data-testid":a?`dataset-drill-cell`:void 0,onClick:a?()=>w(e.key,n.col.key,r.index):void 0,children:(0,t.formatMeasure)(i,y(n.measure)?.format,y(n.measure)?.currency,y(n.measure)?.percentScale,g)},`${n.col.id}-${n.measure}`)}),A&&s.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap font-medium`,"data-testid":`matrix-row-total`,children:(0,t.formatMeasure)(D.get(e.id)?.[n],y(n)?.format,y(n)?.currency,y(n)?.percentScale,g)},`total-${n}`))]},e.id)),j&&(0,o.jsxs)(`tr`,{className:`border-t bg-muted/30 font-medium`,"data-testid":`matrix-total-row`,children:[r.length>0&&(0,o.jsx)(`td`,{colSpan:r.length,className:`px-2 py-1 whitespace-nowrap`,children:x}),T.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap`,children:(0,t.formatMeasure)(O.get(e.col.id)?.[e.measure],y(e.measure)?.format,y(e.measure)?.currency,y(e.measure)?.percentScale,g)},`${e.col.id}-${e.measure}`)),A&&s.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap`,"data-testid":`matrix-grand-total`,children:(0,t.formatMeasure)(k?.[e],y(e)?.format,y(e)?.currency,y(e)?.percentScale,g)},`grand-${e}`))]})]})]})})}var Z=({report:e,dataSource:n,runtimeFilter:r,onDrill:i,className:a})=>{let s=te(e);L(e,s);let c=(0,t.mergeFilters)(e.runtimeFilter,r),l=e.drilldown===!1?void 0:i,u=q(e.type);if(u===`joined`&&Array.isArray(e.blocks))return(0,o.jsx)(`div`,{className:a,"data-testid":`dataset-joined-report`,"data-report-name":e.name,style:{display:`flex`,flexDirection:`column`,gap:24},children:e.blocks.map((e,r)=>{L(e,`${s} block \`${e.name??r}\``);let i=(0,t.mergeFilters)(c,e.runtimeFilter),a=z(e.columns),u=B(e.order),d=q(e.type),f=d===`matrix`&&a.length>0?(0,o.jsx)(X,{dataset:String(e.dataset??``),rows:z(e.rows),columnsAcross:a,values:z(e.values),runtimeFilter:i,dataSource:n,onDrill:l,order:u}):(0,o.jsx)(K,{dataset:String(e.dataset??``),rows:z(e.rows),values:z(e.values),runtimeFilter:i,dataSource:n,onDrill:l,order:u,withTotals:d===`summary`||d===`matrix`});return(0,o.jsxs)(`section`,{"data-testid":`dataset-report-block`,"data-block-id":e.name??`block-${r}`,className:`flex flex-col gap-2 rounded-lg border bg-card p-4`,children:[(0,o.jsxs)(`header`,{className:`flex flex-col gap-0.5`,children:[(0,o.jsx)(`h3`,{className:`text-sm font-semibold`,children:R(e.label,e.name??`Block ${r+1}`)}),e.description?(0,o.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:R(e.description,``)}):null]}),f]},e.name??`block-${r}`)})});let d=z(e.columns),f=B(e.order);if(u===`matrix`&&d.length>0)return(0,o.jsx)(`div`,{className:a,"data-testid":`dataset-report`,"data-report-name":e.name,children:(0,o.jsx)(X,{dataset:String(e.dataset??``),rows:z(e.rows),columnsAcross:d,values:z(e.values),runtimeFilter:c,dataSource:n,onDrill:l,order:f})});let p=e.chart&&typeof e.chart==`object`&&e.chart.type?e.chart:null;return(0,o.jsxs)(`div`,{className:`${a??``} flex flex-col gap-3`,"data-testid":`dataset-report`,"data-report-name":e.name,"data-report-presentation":u,children:[p?(0,o.jsx)(oe,{dataset:String(e.dataset??``),chart:p,runtimeFilter:c,dataSource:n,order:f}):null,(0,o.jsx)(K,{dataset:String(e.dataset??``),rows:z(e.rows),values:z(e.values),runtimeFilter:c,dataSource:n,onDrill:l,order:f,withTotals:u===`summary`||u===`matrix`})]})},Q=e=>{let{dataSource:t,rows:a,runtimeFilter:s,onDrill:c,className:l}=e,u=n.useContext(i.SchemaRendererContext),d=t??u?.dataSource,f=e.schema;if(f&&typeof f==`object`&&f.type===`spec-report`&&f.report&&typeof f.report==`object`&&(f=f.report),F(f))return(0,o.jsx)(Z,{report:f,dataSource:d,runtimeFilter:s,onDrill:c,className:l});if((0,r.isSpecReport)(f)){let e={type:`report-viewer`,report:(0,r.specReportToPresentation)(f),data:a??[],showToolbar:!1};return(0,o.jsx)(`div`,{className:l,"data-testid":`report-presentation-bridge`,children:(0,o.jsx)(P,{schema:e})})}return(0,o.jsx)(_,{schema:f})};async function $(e,t){let{dataSource:n,resource:r,queryParams:i,format:a,exportConfig:o}=t,s=a||e.defaultExportFormat||`pdf`;try{let t=(await n.find(r,i)).data||[];return C(s,e,t,{format:s,...e.exportConfigs?.[s],...o}),{success:!0,recordCount:t.length,format:s}}catch(e){return{success:!1,recordCount:0,format:s,error:e.message}}}function se(e,t,n={}){let{columns:r,filename:i,includeAggregationRow:a=!1}=n,o=r||(e.fields||[]).map(le),s=o.map(e=>e.header),c=t.map((e,t)=>o.map(n=>{if(n.formula)return n.formula.replace(/\{ROW\}/g,String(t+2));let r=e[n.name];return ue(r,n.numberFormat)}));if(a&&t.length>0){let n=o.map((n,r)=>{let i=(e.fields||[]).find(e=>e.name===n.name);if(i?.aggregation){let e=fe(r),n=t.length+1;switch(i.aggregation){case`sum`:return`=SUM(${e}2:${e}${n})`;case`avg`:return`=AVERAGE(${e}2:${e}${n})`;case`count`:return`=COUNTA(${e}2:${e}${n})`;case`min`:return`=MIN(${e}2:${e}${n})`;case`max`:return`=MAX(${e}2:${e}${n})`;default:return``}}return``});c.push(n)}me(``+[s.join(` `),...c.map(e=>e.join(` `))].join(`
|
|
59
|
-
`),i||`${e.title||`report`}.tsv`,`text/tab-separated-values`)}function
|
|
56
|
+
</html>`),s.document.close(),s.onload=()=>{s.print()}}function C(e,t,n){let r=e.fields||[],i=r.map(e=>e.label||e.name),a=t.map(e=>r.map(t=>{let n=e[t.name];return n=E(n),typeof n==`string`&&(n.includes(`,`)||n.includes(`"`)||n.includes(`
|
|
57
|
+
`)||n.includes(` `))?`"${n.replace(/"/g,`""`)}"`:n??``}));k(``+[...n?.includeHeaders===!1?[]:[i.join(` `)],...a.map(e=>e.join(` `))].join(`
|
|
58
|
+
`),n?.filename||`${e.title||`report`}.tsv`,`text/tab-separated-values`)}function w(e,t,n,r,i=`en`){switch(e){case`csv`:y(t,n,r);break;case`json`:b(t,n,r);break;case`html`:x(t,n,r,i);break;case`pdf`:S(t,n,r,i);break;case`excel`:C(t,n,r);break;default:console.warn(`Unsupported export format: ${e}`)}}function T(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function E(e){if(typeof e==`string`&&e.length>0){let t=e.charAt(0);if(t===`=`||t===`+`||t===`-`||t===`@`||t===`|`)return`\t${e}`}return e}function D(e){return[`A4`,`A3`,`Letter`,`Legal`].includes(e||``)?e:`A4`}function O(e){return e===`landscape`?`landscape`:`portrait`}function k(e,t,n){let r=new Blob([e],{type:`${n};charset=utf-8`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}function A(e,t,n=`en`){if(e==null||e===``)return``;let r=t?.type,i=t?.format;if(r===`date`||i===`date`||j(e))return M(e);if(r===`number`||typeof e==`number`){let t=typeof e==`number`?e:Number(e);return isNaN(t)?String(e):i===`currency`||i===`currency_cny`?`¥${v(t,n,{minimumFractionDigits:0,maximumFractionDigits:0})}`:i===`currency_usd`?`$${v(t,n,{minimumFractionDigits:0,maximumFractionDigits:0})}`:i===`percent`?`${v(t,n,{minimumFractionDigits:1,maximumFractionDigits:1})}%`:v(t,n)}return String(e)}function j(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2})?/.test(e)}function M(e){try{let n=(0,t.toDisplayDate)(e);return isNaN(n.getTime())?String(e):`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,`0`)}-${String(n.getDate()).padStart(2,`0`)}`}catch{return String(e)}}function N(e,t){if(!t||t.length===0||!e||e.length===0)return null;let n=t[0],r=n.field,i=new Map;for(let t of e){let e=String(t[r]??`(empty)`);i.has(e)||i.set(e,[]),i.get(e).push(t)}let a=[];for(let[e,t]of i)a.push({key:e,label:`${n.label||r}: ${e}`,rows:t});let o=n.sort===`desc`?-1:1;return a.sort((e,t)=>e.key.localeCompare(t.key)*o),a}function P(e,t,n){if(!e)return 0;let r=e.map(e=>Number(e[t])||0);switch(n){case`count`:return e.length;case`sum`:return r.reduce((e,t)=>e+t,0);case`avg`:return r.length>0?(r.reduce((e,t)=>e+t,0)/r.length).toFixed(2):0;case`min`:return r.length>0?Math.min(...r):0;case`max`:return r.length>0?Math.max(...r):0;case`distinct`:return new Set(e.map(e=>e[t])).size;default:return``}}var F=({schema:e,onRefresh:t})=>{let{report:r,data:u,showToolbar:d=!0,allowExport:f=!0,allowPrint:p=!0,loading:m=!1}=e,h=(0,l.useSafeTranslate)(),g=(0,l.useDisplayLocale)(),_=e=>{if(!r){console.warn(`ReportViewer: Cannot export, no report defined`);return}w(e,r,u||[],r.exportConfigs?.[e],g)},v=h(`common.printDialogHint`,`Opens your browser’s print dialog (not a PDF export)`),y=()=>{window.print()},b=()=>{t?.()},x=(e,t)=>P(u,e,t),S=(e,t)=>{let n=r?.conditionalFormatting;if(n&&Array.isArray(n))for(let r of n){if(r.field!==e)continue;let n=String(t??``),i=String(r.value??``),a=!1;switch(r.operator){case`equals`:a=n===i;break;case`not_equals`:a=n!==i;break;case`contains`:a=n.includes(i);break;case`greater_than`:a=Number(t)>Number(r.value);break;case`less_than`:a=Number(t)<Number(r.value)}if(a){let e={};return r.backgroundColor&&(e.backgroundColor=r.backgroundColor),r.textColor&&(e.color=r.textColor),e}}},C=(e,t)=>{if(e==null||e===``)return``;if(t.renderAs===`badge`&&(!t.type||t.type===`string`||t.type===`text`)){let n=t.colorMap?.[String(e)]||``;return(0,o.jsx)(a.Badge,{className:n,children:String(e)})}if(t.aggregation)return A(e,t,g);if(t.type){let n={...t};t.colorMap&&!n.options&&(n.options=Object.entries(t.colorMap).map(([e,t])=>({value:e,label:e,color:t})));let r=(0,c.getCellRenderer)((0,c.resolveCellRendererType)(n));return(0,o.jsx)(r,{value:e,field:n})}return A(e,t,g)};return r?(0,o.jsxs)(`div`,{className:`space-y-4`,children:[d&&(0,o.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-4 bg-card rounded-lg border`,children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`h2`,{className:`text-lg font-semibold`,children:r.title}),r.description&&(0,o.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:r.description})]}),(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,"data-print-hide":!0,children:[r.refreshInterval&&(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:b,children:[(0,o.jsx)(s.RefreshCw,{className:`h-4 w-4 mr-2`}),`Refresh`]}),p&&(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:y,"aria-label":`Print: ${v}`,title:v,children:[(0,o.jsx)(s.Printer,{className:`h-4 w-4 mr-2`}),`Print`]}),f&&r.showExportButtons&&(0,o.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>_(`pdf`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`PDF`]}),(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>_(`excel`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`Excel`]}),(0,o.jsxs)(a.Button,{variant:`outline`,size:`sm`,onClick:()=>_(`csv`),children:[(0,o.jsx)(s.Download,{className:`h-4 w-4 mr-2`}),`CSV`]})]})]})]}),(0,o.jsxs)(a.Card,{children:[(0,o.jsxs)(a.CardHeader,{children:[!d&&r.title&&(0,o.jsx)(a.CardTitle,{children:r.title}),!d&&r.description&&(0,o.jsx)(a.CardDescription,{children:r.description})]}),(0,o.jsxs)(a.CardContent,{className:`space-y-6`,children:[m&&(0,o.jsxs)(`div`,{className:`space-y-6`,children:[(0,o.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[1,2,3].map(e=>(0,o.jsx)(a.Card,{children:(0,o.jsxs)(a.CardContent,{className:`p-4 space-y-2`,children:[(0,o.jsx)(a.Skeleton,{className:`h-4 w-20`}),(0,o.jsx)(a.Skeleton,{className:`h-8 w-28`})]})},e))}),(0,o.jsxs)(`div`,{className:`space-y-2`,children:[(0,o.jsx)(a.Skeleton,{className:`h-10 w-full`}),[1,2,3,4,5].map(e=>(0,o.jsx)(a.Skeleton,{className:`h-8 w-full`},e))]})]}),!m&&r.sections?.map((e,t)=>e.visible===!1?null:(0,o.jsxs)(`div`,{className:`space-y-2`,children:[e.title&&e.type!==`header`&&(0,o.jsx)(`h3`,{className:`text-lg font-semibold border-b pb-2`,children:e.title}),e.type===`header`&&e.title&&(0,o.jsx)(`div`,{className:`text-2xl font-bold py-4`,children:e.title}),e.type===`summary`&&(0,o.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:r.fields?.filter(e=>e.showInSummary).map((e,t)=>(0,o.jsx)(a.Card,{children:(0,o.jsxs)(a.CardContent,{className:`p-4`,children:[(0,o.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:e.label||e.name}),(0,o.jsx)(`div`,{className:`text-2xl font-bold`,children:A(x(e.name,e.aggregation),e,g)})]})},t))}),e.type===`table`&&(0,o.jsx)(`div`,{className:`border rounded-lg overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm min-w-[600px]`,children:[(0,o.jsx)(`thead`,{className:`bg-muted`,children:(0,o.jsx)(`tr`,{children:e.columns?.map((e,t)=>(0,o.jsx)(`th`,{className:`px-4 py-2 font-medium ${e.type===`number`?`text-right`:`text-left`}`,children:e.label||e.name},t))})}),(0,o.jsx)(`tbody`,{children:(()=>{let t=N(u||[],r.groupBy||[]);return t?t.map(t=>(0,o.jsxs)(n.default.Fragment,{children:[(0,o.jsx)(`tr`,{className:`bg-muted/60`,children:(0,o.jsxs)(`td`,{colSpan:e.columns?.length||1,className:`px-4 py-2 font-semibold text-sm`,children:[t.label,` (`,t.rows.length,`)`]})}),t.rows.map((t,n)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:e.columns?.map((e,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${e.type===`number`?`text-right tabular-nums`:``}`,style:S(e.name,t[e.name]),children:C(t[e.name],e)},n))},n))]},t.key)):u?.map((t,n)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:e.columns?.map((e,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${e.type===`number`?`text-right tabular-nums`:``}`,style:S(e.name,t[e.name]),children:C(t[e.name],e)},n))},n))})()})]})}),e.type===`text`&&e.text&&(0,o.jsx)(`div`,{className:`prose max-w-none`,children:(0,o.jsx)(`p`,{children:e.text})}),e.type===`page-break`&&(0,o.jsx)(`div`,{className:`border-t-2 border-dashed my-8 print:page-break-after-always`}),Array.isArray(e.content)?e.content.map((e,t)=>(0,o.jsx)(i.SchemaRenderer,{schema:(0,i.toRenderableSchema)(e)},t)):(0,a.renderNodeSlot)(e.content,e=>(0,o.jsx)(i.SchemaRenderer,{schema:(0,i.toRenderableSchema)(e)}))]},t)),!r.sections&&u&&u.length>0&&(0,o.jsx)(`div`,{className:`border rounded-lg overflow-x-auto`,children:(0,o.jsxs)(`table`,{className:`w-full text-sm min-w-[600px]`,children:[(0,o.jsx)(`thead`,{className:`bg-muted`,children:(0,o.jsx)(`tr`,{children:r.fields?.map((e,t)=>(0,o.jsx)(`th`,{className:`px-4 py-2 font-medium ${e.type===`number`?`text-right`:`text-left`}`,children:e.label||e.name},t))})}),(0,o.jsx)(`tbody`,{children:u.map((e,t)=>(0,o.jsx)(`tr`,{className:`border-t hover:bg-muted/50 even:bg-muted/20`,children:r.fields?.map((t,n)=>(0,o.jsx)(`td`,{className:`px-4 py-2 ${t.type===`number`?`text-right tabular-nums`:``}`,style:S(t.name,e[t.name]),children:C(e[t.name],t)},n))},t))})]})})]})]})]}):(0,o.jsx)(a.Card,{children:(0,o.jsx)(a.CardContent,{className:`p-8 text-center text-muted-foreground`,children:`No report to display`})})};function I(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataset==`string`&&t.dataset.length>0||t.type===`joined`&&Array.isArray(t.blocks)&&t.blocks.some(e=>typeof e?.dataset==`string`)}var L=new Set,R=()=>globalThis.process?.env?.NODE_ENV!==`production`;function z(e,t){if(!R())return;let n=e.filter;if(n===void 0)return;let r=`${t}:${n&&typeof n==`object`?Object.keys(n).sort().join(`,`):String(n)}`;L.has(r)||(L.add(r),console.warn(`[ObjectUI] ${t} carries \`filter\`, which is not an authorable key. Did you mean \`filter\` → \`runtimeFilter\`? NO filter was applied — it renders UNFILTERED, showing rows the report was scoped to exclude. \`ReportSchema\` (\`@objectstack/spec\`) is strict and rejects \`filter\`, so this document did not come through the validated path; the renderer no longer reads it either. Fix the producer: rename \`filter\` to \`runtimeFilter\`. (objectui#5137)`))}function B(e){return`Report \`${e.name??`(unnamed)`}\``}function V(e,t){return e?typeof e==`string`?e:typeof e==`object`&&typeof e.default==`string`?e.default:t:t}function H(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&!!e):[]}function U(e){if(!Array.isArray(e))return;let t={};for(let n of e){let e=n&&typeof n==`object`?n.by:void 0;typeof e==`string`&&e&&(t[e]=n.direction===`desc`?`desc`:`asc`)}return Object.keys(t).length>0?t:void 0}function W(e,t,n){if(!e)return;let r=new Set([...t,...n]),i={};for(let[t,n]of Object.entries(e))r.has(t)&&(i[t]=n);return Object.keys(i).length>0?i:void 0}function ee(e,n){let r=(0,t.deriveDimensionLabelMaps)(e?.metaByPath,e?.relabel,n);if(!e)return{dimensionLabels:r,dimensionRanks:null};let i={},a=!1;for(let{dim:r,path:o}of e.relabel){let s=e.metaByPath[o],c=(0,t.localizeFieldOptions)(s?.options,(0,t.dimensionOptionTranslator)(s,n)),l=(0,t.buildCategoryRank)((0,t.buildCategoryOrder)(c));i[r]=l,l&&(a=!0)}return{dimensionLabels:r,dimensionRanks:a?i:null}}function G(e,t){return e==null||e===``?2**53-1:t.get(String(e))??2**53-1-1}function K(e,n,r,i){if(!i||!n.some(e=>i[e]))return null;let a=(o,s)=>{if(s>=n.length||o.length<2)return o;let c=n[s],l=new Map;for(let n of o){let i=(0,t.pivotBucketId)([(0,t.pivotDimensionValue)(r(e[n],c))]),a=l.get(i);a?a.push(n):l.set(i,[n])}let u=[...l.values()],d=i[c];return d&&u.sort((t,n)=>G(r(e[t[0]],c),d)-G(r(e[n[0]],c),d)),u.flatMap(e=>a(e,s+1))};return a(e.map((e,t)=>t),0)}function q(e,t,r,a,o,s,c){let[l,u]=n.useState({status:`idle`,rows:[]}),d=W(c,t,r),f=JSON.stringify(a??null),p=JSON.stringify(s??null),m=JSON.stringify(d??null),h=`${e}|${t.join(`,`)}|${r.join(`,`)}|${f}|${p}|${m}`,[g,_]=n.useState(void 0),v=(0,i.useDataInvalidation)(g),y=n.useRef(null);return n.useEffect(()=>{let n=o;if(!n||typeof n.queryDataset!=`function`){y.current=null,_(void 0),u({status:`error`,rows:[],error:`This data source does not support dataset queries.`});return}if(!e||r.length===0){y.current=null,_(void 0),u({status:`idle`,rows:[]});return}let c=!1,l=y.current===h;return y.current=h,l||(_(void 0),u({status:`loading`,rows:[]})),n.queryDataset(e,{dimensions:t,measures:r,...a&&Object.keys(a).length>0?{runtimeFilter:a}:{},...s?{totals:{groupings:s}}:{},...d?{order:d}:{}}).then(e=>{c||(_(typeof e?.object==`string`&&e.object?e.object:void 0),u({status:`ok`,rows:Array.isArray(e?.rows)?e.rows:[],fields:Array.isArray(e?.fields)?e.fields:[],object:e?.object,dimensionFields:e?.dimensionFields,drillRawRows:Array.isArray(e?.drillRawRows)?e.drillRawRows:void 0,drillRanges:Array.isArray(e?.drillRanges)?e.drillRanges:void 0,totals:Array.isArray(e?.totals)?e.totals:void 0}))}).catch(e=>{if(!c){if((0,i.classifyLoadError)(e)===`forbidden`){u({status:`error`,rows:[],forbidden:!0});return}u({status:`error`,rows:[],error:String(e?.message??e)})}}),()=>{c=!0}},[h,v]),l}function J(...e){try{return(0,t.buildDatasetDrillFilter)(...e)}catch(e){if(!(e instanceof t.FilterOperatorError))throw e;return console.warn(`[DatasetReportRenderer] drill-down refused — the drilled list cannot be scoped: ${e.message}`),null}}function Y({dataset:e}){return(0,o.jsxs)(`div`,{className:`flex items-center justify-center rounded-md border border-dashed bg-muted/20 p-4 text-xs text-muted-foreground`,children:[`This report binds the “`,e,`” dataset — choose at least one measure (values) to render.`]})}function te(){let e=(0,l.useSafeTranslate)();return(0,o.jsxs)(`div`,{role:`alert`,"data-testid":`dataset-report-forbidden`,className:`flex flex-col items-center justify-center gap-1 rounded-md border border-dashed bg-muted/20 p-6 text-center text-xs text-muted-foreground`,children:[(0,o.jsx)(s.ShieldAlert,{className:`h-5 w-5 text-muted-foreground/70`,"aria-hidden":`true`}),(0,o.jsx)(`span`,{className:`font-medium text-foreground/80`,children:e(`dashboard.widgetForbiddenTitle`,`You don’t have access`)}),(0,o.jsx)(`span`,{children:e(`report.forbiddenMessage`,`You don’t have permission to view the data behind this report.`)})]})}function X({status:e,error:t,forbidden:n}){return e===`error`&&n?(0,o.jsx)(te,{}):e===`error`?(0,o.jsxs)(`div`,{role:`alert`,className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive`,children:[(0,o.jsx)(s.AlertTriangle,{className:`h-3.5 w-3.5 mt-0.5 shrink-0`}),(0,o.jsx)(`span`,{className:`break-words`,children:t})]}):(0,o.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Loader2,{className:`h-4 w-4 animate-spin`}),` Running report…`]})}function Z(){return(0,o.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-2 rounded-md border border-dashed bg-muted/20 p-6 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Table2,{className:`h-6 w-6`}),` The dataset returned no rows for this report’s scope.`]})}var Q=`cursor-pointer hover:bg-accent/40`;function ne({dataset:e,rows:r,values:a,runtimeFilter:s,dataSource:c,onDrill:u,order:d,withTotals:f}){let p=q(e,r,a,s,c,f&&r.length>0?[[]]:void 0,d),{fieldLabel:m,fieldOptionLabel:h}=(0,l.useSafeFieldLabel)(),g=(0,l.useSafeTranslate)(),_=(0,l.useDisplayLocale)(),v=(0,i.useDatasetDimensionMeta)(p.object,p.dimensionFields,r),{dimensionLabels:y,dimensionRanks:b}=n.useMemo(()=>ee(v,h),[v,h]);if(a.length===0)return(0,o.jsx)(Y,{dataset:e});if(p.status===`loading`||p.status===`idle`)return(0,o.jsx)(X,{status:p.status});if(p.status===`error`)return(0,o.jsx)(X,{status:`error`,error:p.error,forbidden:p.forbidden});if(p.rows.length===0)return(0,o.jsx)(Z,{});let x=!!u&&r.length>0,S=p.dimensionFields?r.filter(e=>e in p.dimensionFields):[],C=(t,n)=>{let i={};for(let e of r)i[e]=t[e];let a=p.drillRanges?.[n],o=!!a&&Object.keys(a).length>0,c;if(p.object&&(S.length>0||o)){let e=J(p.drillRawRows?.[n],S,p.dimensionFields??{},s,a);if(e===null)return;c=e}u({dataset:e,groupKey:i,runtimeFilter:s,object:p.object,objectFilter:c})},{measureField:w,headerLabel:T}=(0,t.buildDatasetFieldHelpers)(p.fields,p.object,m,(0,l.builtinAggregateLabels)(g)),E=[...r,...a],D=(0,t.relabelDimensions)(p.rows,y),O=K(D,r,(e,t)=>e[t],W(d,r,a)?null:b)??D.map((e,t)=>t),k=f?p.totals?.find(e=>Array.isArray(e.dimensions)&&e.dimensions.length===0)?.rows?.[0]:void 0,A=g(`report.total`,`Total`);return(0,o.jsx)(`div`,{className:`overflow-auto max-h-[70vh] rounded-md border`,children:(0,o.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,o.jsx)(`thead`,{className:`bg-muted/40`,children:(0,o.jsx)(`tr`,{children:E.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium whitespace-nowrap`,children:T(e)},e))})}),(0,o.jsxs)(`tbody`,{children:[O.map(e=>(0,o.jsx)(`tr`,{className:`border-t${x?` ${Q}`:``}`,"data-testid":x?`dataset-drill-row`:void 0,onClick:x?()=>C(p.rows[e],e):void 0,children:E.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 tabular-nums whitespace-nowrap`,children:a.includes(n)?(0,t.formatMeasure)(D[e][n],w(n)?.format,w(n)?.currency,w(n)?.percentScale,_):(0,t.formatDimensionValue)(D[e][n],_)},n))},e)),k&&(0,o.jsxs)(`tr`,{className:`border-t bg-muted/30 font-medium`,"data-testid":`dataset-report-total-row`,children:[r.length>0&&(0,o.jsx)(`td`,{colSpan:r.length,className:`px-2 py-1 whitespace-nowrap`,children:A}),a.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 tabular-nums whitespace-nowrap`,children:(0,t.formatMeasure)(k[e],w(e)?.format,w(e)?.currency,w(e)?.percentScale,_)},e))]})]})]})})}function re(e){switch(e){case`summary`:return`summary`;case`matrix`:return`matrix`;case`joined`:return`joined`;default:return`tabular`}}function ie(e){switch(e){case`bar`:case`column`:case`horizontal-bar`:case`line`:case`area`:case`pie`:case`donut`:case`funnel`:case`scatter`:case`treemap`:case`sankey`:case`radar`:case`combo`:return{kind:`series`,chartType:e};case`gauge`:case`solid-gauge`:case`metric`:case`kpi`:case`bullet`:return{kind:`single_value`};case`table`:case`pivot`:return{kind:`tabular`};default:return{kind:`unsupported`,type:String(e)}}}function ae(e){let[,r]=n.useReducer(e=>e+1,0);return n.useEffect(()=>{if(t.ComponentRegistry.get(e))return;let n=typeof t.ComponentRegistry.subscribe==`function`?t.ComponentRegistry.subscribe(()=>{t.ComponentRegistry.get(e)&&r()}):void 0,i=t.ComponentRegistry.loadLazy?.(e);return i&&typeof i.then==`function`&&i.then(()=>r()).catch(()=>{}),n},[e]),t.ComponentRegistry.get(e)}function oe(e,t,n){if(Array.isArray(e)&&t)for(let r of e){if(!r||typeof r!=`object`)continue;let{name:e,label:i}=r;if(e===t)return(0,l.pickLocalized)(i,n)||void 0}}function se({dataset:e,chart:r,runtimeFilter:a,dataSource:c,order:u}){let d=typeof r.xAxis==`string`?r.xAxis:``,f=typeof r.yAxis==`string`?r.yAxis:``,p=ie(r.type),m=p.kind===`series`||p.kind===`single_value`,h=p.kind===`series`&&d?[d]:[],g=m&&f?[f]:[],_=q(e,h,g,a,c,void 0,u),v=ae(`chart`),{fieldLabel:y,fieldOptionLabel:b}=(0,l.useSafeFieldLabel)(),x=(0,l.useSafeTranslate)(),S=(0,l.useDisplayLocale)(),{language:C}=(0,l.useObjectTranslation)(),w=n.useMemo(()=>d?[d]:[],[d]),T=(0,i.useDatasetDimensionMeta)(_.object,_.dimensionFields,w),{categoryColors:E,dimensionLabels:D,categoryOrder:O}=n.useMemo(()=>{if(!T)return{categoryColors:null,dimensionLabels:null,categoryOrder:null};let{metaByPath:e,relabel:n}=T,r=n[0]?.path,i=r?e[r]:void 0,a=r?(0,t.localizeFieldOptions)(i?.options,(0,t.dimensionOptionTranslator)(i,b)):void 0;return{categoryColors:(0,t.buildOptionColorMap)(a),dimensionLabels:(0,t.deriveDimensionLabelMaps)(e,n,b),categoryOrder:(0,t.buildCategoryOrder)(a)}},[T,b]),k=(0,l.pickLocalized)(r.title,C)||void 0;if(p.kind===`tabular`)return null;if(p.kind===`unsupported`)return(0,o.jsxs)(`div`,{className:`rounded-md border border-dashed bg-muted/20 px-3 py-2 text-xs text-muted-foreground`,"data-testid":`dataset-report-chart-unsupported`,children:[`Chart type “`,p.type,`” is not a spec chart type — the report’s table carries its numbers.`]});if(p.kind===`series`&&!d||!f)return null;if(_.status===`loading`||_.status===`idle`)return(0,o.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-xs text-muted-foreground`,children:[(0,o.jsx)(s.Loader2,{className:`h-4 w-4 animate-spin`}),` Loading chart…`]});if(_.status===`error`||_.rows.length===0)return null;let{measureField:A,headerLabel:j}=(0,t.buildDatasetFieldHelpers)(_.fields,_.object,y,(0,l.builtinAggregateLabels)(x)),M=oe(r.series,f,C)??j(f);if(p.kind===`single_value`){let e=A(f);return(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-metric`,children:[k?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:k}):null,(0,o.jsxs)(`div`,{className:`flex flex-col gap-0.5 py-2`,children:[(0,o.jsx)(`span`,{className:`text-2xl font-semibold tabular-nums`,children:(0,t.formatMeasure)(_.rows[0]?.[f],e?.format,e?.currency,e?.percentScale,S)}),(0,o.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:M})]})]})}if(!v)return null;let N=(0,t.relabelDimensions)(_.rows,D),P=W(u,h,g)?null:(0,t.buildCategoryRank)(O),F=K(N,[d],(e,t)=>e[t],P?{[d]:P}:null),I=F?F.map(e=>N[e]):N,{data:L,xAxisKey:R,series:z}=(0,t.buildChartSeries)(I,[d],[f],_.fields,{nullCategoryLabel:x(`chart.nullCategory`,`(None)`),builtinAggregateLabels:(0,l.builtinAggregateLabels)(x)}),B=(0,t.mergeAuthoredSeries)(z,r.series).map(e=>e.dataKey===f?{...e,label:M}:e),{title:V,...H}=(0,t.chartConfigPresentation)(r,E);return(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-chart`,children:[k?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:k}):null,(0,o.jsx)(v,{schema:{chartType:p.chartType,data:L,xAxisKey:R,series:B,height:280,isAnimationActive:!1,...H,...O?{categoryOrder:O}:{}}})]})}function $(e,n){return(0,t.pivotBucketId)(e.map(e=>(0,t.pivotDimensionValue)(n[e])))}function ce(e,n,r){return e.map(e=>(0,t.formatDimensionValue)(n[e],r)).join(` / `)}function le({dataset:e,rows:r,columnsAcross:a,values:s,runtimeFilter:c,dataSource:u,onDrill:d,order:f}){let p=q(e,[...r,...a],s,c,u,[r,a,[]],f),m=(0,l.useSafeTranslate)(),{fieldLabel:h,fieldOptionLabel:g}=(0,l.useSafeFieldLabel)(),_=(0,l.useDisplayLocale)(),v=(0,i.useDatasetDimensionMeta)(p.object,p.dimensionFields,[...r,...a]),{dimensionLabels:y,dimensionRanks:b}=n.useMemo(()=>ee(v,g),[v,g]),x=W(f,[...r,...a],s)!==void 0,S=n.useMemo(()=>{if(p.status!==`ok`)return null;let e=[],n=[],i=new Set,o=new Set,s=new Map;(0,t.relabelDimensions)(p.rows,y).forEach((c,l)=>{let u=p.rows[l],d=$(r,c),f=$(a,c);if(!i.has(d)){i.add(d);let t={},n={};for(let e of r)t[e]=u[e],n[e]=c[e];e.push({id:d,label:ce(r,c,_),key:t,display:n})}if(!o.has(f)){o.add(f);let e={},t={};for(let n of a)e[n]=u[n],t[n]=c[n];n.push({id:f,label:ce(a,c,_),key:e,display:t})}s.set((0,t.pivotCellKey)(d,f),{row:u,index:l})});let c=x?null:b,l=K(e,r,(e,t)=>e.display[t],c),u=K(n,a,(e,t)=>e.display[t],c);return{rowHeaders:l?l.map(t=>e[t]):e,colHeaders:u?u.map(e=>n[e]):n,cells:s}},[p,r,a,y,b,x,_]);if(s.length===0)return(0,o.jsx)(Y,{dataset:e});if(p.status===`loading`||p.status===`idle`)return(0,o.jsx)(X,{status:p.status});if(p.status===`error`)return(0,o.jsx)(X,{status:`error`,error:p.error,forbidden:p.forbidden});if(!S||S.rowHeaders.length===0)return(0,o.jsx)(Z,{});let{measureField:C,headerLabel:w}=(0,t.buildDatasetFieldHelpers)(p.fields,p.object,h,(0,l.builtinAggregateLabels)(m)),T=m(`report.total`,`Total`),E=!!d,D=p.dimensionFields?[...r,...a].filter(e=>e in p.dimensionFields):[],O=(t,n,r)=>{let i=p.drillRanges?.[r],a=!!i&&Object.keys(i).length>0,o;if(p.object&&(D.length>0||a)){let e=J(p.drillRawRows?.[r],D,p.dimensionFields??{},c,i);if(e===null)return;o=e}d({dataset:e,groupKey:{...t,...n},runtimeFilter:c,object:p.object,objectFilter:o})},k=S.colHeaders.flatMap(e=>s.map(t=>({col:e,measure:t,header:s.length===1?e.label:`${e.label} · ${w(t)}`}))),A=e=>{let n=p.totals?.find(t=>Array.isArray(t.dimensions)&&t.dimensions.join(`,`)===e.join(`,`))?.rows;return n&&(0,t.relabelDimensions)(n,y)},j=new Map;for(let e of A(r)??[])j.set($(r,e),e);let M=new Map;for(let e of A(a)??[])M.set($(a,e),e);let N=A([])?.[0],P=j.size>0,F=M.size>0;return(0,o.jsx)(`div`,{className:`overflow-auto max-h-[70vh] rounded-md border`,"data-testid":`dataset-matrix`,children:(0,o.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,o.jsx)(`thead`,{className:`bg-muted/40`,children:(0,o.jsxs)(`tr`,{children:[r.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium whitespace-nowrap`,children:w(e)},e)),k.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-right font-medium whitespace-nowrap`,children:e.header},`${e.col.id}-${e.measure}`)),P&&s.map(e=>(0,o.jsx)(`th`,{className:`px-2 py-1.5 text-right font-medium whitespace-nowrap`,"data-testid":`matrix-total-col-header`,children:s.length===1?T:`${T} · ${w(e)}`},`total-${e}`))]})}),(0,o.jsxs)(`tbody`,{children:[S.rowHeaders.map(e=>(0,o.jsxs)(`tr`,{className:`border-t`,children:[r.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 whitespace-nowrap font-medium`,children:(0,t.formatDimensionValue)(e.display[n],_)},n)),k.map(n=>{let r=S.cells.get((0,t.pivotCellKey)(e.id,n.col.id)),i=r?.row[n.measure],a=E&&r!=null;return(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap${a?` ${Q}`:``}`,"data-testid":a?`dataset-drill-cell`:void 0,onClick:a?()=>O(e.key,n.col.key,r.index):void 0,children:(0,t.formatMeasure)(i,C(n.measure)?.format,C(n.measure)?.currency,C(n.measure)?.percentScale,_)},`${n.col.id}-${n.measure}`)}),P&&s.map(n=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap font-medium`,"data-testid":`matrix-row-total`,children:(0,t.formatMeasure)(j.get(e.id)?.[n],C(n)?.format,C(n)?.currency,C(n)?.percentScale,_)},`total-${n}`))]},e.id)),F&&(0,o.jsxs)(`tr`,{className:`border-t bg-muted/30 font-medium`,"data-testid":`matrix-total-row`,children:[r.length>0&&(0,o.jsx)(`td`,{colSpan:r.length,className:`px-2 py-1 whitespace-nowrap`,children:T}),k.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap`,children:(0,t.formatMeasure)(M.get(e.col.id)?.[e.measure],C(e.measure)?.format,C(e.measure)?.currency,C(e.measure)?.percentScale,_)},`${e.col.id}-${e.measure}`)),P&&s.map(e=>(0,o.jsx)(`td`,{className:`px-2 py-1 text-right tabular-nums whitespace-nowrap`,"data-testid":`matrix-grand-total`,children:(0,t.formatMeasure)(N?.[e],C(e)?.format,C(e)?.currency,C(e)?.percentScale,_)},`grand-${e}`))]})]})]})})}var ue=({report:e,dataSource:n,runtimeFilter:r,onDrill:i,className:a})=>{let s=B(e);z(e,s);let c=(0,t.mergeFilters)(e.runtimeFilter,r),l=e.drilldown===!1?void 0:i,u=re(e.type);if(u===`joined`&&Array.isArray(e.blocks))return(0,o.jsx)(`div`,{className:a,"data-testid":`dataset-joined-report`,"data-report-name":e.name,style:{display:`flex`,flexDirection:`column`,gap:24},children:e.blocks.map((e,r)=>{z(e,`${s} block \`${e.name??r}\``);let i=(0,t.mergeFilters)(c,e.runtimeFilter),a=H(e.columns),u=U(e.order),d=re(e.type),f=d===`matrix`&&a.length>0?(0,o.jsx)(le,{dataset:String(e.dataset??``),rows:H(e.rows),columnsAcross:a,values:H(e.values),runtimeFilter:i,dataSource:n,onDrill:l,order:u}):(0,o.jsx)(ne,{dataset:String(e.dataset??``),rows:H(e.rows),values:H(e.values),runtimeFilter:i,dataSource:n,onDrill:l,order:u,withTotals:d===`summary`||d===`matrix`});return(0,o.jsxs)(`section`,{"data-testid":`dataset-report-block`,"data-block-id":e.name??`block-${r}`,className:`flex flex-col gap-2 rounded-lg border bg-card p-4`,children:[(0,o.jsxs)(`header`,{className:`flex flex-col gap-0.5`,children:[(0,o.jsx)(`h3`,{className:`text-sm font-semibold`,children:V(e.label,e.name??`Block ${r+1}`)}),e.description?(0,o.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:V(e.description,``)}):null]}),f]},e.name??`block-${r}`)})});let d=H(e.columns),f=U(e.order),p=u===`matrix`&&d.length>0,m=e.chart&&typeof e.chart==`object`&&e.chart.type?e.chart:null,h=m?(0,o.jsx)(se,{dataset:String(e.dataset??``),chart:m,runtimeFilter:c,dataSource:n,order:f}):null,g=p?(0,o.jsx)(le,{dataset:String(e.dataset??``),rows:H(e.rows),columnsAcross:d,values:H(e.values),runtimeFilter:c,dataSource:n,onDrill:l,order:f}):(0,o.jsx)(ne,{dataset:String(e.dataset??``),rows:H(e.rows),values:H(e.values),runtimeFilter:c,dataSource:n,onDrill:l,order:f,withTotals:u===`summary`||u===`matrix`});return(0,o.jsxs)(`div`,{className:`${a??``} flex flex-col gap-3`,"data-testid":`dataset-report`,"data-report-name":e.name,"data-report-presentation":u,children:[p?g:h,p?h:g]})},de=e=>{let{dataSource:t,rows:a,runtimeFilter:s,onDrill:c,className:l}=e,u=n.useContext(i.SchemaRendererContext),d=t??u?.dataSource,f=e.schema;if(f&&typeof f==`object`&&f.type===`report`&&f.report&&typeof f.report==`object`&&(f=f.report),I(f))return(0,o.jsx)(ue,{report:f,dataSource:d,runtimeFilter:s,onDrill:c,className:l});if((0,r.isSpecReport)(f)){let e={type:`report-viewer`,report:(0,r.specReportToPresentation)(f),data:a??[],showToolbar:!1};return(0,o.jsx)(`div`,{className:l,"data-testid":`report-presentation-bridge`,children:(0,o.jsx)(F,{schema:e})})}return(0,o.jsx)(_,{schema:f})};async function fe(e,t){let{dataSource:n,resource:r,queryParams:i,format:a,exportConfig:o,locale:s}=t,c=a||e.defaultExportFormat||`pdf`;try{let t=(await n.find(r,i)).data||[];return w(c,e,t,{format:c,...e.exportConfigs?.[c],...o},s),{success:!0,recordCount:t.length,format:c}}catch(e){return{success:!1,recordCount:0,format:c,error:e.message}}}function pe(e,t,n={}){let{columns:r,filename:i,includeAggregationRow:a=!1,locale:o=`en`}=n,s=r||(e.fields||[]).map(he),c=s.map(e=>e.header),l=t.map((e,t)=>s.map(n=>{if(n.formula)return n.formula.replace(/\{ROW\}/g,String(t+2));let r=e[n.name];return ge(r,n.numberFormat,o)}));if(a&&t.length>0){let n=s.map((n,r)=>{let i=(e.fields||[]).find(e=>e.name===n.name);if(i?.aggregation){let e=ve(r),n=t.length+1;switch(i.aggregation){case`sum`:return`=SUM(${e}2:${e}${n})`;case`avg`:return`=AVERAGE(${e}2:${e}${n})`;case`count`:return`=COUNTA(${e}2:${e}${n})`;case`min`:return`=MIN(${e}2:${e}${n})`;case`max`:return`=MAX(${e}2:${e}${n})`;default:return``}}return``});l.push(n)}be(``+[c.join(` `),...l.map(e=>e.join(` `))].join(`
|
|
59
|
+
`),i||`${e.title||`report`}.tsv`,`text/tab-separated-values`)}function me(e,t,n,r){return async()=>{let i=e.schedule;if(!i?.enabled)return[];let a=i.formats||[e.defaultExportFormat||`pdf`],o=[];for(let r of a){let i=await fe(e,{dataSource:t,resource:n,format:r});o.push(i)}return r(e,i),o}}function he(e){return{name:e.name,header:e.label||e.name}}function ge(e,t,n=`en`){return e==null?``:typeof e==`number`&&t?v(e,n,_e(t)):ye(String(e))}function _e(e){if(e.includes(`%`))return{style:`percent`,minimumFractionDigits:0};let t=(e.match(/0/g)||[]).length;return{minimumFractionDigits:Math.max(0,t-1),maximumFractionDigits:Math.max(0,t-1)}}function ve(e){let t=``,n=e;for(;n>=0;)t=String.fromCharCode(n%26+65)+t,n=Math.floor(n/26)-1;return t}function ye(e){if(e.length>0){let t=e.charAt(0);if(t===`=`||t===`+`||t===`-`||t===`@`||t===`|`)return`'${e}`}return e}function be(e,t,n){let r=new Blob([e],{type:`${n};charset=utf-8`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}t.ComponentRegistry.register(`report`,de,{namespace:`plugin-report`,label:`Report`,category:`Report`,inputs:[{name:`title`,type:`string`},{name:`description`,type:`string`},{name:`chart`,type:`code`},{name:`report`,type:`object`,description:"The report to render, as `@objectstack/spec` declares it (`ReportSchema`: `name`, `label`, `type`, `dataset`, `rows`, `values`, …). When present, the block renders this report and reads none of its own presentation inputs."}]}),t.ComponentRegistry.register(`report-viewer`,F,{namespace:`plugin-report`,label:`Report Viewer`,category:`Report`,inputs:[{name:`report`,type:`code`},{name:`showToolbar`,type:`boolean`}]}),e.DatasetReportRenderer=ue,e.LegacyReportRenderer=_,e.ReportRenderer=de,e.ReportViewer=F,e.createScheduleTrigger=me,e.exportAsCSV=y,e.exportAsExcel=C,e.exportAsHTML=x,e.exportAsJSON=b,e.exportAsPDF=S,e.exportExcelWithFormulas=pe,e.exportReport=w,e.exportWithLiveData=fe,e.formatValue=A,e.isDatasetReport=I,Object.defineProperty(e,"mergeFilters",{enumerable:!0,get:function(){return t.mergeFilters}})});
|
|
@@ -75,8 +75,10 @@
|
|
|
75
75
|
* chart's per-category option COLOURS (`buildOptionColorMap`) and its declared
|
|
76
76
|
* picklist ORDER (`buildCategoryOrder`, framework#3588) — the same two
|
|
77
77
|
* derivations `DatasetWidget` already runs off this exact hook for its own
|
|
78
|
-
* chart-only needs (see that hook's own doc comment). `DatasetReportChart`
|
|
79
|
-
* the one call site
|
|
80
|
-
*
|
|
78
|
+
* chart-only needs (see that hook's own doc comment). `DatasetReportChart` was
|
|
79
|
+
* the one call site when objectui#4906 added it; since objectui#12243 the flat
|
|
80
|
+
* table and the matrix read it too, for each select dimension's declared ORDER,
|
|
81
|
+
* and derive their label maps from that same read, so no surface in
|
|
82
|
+
* `DatasetReportRenderer` calls the label-only {@link useDatasetDimensionLabels}.
|
|
81
83
|
*/
|
|
82
84
|
export { useDatasetDimensionLabels, useDatasetDimensionMeta, type DimensionLabelMaps, type DatasetDimensionMeta, } from '@object-ui/react';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-report",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "18.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.umd.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -19,31 +19,28 @@
|
|
|
19
19
|
"LICENSE"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"@object-ui/
|
|
27
|
-
"@object-ui/
|
|
28
|
-
"@object-ui/
|
|
29
|
-
"@object-ui/i18n": "17.6.0",
|
|
30
|
-
"@object-ui/plugin-grid": "17.6.0",
|
|
31
|
-
"@object-ui/react": "17.6.0",
|
|
32
|
-
"@object-ui/types": "17.6.0"
|
|
22
|
+
"lucide-react": "^1.43.0",
|
|
23
|
+
"@object-ui/components": "18.0.0",
|
|
24
|
+
"@object-ui/core": "18.0.0",
|
|
25
|
+
"@object-ui/fields": "18.0.0",
|
|
26
|
+
"@object-ui/i18n": "18.0.0",
|
|
27
|
+
"@object-ui/react": "18.0.0",
|
|
28
|
+
"@object-ui/types": "18.0.0"
|
|
33
29
|
},
|
|
34
30
|
"peerDependencies": {
|
|
35
31
|
"react": "^18.0.0 || ^19.0.0",
|
|
36
32
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
37
33
|
},
|
|
38
34
|
"devDependencies": {
|
|
39
|
-
"@objectstack/spec": "^
|
|
35
|
+
"@objectstack/spec": "^18.0.0",
|
|
40
36
|
"@types/node": "^26.2.0",
|
|
41
37
|
"@types/react": "19.2.18",
|
|
42
38
|
"@types/react-dom": "19.2.4",
|
|
43
39
|
"@vitejs/plugin-react": "^6.0.5",
|
|
44
40
|
"vite": "^8.2.1",
|
|
45
41
|
"vite-plugin-dts": "^5.0.3",
|
|
46
|
-
"vitest": "^4.1.10"
|
|
42
|
+
"vitest": "^4.1.10",
|
|
43
|
+
"@object-ui/test-support": "17.4.0"
|
|
47
44
|
},
|
|
48
45
|
"description": "Report plugin for Object UI — schema-driven pivot tables, grouped aggregations and printable report layouts",
|
|
49
46
|
"keywords": [
|
|
@@ -77,7 +74,7 @@
|
|
|
77
74
|
"build": "vite build",
|
|
78
75
|
"type-check": "tsc --noEmit && tsc -p tsconfig.test.json",
|
|
79
76
|
"clean": "rm -rf dist",
|
|
80
|
-
"test": "vitest run",
|
|
77
|
+
"test": "vitest run --root ../.. packages/plugin-report/",
|
|
81
78
|
"lint": "eslint ."
|
|
82
79
|
}
|
|
83
80
|
}
|