@actionexec/dashboards 0.5.4 → 0.6.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/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/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.\n// Scope: Carrega layout uma vez + render com debounce quando filtros/variaveis mudam.\n// Sincroniza estado local com os defaults aplicados pelo backend na 1a carga.\n// Public API: useDashboardData\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { fetchLayout, fetchRender } from '../api/fetcher';\nimport type { LayoutResponse, RenderResponse } from '../types';\n\nexport interface UseDashboardDataResult {\n layout: LayoutResponse | null;\n renderData: RenderResponse | null;\n loading: boolean;\n error: string | null;\n /** Filtros selecionados (formato string por widget — date_range como \"start|end\"). */\n filters: Record<string, string>;\n /** Overrides de variaveis por widget. */\n variables: Record<string, number>;\n /** Paleta efetiva (override local substitui a do layout). */\n palette: string[];\n setFilter(widgetId: string, value: string): void;\n setVariable(widgetId: string, value: number): void;\n setPalette(colors: string[]): void;\n}\n\nconst DEBOUNCE_MS = 300;\n\nexport function useDashboardData(token: string): UseDashboardDataResult {\n const [layout, setLayout] = useState<LayoutResponse | null>(null);\n const [renderData, setRenderData] = useState<RenderResponse | null>(null);\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [variables, setVariables] = useState<Record<string, number>>({});\n const [localPalette, setLocalPalette] = useState<string[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n const appliedSyncedRef = useRef(false);\n\n // -------Carrega layout uma unica vez (por token)-------\n useEffect(() => {\n let cancelled = false;\n fetchLayout(token)\n .then((res) => { if (!cancelled) setLayout(res); })\n .catch((err: Error) => { if (!cancelled) setError(err.message); });\n return () => { cancelled = true; };\n }, [token]);\n\n // -------Render com debounce quando filtros/variaveis mudam-------\n useEffect(() => {\n if (!layout) return;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n\n debounceRef.current = setTimeout(() => {\n const params = buildQueryParams(filters, variables);\n setLoading(true);\n fetchRender(token, params)\n .then((res) => {\n setRenderData(res);\n if (!appliedSyncedRef.current && res.applied) {\n appliedSyncedRef.current = true;\n setFilters((prev) => ({ ...syncFiltersFromApplied(res.applied), ...prev }));\n }\n setError(null);\n })\n .catch((err: Error) => setError(err.message))\n .finally(() => setLoading(false));\n }, DEBOUNCE_MS);\n\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [token, layout, filters, variables]);\n\n const setFilter = useCallback((widgetId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setVariable = useCallback((widgetId: string, value: number) => {\n setVariables((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setPalette = useCallback((colors: string[]) => {\n setLocalPalette(colors);\n }, []);\n\n const palette = useMemo(\n () => localPalette ?? layout?.palette ?? [],\n [localPalette, layout],\n );\n\n return {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n };\n}\n\n// -------Helpers-------\n\n/** Constroi query params no formato esperado pela API (/render). */\nfunction buildQueryParams(\n filters: Record<string, string>,\n variables: Record<string, number>,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [key, val] of Object.entries(filters)) {\n if (val.includes('|')) {\n const [start, end] = val.split('|');\n if (start) params['f_date_start'] = start;\n if (end) params['f_date_end'] = end;\n } else {\n params[`f_${key}`] = val;\n }\n }\n\n for (const [key, val] of Object.entries(variables)) {\n params[`v_${key}`] = String(val);\n }\n\n return params;\n}\n\n/** Converte `applied` do backend para o formato local de filtros. */\nfunction syncFiltersFromApplied(applied: Record<string, unknown>): Record<string, string> {\n const synced: Record<string, string> = {};\n for (const [id, val] of Object.entries(applied)) {\n if (val && typeof val === 'object' && 'start' in val) {\n const d = val as { start?: string; end?: string };\n synced[id] = `${d.start || ''}|${d.end || ''}`;\n } else if (Array.isArray(val)) {\n synced[id] = val.join(',');\n } else if (typeof val === 'string') {\n synced[id] = val;\n }\n }\n return synced;\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).\n// Scope: Renderiza com dados pre-calculados pelo backend + tooltip tematizado.\n// Public API: ChartWidget\n\nimport { useRef, useState, useEffect, type ComponentType, type ReactElement } from 'react';\nimport {\n BarChart, Bar,\n LineChart, Line,\n AreaChart, Area,\n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n} from 'recharts';\n\nconst AXIS_STYLE = { fontSize: 10, fill: 'var(--text-muted)' };\nconst GRID_STROKE = 'var(--bg-elevated)';\n\n// Tooltip segue a paleta do dashboard via CSS variables (getPaletteCssVars)\nconst TOOLTIP_CONTENT_STYLE = {\n backgroundColor: 'var(--bg-elevated)',\n border: '1px solid var(--bg-paper)',\n borderRadius: '6px',\n color: 'var(--text-primary)',\n};\nconst TOOLTIP_LABEL_STYLE = {\n color: 'var(--text-primary)',\n fontWeight: 600,\n};\n\n// Usa `tooltipLabel` (versao verbose) do data point quando presente,\n// fallback para o label do eixo X (compacto).\nfunction tooltipLabelFormatter(label: unknown, payload: readonly unknown[]): string {\n const first = (Array.isArray(payload) ? payload[0] : undefined) as { payload?: Record<string, unknown> } | undefined;\n const verbose = first?.payload?.tooltipLabel;\n if (typeof verbose === 'string' && verbose) return verbose;\n return String(label ?? '');\n}\n\ninterface SeriesInfo { key: string; label: string }\n\n// Hook para medir dimensoes do container via ResizeObserver\nfunction useContainerSize(ref: React.RefObject<HTMLDivElement | null>) {\n const [size, setSize] = useState({ width: 0, height: 0 });\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n setSize((prev) =>\n prev.width !== Math.floor(width) || prev.height !== Math.floor(height)\n ? { width: Math.floor(width), height: Math.floor(height) }\n : prev\n );\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n\n return size;\n}\n\n// Componente generico para charts cartesianos (bar/line/area)\nfunction CartesianChart({ Chart, chartData, xKey, series, palette, renderSeries, width, height }: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Chart: ComponentType<any>;\n chartData: Record<string, unknown>[];\n xKey: string;\n series: SeriesInfo[];\n palette: string[];\n renderSeries: (s: SeriesInfo, color: string, idx: number) => ReactElement;\n width: number;\n height: number;\n}) {\n return (\n <Chart data={chartData} width={width} height={height}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis dataKey={xKey} tick={AXIS_STYLE} />\n <YAxis tick={AXIS_STYLE} />\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n cursor={{ fill: 'var(--bg-paper)', opacity: 0.3 }}\n />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => renderSeries(s, palette[i % palette.length], i))}\n </Chart>\n );\n}\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nexport function ChartWidget({ data, palette, label: propLabel }: Props) {\n const chartType = String(data.chartType || 'bar');\n const title = propLabel || String(data.label || '');\n const xKey = String(data.xKey || 'label');\n const series = (data.series || []) as SeriesInfo[];\n const chartData = (data.data || []) as Record<string, unknown>[];\n\n const containerRef = useRef<HTMLDivElement>(null);\n const { width, height } = useContainerSize(containerRef);\n\n if (!chartData.length) {\n return <div className=\"widget widget-chart widget-chart--empty\">Sem dados</div>;\n }\n\n const renderChart = () => {\n if (width <= 0 || height <= 0) return null;\n\n if (chartType === 'pie') {\n return (\n <PieChart width={width} height={height}>\n <Pie\n data={chartData}\n dataKey={series[0]?.key || 's0'}\n nameKey={xKey}\n cx=\"50%\" cy=\"50%\" outerRadius=\"75%\"\n label={({ name, percent }: { name: string; percent: number }) =>\n `${name}: ${(percent * 100).toFixed(0)}%`\n }\n labelLine={false}\n >\n {chartData.map((_, i) => (\n <Cell key={i} fill={palette[i % palette.length]} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n />\n </PieChart>\n );\n }\n\n const common = { chartData, xKey, series, palette, width, height };\n\n if (chartType === 'line') {\n return (\n <CartesianChart {...common} Chart={LineChart} renderSeries={(s, color) => (\n <Line key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n stroke={color} strokeWidth={2} dot={chartData.length <= 31} />\n )} />\n );\n }\n\n if (chartType === 'area') {\n return (\n <CartesianChart {...common} Chart={AreaChart} renderSeries={(s, color) => (\n <Area key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n fill={color} stroke={color} fillOpacity={0.3} />\n )} />\n );\n }\n\n return (\n <CartesianChart {...common} Chart={BarChart} renderSeries={(s, color) => (\n <Bar key={s.key} dataKey={s.key} name={s.label}\n fill={color} radius={[3, 3, 0, 0]} />\n )} />\n );\n };\n\n return (\n <div className=\"widget widget-chart\">\n {title && <h4 className=\"widget-chart__title\">{title}</h4>}\n <div ref={containerRef} className=\"widget-chart__container\">\n {renderChart()}\n </div>\n </div>\n );\n}\n","// Purpose: Widget de filtro interativo no grid (date_range, select, multi_select).\n// Scope: Modos temporais (range, monthly, weekly, yearly), select unico, multi-select.\n// Modo categorico padrao (select/checkbox) ou lista com busca (searchable).\n// Public API: FilterWidget\n\nimport type { FilterConfig, DateFilterMode } from '../types';\nimport {\n MONTH_NAMES_SHORT, getFullYearRange, getMonthRange,\n getMonthWeeks, parseMonthWeekFromRange,\n parseYearFromRange, parseMonthFromRange, getYearRange,\n} from '../utils/date';\nimport { DashboardDatePicker } from '../components/DashboardDatePicker';\nimport { SearchableSelect } from '../components/SearchableSelect';\n\ninterface Props {\n config: FilterConfig;\n value: string;\n options?: string[];\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}\n\n// -------Componente principal-------\n\nexport function FilterWidget({ config, value, options = [], dateBounds, onChange }: Props) {\n const filterType = config.filterType || 'select';\n const label = config.label || 'Filtro';\n const dateMode: DateFilterMode = config.dateFilterMode || 'range';\n\n return (\n <div className=\"widget-filter\">\n <label className=\"widget-filter__label\">{label}</label>\n {filterType === 'date_range' ? (\n dateMode === 'yearly' ? (\n <YearlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'monthly' ? (\n <MonthlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'weekly' ? (\n <WeeklyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : (\n <DateRangeFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n )\n ) : (\n <SelectFilter\n value={value}\n options={options}\n multi={filterType === 'multi_select'}\n searchable={config.searchable || false}\n onChange={onChange}\n />\n )}\n </div>\n );\n}\n\n// -------DateRangeFilter (modo range puro)-------\n\nfunction DateRangeFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start, end] = value ? value.split('|') : ['', ''];\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--stacked\">\n <DashboardDatePicker\n value={start}\n minIso={dateBounds?.min}\n maxIso={end || dateBounds?.max}\n selectsStart\n startIso={start}\n endIso={end}\n placeholder=\"Data inicial\"\n onChange={(iso) => onChange(`${iso}|${end}`)}\n />\n <DashboardDatePicker\n value={end}\n minIso={start || dateBounds?.min}\n maxIso={dateBounds?.max}\n selectsEnd\n startIso={start}\n endIso={end}\n placeholder=\"Data final\"\n onChange={(iso) => onChange(`${start}|${iso}`)}\n />\n </div>\n );\n}\n\n// -------YearlyFilter (modo anual)-------\n\nfunction YearlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseYearFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const years = getYearRange(dateBounds);\n\n const handleYearChange = (year: number) => {\n const yr = getFullYearRange(year);\n onChange(`${yr.start}|${yr.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--year\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleYearChange(parseInt(e.target.value))}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------MonthlyFilter (modo mensal)-------\n\nfunction MonthlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const handleMonthChange = (year: number, month: number) => {\n const range = getMonthRange(year, month);\n onChange(`${range.start}|${range.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--month\">\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => handleMonthChange(selectedYear, parseInt(e.target.value))}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleMonthChange(parseInt(e.target.value), selectedMonth)}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------WeeklyFilter (modo semanal)-------\n\nfunction WeeklyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const monthWeeks = getMonthWeeks(selectedYear, selectedMonth);\n const selectedWeekIdx = parseMonthWeekFromRange(start, selectedYear, selectedMonth) || 1;\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--week\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => {\n const y = parseInt(e.target.value);\n const weeks = getMonthWeeks(y, selectedMonth);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => {\n const m = parseInt(e.target.value);\n const weeks = getMonthWeeks(selectedYear, m);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedWeekIdx}\n onChange={(e) => {\n const w = monthWeeks[parseInt(e.target.value) - 1];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {monthWeeks.map((w) => (\n <option key={w.index} value={w.index}>{w.label}</option>\n ))}\n </select>\n </div>\n );\n}\n\n// -------SelectFilter (categorico)-------\n\nfunction SelectFilter({ value, options, multi, searchable, onChange }: {\n value: string;\n options: string[];\n multi: boolean;\n searchable: boolean;\n onChange: (value: string) => void;\n}) {\n // Modo lista com busca: unico componente cobre selecao unica e multipla\n if (searchable) {\n return (\n <SearchableSelect\n value={value}\n options={options}\n multi={multi}\n onChange={onChange}\n />\n );\n }\n\n if (multi) {\n const selected = value ? value.split(',') : [];\n const toggle = (opt: string) => {\n const next = selected.includes(opt)\n ? selected.filter((s) => s !== opt)\n : [...selected, opt];\n onChange(next.join(','));\n };\n\n return (\n <div className=\"widget-filter__multi\">\n {options.map((opt) => (\n <label key={opt} className=\"widget-filter__multi-option\">\n <input\n type=\"checkbox\"\n checked={selected.includes(opt)}\n onChange={() => toggle(opt)}\n />\n {opt}\n </label>\n ))}\n </div>\n );\n }\n\n return (\n <select\n className=\"widget-filter__select\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Todos</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n}\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).\n// Scope: Recebe computed data e/ou config, renderiza widget correto.\n// Public API: WidgetRenderer\n\nimport type { WidgetType, AnyWidgetConfig, FilterConfig, VariableConfig, PaletteConfig } from '../types';\nimport { getSeries } from '../palettes';\nimport { KPIWidget } from './KPIWidget';\nimport { GaugeWidget } from './GaugeWidget';\nimport { ChartWidget } from './ChartWidget';\nimport { FilterWidget } from './FilterWidget';\nimport { VariableWidget } from './VariableWidget';\nimport { ColorPaletteWidget } from './ColorPaletteWidget';\n\ninterface Props {\n type: WidgetType;\n computed: Record<string, unknown>;\n palette: string[];\n // Control widget props (opcionais)\n config?: AnyWidgetConfig;\n filterValue?: string;\n filterOptions?: string[];\n dateBounds?: { min: string; max: string } | null;\n onFilterChange?: (value: string) => void;\n variableValue?: number;\n onVariableChange?: (value: number) => void;\n onPaletteChange?: (colors: string[]) => void;\n}\n\nexport function WidgetRenderer({\n type, computed, palette, config,\n filterValue, filterOptions, dateBounds, onFilterChange,\n variableValue, onVariableChange,\n onPaletteChange,\n}: Props) {\n if (computed.error) {\n return (\n <div className=\"widget widget--error\">\n <span className=\"widget__error-text\">{String(computed.error)}</span>\n </div>\n );\n }\n\n // Widgets de dados usam apenas as cores de series (5 primeiras).\n // UI colors sao aplicadas via CSS vars no grid container.\n const seriesColors = getSeries(palette);\n\n switch (type) {\n case 'kpi_card':\n return <KPIWidget data={computed} label={config?.label} />;\n case 'gauge':\n return <GaugeWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'chart':\n return <ChartWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'filter':\n return config && onFilterChange ? (\n <FilterWidget\n config={config as FilterConfig}\n value={filterValue || ''}\n options={filterOptions}\n dateBounds={dateBounds}\n onChange={onFilterChange}\n />\n ) : null;\n case 'variable': {\n const vc = config as VariableConfig | undefined;\n return vc && onVariableChange ? (\n <VariableWidget\n config={vc}\n value={variableValue ?? vc.variableValue ?? 0}\n onChange={onVariableChange}\n />\n ) : null;\n }\n case 'color_palette':\n return config && onPaletteChange ? (\n <ColorPaletteWidget\n config={config as PaletteConfig}\n palette={palette}\n onChange={onPaletteChange}\n />\n ) : null;\n default:\n return <div className=\"widget\">Widget: {type}</div>;\n }\n}\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","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","PieChart","Pie","name","percent","_","Cell","common","LineChart","color","Line","AreaChart","Area","BarChart","Bar","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/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,6 +1,6 @@
1
1
  export { setApiUrl } from './api/fetcher';
