@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 +137 -0
- package/dist/index.js +3 -0
- package/dist/index.umd.cjs +1 -1
- package/package.json +15 -15
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: [
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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": "
|
|
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/
|
|
22
|
-
"@object-ui/
|
|
23
|
-
"@object-ui/
|
|
24
|
-
"@object-ui/
|
|
25
|
-
"@object-ui/
|
|
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.
|
|
28
|
+
"clsx": "^2.1.1",
|
|
29
29
|
"lucide-react": "^0.344.0",
|
|
30
|
-
"tailwind-merge": "^2.
|
|
30
|
+
"tailwind-merge": "^2.6.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@types/node": "^25.2.
|
|
34
|
-
"@types/react": "
|
|
35
|
-
"@types/react-dom": "
|
|
36
|
-
"@vitejs/plugin-react": "^5.1.
|
|
37
|
-
"vite": "^5.
|
|
38
|
-
"vite-plugin-dts": "^3.
|
|
39
|
-
"vitest": "^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",
|