@fayz-ai/plugin-reports 0.1.6 → 0.8.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 +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/views/ReportViewer.d.ts.map +1 -1
- package/package.json +8 -5
- package/src/index.ts +2 -0
- package/src/types.ts +14 -0
- package/src/views/ReportHub.tsx +2 -2
- package/src/views/ReportViewer.tsx +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
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 `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
|
+
|
|
3
5
|
> Config-driven reports for your SaaS — declare the report, get the page.
|
|
4
6
|
|
|
5
7
|
[](https://www.npmjs.com/package/@fayz-ai/plugin-reports)
|
package/dist/index.cjs.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":["createContext","useContext","jsx","LucideIcons","jsxs","Badge","t","useTranslation","useState","useMemo","Search","Input","useRef","useCallback","dedup","DatePicker","useEffect","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","ChevronLeft","ChevronRight","formatValuePlain","exportCSV","Dropdown","DropdownTrigger","Download","DropdownContent","DropdownItem","reportColumnsToTanstack","ArrowLeft","Loader2","Play","Fragment","Printer","SlidersHorizontal","Construction","DataTable","getSupabaseClientOptional","registerTranslations","createSafeDataProvider","React"],"mappings":"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","file":"index.cjs","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\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 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":["createContext","useContext","jsx","LucideIcons","jsxs","Badge","t","useTranslation","useState","useMemo","Search","Input","useRef","useCallback","dedup","DatePicker","useEffect","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","ChevronLeft","ChevronRight","formatValuePlain","exportCSV","Dropdown","DropdownTrigger","Download","DropdownContent","DropdownItem","reportColumnsToTanstack","ArrowLeft","Loader2","Play","Fragment","Printer","SlidersHorizontal","Construction","DataTable","getSupabaseClientOptional","registerTranslations","createSafeDataProvider","React"],"mappings":"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","file":"index.cjs","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"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PluginManifest } from '@fayz-ai/core';
|
|
2
2
|
import type { ReportsPluginOptions } from './types';
|
|
3
3
|
export declare function createReportsPlugin(options: ReportsPluginOptions): PluginManifest;
|
|
4
|
-
export type { ReportDef, ReportColumnDef, ReportFilterDef, ReportDateRange, ReportQueryState, ReportBadge, ReportDataSource, ReportFilterOption, ReportsPluginOptions, ReportsPluginLabels, ResolvedReportsConfig, } from './types';
|
|
4
|
+
export type { ReportDef, ReportColumnDef, ReportFilterDef, ReportDateRange, ReportQueryState, ReportBadge, ReportDataSource, ReportGrain, ReportAllowedAction, ReportFilterOption, ReportsPluginOptions, ReportsPluginLabels, ResolvedReportsConfig, } from './types';
|
|
5
5
|
export type { ReportDataProvider, ReportResult } from './data/types';
|
|
6
6
|
export { createSupabaseReportProvider } from './data/supabase';
|
|
7
7
|
export type { SupabaseReportProviderConfig } from './data/supabase';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,eAAe,CAAA;AAQ5E,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,SAAS,CAAA;AA2DhB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CA4CjF;AAMD,YAAY,EACV,SAAS,EACT,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAC9D,YAAY,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,eAAe,CAAA;AAQ5E,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,SAAS,CAAA;AA2DhB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CA4CjF;AAMD,YAAY,EACV,SAAS,EACT,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAC9D,YAAY,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA"}
|
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":";;;;;;;;;AAUA,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAE9D,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,8DAA8D,CAAA;AACxF,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,sBAAA,CAAuB;AAAA,EACrC,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,GAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ,EACzE,QAAA,EACH,CAAA;AAEJ;ACtBO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAoB;AAC/D,EAAA,MAAM,QAAA,GAAY,WAAA,CAAoB,MAAA,CAAO,IAAI,CAAA,IAAiB,WAAA,CAAA,QAAA;AAElE,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC7B,SAAA,EAAU,gIAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,kFAAA,EACb,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA,EAChC,CAAA;AAAA,UACC,MAAA,CAAO,KAAA,oBACNA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,oBAAA,EAClC,QAAA,EAAA,MAAA,CAAO,KAAA,EACV;AAAA,SAAA,EAEJ,CAAA;AAAA,6BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EAAuB,iBAAO,IAAA,EAAK,CAAA;AAAA,UAChD,MAAA,CAAO,+BACNA,GAAAA,CAAC,OAAE,SAAA,EAAU,mDAAA,EAAqD,iBAAO,WAAA,EAAY;AAAA,SAAA,EAEzF;AAAA;AAAA;AAAA,GACF;AAEJ;ACpBO,SAAS,SAAA,CAAU,EAAE,QAAA,EAAS,EAAmB;AACtD,EAAA,MAAMC,KAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,iBAAA,EAAkB;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AAEvC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAA,GACb,MAAA,CAAO,OAAA,CAAQ,MAAA;AAAA,MACb,CAAC,CAAA,KACC,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,MAAA,CAAO,WAAA,EAAa,CAAA,IAClD,EAAE,WAAA,EAAa,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,aAAa;AAAA,QAE9D,MAAA,CAAO,OAAA;AAEX,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,OAAO,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAK,EAAC;AAC1C,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,MAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,SAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,GAAA,EAAK;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,CAAO,OAAA,EAAS,MAAM,CAAC,CAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,OAAO,OAAA,CAAQ,MAAA;AAEpC,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,UAAA,oBACNA,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAF,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sBAAsB,QAAA,EAAAC,EAAAA,CAAE,mBAAmB,CAAA,EAAE,CAAA;AAAA,sBAC3DD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAAC,EAAAA,CAAE,sBAAsB,CAAA,EAAE;AAAA,KAAA,EACvE,CAAA;AAAA,IAID,eAAe,CAAA,oBACdC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wEAAA,EAAyE,CAAA;AAAA,sBAC3FA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACzC,WAAA,EAAaC,GAAE,gBAAgB,CAAA;AAAA,UAC/B,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAIFD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,qBACbE,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,yCAAA,EACjC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EAAiB,mBAAS,IAAA,EAAK,CAAA;AAAA,wBAC7CE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,OAAA,CAAQ,MAAA;AAAA,UAAO,GAAA;AAAA,UAAED,GAAE,iBAAiB;AAAA,SAAA,EAChD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACZ,QAAA,EAAA,QAAA,CAAS,QAAQ,GAAA,CAAI,CAAC,2BACrBA,GAAAA,CAAC,cAA2B,MAAA,EAAgB,OAAA,EAAS,YAApC,MAAA,CAAO,EAAuC,CAChE,CAAA,EACH;AAAA,KAAA,EAAA,EAXQ,QAAA,CAAS,IAYnB,CACH,CAAA,EACH,CAAA;AAAA,IAEC,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,MAAA,oBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAAC,EAAAA,CAAE,mBAAmB,CAAA,EACxB;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC3FA,SAAS,gBAAA,GAAoC;AAC3C,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,WAAA,EAAa,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AAChF,EAAA,MAAM,EAAA,GAAK,CAAA,EAAG,GAAA,CAAI,WAAA,EAAa,IAAI,MAAA,CAAO,GAAA,CAAI,QAAA,EAAS,GAAI,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACxH,EAAA,OAAO,EAAE,MAAM,EAAA,EAAG;AACpB;AAEA,SAAS,oBAAoB,MAAA,EAAwC;AACnE,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG;AACpC,IAAA,IAAI,EAAE,YAAA,KAAiB,MAAA,UAAmB,CAAA,CAAE,GAAG,IAAI,CAAA,CAAE,YAAA;AAAA,EACvD;AACA,EAAA,OAAO,OAAA;AACT;AAkBO,SAAS,aAAA,CACd,MAAA,EACA,QAAA,EACA,eAAA,GAA0B,EAAA,EACL;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,QAAAA,CAA2B;AAAA,IACnD,WAAW,gBAAA,EAAiB;AAAA,IAC5B,OAAA,EAAS,oBAAoB,MAAM,CAAA;AAAA,IACnC,MAAA,EAAQ,OAAO,UAAA,CAAW,WAAA;AAAA,IAC1B,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,cAAA,IAAkB,MAAA;AAAA,IAC7C,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAuB,EAAE,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAO,CAAA,KAAwB;AAC3D,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA;AAAA,QAAM,UAAU,MAAA,CAAO,EAAE,IAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAAA,QAAI,MAClE,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,CAAC;AAAA,OAC1B;AACA,MAAA,SAAA,CAAU,GAAG,CAAA;AACb,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,EAAK,WAAW,uBAAuB,CAAA;AAChD,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,GAAG,CAAA;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,SAAA,CAAU,SAAS,OAAO,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,SAAA,KAA+B;AAC/D,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAA,EAAW,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,GAAA,EAAa,KAAA,KAAe;AACzD,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,SAAS,EAAE,GAAG,CAAA,CAAE,OAAA,EAAS,CAAC,GAAG,GAAG,OAAM,EAAG,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,MAAA,KAAmB;AAC9C,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO;AAAA,MACf,GAAG,CAAA;AAAA,MACH,MAAA;AAAA,MACA,SAAS,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,OAAA,KAAY,QAAQ,MAAA,GAAS,KAAA;AAAA,MAC/D,IAAA,EAAM;AAAA,KACR,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,IAAA,KAAiB;AAC5C,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,MAAK,CAAE,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,QAAA,KAAqB;AACpD,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAA,EAAU,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,MAAA,KAAmB;AAChD,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,MAAA,EAAQ,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AC3GO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAMF,KAAIG,cAAAA,EAAe;AAEzB,EAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,6CAA6C,QAAA,EAAAC,EAAAA,CAAE,cAAc,CAAA,EAAE,CAAA;AAAA,wBAChFD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAO,SAAA,CAAU,IAAA;AAAA,YACjB,QAAA,EAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,EAAE,GAAG,SAAA,EAAW,IAAA,EAAM,CAAA,EAAG;AAAA;AAAA;AAC9D,OAAA,EACF,CAAA;AAAA,sBACAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,6CAA6C,QAAA,EAAAC,EAAAA,CAAE,YAAY,CAAA,EAAE,CAAA;AAAA,wBAC9ED,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAO,SAAA,CAAU,EAAA;AAAA,YACjB,QAAA,EAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,EAAE,GAAG,SAAA,EAAW,EAAA,EAAI,CAAA,EAAG;AAAA;AAAA;AAC5D,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA,EAAO,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA;AAAA,QAC9B,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC;AAAA,OAAA;AAAA,MAHxC,MAAA,CAAO;AAAA,KAKf;AAAA,GAAA,EACH,CAAA;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,QAAAA;AAAA,IAC5B,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,UAAU;AAAC,GACpD;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,UAAA,EAAY;AACxC,MAAA,MAAA,CAAO,OAAA,EAAQ,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA6C,iBAAO,KAAA,EAAM,CAAA;AAAA,sBAC3EE,IAAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,SAAS,EAAA,EAAI,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,KAAM,SAAA,GAAY,EAAA,GAAK,CAAC,CAAA,EACjF,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,WAAA,EACvB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,KAAA,EAAO,CAAA,EAChE,CAAA;AAAA,wBACAE,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,UAC9B,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZA,GAAAA,CAAC,UAAA,EAAA,EAA2B,KAAA,EAAO,GAAA,CAAI,KAAA,EACpC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADU,GAAA,CAAI,KAErB,CACD;AAAA,SAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA6C,iBAAO,KAAA,EAAM,CAAA;AAAA,sBAC3EA,GAAAA;AAAA,QAACK,KAAAA;AAAA,QAAA;AAAA,UACC,OAAO,KAAA,IAAS,EAAA;AAAA,UAChB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,KAAA;AAAA,UAC1C,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA6C,iBAAO,KAAA,EAAM,CAAA;AAAA,sBAC3EA,GAAAA;AAAA,QAACK,KAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAO,KAAA,IAAS,EAAA;AAAA,UAChB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,UAC7E,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,KAAA;AAAA,UAC1C,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;ACvHO,SAAS,iBAAiB,EAAE,IAAA,EAAM,UAAU,KAAA,EAAO,YAAA,EAAc,kBAAiB,EAA0B;AACjH,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,GAAO,CAAA,IAAK,QAAA,GAAW,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,UAAU,KAAK,CAAA;AAE1C,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,EAAE,CAAA,IAAA,EAAO,KAAK,KAAK,YAAA,EAC7C,CAAA;AAAA,oBAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACxD,SAAA,EAAU,qGAAA;AAAA,UAET,QAAA,EAAA,CAAC,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,qBAClBE,IAAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,IAAA,EAAO,QAAA,EAAA;AAAA,YAAA,IAAA;AAAA,YAAK;AAAA,WAAA,EAAA,EAAzB,IAAgC,CAC9C;AAAA;AAAA,OACH;AAAA,sBAEAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,UAAU,IAAA,IAAQ,CAAA;AAAA,YAClB,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA;AAAA,YAEpC,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,wBACAE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK,KAAA;AAAA,UAAI;AAAA,SAAA,EACZ,CAAA;AAAA,wBACAF,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,UAAU,IAAA,IAAQ,UAAA;AAAA,YAClB,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA;AAAA,YAEpC,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACpC,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AChDO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,UAAS,EAA0B;AACnF,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACzD,EAAA,IAAI,CAAC,aAAA,IAAiB,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEhD,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAA,GAAAA,CAAC,WAAM,SAAA,EAAU,gBAAA,EACf,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,eAAA,EACX,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ;AACxB,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,KAAU,OAAA,IAAW,IAAI,IAAA,KAAS,UAAA,IAAc,IAAI,IAAA,KAAS,QAAA;AACpF,IAAA,uBACEA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,CAAA,YAAA,EAAe,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,QAEvD,QAAA,EAAA,KAAA,IAAS,OACN,gBAAA,CAAiB,KAAA,EAAO,KAAK,QAAQ,CAAA,GACrC,GAAA,CAAI,SAAA,GACF,QAAA,GACA;AAAA,OAAA;AAAA,MAPD,GAAA,CAAI;AAAA,KAQX;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,gBAAA,CAAiB,KAAsB,IAAA,EAA4C;AAC1F,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,EAAW,OAAO,IAAA;AAE3B,EAAA,MAAM,MAAA,GAAS,KACZ,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,IAAA,IAAQ,CAAC,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAC5C,GAAA,CAAI,MAAM,CAAA;AAEb,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,QAAQ,IAAI,SAAA;AAAW,IACrB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,IACzC,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,IACpD,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IAChB,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IAC3B,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IAC3B;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AC9DO,SAAS,WAAA,CACd,OAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AAE7D,EAAA,MAAM,UAAA,GAA0B,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACxD,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,QAAQ,CAAC,KAAA,KAAe,gBAAA,CAAiB,KAAA,EAAO,KAAK,QAAQ;AAAA,GAC/D,CAAE,CAAA;AAEF,EAAA,SAAA,CAAU,UAAA,EAAY,MAAM,QAAQ,CAAA;AACtC;ACCO,SAAS,eAAe,EAAE,OAAA,EAAS,MAAM,QAAA,EAAU,QAAA,EAAU,OAAM,EAAwB;AAChG,EAAA,MAAMC,KAAIG,cAAAA,EAAe;AACzB,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtD,EAAAG,UAAU,MAAM;AACd,IAAA,OAAO,qBAAiB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAA,EAAkB,CAAA,CAAE,IAAA,CAAK,iBAAiB,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAClG,IAAA,OAAO,mBAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC9F,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAY,MAAM,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,UAAU,QAAQ,CAAA;AAErE,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,qBAAiB,CAAA;AACxD,IAAA,MAAM,aAAA,CAAc,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,YAAY,YAAY;AAC5B,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,mBAAe,CAAA;AACpD,IAAA,MAAM,YAAY,OAAA,EAAS,IAAA,EAAM,UAAU,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,EAChE,CAAA;AAEA,EAAA,uBACEJ,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAAE,IAAAA,CAACK,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAC7B,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,MACpCC,GAAE,gBAAgB;AAAA,KAAA,EACrB,CAAA,EACF,CAAA;AAAA,oBACAC,IAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,KAAA,EACrB,QAAA,EAAA;AAAA,sBAAAF,IAAC,YAAA,EAAA,EAAa,OAAA,EAAS,WAAY,QAAA,EAAAC,EAAAA,CAAE,mBAAmB,CAAA,EAAE,CAAA;AAAA,MACzD,cAAA,oBACCD,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAS,WAAA,EAAc,QAAA,EAAAC,EAAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,MAE/D,YAAA,oBACCD,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAS,SAAA,EAAY,QAAA,EAAAC,EAAAA,CAAE,mBAAmB,CAAA,EAAE;AAAA,KAAA,EAE9D;AAAA,GAAA,EACF,CAAA;AAEJ;AC3CO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAsB;AAClE,EAAA,MAAMA,KAAIG,cAAAA,EAAe;AACzB,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,iBAAA,EAAkB;AAC/C,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,aAAA,CAAc,MAAA,EAAQ,QAAA,EAAU,OAAO,eAAe,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAc,OAAO,SAAA,KAAc,KAAA;AAEzC,EAAA,MAAM,eAAA,GAAkBI,OAAAA;AAAA,IACtB,MAAM,uBAAA,CAAwB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,IAClE,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,SAAS,IAAI;AAAA,GACvC;AAEA,EAAA,uBACEN,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAA;AAAA,UACT,SAAA,EAAU,uFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAClCC,GAAE,mBAAmB;AAAA;AAAA;AAAA,OACxB;AAAA,sBACAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,iBAAO,IAAA,EAAK;AAAA,KAAA,EAC7C,CAAA;AAAA,oBAEAE,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EAAqB,iBAAO,IAAA,EAAK,CAAA;AAAA,MAC9C,MAAA,CAAO,+BACNA,GAAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EAAwC,iBAAO,WAAA,EAAY;AAAA,KAAA,EAE5E,CAAA;AAAA,oBAGAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,iBAAA,EAAmB,YAAA;AAAA,UACnB,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,UAC5B,cAAc,KAAA,CAAM,OAAA;AAAA,UACpB,cAAA,EAAgB;AAAA;AAAA,OAClB;AAAA,sBACAE,IAAAA,CAACK,MAAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAA,IAAW,CAAC,WAAA,EAAa,IAAA,EAAK,IAAA,EAAK,WAAU,KAAA,EAC/E,QAAA,EAAA;AAAA,QAAA,OAAA,mBACGP,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,iCAAA,EAAkC,oBACrDA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,QAExCC,GAAE,kBAAkB;AAAA,OAAA,EACvB,CAAA;AAAA,MACC,SAAA,oBACCC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,IAAA;AAAA,YACA,UAAU,MAAA,CAAO,EAAA;AAAA,YACjB,QAAA,EAAU,OAAO,QAAA,CAAS,IAAA;AAAA,YAC1B,OAAO,MAAA,CAAO;AAAA;AAAA,SAChB;AAAA,wBACAE,IAAAA,CAACK,MAAAA,EAAA,EAAO,SAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,KAAA,EAAM,OAAA,EAAS,MAAM,MAAA,CAAO,OAAM,EAC9E,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,UACvCC,GAAE,eAAe;AAAA,SAAA,EACpB;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGC,SAAA,oBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDACb,QAAA,kBAAAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,SAAA,CAAU,IAAA,oBACfA,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAA,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,UAAAD,GAAE,oBAAoB,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,QAAS,GAAA;AAAA,QAAA,qBAAM,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,GAAO,QAAQ,GAAE,kBAAA;AAAmB,OAAA,EAAE,CAAA;AAAA,MAEnH,KAAA,CAAM,SAAA,CAAU,EAAA,oBACfC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAA,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,UAAAD,GAAE,kBAAkB,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,QAAS,GAAA;AAAA,QAAA,qBAAM,IAAA,CAAK,KAAA,CAAM,UAAU,EAAA,GAAK,QAAQ,GAAE,kBAAA;AAAmB,OAAA,EAAE,CAAA;AAAA,MAE/G,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA;AAAA,QAAI,CAAC,CAAC,GAAA,EAAK,KAAK,MAC7C,KAAA,mBAAQC,KAAC,MAAA,EAAA,EAAe,QAAA,EAAA;AAAA,0BAAAA,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAI;AAAA,WAAA,EAAC,CAAA;AAAA,UAAS,GAAA;AAAA,UAAE,OAAO,KAAK;AAAA,SAAA,EAAA,EAA1C,GAA4C,CAAA,GAAU;AAAA,OAC3E;AAAA,sBACAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAA,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,UAAAD,GAAE,uBAAuB,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,QAAS,GAAA;AAAA,QAAE;AAAA,OAAA,EAAM;AAAA,KAAA,EAC9D,CAAA,EACF,CAAA;AAAA,IAID,yBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FACZ,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IAID,CAAC,SAAA,IAAa,CAAC,OAAA,oBACdA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACZ,QAAA,EAAA,WAAA,mBACCE,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,SAAI,SAAA,EAAU,uEAAA,EACb,0BAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,+BAAA,EAAgC,CAAA,EAC/D,CAAA;AAAA,sBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAe,QAAA,EAAAC,EAAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,sBACzDD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAA+C,QAAA,EAAAC,EAAAA,CAAE,+BAA+B,CAAA,EAAE;AAAA,KAAA,EACjG,CAAA,mBAEAC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,SAAI,SAAA,EAAU,uEAAA,EACb,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,+BAAA,EAAgC,CAAA,EAC1D,CAAA;AAAA,sBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAe,QAAA,EAAAC,EAAAA,CAAE,0BAA0B,CAAA,EAAE,CAAA;AAAA,sBAC1DD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAA+C,QAAA,EAAAC,EAAAA,CAAE,gCAAgC,CAAA,EAAE;AAAA,KAAA,EAClG,CAAA,EAEJ,CAAA;AAAA,IAAA,CAIA,SAAA,IAAa,OAAA,qBACbC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,IAAA;AAAA,UACA,OAAA;AAAA,UACA,YAAA,EAAc,CAAA;AAAA,UACd,YAAA,EAAcC,GAAE,mBAAmB,CAAA;AAAA,UACnC,OAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAO;AAAA;AAAA,OACT;AAAA,MAEC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAA,oBACtBD,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,IAAA;AAAA,UACA,QAAA,EAAU,OAAO,QAAA,CAAS;AAAA;AAAA,OAC5B;AAAA,MAGD,CAAC,OAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,KAAA;AAAA,UACA,YAAA,EAAc,OAAA;AAAA,UACd,gBAAA,EAAkB;AAAA;AAAA,OACpB,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC/KA,IAAM,SAAA,GAAY,UAAA;AAElB,SAAS,mBAAA,GAAqC;AAC5C,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAChE,EAAA,IAAI,IAAA,CAAK,WAAW,SAAA,GAAY,GAAG,KAAK,IAAA,CAAK,MAAA,GAAS,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC1E,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIG,SAAwB,mBAAmB,CAAA;AAEvF,EAAAG,UAAU,MAAM;AACd,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,iBAAA,CAAkB,qBAAqB,CAAA;AAAA,IACzC;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC7C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeG,WAAAA,CAAY,CAAC,MAAA,KAAsB;AACtD,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA,CAAA;AAAA,EAClD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,SAAA;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,cAAA,GACjB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,cAAc,CAAA,IAAK,IAAA,GACvD,IAAA;AAEJ,EAAA,uBACET,GAAAA,CAAC,sBAAA,EAAA,EAAuB,MAAA,EAAgB,QAAA,EACtC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACZ,QAAA,EAAA,YAAA,mBACCA,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MAEC,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KAAA;AAAA,IAFH,YAAA,CAAa;AAAA,sBAKpBA,GAAAA,CAAC,aAAU,QAAA,EAAU,YAAA,EAAc,GAEvC,CAAA,EACF,CAAA;AAEJ;ACrDA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAC,MAAM,GAAA,GAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAEA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAEA,SAAS,MAAA,CAAO,KAA8B,SAAA,EAAyD;AACrG,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAM,QAAA,GAAW,SAAA,GAAY,GAAG,CAAA,IAAK,aAAa,GAAG,CAAA;AACrD,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;AAYO,SAAS,6BAA6B,MAAA,EAA0D;AACrG,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,QAAA;AAChC,EAAA,MAAM,WAAA,GAAc,OAAO,cAAA,IAAkB,WAAA;AAE7C,EAAA,SAAS,eAAA,GAAsC;AAC7C,IAAA,OAAO,OAAO,MAAA,CAAO,QAAA,KAAa,aAAa,MAAA,CAAO,QAAA,KAAa,MAAA,CAAO,QAAA;AAAA,EAC5E;AAEA,EAAA,SAAS,SAAA,GAAY;AACnB,IAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC9D,IAAA,OAAO,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,SAAA,EAAsB,KAAA,EAAgD;AAChF,MAAA,MAAM,EAAE,YAAW,GAAI,SAAA;AACvB,MAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAE7B,MAAA,IAAI,UAAA,CAAW,SAAS,KAAA,EAAO;AAC7B,QAAA,OAAO,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,iBAAiB,SAAS,CAAA;AAAA,MAC5E;AAEA,MAAA,OAAO,aAAa,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,eAAA,EAAiB,aAAa,SAAS,CAAA;AAAA,IAC1F;AAAA,GACF;AACF;AAMA,eAAe,aACb,SAAA,EACA,KAAA,EACA,SAAA,EACA,eAAA,EACA,aACA,SAAA,EACuB;AACvB,EAAA,MAAM,EAAE,YAAW,GAAI,SAAA;AACvB,EAAA,IAAI,CAAA,GAAI,SAAA,EAAU,CAAE,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAE,MAAA,CAAO,GAAA,EAAK,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAGxE,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA;AAAA,EAChC;AAGA,EAAA,MAAM,OAAA,GAAU,WAAW,UAAA,IAAc,YAAA;AACzC,EAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,IAAA,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,UAAU,IAAI,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,KAAA,CAAM,UAAU,EAAA,EAAI;AAGtB,IAAA,MAAM,OAAA,GAAU,OAAA,KAAY,YAAA,IAAgB,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GAC9D,KAAA,CAAM,SAAA,CAAU,EAAA,GAAK,WAAA,GACrB,KAAA,CAAM,SAAA,CAAU,EAAA;AACpB,IAAA,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5B;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACnC,IAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,iBAAiB,SAAA,CAAU,OAAA,CAC9B,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAA,KAAS,OAAO,EACrD,GAAA,CAAI,CAAC,MAAW,YAAA,CAAa,CAAA,CAAE,GAAG,CAAC,CAAA;AACtC,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,EAAG,GAAG,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7E,MAAA,CAAA,GAAI,CAAA,CAAE,GAAG,QAAQ,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAClB,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA,GACzB,UAAA,CAAW,WAAA,GACT,YAAA,CAAa,UAAA,CAAW,WAAW,CAAA,GACnC,OAAA;AACN,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,GACpB,KAAA,CAAM,OAAA,KAAY,QAClB,UAAA,CAAW,cAAA,GACT,UAAA,CAAW,cAAA,KAAmB,KAAA,GAC9B,KAAA;AACN,EAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,EAAE,WAAW,CAAA;AAGlC,EAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,IAAK,KAAA,CAAM,QAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAA,GAAO,KAAA,CAAM,QAAA,GAAW,CAAA;AACnC,EAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AAEpB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,KAAU,MAAM,CAAA;AAErC,EAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,MAAA,CAAO,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,IAC3D,OAAO,KAAA,IAAS;AAAA,GAClB;AACF;AAMA,eAAe,WAAA,CACb,SAAA,EACA,KAAA,EACA,SAAA,EACA,iBACA,SAAA,EACuB;AACvB,EAAA,MAAM,EAAE,YAAW,GAAI,SAAA;AACvB,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAA;AAAA,IACxB,IAAA,EAAM,MAAM,SAAA,CAAU,EAAA;AAAA,IACtB,QAAQ,KAAA,CAAM,IAAA;AAAA,IACd,aAAa,KAAA,CAAM;AAAA,GACrB;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACnC,IAAA,MAAA,CAAO,CAAA,EAAA,EAAK,YAAA,CAAa,GAAG,CAAC,EAAE,CAAA,GAAI,KAAA;AAAA,EACrC;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAA,CAAO,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAC5C,IAAA,MAAA,CAAO,UAAA,GAAa,MAAM,OAAA,IAAW,MAAA;AAAA,EACvC;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,WAAU,CAAE,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AACrE,EAAA,IAAI,OAAO,MAAM,KAAA;AAGjB,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,MAAA,CAAO,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,MAChE,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,EAAC;AAC3C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAK,GAAA,CAAI,CAAC,QAAa,MAAA,CAAO,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,IACnD,OAAO,IAAA,CAAK;AAAA,GACd;AACF;;;ACrMO,SAAS,wBAAA,GAA+C;AAC7D,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,GAAQ;AACZ,MAAA,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,IAC9B;AAAA,GACF;AACF;;;ACRA,IAAI,CAAA;AAEG,SAAS,kBAAA,GAAyC;AAAE,EAAA,OAAO,CAAA;AAAE;;;ACF7D,IAAM,EAAA,GAA6B;AAAA,EACxC,mBAAA,EAAqB,SAAA;AAAA,EACrB,sBAAA,EAAwB,0DAAA;AAAA,EACxB,oBAAA,EAAsB,aAAA;AAAA,EACtB,mBAAA,EAAqB,YAAA;AAAA,EACrB,cAAA,EAAgB,MAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,gBAAA,EAAkB,QAAA;AAAA,EAClB,mBAAA,EAAqB,YAAA;AAAA,EACrB,qBAAA,EAAuB,cAAA;AAAA,EACvB,mBAAA,EAAqB,YAAA;AAAA,EACrB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,uBAAA,EAAyB,MAAA;AAAA,EACzB,iBAAA,EAAmB,SAAA;AAAA,EACnB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,eAAA,EAAiB,OAAA;AAAA,EACjB,mBAAA,EAAqB,WAAA;AAAA,EACrB,mBAAA,EAAqB,aAAA;AAAA,EACrB,mBAAA,EAAqB,YAAA;AAAA,EACrB,mBAAA,EAAqB,YAAA;AAAA,EACrB,qBAAA,EAAuB,cAAA;AAAA,EACvB,gBAAA,EAAkB,QAAA;AAAA,EAClB,kBAAA,EAAoB,UAAA;AAAA,EACpB,yBAAA,EAA2B,mBAAA;AAAA,EAC3B,+BAAA,EAAiC,0EAAA;AAAA,EACjC,0BAAA,EAA4B,aAAA;AAAA,EAC5B,gCAAA,EAAkC;AACpC,CAAA;;;AC3BO,IAAM,IAAA,GAA+B;AAAA,EAC1C,mBAAA,EAAqB,eAAA;AAAA,EACrB,sBAAA,EAAwB,uEAAA;AAAA,EACxB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,mBAAA,EAAqB,YAAA;AAAA,EACrB,cAAA,EAAgB,IAAA;AAAA,EAChB,YAAA,EAAc,QAAA;AAAA,EACd,gBAAA,EAAkB,UAAA;AAAA,EAClB,mBAAA,EAAqB,cAAA;AAAA,EACrB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,mBAAA,EAAqB,cAAA;AAAA,EACrB,mBAAA,EAAqB,8BAAA;AAAA,EACrB,uBAAA,EAAyB,QAAA;AAAA,EACzB,iBAAA,EAAmB,eAAA;AAAA,EACnB,gBAAA,EAAkB,yBAAA;AAAA,EAClB,eAAA,EAAiB,MAAA;AAAA,EACjB,mBAAA,EAAqB,OAAA;AAAA,EACrB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,mBAAA,EAAqB,aAAA;AAAA,EACrB,mBAAA,EAAqB,gBAAA;AAAA,EACrB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,gBAAA,EAAkB,eAAA;AAAA,EAClB,kBAAA,EAAoB,OAAA;AAAA,EACpB,yBAAA,EAA2B,mBAAA;AAAA,EAC3B,+BAAA,EAAiC,uGAAA;AAAA,EACjC,0BAAA,EAA4B,UAAA;AAAA,EAC5B,gCAAA,EAAkC;AACpC,CAAA;;;ACxBO,IAAM,cAAA,GAAyD;AAAA,EACpE,EAAA;AAAA,EACA,OAAA,EAAS;AACX,CAAA;;;ACaA,IAAM,cAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,SAAA;AAAA,EACX,YAAA,EAAc,0DAAA;AAAA,EACd,UAAA,EAAY,aAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA,EACX,IAAA,EAAM,MAAA;AAAA,EACN,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,YAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,mBAAA;AAAA,EACX,aAAA,EAAe,MAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,mBAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,aAAA;AAAA,EACX,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,YAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,mBAAA;AAAA,EACjB,qBAAA,EAAuB,0EAAA;AAAA,EACvB,gBAAA,EAAkB,aAAA;AAAA,EAClB,sBAAA,EAAwB;AAC1B,CAAA;AAEA,IAAM,mBAAmB,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,EAAK;AAMtE,SAAS,cAAc,OAAA,EAAsD;AAC3E,EAAA,OAAO;AAAA,IACL,QAAQ,EAAE,GAAG,cAAA,EAAgB,GAAG,QAAQ,MAAA,EAAO;AAAA,IAC/C,UAAU,EAAE,GAAG,gBAAA,EAAkB,GAAG,QAAQ,QAAA,EAAS;AAAA,IACrD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,eAAA,EAAiB,QAAQ,eAAA,IAAmB,EAAA;AAAA,IAC5C,UAAA,EAAY,QAAQ,UAAA,KAAe;AAAA,GACrC;AACF;AAMO,SAAS,oBAAoB,OAAA,EAA+C;AACjF,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,oBAAA,CAAqB,cAAc,CAAA;AACnC,EAAA,MAAM,QAAA,GAA+B,QAAQ,YAAA,IAAgB,sBAAA;AAAA,IAC3D,MAAM,4BAAA,CAA6B,EAAE,UAAU,MAAM,kBAAA,IAAsB,CAAA;AAAA,IAC3E,MAAM,wBAAA;AAAyB,GACjC;AAEA,EAAA,MAAM,aAAA,GAA+B,MACnCU,MAAAA,CAAM,aAAA,CAAc,aAAa,EAAE,MAAA,EAAQ,UAAU,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,OAAO,MAAA,CAAO,SAAA;AAAA,IACpB,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,QAAQ,KAAA,IAAS,WAAA;AAAA,IACxB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,gBAAA,EAAkB;AAAA,MAChB,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,OAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,SAAA;AAAU,KAClF;AAAA,IACA,UAAA,EAAY;AAAA,MACV;AAAA,QACE,OAAA,EAAS,QAAQ,UAAA,IAAc,MAAA;AAAA,QAC/B,QAAA,EAAU,QAAQ,WAAA,IAAe,CAAA;AAAA,QACjC,KAAA,EAAO,OAAO,MAAA,CAAO,SAAA;AAAA,QACrB,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,WAAA;AAAA,QACN,UAAA,EAAY,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAA;AAAgB;AAC5D,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,SAAA,EAAW,aAAA;AAAA,QACX,UAAA,EAAY,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAA;AAAgB;AAC5D,KACF;AAAA,IACA,SAAS,EAAC;AAAA,IACV,YAAY,EAAC;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AACF","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\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 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 * 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"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ export interface ReportDataSource {
|
|
|
42
42
|
/** snake_case DB → camelCase JS column mapping */
|
|
43
43
|
columnMap?: Record<string, string>;
|
|
44
44
|
}
|
|
45
|
+
export type ReportGrain = 'order' | 'order_item' | 'booking' | 'ledger_movement' | 'event';
|
|
46
|
+
export type ReportAllowedAction = 'read';
|
|
45
47
|
export interface ReportDef {
|
|
46
48
|
id: string;
|
|
47
49
|
name: string;
|
|
@@ -52,6 +54,16 @@ export interface ReportDef {
|
|
|
52
54
|
columns: ReportColumnDef[];
|
|
53
55
|
filters?: ReportFilterDef[];
|
|
54
56
|
dataSource: ReportDataSource;
|
|
57
|
+
/** Canonical read model/view used by the report. Defaults to dataSource.name. */
|
|
58
|
+
sourceView?: string;
|
|
59
|
+
/** Business grain of each report row, used to prevent double counting. */
|
|
60
|
+
grain?: ReportGrain;
|
|
61
|
+
/** Plugin that owns the report UI/definition. */
|
|
62
|
+
ownerPlugin?: string;
|
|
63
|
+
/** Canonical data owner/spine for this report's facts. */
|
|
64
|
+
canonicalOwner?: string;
|
|
65
|
+
/** Reports are normally read-only; explicit actions make that contract visible. */
|
|
66
|
+
allowedActions?: ReportAllowedAction[];
|
|
55
67
|
permission?: {
|
|
56
68
|
feature: string;
|
|
57
69
|
action: 'read';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAM9C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAA;AAElD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,eAAe,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,SAAS,CAAA;IACtD,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnC,yCAAyC;IACzC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CAAA;CACpD;AAMD,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjE,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC9D,OAAO,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAA;IACtE,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAMD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEzE,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,CAAA;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IAC/B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;IAC3B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAMD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,eAAe,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IACxB,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,YAAY,CAAC,EAAE,OAAO,cAAc,EAAE,kBAAkB,CAAA;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,eAAe,EAAE,WAAW,CAAA;IAC3C,UAAU,CAAC,EAAE,OAAO,eAAe,EAAE,UAAU,CAAA;IAC/C,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;iEAC6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAA;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;CACpB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportViewer.d.ts","sourceRoot":"","sources":["../../src/views/ReportViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAYtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ReportViewer.d.ts","sourceRoot":"","sources":["../../src/views/ReportViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAYtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBAkKjE"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/plugin-reports",
|
|
3
|
-
"
|
|
4
|
-
|
|
3
|
+
"fayz": {
|
|
4
|
+
"status": "preview"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.8.0",
|
|
7
|
+
"description": "[experimental] Fayz SDK — plugin-reports plugin",
|
|
5
8
|
"type": "module",
|
|
6
9
|
"main": "./dist/index.cjs",
|
|
7
10
|
"module": "./dist/index.js",
|
|
@@ -26,9 +29,9 @@
|
|
|
26
29
|
"lucide-react": "^0.400.0",
|
|
27
30
|
"zustand": "^4.5.0",
|
|
28
31
|
"@tanstack/react-table": "^8.20.0",
|
|
29
|
-
"@fayz-ai/core": "^0.
|
|
30
|
-
"@fayz-ai/
|
|
31
|
-
"@fayz-ai/
|
|
32
|
+
"@fayz-ai/core": "^0.8.0",
|
|
33
|
+
"@fayz-ai/ui": "^0.8.0",
|
|
34
|
+
"@fayz-ai/saas": "^0.8.0"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"@types/react": "^18.3.0",
|
package/src/index.ts
CHANGED
package/src/types.ts
CHANGED
|
@@ -59,6 +59,10 @@ export interface ReportDataSource {
|
|
|
59
59
|
columnMap?: Record<string, string>
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
export type ReportGrain = 'order' | 'order_item' | 'booking' | 'ledger_movement' | 'event'
|
|
63
|
+
|
|
64
|
+
export type ReportAllowedAction = 'read'
|
|
65
|
+
|
|
62
66
|
export interface ReportDef {
|
|
63
67
|
id: string
|
|
64
68
|
name: string
|
|
@@ -69,6 +73,16 @@ export interface ReportDef {
|
|
|
69
73
|
columns: ReportColumnDef[]
|
|
70
74
|
filters?: ReportFilterDef[]
|
|
71
75
|
dataSource: ReportDataSource
|
|
76
|
+
/** Canonical read model/view used by the report. Defaults to dataSource.name. */
|
|
77
|
+
sourceView?: string
|
|
78
|
+
/** Business grain of each report row, used to prevent double counting. */
|
|
79
|
+
grain?: ReportGrain
|
|
80
|
+
/** Plugin that owns the report UI/definition. */
|
|
81
|
+
ownerPlugin?: string
|
|
82
|
+
/** Canonical data owner/spine for this report's facts. */
|
|
83
|
+
canonicalOwner?: string
|
|
84
|
+
/** Reports are normally read-only; explicit actions make that contract visible. */
|
|
85
|
+
allowedActions?: ReportAllowedAction[]
|
|
72
86
|
permission?: { feature: string; action: 'read' }
|
|
73
87
|
/** Show aggregate summary row */
|
|
74
88
|
showSummary?: boolean
|
package/src/views/ReportHub.tsx
CHANGED
|
@@ -23,8 +23,8 @@ export function ReportHub({ onSelect }: ReportHubProps) {
|
|
|
23
23
|
const categories = useMemo(() => {
|
|
24
24
|
const filtered = search
|
|
25
25
|
? config.reports.filter(
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
(r) =>
|
|
27
|
+
r.name.toLowerCase().includes(search.toLowerCase()) ||
|
|
28
28
|
r.description?.toLowerCase().includes(search.toLowerCase()),
|
|
29
29
|
)
|
|
30
30
|
: config.reports
|
|
@@ -35,7 +35,6 @@ export function ReportViewer({ report, onBack }: ReportViewerProps) {
|
|
|
35
35
|
} = useReportData(report, provider, config.defaultPageSize)
|
|
36
36
|
|
|
37
37
|
const isAvailable = report.available !== false
|
|
38
|
-
|
|
39
38
|
const tanstackColumns = useMemo(
|
|
40
39
|
() => reportColumnsToTanstack(report.columns, config.currency.code),
|
|
41
40
|
[report.columns, config.currency.code],
|