2
- export type { AggregationType, ComparisonType, FilterType, WidgetType, DataWidgetType, ControlWidgetType, ChartType, FormatType, DateFilterMode, Granularity, FilterDefinition, TargetDefinition, GridPosition, ComparisonConfig, AggregationStep, ColumnExpressionTerm, KpiOperand, KpiTerm, ChartSeriesConfig, ChartAxisConfig, KpiCardConfig, GaugeConfig, ChartConfig, FilterConfig, VariableConfig, PaletteConfig, AnyWidgetConfig, WidgetDefinition, WidgetConfigOf, DashboardLayout, FilterValuesResponse, RenderResponse, LayoutResponse, } from './types';
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, } from './types';
2
+ export type { AggregationType, ComparisonType, FilterType, WidgetType, DataWidgetType, ControlWidgetType, ChartType, FormatType, DateFilterMode, Granularity, FilterDefinition, TargetDefinition, GridPosition, ComparisonConfig, AggregationStep, ColumnExpressionTerm, KpiOperand, KpiTerm, ChartSeriesConfig, ChartAxisConfig, KpiCardConfig, GaugeConfig, ChartConfig, FilterConfig, VariableConfig, PaletteConfig, AnyWidgetConfig, TableConfig, TableColumnConfig, TableTabConfig, WidgetDefinition, WidgetConfigOf, DashboardLayout, FilterValuesResponse, RenderResponse, LayoutResponse, } from './types';
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
6
  export { MONTH_NAMES_SHORT, MONTH_NAMES_FULL, getFullYearRange, getMonthRange, getWeekRange, getISOWeek, getWeeksInMonth, getMonthWeeks, parseYearFromRange, parseMonthFromRange, parseWeekFromRange, parseMonthWeekFromRange, getYearRange, } from './utils/date';
