@object-ui/plugin-report 2.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,137 @@
1
+ # @object-ui/plugin-report
2
+
3
+ Report components for Object UI — build, view, render, and export reports with scheduling support.
4
+
5
+ ## Features
6
+
7
+ - 📊 **Report Builder** - Visual drag-and-drop report construction
8
+ - 👁️ **Report Viewer** - Interactive report viewing with toolbar controls
9
+ - 🖨️ **Report Renderer** - Render reports from JSON definitions with charts
10
+ - 📤 **Multi-Format Export** - Export to CSV, JSON, HTML, PDF, and Excel
11
+ - 🔄 **Live Data Export** - Export with real-time data via `exportWithLiveData`
12
+ - 📈 **Excel Formulas** - Export Excel files with live formulas via `exportExcelWithFormulas`
13
+ - ⏰ **Schedule Config** - Configure recurring report generation and delivery
14
+ - 📦 **Auto-registered** - Components register with `ComponentRegistry` on import
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @object-ui/plugin-report
20
+ ```
21
+
22
+ **Peer Dependencies:**
23
+ - `react` ^18.0.0 || ^19.0.0
24
+ - `react-dom` ^18.0.0 || ^19.0.0
25
+ - `@object-ui/core`
26
+
27
+ ## Quick Start
28
+
29
+ ```tsx
30
+ import { ReportBuilder, ReportViewer, ReportRenderer } from '@object-ui/plugin-report';
31
+
32
+ function ReportEditorPage() {
33
+ return <ReportBuilder report={initialReport} />;
34
+ }
35
+
36
+ function ReportViewPage() {
37
+ return <ReportViewer report={reportDefinition} showToolbar />;
38
+ }
39
+
40
+ function EmbeddedReport() {
41
+ return (
42
+ <ReportRenderer
43
+ title="Monthly Sales"
44
+ description="Sales performance overview"
45
+ chart={chartConfig}
46
+ />
47
+ );
48
+ }
49
+ ```
50
+
51
+ ## API
52
+
53
+ ### ReportBuilder
54
+
55
+ Visual report construction interface:
56
+
57
+ ```tsx
58
+ <ReportBuilder report={initialReport} />
59
+ ```
60
+
61
+ ### ReportViewer
62
+
63
+ Interactive report viewer with toolbar:
64
+
65
+ ```tsx
66
+ <ReportViewer report={reportDefinition} showToolbar />
67
+ ```
68
+
69
+ ### ReportRenderer
70
+
71
+ Renders a report from a JSON chart configuration:
72
+
73
+ ```tsx
74
+ <ReportRenderer title="Revenue" description="Q4 Revenue" chart={chartConfig} />
75
+ ```
76
+
77
+ ### Export Functions
78
+
79
+ Export reports in multiple formats:
80
+
81
+ ```tsx
82
+ import {
83
+ exportReport,
84
+ exportAsCSV,
85
+ exportAsJSON,
86
+ exportAsHTML,
87
+ exportAsPDF,
88
+ exportAsExcel,
89
+ } from '@object-ui/plugin-report';
90
+
91
+ await exportAsCSV(reportData, 'sales-report.csv');
92
+ await exportAsPDF(reportData, 'sales-report.pdf');
93
+ await exportAsExcel(reportData, 'sales-report.xlsx');
94
+ ```
95
+
96
+ ### Live Export
97
+
98
+ Export with real-time data and Excel formulas:
99
+
100
+ ```tsx
101
+ import { exportWithLiveData, exportExcelWithFormulas } from '@object-ui/plugin-report';
102
+
103
+ await exportWithLiveData(reportConfig, { format: 'pdf' });
104
+ await exportExcelWithFormulas(reportConfig, {
105
+ columns: [{ field: 'total', formula: 'SUM(B2:B100)' }],
106
+ });
107
+ ```
108
+
109
+ ### ScheduleConfig
110
+
111
+ Configure recurring report generation:
112
+
113
+ ```tsx
114
+ import { ScheduleConfig, createScheduleTrigger } from '@object-ui/plugin-report';
115
+
116
+ <ScheduleConfig
117
+ reportId="monthly-sales"
118
+ onSave={(schedule) => saveSchedule(schedule)}
119
+ />
120
+
121
+ const trigger = createScheduleTrigger((reportId) => generateReport(reportId));
122
+ ```
123
+
124
+ ### Schema-Driven Usage
125
+
126
+ Components auto-register with `ComponentRegistry`:
127
+
128
+ ```json
129
+ {
130
+ "type": "report-builder",
131
+ "report": { "sections": [] }
132
+ }
133
+ ```
134
+
135
+ ## License
136
+
137
+ MIT
package/dist/index.js CHANGED
@@ -1469,6 +1469,7 @@ L.register(
1469
1469
  "report",
1470
1470
  De,
1471
1471
  {
1472
+ namespace: "report",
1472
1473
  label: "Report",
1473
1474
  category: "Report",
1474
1475
  inputs: [
@@ -1482,6 +1483,7 @@ L.register(
1482
1483
  "report-viewer",
1483
1484
  we,
1484
1485
  {
1486
+ namespace: "report",
1485
1487
  label: "Report Viewer",
1486
1488
  category: "Report",
1487
1489
  inputs: [
@@ -1494,6 +1496,7 @@ L.register(
1494
1496
  "report-builder",
1495
1497
  Ue,
1496
1498
  {
1499
+ namespace: "report",
1497
1500
  label: "Report Builder",
1498
1501
  category: "Report",
1499
1502
  inputs: [
@@ -77,4 +77,4 @@ ${s.description?`<p class="description">${O(s.description)}</p>`:""}
77
77
  </html>`),j.document.close(),j.onload=()=>{j.print()}}function me(s,d,a){const c=s.fields||[],u=c.map(i=>i.label||i.name),p=d.map(i=>c.map(x=>{let n=i[x.name];return n=xe(n),typeof n=="string"&&(n.includes(",")||n.includes('"')||n.includes(`
78
78
  `)||n.includes(" "))?`"${n.replace(/"/g,'""')}"`:n??""})),j="\uFEFF"+[...(a==null?void 0:a.includeHeaders)!==!1?[u.join(" ")]:[],...p.map(i=>i.join(" "))].join(`
79
79
  `);J(j,(a==null?void 0:a.filename)||`${s.title||"report"}.tsv`,"text/tab-separated-values")}function ee(s,d,a,c){switch(s){case"csv":oe(d,a,c);break;case"json":ue(d,a,c);break;case"html":K(d,a,c);break;case"pdf":he(d,a,c);break;case"excel":me(d,a,c);break;default:console.warn(`Unsupported export format: ${s}`)}}function O(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function xe(s){if(typeof s=="string"&&s.length>0){const d=s.charAt(0);if(d==="="||d==="+"||d==="-"||d==="@"||d==="|")return` ${s}`}return s}function pe(s){return["A4","A3","Letter","Legal"].includes(s||"")?s:"A4"}function fe(s){return s==="landscape"?"landscape":"portrait"}function J(s,d,a){const c=new Blob([s],{type:`${a};charset=utf-8`}),u=URL.createObjectURL(c),p=document.createElement("a");p.href=u,p.download=d,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(u)}const te=({schema:s,onRefresh:d})=>{var E,S;const{report:a,data:c,showToolbar:u=!0,allowExport:p=!0,allowPrint:j=!0,loading:i=!1}=s,x=m=>{var v;if(!a){console.warn("ReportViewer: Cannot export, no report defined");return}ee(m,a,c||[],(v=a.exportConfigs)==null?void 0:v[m])},n=()=>{window.print()},b=()=>{d==null||d()},y=(m,v)=>{if(!c)return 0;const N=c.map(k=>Number(k[m])||0);switch(v){case"count":return c.length;case"sum":return N.reduce((k,g)=>k+g,0);case"avg":return N.length>0?(N.reduce((k,g)=>k+g,0)/N.length).toFixed(2):0;case"min":return N.length>0?Math.min(...N):0;case"max":return N.length>0?Math.max(...N):0;default:return""}};return a?e.jsxs("div",{className:"space-y-4",children:[u&&e.jsxs("div",{className:"flex items-center justify-between gap-2 p-4 bg-card rounded-lg border",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:a.title}),a.description&&e.jsx("p",{className:"text-sm text-muted-foreground",children:a.description})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[a.refreshInterval&&e.jsxs(r.Button,{variant:"outline",size:"sm",onClick:b,children:[e.jsx(w.RefreshCw,{className:"h-4 w-4 mr-2"}),"Refresh"]}),j&&e.jsxs(r.Button,{variant:"outline",size:"sm",onClick:n,children:[e.jsx(w.Printer,{className:"h-4 w-4 mr-2"}),"Print"]}),p&&a.showExportButtons&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs(r.Button,{variant:"outline",size:"sm",onClick:()=>x("pdf"),children:[e.jsx(w.Download,{className:"h-4 w-4 mr-2"}),"PDF"]}),e.jsxs(r.Button,{variant:"outline",size:"sm",onClick:()=>x("excel"),children:[e.jsx(w.Download,{className:"h-4 w-4 mr-2"}),"Excel"]}),e.jsxs(r.Button,{variant:"outline",size:"sm",onClick:()=>x("csv"),children:[e.jsx(w.Download,{className:"h-4 w-4 mr-2"}),"CSV"]})]})]})]}),e.jsxs(r.Card,{children:[e.jsxs(r.CardHeader,{children:[!u&&a.title&&e.jsx(r.CardTitle,{children:a.title}),!u&&a.description&&e.jsx(r.CardDescription,{children:a.description})]}),e.jsxs(r.CardContent,{className:"space-y-6",children:[i&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"Loading report data..."}),!i&&((E=a.sections)==null?void 0:E.map((m,v)=>{var N,k;return m.visible===!1?null:e.jsxs("div",{className:"space-y-2",children:[m.title&&e.jsx("h3",{className:"text-lg font-semibold border-b pb-2",children:m.title}),m.type==="header"&&m.title&&e.jsx("div",{className:"text-2xl font-bold py-4",children:m.title}),m.type==="summary"&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:(N=a.fields)==null?void 0:N.filter(g=>g.showInSummary).map((g,L)=>e.jsx(r.Card,{children:e.jsxs(r.CardContent,{className:"p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:g.label||g.name}),e.jsx("div",{className:"text-2xl font-bold",children:y(g.name,g.aggregation)})]})},L))}),m.type==="chart"&&m.chart&&e.jsx("div",{className:"min-h-[300px]",children:(()=>{let g=m.chart.type;const L=!!m.chart.chartType;!g&&L&&(g="chart"),g&&!!_.ComponentRegistry.get(g)||(g="chart");const P=g==="chart"?{xAxisKey:m.chart.xAxisKey||m.chart.xAxisField||"name",series:m.chart.series||(m.chart.yAxisFields?m.chart.yAxisFields.map(Y=>({dataKey:Y})):[]),chartType:m.chart.chartType||"bar"}:{},V={...m.chart,type:g,...P,data:c||m.chart.data,className:m.chart.className||"w-full h-[350px]"};return e.jsx(ne.SchemaRenderer,{schema:V})})()}),m.type==="table"&&e.jsx("div",{className:"border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted",children:e.jsx("tr",{children:(k=m.columns)==null?void 0:k.map((g,L)=>e.jsx("th",{className:"px-4 py-2 text-left font-medium",children:g.label||g.name},L))})}),e.jsx("tbody",{children:c==null?void 0:c.map((g,L)=>{var D;return e.jsx("tr",{className:"border-t",children:(D=m.columns)==null?void 0:D.map((I,P)=>e.jsx("td",{className:"px-4 py-2",children:g[I.name]},P))},L)})})]})}),m.type==="text"&&m.text&&e.jsx("div",{className:"prose max-w-none",children:e.jsx("p",{children:m.text})}),m.type==="page-break"&&e.jsx("div",{className:"border-t-2 border-dashed my-8 print:page-break-after-always"}),m.content&&e.jsx(ne.SchemaRenderer,{schema:m.content})]},v)})),!a.sections&&c&&c.length>0&&e.jsx("div",{className:"border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted",children:e.jsx("tr",{children:(S=a.fields)==null?void 0:S.map((m,v)=>e.jsx("th",{className:"px-4 py-2 text-left font-medium",children:m.label||m.name},v))})}),e.jsx("tbody",{children:c.map((m,v)=>{var N;return e.jsx("tr",{className:"border-t",children:(N=a.fields)==null?void 0:N.map((k,g)=>e.jsx("td",{className:"px-4 py-2",children:m[k.name]},g))},v)})})]})})]})]})]}):e.jsx(r.Card,{children:e.jsx(r.CardContent,{className:"p-8 text-center text-muted-foreground",children:"No report to display"})})},je=({schedule:s,onChange:d})=>{var x;const[a,c]=B.useState(s||{enabled:!1,frequency:"weekly",time:"09:00",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,recipients:[],formats:["pdf"]}),u=n=>{const b={...a,...n};c(b),d==null||d(b)},p=[{value:"once",label:"Once"},{value:"daily",label:"Daily"},{value:"weekly",label:"Weekly"},{value:"monthly",label:"Monthly"},{value:"quarterly",label:"Quarterly"},{value:"yearly",label:"Yearly"}],j=[{value:"pdf",label:"PDF"},{value:"excel",label:"Excel"},{value:"csv",label:"CSV"},{value:"html",label:"HTML"}],i=[{value:0,label:"Sunday"},{value:1,label:"Monday"},{value:2,label:"Tuesday"},{value:3,label:"Wednesday"},{value:4,label:"Thursday"},{value:5,label:"Friday"},{value:6,label:"Saturday"}];return e.jsxs(r.Card,{children:[e.jsx(r.CardHeader,{children:e.jsxs(r.CardTitle,{className:"flex items-center gap-2",children:[e.jsx(w.Calendar,{className:"h-5 w-5"}),"Schedule Configuration"]})}),e.jsxs(r.CardContent,{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"schedule-enabled",checked:a.enabled||!1,onChange:n=>u({enabled:n.target.checked}),className:"rounded"}),e.jsx(r.Label,{htmlFor:"schedule-enabled",children:"Enable Scheduled Report"})]}),a.enabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Frequency"}),e.jsx("select",{className:"w-full border rounded-md p-2 bg-background",value:a.frequency||"weekly",onChange:n=>u({frequency:n.target.value}),children:p.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),a.frequency==="weekly"&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Day of Week"}),e.jsx("select",{className:"w-full border rounded-md p-2 bg-background",value:a.dayOfWeek??1,onChange:n=>u({dayOfWeek:Number(n.target.value)}),children:i.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),a.frequency==="monthly"&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Day of Month"}),e.jsx(r.Input,{type:"number",min:1,max:31,value:a.dayOfMonth??1,onChange:n=>u({dayOfMonth:Number(n.target.value)})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(r.Label,{className:"flex items-center gap-2",children:[e.jsx(w.Clock,{className:"h-4 w-4"}),"Time"]}),e.jsx(r.Input,{type:"time",value:a.time||"09:00",onChange:n=>u({time:n.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Timezone"}),e.jsx(r.Input,{value:a.timezone||"",onChange:n=>u({timezone:n.target.value}),placeholder:"e.g. America/New_York"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Export Formats"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:j.map(n=>{var b;return e.jsxs("label",{className:"flex items-center gap-1.5 px-3 py-1.5 border rounded-md cursor-pointer hover:bg-muted/50",children:[e.jsx("input",{type:"checkbox",checked:((b=a.formats)==null?void 0:b.includes(n.value))||!1,onChange:y=>{const E=a.formats||[];u({formats:y.target.checked?[...E,n.value]:E.filter(S=>S!==n.value)})},className:"rounded"}),e.jsx("span",{className:"text-sm",children:n.label})]},n.value)})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(r.Label,{className:"flex items-center gap-2",children:[e.jsx(w.Mail,{className:"h-4 w-4"}),"Email Recipients"]}),e.jsx(r.Input,{placeholder:"email1@example.com, email2@example.com",value:((x=a.recipients)==null?void 0:x.join(", "))||"",onChange:n=>u({recipients:n.target.value.split(",").map(b=>b.trim()).filter(Boolean)})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Email Subject"}),e.jsx(r.Input,{value:a.subject||"",onChange:n=>u({subject:n.target.value}),placeholder:"Scheduled Report: {report_title}"})]})]})]})]})},be=({schema:s})=>{const{report:d,dataSources:a=[],availableFields:c=[],showPreview:u=!0,onSave:p,onCancel:j}=s,[i,x]=B.useState(d||{type:"report",title:"New Report",fields:[],filters:[],groupBy:[],sections:[],showExportButtons:!0,showPrintButton:!0}),[n,b]=B.useState(i.fields||[]),[y,E]=B.useState(i.filters||[]),[S,m]=B.useState(i.groupBy||[]),[v,N]=B.useState(i.sections||[]),k=()=>{if(c.length>0&&n.length<c.length){const l=c.find(o=>!n.some(h=>h.name===o.name));if(l){const o=[...n,l];b(o),x({...i,fields:o})}}},g=l=>{const o=n.filter((h,A)=>A!==l);b(o),x({...i,fields:o})},L=(l,o)=>{const h=[...n];h[l]=o,b(h),x({...i,fields:h})},D=()=>{var h;const l={field:((h=c[0])==null?void 0:h.name)||"",operator:"equals",value:""},o=[...y,l];E(o),x({...i,filters:o})},I=l=>{const o=y.filter((h,A)=>A!==l);E(o),x({...i,filters:o})},P=(l,o)=>{const h=[...y];h[l]=o,E(h),x({...i,filters:h})},V=()=>{var h;const l={field:((h=c[0])==null?void 0:h.name)||"",sort:"asc"},o=[...S,l];m(o),x({...i,groupBy:o})},Y=l=>{const o=S.filter((h,A)=>A!==l);m(o),x({...i,groupBy:o})},z=(l,o)=>{const h=[...S];h[l]=o,m(h),x({...i,groupBy:h})},W=l=>{const o={type:l,title:`New ${l} Section`},h=[...v,o];N(h),x({...i,sections:h})},ae=l=>{const o=v.filter((h,A)=>A!==l);N(o),x({...i,sections:o})},$=(l,o)=>{const h=[...v];h[l]=o,N(h),x({...i,sections:h})},X=()=>{console.log("Saving report:",i),p&&alert("Report saved! (Handler: "+p+")")},re=()=>{j&&console.log("Report cancelled:",j)};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs(r.Card,{children:[e.jsxs(r.CardHeader,{children:[e.jsx(r.CardTitle,{children:"Report Builder"}),e.jsx(r.CardDescription,{children:"Configure your report settings, fields, filters, and sections"})]}),e.jsxs(r.CardContent,{children:[e.jsxs(r.Tabs,{defaultValue:"basic",className:"w-full",children:[e.jsxs(r.TabsList,{className:"grid w-full grid-cols-6",children:[e.jsxs(r.TabsTrigger,{value:"basic",children:[e.jsx(w.Settings,{className:"h-4 w-4 mr-2"}),"Basic"]}),e.jsxs(r.TabsTrigger,{value:"fields",children:[e.jsx(w.Layers,{className:"h-4 w-4 mr-2"}),"Fields"]}),e.jsxs(r.TabsTrigger,{value:"filters",children:[e.jsx(w.Filter,{className:"h-4 w-4 mr-2"}),"Filters"]}),e.jsxs(r.TabsTrigger,{value:"grouping",children:[e.jsx(w.Layers,{className:"h-4 w-4 mr-2"}),"Group By"]}),e.jsxs(r.TabsTrigger,{value:"sections",children:[e.jsx(w.Layers,{className:"h-4 w-4 mr-2"}),"Sections"]}),e.jsxs(r.TabsTrigger,{value:"schedule",children:[e.jsx(w.Calendar,{className:"h-4 w-4 mr-2"}),"Schedule"]})]}),e.jsx(r.TabsContent,{value:"basic",className:"space-y-4 mt-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{htmlFor:"report-title",children:"Report Title"}),e.jsx(r.Input,{id:"report-title",value:i.title||"",onChange:l=>x({...i,title:l.target.value}),placeholder:"Enter report title"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{htmlFor:"report-description",children:"Description"}),e.jsx(r.Input,{id:"report-description",value:i.description||"",onChange:l=>x({...i,description:l.target.value}),placeholder:"Enter report description"})]}),a.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Data Source"}),e.jsxs("select",{className:"w-full border rounded-md p-2",children:[e.jsx("option",{value:"",children:"Select a data source"}),a.map((l,o)=>e.jsxs("option",{value:o,children:["Data Source ",o+1]},o))]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{children:"Export Options"}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",checked:i.showExportButtons||!1,onChange:l=>x({...i,showExportButtons:l.target.checked})}),e.jsx("span",{className:"text-sm",children:"Show Export Buttons"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",checked:i.showPrintButton||!1,onChange:l=>x({...i,showPrintButton:l.target.checked})}),e.jsx("span",{className:"text-sm",children:"Show Print Button"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r.Label,{htmlFor:"export-format",children:"Default Export Format"}),e.jsxs("select",{id:"export-format",className:"w-full border rounded-md p-2",value:i.defaultExportFormat||"pdf",onChange:l=>x({...i,defaultExportFormat:l.target.value}),children:[e.jsx("option",{value:"pdf",children:"PDF"}),e.jsx("option",{value:"excel",children:"Excel"}),e.jsx("option",{value:"csv",children:"CSV"}),e.jsx("option",{value:"json",children:"JSON"}),e.jsx("option",{value:"html",children:"HTML"})]})]})]})}),e.jsxs(r.TabsContent,{value:"fields",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(r.Label,{children:"Report Fields"}),e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:k,disabled:n.length>=c.length,children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Add Field"]})]}),e.jsxs("div",{className:"space-y-2",children:[n.map((l,o)=>e.jsx("div",{className:"flex items-center gap-2 p-3 border rounded-lg",children:e.jsxs("div",{className:"flex-1 grid grid-cols-4 gap-2",children:[e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Field Name"}),e.jsx("div",{className:"text-sm font-medium",children:l.name})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Label"}),e.jsx(r.Input,{className:"h-8 text-sm",value:l.label||l.name,onChange:h=>L(o,{...l,label:h.target.value})})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Aggregation"}),e.jsxs("select",{className:"w-full border rounded-md h-8 text-sm px-2",value:l.aggregation||"",onChange:h=>L(o,{...l,aggregation:h.target.value}),children:[e.jsx("option",{value:"",children:"None"}),e.jsx("option",{value:"sum",children:"Sum"}),e.jsx("option",{value:"count",children:"Count"}),e.jsx("option",{value:"avg",children:"Average"}),e.jsx("option",{value:"min",children:"Min"}),e.jsx("option",{value:"max",children:"Max"})]})]}),e.jsx("div",{className:"flex items-end justify-end",children:e.jsx(r.Button,{size:"sm",variant:"ghost",className:"text-red-500 hover:text-red-700 hover:bg-red-50",onClick:()=>g(o),children:e.jsx(w.Trash2,{className:"h-4 w-4"})})})]})},o)),n.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground border-2 border-dashed rounded-lg",children:'No fields selected. Click "Add Field" to begin.'})]})]}),e.jsxs(r.TabsContent,{value:"filters",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(r.Label,{children:"Report Filters"}),e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:D,children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Add Filter"]})]}),e.jsxs("div",{className:"space-y-2",children:[y.map((l,o)=>e.jsxs("div",{className:"flex items-center gap-2 p-3 border rounded-lg",children:[e.jsxs("div",{className:"flex-1 grid grid-cols-3 gap-2",children:[e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Field"}),e.jsx("select",{className:"w-full border rounded-md h-8 text-sm px-2",value:l.field,onChange:h=>P(o,{...l,field:h.target.value}),children:c.map((h,A)=>e.jsx("option",{value:h.name,children:h.label||h.name},A))})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Operator"}),e.jsxs("select",{className:"w-full border rounded-md h-8 text-sm px-2",value:l.operator,onChange:h=>P(o,{...l,operator:h.target.value}),children:[e.jsx("option",{value:"equals",children:"Equals"}),e.jsx("option",{value:"contains",children:"Contains"}),e.jsx("option",{value:"gt",children:"Greater Than"}),e.jsx("option",{value:"lt",children:"Less Than"}),e.jsx("option",{value:"between",children:"Between"})]})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Value"}),e.jsx(r.Input,{className:"h-8 text-sm",value:String(l.value),onChange:h=>P(o,{...l,value:h.target.value})})]})]}),e.jsx(r.Button,{size:"sm",variant:"ghost",className:"text-red-500 hover:text-red-700 hover:bg-red-50 self-end",onClick:()=>I(o),children:e.jsx(w.Trash2,{className:"h-4 w-4"})})]},o)),y.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground border-2 border-dashed rounded-lg",children:"No filters defined."})]})]}),e.jsxs(r.TabsContent,{value:"grouping",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(r.Label,{children:"Grouping Rules"}),e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:V,children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Add Group"]})]}),e.jsxs("div",{className:"space-y-2",children:[S.map((l,o)=>e.jsxs("div",{className:"flex items-center gap-2 p-3 border rounded-lg",children:[e.jsxs("div",{className:"flex-1 grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Field"}),e.jsx("select",{className:"w-full border rounded-md h-8 text-sm px-2",value:l.field,onChange:h=>z(o,{...l,field:h.target.value}),children:c.map((h,A)=>e.jsx("option",{value:h.name,children:h.label||h.name},A))})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Sort Order"}),e.jsxs("select",{className:"w-full border rounded-md h-8 text-sm px-2",value:l.sort||"asc",onChange:h=>z(o,{...l,sort:h.target.value}),children:[e.jsx("option",{value:"asc",children:"Ascending"}),e.jsx("option",{value:"desc",children:"Descending"})]})]})]}),e.jsx(r.Button,{size:"sm",variant:"ghost",className:"text-red-500 hover:text-red-700 hover:bg-red-50 self-end",onClick:()=>Y(o),children:e.jsx(w.Trash2,{className:"h-4 w-4"})})]},o)),S.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground border-2 border-dashed rounded-lg",children:"No grouping rules applied."})]})]}),e.jsxs(r.TabsContent,{value:"sections",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(r.Label,{children:"Report Sections"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:()=>W("header"),children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Header"]}),e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:()=>W("chart"),children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Chart"]}),e.jsxs(r.Button,{size:"sm",variant:"outline",onClick:()=>W("table"),children:[e.jsx(w.Plus,{className:"h-4 w-4 mr-2"}),"Table"]})]})]}),e.jsxs("div",{className:"space-y-2",children:[v.map((l,o)=>{var h,A,q,H;return e.jsxs("div",{className:"p-3 border rounded-lg space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"font-medium flex items-center gap-2",children:[e.jsx("div",{className:"text-xs bg-muted px-2 py-0.5 rounded uppercase",children:l.type}),l.title]}),e.jsx(r.Button,{size:"sm",variant:"ghost",className:"text-red-500 hover:text-red-700 hover:bg-red-50",onClick:()=>ae(o),children:e.jsx(w.Trash2,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Title"}),e.jsx(r.Input,{className:"h-8 text-sm",value:l.title||"",onChange:t=>$(o,{...l,title:t.target.value})})]}),l.type==="text"&&e.jsxs("div",{className:"col-span-2",children:[e.jsx(r.Label,{className:"text-xs",children:"Content"}),e.jsx(r.Input,{className:"h-8 text-sm",value:l.text||"",onChange:t=>$(o,{...l,text:t.target.value})})]}),l.type==="chart"&&e.jsxs("div",{className:"col-span-2 grid grid-cols-2 gap-2 mt-2 p-2 bg-muted/20 rounded",children:[e.jsx("div",{className:"col-span-2",children:e.jsx(r.Label,{className:"text-xs font-semibold",children:"Chart Configuration"})}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"Chart Type"}),e.jsxs("select",{className:"flex h-8 w-full rounded-md border border-input bg-background px-3 py-1 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",value:((h=l.chart)==null?void 0:h.chartType)||"bar",onChange:t=>$(o,{...l,chart:{...l.chart,type:"chart",chartType:t.target.value}}),children:[e.jsx("option",{value:"bar",children:"Bar"}),e.jsx("option",{value:"line",children:"Line"}),e.jsx("option",{value:"area",children:"Area"}),e.jsx("option",{value:"pie",children:"Pie"})]})]}),e.jsxs("div",{children:[e.jsx(r.Label,{className:"text-xs",children:"X-Axis Field"}),e.jsxs("select",{className:"flex h-8 w-full rounded-md border border-input bg-background px-3 py-1 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",value:((A=l.chart)==null?void 0:A.xAxisField)||"",onChange:t=>$(o,{...l,chart:{...l.chart,type:"chart",xAxisField:t.target.value}}),children:[e.jsx("option",{value:"",children:"Select Field..."}),c.map(t=>e.jsx("option",{value:t.name,children:t.label||t.name},t.name)),c.length===0&&e.jsxs(e.Fragment,{children:[e.jsx("option",{value:"name",children:"Name"}),e.jsx("option",{value:"month",children:"Month"})]})]})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsx(r.Label,{className:"text-xs",children:"Y-Axis Fields (comma separated)"}),e.jsx(r.Input,{className:"h-8 text-sm",placeholder:"e.g. value, count",value:((H=(q=l.chart)==null?void 0:q.yAxisFields)==null?void 0:H.join(", "))||"",onChange:t=>$(o,{...l,chart:{...l.chart,type:"chart",yAxisFields:t.target.value.split(",").map(f=>f.trim()).filter(Boolean)}})})]})]})]})]},o)}),v.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground border-2 border-dashed rounded-lg",children:"No customized sections. The default report layout will be used."})]})]}),e.jsx(r.TabsContent,{value:"schedule",className:"space-y-4 mt-4",children:e.jsx(je,{schedule:i.schedule,onChange:l=>x({...i,schedule:l})})})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 mt-6 pt-4 border-t",children:[e.jsx(r.Button,{variant:"outline",onClick:re,children:"Cancel"}),e.jsxs(r.Button,{onClick:X,children:[e.jsx(w.Save,{className:"h-4 w-4 mr-2"}),"Save Report"]})]})]})]}),u&&e.jsxs(r.Card,{className:"mt-8 border-2 border-blue-100",children:[e.jsx(r.CardHeader,{className:"bg-blue-50/50",children:e.jsx(r.CardTitle,{className:"text-blue-900 text-sm uppercase tracking-wide",children:"Live Preview"})}),e.jsx(r.CardContent,{className:"pt-6",children:e.jsx(te,{schema:{type:"report-viewer",report:{...i,fields:n,filters:y,groupBy:S,sections:v},data:[{id:1,name:"Sample Item A",value:100,status:"New"},{id:2,name:"Sample Item B",value:250,status:"Active"},{id:3,name:"Sample Item C",value:75,status:"Closed"}]}})})]})]})};async function ve(s,d){var x;const{dataSource:a,resource:c,queryParams:u,format:p,exportConfig:j}=d,i=p||s.defaultExportFormat||"pdf";try{const b=(await a.find(c,u)).data||[],y={format:i,...(x=s.exportConfigs)==null?void 0:x[i],...j};return ee(i,s,b,y),{success:!0,recordCount:b.length,format:i}}catch(n){return{success:!1,recordCount:0,format:i,error:n.message}}}function Ne(s,d,a={}){const{columns:c,filename:u,includeAggregationRow:p=!1}=a,j=c||(s.fields||[]).map(Ce),i=j.map(y=>y.header),x=d.map((y,E)=>j.map(S=>{if(S.formula)return S.formula.replace(/\{ROW\}/g,String(E+2));const m=y[S.name];return Se(m,S.numberFormat)}));if(p&&d.length>0){const y=j.map((E,S)=>{const m=(s.fields||[]).find(v=>v.name===E.name);if(m!=null&&m.aggregation){const v=ke(S),N=2,k=d.length+1;switch(m.aggregation){case"sum":return`=SUM(${v}${N}:${v}${k})`;case"avg":return`=AVERAGE(${v}${N}:${v}${k})`;case"count":return`=COUNTA(${v}${N}:${v}${k})`;case"min":return`=MIN(${v}${N}:${v}${k})`;case"max":return`=MAX(${v}${N}:${v}${k})`;default:return""}}return""});x.push(y)}const n="\uFEFF"+[i.join(" "),...x.map(y=>y.join(" "))].join(`
80
- `),b=u||`${s.title||"report"}.tsv`;Re(n,b,"text/tab-separated-values")}function we(s,d,a,c){return async()=>{const u=s.schedule;if(!(u!=null&&u.enabled))return[];const p=u.formats||[s.defaultExportFormat||"pdf"],j=[];for(const i of p){const x=await ve(s,{dataSource:d,resource:a,format:i});j.push(x)}return c(s,u),j}}function Ce(s){return{name:s.name,header:s.label||s.name}}function Se(s,d){return s==null?"":typeof s=="number"&&d?s.toLocaleString("en-US",Te(d)):Ee(String(s))}function Te(s){if(s.includes("%"))return{style:"percent",minimumFractionDigits:0};const d=(s.match(/0/g)||[]).length;return{minimumFractionDigits:Math.max(0,d-1),maximumFractionDigits:Math.max(0,d-1)}}function ke(s){let d="",a=s;for(;a>=0;)d=String.fromCharCode(a%26+65)+d,a=Math.floor(a/26)-1;return d}function Ee(s){if(s.length>0){const d=s.charAt(0);if(d==="="||d==="+"||d==="-"||d==="@"||d==="|")return`'${s}`}return s}function Re(s,d,a){const c=new Blob([s],{type:`${a};charset=utf-8`}),u=URL.createObjectURL(c),p=document.createElement("a");p.href=u,p.download=d,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(u)}_.ComponentRegistry.register("report",ce,{label:"Report",category:"Report",inputs:[{name:"title",type:"string",label:"Title"},{name:"description",type:"string",label:"Description"},{name:"chart",type:"code",label:"Chart Configuration"}]}),_.ComponentRegistry.register("report-viewer",te,{label:"Report Viewer",category:"Report",inputs:[{name:"report",type:"code",label:"Report Definition"},{name:"showToolbar",type:"boolean",label:"Show Toolbar"}]}),_.ComponentRegistry.register("report-builder",be,{label:"Report Builder",category:"Report",inputs:[{name:"report",type:"code",label:"Initial Report"}]}),C.ReportBuilder=be,C.ReportRenderer=ce,C.ReportViewer=te,C.ScheduleConfig=je,C.createScheduleTrigger=we,C.exportAsCSV=oe,C.exportAsExcel=me,C.exportAsHTML=K,C.exportAsJSON=ue,C.exportAsPDF=he,C.exportExcelWithFormulas=Ne,C.exportReport=ee,C.exportWithLiveData=ve,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
80
+ `),b=u||`${s.title||"report"}.tsv`;Re(n,b,"text/tab-separated-values")}function we(s,d,a,c){return async()=>{const u=s.schedule;if(!(u!=null&&u.enabled))return[];const p=u.formats||[s.defaultExportFormat||"pdf"],j=[];for(const i of p){const x=await ve(s,{dataSource:d,resource:a,format:i});j.push(x)}return c(s,u),j}}function Ce(s){return{name:s.name,header:s.label||s.name}}function Se(s,d){return s==null?"":typeof s=="number"&&d?s.toLocaleString("en-US",Te(d)):Ee(String(s))}function Te(s){if(s.includes("%"))return{style:"percent",minimumFractionDigits:0};const d=(s.match(/0/g)||[]).length;return{minimumFractionDigits:Math.max(0,d-1),maximumFractionDigits:Math.max(0,d-1)}}function ke(s){let d="",a=s;for(;a>=0;)d=String.fromCharCode(a%26+65)+d,a=Math.floor(a/26)-1;return d}function Ee(s){if(s.length>0){const d=s.charAt(0);if(d==="="||d==="+"||d==="-"||d==="@"||d==="|")return`'${s}`}return s}function Re(s,d,a){const c=new Blob([s],{type:`${a};charset=utf-8`}),u=URL.createObjectURL(c),p=document.createElement("a");p.href=u,p.download=d,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(u)}_.ComponentRegistry.register("report",ce,{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"}]}),_.ComponentRegistry.register("report-viewer",te,{namespace:"report",label:"Report Viewer",category:"Report",inputs:[{name:"report",type:"code",label:"Report Definition"},{name:"showToolbar",type:"boolean",label:"Show Toolbar"}]}),_.ComponentRegistry.register("report-builder",be,{namespace:"report",label:"Report Builder",category:"Report",inputs:[{name:"report",type:"code",label:"Initial Report"}]}),C.ReportBuilder=be,C.ReportRenderer=ce,C.ReportViewer=te,C.ScheduleConfig=je,C.createScheduleTrigger=we,C.exportAsCSV=oe,C.exportAsExcel=me,C.exportAsHTML=K,C.exportAsJSON=ue,C.exportAsPDF=he,C.exportExcelWithFormulas=Ne,C.exportReport=ee,C.exportWithLiveData=ve,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-report",
3
- "version": "2.0.0",
3
+ "version": "3.0.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.umd.cjs",
6
6
  "module": "dist/index.js",
