@fayz-ai/plugin-reports 0.2.0 → 0.9.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/package.json +19 -11
- package/src/components/ReportCard.tsx +3 -3
- package/dist/chunk-ZSELW4DA.cjs +0 -107
- package/dist/chunk-ZSELW4DA.cjs.map +0 -1
- package/dist/excel-2PDUZ55J.cjs +0 -38
- package/dist/excel-2PDUZ55J.cjs.map +0 -1
- package/dist/index.cjs +0 -904
- package/dist/index.cjs.map +0 -1
- package/dist/pdf-GB4JYUYH.cjs +0 -40
- package/dist/pdf-GB4JYUYH.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @fayz-ai/plugin-reports
|
|
2
2
|
|
|
3
|
-
> **Status: experimental (incubating).** Not capability-complete — missing some or all of the capability bar (data-provider contract w/ supabase+mock pair, entity registries, settings, migrations; see `
|
|
3
|
+
> **Status: experimental (incubating).** Not capability-complete — missing some or all of the capability bar (data-provider contract w/ supabase+mock pair, entity registries, settings, migrations; see `docs/PLUGIN-PATTERNS.md`). Fine to explore in dogfoods; NOT ready for fresh installs or generated apps, and its API may change without notice.
|
|
4
4
|
|
|
5
5
|
> Config-driven reports for your SaaS — declare the report, get the page.
|
|
6
6
|
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,8 @@ import { reportColumnsToTanstack, formatValuePlain } from './chunk-LODXZ2SC.js';
|
|
|
2
2
|
import React7, { createContext, useState, useEffect, useCallback, useMemo, useContext, useRef } from 'react';
|
|
3
3
|
import { registerTranslations, createSafeDataProvider, getSupabaseClientOptional, useTranslation, exportCSV } from '@fayz-ai/core';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { Button, DataTable, Input, DatePicker, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, Badge, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui';
|
|
5
|
+
import { ArrowLeft, Loader2, Play, Printer, SlidersHorizontal, Construction, Search, Download, ChevronLeft, ChevronRight, FileText } from 'lucide-react';
|
|
6
|
+
import { Button, DataTable, Input, DatePicker, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, getLucideIcon, Badge, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui';
|
|
8
7
|
import { dedup } from '@fayz-ai/saas';
|
|
9
8
|
|
|
10
9
|
var ReportsContext = createContext(null);
|
|
@@ -21,7 +20,7 @@ function ReportsContextProvider({
|
|
|
21
20
|
return /* @__PURE__ */ jsx(ReportsContext.Provider, { value: { config, provider, reports: config.reports }, children });
|
|
22
21
|
}
|
|
23
22
|
function ReportCard({ report, onClick }) {
|
|
24
|
-
const IconComp =
|
|
23
|
+
const IconComp = getLucideIcon(report.icon) ?? FileText;
|
|
25
24
|
return /* @__PURE__ */ jsxs(
|
|
26
25
|
"button",
|
|
27
26
|
{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ReportsContext.tsx","../src/components/ReportCard.tsx","../src/views/ReportHub.tsx","../src/hooks/useReportData.ts","../src/components/ReportFilterBar.tsx","../src/components/ReportPagination.tsx","../src/components/ReportSummaryRow.tsx","../src/export/csv.ts","../src/components/ExportDropdown.tsx","../src/views/ReportViewer.tsx","../src/ReportsPage.tsx","../src/data/supabase.ts","../src/data/mock.ts","../src/lib/tenant.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["jsx","t","jsxs","useState","useTranslation","Input","useEffect","Button","useMemo","useCallback","React"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext } from 'react'\nimport type { ResolvedReportsConfig, ReportDef } from './types'\nimport type { ReportDataProvider } from './data/types'\n\ninterface ReportsContextValue {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n reports: ReportDef[]\n}\n\nconst ReportsContext = createContext<ReportsContextValue | null>(null)\n\nexport function useReportsContext(): ReportsContextValue {\n const ctx = useContext(ReportsContext)\n if (!ctx) throw new Error('useReportsContext must be used within ReportsContextProvider')\n return ctx\n}\n\nexport function ReportsContextProvider({\n config,\n provider,\n children,\n}: {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n children: React.ReactNode\n}) {\n return (\n <ReportsContext.Provider value={{ config, provider, reports: config.reports }}>\n {children}\n </ReportsContext.Provider>\n )\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { Badge } from '@fayz-ai/ui'\nimport type { ReportDef } from '../types'\n\ninterface ReportCardProps {\n report: ReportDef\n onClick: (report: ReportDef) => void\n}\n\nexport function ReportCard({ report, onClick }: ReportCardProps) {\n const IconComp = (LucideIcons as any)[report.icon] ?? LucideIcons.FileText\n\n return (\n <button\n type=\"button\"\n onClick={() => onClick(report)}\n className=\"flex flex-col items-start gap-2 rounded-xl border bg-card p-4 text-left transition-all hover:border-primary/30 hover:shadow-md\"\n >\n <div className=\"flex w-full items-start justify-between\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <IconComp className=\"h-5 w-5\" />\n </div>\n {report.badge && (\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {report.badge}\n </Badge>\n )}\n </div>\n <div>\n <h4 className=\"font-medium text-sm\">{report.name}</h4>\n {report.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{report.description}</p>\n )}\n </div>\n </button>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ReportCard } from '../components/ReportCard'\nimport { useReportsContext } from '../ReportsContext'\nimport type { ReportDef } from '../types'\n\ninterface ReportHubProps {\n onSelect: (report: ReportDef) => void\n}\n\ninterface CategoryGroup {\n name: string\n reports: ReportDef[]\n}\n\nexport function ReportHub({ onSelect }: ReportHubProps) {\n const t = useTranslation()\n const { config } = useReportsContext()\n const [search, setSearch] = useState('')\n\n const categories = useMemo(() => {\n const filtered = search\n ? config.reports.filter(\n (r) =>\n r.name.toLowerCase().includes(search.toLowerCase()) ||\n r.description?.toLowerCase().includes(search.toLowerCase()),\n )\n : config.reports\n\n const map = new Map<string, ReportDef[]>()\n for (const report of filtered) {\n const list = map.get(report.category) ?? []\n list.push(report)\n map.set(report.category, list)\n }\n\n const groups: CategoryGroup[] = []\n for (const [name, reports] of map) {\n groups.push({ name, reports })\n }\n return groups\n }, [config.reports, search])\n\n const totalReports = config.reports.length\n\n return (\n <div className=\"space-y-6\">\n {/* Header (omitted when the app shell owns the page title) */}\n {config.showHeader && (\n <div>\n <h1 className=\"text-2xl font-bold\">{t('reports.pageTitle')}</h1>\n <p className=\"text-muted-foreground mt-1\">{t('reports.pageSubtitle')}</p>\n </div>\n )}\n\n {/* Search */}\n {totalReports > 6 && (\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('reports.search')}\n className=\"pl-9\"\n />\n </div>\n )}\n\n {/* Categories */}\n <div className=\"space-y-8\">\n {categories.map((category) => (\n <div key={category.name} className=\"rounded-xl border bg-card shadow-sm p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"font-semibold\">{category.name}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {category.reports.length} {t('reports.reports')}\n </span>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\">\n {category.reports.map((report) => (\n <ReportCard key={report.id} report={report} onClick={onSelect} />\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {categories.length === 0 && search && (\n <div className=\"text-center py-12 text-muted-foreground\">\n {t('reports.noResults')}\n </div>\n )}\n </div>\n )\n}\n","import { useState, useCallback, useRef } from 'react'\nimport type { ReportDef, ReportQueryState, ReportDateRange } from '../types'\nimport type { ReportDataProvider, ReportResult } from '../data/types'\nimport { dedup } from '@fayz-ai/saas'\n\nfunction defaultDateRange(): ReportDateRange {\n const now = new Date()\n const from = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-01`\n const to = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`\n return { from, to }\n}\n\nfunction buildDefaultFilters(report: ReportDef): Record<string, any> {\n const filters: Record<string, any> = {}\n for (const f of report.filters ?? []) {\n if (f.defaultValue !== undefined) filters[f.key] = f.defaultValue\n }\n return filters\n}\n\nexport interface UseReportDataReturn {\n data: Record<string, any>[]\n total: number\n loading: boolean\n generated: boolean\n error: string | null\n query: ReportQueryState\n generate: () => void\n setDateRange: (range: ReportDateRange) => void\n setFilter: (key: string, value: any) => void\n setSort: (sortBy: string) => void\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n setSearch: (search: string) => void\n}\n\nexport function useReportData(\n report: ReportDef,\n provider: ReportDataProvider,\n defaultPageSize: number = 50,\n): UseReportDataReturn {\n const [query, setQuery] = useState<ReportQueryState>({\n dateRange: defaultDateRange(),\n filters: buildDefaultFilters(report),\n sortBy: report.dataSource.defaultSort,\n sortDir: report.dataSource.defaultSortDir ?? 'desc',\n page: 1,\n pageSize: defaultPageSize,\n })\n\n const [result, setResult] = useState<ReportResult>({ data: [], total: 0 })\n const [loading, setLoading] = useState(false)\n const [generated, setGenerated] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const queryRef = useRef(query)\n queryRef.current = query\n\n const fetchData = useCallback(async (q: ReportQueryState) => {\n setLoading(true)\n setError(null)\n try {\n const res = await dedup(`report:${report.id}:${JSON.stringify(q)}`, () =>\n provider.fetch(report, q),\n )\n setResult(res)\n setGenerated(true)\n } catch (err: any) {\n setError(err?.message ?? 'Failed to load report')\n setResult({ data: [], total: 0 })\n } finally {\n setLoading(false)\n }\n }, [report, provider])\n\n const generate = useCallback(() => {\n fetchData(queryRef.current)\n }, [fetchData])\n\n const setDateRange = useCallback((dateRange: ReportDateRange) => {\n setQuery((q) => ({ ...q, dateRange, page: 1 }))\n }, [])\n\n const setFilter = useCallback((key: string, value: any) => {\n setQuery((q) => ({ ...q, filters: { ...q.filters, [key]: value }, page: 1 }))\n }, [])\n\n const setSort = useCallback((sortBy: string) => {\n setQuery((q) => ({\n ...q,\n sortBy,\n sortDir: q.sortBy === sortBy && q.sortDir === 'asc' ? 'desc' : 'asc',\n page: 1,\n }))\n }, [])\n\n const setPage = useCallback((page: number) => {\n setQuery((q) => ({ ...q, page }))\n }, [])\n\n const setPageSize = useCallback((pageSize: number) => {\n setQuery((q) => ({ ...q, pageSize, page: 1 }))\n }, [])\n\n const setSearch = useCallback((search: string) => {\n setQuery((q) => ({ ...q, search, page: 1 }))\n }, [])\n\n return {\n data: result.data,\n total: result.total,\n loading,\n generated,\n error,\n query,\n generate,\n setDateRange,\n setFilter,\n setSort,\n setPage,\n setPageSize,\n setSearch,\n }\n}\n","import React, { useEffect, useState } from 'react'\nimport { DatePicker } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectContent, SelectItem, SelectValue } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ReportFilterDef, ReportDateRange, ReportFilterOption } from '../types'\n\ninterface ReportFilterBarProps {\n dateRange: ReportDateRange\n onDateRangeChange: (range: ReportDateRange) => void\n filters: ReportFilterDef[]\n filterValues: Record<string, any>\n onFilterChange: (key: string, value: any) => void\n}\n\nexport function ReportFilterBar({\n dateRange,\n onDateRangeChange,\n filters,\n filterValues,\n onFilterChange,\n}: ReportFilterBarProps) {\n const t = useTranslation()\n\n return (\n <div className=\"flex flex-wrap items-end gap-3\">\n {/* Date range — always present */}\n <div className=\"flex items-end gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('reports.from')}</label>\n <DatePicker\n value={dateRange.from}\n onChange={(v) => onDateRangeChange({ ...dateRange, from: v })}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('reports.to')}</label>\n <DatePicker\n value={dateRange.to}\n onChange={(v) => onDateRangeChange({ ...dateRange, to: v })}\n />\n </div>\n </div>\n\n {/* Custom filters */}\n {filters.map((filter) => (\n <FilterControl\n key={filter.key}\n filter={filter}\n value={filterValues[filter.key]}\n onChange={(v) => onFilterChange(filter.key, v)}\n />\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Individual filter control\n// ---------------------------------------------------------------------------\n\nfunction FilterControl({\n filter,\n value,\n onChange,\n}: {\n filter: ReportFilterDef\n value: any\n onChange: (value: any) => void\n}) {\n const [options, setOptions] = useState<ReportFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n\n useEffect(() => {\n if (typeof filter.options === 'function') {\n filter.options().then(setOptions)\n }\n }, [filter.options])\n\n if (filter.type === 'select') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Select value={value ?? ''} onValueChange={(v) => onChange(v === '__all__' ? '' : v)}>\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder={filter.placeholder ?? filter.label} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All</SelectItem>\n {options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n }\n\n if (filter.type === 'text') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Input\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={filter.placeholder ?? filter.label}\n className=\"w-[180px]\"\n />\n </div>\n )\n }\n\n if (filter.type === 'number') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Input\n type=\"number\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : undefined)}\n placeholder={filter.placeholder ?? filter.label}\n className=\"w-[120px]\"\n />\n </div>\n )\n }\n\n return null\n}\n","import React from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\n\ninterface ReportPaginationProps {\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n onPageSizeChange: (size: number) => void\n}\n\nexport function ReportPagination({ page, pageSize, total, onPageChange, onPageSizeChange }: ReportPaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const from = (page - 1) * pageSize + 1\n const to = Math.min(page * pageSize, total)\n\n return (\n <div className=\"flex items-center justify-between border-t px-4 py-3\">\n <div className=\"text-sm text-muted-foreground\">\n {total > 0 ? `${from}–${to} of ${total}` : 'No results'}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n className=\"h-8 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 text-sm\"\n >\n {[25, 50, 100].map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"text-sm px-2\">\n {page} / {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\ninterface ReportSummaryRowProps {\n columns: ReportColumnDef[]\n data: Record<string, any>[]\n currency?: string\n}\n\nexport function ReportSummaryRow({ columns, data, currency }: ReportSummaryRowProps) {\n const visibleCols = columns.filter((c) => c.visible !== false)\n const hasAggregates = visibleCols.some((c) => c.aggregate)\n if (!hasAggregates || data.length === 0) return null\n\n return (\n <div className=\"rounded-lg border bg-muted/30 overflow-hidden\">\n <table className=\"w-full text-xs\">\n <tbody>\n <tr className=\"font-semibold\">\n {visibleCols.map((col) => {\n const value = computeAggregate(col, data)\n const alignRight = col.align === 'right' || col.type === 'currency' || col.type === 'number'\n return (\n <td\n key={col.key}\n className={`px-3 py-1.5 ${alignRight ? 'text-right' : ''}`}\n >\n {value != null\n ? formatValuePlain(value, col, currency)\n : col.aggregate\n ? '—'\n : ''}\n </td>\n )\n })}\n </tr>\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction computeAggregate(col: ReportColumnDef, data: Record<string, any>[]): number | null {\n if (!col.aggregate) return null\n\n const values = data\n .map((row) => row[col.key])\n .filter((v) => v != null && !isNaN(Number(v)))\n .map(Number)\n\n if (values.length === 0) return null\n\n switch (col.aggregate) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0)\n case 'avg':\n return values.reduce((a, b) => a + b, 0) / values.length\n case 'count':\n return values.length\n case 'min':\n return Math.min(...values)\n case 'max':\n return Math.max(...values)\n default:\n return null\n }\n}\n","import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\nexport function exportToCsv(\n columns: ReportColumnDef[],\n data: Record<string, any>[],\n filename: string,\n currency?: string,\n): void {\n const visibleCols = columns.filter((c) => c.visible !== false)\n\n const csvColumns: CSVColumn[] = visibleCols.map((col) => ({\n key: col.key,\n label: col.label,\n format: (value: any) => formatValuePlain(value, col, currency),\n }))\n\n exportCSV(csvColumns, data, filename)\n}\n","import React, { useEffect, useState } from 'react'\nimport { Download } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { exportToCsv } from '../export/csv'\n\ninterface ExportDropdownProps {\n columns: ReportColumnDef[]\n data: Record<string, any>[]\n filename: string\n currency?: string\n title?: string\n}\n\nexport function ExportDropdown({ columns, data, filename, currency, title }: ExportDropdownProps) {\n const t = useTranslation()\n const [excelAvailable, setExcelAvailable] = useState(false)\n const [pdfAvailable, setPdfAvailable] = useState(false)\n\n useEffect(() => {\n import('../export/excel').then((m) => m.isExcelAvailable()).then(setExcelAvailable).catch(() => {})\n import('../export/pdf').then((m) => m.isPdfAvailable()).then(setPdfAvailable).catch(() => {})\n }, [])\n\n const handleCsv = () => exportToCsv(columns, data, filename, currency)\n\n const handleExcel = async () => {\n const { exportToExcel } = await import('../export/excel')\n await exportToExcel(columns, data, filename, currency)\n }\n\n const handlePdf = async () => {\n const { exportToPdf } = await import('../export/pdf')\n await exportToPdf(columns, data, filename, { title, currency })\n }\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-4 w-4 mr-1.5\" />\n {t('reports.export')}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={handleCsv}>{t('reports.exportCsv')}</DropdownItem>\n {excelAvailable && (\n <DropdownItem onClick={handleExcel}>{t('reports.exportExcel')}</DropdownItem>\n )}\n {pdfAvailable && (\n <DropdownItem onClick={handlePdf}>{t('reports.exportPdf')}</DropdownItem>\n )}\n </DropdownContent>\n </Dropdown>\n )\n}\n","import React, { useMemo } from 'react'\nimport { ArrowLeft, Play, SlidersHorizontal, Construction, Loader2, Printer } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { DataTable } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useReportsContext } from '../ReportsContext'\nimport { useReportData } from '../hooks/useReportData'\nimport { reportColumnsToTanstack } from '../lib/columns'\nimport { ReportFilterBar } from '../components/ReportFilterBar'\nimport { ReportPagination } from '../components/ReportPagination'\nimport { ReportSummaryRow } from '../components/ReportSummaryRow'\nimport { ExportDropdown } from '../components/ExportDropdown'\nimport type { ReportDef } from '../types'\n\ninterface ReportViewerProps {\n report: ReportDef\n onBack: () => void\n}\n\nexport function ReportViewer({ report, onBack }: ReportViewerProps) {\n const t = useTranslation()\n const { config, provider } = useReportsContext()\n const {\n data,\n total,\n loading,\n generated,\n error,\n query,\n generate,\n setDateRange,\n setFilter,\n setPage,\n setPageSize,\n } = useReportData(report, provider, config.defaultPageSize)\n\n const isAvailable = report.available !== false\n const tanstackColumns = useMemo(\n () => reportColumnsToTanstack(report.columns, config.currency.code),\n [report.columns, config.currency.code],\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb — hidden in print */}\n <div className=\"flex items-center gap-1.5 text-sm no-print\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('reports.pageTitle')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{report.name}</span>\n </div>\n\n <div>\n <h2 className=\"text-lg font-bold\">{report.name}</h2>\n {report.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">{report.description}</p>\n )}\n </div>\n\n {/* Filters + Generate — hidden in print */}\n <div className=\"flex flex-wrap items-end gap-3 no-print\">\n <ReportFilterBar\n dateRange={query.dateRange}\n onDateRangeChange={setDateRange}\n filters={report.filters ?? []}\n filterValues={query.filters}\n onFilterChange={setFilter}\n />\n <Button onClick={generate} disabled={loading || !isAvailable} size=\"sm\" className=\"h-9\">\n {loading\n ? <Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />\n : <Play className=\"h-3.5 w-3.5 mr-1.5\" />\n }\n {t('reports.generate')}\n </Button>\n {generated && (\n <>\n <ExportDropdown\n columns={report.columns}\n data={data}\n filename={report.id}\n currency={config.currency.code}\n title={report.name}\n />\n <Button variant=\"outline\" size=\"sm\" className=\"h-9\" onClick={() => window.print()}>\n <Printer className=\"h-3.5 w-3.5 mr-1.5\" />\n {t('reports.print')}\n </Button>\n </>\n )}\n </div>\n\n {/* Print-only: compact filter summary as document header */}\n {generated && (\n <div className=\"print-only hidden text-[10px] border-b pb-2 mb-2\">\n <div className=\"flex flex-wrap gap-x-4 gap-y-0.5\">\n {query.dateRange.from && (\n <span><strong>{t('reports.filterFrom')}:</strong> {new Date(query.dateRange.from + 'T12:00').toLocaleDateString()}</span>\n )}\n {query.dateRange.to && (\n <span><strong>{t('reports.filterTo')}:</strong> {new Date(query.dateRange.to + 'T12:00').toLocaleDateString()}</span>\n )}\n {Object.entries(query.filters).map(([key, value]) =>\n value ? <span key={key}><strong>{key}:</strong> {String(value)}</span> : null\n )}\n <span><strong>{t('reports.filterResults')}:</strong> {total}</span>\n </div>\n </div>\n )}\n\n {/* Error */}\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n {/* Empty state — before generate */}\n {!generated && !loading && (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed py-16 text-center\">\n {isAvailable ? (\n <>\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <SlidersHorizontal className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{t('reports.emptyStateTitle')}</p>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">{t('reports.emptyStateDescription')}</p>\n </>\n ) : (\n <>\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{t('reports.unavailableTitle')}</p>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">{t('reports.unavailableDescription')}</p>\n </>\n )}\n </div>\n )}\n\n {/* Results — only shown after generate */}\n {(generated || loading) && (\n <>\n <DataTable\n columns={tanstackColumns}\n data={data}\n loading={loading}\n skeletonRows={5}\n emptyMessage={t('reports.noResults')}\n variant=\"card\"\n compact\n />\n\n {report.showSummary && !loading && (\n <ReportSummaryRow\n columns={report.columns}\n data={data}\n currency={config.currency.code}\n />\n )}\n\n {!loading && (\n <div className=\"no-print\">\n <ReportPagination\n page={query.page}\n pageSize={query.pageSize}\n total={total}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ReportsContextProvider } from './ReportsContext'\nimport { ReportHub } from './views/ReportHub'\nimport { ReportViewer } from './views/ReportViewer'\nimport type { ResolvedReportsConfig, ReportDef } from './types'\nimport type { ReportDataProvider } from './data/types'\n\nconst HASH_BASE = '/reports'\n\nfunction getReportIdFromHash(): string | null {\n const hash = (window.location.hash.slice(1) || '/').split('?')[0]\n if (hash.startsWith(HASH_BASE + '/') && hash.length > HASH_BASE.length + 1) {\n return hash.slice(HASH_BASE.length + 1)\n }\n return null\n}\n\nexport function ReportsPage({\n config,\n provider,\n}: {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n}) {\n const [activeReportId, setActiveReportId] = useState<string | null>(getReportIdFromHash)\n\n useEffect(() => {\n function handler() {\n setActiveReportId(getReportIdFromHash())\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const handleSelect = useCallback((report: ReportDef) => {\n window.location.hash = `${HASH_BASE}/${report.id}`\n }, [])\n\n const handleBack = useCallback(() => {\n window.location.hash = HASH_BASE\n }, [])\n\n const activeReport = activeReportId\n ? config.reports.find((r) => r.id === activeReportId) ?? null\n : null\n\n return (\n <ReportsContextProvider config={config} provider={provider}>\n <div className=\"p-1\">\n {activeReport ? (\n <ReportViewer\n key={activeReport.id}\n report={activeReport}\n onBack={handleBack}\n />\n ) : (\n <ReportHub onSelect={handleSelect} />\n )}\n </div>\n </ReportsContextProvider>\n )\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ReportDef, ReportQueryState } from '../types'\nimport type { ReportDataProvider, ReportResult } from './types'\n\n// ---------------------------------------------------------------------------\n// Case conversion\n// ---------------------------------------------------------------------------\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction mapRow(row: Record<string, unknown>, columnMap?: Record<string, string>): Record<string, any> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n const camelKey = columnMap?.[key] ?? snakeToCamel(key)\n result[camelKey] = value\n }\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseReportProviderConfig {\n tenantId: string | (() => string | undefined)\n tenantIdColumn?: string\n schema?: string\n}\n\nexport function createSupabaseReportProvider(config: SupabaseReportProviderConfig): ReportDataProvider {\n const schema = config.schema ?? 'public'\n const tenantIdCol = config.tenantIdColumn ?? 'tenant_id'\n\n function resolveTenantId(): string | undefined {\n return typeof config.tenantId === 'function' ? config.tenantId() : config.tenantId\n }\n\n function getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase client not available')\n return schema === 'public' ? supabase : supabase.schema(schema)\n }\n\n return {\n async fetch(reportDef: ReportDef, query: ReportQueryState): Promise<ReportResult> {\n const { dataSource } = reportDef\n const columnMap = dataSource.columnMap\n\n if (dataSource.kind === 'rpc') {\n return fetchViaRpc(reportDef, query, getClient, resolveTenantId, columnMap)\n }\n\n return fetchViaView(reportDef, query, getClient, resolveTenantId, tenantIdCol, columnMap)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// View-based fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchViaView(\n reportDef: ReportDef,\n query: ReportQueryState,\n getClient: () => any,\n resolveTenantId: () => string | undefined,\n tenantIdCol: string,\n columnMap?: Record<string, string>,\n): Promise<ReportResult> {\n const { dataSource } = reportDef\n let q = getClient().from(dataSource.name).select('*', { count: 'exact' })\n\n // Tenant scoping\n const tenantId = resolveTenantId()\n if (tenantId) {\n q = q.eq(tenantIdCol, tenantId)\n }\n\n // Date range\n const dateCol = dataSource.dateColumn ?? 'created_at'\n if (query.dateRange.from) {\n q = q.gte(dateCol, query.dateRange.from)\n }\n if (query.dateRange.to) {\n // For date-type columns, plain date string is sufficient.\n // For timestamptz columns, extend to end of day.\n const toValue = dateCol === 'created_at' || dateCol.endsWith('_at')\n ? query.dateRange.to + 'T23:59:59'\n : query.dateRange.to\n q = q.lte(dateCol, toValue)\n }\n\n // Custom filters\n for (const [key, value] of Object.entries(query.filters)) {\n if (value == null || value === '') continue\n const col = camelToSnake(key)\n if (Array.isArray(value)) {\n q = q.in(col, value)\n } else {\n q = q.eq(col, value)\n }\n }\n\n // Search\n if (query.search) {\n const searchableCols = reportDef.columns\n .filter((c) => c.type === 'text' || c.type === 'email')\n .map((c: any) => camelToSnake(c.key))\n if (searchableCols.length > 0) {\n const term = `%${query.search}%`\n const orClause = searchableCols.map((col) => `${col}.ilike.${term}`).join(',')\n q = q.or(orClause)\n }\n }\n\n // Sort\n const sortCol = query.sortBy\n ? camelToSnake(query.sortBy)\n : dataSource.defaultSort\n ? camelToSnake(dataSource.defaultSort)\n : dateCol\n const ascending = query.sortDir\n ? query.sortDir === 'asc'\n : dataSource.defaultSortDir\n ? dataSource.defaultSortDir === 'asc'\n : false\n q = q.order(sortCol, { ascending })\n\n // Pagination\n const from = (query.page - 1) * query.pageSize\n const to = from + query.pageSize - 1\n q = q.range(from, to)\n\n const { data, error, count } = await q\n\n if (error) throw error\n\n return {\n data: (data ?? []).map((row: any) => mapRow(row, columnMap)),\n total: count ?? 0,\n }\n}\n\n// ---------------------------------------------------------------------------\n// RPC-based fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchViaRpc(\n reportDef: ReportDef,\n query: ReportQueryState,\n getClient: () => any,\n resolveTenantId: () => string | undefined,\n columnMap?: Record<string, string>,\n): Promise<ReportResult> {\n const { dataSource } = reportDef\n const tenantId = resolveTenantId()\n\n const params: Record<string, any> = {\n p_tenant_id: tenantId,\n p_from: query.dateRange.from,\n p_to: query.dateRange.to,\n p_page: query.page,\n p_page_size: query.pageSize,\n }\n\n // Custom filters\n for (const [key, value] of Object.entries(query.filters)) {\n if (value == null || value === '') continue\n params[`p_${camelToSnake(key)}`] = value\n }\n\n if (query.sortBy) {\n params.p_sort_by = camelToSnake(query.sortBy)\n params.p_sort_dir = query.sortDir ?? 'desc'\n }\n\n const { data, error } = await getClient().rpc(dataSource.name, params)\n if (error) throw error\n\n // RPC expected to return { data: [...], total: number }\n if (data && typeof data === 'object' && 'data' in data) {\n return {\n data: (data.data ?? []).map((row: any) => mapRow(row, columnMap)),\n total: data.total ?? 0,\n }\n }\n\n // Fallback: RPC returns a plain array\n const rows = Array.isArray(data) ? data : []\n return {\n data: rows.map((row: any) => mapRow(row, columnMap)),\n total: rows.length,\n }\n}\n","import type { ReportDataProvider } from './types'\n\nexport function createMockReportProvider(): ReportDataProvider {\n return {\n async fetch() {\n return { data: [], total: 0 }\n },\n }\n}\n","let t: string | undefined\nexport function setReportsTenantId(id: string | undefined){ t = id }\nexport function getReportsTenantId(): string | undefined { return t }\n","export const en: Record<string, string> = {\n 'reports.pageTitle': 'Reports',\n 'reports.pageSubtitle': 'Access complete reports for analysis and decision making',\n 'reports.allReports': 'All Reports',\n 'reports.dateRange': 'Date Range',\n 'reports.from': 'From',\n 'reports.to': 'To',\n 'reports.export': 'Export',\n 'reports.exportCsv': 'Export CSV',\n 'reports.exportExcel': 'Export Excel',\n 'reports.exportPdf': 'Export PDF',\n 'reports.noResults': 'No results found.',\n 'reports.backToReports': 'Back',\n 'reports.reports': 'reports',\n 'reports.search': 'Search reports...',\n 'reports.today': 'Today',\n 'reports.yesterday': 'Yesterday',\n 'reports.last7Days': 'Last 7 days',\n 'reports.thisMonth': 'This month',\n 'reports.lastMonth': 'Last month',\n 'reports.thisQuarter': 'This quarter',\n 'reports.custom': 'Custom',\n 'reports.generate': 'Generate',\n 'reports.emptyStateTitle': 'Ready to generate',\n 'reports.emptyStateDescription': 'Select a date range and filters, then click Generate to view the report.',\n 'reports.unavailableTitle': 'Coming soon',\n 'reports.unavailableDescription': 'This report is not available yet. It will be enabled in a future update.',\n}\n","export const ptBR: Record<string, string> = {\n 'reports.pageTitle': 'Relatórios',\n 'reports.pageSubtitle': 'Acesse relatórios completos para análise e tomada de decisão',\n 'reports.allReports': 'Todos os Relatórios',\n 'reports.dateRange': 'Período',\n 'reports.from': 'De',\n 'reports.to': 'Até',\n 'reports.export': 'Exportar',\n 'reports.exportCsv': 'Exportar CSV',\n 'reports.exportExcel': 'Exportar Excel',\n 'reports.exportPdf': 'Exportar PDF',\n 'reports.noResults': 'Nenhum resultado encontrado.',\n 'reports.backToReports': 'Voltar',\n 'reports.reports': 'relatórios',\n 'reports.search': 'Buscar relatórios...',\n 'reports.today': 'Hoje',\n 'reports.yesterday': 'Ontem',\n 'reports.last7Days': 'Últimos 7 dias',\n 'reports.thisMonth': 'Este mês',\n 'reports.lastMonth': 'Mês passado',\n 'reports.thisQuarter': 'Este trimestre',\n 'reports.custom': 'Personalizado',\n 'reports.generate': 'Gerar',\n 'reports.emptyStateTitle': 'Pronto para gerar',\n 'reports.emptyStateDescription': 'Selecione o período e os filtros desejados, depois clique em Gerar para visualizar o relatório.',\n 'reports.unavailableTitle': 'Em breve',\n 'reports.unavailableDescription': 'Este relatório ainda não está disponível. Será habilitado em uma atualização futura.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const reportsLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { ReportsPage } from './ReportsPage'\nimport type { ReportDataProvider } from './data/types'\nimport { createSupabaseReportProvider } from './data/supabase'\nimport { createMockReportProvider } from './data/mock'\nimport { getReportsTenantId } from './lib/tenant'\nimport { reportsLocales } from './locales'\nimport type {\n ReportsPluginOptions,\n ReportsPluginLabels,\n ResolvedReportsConfig,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: ReportsPluginLabels = {\n pageTitle: 'Reports',\n pageSubtitle: 'Access complete reports for analysis and decision making',\n allReports: 'All Reports',\n dateRange: 'Date Range',\n from: 'From',\n to: 'To',\n export: 'Export',\n exportCsv: 'Export CSV',\n exportExcel: 'Export Excel',\n exportPdf: 'Export PDF',\n noResults: 'No results found.',\n backToReports: 'Back',\n reports: 'reports',\n search: 'Search reports...',\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisQuarter: 'This quarter',\n custom: 'Custom',\n generate: 'Generate',\n print: 'Print',\n filterFrom: 'From',\n filterTo: 'To',\n filterResults: 'Results',\n emptyStateTitle: 'Ready to generate',\n emptyStateDescription: 'Select a date range and filters, then click Generate to view the report.',\n unavailableTitle: 'Coming soon',\n unavailableDescription: 'This report is not available yet. It will be enabled in a future update.',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options: ReportsPluginOptions): ResolvedReportsConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options.labels },\n currency: { ...DEFAULT_CURRENCY, ...options.currency },\n reports: options.reports,\n defaultPageSize: options.defaultPageSize ?? 50,\n showHeader: options.showHeader !== false,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createReportsPlugin(options: ReportsPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(reportsLocales)\n const provider: ReportDataProvider = options.dataProvider ?? createSafeDataProvider(\n () => createSupabaseReportProvider({ tenantId: () => getReportsTenantId() }),\n () => createMockReportProvider(),\n )\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(ReportsPage, { config, provider })\n\n return {\n id: 'reports',\n name: config.labels.pageTitle,\n icon: 'BarChart3',\n version: '1.0.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'reports', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n navigation: [\n {\n section: options.navSection ?? 'main',\n position: options.navPosition ?? 9,\n label: config.labels.pageTitle,\n route: '/reports',\n icon: 'BarChart3',\n permission: { feature: 'reports', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/reports',\n component: PageComponent,\n permission: { feature: 'reports', action: 'read' as const },\n },\n ],\n widgets: [],\n registries: [],\n locales: reportsLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type {\n ReportDef,\n ReportColumnDef,\n ReportFilterDef,\n ReportDateRange,\n ReportQueryState,\n ReportBadge,\n ReportDataSource,\n ReportGrain,\n ReportAllowedAction,\n ReportFilterOption,\n ReportsPluginOptions,\n ReportsPluginLabels,\n ResolvedReportsConfig,\n} from './types'\n\nexport type { ReportDataProvider, ReportResult } from './data/types'\nexport { createSupabaseReportProvider } from './data/supabase'\nexport type { SupabaseReportProviderConfig } from './data/supabase'\nexport { createMockReportProvider } from './data/mock'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ReportsContext.tsx","../src/components/ReportCard.tsx","../src/views/ReportHub.tsx","../src/hooks/useReportData.ts","../src/components/ReportFilterBar.tsx","../src/components/ReportPagination.tsx","../src/components/ReportSummaryRow.tsx","../src/export/csv.ts","../src/components/ExportDropdown.tsx","../src/views/ReportViewer.tsx","../src/ReportsPage.tsx","../src/data/supabase.ts","../src/data/mock.ts","../src/lib/tenant.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["jsx","t","jsxs","useState","useTranslation","Input","useEffect","Button","useMemo","useCallback","React"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext } from 'react'\nimport type { ResolvedReportsConfig, ReportDef } from './types'\nimport type { ReportDataProvider } from './data/types'\n\ninterface ReportsContextValue {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n reports: ReportDef[]\n}\n\nconst ReportsContext = createContext<ReportsContextValue | null>(null)\n\nexport function useReportsContext(): ReportsContextValue {\n const ctx = useContext(ReportsContext)\n if (!ctx) throw new Error('useReportsContext must be used within ReportsContextProvider')\n return ctx\n}\n\nexport function ReportsContextProvider({\n config,\n provider,\n children,\n}: {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n children: React.ReactNode\n}) {\n return (\n <ReportsContext.Provider value={{ config, provider, reports: config.reports }}>\n {children}\n </ReportsContext.Provider>\n )\n}\n","import React from 'react'\nimport { FileText } from 'lucide-react'\nimport { Badge, getLucideIcon } from '@fayz-ai/ui'\nimport type { ReportDef } from '../types'\n\ninterface ReportCardProps {\n report: ReportDef\n onClick: (report: ReportDef) => void\n}\n\nexport function ReportCard({ report, onClick }: ReportCardProps) {\n const IconComp = getLucideIcon(report.icon) ?? FileText\n\n return (\n <button\n type=\"button\"\n onClick={() => onClick(report)}\n className=\"flex flex-col items-start gap-2 rounded-xl border bg-card p-4 text-left transition-all hover:border-primary/30 hover:shadow-md\"\n >\n <div className=\"flex w-full items-start justify-between\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <IconComp className=\"h-5 w-5\" />\n </div>\n {report.badge && (\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {report.badge}\n </Badge>\n )}\n </div>\n <div>\n <h4 className=\"font-medium text-sm\">{report.name}</h4>\n {report.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{report.description}</p>\n )}\n </div>\n </button>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ReportCard } from '../components/ReportCard'\nimport { useReportsContext } from '../ReportsContext'\nimport type { ReportDef } from '../types'\n\ninterface ReportHubProps {\n onSelect: (report: ReportDef) => void\n}\n\ninterface CategoryGroup {\n name: string\n reports: ReportDef[]\n}\n\nexport function ReportHub({ onSelect }: ReportHubProps) {\n const t = useTranslation()\n const { config } = useReportsContext()\n const [search, setSearch] = useState('')\n\n const categories = useMemo(() => {\n const filtered = search\n ? config.reports.filter(\n (r) =>\n r.name.toLowerCase().includes(search.toLowerCase()) ||\n r.description?.toLowerCase().includes(search.toLowerCase()),\n )\n : config.reports\n\n const map = new Map<string, ReportDef[]>()\n for (const report of filtered) {\n const list = map.get(report.category) ?? []\n list.push(report)\n map.set(report.category, list)\n }\n\n const groups: CategoryGroup[] = []\n for (const [name, reports] of map) {\n groups.push({ name, reports })\n }\n return groups\n }, [config.reports, search])\n\n const totalReports = config.reports.length\n\n return (\n <div className=\"space-y-6\">\n {/* Header (omitted when the app shell owns the page title) */}\n {config.showHeader && (\n <div>\n <h1 className=\"text-2xl font-bold\">{t('reports.pageTitle')}</h1>\n <p className=\"text-muted-foreground mt-1\">{t('reports.pageSubtitle')}</p>\n </div>\n )}\n\n {/* Search */}\n {totalReports > 6 && (\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('reports.search')}\n className=\"pl-9\"\n />\n </div>\n )}\n\n {/* Categories */}\n <div className=\"space-y-8\">\n {categories.map((category) => (\n <div key={category.name} className=\"rounded-xl border bg-card shadow-sm p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"font-semibold\">{category.name}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {category.reports.length} {t('reports.reports')}\n </span>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\">\n {category.reports.map((report) => (\n <ReportCard key={report.id} report={report} onClick={onSelect} />\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {categories.length === 0 && search && (\n <div className=\"text-center py-12 text-muted-foreground\">\n {t('reports.noResults')}\n </div>\n )}\n </div>\n )\n}\n","import { useState, useCallback, useRef } from 'react'\nimport type { ReportDef, ReportQueryState, ReportDateRange } from '../types'\nimport type { ReportDataProvider, ReportResult } from '../data/types'\nimport { dedup } from '@fayz-ai/saas'\n\nfunction defaultDateRange(): ReportDateRange {\n const now = new Date()\n const from = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-01`\n const to = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`\n return { from, to }\n}\n\nfunction buildDefaultFilters(report: ReportDef): Record<string, any> {\n const filters: Record<string, any> = {}\n for (const f of report.filters ?? []) {\n if (f.defaultValue !== undefined) filters[f.key] = f.defaultValue\n }\n return filters\n}\n\nexport interface UseReportDataReturn {\n data: Record<string, any>[]\n total: number\n loading: boolean\n generated: boolean\n error: string | null\n query: ReportQueryState\n generate: () => void\n setDateRange: (range: ReportDateRange) => void\n setFilter: (key: string, value: any) => void\n setSort: (sortBy: string) => void\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n setSearch: (search: string) => void\n}\n\nexport function useReportData(\n report: ReportDef,\n provider: ReportDataProvider,\n defaultPageSize: number = 50,\n): UseReportDataReturn {\n const [query, setQuery] = useState<ReportQueryState>({\n dateRange: defaultDateRange(),\n filters: buildDefaultFilters(report),\n sortBy: report.dataSource.defaultSort,\n sortDir: report.dataSource.defaultSortDir ?? 'desc',\n page: 1,\n pageSize: defaultPageSize,\n })\n\n const [result, setResult] = useState<ReportResult>({ data: [], total: 0 })\n const [loading, setLoading] = useState(false)\n const [generated, setGenerated] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const queryRef = useRef(query)\n queryRef.current = query\n\n const fetchData = useCallback(async (q: ReportQueryState) => {\n setLoading(true)\n setError(null)\n try {\n const res = await dedup(`report:${report.id}:${JSON.stringify(q)}`, () =>\n provider.fetch(report, q),\n )\n setResult(res)\n setGenerated(true)\n } catch (err: any) {\n setError(err?.message ?? 'Failed to load report')\n setResult({ data: [], total: 0 })\n } finally {\n setLoading(false)\n }\n }, [report, provider])\n\n const generate = useCallback(() => {\n fetchData(queryRef.current)\n }, [fetchData])\n\n const setDateRange = useCallback((dateRange: ReportDateRange) => {\n setQuery((q) => ({ ...q, dateRange, page: 1 }))\n }, [])\n\n const setFilter = useCallback((key: string, value: any) => {\n setQuery((q) => ({ ...q, filters: { ...q.filters, [key]: value }, page: 1 }))\n }, [])\n\n const setSort = useCallback((sortBy: string) => {\n setQuery((q) => ({\n ...q,\n sortBy,\n sortDir: q.sortBy === sortBy && q.sortDir === 'asc' ? 'desc' : 'asc',\n page: 1,\n }))\n }, [])\n\n const setPage = useCallback((page: number) => {\n setQuery((q) => ({ ...q, page }))\n }, [])\n\n const setPageSize = useCallback((pageSize: number) => {\n setQuery((q) => ({ ...q, pageSize, page: 1 }))\n }, [])\n\n const setSearch = useCallback((search: string) => {\n setQuery((q) => ({ ...q, search, page: 1 }))\n }, [])\n\n return {\n data: result.data,\n total: result.total,\n loading,\n generated,\n error,\n query,\n generate,\n setDateRange,\n setFilter,\n setSort,\n setPage,\n setPageSize,\n setSearch,\n }\n}\n","import React, { useEffect, useState } from 'react'\nimport { DatePicker } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectContent, SelectItem, SelectValue } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ReportFilterDef, ReportDateRange, ReportFilterOption } from '../types'\n\ninterface ReportFilterBarProps {\n dateRange: ReportDateRange\n onDateRangeChange: (range: ReportDateRange) => void\n filters: ReportFilterDef[]\n filterValues: Record<string, any>\n onFilterChange: (key: string, value: any) => void\n}\n\nexport function ReportFilterBar({\n dateRange,\n onDateRangeChange,\n filters,\n filterValues,\n onFilterChange,\n}: ReportFilterBarProps) {\n const t = useTranslation()\n\n return (\n <div className=\"flex flex-wrap items-end gap-3\">\n {/* Date range — always present */}\n <div className=\"flex items-end gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('reports.from')}</label>\n <DatePicker\n value={dateRange.from}\n onChange={(v) => onDateRangeChange({ ...dateRange, from: v })}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('reports.to')}</label>\n <DatePicker\n value={dateRange.to}\n onChange={(v) => onDateRangeChange({ ...dateRange, to: v })}\n />\n </div>\n </div>\n\n {/* Custom filters */}\n {filters.map((filter) => (\n <FilterControl\n key={filter.key}\n filter={filter}\n value={filterValues[filter.key]}\n onChange={(v) => onFilterChange(filter.key, v)}\n />\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Individual filter control\n// ---------------------------------------------------------------------------\n\nfunction FilterControl({\n filter,\n value,\n onChange,\n}: {\n filter: ReportFilterDef\n value: any\n onChange: (value: any) => void\n}) {\n const [options, setOptions] = useState<ReportFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n\n useEffect(() => {\n if (typeof filter.options === 'function') {\n filter.options().then(setOptions)\n }\n }, [filter.options])\n\n if (filter.type === 'select') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Select value={value ?? ''} onValueChange={(v) => onChange(v === '__all__' ? '' : v)}>\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder={filter.placeholder ?? filter.label} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All</SelectItem>\n {options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n }\n\n if (filter.type === 'text') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Input\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={filter.placeholder ?? filter.label}\n className=\"w-[180px]\"\n />\n </div>\n )\n }\n\n if (filter.type === 'number') {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{filter.label}</label>\n <Input\n type=\"number\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : undefined)}\n placeholder={filter.placeholder ?? filter.label}\n className=\"w-[120px]\"\n />\n </div>\n )\n }\n\n return null\n}\n","import React from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\n\ninterface ReportPaginationProps {\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n onPageSizeChange: (size: number) => void\n}\n\nexport function ReportPagination({ page, pageSize, total, onPageChange, onPageSizeChange }: ReportPaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const from = (page - 1) * pageSize + 1\n const to = Math.min(page * pageSize, total)\n\n return (\n <div className=\"flex items-center justify-between border-t px-4 py-3\">\n <div className=\"text-sm text-muted-foreground\">\n {total > 0 ? `${from}–${to} of ${total}` : 'No results'}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n className=\"h-8 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 text-sm\"\n >\n {[25, 50, 100].map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"text-sm px-2\">\n {page} / {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\ninterface ReportSummaryRowProps {\n columns: ReportColumnDef[]\n data: Record<string, any>[]\n currency?: string\n}\n\nexport function ReportSummaryRow({ columns, data, currency }: ReportSummaryRowProps) {\n const visibleCols = columns.filter((c) => c.visible !== false)\n const hasAggregates = visibleCols.some((c) => c.aggregate)\n if (!hasAggregates || data.length === 0) return null\n\n return (\n <div className=\"rounded-lg border bg-muted/30 overflow-hidden\">\n <table className=\"w-full text-xs\">\n <tbody>\n <tr className=\"font-semibold\">\n {visibleCols.map((col) => {\n const value = computeAggregate(col, data)\n const alignRight = col.align === 'right' || col.type === 'currency' || col.type === 'number'\n return (\n <td\n key={col.key}\n className={`px-3 py-1.5 ${alignRight ? 'text-right' : ''}`}\n >\n {value != null\n ? formatValuePlain(value, col, currency)\n : col.aggregate\n ? '—'\n : ''}\n </td>\n )\n })}\n </tr>\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction computeAggregate(col: ReportColumnDef, data: Record<string, any>[]): number | null {\n if (!col.aggregate) return null\n\n const values = data\n .map((row) => row[col.key])\n .filter((v) => v != null && !isNaN(Number(v)))\n .map(Number)\n\n if (values.length === 0) return null\n\n switch (col.aggregate) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0)\n case 'avg':\n return values.reduce((a, b) => a + b, 0) / values.length\n case 'count':\n return values.length\n case 'min':\n return Math.min(...values)\n case 'max':\n return Math.max(...values)\n default:\n return null\n }\n}\n","import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { formatValuePlain } from '../lib/columns'\n\nexport function exportToCsv(\n columns: ReportColumnDef[],\n data: Record<string, any>[],\n filename: string,\n currency?: string,\n): void {\n const visibleCols = columns.filter((c) => c.visible !== false)\n\n const csvColumns: CSVColumn[] = visibleCols.map((col) => ({\n key: col.key,\n label: col.label,\n format: (value: any) => formatValuePlain(value, col, currency),\n }))\n\n exportCSV(csvColumns, data, filename)\n}\n","import React, { useEffect, useState } from 'react'\nimport { Download } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { exportToCsv } from '../export/csv'\n\ninterface ExportDropdownProps {\n columns: ReportColumnDef[]\n data: Record<string, any>[]\n filename: string\n currency?: string\n title?: string\n}\n\nexport function ExportDropdown({ columns, data, filename, currency, title }: ExportDropdownProps) {\n const t = useTranslation()\n const [excelAvailable, setExcelAvailable] = useState(false)\n const [pdfAvailable, setPdfAvailable] = useState(false)\n\n useEffect(() => {\n import('../export/excel').then((m) => m.isExcelAvailable()).then(setExcelAvailable).catch(() => {})\n import('../export/pdf').then((m) => m.isPdfAvailable()).then(setPdfAvailable).catch(() => {})\n }, [])\n\n const handleCsv = () => exportToCsv(columns, data, filename, currency)\n\n const handleExcel = async () => {\n const { exportToExcel } = await import('../export/excel')\n await exportToExcel(columns, data, filename, currency)\n }\n\n const handlePdf = async () => {\n const { exportToPdf } = await import('../export/pdf')\n await exportToPdf(columns, data, filename, { title, currency })\n }\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-4 w-4 mr-1.5\" />\n {t('reports.export')}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={handleCsv}>{t('reports.exportCsv')}</DropdownItem>\n {excelAvailable && (\n <DropdownItem onClick={handleExcel}>{t('reports.exportExcel')}</DropdownItem>\n )}\n {pdfAvailable && (\n <DropdownItem onClick={handlePdf}>{t('reports.exportPdf')}</DropdownItem>\n )}\n </DropdownContent>\n </Dropdown>\n )\n}\n","import React, { useMemo } from 'react'\nimport { ArrowLeft, Play, SlidersHorizontal, Construction, Loader2, Printer } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { DataTable } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useReportsContext } from '../ReportsContext'\nimport { useReportData } from '../hooks/useReportData'\nimport { reportColumnsToTanstack } from '../lib/columns'\nimport { ReportFilterBar } from '../components/ReportFilterBar'\nimport { ReportPagination } from '../components/ReportPagination'\nimport { ReportSummaryRow } from '../components/ReportSummaryRow'\nimport { ExportDropdown } from '../components/ExportDropdown'\nimport type { ReportDef } from '../types'\n\ninterface ReportViewerProps {\n report: ReportDef\n onBack: () => void\n}\n\nexport function ReportViewer({ report, onBack }: ReportViewerProps) {\n const t = useTranslation()\n const { config, provider } = useReportsContext()\n const {\n data,\n total,\n loading,\n generated,\n error,\n query,\n generate,\n setDateRange,\n setFilter,\n setPage,\n setPageSize,\n } = useReportData(report, provider, config.defaultPageSize)\n\n const isAvailable = report.available !== false\n const tanstackColumns = useMemo(\n () => reportColumnsToTanstack(report.columns, config.currency.code),\n [report.columns, config.currency.code],\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb — hidden in print */}\n <div className=\"flex items-center gap-1.5 text-sm no-print\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('reports.pageTitle')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{report.name}</span>\n </div>\n\n <div>\n <h2 className=\"text-lg font-bold\">{report.name}</h2>\n {report.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">{report.description}</p>\n )}\n </div>\n\n {/* Filters + Generate — hidden in print */}\n <div className=\"flex flex-wrap items-end gap-3 no-print\">\n <ReportFilterBar\n dateRange={query.dateRange}\n onDateRangeChange={setDateRange}\n filters={report.filters ?? []}\n filterValues={query.filters}\n onFilterChange={setFilter}\n />\n <Button onClick={generate} disabled={loading || !isAvailable} size=\"sm\" className=\"h-9\">\n {loading\n ? <Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />\n : <Play className=\"h-3.5 w-3.5 mr-1.5\" />\n }\n {t('reports.generate')}\n </Button>\n {generated && (\n <>\n <ExportDropdown\n columns={report.columns}\n data={data}\n filename={report.id}\n currency={config.currency.code}\n title={report.name}\n />\n <Button variant=\"outline\" size=\"sm\" className=\"h-9\" onClick={() => window.print()}>\n <Printer className=\"h-3.5 w-3.5 mr-1.5\" />\n {t('reports.print')}\n </Button>\n </>\n )}\n </div>\n\n {/* Print-only: compact filter summary as document header */}\n {generated && (\n <div className=\"print-only hidden text-[10px] border-b pb-2 mb-2\">\n <div className=\"flex flex-wrap gap-x-4 gap-y-0.5\">\n {query.dateRange.from && (\n <span><strong>{t('reports.filterFrom')}:</strong> {new Date(query.dateRange.from + 'T12:00').toLocaleDateString()}</span>\n )}\n {query.dateRange.to && (\n <span><strong>{t('reports.filterTo')}:</strong> {new Date(query.dateRange.to + 'T12:00').toLocaleDateString()}</span>\n )}\n {Object.entries(query.filters).map(([key, value]) =>\n value ? <span key={key}><strong>{key}:</strong> {String(value)}</span> : null\n )}\n <span><strong>{t('reports.filterResults')}:</strong> {total}</span>\n </div>\n </div>\n )}\n\n {/* Error */}\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n {/* Empty state — before generate */}\n {!generated && !loading && (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed py-16 text-center\">\n {isAvailable ? (\n <>\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <SlidersHorizontal className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{t('reports.emptyStateTitle')}</p>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">{t('reports.emptyStateDescription')}</p>\n </>\n ) : (\n <>\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{t('reports.unavailableTitle')}</p>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">{t('reports.unavailableDescription')}</p>\n </>\n )}\n </div>\n )}\n\n {/* Results — only shown after generate */}\n {(generated || loading) && (\n <>\n <DataTable\n columns={tanstackColumns}\n data={data}\n loading={loading}\n skeletonRows={5}\n emptyMessage={t('reports.noResults')}\n variant=\"card\"\n compact\n />\n\n {report.showSummary && !loading && (\n <ReportSummaryRow\n columns={report.columns}\n data={data}\n currency={config.currency.code}\n />\n )}\n\n {!loading && (\n <div className=\"no-print\">\n <ReportPagination\n page={query.page}\n pageSize={query.pageSize}\n total={total}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ReportsContextProvider } from './ReportsContext'\nimport { ReportHub } from './views/ReportHub'\nimport { ReportViewer } from './views/ReportViewer'\nimport type { ResolvedReportsConfig, ReportDef } from './types'\nimport type { ReportDataProvider } from './data/types'\n\nconst HASH_BASE = '/reports'\n\nfunction getReportIdFromHash(): string | null {\n const hash = (window.location.hash.slice(1) || '/').split('?')[0]\n if (hash.startsWith(HASH_BASE + '/') && hash.length > HASH_BASE.length + 1) {\n return hash.slice(HASH_BASE.length + 1)\n }\n return null\n}\n\nexport function ReportsPage({\n config,\n provider,\n}: {\n config: ResolvedReportsConfig\n provider: ReportDataProvider\n}) {\n const [activeReportId, setActiveReportId] = useState<string | null>(getReportIdFromHash)\n\n useEffect(() => {\n function handler() {\n setActiveReportId(getReportIdFromHash())\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const handleSelect = useCallback((report: ReportDef) => {\n window.location.hash = `${HASH_BASE}/${report.id}`\n }, [])\n\n const handleBack = useCallback(() => {\n window.location.hash = HASH_BASE\n }, [])\n\n const activeReport = activeReportId\n ? config.reports.find((r) => r.id === activeReportId) ?? null\n : null\n\n return (\n <ReportsContextProvider config={config} provider={provider}>\n <div className=\"p-1\">\n {activeReport ? (\n <ReportViewer\n key={activeReport.id}\n report={activeReport}\n onBack={handleBack}\n />\n ) : (\n <ReportHub onSelect={handleSelect} />\n )}\n </div>\n </ReportsContextProvider>\n )\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ReportDef, ReportQueryState } from '../types'\nimport type { ReportDataProvider, ReportResult } from './types'\n\n// ---------------------------------------------------------------------------\n// Case conversion\n// ---------------------------------------------------------------------------\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction mapRow(row: Record<string, unknown>, columnMap?: Record<string, string>): Record<string, any> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n const camelKey = columnMap?.[key] ?? snakeToCamel(key)\n result[camelKey] = value\n }\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseReportProviderConfig {\n tenantId: string | (() => string | undefined)\n tenantIdColumn?: string\n schema?: string\n}\n\nexport function createSupabaseReportProvider(config: SupabaseReportProviderConfig): ReportDataProvider {\n const schema = config.schema ?? 'public'\n const tenantIdCol = config.tenantIdColumn ?? 'tenant_id'\n\n function resolveTenantId(): string | undefined {\n return typeof config.tenantId === 'function' ? config.tenantId() : config.tenantId\n }\n\n function getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase client not available')\n return schema === 'public' ? supabase : supabase.schema(schema)\n }\n\n return {\n async fetch(reportDef: ReportDef, query: ReportQueryState): Promise<ReportResult> {\n const { dataSource } = reportDef\n const columnMap = dataSource.columnMap\n\n if (dataSource.kind === 'rpc') {\n return fetchViaRpc(reportDef, query, getClient, resolveTenantId, columnMap)\n }\n\n return fetchViaView(reportDef, query, getClient, resolveTenantId, tenantIdCol, columnMap)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// View-based fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchViaView(\n reportDef: ReportDef,\n query: ReportQueryState,\n getClient: () => any,\n resolveTenantId: () => string | undefined,\n tenantIdCol: string,\n columnMap?: Record<string, string>,\n): Promise<ReportResult> {\n const { dataSource } = reportDef\n let q = getClient().from(dataSource.name).select('*', { count: 'exact' })\n\n // Tenant scoping\n const tenantId = resolveTenantId()\n if (tenantId) {\n q = q.eq(tenantIdCol, tenantId)\n }\n\n // Date range\n const dateCol = dataSource.dateColumn ?? 'created_at'\n if (query.dateRange.from) {\n q = q.gte(dateCol, query.dateRange.from)\n }\n if (query.dateRange.to) {\n // For date-type columns, plain date string is sufficient.\n // For timestamptz columns, extend to end of day.\n const toValue = dateCol === 'created_at' || dateCol.endsWith('_at')\n ? query.dateRange.to + 'T23:59:59'\n : query.dateRange.to\n q = q.lte(dateCol, toValue)\n }\n\n // Custom filters\n for (const [key, value] of Object.entries(query.filters)) {\n if (value == null || value === '') continue\n const col = camelToSnake(key)\n if (Array.isArray(value)) {\n q = q.in(col, value)\n } else {\n q = q.eq(col, value)\n }\n }\n\n // Search\n if (query.search) {\n const searchableCols = reportDef.columns\n .filter((c) => c.type === 'text' || c.type === 'email')\n .map((c: any) => camelToSnake(c.key))\n if (searchableCols.length > 0) {\n const term = `%${query.search}%`\n const orClause = searchableCols.map((col) => `${col}.ilike.${term}`).join(',')\n q = q.or(orClause)\n }\n }\n\n // Sort\n const sortCol = query.sortBy\n ? camelToSnake(query.sortBy)\n : dataSource.defaultSort\n ? camelToSnake(dataSource.defaultSort)\n : dateCol\n const ascending = query.sortDir\n ? query.sortDir === 'asc'\n : dataSource.defaultSortDir\n ? dataSource.defaultSortDir === 'asc'\n : false\n q = q.order(sortCol, { ascending })\n\n // Pagination\n const from = (query.page - 1) * query.pageSize\n const to = from + query.pageSize - 1\n q = q.range(from, to)\n\n const { data, error, count } = await q\n\n if (error) throw error\n\n return {\n data: (data ?? []).map((row: any) => mapRow(row, columnMap)),\n total: count ?? 0,\n }\n}\n\n// ---------------------------------------------------------------------------\n// RPC-based fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchViaRpc(\n reportDef: ReportDef,\n query: ReportQueryState,\n getClient: () => any,\n resolveTenantId: () => string | undefined,\n columnMap?: Record<string, string>,\n): Promise<ReportResult> {\n const { dataSource } = reportDef\n const tenantId = resolveTenantId()\n\n const params: Record<string, any> = {\n p_tenant_id: tenantId,\n p_from: query.dateRange.from,\n p_to: query.dateRange.to,\n p_page: query.page,\n p_page_size: query.pageSize,\n }\n\n // Custom filters\n for (const [key, value] of Object.entries(query.filters)) {\n if (value == null || value === '') continue\n params[`p_${camelToSnake(key)}`] = value\n }\n\n if (query.sortBy) {\n params.p_sort_by = camelToSnake(query.sortBy)\n params.p_sort_dir = query.sortDir ?? 'desc'\n }\n\n const { data, error } = await getClient().rpc(dataSource.name, params)\n if (error) throw error\n\n // RPC expected to return { data: [...], total: number }\n if (data && typeof data === 'object' && 'data' in data) {\n return {\n data: (data.data ?? []).map((row: any) => mapRow(row, columnMap)),\n total: data.total ?? 0,\n }\n }\n\n // Fallback: RPC returns a plain array\n const rows = Array.isArray(data) ? data : []\n return {\n data: rows.map((row: any) => mapRow(row, columnMap)),\n total: rows.length,\n }\n}\n","import type { ReportDataProvider } from './types'\n\nexport function createMockReportProvider(): ReportDataProvider {\n return {\n async fetch() {\n return { data: [], total: 0 }\n },\n }\n}\n","let t: string | undefined\nexport function setReportsTenantId(id: string | undefined){ t = id }\nexport function getReportsTenantId(): string | undefined { return t }\n","export const en: Record<string, string> = {\n 'reports.pageTitle': 'Reports',\n 'reports.pageSubtitle': 'Access complete reports for analysis and decision making',\n 'reports.allReports': 'All Reports',\n 'reports.dateRange': 'Date Range',\n 'reports.from': 'From',\n 'reports.to': 'To',\n 'reports.export': 'Export',\n 'reports.exportCsv': 'Export CSV',\n 'reports.exportExcel': 'Export Excel',\n 'reports.exportPdf': 'Export PDF',\n 'reports.noResults': 'No results found.',\n 'reports.backToReports': 'Back',\n 'reports.reports': 'reports',\n 'reports.search': 'Search reports...',\n 'reports.today': 'Today',\n 'reports.yesterday': 'Yesterday',\n 'reports.last7Days': 'Last 7 days',\n 'reports.thisMonth': 'This month',\n 'reports.lastMonth': 'Last month',\n 'reports.thisQuarter': 'This quarter',\n 'reports.custom': 'Custom',\n 'reports.generate': 'Generate',\n 'reports.emptyStateTitle': 'Ready to generate',\n 'reports.emptyStateDescription': 'Select a date range and filters, then click Generate to view the report.',\n 'reports.unavailableTitle': 'Coming soon',\n 'reports.unavailableDescription': 'This report is not available yet. It will be enabled in a future update.',\n}\n","export const ptBR: Record<string, string> = {\n 'reports.pageTitle': 'Relatórios',\n 'reports.pageSubtitle': 'Acesse relatórios completos para análise e tomada de decisão',\n 'reports.allReports': 'Todos os Relatórios',\n 'reports.dateRange': 'Período',\n 'reports.from': 'De',\n 'reports.to': 'Até',\n 'reports.export': 'Exportar',\n 'reports.exportCsv': 'Exportar CSV',\n 'reports.exportExcel': 'Exportar Excel',\n 'reports.exportPdf': 'Exportar PDF',\n 'reports.noResults': 'Nenhum resultado encontrado.',\n 'reports.backToReports': 'Voltar',\n 'reports.reports': 'relatórios',\n 'reports.search': 'Buscar relatórios...',\n 'reports.today': 'Hoje',\n 'reports.yesterday': 'Ontem',\n 'reports.last7Days': 'Últimos 7 dias',\n 'reports.thisMonth': 'Este mês',\n 'reports.lastMonth': 'Mês passado',\n 'reports.thisQuarter': 'Este trimestre',\n 'reports.custom': 'Personalizado',\n 'reports.generate': 'Gerar',\n 'reports.emptyStateTitle': 'Pronto para gerar',\n 'reports.emptyStateDescription': 'Selecione o período e os filtros desejados, depois clique em Gerar para visualizar o relatório.',\n 'reports.unavailableTitle': 'Em breve',\n 'reports.unavailableDescription': 'Este relatório ainda não está disponível. Será habilitado em uma atualização futura.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const reportsLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { ReportsPage } from './ReportsPage'\nimport type { ReportDataProvider } from './data/types'\nimport { createSupabaseReportProvider } from './data/supabase'\nimport { createMockReportProvider } from './data/mock'\nimport { getReportsTenantId } from './lib/tenant'\nimport { reportsLocales } from './locales'\nimport type {\n ReportsPluginOptions,\n ReportsPluginLabels,\n ResolvedReportsConfig,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: ReportsPluginLabels = {\n pageTitle: 'Reports',\n pageSubtitle: 'Access complete reports for analysis and decision making',\n allReports: 'All Reports',\n dateRange: 'Date Range',\n from: 'From',\n to: 'To',\n export: 'Export',\n exportCsv: 'Export CSV',\n exportExcel: 'Export Excel',\n exportPdf: 'Export PDF',\n noResults: 'No results found.',\n backToReports: 'Back',\n reports: 'reports',\n search: 'Search reports...',\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisQuarter: 'This quarter',\n custom: 'Custom',\n generate: 'Generate',\n print: 'Print',\n filterFrom: 'From',\n filterTo: 'To',\n filterResults: 'Results',\n emptyStateTitle: 'Ready to generate',\n emptyStateDescription: 'Select a date range and filters, then click Generate to view the report.',\n unavailableTitle: 'Coming soon',\n unavailableDescription: 'This report is not available yet. It will be enabled in a future update.',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options: ReportsPluginOptions): ResolvedReportsConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options.labels },\n currency: { ...DEFAULT_CURRENCY, ...options.currency },\n reports: options.reports,\n defaultPageSize: options.defaultPageSize ?? 50,\n showHeader: options.showHeader !== false,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createReportsPlugin(options: ReportsPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(reportsLocales)\n const provider: ReportDataProvider = options.dataProvider ?? createSafeDataProvider(\n () => createSupabaseReportProvider({ tenantId: () => getReportsTenantId() }),\n () => createMockReportProvider(),\n )\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(ReportsPage, { config, provider })\n\n return {\n id: 'reports',\n name: config.labels.pageTitle,\n icon: 'BarChart3',\n version: '1.0.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'reports', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n navigation: [\n {\n section: options.navSection ?? 'main',\n position: options.navPosition ?? 9,\n label: config.labels.pageTitle,\n route: '/reports',\n icon: 'BarChart3',\n permission: { feature: 'reports', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/reports',\n component: PageComponent,\n permission: { feature: 'reports', action: 'read' as const },\n },\n ],\n widgets: [],\n registries: [],\n locales: reportsLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type {\n ReportDef,\n ReportColumnDef,\n ReportFilterDef,\n ReportDateRange,\n ReportQueryState,\n ReportBadge,\n ReportDataSource,\n ReportGrain,\n ReportAllowedAction,\n ReportFilterOption,\n ReportsPluginOptions,\n ReportsPluginLabels,\n ResolvedReportsConfig,\n} from './types'\n\nexport type { ReportDataProvider, ReportResult } from './data/types'\nexport { createSupabaseReportProvider } from './data/supabase'\nexport type { SupabaseReportProviderConfig } from './data/supabase'\nexport { createMockReportProvider } from './data/mock'\n"]}
|
package/package.json
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/plugin-reports",
|
|
3
|
-
"
|
|
3
|
+
"fayz": {
|
|
4
|
+
"status": "preview"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.9.0-next.0",
|
|
4
7
|
"description": "[experimental] Fayz SDK — plugin-reports plugin",
|
|
5
8
|
"type": "module",
|
|
6
|
-
"
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"main": "./dist/index.js",
|
|
7
11
|
"module": "./dist/index.js",
|
|
8
12
|
"types": "./dist/index.d.ts",
|
|
9
13
|
"exports": {
|
|
10
14
|
".": {
|
|
11
15
|
"source": "./src/index.ts",
|
|
12
16
|
"types": "./dist/index.d.ts",
|
|
13
|
-
"import": "./dist/index.js"
|
|
14
|
-
"require": "./dist/index.cjs"
|
|
17
|
+
"import": "./dist/index.js"
|
|
15
18
|
}
|
|
16
19
|
},
|
|
17
20
|
"files": [
|
|
@@ -20,22 +23,24 @@
|
|
|
20
23
|
],
|
|
21
24
|
"peerDependencies": {
|
|
22
25
|
"react": "^18.0.0 || ^19.0.0",
|
|
23
|
-
"react-dom": "^18.0.0 || ^19.0.0"
|
|
26
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
27
|
+
"zustand": "^4.5.0",
|
|
28
|
+
"lucide-react": ">=0.400.0 <1.0.0"
|
|
24
29
|
},
|
|
25
30
|
"dependencies": {
|
|
26
|
-
"lucide-react": "^0.400.0",
|
|
27
|
-
"zustand": "^4.5.0",
|
|
28
31
|
"@tanstack/react-table": "^8.20.0",
|
|
29
|
-
"@fayz-ai/
|
|
30
|
-
"@fayz-ai/
|
|
31
|
-
"@fayz-ai/
|
|
32
|
+
"@fayz-ai/core": "^0.9.0-next.0",
|
|
33
|
+
"@fayz-ai/saas": "^0.9.0-next.0",
|
|
34
|
+
"@fayz-ai/ui": "^0.9.0-next.0"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"@types/react": "^18.3.0",
|
|
35
38
|
"react": "^18.3.0",
|
|
36
39
|
"tsup": "^8.2.0",
|
|
37
40
|
"typescript": "^5.5.0",
|
|
38
|
-
"@types/react-dom": "^18.3.0"
|
|
41
|
+
"@types/react-dom": "^18.3.0",
|
|
42
|
+
"zustand": "^4.5.0",
|
|
43
|
+
"lucide-react": "^0.400.0"
|
|
39
44
|
},
|
|
40
45
|
"license": "MIT",
|
|
41
46
|
"keywords": [
|
|
@@ -43,6 +48,9 @@
|
|
|
43
48
|
"fayz-plugin",
|
|
44
49
|
"fayz-sdk"
|
|
45
50
|
],
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
46
54
|
"scripts": {
|
|
47
55
|
"build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --noEmit false",
|
|
48
56
|
"dev": "tsup --watch",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
|
-
import
|
|
3
|
-
import { Badge } from '@fayz-ai/ui'
|
|
2
|
+
import { FileText } from 'lucide-react'
|
|
3
|
+
import { Badge, getLucideIcon } from '@fayz-ai/ui'
|
|
4
4
|
import type { ReportDef } from '../types'
|
|
5
5
|
|
|
6
6
|
interface ReportCardProps {
|
|
@@ -9,7 +9,7 @@ interface ReportCardProps {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function ReportCard({ report, onClick }: ReportCardProps) {
|
|
12
|
-
const IconComp = (
|
|
12
|
+
const IconComp = getLucideIcon(report.icon) ?? FileText
|
|
13
13
|
|
|
14
14
|
return (
|
|
15
15
|
<button
|
package/dist/chunk-ZSELW4DA.cjs
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
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
|