package/dist/internals.js CHANGED
@@ -1,44 +1,45 @@
1
- import { A as s, C as T, a as E, b as L, c as _, d as S, D as A, e as t, f as O, g as R, h as r, i as o, j as D, k as I, E as g, F, l as n, M, m as P, N, P as C, S as G, n as U, o as W, p as l, T as Y, W as h, q as k, r as p, s as B, t as m, u as c, v as i, w as H, x as b, y as d, z as u, B as f, G as x, H as j, I as q, J as v, K as w, L as y } from "./index-BXIn44vr.js";
1
+ import { A as e, C as T, a as E, b as L, c as _, d as A, D as S, e as t, f as O, g as R, h as r, i as o, j as I, k as D, E as g, F, l as M, M as P, m as n, n as N, N as U, P as C, S as G, o as W, p as l, q as Y, T as h, W as k, r as p, s as B, t as m, u as c, v as i, w as H, x as b, y as d, z as u, B as f, G as x, H as V, I as j, J as q, K as v, L as w, O as y } from "./ColorPaletteSelector-Bsda66uL.js";
2
2
  export {
3
- s as AGGREGATION_LABELS,
3
+ e as AGGREGATION_LABELS,
4
4
  T as CHART_TYPE_LABELS,
5
5
  E as COMPARISON_LABELS,
6
6
  L as CONTROL_WIDGET_SET,
7
7
  _ as CONTROL_WIDGET_TYPES,
8
- S as ColorPaletteSelector,
9
- A as DATA_WIDGET_TYPES,
8
+ A as ColorPaletteSelector,
9
+ S as DATA_WIDGET_TYPES,
10
10
  t as DEFAULT_CONFIG,
11
11
  O as DEFAULT_GRID,
12
12
  R as DEFAULT_GRID_COLUMNS,
13
13
  r as DEFAULT_GRID_ROWS,
14
14
  o as DEFAULT_PALETTE,
15
- D as DEFAULT_PALETTE_COLORS,
16
- I as DashboardDatePicker,
15
+ I as DEFAULT_PALETTE_COLORS,
16
+ D as DashboardDatePicker,
17
17
  g as EMPTY_LAYOUT,
18
18
  F as FILTER_TYPE_LABELS,
19
- n as FORMAT_LABELS,
20
- M as MONTH_NAMES_FULL,
21
- P as MONTH_NAMES_SHORT,
22
- N as NUMERIC_FORMAT_OPTIONS,
19
+ M as FORMAT_LABELS,
20
+ P as MONTH_NAMES_FULL,
21
+ n as MONTH_NAMES_SHORT,
22
+ N as MULTI_VALUE_SEPARATOR,
23
+ U as NUMERIC_FORMAT_OPTIONS,
23
24
  C as PALETTES,
24
25
  G as SERIES_COUNT,
25
- U as SLOT_INDEX,
26
- W as SLOT_LABELS,
27
- l as SearchableSelect,
28
- Y as TOTAL_SLOTS,
29
- h as WIDGET_TYPE_LABELS,
30
- k as dateToIso,
31
- p as ensurePaletteShape,
32
- B as getFullYearRange,
33
- m as getISOWeek,
34
- c as getMonthRange,
35
- i as getMonthWeeks,
36
- H as getPaletteCssVars,
37
- b as getSeries,
38
- d as getWeekRange,
39
- u as getWeeksInMonth,
40
- f as getYearRange,
41
- x as isoToDate,
26
+ W as SLOT_INDEX,
27
+ l as SLOT_LABELS,
28
+ Y as SearchableSelect,
29
+ h as TOTAL_SLOTS,
30
+ k as WIDGET_TYPE_LABELS,
31
+ p as dateToIso,
32
+ B as ensurePaletteShape,
33
+ m as getFullYearRange,
34
+ c as getISOWeek,
35
+ i as getMonthRange,
36
+ H as getMonthWeeks,
37
+ b as getPaletteCssVars,
38
+ d as getSeries,
39
+ u as getWeekRange,
40
+ f as getWeeksInMonth,
41
+ x as getYearRange,
42
+ V as isoToDate,
42
43
  j as parseMonthFromRange,
43
44
  q as parseMonthWeekFromRange,
44
45
  v as parseWeekFromRange,