Roadmap
Visão geral de onde o Sulfite está e para onde estamos indo.
Estado atual
| Componente | Status | Descrição |
|---|---|---|
| sulfite_core | Estável | Motor de relatórios com 14 tipos de elementos, parser JSON, processamento de dados, ScriptEngine (filter/sort/limit/distinct/addField), GroupBands, geração multiformato (PDF, HTML, CSV, Excel), parâmetros de impressão com lookups HTTP e banco de dados, paginação de lookups, novos tipos de parâmetro (currency, datetime), campos format/rounding por parâmetro, formatos numéricos estilo Excel (#,##0.00), pacote .sulfite (RFC-017) |
| sulfite_studio | Funcional | Editor visual com canvas interativo, inspetor de propriedades, desfazer/refazer, tradução, seletor de cores, tema personalizado, editor de gráficos, GroupBands, Transform Pipeline Editor, filtros dinâmicos com lookups e cascata (RFC-015), autocomplete de agregados (RFC-013), persistência de layout (RFC-014), preview em tempo real, save/load de .sulfite (RFC-017), aba Scripts com code_forge + Dart (RFC-016) |
| sulfite_report_manager | Novo | Widget Flutter completo de gerenciamento de relatórios — CRUD, busca, permissões granulares, visualizador integrado com filtros automáticos, exportações e abertura no Designer (RFC-018) |
| sulfite_cli | Funcional | Gera PDFs pela linha de comando — compilável para executável nativo (~42ms por PDF) |
| Exportação multiformato | Implementado | Gera PDF, HTML, CSV e Excel a partir do mesmo JSON |
| FontBytesLoader | Implementado | Interface para carregamento de fontes — desacopla o motor de relatórios do Flutter (AssetFontBytesLoader) e permite uso em CLI/servidor (FileFontBytesLoader) |
| ScriptEngine | Implementado | Motor de transformação declarativa — filter, sort, limit, distinct, addField com expressões, AND/OR/NOT; parâmetros injetados no contexto |
| GroupBands | Implementado | Quebra de grupo com groupHeader e groupFooter — subtotais automáticos por grupo |
| Advanced Scripting | Implementado | Scripts Dart com afterQuery/beforeRender hooks via dart_eval; replaces declarative transforms (RFC-016) |
| Print Filters | Implementado | Parâmetros interativos antes de imprimir — diálogo automático, lookups HTTP e banco de dados (LookupConfig.http / LookupConfig.db), paginação de lookup, novos tipos currency e datetime, campos format/rounding por parâmetro, validação declarativa, dependências em cascata, injeção em expressões e URLs REST (RFC-011, RFC-015) |
| sulfite_datasources | Implementado | DbLookupResolver — executa queries SQL parametrizadas ({_search}, {_page}, {_page_size}, {_offset}) com paginação e cache; PostgresDataSourceResolver e RestDataSourceResolver |
| Pacote .sulfite | Implementado | Formato ZIP portátil com definição + assets embutidos — save/load no Studio e suporte no Manager (RFC-017) |
| Documentação | Online | Documentação com playground interativo no navegador |
Próximos passos
Fase 1 — Editores mais completos no Studio Concluído
- Edição visual de colunas de tabela (
TableColumnEditor) - Estilização de trechos de texto — negrito, itálico, cor (
TextSpanEditor) - Configuração visual dos modos de arredondamento (
RoundingConfigEditor) - Seletor de formatos numéricos e de data (
FormatPickerField) - Seletor de cores com paleta, campo hex e sincronização bidirecional (
StudioColorPickerDialog) - Reordenar séries de gráfico por drag & drop (
ChartEditorDialog) - Seleção de idioma (pt-BR / en-US) com aplicação imediata
- Tema personalizado: cor primária livre via picker de cores; tabela de papéis do tema com hex
Fase 2 — Edição JSON ↔ Canvas (RFC 004) Concluído
- Editar o JSON e ver o canvas atualizar automaticamente (e vice-versa)
- Validação em tempo real — erros e avisos aparecem inline no editor de código
- Editor com syntax highlighting, busca, formatação automática e tooltips de propriedades (
JsonEditorWidget)
Fase 2a — Chat IA integrado ao Studio Concluído
- Agente LLM que gera
ReportDefinitioncompleto a partir de descrição em linguagem natural - 5 provedores: OpenAI, Anthropic, Ollama (local), GitHub Models, GitHub Copilot
- Auto-correção automática de JSON inválido (até 3 tentativas)
- Painel flutuante arrastável + modo dockado como aba lateral
- Contexto dinâmico: JSON do relatório atual é injetado a cada mensagem
- Suporte a imagens no chat (envia como data URI)
- Sem efeito no bundle quando
chatConfignão é fornecido
Fase 2b — printWhen por elemento + ScriptEngine Concluído
printWhenem qualquerReportElement— expressão booleana que oculta o elemento quando avaliafalse- Expressões com
AND,OR,NOTlógicos AdvancedScriptEnginecom hooksafterQueryebeforeRender— substituiu o campotransformsremovido
Fase 2c — Studio auto-explicativo + DataSource + Editors visuais Concluído
- Tooltips e help cards em todo o Studio com i18n (pt-BR / en-US)
DataSourceResolver+RestDataSourceResolver— interface abstrata para fontes externasTableColumnEditor— edição visual de colunas de tabelaTextSpanEditor— estilização visual de trechos de texto (negrito, itálico, cor)
Fase 2d — GroupHeader / GroupFooter Bands (RFC 009) Concluído
- Novos tipos de band:
groupHeaderegroupFootercom campogroupBy DataProcessoragrupa registros automaticamente pela chave- Subtotais por grupo:
AggregateElementrespeita o escopo de grupo - PDF, HTML, CSV e Excel renderizam a hierarquia grupo → detalhe → subtotal
- Studio:
AddBandDialogcom tiposgroupHeader/groupFooter,PropertyInspectorcom campogroupBy
Fase 2e — Transform Pipeline no Studio (RFC 010) Concluído
TransformPipelineEditor— painel visual com lista reordenável de operações- Cada operação: dropdown de tipo, dropdown de source, campos de parâmetros específicos
ExpressionEditorBackendcom syntax highlighting e autocomplete de campos do schema- Preview em tempo real via
compute()(isolate) — executa pipeline nos dados de amostra DesignerViewModel:addTransform,removeTransform,reorderTransforms,updateTransform- 28 chaves i18n (pt-BR + en-US)
Fase 2f — Print Filters, Unify Rect, Aggregate AutoComplete, Layout Persistence (RFC 011–014) Concluído
RFC-011 — Print Filters (parâmetros estáticos)
ReportParameter— model Freezed com tipotext/number/date/selectScriptEngine.execute()— injeta parâmetros no contexto de expressõesRestDataSourceResolver.expandUrl()— expande{paramId}em templates de URL RESTPrintParamsDialog— diálogo modal automático antes de imprimir/exportarParameterEditor— editor inline no painel de configurações do relatórioExpressionEvaluator— comparação lexicográfica>=/<=/>/<para strings/datas
RFC-015 — sulfite_filtros (lookups dinâmicos)
LookupConfig— modelo para busca de opções via HTTP com cache e placeholdersLookupResolver/HttpLookupResolver— interface e implementação HTTP com proteção SSRFSulfiteFilterScreen— widget de filtros com lookups, cascata e validação inlineValidationRule— 9 regras de validação declarativa (required, min, max, dateBefore, dateAfter, etc.)dependsOn— dependências em cascata entre parâmetros
RFC-012 — Unify Rect + RoundedRect
borderRadiusadicionado aoRectElement(default0.0)- JSONs antigos com
type: roundedRectmigram automaticamente paraRectElement RoundedRectElementremovido do código
RFC-013 — Aggregate AutoComplete
AggregateComputer— utilitário:compute/preview/fieldsFromRows_AggregateTargetKeyField— autocomplete para campotargetKeyno designer
RFC-014 — Layout Persistence
collapsedPanels: List<String>adicionado aStudioPreferencesPreferencesProvider:isPanelCollapsed / togglePanelCollapsed / updatePanelWeight
Fase 2g — sulfite_filtros: Lookups Dinâmicos e Cascata (RFC 015) Concluído
LookupConfig— modelo Freezed: URL com{paramId}, método HTTP, cache,refreshOnDependencyChangeLookupResolver— interface abstrata +HttpLookupResolvercom proteção SSRFSulfiteFilterScreen— widget standalone: campos text/number/date/select + select com lookup (loading state)ValidationRule— 9 regras declarativas: required, minLength, maxLength, min, max, dateBefore, dateAfter, lessThan, greaterThandependsOn— cascata automática: quando o valor de um parâmetro-pai muda, filhos são recarregados- 14 chaves i18n adicionadas (pt-BR + en-US)
Fase 2h — Advanced Scripting Engine (RFC 016) Concluído
ReportScriptmodel Freezed —id,hook(afterQuery / beforeRender / onFilter),code,descriptionAdvancedScriptEngine— registra handlers Dart porscriptId, executa hooks em ordem de declaraçãoScriptContext— API segura:datasource(),param(),context(),query(),setBandVisible(),setElementVisible(),setElementProperty(),removeBand(),log()ScriptMutations— acumula mutações de layout (hide/show bands e elementos, property overrides)SqlBridge— interface para execução de queries SQL auxiliares (PostgreSQL, REST, Mock)- Campo
scripts: List<ReportScript>adicionado aoReportDefinition(backward compatible, default[])
Fase 2h2 — Studio: code_forge + aba Scripts (RFC 016 Sprint 3) Concluído
- Flutter 3.41.5 (Dart 3.11.3) — migração de todos os pacotes para SDK
^3.11.1via FVM code_forge ^9.2.0substituire_editor— Rope data structure, LSP builtin, multi-cursor, code folding avançadoCodeForgeBackend— novo backend do JSON Editor (substituiReEditorBackend) com syntax highlighting JSONCodeForgeExpressionBackend— novo backend do Expression Editor com snippets de campos de schema- Aba Scripts no Studio — quarto modo no toolbar (
SegmentedButton) ao lado de Design / Preview / CodeScriptEditorWidget— lista lateral de scripts com drag-to-reorder, add/deleteCodeForgecomlangDart+vs2015Theme+ 11 snippets deScriptContext(ctx.datasource, ctx.query, ctx.param, etc.)- Toolbar por script: seletor de hook (afterQuery / beforeRender / onFilter) + campo de descrição
- Modo scripts oculta sidebar de design (sem toolbar de elementos)
DesignerViewModel.updateScripts()— atualiza a lista de scripts sem registrar no undo/redo global
Fase 2i — Formato .sulfite (RFC 017) Concluído
SulfitePackageWriter— serializaReportDefinition+ assets em ZIP portátil (.sulfite)SulfitePackageReader— extrai e reconstrói a definição a partir do ZIP- Studio: salva/abre pacotes
.sulfitecom opção de incluir dados de exemplo ReportManagerWidget: detectastorageKind: packagee usaSulfitePackageReaderautomaticamente- Assets (fontes, imagens) embutidos no pacote — relatório autocontido e portátil
Fase 2j — sulfite_report_manager (RFC 018) Concluído
ReportManagerWidget— tela completa com lista, busca, CRUD e permissões granularesReportRepository— interface abstrata + 4 implementações:InMemory,Sqlite,Rest,Postgres- Fluxo viewer-first: relatório abre no visualizador (
SulfiteConsumerScreen); Designer só abre secanSettings: true - Carregamento diferido pós-animação +
compute()para parsear definição em background onGetInlinePayload— fornece dados inline por relatório (relatórios estáticos/demo)onEditReport— callback comReportDefinitionjá parseada (sem re-parsear no Designer)- Suporte a
.sulfitee JSON como formatos de armazenamento SulfiteFilterScreenmigrado paraStudioDialogShell(visual consistente com o Studio)
Fase 2k — Lookups DB, novos tipos de parâmetro e formatos numéricos Concluído
LookupConfig: union http / db
LookupConfigrefatorado para union selada com discriminador"source"— backward-compatible (documentos semsourcecontinuam funcionando como HTTP)LookupConfig.db— novo backend de lookup que executa SQL contra uma entrada doConnectionRegistryDbLookupResolver(pacotesulfite_datasources) — resolves queries PostgreSQL parametrizadas com{_search},{_page},{_page_size},{_offset}e{_schema}- Paginação em lookups HTTP e DB —
pageSize+fetchPage()com suporte a respostameta.total/page/perPage - Cache separado para resultados paginados (
_pageCache) para evitar recomputação inconsistente dehasMore - SSRF: adicionado
http://127.0.0.1como origem permitida além dehttps://ehttp://localhost
Novos tipos de parâmetro
currency— campo com máscara monetária e arredondamento configuráveldatetime— seletor de data e hora (yyyy-MM-ddTHH:mm)- Campo
formatemReportParameter— padrãointlparadate/datetime, máscara"<milhar><decimal><casas>"paracurrency, precisão paranumber - Campo
roundingemReportParameter— aplicahalf_even,half_up,half_down,up,down,truncateao reformatar no blur
Formatos numéricos estilo Excel
ValueFormatteraceita padrões#,##0.00,#,##0,0.00,#,##0.000, etc. — mesmo estilo do Excel e JasperReports_formatNumberagora usaroundNumWithModecomhalf_evenem vez detoStringAsFixeddireto
Fase 3 — Conectar a bancos e APIs (RFC 001) Parcial
DbLookupResolver— lookups de banco já funcionam (concluído na Fase 2k)PostgresDataSourceResolvereRestDataSourceResolver— fontes de dados externas (concluído)- Próximo passo: resolver SQLite e outros bancos diretamente como
DataSource(fonte de dados completa, não apenas lookup)
Fase 4 — Relatórios com milhões de registros (RFC 007) Concluído
- True Streaming Pipeline —
processDataStreamconsomeStream<Map>incrementalmente processDataStreamChunkedpara processamento em lotes semOutOfMemoryErrorDataSourceResolver+RestDataSourceResolverpara fontes externas via HTTP
Fase 5 — Novos tipos de elementos (RFC 002) Parcial
| Elemento / Feature | Descrição | Status |
|---|---|---|
ChartElement | Gráficos (barra, linha, pizza) com legenda, grade, rótulos | Pronto |
| Chart: barras agrupadas | Múltiplas séries lado a lado com offset automático | Pronto |
| Chart: barras empilhadas | stacked: true em PDF, HTML e Studio | Pronto |
| Chart: borda | hasBorder, borderDashed, cores e espessura | Pronto |
| Chart: paleta consistente | 10 cores compartilhadas entre PDF, HTML e Studio | Pronto |
forcePageBreakBefore | Quebra de página por band (Header, Detail, Summary, Footer) | Pronto |
BandVisibility | Controla em quais páginas Header/Footer são renderizados (firstPage, lastPage, oddPages…) | Pronto |
showOnPage | Renderiza a band somente em uma página específica | Pronto |
printWhen | Expressão booleana para ocultar band condicionalmente | Pronto |
CrosstabElement | Tabela cruzada com totalizadores | A fazer |
SubreportElement | Relatório dentro de relatório | A fazer |
QrCodeAdvancedElement | QR Code com logo e estilos | A fazer |
ConditionalElement | Mostrar/ocultar elementos por condição | A fazer |
HtmlElement | Bloco HTML livre dentro do PDF | A fazer |
Fase 6 — Editar gráficos no Studio (RFC 008) Concluído
- Editar propriedades do gráfico visualmente — tipo, cores, legendas (
ChartEditorDialog) - Adicionar e remover séries de dados com poucos cliques
- Gráfico atualiza em tempo real no canvas
- Reordenar séries por drag & drop
RFCs
Todas as propostas técnicas estão documentadas como RFCs no repositório:
| RFC | Título | Status |
|---|---|---|
| 001 | Dynamic DataSource Resolution with Plugin System | Parcial |
| 002 | Advanced PDF Elements & Multi-Format Export | Parcial |
| 004 | Studio DX — Bidirectional Sync & Real-time Validation | Concluído |
| 006 | Studio Layout & Preferences Persistence | Concluído |
| 007 | True Streaming Pipeline | Concluído |
| 008 | Charts Integration in Studio | Concluído |
| 009 | GroupHeader / GroupFooter Bands | Concluído |
| 010 | Transform Pipeline Studio | Concluído |
| 011 | Print Filters — Parâmetros interativos antes de imprimir | Concluído |
| 012 | Unify Rect + RoundedRect | Concluído |
| 013 | Aggregate AutoComplete no Studio | Concluído |
| 014 | Layout Persistence — collapsedPanels + panelWeight | Concluído |
| 015 | sulfite_filtros — Lookups HTTP e DB, Paginação, Cascata, Validação, currency/datetime | Concluído |
| 016 | Advanced Scripting Engine | Concluído |
| 017 | Formato .sulfite — Pacote portátil com assets embutidos | Concluído |
| 018 | sulfite_report_manager — Gerenciador de relatórios Flutter | Concluído |
Quer contribuir ou sugerir uma RFC? Abra uma issue no GitHub.