@actionexec/dashboards 0.6.0 → 0.7.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/dist/{ColorPaletteSelector-Bsda66uL.js → ColorPaletteSelector-BSAe2YMH.js} +230 -202
- package/dist/ColorPaletteSelector-BSAe2YMH.js.map +1 -0
- package/dist/Dashboard.d.ts +26 -7
- package/dist/hooks/useGridGeometry.d.ts +22 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +502 -400
- package/dist/index.js.map +1 -1
- package/dist/internals.d.ts +2 -0
- package/dist/internals.js +45 -35
- package/dist/styles.css +1 -1
- package/dist/utils/grid.d.ts +77 -0
- package/package.json +1 -1
- package/dist/ColorPaletteSelector-Bsda66uL.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/hooks/useDashboardData.ts","../src/widgets/KPIWidget.tsx","../src/widgets/GaugeWidget.tsx","../src/widgets/ChartWidget.tsx","../src/widgets/TableWidget.tsx","../src/widgets/FilterWidget.tsx","../src/widgets/VariableWidget.tsx","../src/widgets/ColorPaletteWidget.tsx","../src/widgets/WidgetRenderer.tsx","../src/Dashboard.tsx"],"sourcesContent":["// Purpose: Hook que gerencia estado + fetch de um dashboard inteiro.\r\n// Scope: Carrega layout uma vez + render com debounce quando filtros/variaveis mudam.\r\n// Sincroniza estado local com os defaults aplicados pelo backend na 1a carga.\r\n// Public API: useDashboardData\r\n\r\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\r\nimport { fetchLayout, fetchRender } from '../api/fetcher';\r\nimport type { LayoutResponse, RenderResponse } from '../types';\r\nimport { MULTI_VALUE_SEPARATOR } from '../types';\r\n\r\nexport interface UseDashboardDataResult {\r\n layout: LayoutResponse | null;\r\n renderData: RenderResponse | null;\r\n loading: boolean;\r\n error: string | null;\r\n /** Filtros selecionados (formato string por widget — date_range como \"start|end\"). */\r\n filters: Record<string, string>;\r\n /** Overrides de variaveis por widget. */\r\n variables: Record<string, number>;\r\n /** Paleta efetiva (override local substitui a do layout). */\r\n palette: string[];\r\n setFilter(widgetId: string, value: string): void;\r\n setVariable(widgetId: string, value: number): void;\r\n setPalette(colors: string[]): void;\r\n}\r\n\r\nconst DEBOUNCE_MS = 300;\r\n\r\nexport function useDashboardData(token: string): UseDashboardDataResult {\r\n const [layout, setLayout] = useState<LayoutResponse | null>(null);\r\n const [renderData, setRenderData] = useState<RenderResponse | null>(null);\r\n const [filters, setFilters] = useState<Record<string, string>>({});\r\n const [variables, setVariables] = useState<Record<string, number>>({});\r\n const [localPalette, setLocalPalette] = useState<string[] | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\r\n const appliedSyncedRef = useRef(false);\r\n\r\n // -------Carrega layout uma unica vez (por token)-------\r\n useEffect(() => {\r\n let cancelled = false;\r\n fetchLayout(token)\r\n .then((res) => { if (!cancelled) setLayout(res); })\r\n .catch((err: Error) => { if (!cancelled) setError(err.message); });\r\n return () => { cancelled = true; };\r\n }, [token]);\r\n\r\n // -------Render com debounce quando filtros/variaveis mudam-------\r\n useEffect(() => {\r\n if (!layout) return;\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n\r\n debounceRef.current = setTimeout(() => {\r\n const params = buildQueryParams(filters, variables);\r\n setLoading(true);\r\n fetchRender(token, params)\r\n .then((res) => {\r\n setRenderData(res);\r\n if (!appliedSyncedRef.current && res.applied) {\r\n appliedSyncedRef.current = true;\r\n setFilters((prev) => ({ ...syncFiltersFromApplied(res.applied), ...prev }));\r\n }\r\n setError(null);\r\n })\r\n .catch((err: Error) => setError(err.message))\r\n .finally(() => setLoading(false));\r\n }, DEBOUNCE_MS);\r\n\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n };\r\n }, [token, layout, filters, variables]);\r\n\r\n const setFilter = useCallback((widgetId: string, value: string) => {\r\n setFilters((prev) => ({ ...prev, [widgetId]: value }));\r\n }, []);\r\n\r\n const setVariable = useCallback((widgetId: string, value: number) => {\r\n setVariables((prev) => ({ ...prev, [widgetId]: value }));\r\n }, []);\r\n\r\n const setPalette = useCallback((colors: string[]) => {\r\n setLocalPalette(colors);\r\n }, []);\r\n\r\n const palette = useMemo(\r\n () => localPalette ?? layout?.palette ?? [],\r\n [localPalette, layout],\r\n );\r\n\r\n return {\r\n layout, renderData, loading, error,\r\n filters, variables, palette,\r\n setFilter, setVariable, setPalette,\r\n };\r\n}\r\n\r\n// -------Helpers-------\r\n\r\n/** Constroi query params no formato esperado pela API (/render). */\r\nfunction buildQueryParams(\r\n filters: Record<string, string>,\r\n variables: Record<string, number>,\r\n): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n for (const [key, val] of Object.entries(filters)) {\r\n if (val.includes('|')) {\r\n const [start, end] = val.split('|');\r\n if (start) params['f_date_start'] = start;\r\n if (end) params['f_date_end'] = end;\r\n } else {\r\n params[`f_${key}`] = val;\r\n }\r\n }\r\n\r\n for (const [key, val] of Object.entries(variables)) {\r\n params[`v_${key}`] = String(val);\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/** Converte `applied` do backend para o formato local de filtros. */\r\nfunction syncFiltersFromApplied(applied: Record<string, unknown>): Record<string, string> {\r\n const synced: Record<string, string> = {};\r\n for (const [id, val] of Object.entries(applied)) {\r\n if (val && typeof val === 'object' && 'start' in val) {\r\n const d = val as { start?: string; end?: string };\r\n synced[id] = `${d.start || ''}|${d.end || ''}`;\r\n } else if (Array.isArray(val)) {\r\n synced[id] = val.join(MULTI_VALUE_SEPARATOR);\r\n } else if (typeof val === 'string') {\r\n synced[id] = val;\r\n }\r\n }\r\n return synced;\r\n}\r\n","// Purpose: KPI card com valor computado + comparacao.\n// Scope: Renderiza label, valor formatado, seta de trend, variance.\n// Public API: KPIWidget\n\ninterface Props {\n data: Record<string, unknown>;\n label?: string;\n}\n\nexport function KPIWidget({ data, label }: Props) {\n const displayLabel = label || String(data.label || '');\n const formatted = String(data.formatted || '-');\n const comparison = data.comparison as {\n previous_value?: number | null;\n variance_pct?: number | null;\n trend?: string | null;\n label?: string | null;\n } | null;\n\n const trendClass = comparison?.trend === 'up'\n ? 'widget-kpi__trend--up'\n : comparison?.trend === 'down'\n ? 'widget-kpi__trend--down'\n : '';\n\n const arrow = comparison?.trend === 'up' ? '↑' : comparison?.trend === 'down' ? '↓' : '';\n\n return (\n <div className=\"widget widget-kpi\">\n <span className=\"widget-kpi__label\">{displayLabel}</span>\n <span className=\"widget-kpi__value\">{formatted}</span>\n {comparison && comparison.variance_pct != null && (\n <div className={`widget-kpi__trend ${trendClass}`}>\n <span className=\"widget-kpi__variance\">\n {arrow} {comparison.variance_pct > 0 ? '+' : ''}{comparison.variance_pct.toFixed(1)}%\n </span>\n {comparison.label && (\n <span className=\"widget-kpi__trend-label\">{comparison.label}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Purpose: Gauge widget (progresso vs meta).\n// Scope: Semicirculo SVG com percentual, valores brutos e indicador de meta batida.\n// Public API: GaugeWidget\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nconst COLOR_EMPTY = 'var(--bg-elevated)';\n\n/** Gera path SVG de um arco semicircular (de esquerda para direita, no topo). */\nfunction arcPath(cx: number, cy: number, r: number, fraction: number): string {\n if (fraction <= 0) return '';\n if (fraction >= 1) {\n // Semicirculo completo: dois arcos de 90° (SVG nao desenha arco de exatamente 180°)\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${cx} ${cy - r} A ${r} ${r} 0 0 1 ${cx + r} ${cy}`;\n }\n const angle = fraction * Math.PI;\n const endX = cx - r * Math.cos(angle);\n const endY = cy - r * Math.sin(angle);\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${endX} ${endY}`;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n return value.toLocaleString('pt-BR');\n}\n\nexport function GaugeWidget({ data, palette, label: propLabel }: Props) {\n const label = propLabel || String(data.label || '');\n const rawValue = typeof data.value === 'number' ? data.value : null;\n const valueFormatted = rawValue != null ? formatCompact(rawValue) : '-';\n const formatted = String(data.formatted || '-');\n const ratio = typeof data.ratio === 'number' ? data.ratio : 0;\n const targetValue = data.target_value as number | null;\n\n const comparisonLabel = data.comparison_label as string | null;\n const exceeded = ratio >= 1;\n const clamped = Math.min(Math.max(ratio, 0), 1);\n\n const fillColor = exceeded\n ? 'var(--action-green)'\n : ratio >= 0.7\n ? (palette[0] || 'var(--color-info)')\n : ratio >= 0.4\n ? 'var(--color-warning)'\n : 'var(--color-error)';\n\n const targetFormatted = targetValue != null ? formatCompact(targetValue) : '-';\n\n const cx = 50, cy = 50, r = 44, stroke = 10;\n\n return (\n <div className=\"widget widget-gauge\">\n <span className=\"widget-gauge__label\">{label}</span>\n <div className=\"widget-gauge__chart\">\n <svg viewBox=\"0 0 100 56\" preserveAspectRatio=\"xMidYMax meet\">\n <path d={arcPath(cx, cy, r, 1)} fill=\"none\" stroke={COLOR_EMPTY} strokeWidth={stroke} strokeLinecap=\"butt\" />\n {clamped > 0 && (\n <path d={arcPath(cx, cy, r, clamped)} fill=\"none\" stroke={fillColor} strokeWidth={stroke} strokeLinecap=\"butt\" />\n )}\n </svg>\n <div className=\"widget-gauge__center\">\n <span className=\"widget-gauge__percent\">{formatted}</span>\n <span className=\"widget-gauge__comparison\">{valueFormatted} / {targetFormatted}</span>\n {exceeded && <span className=\"widget-gauge__badge\">{comparisonLabel || 'Meta batida'}</span>}\n {!exceeded && comparisonLabel && <span className=\"widget-gauge__comparison\">{comparisonLabel}</span>}\n </div>\n </div>\n </div>\n );\n}\n","// Purpose: Chart widget (bar/line/area/pie via Recharts).\r\n// Scope: Renderiza com dados pre-calculados pelo backend + tooltip tematizado.\r\n// Public API: ChartWidget\r\n\r\nimport { useRef, useState, useEffect, type ComponentType, type ReactElement } from 'react';\r\nimport {\r\n BarChart, Bar,\r\n LineChart, Line,\r\n AreaChart, Area,\r\n PieChart, Pie, Cell,\r\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\r\n} from 'recharts';\r\n\r\nconst AXIS_STYLE = { fontSize: 10, fill: 'var(--text-muted)' };\r\nconst GRID_STROKE = 'var(--bg-elevated)';\r\n\r\n// Tooltip segue a paleta do dashboard via CSS variables (getPaletteCssVars)\r\nconst TOOLTIP_CONTENT_STYLE = {\r\n backgroundColor: 'var(--bg-elevated)',\r\n border: '1px solid var(--bg-paper)',\r\n borderRadius: '6px',\r\n color: 'var(--text-primary)',\r\n};\r\nconst TOOLTIP_LABEL_STYLE = {\r\n color: 'var(--text-primary)',\r\n fontWeight: 600,\r\n};\r\n\r\n// Usa `tooltipLabel` (versao verbose) do data point quando presente,\r\n// fallback para o label do eixo X (compacto).\r\nfunction tooltipLabelFormatter(label: unknown, payload: readonly unknown[]): string {\r\n const first = (Array.isArray(payload) ? payload[0] : undefined) as { payload?: Record<string, unknown> } | undefined;\r\n const verbose = first?.payload?.tooltipLabel;\r\n if (typeof verbose === 'string' && verbose) return verbose;\r\n return String(label ?? '');\r\n}\r\n\r\ninterface SeriesInfo { key: string; label: string }\r\n\r\n// Hook para medir dimensoes do container via ResizeObserver\r\nfunction useContainerSize(ref: React.RefObject<HTMLDivElement | null>) {\r\n const [size, setSize] = useState({ width: 0, height: 0 });\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const observer = new ResizeObserver(([entry]) => {\r\n const { width, height } = entry.contentRect;\r\n setSize((prev) =>\r\n prev.width !== Math.floor(width) || prev.height !== Math.floor(height)\r\n ? { width: Math.floor(width), height: Math.floor(height) }\r\n : prev\r\n );\r\n });\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [ref]);\r\n\r\n return size;\r\n}\r\n\r\n// Componente generico para charts cartesianos (bar/line/area)\r\nfunction CartesianChart({ Chart, chartData, xKey, series, palette, renderSeries, width, height }: {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n Chart: ComponentType<any>;\r\n chartData: Record<string, unknown>[];\r\n xKey: string;\r\n series: SeriesInfo[];\r\n palette: string[];\r\n renderSeries: (s: SeriesInfo, color: string, idx: number) => ReactElement;\r\n width: number;\r\n height: number;\r\n}) {\r\n return (\r\n <Chart data={chartData} width={width} height={height}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\r\n <XAxis dataKey={xKey} tick={AXIS_STYLE} />\r\n <YAxis tick={AXIS_STYLE} />\r\n <Tooltip\r\n contentStyle={TOOLTIP_CONTENT_STYLE}\r\n labelStyle={TOOLTIP_LABEL_STYLE}\r\n labelFormatter={tooltipLabelFormatter}\r\n cursor={{ fill: 'var(--bg-paper)', opacity: 0.3 }}\r\n />\r\n {series.length > 1 && <Legend />}\r\n {series.map((s, i) => renderSeries(s, palette[i % palette.length], i))}\r\n </Chart>\r\n );\r\n}\r\n\r\ninterface Props {\r\n data: Record<string, unknown>;\r\n palette: string[];\r\n label?: string;\r\n}\r\n\r\nexport function ChartWidget({ data, palette, label: propLabel }: Props) {\r\n const chartType = String(data.chartType || 'bar');\r\n const title = propLabel || String(data.label || '');\r\n const xKey = String(data.xKey || 'label');\r\n const series = (data.series || []) as SeriesInfo[];\r\n const chartData = (data.data || []) as Record<string, unknown>[];\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const { width, height } = useContainerSize(containerRef);\r\n\r\n const renderChart = () => {\r\n if (width <= 0 || height <= 0) return null;\r\n\r\n if (chartType === 'pie') {\r\n return (\r\n <PieChart width={width} height={height}>\r\n <Pie\r\n data={chartData}\r\n dataKey={series[0]?.key || 's0'}\r\n nameKey={xKey}\r\n cx=\"50%\" cy=\"50%\" outerRadius=\"75%\"\r\n label={({ name, percent }: { name: string; percent: number }) =>\r\n `${name}: ${(percent * 100).toFixed(0)}%`\r\n }\r\n labelLine={false}\r\n >\r\n {chartData.map((_, i) => (\r\n <Cell key={i} fill={palette[i % palette.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={TOOLTIP_CONTENT_STYLE}\r\n labelStyle={TOOLTIP_LABEL_STYLE}\r\n labelFormatter={tooltipLabelFormatter}\r\n />\r\n </PieChart>\r\n );\r\n }\r\n\r\n const common = { chartData, xKey, series, palette, width, height };\r\n\r\n if (chartType === 'line') {\r\n return (\r\n <CartesianChart {...common} Chart={LineChart} renderSeries={(s, color) => (\r\n <Line key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\r\n stroke={color} strokeWidth={2} dot={chartData.length <= 31} />\r\n )} />\r\n );\r\n }\r\n\r\n if (chartType === 'area') {\r\n return (\r\n <CartesianChart {...common} Chart={AreaChart} renderSeries={(s, color) => (\r\n <Area key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\r\n fill={color} stroke={color} fillOpacity={0.3} />\r\n )} />\r\n );\r\n }\r\n\r\n return (\r\n <CartesianChart {...common} Chart={BarChart} renderSeries={(s, color) => (\r\n <Bar key={s.key} dataKey={s.key} name={s.label}\r\n fill={color} radius={[3, 3, 0, 0]} />\r\n )} />\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"widget widget-chart\">\r\n {title && <h4 className=\"widget-chart__title\">{title}</h4>}\r\n {/* Container sempre montado: mantem o ResizeObserver atado ao mesmo elemento\r\n mesmo no estado vazio, evitando que o grafico nao remonte ao voltar dados. */}\r\n <div ref={containerRef} className=\"widget-chart__container\">\r\n {chartData.length === 0\r\n ? <div className=\"widget-chart__empty\">Sem dados</div>\r\n : renderChart()}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// Purpose: Widget de tabela — mostra linhas x colunas do dataset.\r\n// Scope: Renderiza data.columns (cabecalho) + data.rows (linhas), formatando cada\r\n// celula pelo format da coluna. Colore colunas de porcentagem (verde/vermelho).\r\n// Com data.tabs ({label, rows}[]), renderiza barra de abas que troca as linhas\r\n// sem refetch (todas as abas chegam computadas do backend).\r\n// Public API: TableWidget\r\n\r\nimport { useState } from 'react';\r\n\r\ninterface TableColumn {\r\n key: string;\r\n label?: string;\r\n format?: string;\r\n}\r\n\r\ninterface TableTab {\r\n label: string;\r\n rows: Record<string, unknown>[];\r\n}\r\n\r\ninterface Props {\r\n data: Record<string, unknown>;\r\n label?: string;\r\n}\r\n\r\nfunction formatCell(value: unknown, format?: string): string {\r\n if (value === null || value === undefined || value === '') return '-';\r\n const n = typeof value === 'number' ? value : Number(value);\r\n const isNum = value !== '' && !Number.isNaN(n);\r\n switch (format) {\r\n case 'currency':\r\n return isNum ? n.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }) : String(value);\r\n case 'integer':\r\n return isNum ? Math.round(n).toLocaleString('pt-BR') : String(value);\r\n case 'number':\r\n return isNum ? n.toLocaleString('pt-BR', { maximumFractionDigits: 1 }) : String(value);\r\n case 'percentage':\r\n return isNum ? `${n > 0 ? '+' : ''}${Math.round(n)}%` : String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nexport function TableWidget({ data, label }: Props) {\r\n const [activeTab, setActiveTab] = useState(0);\r\n const columns = (data.columns as TableColumn[]) || [];\r\n const tabs = (data.tabs as TableTab[]) || [];\r\n const hasTabs = tabs.length > 0;\r\n const rows = hasTabs\r\n ? tabs[Math.min(activeTab, tabs.length - 1)]?.rows || []\r\n : (data.rows as Record<string, unknown>[]) || [];\r\n const displayLabel = label || String(data.label || '');\r\n\r\n if (columns.length === 0) {\r\n return (\r\n <div className=\"widget widget-table\">\r\n {displayLabel && <span className=\"widget-table__label\">{displayLabel}</span>}\r\n <span className=\"widget-table__empty\">Configure as colunas da tabela.</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"widget widget-table\">\r\n {displayLabel && <span className=\"widget-table__label\">{displayLabel}</span>}\r\n {hasTabs && (\r\n <div className=\"widget-table__tabs\" role=\"tablist\">\r\n {tabs.map((tab, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={i === activeTab}\r\n className={`widget-table__tab${i === activeTab ? ' widget-table__tab--active' : ''}`}\r\n onClick={() => setActiveTab(i)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <div className=\"widget-table__scroll\">\r\n <table className=\"widget-table__table\">\r\n <thead>\r\n <tr>\r\n {columns.map((c) => {\r\n const numeric = !!c.format && c.format !== 'text';\r\n return (\r\n <th key={c.key} className={`widget-table__th${numeric ? ' widget-table__th--num' : ''}`}>\r\n {c.label || c.key}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr>\r\n <td className=\"widget-table__td widget-table__empty\" colSpan={columns.length}>Sem dados</td>\r\n </tr>\r\n ) : (\r\n rows.map((row, i) => (\r\n <tr key={i}>\r\n {columns.map((c) => {\r\n const raw = row[c.key];\r\n const numeric = !!c.format && c.format !== 'text';\r\n let trend = '';\r\n if (c.format === 'percentage') {\r\n const num = Number(raw);\r\n if (!Number.isNaN(num)) trend = num > 0 ? ' widget-table__td--up' : num < 0 ? ' widget-table__td--down' : '';\r\n }\r\n return (\r\n <td key={c.key} className={`widget-table__td${numeric ? ' widget-table__td--num' : ''}${trend}`}>\r\n {formatCell(raw, c.format)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// Purpose: Widget de filtro interativo no grid (date_range, select, multi_select).\r\n// Scope: Modos temporais (range, monthly, weekly, yearly), select unico, multi-select.\r\n// Modo categorico padrao (select/checkbox) ou lista com busca (searchable).\r\n// Public API: FilterWidget\r\n\r\nimport type { FilterConfig, DateFilterMode } from '../types';\r\nimport {\r\n MONTH_NAMES_SHORT, getFullYearRange, getMonthRange,\r\n getMonthWeeks, parseMonthWeekFromRange,\r\n parseYearFromRange, parseMonthFromRange, getYearRange,\r\n} from '../utils/date';\r\nimport { DashboardDatePicker } from '../components/DashboardDatePicker';\r\nimport { SearchableSelect } from '../components/SearchableSelect';\r\nimport { MULTI_VALUE_SEPARATOR } from '../types';\r\n\r\ninterface Props {\r\n config: FilterConfig;\r\n value: string;\r\n options?: string[];\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}\r\n\r\n// -------Componente principal-------\r\n\r\nexport function FilterWidget({ config, value, options = [], dateBounds, onChange }: Props) {\r\n const filterType = config.filterType || 'select';\r\n const label = config.label || 'Filtro';\r\n const dateMode: DateFilterMode = config.dateFilterMode || 'range';\r\n\r\n return (\r\n <div className=\"widget-filter\">\r\n <label className=\"widget-filter__label\">{label}</label>\r\n {filterType === 'date_range' ? (\r\n dateMode === 'yearly' ? (\r\n <YearlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : dateMode === 'monthly' ? (\r\n <MonthlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : dateMode === 'weekly' ? (\r\n <WeeklyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : (\r\n <DateRangeFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n )\r\n ) : (\r\n <SelectFilter\r\n value={value}\r\n options={options}\r\n multi={filterType === 'multi_select'}\r\n searchable={config.searchable || false}\r\n onChange={onChange}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// -------DateRangeFilter (modo range puro)-------\r\n\r\nfunction DateRangeFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start, end] = value ? value.split('|') : ['', ''];\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--stacked\">\r\n <DashboardDatePicker\r\n value={start}\r\n minIso={dateBounds?.min}\r\n maxIso={end || dateBounds?.max}\r\n selectsStart\r\n startIso={start}\r\n endIso={end}\r\n placeholder=\"Data inicial\"\r\n onChange={(iso) => onChange(`${iso}|${end}`)}\r\n />\r\n <DashboardDatePicker\r\n value={end}\r\n minIso={start || dateBounds?.min}\r\n maxIso={dateBounds?.max}\r\n selectsEnd\r\n startIso={start}\r\n endIso={end}\r\n placeholder=\"Data final\"\r\n onChange={(iso) => onChange(`${start}|${iso}`)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n// -------YearlyFilter (modo anual)-------\r\n\r\nfunction YearlyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseYearFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const years = getYearRange(dateBounds);\r\n\r\n const handleYearChange = (year: number) => {\r\n const yr = getFullYearRange(year);\r\n onChange(`${yr.start}|${yr.end}`);\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--year\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => handleYearChange(parseInt(e.target.value))}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------MonthlyFilter (modo mensal)-------\r\n\r\nfunction MonthlyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseMonthFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\r\n const years = getYearRange(dateBounds);\r\n\r\n const handleMonthChange = (year: number, month: number) => {\r\n const range = getMonthRange(year, month);\r\n onChange(`${range.start}|${range.end}`);\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--month\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedMonth}\r\n onChange={(e) => handleMonthChange(selectedYear, parseInt(e.target.value))}\r\n >\r\n {MONTH_NAMES_SHORT.map((name, i) => (\r\n <option key={i + 1} value={i + 1}>{name}</option>\r\n ))}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => handleMonthChange(parseInt(e.target.value), selectedMonth)}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------WeeklyFilter (modo semanal)-------\r\n\r\nfunction WeeklyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseMonthFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\r\n const years = getYearRange(dateBounds);\r\n\r\n const monthWeeks = getMonthWeeks(selectedYear, selectedMonth);\r\n const selectedWeekIdx = parseMonthWeekFromRange(start, selectedYear, selectedMonth) || 1;\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--week\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => {\r\n const y = parseInt(e.target.value);\r\n const weeks = getMonthWeeks(y, selectedMonth);\r\n const w = weeks[0];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedMonth}\r\n onChange={(e) => {\r\n const m = parseInt(e.target.value);\r\n const weeks = getMonthWeeks(selectedYear, m);\r\n const w = weeks[0];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {MONTH_NAMES_SHORT.map((name, i) => (\r\n <option key={i + 1} value={i + 1}>{name}</option>\r\n ))}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedWeekIdx}\r\n onChange={(e) => {\r\n const w = monthWeeks[parseInt(e.target.value) - 1];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {monthWeeks.map((w) => (\r\n <option key={w.index} value={w.index}>{w.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------SelectFilter (categorico)-------\r\n\r\nfunction SelectFilter({ value, options, multi, searchable, onChange }: {\r\n value: string;\r\n options: string[];\r\n multi: boolean;\r\n searchable: boolean;\r\n onChange: (value: string) => void;\r\n}) {\r\n // Modo lista com busca: unico componente cobre selecao unica e multipla\r\n if (searchable) {\r\n return (\r\n <SearchableSelect\r\n value={value}\r\n options={options}\r\n multi={multi}\r\n onChange={onChange}\r\n />\r\n );\r\n }\r\n\r\n if (multi) {\r\n const selected = value ? value.split(MULTI_VALUE_SEPARATOR) : [];\r\n const toggle = (opt: string) => {\r\n const next = selected.includes(opt)\r\n ? selected.filter((s) => s !== opt)\r\n : [...selected, opt];\r\n onChange(next.join(MULTI_VALUE_SEPARATOR));\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__multi\">\r\n {/* Limpar filtro: desmarca tudo. Vazio = todos selecionados (sem filtro). */}\r\n {selected.length > 0 && (\r\n <button\r\n type=\"button\"\r\n className=\"widget-filter__multi-clear\"\r\n onClick={() => onChange('')}\r\n >\r\n Limpar filtro\r\n </button>\r\n )}\r\n {options.map((opt) => (\r\n <label key={opt} className=\"widget-filter__multi-option\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selected.includes(opt)}\r\n onChange={() => toggle(opt)}\r\n />\r\n {opt}\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <select\r\n className=\"widget-filter__select\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n >\r\n <option value=\"\">Todos</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>{opt}</option>\r\n ))}\r\n </select>\r\n );\r\n}\r\n","// Purpose: Widget de variavel editavel no grid (what-if scenarios).\n// Scope: Input numerico com label, formato e opcao de bloqueio.\n// Public API: VariableWidget\n\nimport type { VariableConfig } from '../types';\n\ninterface Props {\n config: VariableConfig;\n value: number;\n onChange: (value: number) => void;\n}\n\nconst FORMAT_SUFFIX: Record<string, string> = {\n currency: 'R$',\n percentage: '%',\n};\n\nexport function VariableWidget({ config, value, onChange }: Props) {\n const label = config.label || 'Variavel';\n const locked = config.locked || false;\n const fmt = config.variableFormat || 'number';\n const suffix = FORMAT_SUFFIX[fmt] || '';\n\n return (\n <div className={`widget-variable ${locked ? 'widget-variable--locked' : ''}`}>\n <label className=\"widget-variable__label\">{label}</label>\n <div className=\"widget-variable__input-wrapper\">\n <input\n className=\"widget-variable__input\"\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n disabled={locked}\n step={fmt === 'integer' ? 1 : 0.01}\n />\n {suffix && <span className=\"widget-variable__suffix\">{suffix}</span>}\n </div>\n {locked && <span className=\"widget-variable__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Widget de paleta de cores editavel no grid.\n// Scope: Permite ao usuario do dashboard trocar a paleta em runtime. Respeita bloqueio.\n// Public API: ColorPaletteWidget\n\nimport type { PaletteConfig } from '../types';\nimport { ColorPaletteSelector } from '../components/ColorPaletteSelector';\n\ninterface Props {\n config: PaletteConfig;\n palette: string[];\n onChange: (colors: string[]) => void;\n}\n\nexport function ColorPaletteWidget({ config, palette, onChange }: Props) {\n const label = config.label || 'Cores';\n const locked = config.locked || false;\n\n return (\n <div className={`widget-palette ${locked ? 'widget-palette--locked' : ''}`}>\n <label className=\"widget-palette__label\">{label}</label>\n <ColorPaletteSelector selected={palette} onSelect={onChange} customMode disabled={locked} />\n {locked && <span className=\"widget-palette__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Dispatch de rendering por tipo de widget (dados + controle).\r\n// Scope: Recebe computed data e/ou config, renderiza widget correto.\r\n// Public API: WidgetRenderer\r\n\r\nimport type { WidgetType, AnyWidgetConfig, FilterConfig, VariableConfig, PaletteConfig } from '../types';\r\nimport { getSeries } from '../palettes';\r\nimport { KPIWidget } from './KPIWidget';\r\nimport { GaugeWidget } from './GaugeWidget';\r\nimport { ChartWidget } from './ChartWidget';\r\nimport { TableWidget } from './TableWidget';\r\nimport { FilterWidget } from './FilterWidget';\r\nimport { VariableWidget } from './VariableWidget';\r\nimport { ColorPaletteWidget } from './ColorPaletteWidget';\r\n\r\ninterface Props {\r\n type: WidgetType;\r\n computed: Record<string, unknown>;\r\n palette: string[];\r\n // Control widget props (opcionais)\r\n config?: AnyWidgetConfig;\r\n filterValue?: string;\r\n filterOptions?: string[];\r\n dateBounds?: { min: string; max: string } | null;\r\n onFilterChange?: (value: string) => void;\r\n variableValue?: number;\r\n onVariableChange?: (value: number) => void;\r\n onPaletteChange?: (colors: string[]) => void;\r\n}\r\n\r\nexport function WidgetRenderer({\r\n type, computed, palette, config,\r\n filterValue, filterOptions, dateBounds, onFilterChange,\r\n variableValue, onVariableChange,\r\n onPaletteChange,\r\n}: Props) {\r\n if (computed.error) {\r\n return (\r\n <div className=\"widget widget--error\">\r\n <span className=\"widget__error-text\">{String(computed.error)}</span>\r\n </div>\r\n );\r\n }\r\n\r\n // Widgets de dados usam apenas as cores de series (5 primeiras).\r\n // UI colors sao aplicadas via CSS vars no grid container.\r\n const seriesColors = getSeries(palette);\r\n\r\n switch (type) {\r\n case 'kpi_card':\r\n return <KPIWidget data={computed} label={config?.label} />;\r\n case 'gauge':\r\n return <GaugeWidget data={computed} palette={seriesColors} label={config?.label} />;\r\n case 'chart':\r\n return <ChartWidget data={computed} palette={seriesColors} label={config?.label} />;\r\n case 'table':\r\n return <TableWidget data={computed} label={config?.label} />;\r\n case 'filter':\r\n return config && onFilterChange ? (\r\n <FilterWidget\r\n config={config as FilterConfig}\r\n value={filterValue || ''}\r\n options={filterOptions}\r\n dateBounds={dateBounds}\r\n onChange={onFilterChange}\r\n />\r\n ) : null;\r\n case 'variable': {\r\n const vc = config as VariableConfig | undefined;\r\n return vc && onVariableChange ? (\r\n <VariableWidget\r\n config={vc}\r\n value={variableValue ?? vc.variableValue ?? 0}\r\n onChange={onVariableChange}\r\n />\r\n ) : null;\r\n }\r\n case 'color_palette':\r\n return config && onPaletteChange ? (\r\n <ColorPaletteWidget\r\n config={config as PaletteConfig}\r\n palette={palette}\r\n onChange={onPaletteChange}\r\n />\r\n ) : null;\r\n default:\r\n return <div className=\"widget\">Widget: {type}</div>;\r\n }\r\n}\r\n","// Purpose: Componente top-level que renderiza um dashboard completo.\n// Scope: Busca layout + render da API Action com o token, aplica paleta como CSS vars,\n// renderiza grid com widgets interativos (filtros + variaveis + paleta).\n// Public API: Dashboard\n\nimport type { CSSProperties } from 'react';\nimport { useDashboardData } from './hooks/useDashboardData';\nimport { WidgetRenderer } from './widgets/WidgetRenderer';\nimport { getPaletteCssVars } from './palettes';\nimport { CONTROL_WIDGET_SET } from './types';\n\nconst GRID_ROW_HEIGHT_REM = 2.5;\nconst GRID_GAP_REM = 0.375;\n\ninterface DashboardProps {\n /** Token Bearer de acesso ao dashboard. */\n token: string;\n /** Altura de cada linha do grid em rem. Default 2.5 (40px no base 16). */\n rowHeight?: number;\n /** Gap entre widgets em rem. Default 0.375 (6px no base 16). */\n gridGap?: number;\n /** Classe CSS adicional no container raiz. */\n className?: string;\n}\n\nexport function Dashboard({\n token,\n rowHeight = GRID_ROW_HEIGHT_REM,\n gridGap = GRID_GAP_REM,\n className,\n}: DashboardProps) {\n const {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n } = useDashboardData(token);\n\n if (error && !layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__error\">{error}</div></div>;\n }\n\n if (!layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__loading\">Carregando dashboard...</div></div>;\n }\n\n if (layout.widgets.length === 0) {\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n <div className=\"preview-tab__empty\">Este dashboard nao possui widgets.</div>\n </div>\n );\n }\n\n const widgetsData = renderData?.widgets ?? {};\n const dateBounds = renderData?.date_bounds ?? null;\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${layout.gridColumns}, 1fr)`,\n gridTemplateRows: `repeat(${layout.gridRows}, ${rowHeight}rem)`,\n gap: `${gridGap}rem`,\n ...getPaletteCssVars(palette),\n } as CSSProperties;\n\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n {error && !renderData && <div className=\"preview-tab__error\">{error}</div>}\n\n {renderData && (\n <div className=\"preview-tab__grid\" style={gridStyle}>\n {layout.widgets.map((widget) => {\n const isControl = CONTROL_WIDGET_SET.has(widget.type);\n const computed = widgetsData[widget.id];\n const widgetStyle: CSSProperties = {\n gridColumn: `${widget.grid.x + 1} / span ${widget.grid.w}`,\n gridRow: `${widget.grid.y + 1} / span ${widget.grid.h}`,\n };\n\n const variableValue = widget.type === 'variable'\n ? variables[widget.id] ?? (computed?.value as number) ?? widget.config.variableValue ?? 0\n : undefined;\n\n return (\n <div\n key={widget.id}\n className={`preview-tab__widget ${isControl ? 'preview-tab__widget--control' : ''}`}\n style={widgetStyle}\n >\n {isControl || computed ? (\n <WidgetRenderer\n type={widget.type}\n computed={computed || {}}\n palette={palette}\n config={widget.config}\n filterValue={filters[widget.id] || ''}\n filterOptions={(computed?.available_values as string[]) || []}\n dateBounds={dateBounds}\n onFilterChange={(val) => setFilter(widget.id, val)}\n variableValue={variableValue}\n onVariableChange={(val) => setVariable(widget.id, val)}\n onPaletteChange={setPalette}\n />\n ) : (\n <div className=\"preview-tab__widget-loading\">\n {loading ? 'Carregando...' : 'Sem dados'}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {loading && renderData && (\n <div className=\"preview-tab__recalculating\">Atualizando...</div>\n )}\n </div>\n );\n}\n"],"names":["DEBOUNCE_MS","useDashboardData","token","layout","setLayout","useState","renderData","setRenderData","filters","setFilters","variables","setVariables","localPalette","setLocalPalette","loading","setLoading","error","setError","debounceRef","useRef","appliedSyncedRef","useEffect","cancelled","fetchLayout","res","err","params","buildQueryParams","fetchRender","prev","syncFiltersFromApplied","setFilter","useCallback","widgetId","value","setVariable","setPalette","colors","palette","useMemo","key","val","start","end","applied","synced","id","d","MULTI_VALUE_SEPARATOR","KPIWidget","data","label","displayLabel","formatted","comparison","trendClass","arrow","jsxs","jsx","COLOR_EMPTY","arcPath","cx","cy","r","fraction","angle","endX","endY","formatCompact","abs","GaugeWidget","propLabel","rawValue","valueFormatted","ratio","targetValue","comparisonLabel","exceeded","clamped","fillColor","targetFormatted","stroke","AXIS_STYLE","GRID_STROKE","TOOLTIP_CONTENT_STYLE","TOOLTIP_LABEL_STYLE","tooltipLabelFormatter","payload","first","verbose","_a","useContainerSize","ref","size","setSize","el","observer","entry","width","height","CartesianChart","Chart","chartData","xKey","series","renderSeries","CartesianGrid","XAxis","YAxis","Tooltip","Legend","s","i","ChartWidget","chartType","title","containerRef","renderChart","PieChart","Pie","name","percent","_","Cell","common","LineChart","color","Line","AreaChart","Area","BarChart","Bar","formatCell","format","isNum","TableWidget","activeTab","setActiveTab","columns","tabs","hasTabs","rows","tab","c","numeric","row","raw","trend","num","FilterWidget","config","options","dateBounds","onChange","filterType","dateMode","YearlyFilter","MonthlyFilter","WeeklyFilter","DateRangeFilter","SelectFilter","DashboardDatePicker","iso","parsed","parseYearFromRange","now","selectedYear","years","getYearRange","handleYearChange","year","yr","getFullYearRange","e","y","parseMonthFromRange","selectedMonth","handleMonthChange","month","range","getMonthRange","MONTH_NAMES_SHORT","monthWeeks","getMonthWeeks","selectedWeekIdx","parseMonthWeekFromRange","w","m","multi","searchable","SearchableSelect","selected","toggle","opt","next","FORMAT_SUFFIX","VariableWidget","locked","fmt","suffix","ColorPaletteWidget","ColorPaletteSelector","WidgetRenderer","type","computed","filterValue","filterOptions","onFilterChange","variableValue","onVariableChange","onPaletteChange","seriesColors","getSeries","vc","GRID_ROW_HEIGHT_REM","GRID_GAP_REM","Dashboard","rowHeight","gridGap","className","widgetsData","gridStyle","getPaletteCssVars","widget","isControl","CONTROL_WIDGET_SET","widgetStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useDashboardData.ts","../src/hooks/useGridGeometry.ts","../src/widgets/KPIWidget.tsx","../src/widgets/GaugeWidget.tsx","../src/widgets/ChartWidget.tsx","../src/widgets/TableWidget.tsx","../src/widgets/FilterWidget.tsx","../src/widgets/VariableWidget.tsx","../src/widgets/ColorPaletteWidget.tsx","../src/widgets/WidgetRenderer.tsx","../src/Dashboard.tsx"],"sourcesContent":["// Purpose: Hook que gerencia estado + fetch de um dashboard inteiro.\r\n// Scope: Carrega layout uma vez + render com debounce quando filtros/variaveis mudam.\r\n// Sincroniza estado local com os defaults aplicados pelo backend na 1a carga.\r\n// Public API: useDashboardData\r\n\r\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\r\nimport { fetchLayout, fetchRender } from '../api/fetcher';\r\nimport type { LayoutResponse, RenderResponse } from '../types';\r\nimport { MULTI_VALUE_SEPARATOR } from '../types';\r\n\r\nexport interface UseDashboardDataResult {\r\n layout: LayoutResponse | null;\r\n renderData: RenderResponse | null;\r\n loading: boolean;\r\n error: string | null;\r\n /** Filtros selecionados (formato string por widget — date_range como \"start|end\"). */\r\n filters: Record<string, string>;\r\n /** Overrides de variaveis por widget. */\r\n variables: Record<string, number>;\r\n /** Paleta efetiva (override local substitui a do layout). */\r\n palette: string[];\r\n setFilter(widgetId: string, value: string): void;\r\n setVariable(widgetId: string, value: number): void;\r\n setPalette(colors: string[]): void;\r\n}\r\n\r\nconst DEBOUNCE_MS = 300;\r\n\r\nexport function useDashboardData(token: string): UseDashboardDataResult {\r\n const [layout, setLayout] = useState<LayoutResponse | null>(null);\r\n const [renderData, setRenderData] = useState<RenderResponse | null>(null);\r\n const [filters, setFilters] = useState<Record<string, string>>({});\r\n const [variables, setVariables] = useState<Record<string, number>>({});\r\n const [localPalette, setLocalPalette] = useState<string[] | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\r\n const appliedSyncedRef = useRef(false);\r\n\r\n // -------Carrega layout uma unica vez (por token)-------\r\n useEffect(() => {\r\n let cancelled = false;\r\n fetchLayout(token)\r\n .then((res) => { if (!cancelled) setLayout(res); })\r\n .catch((err: Error) => { if (!cancelled) setError(err.message); });\r\n return () => { cancelled = true; };\r\n }, [token]);\r\n\r\n // -------Render com debounce quando filtros/variaveis mudam-------\r\n useEffect(() => {\r\n if (!layout) return;\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n\r\n debounceRef.current = setTimeout(() => {\r\n const params = buildQueryParams(filters, variables);\r\n setLoading(true);\r\n fetchRender(token, params)\r\n .then((res) => {\r\n setRenderData(res);\r\n if (!appliedSyncedRef.current && res.applied) {\r\n appliedSyncedRef.current = true;\r\n setFilters((prev) => ({ ...syncFiltersFromApplied(res.applied), ...prev }));\r\n }\r\n setError(null);\r\n })\r\n .catch((err: Error) => setError(err.message))\r\n .finally(() => setLoading(false));\r\n }, DEBOUNCE_MS);\r\n\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n };\r\n }, [token, layout, filters, variables]);\r\n\r\n const setFilter = useCallback((widgetId: string, value: string) => {\r\n setFilters((prev) => ({ ...prev, [widgetId]: value }));\r\n }, []);\r\n\r\n const setVariable = useCallback((widgetId: string, value: number) => {\r\n setVariables((prev) => ({ ...prev, [widgetId]: value }));\r\n }, []);\r\n\r\n const setPalette = useCallback((colors: string[]) => {\r\n setLocalPalette(colors);\r\n }, []);\r\n\r\n const palette = useMemo(\r\n () => localPalette ?? layout?.palette ?? [],\r\n [localPalette, layout],\r\n );\r\n\r\n return {\r\n layout, renderData, loading, error,\r\n filters, variables, palette,\r\n setFilter, setVariable, setPalette,\r\n };\r\n}\r\n\r\n// -------Helpers-------\r\n\r\n/** Constroi query params no formato esperado pela API (/render). */\r\nfunction buildQueryParams(\r\n filters: Record<string, string>,\r\n variables: Record<string, number>,\r\n): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n for (const [key, val] of Object.entries(filters)) {\r\n if (val.includes('|')) {\r\n const [start, end] = val.split('|');\r\n if (start) params['f_date_start'] = start;\r\n if (end) params['f_date_end'] = end;\r\n } else {\r\n params[`f_${key}`] = val;\r\n }\r\n }\r\n\r\n for (const [key, val] of Object.entries(variables)) {\r\n params[`v_${key}`] = String(val);\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/** Converte `applied` do backend para o formato local de filtros. */\r\nfunction syncFiltersFromApplied(applied: Record<string, unknown>): Record<string, string> {\r\n const synced: Record<string, string> = {};\r\n for (const [id, val] of Object.entries(applied)) {\r\n if (val && typeof val === 'object' && 'start' in val) {\r\n const d = val as { start?: string; end?: string };\r\n synced[id] = `${d.start || ''}|${d.end || ''}`;\r\n } else if (Array.isArray(val)) {\r\n synced[id] = val.join(MULTI_VALUE_SEPARATOR);\r\n } else if (typeof val === 'string') {\r\n synced[id] = val;\r\n }\r\n }\r\n return synced;\r\n}\r\n","// Purpose: Medir o container do dashboard e projetar a geometria do grid no DOM.\n// Scope: Um unico ResizeObserver sobre a raiz (largura) e o grid (altura). A altura\n// da celula e escrita como custom property, fora do React; so a troca de\n// modo (colunas <-> empilhado) passa por estado. Tambem reporta a geometria\n// ao consumidor e avisa quando o host corta o dashboard.\n// Public API: useGridGeometry\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { DashboardGeometry } from '../utils/grid';\nimport { computeCellHeight, computeCellWidth, computeStackThreshold } from '../utils/grid';\n\nexport interface UseGridGeometryOptions {\n /** Numero de colunas do layout. 0 enquanto o layout nao carregou. */\n columns: number;\n /** Proporcao largura/altura da celula. */\n cellAspect: number;\n /** Largura de container abaixo da qual empilhar. `auto` deriva do limiar natural. */\n stackBelow?: number | 'auto';\n /** Notificado quando qualquer medida do grid muda. */\n onGeometryChange?: (geometry: DashboardGeometry) => void;\n /** Desliga o aviso de corte no console. */\n silenceWarnings?: boolean;\n}\n\nexport interface UseGridGeometryResult {\n /** Ref da raiz — elemento medido e portador das custom properties. */\n rootRef: (element: HTMLDivElement | null) => void;\n /** Ref do grid — medido apenas para reportar a altura ocupada. */\n gridRef: (element: HTMLDivElement | null) => void;\n /** True quando o container e estreito demais para a grade de colunas. */\n stacked: boolean;\n}\n\nconst readInlineSize = (entry: ResizeObserverEntry): number =>\n entry.borderBoxSize?.[0]?.inlineSize ?? (entry.target as HTMLElement).offsetWidth;\n\nconst readBlockSize = (entry: ResizeObserverEntry): number =>\n entry.borderBoxSize?.[0]?.blockSize ?? (entry.target as HTMLElement).offsetHeight;\n\n/** Limiar efetivo de empilhamento. 0 desliga o modo. */\nfunction resolveStackThreshold(\n stackBelow: number | 'auto' | undefined,\n columns: number,\n aspect: number,\n): number {\n if (stackBelow === undefined) return 0;\n if (stackBelow === 'auto') return computeStackThreshold(columns, aspect);\n return Math.max(0, stackBelow);\n}\n\n/**\n * Ancestral que efetivamente recorta o elemento.\n *\n * Para na primeira caixa de rolagem: se ela rola (`auto`/`scroll`), nada acima\n * dela corta o dashboard, e o embutimento e legitimo.\n */\nfunction findClippingAncestor(element: HTMLElement): HTMLElement | null {\n let node = element.parentElement;\n while (node && node !== document.body && node !== document.documentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY !== 'visible') {\n return overflowY === 'hidden' || overflowY === 'clip' ? node : null;\n }\n node = node.parentElement;\n }\n return null;\n}\n\nexport function useGridGeometry(options: UseGridGeometryOptions): UseGridGeometryResult {\n // Latest-ref: o observer e criado uma vez e precisa enxergar os valores atuais\n // sem ser reassinado a cada render. Nunca lido durante o render.\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const rootElRef = useRef<HTMLDivElement | null>(null);\n const gridElRef = useRef<HTMLDivElement | null>(null);\n const observerRef = useRef<ResizeObserver | null>(null);\n const frameRef = useRef<number | null>(null);\n const geometryRef = useRef<DashboardGeometry | null>(null);\n const widthRef = useRef(0);\n const gridHeightRef = useRef(0);\n const stackedRef = useRef(false);\n const warnedRef = useRef(false);\n // Largura ja projetada no DOM. -1 forca a proxima projecao (troca de layout).\n const appliedWidthRef = useRef(-1);\n\n const [stacked, setStacked] = useState(false);\n\n const warnIfClipped = useCallback((geometry: DashboardGeometry) => {\n const grid = gridElRef.current;\n if (warnedRef.current || optionsRef.current.silenceWarnings || !grid) return;\n\n const ancestor = findClippingAncestor(grid);\n if (!ancestor || ancestor.clientHeight >= geometry.gridHeight) return;\n\n warnedRef.current = true;\n console.warn(\n '[@actionexec/dashboards] O dashboard esta sendo cortado: o container precisa de '\n + `${Math.ceil(geometry.gridHeight)}px de altura, mas o ancestral com overflow oculto tem `\n + `${ancestor.clientHeight}px. A altura do dashboard varia com a largura — use a prop `\n + 'onGeometryChange para dimensionar o container, ou troque o overflow para auto. '\n + 'Passe silenceWarnings para desligar este aviso.',\n );\n }, []);\n\n const emit = useCallback(() => {\n if (!rootElRef.current) return;\n\n const { columns, cellAspect } = optionsRef.current;\n // Usa a largura ja medida em vez de reler o DOM: emit roda logo apos apply\n // escrever as custom properties, e um getBoundingClientRect aqui forcaria\n // um reflow sincrono por frame de arrasto.\n const containerWidth = widthRef.current;\n const cellWidth = computeCellWidth(containerWidth, columns);\n\n const next: DashboardGeometry = {\n containerWidth,\n cellWidth,\n cellHeight: computeCellHeight(cellWidth, cellAspect),\n gridHeight: gridHeightRef.current,\n stacked: stackedRef.current,\n };\n\n const prev = geometryRef.current;\n const unchanged = prev\n && prev.containerWidth === next.containerWidth\n && prev.cellWidth === next.cellWidth\n && prev.cellHeight === next.cellHeight\n && prev.gridHeight === next.gridHeight\n && prev.stacked === next.stacked;\n if (unchanged) return;\n\n geometryRef.current = next;\n optionsRef.current.onGeometryChange?.(next);\n warnIfClipped(next);\n }, [warnIfClipped]);\n\n /**\n * Projeta a largura medida na geometria do grid.\n *\n * As custom properties sao escritas direto no no, sem passar pelo React: o\n * arrasto da janela emite uma medida por frame, e re-renderizar a arvore de\n * widgets nessa cadencia custaria caro com graficos em tela. Elas nunca\n * aparecem no objeto `style` do JSX — o React so remove chaves que ele mesmo\n * escreveu, entao o valor imperativo sobrevive aos renders seguintes.\n *\n * NUNCA chamar de dentro do callback do ResizeObserver: ver handleEntries.\n */\n const apply = useCallback((force = false) => {\n const root = rootElRef.current;\n if (!root) return;\n\n const width = widthRef.current;\n if (!force && width === appliedWidthRef.current) return;\n appliedWidthRef.current = width;\n\n const { columns, cellAspect, stackBelow } = optionsRef.current;\n const cellWidth = computeCellWidth(width, columns);\n root.style.setProperty('--dash-cell-h', `${computeCellHeight(cellWidth, cellAspect)}px`);\n\n const threshold = resolveStackThreshold(stackBelow, columns, cellAspect);\n const nextStacked = threshold > 0 && width > 0 && width < threshold;\n if (nextStacked !== stackedRef.current) {\n stackedRef.current = nextStacked;\n setStacked(nextStacked);\n }\n }, []);\n\n const cancelFrame = useCallback(() => {\n if (frameRef.current === null) return;\n cancelAnimationFrame(frameRef.current);\n // Zerar junto com o cancelamento e obrigatorio: o unico outro ponto que\n // zera e o corpo do frame, que acabou de ser cancelado. Sem isto o guard de\n // scheduleFrame veria um id obsoleto e sairia cedo para sempre.\n frameRef.current = null;\n }, []);\n\n // O observer pode disparar mais de uma vez por frame; projecao e relato sao\n // coalescidos num unico frame.\n const scheduleFrame = useCallback(() => {\n if (frameRef.current !== null) return;\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n apply();\n emit();\n });\n }, [apply, emit]);\n\n const handleEntries = useCallback((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.target === rootElRef.current) widthRef.current = Math.round(readInlineSize(entry));\n else if (entry.target === gridElRef.current) gridHeightRef.current = readBlockSize(entry);\n }\n // Deliberadamente NAO escreve no DOM aqui. Escrever --dash-cell-h durante a\n // entrega das observacoes mudaria a altura do grid e, por tabela, a da raiz\n // (que e flex column sem altura propria). A raiz esta numa profundidade\n // menor que a ultima entregue, entao vira \"skipped observation\" e o browser\n // emite o ErrorEvent \"ResizeObserver loop completed with undelivered\n // notifications\" — que o app hospedeiro captura como erro nao tratado.\n // Adiar para o frame seguinte fecha o laco limpo.\n scheduleFrame();\n }, [scheduleFrame]);\n\n const ensureObserver = useCallback(() => {\n if (observerRef.current) return observerRef.current;\n if (typeof ResizeObserver === 'undefined') return null;\n observerRef.current = new ResizeObserver(handleEntries);\n return observerRef.current;\n }, [handleEntries]);\n\n const rootRef = useCallback((element: HTMLDivElement | null) => {\n const observer = ensureObserver();\n if (rootElRef.current) observer?.unobserve(rootElRef.current);\n rootElRef.current = element;\n if (!element) return;\n observer?.observe(element);\n // Medicao e projecao sincronas, fora do laco do observer: sem elas o\n // primeiro frame usaria o fallback do CSS em vez da celula real.\n widthRef.current = Math.round(element.getBoundingClientRect().width);\n apply(true);\n scheduleFrame();\n }, [apply, ensureObserver, scheduleFrame]);\n\n const gridRef = useCallback((element: HTMLDivElement | null) => {\n const observer = ensureObserver();\n if (gridElRef.current) observer?.unobserve(gridElRef.current);\n gridElRef.current = element;\n if (!element) {\n gridHeightRef.current = 0;\n return;\n }\n observer?.observe(element);\n gridHeightRef.current = element.getBoundingClientRect().height;\n scheduleFrame();\n }, [ensureObserver, scheduleFrame]);\n\n // O effect e o dono do ciclo de vida do observer. Deixar so as ref callbacks\n // criando e um effect destruindo seria assimetrico: o StrictMode do React 18\n // roda o cleanup sem reanexar refs, e a raiz ficaria sem observacao pelo resto\n // da sessao — quebrando em dev exatamente a proporcao que o hook mantem.\n // observe() e idempotente, entao reobservar o que as refs ja pegaram e seguro.\n useEffect(() => {\n const observer = ensureObserver();\n if (rootElRef.current) observer?.observe(rootElRef.current);\n if (gridElRef.current) observer?.observe(gridElRef.current);\n return () => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n cancelFrame();\n };\n }, [ensureObserver, cancelFrame]);\n\n // Trocar de layout muda o numero de colunas e, com ele, toda a geometria.\n // Roda fora do laco do observer, entao a escrita sincrona aqui e segura.\n useEffect(() => {\n if (!rootElRef.current) return;\n apply(true);\n scheduleFrame();\n }, [options.columns, options.cellAspect, options.stackBelow, apply, scheduleFrame]);\n\n return { rootRef, gridRef, stacked };\n}\n","// Purpose: KPI card com valor computado + comparacao.\n// Scope: Renderiza label, valor formatado, seta de trend, variance.\n// Public API: KPIWidget\n\ninterface Props {\n data: Record<string, unknown>;\n label?: string;\n}\n\nexport function KPIWidget({ data, label }: Props) {\n const displayLabel = label || String(data.label || '');\n const formatted = String(data.formatted || '-');\n const comparison = data.comparison as {\n previous_value?: number | null;\n variance_pct?: number | null;\n trend?: string | null;\n label?: string | null;\n } | null;\n\n const trendClass = comparison?.trend === 'up'\n ? 'widget-kpi__trend--up'\n : comparison?.trend === 'down'\n ? 'widget-kpi__trend--down'\n : '';\n\n const arrow = comparison?.trend === 'up' ? '↑' : comparison?.trend === 'down' ? '↓' : '';\n\n return (\n <div className=\"widget widget-kpi\">\n <span className=\"widget-kpi__label\">{displayLabel}</span>\n <span className=\"widget-kpi__value\">{formatted}</span>\n {comparison && comparison.variance_pct != null && (\n <div className={`widget-kpi__trend ${trendClass}`}>\n <span className=\"widget-kpi__variance\">\n {arrow} {comparison.variance_pct > 0 ? '+' : ''}{comparison.variance_pct.toFixed(1)}%\n </span>\n {comparison.label && (\n <span className=\"widget-kpi__trend-label\">{comparison.label}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Purpose: Gauge widget (progresso vs meta).\n// Scope: Semicirculo SVG com percentual, valores brutos e indicador de meta batida.\n// Public API: GaugeWidget\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nconst COLOR_EMPTY = 'var(--bg-elevated)';\n\n/** Gera path SVG de um arco semicircular (de esquerda para direita, no topo). */\nfunction arcPath(cx: number, cy: number, r: number, fraction: number): string {\n if (fraction <= 0) return '';\n if (fraction >= 1) {\n // Semicirculo completo: dois arcos de 90° (SVG nao desenha arco de exatamente 180°)\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${cx} ${cy - r} A ${r} ${r} 0 0 1 ${cx + r} ${cy}`;\n }\n const angle = fraction * Math.PI;\n const endX = cx - r * Math.cos(angle);\n const endY = cy - r * Math.sin(angle);\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${endX} ${endY}`;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n return value.toLocaleString('pt-BR');\n}\n\nexport function GaugeWidget({ data, palette, label: propLabel }: Props) {\n const label = propLabel || String(data.label || '');\n const rawValue = typeof data.value === 'number' ? data.value : null;\n const valueFormatted = rawValue != null ? formatCompact(rawValue) : '-';\n const formatted = String(data.formatted || '-');\n const ratio = typeof data.ratio === 'number' ? data.ratio : 0;\n const targetValue = data.target_value as number | null;\n\n const comparisonLabel = data.comparison_label as string | null;\n const exceeded = ratio >= 1;\n const clamped = Math.min(Math.max(ratio, 0), 1);\n\n const fillColor = exceeded\n ? 'var(--action-green)'\n : ratio >= 0.7\n ? (palette[0] || 'var(--color-info)')\n : ratio >= 0.4\n ? 'var(--color-warning)'\n : 'var(--color-error)';\n\n const targetFormatted = targetValue != null ? formatCompact(targetValue) : '-';\n\n const cx = 50, cy = 50, r = 44, stroke = 10;\n\n return (\n <div className=\"widget widget-gauge\">\n <span className=\"widget-gauge__label\">{label}</span>\n <div className=\"widget-gauge__chart\">\n <svg viewBox=\"0 0 100 56\" preserveAspectRatio=\"xMidYMax meet\">\n <path d={arcPath(cx, cy, r, 1)} fill=\"none\" stroke={COLOR_EMPTY} strokeWidth={stroke} strokeLinecap=\"butt\" />\n {clamped > 0 && (\n <path d={arcPath(cx, cy, r, clamped)} fill=\"none\" stroke={fillColor} strokeWidth={stroke} strokeLinecap=\"butt\" />\n )}\n </svg>\n <div className=\"widget-gauge__center\">\n <span className=\"widget-gauge__percent\">{formatted}</span>\n <span className=\"widget-gauge__comparison\">{valueFormatted} / {targetFormatted}</span>\n {exceeded && <span className=\"widget-gauge__badge\">{comparisonLabel || 'Meta batida'}</span>}\n {!exceeded && comparisonLabel && <span className=\"widget-gauge__comparison\">{comparisonLabel}</span>}\n </div>\n </div>\n </div>\n );\n}\n","// Purpose: Chart widget (bar/line/area/pie via Recharts).\r\n// Scope: Renderiza com dados pre-calculados pelo backend + tooltip tematizado.\r\n// Public API: ChartWidget\r\n\r\nimport { useRef, useState, useEffect, type ComponentType, type ReactElement } from 'react';\r\nimport {\r\n BarChart, Bar,\r\n LineChart, Line,\r\n AreaChart, Area,\r\n PieChart, Pie, Cell,\r\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\r\n} from 'recharts';\r\n\r\nconst AXIS_STYLE = { fontSize: 10, fill: 'var(--text-muted)' };\r\nconst GRID_STROKE = 'var(--bg-elevated)';\r\n\r\n// Tooltip segue a paleta do dashboard via CSS variables (getPaletteCssVars)\r\nconst TOOLTIP_CONTENT_STYLE = {\r\n backgroundColor: 'var(--bg-elevated)',\r\n border: '1px solid var(--bg-paper)',\r\n borderRadius: '6px',\r\n color: 'var(--text-primary)',\r\n};\r\nconst TOOLTIP_LABEL_STYLE = {\r\n color: 'var(--text-primary)',\r\n fontWeight: 600,\r\n};\r\n\r\n// Usa `tooltipLabel` (versao verbose) do data point quando presente,\r\n// fallback para o label do eixo X (compacto).\r\nfunction tooltipLabelFormatter(label: unknown, payload: readonly unknown[]): string {\r\n const first = (Array.isArray(payload) ? payload[0] : undefined) as { payload?: Record<string, unknown> } | undefined;\r\n const verbose = first?.payload?.tooltipLabel;\r\n if (typeof verbose === 'string' && verbose) return verbose;\r\n return String(label ?? '');\r\n}\r\n\r\ninterface SeriesInfo { key: string; label: string }\r\n\r\n// Hook para medir dimensoes do container via ResizeObserver\r\nfunction useContainerSize(ref: React.RefObject<HTMLDivElement | null>) {\r\n const [size, setSize] = useState({ width: 0, height: 0 });\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const observer = new ResizeObserver(([entry]) => {\r\n const { width, height } = entry.contentRect;\r\n setSize((prev) =>\r\n prev.width !== Math.floor(width) || prev.height !== Math.floor(height)\r\n ? { width: Math.floor(width), height: Math.floor(height) }\r\n : prev\r\n );\r\n });\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [ref]);\r\n\r\n return size;\r\n}\r\n\r\n// Componente generico para charts cartesianos (bar/line/area)\r\nfunction CartesianChart({ Chart, chartData, xKey, series, palette, renderSeries, width, height }: {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n Chart: ComponentType<any>;\r\n chartData: Record<string, unknown>[];\r\n xKey: string;\r\n series: SeriesInfo[];\r\n palette: string[];\r\n renderSeries: (s: SeriesInfo, color: string, idx: number) => ReactElement;\r\n width: number;\r\n height: number;\r\n}) {\r\n return (\r\n <Chart data={chartData} width={width} height={height}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\r\n <XAxis dataKey={xKey} tick={AXIS_STYLE} />\r\n <YAxis tick={AXIS_STYLE} />\r\n <Tooltip\r\n contentStyle={TOOLTIP_CONTENT_STYLE}\r\n labelStyle={TOOLTIP_LABEL_STYLE}\r\n labelFormatter={tooltipLabelFormatter}\r\n cursor={{ fill: 'var(--bg-paper)', opacity: 0.3 }}\r\n />\r\n {series.length > 1 && <Legend />}\r\n {series.map((s, i) => renderSeries(s, palette[i % palette.length], i))}\r\n </Chart>\r\n );\r\n}\r\n\r\ninterface Props {\r\n data: Record<string, unknown>;\r\n palette: string[];\r\n label?: string;\r\n}\r\n\r\nexport function ChartWidget({ data, palette, label: propLabel }: Props) {\r\n const chartType = String(data.chartType || 'bar');\r\n const title = propLabel || String(data.label || '');\r\n const xKey = String(data.xKey || 'label');\r\n const series = (data.series || []) as SeriesInfo[];\r\n const chartData = (data.data || []) as Record<string, unknown>[];\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const { width, height } = useContainerSize(containerRef);\r\n\r\n const renderChart = () => {\r\n if (width <= 0 || height <= 0) return null;\r\n\r\n if (chartType === 'pie') {\r\n return (\r\n <PieChart width={width} height={height}>\r\n <Pie\r\n data={chartData}\r\n dataKey={series[0]?.key || 's0'}\r\n nameKey={xKey}\r\n cx=\"50%\" cy=\"50%\" outerRadius=\"75%\"\r\n label={({ name, percent }: { name: string; percent: number }) =>\r\n `${name}: ${(percent * 100).toFixed(0)}%`\r\n }\r\n labelLine={false}\r\n >\r\n {chartData.map((_, i) => (\r\n <Cell key={i} fill={palette[i % palette.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={TOOLTIP_CONTENT_STYLE}\r\n labelStyle={TOOLTIP_LABEL_STYLE}\r\n labelFormatter={tooltipLabelFormatter}\r\n />\r\n </PieChart>\r\n );\r\n }\r\n\r\n const common = { chartData, xKey, series, palette, width, height };\r\n\r\n if (chartType === 'line') {\r\n return (\r\n <CartesianChart {...common} Chart={LineChart} renderSeries={(s, color) => (\r\n <Line key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\r\n stroke={color} strokeWidth={2} dot={chartData.length <= 31} />\r\n )} />\r\n );\r\n }\r\n\r\n if (chartType === 'area') {\r\n return (\r\n <CartesianChart {...common} Chart={AreaChart} renderSeries={(s, color) => (\r\n <Area key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\r\n fill={color} stroke={color} fillOpacity={0.3} />\r\n )} />\r\n );\r\n }\r\n\r\n return (\r\n <CartesianChart {...common} Chart={BarChart} renderSeries={(s, color) => (\r\n <Bar key={s.key} dataKey={s.key} name={s.label}\r\n fill={color} radius={[3, 3, 0, 0]} />\r\n )} />\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"widget widget-chart\">\r\n {title && <h4 className=\"widget-chart__title\">{title}</h4>}\r\n {/* Container sempre montado: mantem o ResizeObserver atado ao mesmo elemento\r\n mesmo no estado vazio, evitando que o grafico nao remonte ao voltar dados. */}\r\n <div ref={containerRef} className=\"widget-chart__container\">\r\n {chartData.length === 0\r\n ? <div className=\"widget-chart__empty\">Sem dados</div>\r\n : renderChart()}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// Purpose: Widget de tabela — mostra linhas x colunas do dataset.\r\n// Scope: Renderiza data.columns (cabecalho) + data.rows (linhas), formatando cada\r\n// celula pelo format da coluna. Colore colunas de porcentagem (verde/vermelho).\r\n// Com data.tabs ({label, rows}[]), renderiza barra de abas que troca as linhas\r\n// sem refetch (todas as abas chegam computadas do backend).\r\n// Public API: TableWidget\r\n\r\nimport { useState } from 'react';\r\n\r\ninterface TableColumn {\r\n key: string;\r\n label?: string;\r\n format?: string;\r\n}\r\n\r\ninterface TableTab {\r\n label: string;\r\n rows: Record<string, unknown>[];\r\n}\r\n\r\ninterface Props {\r\n data: Record<string, unknown>;\r\n label?: string;\r\n}\r\n\r\nfunction formatCell(value: unknown, format?: string): string {\r\n if (value === null || value === undefined || value === '') return '-';\r\n const n = typeof value === 'number' ? value : Number(value);\r\n const isNum = value !== '' && !Number.isNaN(n);\r\n switch (format) {\r\n case 'currency':\r\n return isNum ? n.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }) : String(value);\r\n case 'integer':\r\n return isNum ? Math.round(n).toLocaleString('pt-BR') : String(value);\r\n case 'number':\r\n return isNum ? n.toLocaleString('pt-BR', { maximumFractionDigits: 1 }) : String(value);\r\n case 'percentage':\r\n return isNum ? `${n > 0 ? '+' : ''}${Math.round(n)}%` : String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nexport function TableWidget({ data, label }: Props) {\r\n const [activeTab, setActiveTab] = useState(0);\r\n const columns = (data.columns as TableColumn[]) || [];\r\n const tabs = (data.tabs as TableTab[]) || [];\r\n const hasTabs = tabs.length > 0;\r\n const rows = hasTabs\r\n ? tabs[Math.min(activeTab, tabs.length - 1)]?.rows || []\r\n : (data.rows as Record<string, unknown>[]) || [];\r\n const displayLabel = label || String(data.label || '');\r\n\r\n if (columns.length === 0) {\r\n return (\r\n <div className=\"widget widget-table\">\r\n {displayLabel && <span className=\"widget-table__label\">{displayLabel}</span>}\r\n <span className=\"widget-table__empty\">Configure as colunas da tabela.</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"widget widget-table\">\r\n {displayLabel && <span className=\"widget-table__label\">{displayLabel}</span>}\r\n {hasTabs && (\r\n <div className=\"widget-table__tabs\" role=\"tablist\">\r\n {tabs.map((tab, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={i === activeTab}\r\n className={`widget-table__tab${i === activeTab ? ' widget-table__tab--active' : ''}`}\r\n onClick={() => setActiveTab(i)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <div className=\"widget-table__scroll\">\r\n <table className=\"widget-table__table\">\r\n <thead>\r\n <tr>\r\n {columns.map((c) => {\r\n const numeric = !!c.format && c.format !== 'text';\r\n return (\r\n <th key={c.key} className={`widget-table__th${numeric ? ' widget-table__th--num' : ''}`}>\r\n {c.label || c.key}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr>\r\n <td className=\"widget-table__td widget-table__empty\" colSpan={columns.length}>Sem dados</td>\r\n </tr>\r\n ) : (\r\n rows.map((row, i) => (\r\n <tr key={i}>\r\n {columns.map((c) => {\r\n const raw = row[c.key];\r\n const numeric = !!c.format && c.format !== 'text';\r\n let trend = '';\r\n if (c.format === 'percentage') {\r\n const num = Number(raw);\r\n if (!Number.isNaN(num)) trend = num > 0 ? ' widget-table__td--up' : num < 0 ? ' widget-table__td--down' : '';\r\n }\r\n return (\r\n <td key={c.key} className={`widget-table__td${numeric ? ' widget-table__td--num' : ''}${trend}`}>\r\n {formatCell(raw, c.format)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// Purpose: Widget de filtro interativo no grid (date_range, select, multi_select).\r\n// Scope: Modos temporais (range, monthly, weekly, yearly), select unico, multi-select.\r\n// Modo categorico padrao (select/checkbox) ou lista com busca (searchable).\r\n// Public API: FilterWidget\r\n\r\nimport type { FilterConfig, DateFilterMode } from '../types';\r\nimport {\r\n MONTH_NAMES_SHORT, getFullYearRange, getMonthRange,\r\n getMonthWeeks, parseMonthWeekFromRange,\r\n parseYearFromRange, parseMonthFromRange, getYearRange,\r\n} from '../utils/date';\r\nimport { DashboardDatePicker } from '../components/DashboardDatePicker';\r\nimport { SearchableSelect } from '../components/SearchableSelect';\r\nimport { MULTI_VALUE_SEPARATOR } from '../types';\r\n\r\ninterface Props {\r\n config: FilterConfig;\r\n value: string;\r\n options?: string[];\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}\r\n\r\n// -------Componente principal-------\r\n\r\nexport function FilterWidget({ config, value, options = [], dateBounds, onChange }: Props) {\r\n const filterType = config.filterType || 'select';\r\n const label = config.label || 'Filtro';\r\n const dateMode: DateFilterMode = config.dateFilterMode || 'range';\r\n\r\n return (\r\n <div className=\"widget-filter\">\r\n <label className=\"widget-filter__label\">{label}</label>\r\n {filterType === 'date_range' ? (\r\n dateMode === 'yearly' ? (\r\n <YearlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : dateMode === 'monthly' ? (\r\n <MonthlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : dateMode === 'weekly' ? (\r\n <WeeklyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n ) : (\r\n <DateRangeFilter value={value} dateBounds={dateBounds} onChange={onChange} />\r\n )\r\n ) : (\r\n <SelectFilter\r\n value={value}\r\n options={options}\r\n multi={filterType === 'multi_select'}\r\n searchable={config.searchable || false}\r\n onChange={onChange}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// -------DateRangeFilter (modo range puro)-------\r\n\r\nfunction DateRangeFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start, end] = value ? value.split('|') : ['', ''];\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--stacked\">\r\n <DashboardDatePicker\r\n value={start}\r\n minIso={dateBounds?.min}\r\n maxIso={end || dateBounds?.max}\r\n selectsStart\r\n startIso={start}\r\n endIso={end}\r\n placeholder=\"Data inicial\"\r\n onChange={(iso) => onChange(`${iso}|${end}`)}\r\n />\r\n <DashboardDatePicker\r\n value={end}\r\n minIso={start || dateBounds?.min}\r\n maxIso={dateBounds?.max}\r\n selectsEnd\r\n startIso={start}\r\n endIso={end}\r\n placeholder=\"Data final\"\r\n onChange={(iso) => onChange(`${start}|${iso}`)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n// -------YearlyFilter (modo anual)-------\r\n\r\nfunction YearlyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseYearFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const years = getYearRange(dateBounds);\r\n\r\n const handleYearChange = (year: number) => {\r\n const yr = getFullYearRange(year);\r\n onChange(`${yr.start}|${yr.end}`);\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--year\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => handleYearChange(parseInt(e.target.value))}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------MonthlyFilter (modo mensal)-------\r\n\r\nfunction MonthlyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseMonthFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\r\n const years = getYearRange(dateBounds);\r\n\r\n const handleMonthChange = (year: number, month: number) => {\r\n const range = getMonthRange(year, month);\r\n onChange(`${range.start}|${range.end}`);\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--month\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedMonth}\r\n onChange={(e) => handleMonthChange(selectedYear, parseInt(e.target.value))}\r\n >\r\n {MONTH_NAMES_SHORT.map((name, i) => (\r\n <option key={i + 1} value={i + 1}>{name}</option>\r\n ))}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => handleMonthChange(parseInt(e.target.value), selectedMonth)}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------WeeklyFilter (modo semanal)-------\r\n\r\nfunction WeeklyFilter({ value, dateBounds, onChange }: {\r\n value: string;\r\n dateBounds?: { min: string | null; max: string | null } | null;\r\n onChange: (value: string) => void;\r\n}) {\r\n const [start] = value ? value.split('|') : [''];\r\n const parsed = parseMonthFromRange(start);\r\n const now = new Date();\r\n const selectedYear = parsed?.year ?? now.getFullYear();\r\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\r\n const years = getYearRange(dateBounds);\r\n\r\n const monthWeeks = getMonthWeeks(selectedYear, selectedMonth);\r\n const selectedWeekIdx = parseMonthWeekFromRange(start, selectedYear, selectedMonth) || 1;\r\n\r\n return (\r\n <div className=\"widget-filter__date-range widget-filter__date-range--week\">\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedYear}\r\n onChange={(e) => {\r\n const y = parseInt(e.target.value);\r\n const weeks = getMonthWeeks(y, selectedMonth);\r\n const w = weeks[0];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedMonth}\r\n onChange={(e) => {\r\n const m = parseInt(e.target.value);\r\n const weeks = getMonthWeeks(selectedYear, m);\r\n const w = weeks[0];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {MONTH_NAMES_SHORT.map((name, i) => (\r\n <option key={i + 1} value={i + 1}>{name}</option>\r\n ))}\r\n </select>\r\n <select\r\n className=\"widget-filter__select\"\r\n value={selectedWeekIdx}\r\n onChange={(e) => {\r\n const w = monthWeeks[parseInt(e.target.value) - 1];\r\n if (w) onChange(`${w.start}|${w.end}`);\r\n }}\r\n >\r\n {monthWeeks.map((w) => (\r\n <option key={w.index} value={w.index}>{w.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\n// -------SelectFilter (categorico)-------\r\n\r\nfunction SelectFilter({ value, options, multi, searchable, onChange }: {\r\n value: string;\r\n options: string[];\r\n multi: boolean;\r\n searchable: boolean;\r\n onChange: (value: string) => void;\r\n}) {\r\n // Modo lista com busca: unico componente cobre selecao unica e multipla\r\n if (searchable) {\r\n return (\r\n <SearchableSelect\r\n value={value}\r\n options={options}\r\n multi={multi}\r\n onChange={onChange}\r\n />\r\n );\r\n }\r\n\r\n if (multi) {\r\n const selected = value ? value.split(MULTI_VALUE_SEPARATOR) : [];\r\n const toggle = (opt: string) => {\r\n const next = selected.includes(opt)\r\n ? selected.filter((s) => s !== opt)\r\n : [...selected, opt];\r\n onChange(next.join(MULTI_VALUE_SEPARATOR));\r\n };\r\n\r\n return (\r\n <div className=\"widget-filter__multi\">\r\n {/* Limpar filtro: desmarca tudo. Vazio = todos selecionados (sem filtro). */}\r\n {selected.length > 0 && (\r\n <button\r\n type=\"button\"\r\n className=\"widget-filter__multi-clear\"\r\n onClick={() => onChange('')}\r\n >\r\n Limpar filtro\r\n </button>\r\n )}\r\n {options.map((opt) => (\r\n <label key={opt} className=\"widget-filter__multi-option\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selected.includes(opt)}\r\n onChange={() => toggle(opt)}\r\n />\r\n {opt}\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <select\r\n className=\"widget-filter__select\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n >\r\n <option value=\"\">Todos</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>{opt}</option>\r\n ))}\r\n </select>\r\n );\r\n}\r\n","// Purpose: Widget de variavel editavel no grid (what-if scenarios).\n// Scope: Input numerico com label, formato e opcao de bloqueio.\n// Public API: VariableWidget\n\nimport type { VariableConfig } from '../types';\n\ninterface Props {\n config: VariableConfig;\n value: number;\n onChange: (value: number) => void;\n}\n\nconst FORMAT_SUFFIX: Record<string, string> = {\n currency: 'R$',\n percentage: '%',\n};\n\nexport function VariableWidget({ config, value, onChange }: Props) {\n const label = config.label || 'Variavel';\n const locked = config.locked || false;\n const fmt = config.variableFormat || 'number';\n const suffix = FORMAT_SUFFIX[fmt] || '';\n\n return (\n <div className={`widget-variable ${locked ? 'widget-variable--locked' : ''}`}>\n <label className=\"widget-variable__label\">{label}</label>\n <div className=\"widget-variable__input-wrapper\">\n <input\n className=\"widget-variable__input\"\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n disabled={locked}\n step={fmt === 'integer' ? 1 : 0.01}\n />\n {suffix && <span className=\"widget-variable__suffix\">{suffix}</span>}\n </div>\n {locked && <span className=\"widget-variable__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Widget de paleta de cores editavel no grid.\n// Scope: Permite ao usuario do dashboard trocar a paleta em runtime. Respeita bloqueio.\n// Public API: ColorPaletteWidget\n\nimport type { PaletteConfig } from '../types';\nimport { ColorPaletteSelector } from '../components/ColorPaletteSelector';\n\ninterface Props {\n config: PaletteConfig;\n palette: string[];\n onChange: (colors: string[]) => void;\n}\n\nexport function ColorPaletteWidget({ config, palette, onChange }: Props) {\n const label = config.label || 'Cores';\n const locked = config.locked || false;\n\n return (\n <div className={`widget-palette ${locked ? 'widget-palette--locked' : ''}`}>\n <label className=\"widget-palette__label\">{label}</label>\n <ColorPaletteSelector selected={palette} onSelect={onChange} customMode disabled={locked} />\n {locked && <span className=\"widget-palette__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Dispatch de rendering por tipo de widget (dados + controle).\r\n// Scope: Recebe computed data e/ou config, renderiza widget correto.\r\n// Public API: WidgetRenderer\r\n\r\nimport type { WidgetType, AnyWidgetConfig, FilterConfig, VariableConfig, PaletteConfig } from '../types';\r\nimport { getSeries } from '../palettes';\r\nimport { KPIWidget } from './KPIWidget';\r\nimport { GaugeWidget } from './GaugeWidget';\r\nimport { ChartWidget } from './ChartWidget';\r\nimport { TableWidget } from './TableWidget';\r\nimport { FilterWidget } from './FilterWidget';\r\nimport { VariableWidget } from './VariableWidget';\r\nimport { ColorPaletteWidget } from './ColorPaletteWidget';\r\n\r\ninterface Props {\r\n type: WidgetType;\r\n computed: Record<string, unknown>;\r\n palette: string[];\r\n // Control widget props (opcionais)\r\n config?: AnyWidgetConfig;\r\n filterValue?: string;\r\n filterOptions?: string[];\r\n dateBounds?: { min: string; max: string } | null;\r\n onFilterChange?: (value: string) => void;\r\n variableValue?: number;\r\n onVariableChange?: (value: number) => void;\r\n onPaletteChange?: (colors: string[]) => void;\r\n}\r\n\r\nexport function WidgetRenderer({\r\n type, computed, palette, config,\r\n filterValue, filterOptions, dateBounds, onFilterChange,\r\n variableValue, onVariableChange,\r\n onPaletteChange,\r\n}: Props) {\r\n if (computed.error) {\r\n return (\r\n <div className=\"widget widget--error\">\r\n <span className=\"widget__error-text\">{String(computed.error)}</span>\r\n </div>\r\n );\r\n }\r\n\r\n // Widgets de dados usam apenas as cores de series (5 primeiras).\r\n // UI colors sao aplicadas via CSS vars no grid container.\r\n const seriesColors = getSeries(palette);\r\n\r\n switch (type) {\r\n case 'kpi_card':\r\n return <KPIWidget data={computed} label={config?.label} />;\r\n case 'gauge':\r\n return <GaugeWidget data={computed} palette={seriesColors} label={config?.label} />;\r\n case 'chart':\r\n return <ChartWidget data={computed} palette={seriesColors} label={config?.label} />;\r\n case 'table':\r\n return <TableWidget data={computed} label={config?.label} />;\r\n case 'filter':\r\n return config && onFilterChange ? (\r\n <FilterWidget\r\n config={config as FilterConfig}\r\n value={filterValue || ''}\r\n options={filterOptions}\r\n dateBounds={dateBounds}\r\n onChange={onFilterChange}\r\n />\r\n ) : null;\r\n case 'variable': {\r\n const vc = config as VariableConfig | undefined;\r\n return vc && onVariableChange ? (\r\n <VariableWidget\r\n config={vc}\r\n value={variableValue ?? vc.variableValue ?? 0}\r\n onChange={onVariableChange}\r\n />\r\n ) : null;\r\n }\r\n case 'color_palette':\r\n return config && onPaletteChange ? (\r\n <ColorPaletteWidget\r\n config={config as PaletteConfig}\r\n palette={palette}\r\n onChange={onPaletteChange}\r\n />\r\n ) : null;\r\n default:\r\n return <div className=\"widget\">Widget: {type}</div>;\r\n }\r\n}\r\n","// Purpose: Componente top-level que renderiza um dashboard completo.\n// Scope: Busca layout + render da API Action com o token, aplica paleta como CSS vars,\n// renderiza grid com widgets interativos (filtros + variaveis + paleta).\n// Public API: Dashboard, DashboardProps\n\nimport { useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useDashboardData } from './hooks/useDashboardData';\nimport { useGridGeometry } from './hooks/useGridGeometry';\nimport { WidgetRenderer } from './widgets/WidgetRenderer';\nimport { getPaletteCssVars } from './palettes';\nimport { CONTROL_WIDGET_SET } from './types';\nimport type { WidgetDefinition } from './types';\nimport type { DashboardGeometry } from './utils/grid';\nimport {\n CELL_ASPECT, GRID_GAP_PX, GRID_PADDING_PX, MIN_CELL_HEIGHT_PX,\n computeGridHeight, computeWidgetAspect,\n} from './utils/grid';\n\nexport interface DashboardProps {\n /** Token Bearer de acesso ao dashboard. */\n token: string;\n /**\n * Proporcao largura/altura da celula do grid. Default 1 (celula quadrada).\n *\n * A largura da celula vem da largura do container dividida pelo numero de\n * colunas do layout; a altura e derivada desta proporcao. E o que mantem o\n * dashboard com a mesma forma em qualquer aplicacao que o embuta.\n */\n cellAspect?: number;\n /**\n * Largura de container, em px, abaixo da qual os widgets sao empilhados em\n * coluna unica, cada um preservando a propria proporcao. `'auto'` usa o\n * limiar natural do layout — o ponto em que a celula ficaria estreita demais\n * e a proporcao ja nao seria respeitada. Ausente: nunca empilha.\n */\n stackBelow?: number | 'auto';\n /**\n * Notificado a cada mudanca de geometria. A altura do dashboard varia com a\n * largura, entao um host de altura fixa deve usar `gridHeight` para se\n * dimensionar.\n */\n onGeometryChange?: (geometry: DashboardGeometry) => void;\n /** Desliga o aviso de corte emitido no console. */\n silenceWarnings?: boolean;\n /** Classe CSS adicional no container raiz. */\n className?: string;\n}\n\n/** Ordem de leitura — usada apenas ao empilhar, onde a ordem no DOM e a ordem visual. */\nconst byReadingOrder = (a: WidgetDefinition, b: WidgetDefinition) =>\n a.grid.y - b.grid.y || a.grid.x - b.grid.x;\n\nexport function Dashboard({\n token,\n cellAspect = CELL_ASPECT,\n stackBelow,\n onGeometryChange,\n silenceWarnings,\n className,\n}: DashboardProps) {\n const {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n } = useDashboardData(token);\n\n // Mede a raiz, nao o grid: a raiz existe desde o primeiro render (estados de\n // carga e erro tambem a usam), entao a largura ja e conhecida quando o grid\n // aparece — sem frame intermediario com a celula no tamanho minimo.\n const { rootRef, gridRef, stacked } = useGridGeometry({\n columns: layout?.gridColumns ?? 0,\n cellAspect,\n stackBelow,\n onGeometryChange,\n silenceWarnings,\n });\n\n const widgets = useMemo(() => {\n const list = layout?.widgets ?? [];\n return stacked ? [...list].sort(byReadingOrder) : list;\n }, [layout?.widgets, stacked]);\n\n // Estaticas, mas derivadas de utils/grid: mante-las fora do CSS garante que a\n // geometria tenha uma fonte so. O React as escreve uma vez e nao volta mais.\n const rootStyle = {\n '--dash-gap': `${GRID_GAP_PX}px`,\n '--dash-pad': `${GRID_PADDING_PX}px`,\n } as CSSProperties;\n\n const rootClass = ['preview-tab', className].filter(Boolean).join(' ');\n\n let body: ReactNode;\n\n if (error && !layout) {\n body = <div className=\"preview-tab__error\">{error}</div>;\n } else if (!layout) {\n body = <div className=\"preview-tab__loading\">Carregando dashboard...</div>;\n } else if (layout.widgets.length === 0) {\n body = <div className=\"preview-tab__empty\">Este dashboard nao possui widgets.</div>;\n } else {\n const widgetsData = renderData?.widgets ?? {};\n const dateBounds = renderData?.date_bounds ?? null;\n\n // --dash-cell-h e escrita na raiz pelo useGridGeometry, fora do React.\n // Aqui ficam apenas as medidas que mudam com o layout, nao com o resize.\n const gridStyle = {\n '--dash-cols': layout.gridColumns,\n '--dash-rows': layout.gridRows,\n ...getPaletteCssVars(palette),\n } as CSSProperties;\n\n const gridClass = ['preview-tab__grid', stacked && 'preview-tab__grid--stacked']\n .filter(Boolean).join(' ');\n\n body = (\n <>\n {error && !renderData && <div className=\"preview-tab__error\">{error}</div>}\n\n {renderData && (\n <div className={gridClass} style={gridStyle} ref={gridRef}>\n {widgets.map((widget) => {\n const isControl = CONTROL_WIDGET_SET.has(widget.type);\n const computed = widgetsData[widget.id];\n\n // Empilhado, a proporcao do widget vira aspect-ratio em CSS puro:\n // nao depende de medicao, entao o resize nao re-renderiza nada.\n // O piso evita que um widget largo e baixo (ex.: 30x2) vire uma\n // faixa de poucos pixels ao ocupar a largura inteira.\n const widgetStyle: CSSProperties = stacked\n ? {\n gridColumn: 1,\n aspectRatio: `${computeWidgetAspect(widget.grid.w, widget.grid.h, cellAspect)}`,\n minHeight: `${computeGridHeight(widget.grid.h, MIN_CELL_HEIGHT_PX, GRID_GAP_PX, 0)}px`,\n }\n : {\n gridColumn: `${widget.grid.x + 1} / span ${widget.grid.w}`,\n gridRow: `${widget.grid.y + 1} / span ${widget.grid.h}`,\n };\n\n const variableValue = widget.type === 'variable'\n ? variables[widget.id] ?? (computed?.value as number) ?? widget.config.variableValue ?? 0\n : undefined;\n\n return (\n <div\n key={widget.id}\n className={`preview-tab__widget ${isControl ? 'preview-tab__widget--control' : ''}`}\n style={widgetStyle}\n >\n {isControl || computed ? (\n <WidgetRenderer\n type={widget.type}\n computed={computed || {}}\n palette={palette}\n config={widget.config}\n filterValue={filters[widget.id] || ''}\n filterOptions={(computed?.available_values as string[]) || []}\n dateBounds={dateBounds}\n onFilterChange={(val) => setFilter(widget.id, val)}\n variableValue={variableValue}\n onVariableChange={(val) => setVariable(widget.id, val)}\n onPaletteChange={setPalette}\n />\n ) : (\n <div className=\"preview-tab__widget-loading\">\n {loading ? 'Carregando...' : 'Sem dados'}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {loading && renderData && (\n <div className=\"preview-tab__recalculating\">Atualizando...</div>\n )}\n </>\n );\n }\n\n return <div className={rootClass} style={rootStyle} ref={rootRef}>{body}</div>;\n}\n"],"names":["DEBOUNCE_MS","useDashboardData","token","layout","setLayout","useState","renderData","setRenderData","filters","setFilters","variables","setVariables","localPalette","setLocalPalette","loading","setLoading","error","setError","debounceRef","useRef","appliedSyncedRef","useEffect","cancelled","fetchLayout","res","err","params","buildQueryParams","fetchRender","prev","syncFiltersFromApplied","setFilter","useCallback","widgetId","value","setVariable","setPalette","colors","palette","useMemo","key","val","start","end","applied","synced","id","d","MULTI_VALUE_SEPARATOR","readInlineSize","entry","_b","_a","readBlockSize","resolveStackThreshold","stackBelow","columns","aspect","computeStackThreshold","findClippingAncestor","element","node","overflowY","useGridGeometry","options","optionsRef","rootElRef","gridElRef","observerRef","frameRef","geometryRef","widthRef","gridHeightRef","stackedRef","warnedRef","appliedWidthRef","stacked","setStacked","warnIfClipped","geometry","grid","ancestor","emit","cellAspect","containerWidth","cellWidth","computeCellWidth","next","computeCellHeight","apply","force","root","width","threshold","nextStacked","cancelFrame","scheduleFrame","handleEntries","entries","ensureObserver","rootRef","observer","gridRef","KPIWidget","data","label","displayLabel","formatted","comparison","trendClass","arrow","jsxs","jsx","COLOR_EMPTY","arcPath","cx","cy","r","fraction","angle","endX","endY","formatCompact","abs","GaugeWidget","propLabel","rawValue","valueFormatted","ratio","targetValue","comparisonLabel","exceeded","clamped","fillColor","targetFormatted","stroke","AXIS_STYLE","GRID_STROKE","TOOLTIP_CONTENT_STYLE","TOOLTIP_LABEL_STYLE","tooltipLabelFormatter","payload","first","verbose","useContainerSize","ref","size","setSize","el","height","CartesianChart","Chart","chartData","xKey","series","renderSeries","CartesianGrid","XAxis","YAxis","Tooltip","Legend","s","i","ChartWidget","chartType","title","containerRef","renderChart","PieChart","Pie","name","percent","_","Cell","common","LineChart","color","Line","AreaChart","Area","BarChart","Bar","formatCell","format","n","isNum","TableWidget","activeTab","setActiveTab","tabs","hasTabs","rows","tab","c","numeric","row","raw","trend","num","FilterWidget","config","dateBounds","onChange","filterType","dateMode","YearlyFilter","MonthlyFilter","WeeklyFilter","DateRangeFilter","SelectFilter","DashboardDatePicker","iso","parsed","parseYearFromRange","now","selectedYear","years","getYearRange","handleYearChange","year","yr","getFullYearRange","e","y","parseMonthFromRange","selectedMonth","handleMonthChange","month","range","getMonthRange","MONTH_NAMES_SHORT","monthWeeks","getMonthWeeks","selectedWeekIdx","parseMonthWeekFromRange","w","m","multi","searchable","SearchableSelect","selected","toggle","opt","FORMAT_SUFFIX","VariableWidget","locked","fmt","suffix","ColorPaletteWidget","ColorPaletteSelector","WidgetRenderer","type","computed","filterValue","filterOptions","onFilterChange","variableValue","onVariableChange","onPaletteChange","seriesColors","getSeries","vc","byReadingOrder","a","b","Dashboard","CELL_ASPECT","onGeometryChange","silenceWarnings","className","widgets","list","rootStyle","GRID_GAP_PX","GRID_PADDING_PX","rootClass","body","widgetsData","gridStyle","getPaletteCssVars","gridClass","Fragment","widget","isControl","CONTROL_WIDGET_SET","widgetStyle","computeWidgetAspect","computeGridHeight","MIN_CELL_HEIGHT_PX"],"mappings":"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"}
|
package/dist/internals.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export type { AggregationType, ComparisonType, FilterType, WidgetType, DataWidge
|
|
|
3
3
|
export { DEFAULT_PALETTE, DEFAULT_GRID_COLUMNS, DEFAULT_GRID_ROWS, EMPTY_LAYOUT, WIDGET_TYPE_LABELS, DATA_WIDGET_TYPES, CONTROL_WIDGET_TYPES, CONTROL_WIDGET_SET, AGGREGATION_LABELS, FORMAT_LABELS, NUMERIC_FORMAT_OPTIONS, COMPARISON_LABELS, CHART_TYPE_LABELS, FILTER_TYPE_LABELS, DEFAULT_GRID, DEFAULT_CONFIG, MULTI_VALUE_SEPARATOR, } from './types';
|
|
4
4
|
export { PALETTES, DEFAULT_PALETTE_COLORS, SLOT_INDEX, SLOT_LABELS, SERIES_COUNT, TOTAL_SLOTS, ensurePaletteShape, getSeries, getPaletteCssVars, } from './palettes';
|
|
5
5
|
export type { Palette, PaletteKey } from './palettes';
|
|
6
|
+
export { GRID_GAP_PX, GRID_PADDING_PX, CELL_ASPECT, MIN_CELL_HEIGHT_PX, MAX_CELL_HEIGHT_PX, computeCellWidth, computeCellHeight, computeGridHeight, computeWidgetAspect, computeStackThreshold, } from './utils/grid';
|
|
7
|
+
export type { DashboardGeometry } from './utils/grid';
|
|
6
8
|
export { MONTH_NAMES_SHORT, MONTH_NAMES_FULL, getFullYearRange, getMonthRange, getWeekRange, getISOWeek, getWeeksInMonth, getMonthWeeks, parseYearFromRange, parseMonthFromRange, parseWeekFromRange, parseMonthWeekFromRange, getYearRange, } from './utils/date';
|
|
7
9
|
export type { MonthWeek } from './utils/date';
|
|
8
10
|
export { ColorPaletteSelector } from './components/ColorPaletteSelector';
|
package/dist/internals.js
CHANGED
|
@@ -1,49 +1,59 @@
|
|
|
1
|
-
import { A as e, C as T, a as
|
|
1
|
+
import { A as e, C as T, a as _, b as E, c as L, d as t, e as A, D as S, f as R, g as O, h as o, i as I, j as r, k as P, l as D, E as g, F as G, m as M, G as C, n as F, M as N, o as l, p as n, q as U, r as h, N as p, P as W, S as c, s as m, t as H, u as Y, T as i, W as k, v as u, w as B, x as d, y as X, z as b, B as V, H as f, I as x, J as j, K as q, L as v, O as w, Q as y, R as z, U as J, V as K, X as Q, Y as Z, Z as $, _ as aa, $ as sa, a0 as ea } from "./ColorPaletteSelector-BSAe2YMH.js";
|
|
2
2
|
export {
|
|
3
3
|
e as AGGREGATION_LABELS,
|
|
4
|
-
T as
|
|
4
|
+
T as CELL_ASPECT,
|
|
5
|
+
_ as CHART_TYPE_LABELS,
|
|
5
6
|
E as COMPARISON_LABELS,
|
|
6
7
|
L as CONTROL_WIDGET_SET,
|
|
7
|
-
|
|
8
|
+
t as CONTROL_WIDGET_TYPES,
|
|
8
9
|
A as ColorPaletteSelector,
|
|
9
10
|
S as DATA_WIDGET_TYPES,
|
|
10
|
-
|
|
11
|
+
R as DEFAULT_CONFIG,
|
|
11
12
|
O as DEFAULT_GRID,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
o as DEFAULT_GRID_COLUMNS,
|
|
14
|
+
I as DEFAULT_GRID_ROWS,
|
|
15
|
+
r as DEFAULT_PALETTE,
|
|
16
|
+
P as DEFAULT_PALETTE_COLORS,
|
|
16
17
|
D as DashboardDatePicker,
|
|
17
18
|
g as EMPTY_LAYOUT,
|
|
18
|
-
|
|
19
|
+
G as FILTER_TYPE_LABELS,
|
|
19
20
|
M as FORMAT_LABELS,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
N as
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
C as GRID_GAP_PX,
|
|
22
|
+
F as GRID_PADDING_PX,
|
|
23
|
+
N as MAX_CELL_HEIGHT_PX,
|
|
24
|
+
l as MIN_CELL_HEIGHT_PX,
|
|
25
|
+
n as MONTH_NAMES_FULL,
|
|
26
|
+
U as MONTH_NAMES_SHORT,
|
|
27
|
+
h as MULTI_VALUE_SEPARATOR,
|
|
28
|
+
p as NUMERIC_FORMAT_OPTIONS,
|
|
29
|
+
W as PALETTES,
|
|
30
|
+
c as SERIES_COUNT,
|
|
31
|
+
m as SLOT_INDEX,
|
|
32
|
+
H as SLOT_LABELS,
|
|
28
33
|
Y as SearchableSelect,
|
|
29
|
-
|
|
34
|
+
i as TOTAL_SLOTS,
|
|
30
35
|
k as WIDGET_TYPE_LABELS,
|
|
31
|
-
|
|
32
|
-
B as
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
36
|
+
u as computeCellHeight,
|
|
37
|
+
B as computeCellWidth,
|
|
38
|
+
d as computeGridHeight,
|
|
39
|
+
X as computeStackThreshold,
|
|
40
|
+
b as computeWidgetAspect,
|
|
41
|
+
V as dateToIso,
|
|
42
|
+
f as ensurePaletteShape,
|
|
43
|
+
x as getFullYearRange,
|
|
44
|
+
j as getISOWeek,
|
|
45
|
+
q as getMonthRange,
|
|
46
|
+
v as getMonthWeeks,
|
|
47
|
+
w as getPaletteCssVars,
|
|
48
|
+
y as getSeries,
|
|
49
|
+
z as getWeekRange,
|
|
50
|
+
J as getWeeksInMonth,
|
|
51
|
+
K as getYearRange,
|
|
52
|
+
Q as isoToDate,
|
|
53
|
+
Z as parseMonthFromRange,
|
|
54
|
+
$ as parseMonthWeekFromRange,
|
|
55
|
+
aa as parseWeekFromRange,
|
|
56
|
+
sa as parseYearFromRange,
|
|
57
|
+
ea as setApiUrl
|
|
48
58
|
};
|
|
49
59
|
//# sourceMappingURL=internals.js.map
|