@@ -18,25 +18,25 @@
18
18
  "peerDependencies": {
19
19
  "react": "^18.0.0",
20
20
  "react-dom": "^18.0.0",
21
- "@object-ui/core": "2.0.0",
22
- "@object-ui/types": "2.0.0",
23
- "@object-ui/components": "2.0.0",
24
- "@object-ui/fields": "2.0.0",
25
- "@object-ui/react": "2.0.0"
21
+ "@object-ui/components": "3.0.1",
22
+ "@object-ui/core": "3.0.1",
23
+ "@object-ui/fields": "3.0.1",
24
+ "@object-ui/react": "3.0.1",
25
+ "@object-ui/types": "3.0.1"
26
26
  },
27
27
  "dependencies": {
28
- "clsx": "^2.1.0",
28
+ "clsx": "^2.1.1",
29
29
  "lucide-react": "^0.344.0",
30
- "tailwind-merge": "^2.2.1"
30
+ "tailwind-merge": "^2.6.1"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/node": "^25.2.2",
34
- "@types/react": "^19.2.13",
35
- "@types/react-dom": "^18.2.19",
36
- "@vitejs/plugin-react": "^5.1.3",
37
- "vite": "^5.1.4",
38
- "vite-plugin-dts": "^3.7.3",
39
- "vitest": "^1.3.1"
33
+ "@types/node": "^25.2.3",
34
+ "@types/react": "19.2.13",
35
+ "@types/react-dom": "19.2.3",
36
+ "@vitejs/plugin-react": "^5.1.4",
37
+ "vite": "^5.4.21",
38
+ "vite-plugin-dts": "^3.9.1",
39
+ "vitest": "^1.6.1"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "vite build",