@fayz-ai/plugin-reports 0.16.30 → 0.16.31

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.
@@ -0,0 +1,5 @@
1
+ export { AnalyticsReportViewer } from './chunk-VGDOKFED.js';
2
+ import './chunk-YVLQV4N7.js';
3
+ import './chunk-4QIHTUXD.js';
4
+ //# sourceMappingURL=AnalyticsReportViewer-ORI3XI5D.js.map
5
+ //# sourceMappingURL=AnalyticsReportViewer-ORI3XI5D.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsReportViewer-U7SDU2LL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsReportViewer-ORI3XI5D.js"}
@@ -1,8 +1,8 @@
1
1
  import { useAnalyticsConfig, useAnalyticsCards, markViewed, navigateAnalytics, REPORTS_BASE, ANALYTICS_BASE, cardColumns } from './chunk-YVLQV4N7.js';
2
2
  import { expandBagColumns, formatValuePlain, reportColumnsToTanstack } from './chunk-4QIHTUXD.js';
3
3
  import React2, { useState, useEffect } from 'react';
4
- import { ArrowLeft, Printer, Construction, Download, ChevronLeft, ChevronRight } from 'lucide-react';
5
- import { Button, SubpageHeader, AnalyticsControls, useToolbarPanelClose, useAnalyticsCard, useAnalyticsCardRows, ToolbarAction, useAnalyticsContext, useAnalyticsAllRows, StatementTable, formatBucket, AnalyticsCard, DataTable, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui';
4
+ import { ArrowLeft, Printer, Construction, Download } from 'lucide-react';
5
+ import { Button, SubpageHeader, AnalyticsControls, useToolbarPanelClose, useAnalyticsCard, useAnalyticsCardRows, ToolbarAction, useAnalyticsContext, useAnalyticsAllRows, StatementTable, formatBucket, AnalyticsCard, DataTable, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, Pagination, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui';
6
6
  import { exportCSV, useTranslation } from '@fayz-ai/core';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
 
@@ -57,45 +57,19 @@ function ExportDropdown({ columns, data, filename, currency, title, fetchAll })
57
57
  }
58
58
  function ReportPagination({ page, pageSize, total, onPageChange, onPageSizeChange }) {
59
59
  const t = useTranslation();
60
- const totalPages = Math.max(1, Math.ceil(total / pageSize));
61
- const from = (page - 1) * pageSize + 1;
62
- const to = Math.min(page * pageSize, total);
63
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-t px-4 py-3", children: [
64
- /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: total > 0 ? t("reports.pagination.range", { from, to, total }) : t("reports.pagination.empty") }),
65
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
66
- /* @__PURE__ */ jsxs(Select, { value: String(pageSize), onValueChange: (v) => onPageSizeChange(Number(v)), children: [
60
+ return /* @__PURE__ */ jsx(
61
+ Pagination,
62
+ {
63
+ page,
64
+ pageSize,
65
+ total,
66
+ onPageChange,
67
+ trailing: /* @__PURE__ */ jsxs(Select, { value: String(pageSize), onValueChange: (v) => onPageSizeChange(Number(v)), children: [
67
68
  /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 w-auto gap-2 bg-card px-2 shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)]", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
68
69
  /* @__PURE__ */ jsx(SelectContent, { children: [25, 50, 100].map((size) => /* @__PURE__ */ jsx(SelectItem, { value: String(size), children: t("reports.pagination.perPage", { size }) }, size)) })
69
- ] }),
70
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
71
- /* @__PURE__ */ jsx(
72
- Button,
73
- {
74
- variant: "outline",
75
- size: "sm",
76
- disabled: page <= 1,
77
- onClick: () => onPageChange(page - 1),
78
- children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
79
- }
80
- ),
81
- /* @__PURE__ */ jsxs("span", { className: "text-sm px-2", children: [
82
- page,
83
- " / ",
84
- totalPages
85
- ] }),
86
- /* @__PURE__ */ jsx(
87
- Button,
88
- {
89
- variant: "outline",
90
- size: "sm",
91
- disabled: page >= totalPages,
92
- onClick: () => onPageChange(page + 1),
93
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
94
- }
95
- )
96
70
  ] })
97
- ] })
98
- ] });
71
+ }
72
+ );
99
73
  }
