@fayz-ai/plugin-reports 0.1.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/dist/ReportsContext.d.ts +16 -0
- package/dist/ReportsContext.d.ts.map +1 -0
- package/dist/ReportsPage.d.ts +8 -0
- package/dist/ReportsPage.d.ts.map +1 -0
- package/dist/chunk-LODXZ2SC.js +100 -0
- package/dist/chunk-LODXZ2SC.js.map +1 -0
- package/dist/chunk-ZSELW4DA.cjs +107 -0
- package/dist/chunk-ZSELW4DA.cjs.map +1 -0
- package/dist/components/ExportDropdown.d.ts +12 -0
- package/dist/components/ExportDropdown.d.ts.map +1 -0
- package/dist/components/ReportCard.d.ts +9 -0
- package/dist/components/ReportCard.d.ts.map +1 -0
- package/dist/components/ReportFilterBar.d.ts +12 -0
- package/dist/components/ReportFilterBar.d.ts.map +1 -0
- package/dist/components/ReportPagination.d.ts +11 -0
- package/dist/components/ReportPagination.d.ts.map +1 -0
- package/dist/components/ReportSummaryRow.d.ts +10 -0
- package/dist/components/ReportSummaryRow.d.ts.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +8 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +9 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/excel-2PDUZ55J.cjs +38 -0
- package/dist/excel-2PDUZ55J.cjs.map +1 -0
- package/dist/excel-QHUSM6IH.js +35 -0
- package/dist/excel-QHUSM6IH.js.map +1 -0
- package/dist/export/csv.d.ts +3 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/excel.d.ts +4 -0
- package/dist/export/excel.d.ts.map +1 -0
- package/dist/export/pdf.d.ts +7 -0
- package/dist/export/pdf.d.ts.map +1 -0
- package/dist/hooks/useReportData.d.ts +19 -0
- package/dist/hooks/useReportData.d.ts.map +1 -0
- package/dist/index.cjs +904 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +878 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/columns.d.ts +5 -0
- package/dist/lib/columns.d.ts.map +1 -0
- package/dist/lib/tenant.d.ts +3 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/pdf-GB4JYUYH.cjs +40 -0
- package/dist/pdf-GB4JYUYH.cjs.map +1 -0
- package/dist/pdf-HETKN26Y.js +37 -0
- package/dist/pdf-HETKN26Y.js.map +1 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/ReportHub.d.ts +8 -0
- package/dist/views/ReportHub.d.ts.map +1 -0
- package/dist/views/ReportViewer.d.ts +9 -0
- package/dist/views/ReportViewer.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/ReportsContext.tsx +33 -0
- package/src/ReportsPage.tsx +62 -0
- package/src/components/ExportDropdown.tsx +63 -0
- package/src/components/ReportCard.tsx +38 -0
- package/src/components/ReportFilterBar.tsx +132 -0
- package/src/components/ReportPagination.tsx +59 -0
- package/src/components/ReportSummaryRow.tsx +68 -0
- package/src/data/index.ts +4 -0
- package/src/data/mock.ts +9 -0
- package/src/data/supabase.ts +200 -0
- package/src/data/types.ts +10 -0
- package/src/export/csv.ts +21 -0
- package/src/export/excel.ts +42 -0
- package/src/export/pdf.ts +47 -0
- package/src/hooks/useReportData.ts +123 -0
- package/src/index.ts +140 -0
- package/src/lib/columns.ts +130 -0
- package/src/lib/tenant.ts +3 -0
- package/src/locales/en.ts +28 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +28 -0
- package/src/types.ts +157 -0
- package/src/views/ReportHub.tsx +97 -0
- package/src/views/ReportViewer.tsx +183 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ResolvedReportsConfig, ReportDef } from './types';
|
|
3
|
+
import type { ReportDataProvider } from './data/types';
|
|
4
|
+
interface ReportsContextValue {
|
|
5
|
+
config: ResolvedReportsConfig;
|
|
6
|
+
provider: ReportDataProvider;
|
|
7
|
+
reports: ReportDef[];
|
|
8
|
+
}
|
|
9
|
+
export declare function useReportsContext(): ReportsContextValue;
|
|
10
|
+
export declare function ReportsContextProvider({ config, provider, children, }: {
|
|
11
|
+
config: ResolvedReportsConfig;
|
|
12
|
+
provider: ReportDataProvider;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}): React.JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ReportsContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportsContext.d.ts","sourceRoot":"","sources":["../src/ReportsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,qBAAqB,CAAA;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAID,wBAAgB,iBAAiB,IAAI,mBAAmB,CAIvD;AAED,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,qBAAqB,CAAA;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,qBAMA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ResolvedReportsConfig } from './types';
|
|
3
|
+
import type { ReportDataProvider } from './data/types';
|
|
4
|
+
export declare function ReportsPage({ config, provider, }: {
|
|
5
|
+
config: ResolvedReportsConfig;
|
|
6
|
+
provider: ReportDataProvider;
|
|
7
|
+
}): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=ReportsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportsPage.d.ts","sourceRoot":"","sources":["../src/ReportsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAI/D,OAAO,KAAK,EAAE,qBAAqB,EAAa,MAAM,SAAS,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAYtD,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,qBAAqB,CAAA;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;CAC7B,qBAsCA"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PersonLink } from '@fayz-ai/saas';
|
|
3
|
+
import { formatDateTime as formatDateTime$1, formatDate as formatDate$1, formatCurrency as formatCurrency$1 } from '@fayz-ai/core';
|
|
4
|
+
|
|
5
|
+
// src/lib/columns.ts
|
|
6
|
+
function formatCurrency(value, currency) {
|
|
7
|
+
const num = typeof value === "number" ? value : parseFloat(value);
|
|
8
|
+
if (isNaN(num)) return "\u2014";
|
|
9
|
+
return formatCurrency$1(num, currency);
|
|
10
|
+
}
|
|
11
|
+
function formatDate(value) {
|
|
12
|
+
if (!value) return "\u2014";
|
|
13
|
+
return formatDate$1(value);
|
|
14
|
+
}
|
|
15
|
+
function formatDateTime(value) {
|
|
16
|
+
if (!value) return "\u2014";
|
|
17
|
+
return formatDateTime$1(value);
|
|
18
|
+
}
|
|
19
|
+
function formatNumber(value) {
|
|
20
|
+
if (value == null) return "\u2014";
|
|
21
|
+
return typeof value === "number" ? value.toLocaleString() : String(value);
|
|
22
|
+
}
|
|
23
|
+
function formatValuePlain(value, col, currency) {
|
|
24
|
+
if (value == null || value === "") return "";
|
|
25
|
+
switch (col.type) {
|
|
26
|
+
case "currency":
|
|
27
|
+
return formatCurrency(value, col.currency ?? currency);
|
|
28
|
+
case "date":
|
|
29
|
+
return formatDate(value);
|
|
30
|
+
case "datetime":
|
|
31
|
+
return formatDateTime(value);
|
|
32
|
+
case "number":
|
|
33
|
+
return formatNumber(value);
|
|
34
|
+
case "boolean":
|
|
35
|
+
return value ? "Yes" : "No";
|
|
36
|
+
default:
|
|
37
|
+
return String(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function reportColumnsToTanstack(columns, currency) {
|
|
41
|
+
return columns.filter((c) => c.visible !== false).map((col) => {
|
|
42
|
+
const sortable = col.sortable ?? ["text", "number", "currency", "date", "datetime", "email"].includes(col.type);
|
|
43
|
+
const alignRight = col.align === "right" || !col.align && (col.type === "currency" || col.type === "number");
|
|
44
|
+
const alignCenter = col.align === "center";
|
|
45
|
+
return {
|
|
46
|
+
accessorKey: col.key,
|
|
47
|
+
header: col.label,
|
|
48
|
+
enableSorting: sortable,
|
|
49
|
+
cell: (ctx) => {
|
|
50
|
+
const value = ctx.getValue();
|
|
51
|
+
const row = ctx.row.original;
|
|
52
|
+
if (col.renderCell) {
|
|
53
|
+
return col.renderCell(value, row);
|
|
54
|
+
}
|
|
55
|
+
if (value == null || value === "") {
|
|
56
|
+
return React.createElement("span", { className: "text-muted-foreground" }, "\u2014");
|
|
57
|
+
}
|
|
58
|
+
let content;
|
|
59
|
+
switch (col.type) {
|
|
60
|
+
case "person":
|
|
61
|
+
content = React.createElement(PersonLink, {
|
|
62
|
+
personId: col.idKey ? row[col.idKey] : null,
|
|
63
|
+
name: String(value),
|
|
64
|
+
size: "sm",
|
|
65
|
+
className: "text-xs"
|
|
66
|
+
});
|
|
67
|
+
break;
|
|
68
|
+
case "currency":
|
|
69
|
+
content = formatCurrency(value, col.currency ?? currency);
|
|
70
|
+
break;
|
|
71
|
+
case "date":
|
|
72
|
+
content = formatDate(value);
|
|
73
|
+
break;
|
|
74
|
+
case "datetime":
|
|
75
|
+
content = formatDateTime(value);
|
|
76
|
+
break;
|
|
77
|
+
case "boolean":
|
|
78
|
+
content = value ? React.createElement(
|
|
79
|
+
"svg",
|
|
80
|
+
{ className: "h-4 w-4 text-success", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2" },
|
|
81
|
+
React.createElement("polyline", { points: "20 6 9 17 4 12" })
|
|
82
|
+
) : React.createElement("span", { className: "text-muted-foreground" }, "\u2014");
|
|
83
|
+
break;
|
|
84
|
+
case "number":
|
|
85
|
+
content = formatNumber(value);
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
content = String(value);
|
|
89
|
+
}
|
|
90
|
+
const cls = alignRight ? "text-right" : alignCenter ? "text-center" : void 0;
|
|
91
|
+
return cls ? React.createElement("div", { className: cls }, content) : React.createElement(React.Fragment, null, content);
|
|
92
|
+
},
|
|
93
|
+
meta: { align: alignRight ? "right" : alignCenter ? "center" : "left" }
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export { formatValuePlain, reportColumnsToTanstack };
|
|
99
|
+
//# sourceMappingURL=chunk-LODXZ2SC.js.map
|
|
100
|
+
//# sourceMappingURL=chunk-LODXZ2SC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/columns.ts"],"names":["formatCurrencyLocale","formatDateLocale","formatDateTimeLocale"],"mappings":"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","file":"chunk-LODXZ2SC.js","sourcesContent":["import React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport type { ReportColumnDef } from '../types'\nimport { PersonLink } from '@fayz-ai/saas'\nimport {\n formatCurrency as formatCurrencyLocale,\n formatDate as formatDateLocale,\n formatDateTime as formatDateTimeLocale,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Formatters (mirrors fieldToColumn.tsx logic)\n// ---------------------------------------------------------------------------\n\nfunction formatCurrency(value: any, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return '—'\n return formatCurrencyLocale(num, currency)\n}\n\nfunction formatDate(value: any): string {\n if (!value) return '—'\n return formatDateLocale(value)\n}\n\nfunction formatDateTime(value: any): string {\n if (!value) return '—'\n return formatDateTimeLocale(value)\n}\n\nfunction formatNumber(value: any): string {\n if (value == null) return '—'\n return typeof value === 'number' ? value.toLocaleString() : String(value)\n}\n\n// ---------------------------------------------------------------------------\n// Plain-text formatter for exports\n// ---------------------------------------------------------------------------\n\nexport function formatValuePlain(value: any, col: ReportColumnDef, currency?: string): string {\n if (value == null || value === '') return ''\n switch (col.type) {\n case 'currency':\n return formatCurrency(value, col.currency ?? currency)\n case 'date':\n return formatDate(value)\n case 'datetime':\n return formatDateTime(value)\n case 'number':\n return formatNumber(value)\n case 'boolean':\n return value ? 'Yes' : 'No'\n default:\n return String(value)\n }\n}\n\n// ---------------------------------------------------------------------------\n// ReportColumnDef[] → TanStack ColumnDef[]\n// ---------------------------------------------------------------------------\n\nexport function reportColumnsToTanstack(\n columns: ReportColumnDef[],\n currency?: string,\n): ColumnDef<Record<string, any>>[] {\n return columns\n .filter((c) => c.visible !== false)\n .map((col): ColumnDef<Record<string, any>> => {\n const sortable = col.sortable ?? ['text', 'number', 'currency', 'date', 'datetime', 'email'].includes(col.type)\n const alignRight = col.align === 'right' || (!col.align && (col.type === 'currency' || col.type === 'number'))\n const alignCenter = col.align === 'center'\n\n return {\n accessorKey: col.key,\n header: col.label,\n enableSorting: sortable,\n cell: (ctx) => {\n const value = ctx.getValue()\n const row = ctx.row.original\n\n if (col.renderCell) {\n return col.renderCell(value, row)\n }\n\n if (value == null || value === '') {\n return React.createElement('span', { className: 'text-muted-foreground' }, '—')\n }\n\n let content: React.ReactNode\n switch (col.type) {\n case 'person':\n content = React.createElement(PersonLink, {\n personId: col.idKey ? row[col.idKey] : null,\n name: String(value),\n size: 'sm',\n className: 'text-xs',\n })\n break\n case 'currency':\n content = formatCurrency(value, col.currency ?? currency)\n break\n case 'date':\n content = formatDate(value)\n break\n case 'datetime':\n content = formatDateTime(value)\n break\n case 'boolean':\n content = value\n ? React.createElement('svg', { className: 'h-4 w-4 text-success', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '2' },\n React.createElement('polyline', { points: '20 6 9 17 4 12' }),\n )\n : React.createElement('span', { className: 'text-muted-foreground' }, '—')\n break\n case 'number':\n content = formatNumber(value)\n break\n default:\n content = String(value)\n }\n\n const cls = alignRight ? 'text-right' : alignCenter ? 'text-center' : undefined\n return cls\n ? React.createElement('div', { className: cls }, content)\n : React.createElement(React.Fragment, null, content)\n },\n meta: { align: alignRight ? 'right' : alignCenter ? 'center' : 'left' },\n }\n })\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var saas = require('@fayz-ai/saas');
|
|
5
|
+
var core = require('@fayz-ai/core');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
10
|
+
|
|
11
|
+
// src/lib/columns.ts
|
|
12
|
+
function formatCurrency(value, currency) {
|
|
13
|
+
const num = typeof value === "number" ? value : parseFloat(value);
|
|
14
|
+
if (isNaN(num)) return "\u2014";
|
|
15
|
+
return core.formatCurrency(num, currency);
|
|
16
|
+
}
|
|
17
|
+
function formatDate(value) {
|
|
18
|
+
if (!value) return "\u2014";
|
|
19
|
+
return core.formatDate(value);
|
|
20
|
+
}
|
|
21
|
+
function formatDateTime(value) {
|
|
22
|
+
if (!value) return "\u2014";
|
|
23
|
+
return core.formatDateTime(value);
|
|
24
|
+
}
|
|
25
|
+
function formatNumber(value) {
|
|
26
|
+
if (value == null) return "\u2014";
|
|
27
|
+
return typeof value === "number" ? value.toLocaleString() : String(value);
|
|
28
|
+
}
|
|
29
|
+
function formatValuePlain(value, col, currency) {
|
|
30
|
+
if (value == null || value === "") return "";
|
|
31
|
+
switch (col.type) {
|
|
32
|
+
case "currency":
|
|
33
|
+
return formatCurrency(value, col.currency ?? currency);
|
|
34
|
+
case "date":
|
|
35
|
+
return formatDate(value);
|
|
36
|
+
case "datetime":
|
|
37
|
+
return formatDateTime(value);
|
|
38
|
+
case "number":
|
|
39
|
+
return formatNumber(value);
|
|
40
|
+
case "boolean":
|
|
41
|
+
return value ? "Yes" : "No";
|
|
42
|
+
default:
|
|
43
|
+
return String(value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function reportColumnsToTanstack(columns, currency) {
|
|
47
|
+
return columns.filter((c) => c.visible !== false).map((col) => {
|
|
48
|
+
const sortable = col.sortable ?? ["text", "number", "currency", "date", "datetime", "email"].includes(col.type);
|
|
49
|
+
const alignRight = col.align === "right" || !col.align && (col.type === "currency" || col.type === "number");
|
|
50
|
+
const alignCenter = col.align === "center";
|
|
51
|
+
return {
|
|
52
|
+
accessorKey: col.key,
|
|
53
|
+
header: col.label,
|
|
54
|
+
enableSorting: sortable,
|
|
55
|
+
cell: (ctx) => {
|
|
56
|
+
const value = ctx.getValue();
|
|
57
|
+
const row = ctx.row.original;
|
|
58
|
+
if (col.renderCell) {
|
|
59
|
+
return col.renderCell(value, row);
|
|
60
|
+
}
|
|
61
|
+
if (value == null || value === "") {
|
|
62
|
+
return React__default.default.createElement("span", { className: "text-muted-foreground" }, "\u2014");
|
|
63
|
+
}
|
|
64
|
+
let content;
|
|
65
|
+
switch (col.type) {
|
|
66
|
+
case "person":
|
|
67
|
+
content = React__default.default.createElement(saas.PersonLink, {
|
|
68
|
+
personId: col.idKey ? row[col.idKey] : null,
|
|
69
|
+
name: String(value),
|
|
70
|
+
size: "sm",
|
|
71
|
+
className: "text-xs"
|
|
72
|
+
});
|
|
73
|
+
break;
|
|
74
|
+
case "currency":
|
|
75
|
+
content = formatCurrency(value, col.currency ?? currency);
|
|
76
|
+
break;
|
|
77
|
+
case "date":
|
|
78
|
+
content = formatDate(value);
|
|
79
|
+
break;
|
|
80
|
+
case "datetime":
|
|
81
|
+
content = formatDateTime(value);
|
|
82
|
+
break;
|
|
83
|
+
case "boolean":
|
|
84
|
+
content = value ? React__default.default.createElement(
|
|
85
|
+
"svg",
|
|
86
|
+
{ className: "h-4 w-4 text-success", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2" },
|
|
87
|
+
React__default.default.createElement("polyline", { points: "20 6 9 17 4 12" })
|
|
88
|
+
) : React__default.default.createElement("span", { className: "text-muted-foreground" }, "\u2014");
|
|
89
|
+
break;
|
|
90
|
+
case "number":
|
|
91
|
+
content = formatNumber(value);
|
|
92
|
+
break;
|
|
93
|
+
default:
|
|
94
|
+
content = String(value);
|
|
95
|
+
}
|
|
96
|
+
const cls = alignRight ? "text-right" : alignCenter ? "text-center" : void 0;
|
|
97
|
+
return cls ? React__default.default.createElement("div", { className: cls }, content) : React__default.default.createElement(React__default.default.Fragment, null, content);
|
|
98
|
+
},
|
|
99
|
+
meta: { align: alignRight ? "right" : alignCenter ? "center" : "left" }
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.formatValuePlain = formatValuePlain;
|
|
105
|
+
exports.reportColumnsToTanstack = reportColumnsToTanstack;
|
|
106
|
+
//# sourceMappingURL=chunk-ZSELW4DA.cjs.map
|
|
107
|
+
//# sourceMappingURL=chunk-ZSELW4DA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/columns.ts"],"names":["formatCurrencyLocale","formatDateLocale","formatDateTimeLocale","React","PersonLink"],"mappings":";;;;;;;;;;;AAcA,SAAS,cAAA,CAAe,OAAY,QAAA,EAA2B;AAC7D,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,WAAW,KAAK,CAAA;AAChE,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,QAAA;AACvB,EAAA,OAAOA,mBAAA,CAAqB,KAAK,QAAQ,CAAA;AAC3C;AAEA,SAAS,WAAW,KAAA,EAAoB;AACtC,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,OAAOC,gBAAiB,KAAK,CAAA;AAC/B;AAEA,SAAS,eAAe,KAAA,EAAoB;AAC1C,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,OAAOC,oBAAqB,KAAK,CAAA;AACnC;AAEA,SAAS,aAAa,KAAA,EAAoB;AACxC,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,QAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,MAAM,cAAA,EAAe,GAAI,OAAO,KAAK,CAAA;AAC1E;AAMO,SAAS,gBAAA,CAAiB,KAAA,EAAY,GAAA,EAAsB,QAAA,EAA2B;AAC5F,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,EAAA;AAC1C,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,UAAA;AACH,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,GAAA,CAAI,QAAA,IAAY,QAAQ,CAAA;AAAA,IACvD,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,SAAA;AACH,MAAA,OAAO,QAAQ,KAAA,GAAQ,IAAA;AAAA,IACzB;AACE,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAEzB;AAMO,SAAS,uBAAA,CACd,SACA,QAAA,EACkC;AAClC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA,CACjC,GAAA,CAAI,CAAC,GAAA,KAAwC;AAC5C,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,IAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA,CAAE,QAAA,CAAS,IAAI,IAAI,CAAA;AAC9G,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,KAAU,OAAA,IAAY,CAAC,GAAA,CAAI,KAAA,KAAU,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,GAAA,CAAI,IAAA,KAAS,QAAA,CAAA;AACpG,IAAA,MAAM,WAAA,GAAc,IAAI,KAAA,KAAU,QAAA;AAElC,IAAA,OAAO;AAAA,MACL,aAAa,GAAA,CAAI,GAAA;AAAA,MACjB,QAAQ,GAAA,CAAI,KAAA;AAAA,MACZ,aAAA,EAAe,QAAA;AAAA,MACf,IAAA,EAAM,CAAC,GAAA,KAAQ;AACb,QAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,EAAS;AAC3B,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA;AAEpB,QAAA,IAAI,IAAI,UAAA,EAAY;AAClB,UAAA,OAAO,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,GAAG,CAAA;AAAA,QAClC;AAEA,QAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACjC,UAAA,OAAOC,uBAAM,aAAA,CAAc,MAAA,EAAQ,EAAE,SAAA,EAAW,uBAAA,IAA2B,QAAG,CAAA;AAAA,QAChF;AAEA,QAAA,IAAI,OAAA;AACJ,QAAA,QAAQ,IAAI,IAAA;AAAM,UAChB,KAAK,QAAA;AACH,YAAA,OAAA,GAAUA,sBAAA,CAAM,cAAcC,eAAA,EAAY;AAAA,cACxC,UAAU,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA;AAAA,cACvC,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,cAClB,IAAA,EAAM,IAAA;AAAA,cACN,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,OAAA,GAAU,cAAA,CAAe,KAAA,EAAO,GAAA,CAAI,QAAA,IAAY,QAAQ,CAAA;AACxD,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,OAAA,GAAU,WAAW,KAAK,CAAA;AAC1B,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,OAAA,GAAU,eAAe,KAAK,CAAA;AAC9B,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,OAAA,GAAU,QACND,sBAAA,CAAM,aAAA;AAAA,cAAc,KAAA;AAAA,cAAO,EAAE,SAAA,EAAW,sBAAA,EAAwB,OAAA,EAAS,WAAA,EAAa,MAAM,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,WAAA,EAAa,GAAA,EAAI;AAAA,cAC3IA,uBAAM,aAAA,CAAc,UAAA,EAAY,EAAE,MAAA,EAAQ,kBAAkB;AAAA,aAC9D,GACAA,uBAAM,aAAA,CAAc,MAAA,EAAQ,EAAE,SAAA,EAAW,uBAAA,IAA2B,QAAG,CAAA;AAC3E,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,OAAA,GAAU,aAAa,KAAK,CAAA;AAC5B,YAAA;AAAA,UACF;AACE,YAAA,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA;AAG1B,QAAA,MAAM,GAAA,GAAM,UAAA,GAAa,YAAA,GAAe,WAAA,GAAc,aAAA,GAAgB,MAAA;AACtE,QAAA,OAAO,GAAA,GACHA,sBAAA,CAAM,aAAA,CAAc,KAAA,EAAO,EAAE,SAAA,EAAW,GAAA,EAAI,EAAG,OAAO,IACtDA,sBAAA,CAAM,aAAA,CAAcA,sBAAA,CAAM,QAAA,EAAU,MAAM,OAAO,CAAA;AAAA,MACvD,CAAA;AAAA,MACA,MAAM,EAAE,KAAA,EAAO,aAAa,OAAA,GAAU,WAAA,GAAc,WAAW,MAAA;AAAO,KACxE;AAAA,EACF,CAAC,CAAA;AACL","file":"chunk-ZSELW4DA.cjs","sourcesContent":["import React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport type { ReportColumnDef } from '../types'\nimport { PersonLink } from '@fayz-ai/saas'\nimport {\n formatCurrency as formatCurrencyLocale,\n formatDate as formatDateLocale,\n formatDateTime as formatDateTimeLocale,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Formatters (mirrors fieldToColumn.tsx logic)\n// ---------------------------------------------------------------------------\n\nfunction formatCurrency(value: any, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return '—'\n return formatCurrencyLocale(num, currency)\n}\n\nfunction formatDate(value: any): string {\n if (!value) return '—'\n return formatDateLocale(value)\n}\n\nfunction formatDateTime(value: any): string {\n if (!value) return '—'\n return formatDateTimeLocale(value)\n}\n\nfunction formatNumber(value: any): string {\n if (value == null) return '—'\n return typeof value === 'number' ? value.toLocaleString() : String(value)\n}\n\n// ---------------------------------------------------------------------------\n// Plain-text formatter for exports\n// ---------------------------------------------------------------------------\n\nexport function formatValuePlain(value: any, col: ReportColumnDef, currency?: string): string {\n if (value == null || value === '') return ''\n switch (col.type) {\n case 'currency':\n return formatCurrency(value, col.currency ?? currency)\n case 'date':\n return formatDate(value)\n case 'datetime':\n return formatDateTime(value)\n case 'number':\n return formatNumber(value)\n case 'boolean':\n return value ? 'Yes' : 'No'\n default:\n return String(value)\n }\n}\n\n// ---------------------------------------------------------------------------\n// ReportColumnDef[] → TanStack ColumnDef[]\n// ---------------------------------------------------------------------------\n\nexport function reportColumnsToTanstack(\n columns: ReportColumnDef[],\n currency?: string,\n): ColumnDef<Record<string, any>>[] {\n return columns\n .filter((c) => c.visible !== false)\n .map((col): ColumnDef<Record<string, any>> => {\n const sortable = col.sortable ?? ['text', 'number', 'currency', 'date', 'datetime', 'email'].includes(col.type)\n const alignRight = col.align === 'right' || (!col.align && (col.type === 'currency' || col.type === 'number'))\n const alignCenter = col.align === 'center'\n\n return {\n accessorKey: col.key,\n header: col.label,\n enableSorting: sortable,\n cell: (ctx) => {\n const value = ctx.getValue()\n const row = ctx.row.original\n\n if (col.renderCell) {\n return col.renderCell(value, row)\n }\n\n if (value == null || value === '') {\n return React.createElement('span', { className: 'text-muted-foreground' }, '—')\n }\n\n let content: React.ReactNode\n switch (col.type) {\n case 'person':\n content = React.createElement(PersonLink, {\n personId: col.idKey ? row[col.idKey] : null,\n name: String(value),\n size: 'sm',\n className: 'text-xs',\n })\n break\n case 'currency':\n content = formatCurrency(value, col.currency ?? currency)\n break\n case 'date':\n content = formatDate(value)\n break\n case 'datetime':\n content = formatDateTime(value)\n break\n case 'boolean':\n content = value\n ? React.createElement('svg', { className: 'h-4 w-4 text-success', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '2' },\n React.createElement('polyline', { points: '20 6 9 17 4 12' }),\n )\n : React.createElement('span', { className: 'text-muted-foreground' }, '—')\n break\n case 'number':\n content = formatNumber(value)\n break\n default:\n content = String(value)\n }\n\n const cls = alignRight ? 'text-right' : alignCenter ? 'text-center' : undefined\n return cls\n ? React.createElement('div', { className: cls }, content)\n : React.createElement(React.Fragment, null, content)\n },\n meta: { align: alignRight ? 'right' : alignCenter ? 'center' : 'left' },\n }\n })\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ReportColumnDef } from '../types';
|
|
3
|
+
interface ExportDropdownProps {
|
|
4
|
+
columns: ReportColumnDef[];
|
|
5
|
+
data: Record<string, any>[];
|
|
6
|
+
filename: string;
|
|
7
|
+
currency?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function ExportDropdown({ columns, data, filename, currency, title }: ExportDropdownProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ExportDropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportDropdown.d.ts","sourceRoot":"","sources":["../../src/components/ExportDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAUlD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,UAAU,mBAAmB;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,mBAAmB,qBAyC/F"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ReportDef } from '../types';
|
|
3
|
+
interface ReportCardProps {
|
|
4
|
+
report: ReportDef;
|
|
5
|
+
onClick: (report: ReportDef) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function ReportCard({ report, onClick }: ReportCardProps): React.JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ReportCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportCard.d.ts","sourceRoot":"","sources":["../../src/components/ReportCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,eAAe;IACvB,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;CACrC;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe,qBA2B9D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ReportFilterDef, ReportDateRange } from '../types';
|
|
3
|
+
interface ReportFilterBarProps {
|
|
4
|
+
dateRange: ReportDateRange;
|
|
5
|
+
onDateRangeChange: (range: ReportDateRange) => void;
|
|
6
|
+
filters: ReportFilterDef[];
|
|
7
|
+
filterValues: Record<string, any>;
|
|
8
|
+
onFilterChange: (key: string, value: any) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function ReportFilterBar({ dateRange, onDateRangeChange, filters, filterValues, onFilterChange, }: ReportFilterBarProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ReportFilterBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportFilterBar.d.ts","sourceRoot":"","sources":["../../src/components/ReportFilterBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAKlD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAA;AAEpF,UAAU,oBAAoB;IAC5B,SAAS,EAAE,eAAe,CAAA;IAC1B,iBAAiB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IACnD,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CAClD;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,cAAc,GACf,EAAE,oBAAoB,qBAkCtB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ReportPaginationProps {
|
|
3
|
+
page: number;
|
|
4
|
+
pageSize: number;
|
|
5
|
+
total: number;
|
|
6
|
+
onPageChange: (page: number) => void;
|
|
7
|
+
onPageSizeChange: (size: number) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function ReportPagination({ page, pageSize, total, onPageChange, onPageSizeChange }: ReportPaginationProps): React.JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ReportPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportPagination.d.ts","sourceRoot":"","sources":["../../src/components/ReportPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,qBA8ChH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ReportColumnDef } from '../types';
|
|
3
|
+
interface ReportSummaryRowProps {
|
|
4
|
+
columns: ReportColumnDef[];
|
|
5
|
+
data: Record<string, any>[];
|
|
6
|
+
currency?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ReportSummaryRow({ columns, data, currency }: ReportSummaryRowProps): React.JSX.Element | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=ReportSummaryRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportSummaryRow.d.ts","sourceRoot":"","sources":["../../src/components/ReportSummaryRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,UAAU,qBAAqB;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,qBAAqB,4BA+BlF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { ReportDataProvider, ReportResult } from './types';
|
|
2
|
+
export { createSupabaseReportProvider } from './supabase';
|
|
3
|
+
export type { SupabaseReportProviderConfig } from './supabase';
|
|
4
|
+
export { createMockReportProvider } from './mock';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AACzD,YAAY,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAM7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReportDataProvider } from './types';
|
|
2
|
+
export interface SupabaseReportProviderConfig {
|
|
3
|
+
tenantId: string | (() => string | undefined);
|
|
4
|
+
tenantIdColumn?: string;
|
|
5
|
+
schema?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSupabaseReportProvider(config: SupabaseReportProviderConfig): ReportDataProvider;
|
|
8
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/data/supabase.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,SAAS,CAAA;AA2B/D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAA;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,4BAA4B,GAAG,kBAAkB,CA0BrG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReportDef, ReportQueryState } from '../types';
|
|
2
|
+
export interface ReportResult {
|
|
3
|
+
data: Record<string, any>[];
|
|
4
|
+
total: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ReportDataProvider {
|
|
7
|
+
fetch(reportDef: ReportDef, query: ReportQueryState): Promise<ReportResult>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC5E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZSELW4DA_cjs = require('./chunk-ZSELW4DA.cjs');
|
|
4
|
+
|
|
5
|
+
// src/export/excel.ts
|
|
6
|
+
var load = (m) => new Function("m", "return import(m)")(m);
|
|
7
|
+
async function exportToExcel(columns, data, filename, currency) {
|
|
8
|
+
const XLSX = await load("xlsx");
|
|
9
|
+
const visibleCols = columns.filter((c) => c.visible !== false);
|
|
10
|
+
const header = visibleCols.map((c) => c.label);
|
|
11
|
+
const rows = data.map(
|
|
12
|
+
(row) => visibleCols.map((col) => {
|
|
13
|
+
const value = row[col.key];
|
|
14
|
+
if (col.type === "number" || col.type === "currency") {
|
|
15
|
+
const num = typeof value === "number" ? value : parseFloat(value);
|
|
16
|
+
return isNaN(num) ? "" : num;
|
|
17
|
+
}
|
|
18
|
+
return chunkZSELW4DA_cjs.formatValuePlain(value, col, currency);
|
|
19
|
+
})
|
|
20
|
+
);
|
|
21
|
+
const ws = XLSX.utils.aoa_to_sheet([header, ...rows]);
|
|
22
|
+
const wb = XLSX.utils.book_new();
|
|
23
|
+
XLSX.utils.book_append_sheet(wb, ws, "Report");
|
|
24
|
+
XLSX.writeFile(wb, `${filename}.xlsx`);
|
|
25
|
+
}
|
|
26
|
+
async function isExcelAvailable() {
|
|
27
|
+
try {
|
|
28
|
+
await load("xlsx");
|
|
29
|
+
return true;
|
|
30
|
+
} catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exports.exportToExcel = exportToExcel;
|
|
36
|
+
exports.isExcelAvailable = isExcelAvailable;
|
|
37
|
+
//# sourceMappingURL=excel-2PDUZ55J.cjs.map
|
|
38
|
+
//# sourceMappingURL=excel-2PDUZ55J.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/export/excel.ts"],"names":["formatValuePlain"],"mappings":";;;;;AAKA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAc,IAAI,SAAS,GAAA,EAAK,kBAAkB,EAAE,CAAC,CAAA;AAEnE,eAAsB,aAAA,CACpB,OAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AAE7D,EAAA,MAAM,SAAS,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,KACrB,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,UAAA,EAAY;AACpD,QAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,WAAW,KAAK,CAAA;AAChE,QAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,EAAA,GAAK,GAAA;AAAA,MAC3B;AACA,MAAA,OAAOA,kCAAA,CAAiB,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC9C,CAAC;AAAA,GACH;AAEA,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,YAAA,CAAa,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAC/B,EAAA,IAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,QAAQ,CAAA;AAC7C,EAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO,CAAA;AACvC;AAEA,eAAsB,gBAAA,GAAqC;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,MAAM,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"excel-2PDUZ55J.cjs","sourcesContent":["import type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\n// Opaque dynamic import — hidden from Vite's static analysis so it won't\n// fail when xlsx is not installed (it's an optional peer dependency).\nconst load = (m: string) => new Function('m', 'return import(m)')(m) as Promise<any>\n\nexport async function exportToExcel(\n columns: ReportColumnDef[],\n data: Record<string, any>[],\n filename: string,\n currency?: string,\n): Promise<void> {\n const XLSX = await load('xlsx')\n const visibleCols = columns.filter((c) => c.visible !== false)\n\n const header = visibleCols.map((c) => c.label)\n const rows = data.map((row) =>\n visibleCols.map((col) => {\n const value = row[col.key]\n if (col.type === 'number' || col.type === 'currency') {\n const num = typeof value === 'number' ? value : parseFloat(value)\n return isNaN(num) ? '' : num\n }\n return formatValuePlain(value, col, currency)\n }),\n )\n\n const ws = XLSX.utils.aoa_to_sheet([header, ...rows])\n const wb = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(wb, ws, 'Report')\n XLSX.writeFile(wb, `${filename}.xlsx`)\n}\n\nexport async function isExcelAvailable(): Promise<boolean> {\n try {\n await load('xlsx')\n return true\n } catch {\n return false\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { formatValuePlain } from './chunk-LODXZ2SC.js';
|
|
2
|
+
|
|
3
|
+
// src/export/excel.ts
|
|
4
|
+
var load = (m) => new Function("m", "return import(m)")(m);
|
|
5
|
+
async function exportToExcel(columns, data, filename, currency) {
|
|
6
|
+
const XLSX = await load("xlsx");
|
|
7
|
+
const visibleCols = columns.filter((c) => c.visible !== false);
|
|
8
|
+
const header = visibleCols.map((c) => c.label);
|
|
9
|
+
const rows = data.map(
|
|
10
|
+
(row) => visibleCols.map((col) => {
|
|
11
|
+
const value = row[col.key];
|
|
12
|
+
if (col.type === "number" || col.type === "currency") {
|
|
13
|
+
const num = typeof value === "number" ? value : parseFloat(value);
|
|
14
|
+
return isNaN(num) ? "" : num;
|
|
15
|
+
}
|
|
16
|
+
return formatValuePlain(value, col, currency);
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
const ws = XLSX.utils.aoa_to_sheet([header, ...rows]);
|
|
20
|
+
const wb = XLSX.utils.book_new();
|
|
21
|
+
XLSX.utils.book_append_sheet(wb, ws, "Report");
|
|
22
|
+
XLSX.writeFile(wb, `${filename}.xlsx`);
|
|
23
|
+
}
|
|
24
|
+
async function isExcelAvailable() {
|
|
25
|
+
try {
|
|
26
|
+
await load("xlsx");
|
|
27
|
+
return true;
|
|
28
|
+
} catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { exportToExcel, isExcelAvailable };
|
|
34
|
+
//# sourceMappingURL=excel-QHUSM6IH.js.map
|
|
35
|
+
//# sourceMappingURL=excel-QHUSM6IH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/export/excel.ts"],"names":[],"mappings":";;;AAKA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAc,IAAI,SAAS,GAAA,EAAK,kBAAkB,EAAE,CAAC,CAAA;AAEnE,eAAsB,aAAA,CACpB,OAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AAE7D,EAAA,MAAM,SAAS,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,KACrB,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,UAAA,EAAY;AACpD,QAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,WAAW,KAAK,CAAA;AAChE,QAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,EAAA,GAAK,GAAA;AAAA,MAC3B;AACA,MAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC9C,CAAC;AAAA,GACH;AAEA,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,YAAA,CAAa,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAC/B,EAAA,IAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,QAAQ,CAAA;AAC7C,EAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO,CAAA;AACvC;AAEA,eAAsB,gBAAA,GAAqC;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,MAAM,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"excel-QHUSM6IH.js","sourcesContent":["import type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\n// Opaque dynamic import — hidden from Vite's static analysis so it won't\n// fail when xlsx is not installed (it's an optional peer dependency).\nconst load = (m: string) => new Function('m', 'return import(m)')(m) as Promise<any>\n\nexport async function exportToExcel(\n columns: ReportColumnDef[],\n data: Record<string, any>[],\n filename: string,\n currency?: string,\n): Promise<void> {\n const XLSX = await load('xlsx')\n const visibleCols = columns.filter((c) => c.visible !== false)\n\n const header = visibleCols.map((c) => c.label)\n const rows = data.map((row) =>\n visibleCols.map((col) => {\n const value = row[col.key]\n if (col.type === 'number' || col.type === 'currency') {\n const num = typeof value === 'number' ? value : parseFloat(value)\n return isNaN(num) ? '' : num\n }\n return formatValuePlain(value, col, currency)\n }),\n )\n\n const ws = XLSX.utils.aoa_to_sheet([header, ...rows])\n const wb = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(wb, ws, 'Report')\n XLSX.writeFile(wb, `${filename}.xlsx`)\n}\n\nexport async function isExcelAvailable(): Promise<boolean> {\n try {\n await load('xlsx')\n return true\n } catch {\n return false\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/export/csv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,wBAAgB,WAAW,CACzB,OAAO,EAAE,eAAe,EAAE,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAUN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReportColumnDef } from '../types';
|
|
2
|
+
export declare function exportToExcel(columns: ReportColumnDef[], data: Record<string, any>[], filename: string, currency?: string): Promise<void>;
|
|
3
|
+
export declare function isExcelAvailable(): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=excel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel.d.ts","sourceRoot":"","sources":["../../src/export/excel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAO/C,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EAAE,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOzD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReportColumnDef } from '../types';
|
|
2
|
+
export declare function exportToPdf(columns: ReportColumnDef[], data: Record<string, any>[], filename: string, options?: {
|
|
3
|
+
title?: string;
|
|
4
|
+
currency?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
export declare function isPdfAvailable(): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/export/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAO/C,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EAAE,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReportDef, ReportQueryState, ReportDateRange } from '../types';
|
|
2
|
+
import type { ReportDataProvider } from '../data/types';
|
|
3
|
+
export interface UseReportDataReturn {
|
|
4
|
+
data: Record<string, any>[];
|
|
5
|
+
total: number;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
generated: boolean;
|
|
8
|
+
error: string | null;
|
|
9
|
+
query: ReportQueryState;
|
|
10
|
+
generate: () => void;
|
|
11
|
+
setDateRange: (range: ReportDateRange) => void;
|
|
12
|
+
setFilter: (key: string, value: any) => void;
|
|
13
|
+
setSort: (sortBy: string) => void;
|
|
14
|
+
setPage: (page: number) => void;
|
|
15
|
+
setPageSize: (size: number) => void;
|
|
16
|
+
setSearch: (search: string) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function useReportData(report: ReportDef, provider: ReportDataProvider, defaultPageSize?: number): UseReportDataReturn;
|
|
19
|
+
//# sourceMappingURL=useReportData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReportData.d.ts","sourceRoot":"","sources":["../../src/hooks/useReportData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,eAAe,CAAA;AAkBrE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,gBAAgB,CAAA;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC9C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IAC5C,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,GAAE,MAAW,GAC3B,mBAAmB,CAkFrB"}
|