@object-ui/plugin-report 17.5.0 → 17.6.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.
@@ -55,5 +55,5 @@ ${e.description?`<p class="description">${w(e.description)}</p>`:``}
55
55
  </body>
56
56
  </html>`),o.document.close(),o.onload=()=>{o.print()}}function S(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=T(n),typeof n==`string`&&(n.includes(`,`)||n.includes(`"`)||n.includes(`
57
57
  `)||n.includes(` `))?`"${n.replace(/"/g,`""`)}"`:n??``}));O(``+[...n?.includeHeaders===!1?[]:[i.join(` `)],...a.map(e=>e.join(` `))].join(`
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`)}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 ee(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 M(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 N=({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)=>M(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=ee(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 P(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`)}function F(e,t){return e?typeof e==`string`?e:typeof e==`object`&&typeof e.default==`string`?e.default:t:t}function I(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&!!e):[]}function L(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 R(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 z(e,t,r,i,a,o,s){let[c,l]=n.useState({status:`idle`,rows:[]}),u=R(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 B({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 V({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 H(){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 U=`cursor-pointer hover:bg-accent/40`;function W({dataset:e,rows:n,values:r,runtimeFilter:a,dataSource:s,onDrill:c,order:u,withTotals:d}){let f=z(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)(B,{dataset:e});if(f.status===`loading`||f.status===`idle`)return(0,o.jsx)(V,{status:f.status});if(f.status===`error`)return(0,o.jsx)(V,{status:`error`,error:f.error});if(f.rows.length===0)return(0,o.jsx)(H,{});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${_?` ${U}`:``}`,"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 G(e){switch(e){case`summary`:return`summary`;case`matrix`:return`matrix`;case`joined`:return`joined`;default:return`tabular`}}function K(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 te(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 ne({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=K(r.type),m=p.kind===`series`||p.kind===`single_value`,h=z(e,p.kind===`series`&&d?[d]:[],m&&f?[f]:[],a,c,void 0,u),g=te(`chart`),{fieldLabel:_}=(0,l.useSafeFieldLabel)(),v=(0,l.useDisplayLocale)(),y=n.useMemo(()=>d?[d]:[],[d]),b=(0,i.useDatasetDimensionLabels)(h.object,h.dimensionFields,y),x=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;if(p.kind===`single_value`){let{measureField:e,headerLabel:n}=(0,t.buildDatasetFieldHelpers)(h.fields,h.object,_),r=e(f);return(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-metric`,children:[x?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:x}):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],r?.format,r?.currency,r?.percentScale,v)}),(0,o.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:n(f)})]})]})}return g?(0,o.jsxs)(`div`,{className:`rounded-md border bg-card p-3`,"data-testid":`dataset-report-chart`,children:[x?(0,o.jsx)(`h3`,{className:`mb-2 text-sm font-semibold`,children:x}):null,(0,o.jsx)(g,{schema:{chartType:p.chartType,data:(0,t.relabelDimensions)(h.rows,b),xAxisKey:d,series:[{dataKey:f}],height:typeof r.height==`number`?r.height:280,isAnimationActive:!1}})]}):null}function q(e,n){return(0,t.pivotBucketId)(e.map(e=>(0,t.pivotDimensionValue)(n[e])))}function J(e,n,r){return e.map(e=>(0,t.formatDimensionValue)(n[e],r)).join(` / `)}function Y({dataset:e,rows:r,columnsAcross:a,values:s,runtimeFilter:c,dataSource:u,onDrill:d,order:f}){let p=z(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=q(r,c),f=q(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:J(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:J(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)(B,{dataset:e});if(p.status===`loading`||p.status===`idle`)return(0,o.jsx)(V,{status:p.status});if(p.status===`error`)return(0,o.jsx)(V,{status:`error`,error:p.error});if(!v||v.rowHeaders.length===0)return(0,o.jsx)(H,{});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(q(r,e),e);let O=new Map;for(let e of E(a)??[])O.set(q(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?` ${U}`:``}`,"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 X=({report:e,dataSource:n,runtimeFilter:r,onDrill:i,className:a})=>{let s=(0,t.mergeFilters)(e.runtimeFilter??e.filter,r),c=e.drilldown===!1?void 0:i,l=G(e.type);if(l===`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)=>{let i=(0,t.mergeFilters)(s,e.runtimeFilter??e.filter),a=I(e.columns),l=L(e.order),u=G(e.type),d=u===`matrix`&&a.length>0?(0,o.jsx)(Y,{dataset:String(e.dataset??``),rows:I(e.rows),columnsAcross:a,values:I(e.values),runtimeFilter:i,dataSource:n,onDrill:c,order:l}):(0,o.jsx)(W,{dataset:String(e.dataset??``),rows:I(e.rows),values:I(e.values),runtimeFilter:i,dataSource:n,onDrill:c,order:l,withTotals:u===`summary`||u===`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:F(e.label,e.name??`Block ${r+1}`)}),e.description?(0,o.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:F(e.description,``)}):null]}),d]},e.name??`block-${r}`)})});let u=I(e.columns),d=L(e.order);if(l===`matrix`&&u.length>0)return(0,o.jsx)(`div`,{className:a,"data-testid":`dataset-report`,"data-report-name":e.name,children:(0,o.jsx)(Y,{dataset:String(e.dataset??``),rows:I(e.rows),columnsAcross:u,values:I(e.values),runtimeFilter:s,dataSource:n,onDrill:c,order:d})});let f=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":l,children:[f?(0,o.jsx)(ne,{dataset:String(e.dataset??``),chart:f,runtimeFilter:s,dataSource:n,order:d}):null,(0,o.jsx)(W,{dataset:String(e.dataset??``),rows:I(e.rows),values:I(e.values),runtimeFilter:s,dataSource:n,onDrill:c,order:d,withTotals:l===`summary`||l===`matrix`})]})},Z=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),P(f))return(0,o.jsx)(X,{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)(N,{schema:e})})}return(0,o.jsx)(_,{schema:f})};async function Q(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 re(e,t,n={}){let{columns:r,filename:i,includeAggregationRow:a=!1}=n,o=r||(e.fields||[]).map(ae),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 oe(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=se(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)}le(``+[s.join(` `),...c.map(e=>e.join(` `))].join(`
59
- `),i||`${e.title||`report`}.tsv`,`text/tab-separated-values`)}function ie(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 Q(e,{dataSource:t,resource:n,format:r});o.push(i)}return r(e,i),o}}function ae(e){return{name:e.name,header:e.label||e.name}}function oe(e,t){return e==null?``:typeof e==`number`&&t?e.toLocaleString(`en-US`,$(t)):ce(String(e))}function $(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 se(e){let t=``,n=e;for(;n>=0;)t=String.fromCharCode(n%26+65)+t,n=Math.floor(n/26)-1;return t}function ce(e){if(e.length>0){let t=e.charAt(0);if(t===`=`||t===`+`||t===`-`||t===`@`||t===`|`)return`'${e}`}return e}function le(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`,Z,{namespace:`report`,label:`Report`,category:`Report`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`description`,type:`string`,label:`Description`},{name:`chart`,type:`code`,label:`Chart Configuration`}]}),t.ComponentRegistry.register(`spec-report`,Z,{namespace:`report`,label:`Spec Report`,category:`Report`,inputs:[{name:`dataset`,type:`string`,label:`Dataset`},{name:`type`,type:`string`,label:`Report Type`}]}),t.ComponentRegistry.register(`report-viewer`,N,{namespace:`report`,label:`Report Viewer`,category:`Report`,inputs:[{name:`report`,type:`code`,label:`Report Definition`},{name:`showToolbar`,type:`boolean`,label:`Show Toolbar`}]}),e.DatasetReportRenderer=X,e.LegacyReportRenderer=_,e.ReportRenderer=Z,e.ReportViewer=N,e.createScheduleTrigger=ie,e.exportAsCSV=v,e.exportAsExcel=S,e.exportAsHTML=b,e.exportAsJSON=y,e.exportAsPDF=x,e.exportExcelWithFormulas=re,e.exportReport=C,e.exportWithLiveData=Q,e.formatValue=k,e.isDatasetReport=P,Object.defineProperty(e,"mergeFilters",{enumerable:!0,get:function(){return t.mergeFilters}})});
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`)}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 ce(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 $(e,{dataSource:t,resource:n,format:r});o.push(i)}return r(e,i),o}}function le(e){return{name:e.name,header:e.label||e.name}}function ue(e,t){return e==null?``:typeof e==`number`&&t?e.toLocaleString(`en-US`,de(t)):pe(String(e))}function de(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 fe(e){let t=``,n=e;for(;n>=0;)t=String.fromCharCode(n%26+65)+t,n=Math.floor(n/26)-1;return t}function pe(e){if(e.length>0){let t=e.charAt(0);if(t===`=`||t===`+`||t===`-`||t===`@`||t===`|`)return`'${e}`}return e}function me(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`,Q,{namespace:`report`,label:`Report`,category:`Report`,inputs:[{name:`title`,type:`string`,label:`Title`},{name:`description`,type:`string`,label:`Description`},{name:`chart`,type:`code`,label:`Chart Configuration`}]}),t.ComponentRegistry.register(`spec-report`,Q,{namespace:`report`,label:`Spec Report`,category:`Report`,inputs:[{name:`dataset`,type:`string`,label:`Dataset`},{name:`type`,type:`string`,label:`Report Type`}]}),t.ComponentRegistry.register(`report-viewer`,P,{namespace:`report`,label:`Report Viewer`,category:`Report`,inputs:[{name:`report`,type:`code`,label:`Report Definition`},{name:`showToolbar`,type:`boolean`,label:`Show Toolbar`}]}),e.DatasetReportRenderer=Z,e.LegacyReportRenderer=_,e.ReportRenderer=Q,e.ReportViewer=P,e.createScheduleTrigger=ce,e.exportAsCSV=v,e.exportAsExcel=S,e.exportAsHTML=b,e.exportAsJSON=y,e.exportAsPDF=x,e.exportExcelWithFormulas=se,e.exportReport=C,e.exportWithLiveData=$,e.formatValue=k,e.isDatasetReport=F,Object.defineProperty(e,"mergeFilters",{enumerable:!0,get:function(){return t.mergeFilters}})});
@@ -67,5 +67,16 @@
67
67
  *
68
68
  * They are pinned once, at the shared hook, in
69
69
  * `packages/react/src/hooks/__tests__/useDatasetDimensionLabels.test.tsx`.
70
+ *
71
+ * ## `useDatasetDimensionMeta` (objectui#4906)
72
+ *
73
+ * The locale-free half alone, re-exported for the ONE report surface that
74
+ * derives more from the resolved field metadata than label maps: the embedded
75
+ * chart's per-category option COLOURS (`buildOptionColorMap`) and its declared
76
+ * picklist ORDER (`buildCategoryOrder`, framework#3588) — the same two
77
+ * derivations `DatasetWidget` already runs off this exact hook for its own
78
+ * chart-only needs (see that hook's own doc comment). `DatasetReportChart` is
79
+ * the one call site; every other report surface still wants the label-only
80
+ * {@link useDatasetDimensionLabels} above.
70
81
  */
71
- export { useDatasetDimensionLabels, type DimensionLabelMaps } from '@object-ui/react';
82
+ 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": "17.5.0",
3
+ "version": "17.6.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.umd.cjs",
6
6
  "module": "dist/index.js",
@@ -20,24 +20,24 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "clsx": "^2.1.1",
23
- "lucide-react": "^1.29.0",
23
+ "lucide-react": "^1.31.0",
24
24
  "react-i18next": "^17.0.11",
25
25
  "tailwind-merge": "^3.6.0",
26
- "@object-ui/components": "17.5.0",
27
- "@object-ui/core": "17.5.0",
28
- "@object-ui/fields": "17.5.0",
29
- "@object-ui/i18n": "17.5.0",
30
- "@object-ui/plugin-grid": "17.5.0",
31
- "@object-ui/react": "17.5.0",
32
- "@object-ui/types": "17.5.0"
26
+ "@object-ui/components": "17.6.0",
27
+ "@object-ui/core": "17.6.0",
28
+ "@object-ui/fields": "17.6.0",
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"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": "^18.0.0 || ^19.0.0",
36
36
  "react-dom": "^18.0.0 || ^19.0.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@objectstack/spec": "^17.0.0-rc.6",
40
- "@types/node": "^26.1.2",
39
+ "@objectstack/spec": "^17.0.0",
40
+ "@types/node": "^26.2.0",
41
41
  "@types/react": "19.2.18",
42
42
  "@types/react-dom": "19.2.4",
43
43
  "@vitejs/plugin-react": "^6.0.5",