100
74
  function ViewerBody({ card }) {
101
75
  const { labels, currency, defaultRange } = useAnalyticsConfig();
@@ -258,5 +232,5 @@ function ViewerActions({ card }) {
258
232
  }
259
233
 
260
234
  export { AnalyticsReportViewer, exportToCsv };
261
- //# sourceMappingURL=chunk-LB6NOSJU.js.map
262
- //# sourceMappingURL=chunk-LB6NOSJU.js.map
235
+ //# sourceMappingURL=chunk-VGDOKFED.js.map
236
+ //# sourceMappingURL=chunk-VGDOKFED.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export/csv.ts","../src/components/ExportDropdown.tsx","../src/components/ReportPagination.tsx","../src/views/AnalyticsReportViewer.tsx"],"names":["useTranslation","jsx","jsxs","React","ToolbarAction"],"mappings":"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","file":"chunk-VGDOKFED.js","sourcesContent":["import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { expandBagColumns, 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 // Uma coluna por resposta de formulário, não um JSON dentro da célula: é o\n // que deixa a planilha ordenável e filtrável por \"Estilo\".\n const { columns: cols, rows } = expandBagColumns(columns, data)\n const visibleCols = cols.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, rows, filename)\n}\n","import React, { useEffect, useState } from 'react'\nimport { Download } from 'lucide-react'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n ToolbarAction,\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 * Fetch the WHOLE result set. The table on screen is one page of 50, and a\n * file holding 50 of 4,000 rows says nothing about being a fragment — so the\n * export asks for everything before it writes. Absent ⇒ the page is exported.\n */\n fetchAll?: () => Promise<Record<string, any>[]>\n}\n\nexport function ExportDropdown({ columns, data, filename, currency, title, fetchAll }: ExportDropdownProps) {\n const t = useTranslation()\n const [excelAvailable, setExcelAvailable] = useState(false)\n const [pdfAvailable, setPdfAvailable] = useState(false)\n const [busy, setBusy] = 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 // One writer for the three formats: whichever one is picked, the rows come\n // from the same fetch, so a CSV and a PDF of the same report cannot hold\n // different numbers of lines. A failed fetch falls back to the page on\n // screen — a partial file beats a button that does nothing.\n const withRows = async (write: (rows: Record<string, any>[]) => void | Promise<void>) => {\n if (busy) return\n setBusy(true)\n try {\n const rows = fetchAll ? await fetchAll().catch(() => data) : data\n await write(rows.length ? rows : data)\n } finally {\n setBusy(false)\n }\n }\n\n const handleCsv = () => withRows((rows) => exportToCsv(columns, rows, filename, currency))\n\n const handleExcel = () => withRows(async (rows) => {\n const { exportToExcel } = await import('../export/excel')\n await exportToExcel(columns, rows, filename, currency)\n })\n\n const handlePdf = () => withRows(async (rows) => {\n const { exportToPdf } = await import('../export/pdf')\n await exportToPdf(columns, rows, filename, { title, currency })\n })\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n {/* Sem contorno, como o resto da barra — ver ToolbarAction. */}\n <ToolbarAction icon={Download} caret disabled={busy}>{t('reports.export')}</ToolbarAction>\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 from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Pagination, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } 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 // The product's one pager, with the page-size picker at its right margin.\n const t = useTranslation()\n\n return (\n <Pagination\n page={page}\n pageSize={pageSize}\n total={total}\n onPageChange={onPageChange}\n trailing={(\n <Select value={String(pageSize)} onValueChange={(v) => onPageSizeChange(Number(v))}>\n <SelectTrigger className=\"h-8 w-auto gap-2 bg-card px-2 shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[25, 50, 100].map((size) => (\n <SelectItem key={size} value={String(size)}>{t('reports.pagination.perPage', { size })}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n )\n}\n","import React from 'react'\nimport { ArrowLeft, Construction, Printer } from 'lucide-react'\nimport {\n Button, SubpageHeader, ToolbarAction, AnalyticsCard, AnalyticsControls,\n useAnalyticsContext, useAnalyticsCard, useAnalyticsCardRows, useAnalyticsAllRows,\n useToolbarPanelClose,\n} from '@fayz-ai/ui'\nimport type { AnalyticsCardDef, AnalyticsRow } from '@fayz-ai/core'\nimport { DataTable, StatementTable, formatBucket } from '@fayz-ai/ui'\nimport { expandBagColumns, reportColumnsToTanstack } from '../lib/columns'\nimport { ExportDropdown } from '../components/ExportDropdown'\nimport { ReportPagination } from '../components/ReportPagination'\nimport type { ReportColumnDef } from '../types'\nimport {\n useAnalyticsConfig, useAnalyticsCards, cardColumns, navigateAnalytics,\n ANALYTICS_BASE, REPORTS_BASE,\n} from './AnalyticsSurface'\nimport { markViewed } from '../lib/lastViewed'\n\n// ---------------------------------------------------------------------------\n// A report, full size.\n//\n// The chart is not decoration bolted onto a table: it is the SAME card that\n// renders as a tile on the overview, given the whole width. Underneath sits the\n// data it was computed from — so \"show me the number\" and \"show me the rows\n// behind the number\" stop being two different features in two different places.\n// ---------------------------------------------------------------------------\n\nfunction ViewerBody({ card }: { card: AnalyticsCardDef }) {\n const { labels, currency, defaultRange } = useAnalyticsConfig()\n const { state, setPage, setPageSize, setPreset } = useAnalyticsContext()\n const cardDefaultRange = (card as AnalyticsCardDef & { defaultRange?: typeof defaultRange }).defaultRange\n React.useEffect(() => {\n if (!cardDefaultRange) return\n setPreset(cardDefaultRange)\n return () => setPreset(defaultRange)\n }, [card.id, cardDefaultRange, defaultRange, setPreset])\n const isStatement = card.viz.type === 'statement' && !!card.viz.statement\n // Same query as the chart above and the export below — the provider\n // de-duplicates them into one round trip.\n // A statement reads the whole set below. Running the paged card query too\n // executed the same heavy DRE twice and made both requests hit the timeout.\n const { result, loading, error, engineMissing } = useAnalyticsCard(card, { enabled: !isStatement })\n // Um demonstrativo lê o CONJUNTO, nunca a página — ver `useAnalyticsAllRows`.\n const all = useAnalyticsAllRows(card, isStatement && card.available !== false)\n\n const columns = React.useMemo(() => cardColumns(card), [card])\n // As respostas do formulário viram COLUNAS de verdade — \"Estilo\", \"Perfil\" —\n // descobertas nas linhas desta página, porque cada campanha pergunta outra\n // coisa e declarar as colunas no card tornaria o próximo formulário\n // invisível. Mesma expansão que a planilha usa, então tela e arquivo mostram\n // as mesmas colunas.\n const expanded = React.useMemo(\n () => expandBagColumns(columns as unknown as ReportColumnDef[], (result?.rows ?? []) as Record<string, any>[]),\n [columns, result?.rows],\n )\n const tanstackColumns = React.useMemo(\n () => reportColumnsToTanstack(expanded.columns, currency.code),\n [expanded.columns, currency.code],\n )\n const rows = expanded.rows\n\n if (card.available === false) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed py-16 text-center\">\n <div className=\"mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{labels.unavailableTitle}</p>\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{labels.unavailableDescription}</p>\n </div>\n )\n }\n\n // A pure detail listing has nothing to chart — rendering an empty card frame\n // above the table would be chrome pretending to be information.\n const hasViz = card.viz.type !== 'table' || (card.query.measures?.length ?? 0) > 0\n\n // Um demonstrativo JÁ É a tela inteira. Repetir as mesmas linhas embaixo como\n // grade plana daria duas respostas para a mesma pergunta — e a de baixo, sem\n // hierarquia nem totalizadores, é a pior das duas.\n if (isStatement && card.viz.statement) {\n return (\n <>\n {engineMissing ? (\n <div className=\"rounded-lg border bg-muted/40 p-3 text-sm\">\n <p className=\"font-medium\">Analytics engine not installed</p>\n <p className=\"mt-0.5 text-muted-foreground\">\n This report aggregates server-side and needs migration 0039\n (<code className=\"text-xs\">analytics_run</code> + the read models) applied to this project.\n </p>\n </div>\n ) : (error ?? all.error) ? (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error ?? all.error}\n </div>\n ) : null}\n <StatementTable\n rows={all.rows}\n def={card.viz.statement}\n currency={currency}\n formatPeriod={(p) => formatBucket(p, 'month')}\n emptyMessage={labels.noResults}\n loading={all.loading}\n />\n </>\n )\n }\n\n return (\n <>\n {hasViz ? (\n <AnalyticsCard\n card={{ ...card, viz: { ...card.viz, height: card.viz.height ?? 280, limit: undefined } }}\n hideOpen\n />\n ) : null}\n\n {engineMissing ? (\n <div className=\"rounded-lg border bg-muted/40 p-3 text-sm\">\n <p className=\"font-medium\">Analytics engine not installed</p>\n <p className=\"mt-0.5 text-muted-foreground\">\n This report aggregates server-side and needs migration 0039\n (<code className=\"text-xs\">analytics_run</code> + the read models) applied to this project.\n </p>\n </div>\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 ) : null}\n\n {/* `print-flow`: sem ele a regra de cartão (`break-inside: avoid`) prende a\n tabela inteira numa página e o resto do relatório não sai no papel. */}\n <div className=\"print-flow\">\n <DataTable\n columns={tanstackColumns}\n data={rows}\n loading={loading}\n skeletonRows={5}\n emptyMessage={labels.noResults}\n variant=\"card\"\n compact\n />\n </div>\n\n {!loading ? (\n <div className=\"no-print\">\n <ReportPagination\n page={state.page}\n pageSize={state.pageSize}\n total={result?.total ?? 0}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </div>\n ) : null}\n </>\n )\n}\n\nexport function AnalyticsReportViewer({ cardId }: { cardId?: string }) {\n const { labels } = useAnalyticsConfig()\n const cards = useAnalyticsCards()\n const card = cards.find((c) => c.id === decodeURIComponent(cardId ?? ''))\n\n React.useEffect(() => { if (card) markViewed(card.id) }, [card?.id])\n\n if (!card) {\n return (\n <div className=\"space-y-4\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateAnalytics(REPORTS_BASE)}>\n <ArrowLeft className=\"mr-1.5 h-3.5 w-3.5\" />\n {labels.reports}\n </Button>\n <p className=\"py-12 text-center text-sm text-muted-foreground\">{labels.noResults}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {/* O título vive na barra da shell, não no corpo. Escrever \"← Relatórios /\n Nome\" aqui E deixar a rota declarar `parentRoute` produzia três\n cabeçalhos empilhados dizendo a mesma coisa. SubpageHeader reivindica a\n barra com o nome do card — que depende de dado e por isso não cabe em\n `route.title`. */}\n {/* A descrição vai para o (i) do breadcrumb, não para um parágrafo aqui.\n Era uma linha inteira entre o nome do relatório e o número que a\n pessoa abriu a tela para ver — lida uma vez, ruído em todas as\n visitas seguintes. No ícone ela continua a um gesto de distância. */}\n <SubpageHeader\n title={card.name}\n description={card.description}\n parentLabel={labels.analytics}\n onBack={() => navigateAnalytics(ANALYTICS_BASE)}\n />\n\n <AnalyticsControls\n filters={card.query.filters ?? []}\n showCompare={card.compare !== false}\n className=\"no-print\"\n actions={<ViewerActions card={card} />}\n />\n\n <ViewerBody card={card} />\n </div>\n )\n}\n\nfunction ViewerActions({ card }: { card: AnalyticsCardDef }) {\n const { currency, labels } = useAnalyticsConfig()\n const closePanel = useToolbarPanelClose()\n // Imprimir a partir de dentro do painel imprimia o PAINEL: `window.print()`\n // congela o documento como ele está, e como está inclui o popover aberto por\n // cima do relatório. Fecha primeiro, deixa o navegador pintar o quadro sem\n // ele, e só então manda imprimir.\n const print = React.useCallback(() => {\n closePanel()\n requestAnimationFrame(() => {\n requestAnimationFrame(() => window.setTimeout(() => window.print(), 120))\n })\n }, [closePanel])\n const { result } = useAnalyticsCard(card)\n const columns = React.useMemo(() => cardColumns(card), [card])\n // O arquivo leva o relatório INTEIRO, não a página de 50 que está na tela:\n // uma planilha com 50 de 4.000 leads não avisa em lugar nenhum que é um\n // pedaço, e é ela que sai por e-mail como se fosse o mês fechado.\n const fetchAll = useAnalyticsCardRows(card)\n if (!result?.rows?.length) return null\n return (\n <>\n <ExportDropdown\n columns={columns as unknown as ReportColumnDef[]}\n data={result.rows as Record<string, unknown>[]}\n fetchAll={fetchAll as () => Promise<Record<string, any>[]>}\n filename={card.id}\n currency={currency.code}\n title={card.name}\n />\n <ToolbarAction icon={Printer} onClick={print}>{labels.print}</ToolbarAction>\n </>\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ReportPagination.d.ts","sourceRoot":"","sources":["../../src/components/ReportPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,qBAmDhH"}
1
+ {"version":3,"file":"ReportPagination.d.ts","sourceRoot":"","sources":["../../src/components/ReportPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,qBAwBhH"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { exportToPdf } from './chunk-BPTKNPXQ.js';
2
2
  export { exportToPdf } from './chunk-BPTKNPXQ.js';
3
- import { exportToCsv } from './chunk-LB6NOSJU.js';
4
- export { AnalyticsReportViewer, exportToCsv } from './chunk-LB6NOSJU.js';
3
+ import { exportToCsv } from './chunk-VGDOKFED.js';
4
+ export { AnalyticsReportViewer, exportToCsv } from './chunk-VGDOKFED.js';
5
5
  export { AnalyticsModule } from './chunk-67JOMNSD.js';
6
6
  export { AnalyticsOverview } from './chunk-S4MICM4C.js';
7
7
  export { AnalyticsSettingsPage } from './chunk-DTUN4WLI.js';
@@ -897,7 +897,7 @@ function createMockReportProvider() {
897
897
  var AnalyticsModule2 = React.lazy(() => import('./AnalyticsModule-YIH6MDCC.js').then((m) => ({ default: m.AnalyticsModule })));
898
898
  var AnalyticsOverview2 = React.lazy(() => import('./AnalyticsOverview-R3JEMUQL.js').then((m) => ({ default: m.AnalyticsOverview })));
899
899
  var ReportsListPage2 = React.lazy(() => import('./ReportsListPage-7FAKQZ4T.js').then((m) => ({ default: m.ReportsListPage })));
900
- var AnalyticsReportViewer2 = React.lazy(() => import('./AnalyticsReportViewer-U7SDU2LL.js').then((m) => ({ default: m.AnalyticsReportViewer })));
900
+ var AnalyticsReportViewer2 = React.lazy(() => import('./AnalyticsReportViewer-ORI3XI5D.js').then((m) => ({ default: m.AnalyticsReportViewer })));
901
901
  var LiveViewPage = React.lazy(() => import('./LiveViewPage-XMVZHJ3U.js').then((m) => ({ default: m.LiveViewPage })));
902
902
  var AnalyticsSettingsPage2 = React.lazy(() => import('./AnalyticsSettingsPage-XWPM3VSA.js').then((m) => ({ default: m.AnalyticsSettingsPage })));
903
903
  var DEFAULT_LABELS = {
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "status": "preview",
5
5
  "dependencies": []
6
6
  },
7
- "version": "0.16.30",
7
+ "version": "0.16.31",
8
8
  "description": "[experimental] Fayz SDK — plugin-reports plugin",
9
9
  "type": "module",
10
10
  "sideEffects": false,
@@ -34,9 +34,9 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@tanstack/react-table": "^8.20.0",
37
- "@fayz-ai/core": "^0.63.0",
38
- "@fayz-ai/ui": "^0.63.0",
39
- "@fayz-ai/admin": "^0.63.0"
37
+ "@fayz-ai/core": "^0.66.0",
38
+ "@fayz-ai/ui": "^0.66.0",
39
+ "@fayz-ai/admin": "^0.66.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/react": "^18.3.0",
@@ -1,5 +0,0 @@
1
- export { AnalyticsReportViewer } from './chunk-LB6NOSJU.js';
2
- import './chunk-YVLQV4N7.js';
3
- import './chunk-4QIHTUXD.js';
4
- //# sourceMappingURL=AnalyticsReportViewer-U7SDU2LL.js.map
5
- //# sourceMappingURL=AnalyticsReportViewer-U7SDU2LL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/export/csv.ts","../src/components/ExportDropdown.tsx","../src/components/ReportPagination.tsx","../src/views/AnalyticsReportViewer.tsx"],"names":["useTranslation","jsxs","jsx","React","Button","ToolbarAction"],"mappings":"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","file":"chunk-LB6NOSJU.js","sourcesContent":["import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { ReportColumnDef } from '../types'\nimport { expandBagColumns, 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 // Uma coluna por resposta de formulário, não um JSON dentro da célula: é o\n // que deixa a planilha ordenável e filtrável por \"Estilo\".\n const { columns: cols, rows } = expandBagColumns(columns, data)\n const visibleCols = cols.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, rows, filename)\n}\n","import React, { useEffect, useState } from 'react'\nimport { Download } from 'lucide-react'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n ToolbarAction,\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 * Fetch the WHOLE result set. The table on screen is one page of 50, and a\n * file holding 50 of 4,000 rows says nothing about being a fragment — so the\n * export asks for everything before it writes. Absent ⇒ the page is exported.\n */\n fetchAll?: () => Promise<Record<string, any>[]>\n}\n\nexport function ExportDropdown({ columns, data, filename, currency, title, fetchAll }: ExportDropdownProps) {\n const t = useTranslation()\n const [excelAvailable, setExcelAvailable] = useState(false)\n const [pdfAvailable, setPdfAvailable] = useState(false)\n const [busy, setBusy] = 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 // One writer for the three formats: whichever one is picked, the rows come\n // from the same fetch, so a CSV and a PDF of the same report cannot hold\n // different numbers of lines. A failed fetch falls back to the page on\n // screen — a partial file beats a button that does nothing.\n const withRows = async (write: (rows: Record<string, any>[]) => void | Promise<void>) => {\n if (busy) return\n setBusy(true)\n try {\n const rows = fetchAll ? await fetchAll().catch(() => data) : data\n await write(rows.length ? rows : data)\n } finally {\n setBusy(false)\n }\n }\n\n const handleCsv = () => withRows((rows) => exportToCsv(columns, rows, filename, currency))\n\n const handleExcel = () => withRows(async (rows) => {\n const { exportToExcel } = await import('../export/excel')\n await exportToExcel(columns, rows, filename, currency)\n })\n\n const handlePdf = () => withRows(async (rows) => {\n const { exportToPdf } = await import('../export/pdf')\n await exportToPdf(columns, rows, filename, { title, currency })\n })\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n {/* Sem contorno, como o resto da barra — ver ToolbarAction. */}\n <ToolbarAction icon={Download} caret disabled={busy}>{t('reports.export')}</ToolbarAction>\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 from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } 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 // Translated, not literal: this row printed \"1–12 of 12\" and \"50 / page\"\n // under a pt-BR shell, which is the one place a user counts on the app\n // knowing what language it speaks.\n const t = useTranslation()\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 ? t('reports.pagination.range', { from, to, total }) : t('reports.pagination.empty')}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Select value={String(pageSize)} onValueChange={(v) => onPageSizeChange(Number(v))}>\n <SelectTrigger className=\"h-8 w-auto gap-2 bg-card px-2 shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[25, 50, 100].map((size) => (\n <SelectItem key={size} value={String(size)}>{t('reports.pagination.perPage', { size })}</SelectItem>\n ))}\n </SelectContent>\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 { ArrowLeft, Construction, Printer } from 'lucide-react'\nimport {\n Button, SubpageHeader, ToolbarAction, AnalyticsCard, AnalyticsControls,\n useAnalyticsContext, useAnalyticsCard, useAnalyticsCardRows, useAnalyticsAllRows,\n useToolbarPanelClose,\n} from '@fayz-ai/ui'\nimport type { AnalyticsCardDef, AnalyticsRow } from '@fayz-ai/core'\nimport { DataTable, StatementTable, formatBucket } from '@fayz-ai/ui'\nimport { expandBagColumns, reportColumnsToTanstack } from '../lib/columns'\nimport { ExportDropdown } from '../components/ExportDropdown'\nimport { ReportPagination } from '../components/ReportPagination'\nimport type { ReportColumnDef } from '../types'\nimport {\n useAnalyticsConfig, useAnalyticsCards, cardColumns, navigateAnalytics,\n ANALYTICS_BASE, REPORTS_BASE,\n} from './AnalyticsSurface'\nimport { markViewed } from '../lib/lastViewed'\n\n// ---------------------------------------------------------------------------\n// A report, full size.\n//\n// The chart is not decoration bolted onto a table: it is the SAME card that\n// renders as a tile on the overview, given the whole width. Underneath sits the\n// data it was computed from — so \"show me the number\" and \"show me the rows\n// behind the number\" stop being two different features in two different places.\n// ---------------------------------------------------------------------------\n\nfunction ViewerBody({ card }: { card: AnalyticsCardDef }) {\n const { labels, currency, defaultRange } = useAnalyticsConfig()\n const { state, setPage, setPageSize, setPreset } = useAnalyticsContext()\n const cardDefaultRange = (card as AnalyticsCardDef & { defaultRange?: typeof defaultRange }).defaultRange\n React.useEffect(() => {\n if (!cardDefaultRange) return\n setPreset(cardDefaultRange)\n return () => setPreset(defaultRange)\n }, [card.id, cardDefaultRange, defaultRange, setPreset])\n const isStatement = card.viz.type === 'statement' && !!card.viz.statement\n // Same query as the chart above and the export below — the provider\n // de-duplicates them into one round trip.\n // A statement reads the whole set below. Running the paged card query too\n // executed the same heavy DRE twice and made both requests hit the timeout.\n const { result, loading, error, engineMissing } = useAnalyticsCard(card, { enabled: !isStatement })\n // Um demonstrativo lê o CONJUNTO, nunca a página — ver `useAnalyticsAllRows`.\n const all = useAnalyticsAllRows(card, isStatement && card.available !== false)\n\n const columns = React.useMemo(() => cardColumns(card), [card])\n // As respostas do formulário viram COLUNAS de verdade — \"Estilo\", \"Perfil\" —\n // descobertas nas linhas desta página, porque cada campanha pergunta outra\n // coisa e declarar as colunas no card tornaria o próximo formulário\n // invisível. Mesma expansão que a planilha usa, então tela e arquivo mostram\n // as mesmas colunas.\n const expanded = React.useMemo(\n () => expandBagColumns(columns as unknown as ReportColumnDef[], (result?.rows ?? []) as Record<string, any>[]),\n [columns, result?.rows],\n )\n const tanstackColumns = React.useMemo(\n () => reportColumnsToTanstack(expanded.columns, currency.code),\n [expanded.columns, currency.code],\n )\n const rows = expanded.rows\n\n if (card.available === false) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed py-16 text-center\">\n <div className=\"mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{labels.unavailableTitle}</p>\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{labels.unavailableDescription}</p>\n </div>\n )\n }\n\n // A pure detail listing has nothing to chart — rendering an empty card frame\n // above the table would be chrome pretending to be information.\n const hasViz = card.viz.type !== 'table' || (card.query.measures?.length ?? 0) > 0\n\n // Um demonstrativo JÁ É a tela inteira. Repetir as mesmas linhas embaixo como\n // grade plana daria duas respostas para a mesma pergunta — e a de baixo, sem\n // hierarquia nem totalizadores, é a pior das duas.\n if (isStatement && card.viz.statement) {\n return (\n <>\n {engineMissing ? (\n <div className=\"rounded-lg border bg-muted/40 p-3 text-sm\">\n <p className=\"font-medium\">Analytics engine not installed</p>\n <p className=\"mt-0.5 text-muted-foreground\">\n This report aggregates server-side and needs migration 0039\n (<code className=\"text-xs\">analytics_run</code> + the read models) applied to this project.\n </p>\n </div>\n ) : (error ?? all.error) ? (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error ?? all.error}\n </div>\n ) : null}\n <StatementTable\n rows={all.rows}\n def={card.viz.statement}\n currency={currency}\n formatPeriod={(p) => formatBucket(p, 'month')}\n emptyMessage={labels.noResults}\n loading={all.loading}\n />\n </>\n )\n }\n\n return (\n <>\n {hasViz ? (\n <AnalyticsCard\n card={{ ...card, viz: { ...card.viz, height: card.viz.height ?? 280, limit: undefined } }}\n hideOpen\n />\n ) : null}\n\n {engineMissing ? (\n <div className=\"rounded-lg border bg-muted/40 p-3 text-sm\">\n <p className=\"font-medium\">Analytics engine not installed</p>\n <p className=\"mt-0.5 text-muted-foreground\">\n This report aggregates server-side and needs migration 0039\n (<code className=\"text-xs\">analytics_run</code> + the read models) applied to this project.\n </p>\n </div>\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 ) : null}\n\n {/* `print-flow`: sem ele a regra de cartão (`break-inside: avoid`) prende a\n tabela inteira numa página e o resto do relatório não sai no papel. */}\n <div className=\"print-flow\">\n <DataTable\n columns={tanstackColumns}\n data={rows}\n loading={loading}\n skeletonRows={5}\n emptyMessage={labels.noResults}\n variant=\"card\"\n compact\n />\n </div>\n\n {!loading ? (\n <div className=\"no-print\">\n <ReportPagination\n page={state.page}\n pageSize={state.pageSize}\n total={result?.total ?? 0}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </div>\n ) : null}\n </>\n )\n}\n\nexport function AnalyticsReportViewer({ cardId }: { cardId?: string }) {\n const { labels } = useAnalyticsConfig()\n const cards = useAnalyticsCards()\n const card = cards.find((c) => c.id === decodeURIComponent(cardId ?? ''))\n\n React.useEffect(() => { if (card) markViewed(card.id) }, [card?.id])\n\n if (!card) {\n return (\n <div className=\"space-y-4\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateAnalytics(REPORTS_BASE)}>\n <ArrowLeft className=\"mr-1.5 h-3.5 w-3.5\" />\n {labels.reports}\n </Button>\n <p className=\"py-12 text-center text-sm text-muted-foreground\">{labels.noResults}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {/* O título vive na barra da shell, não no corpo. Escrever \"← Relatórios /\n Nome\" aqui E deixar a rota declarar `parentRoute` produzia três\n cabeçalhos empilhados dizendo a mesma coisa. SubpageHeader reivindica a\n barra com o nome do card — que depende de dado e por isso não cabe em\n `route.title`. */}\n {/* A descrição vai para o (i) do breadcrumb, não para um parágrafo aqui.\n Era uma linha inteira entre o nome do relatório e o número que a\n pessoa abriu a tela para ver — lida uma vez, ruído em todas as\n visitas seguintes. No ícone ela continua a um gesto de distância. */}\n <SubpageHeader\n title={card.name}\n description={card.description}\n parentLabel={labels.analytics}\n onBack={() => navigateAnalytics(ANALYTICS_BASE)}\n />\n\n <AnalyticsControls\n filters={card.query.filters ?? []}\n showCompare={card.compare !== false}\n className=\"no-print\"\n actions={<ViewerActions card={card} />}\n />\n\n <ViewerBody card={card} />\n </div>\n )\n}\n\nfunction ViewerActions({ card }: { card: AnalyticsCardDef }) {\n const { currency, labels } = useAnalyticsConfig()\n const closePanel = useToolbarPanelClose()\n // Imprimir a partir de dentro do painel imprimia o PAINEL: `window.print()`\n // congela o documento como ele está, e como está inclui o popover aberto por\n // cima do relatório. Fecha primeiro, deixa o navegador pintar o quadro sem\n // ele, e só então manda imprimir.\n const print = React.useCallback(() => {\n closePanel()\n requestAnimationFrame(() => {\n requestAnimationFrame(() => window.setTimeout(() => window.print(), 120))\n })\n }, [closePanel])\n const { result } = useAnalyticsCard(card)\n const columns = React.useMemo(() => cardColumns(card), [card])\n // O arquivo leva o relatório INTEIRO, não a página de 50 que está na tela:\n // uma planilha com 50 de 4.000 leads não avisa em lugar nenhum que é um\n // pedaço, e é ela que sai por e-mail como se fosse o mês fechado.\n const fetchAll = useAnalyticsCardRows(card)\n if (!result?.rows?.length) return null\n return (\n <>\n <ExportDropdown\n columns={columns as unknown as ReportColumnDef[]}\n data={result.rows as Record<string, unknown>[]}\n fetchAll={fetchAll as () => Promise<Record<string, any>[]>}\n filename={card.id}\n currency={currency.code}\n title={card.name}\n />\n <ToolbarAction icon={Printer} onClick={print}>{labels.print}</ToolbarAction>\n </>\n )\n}\n"]}