Skip to content

Roadmap

Visão geral de onde o Sulfite está e para onde estamos indo.

Estado atual

ComponenteStatusDescrição
sulfite_coreEstávelMotor 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_studioFuncionalEditor 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_managerNovoWidget 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_cliFuncionalGera PDFs pela linha de comando — compilável para executável nativo (~42ms por PDF)
Exportação multiformatoImplementadoGera PDF, HTML, CSV e Excel a partir do mesmo JSON
FontBytesLoaderImplementadoInterface para carregamento de fontes — desacopla o motor de relatórios do Flutter (AssetFontBytesLoader) e permite uso em CLI/servidor (FileFontBytesLoader)
ScriptEngineImplementadoMotor de transformação declarativa — filter, sort, limit, distinct, addField com expressões, AND/OR/NOT; parâmetros injetados no contexto
GroupBandsImplementadoQuebra de grupo com groupHeader e groupFooter — subtotais automáticos por grupo
Advanced ScriptingImplementadoScripts Dart com afterQuery/beforeRender hooks via dart_eval; replaces declarative transforms (RFC-016)
Print FiltersImplementadoParâ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_datasourcesImplementadoDbLookupResolver — executa queries SQL parametrizadas ({_search}, {_page}, {_page_size}, {_offset}) com paginação e cache; PostgresDataSourceResolver e RestDataSourceResolver
Pacote .sulfiteImplementadoFormato ZIP portátil com definição + assets embutidos — save/load no Studio e suporte no Manager (RFC-017)
DocumentaçãoOnlineDocumentaçã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 ReportDefinition completo 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 chatConfig não é fornecido

Fase 2b — printWhen por elemento + ScriptEngine Concluído

  • printWhen em qualquer ReportElement — expressão booleana que oculta o elemento quando avalia false
  • Expressões com AND, OR, NOT lógicos
  • AdvancedScriptEngine com hooks afterQuery e beforeRender — substituiu o campo transforms removido

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 externas
  • TableColumnEditor — edição visual de colunas de tabela
  • TextSpanEditor — estilização visual de trechos de texto (negrito, itálico, cor)

Fase 2d — GroupHeader / GroupFooter Bands (RFC 009) Concluído

  • Novos tipos de band: groupHeader e groupFooter com campo groupBy
  • DataProcessor agrupa registros automaticamente pela chave
  • Subtotais por grupo: AggregateElement respeita o escopo de grupo
  • PDF, HTML, CSV e Excel renderizam a hierarquia grupo → detalhe → subtotal
  • Studio: AddBandDialog com tipos groupHeader/groupFooter, PropertyInspector com campo groupBy

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
  • ExpressionEditorBackend com 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 tipo text/number/date/select
  • ScriptEngine.execute() — injeta parâmetros no contexto de expressões
  • RestDataSourceResolver.expandUrl() — expande {paramId} em templates de URL REST
  • PrintParamsDialog — diálogo modal automático antes de imprimir/exportar
  • ParameterEditor — editor inline no painel de configurações do relatório
  • ExpressionEvaluator — 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 placeholders
  • LookupResolver / HttpLookupResolver — interface e implementação HTTP com proteção SSRF
  • SulfiteFilterScreen — widget de filtros com lookups, cascata e validação inline
  • ValidationRule — 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

  • borderRadius adicionado ao RectElement (default 0.0)
  • JSONs antigos com type: roundedRect migram automaticamente para RectElement
  • RoundedRectElement removido do código

RFC-013 — Aggregate AutoComplete

  • AggregateComputer — utilitário: compute/preview/fieldsFromRows
  • _AggregateTargetKeyField — autocomplete para campo targetKey no designer

RFC-014 — Layout Persistence

  • collapsedPanels: List<String> adicionado a StudioPreferences
  • PreferencesProvider: 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, refreshOnDependencyChange
  • LookupResolver — interface abstrata + HttpLookupResolver com proteção SSRF
  • SulfiteFilterScreen — widget standalone: campos text/number/date/select + select com lookup (loading state)
  • ValidationRule — 9 regras declarativas: required, minLength, maxLength, min, max, dateBefore, dateAfter, lessThan, greaterThan
  • dependsOn — 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

  • ReportScript model Freezed — id, hook (afterQuery / beforeRender / onFilter), code, description
  • AdvancedScriptEngine — registra handlers Dart por scriptId, executa hooks em ordem de declaração
  • ScriptContext — 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 ao ReportDefinition (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.1 via FVM
  • code_forge ^9.2.0 substitui re_editor — Rope data structure, LSP builtin, multi-cursor, code folding avançado
  • CodeForgeBackend — novo backend do JSON Editor (substitui ReEditorBackend) com syntax highlighting JSON
  • CodeForgeExpressionBackend — 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 / Code
    • ScriptEditorWidget — lista lateral de scripts com drag-to-reorder, add/delete
    • CodeForge com langDart + vs2015Theme + 11 snippets de ScriptContext (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 — serializa ReportDefinition + assets em ZIP portátil (.sulfite)
  • SulfitePackageReader — extrai e reconstrói a definição a partir do ZIP
  • Studio: salva/abre pacotes .sulfite com opção de incluir dados de exemplo
  • ReportManagerWidget: detecta storageKind: package e usa SulfitePackageReader automaticamente
  • 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 granulares
  • ReportRepository — interface abstrata + 4 implementações: InMemory, Sqlite, Rest, Postgres
  • Fluxo viewer-first: relatório abre no visualizador (SulfiteConsumerScreen); Designer só abre se canSettings: 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 com ReportDefinition já parseada (sem re-parsear no Designer)
  • Suporte a .sulfite e JSON como formatos de armazenamento
  • SulfiteFilterScreen migrado para StudioDialogShell (visual consistente com o Studio)

Fase 2k — Lookups DB, novos tipos de parâmetro e formatos numéricos Concluído

LookupConfig: union http / db

  • LookupConfig refatorado para union selada com discriminador "source" — backward-compatible (documentos sem source continuam funcionando como HTTP)
  • LookupConfig.db — novo backend de lookup que executa SQL contra uma entrada do ConnectionRegistry
  • DbLookupResolver (pacote sulfite_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 resposta meta.total/page/perPage
  • Cache separado para resultados paginados (_pageCache) para evitar recomputação inconsistente de hasMore
  • SSRF: adicionado http://127.0.0.1 como origem permitida além de https:// e http://localhost

Novos tipos de parâmetro

  • currency — campo com máscara monetária e arredondamento configurável
  • datetime — seletor de data e hora (yyyy-MM-ddTHH:mm)
  • Campo format em ReportParameter — padrão intl para date/datetime, máscara "<milhar><decimal><casas>" para currency, precisão para number
  • Campo rounding em ReportParameter — aplica half_even, half_up, half_down, up, down, truncate ao reformatar no blur

Formatos numéricos estilo Excel

  • ValueFormatter aceita padrões #,##0.00, #,##0, 0.00, #,##0.000, etc. — mesmo estilo do Excel e JasperReports
  • _formatNumber agora usa roundNumWithMode com half_even em vez de toStringAsFixed direto

Fase 3 — Conectar a bancos e APIs (RFC 001) Parcial

  • DbLookupResolver — lookups de banco já funcionam (concluído na Fase 2k)
  • PostgresDataSourceResolver e RestDataSourceResolver — 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 — processDataStream consome Stream<Map> incrementalmente
  • processDataStreamChunked para processamento em lotes sem OutOfMemoryError
  • DataSourceResolver + RestDataSourceResolver para fontes externas via HTTP

Fase 5 — Novos tipos de elementos (RFC 002) Parcial

Elemento / FeatureDescriçãoStatus
ChartElementGráficos (barra, linha, pizza) com legenda, grade, rótulosPronto
Chart: barras agrupadasMúltiplas séries lado a lado com offset automáticoPronto
Chart: barras empilhadasstacked: true em PDF, HTML e StudioPronto
Chart: bordahasBorder, borderDashed, cores e espessuraPronto
Chart: paleta consistente10 cores compartilhadas entre PDF, HTML e StudioPronto
forcePageBreakBeforeQuebra de página por band (Header, Detail, Summary, Footer)Pronto
BandVisibilityControla em quais páginas Header/Footer são renderizados (firstPage, lastPage, oddPages…)Pronto
showOnPageRenderiza a band somente em uma página específicaPronto
printWhenExpressão booleana para ocultar band condicionalmentePronto
CrosstabElementTabela cruzada com totalizadoresA fazer
SubreportElementRelatório dentro de relatórioA fazer
QrCodeAdvancedElementQR Code com logo e estilosA fazer
ConditionalElementMostrar/ocultar elementos por condiçãoA fazer
HtmlElementBloco HTML livre dentro do PDFA 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:

RFCTítuloStatus
001Dynamic DataSource Resolution with Plugin SystemParcial
002Advanced PDF Elements & Multi-Format ExportParcial
004Studio DX — Bidirectional Sync & Real-time ValidationConcluído
006Studio Layout & Preferences PersistenceConcluído
007True Streaming PipelineConcluído
008Charts Integration in StudioConcluído
009GroupHeader / GroupFooter BandsConcluído
010Transform Pipeline StudioConcluído
011Print Filters — Parâmetros interativos antes de imprimirConcluído
012Unify Rect + RoundedRectConcluído
013Aggregate AutoComplete no StudioConcluído
014Layout Persistence — collapsedPanels + panelWeightConcluído
015sulfite_filtros — Lookups HTTP e DB, Paginação, Cascata, Validação, currency/datetimeConcluído
016Advanced Scripting EngineConcluído
017Formato .sulfite — Pacote portátil com assets embutidosConcluído
018sulfite_report_manager — Gerenciador de relatórios FlutterConcluído

Quer contribuir ou sugerir uma RFC? Abra uma issue no GitHub.

Sulfite do 🇧🇷 para o mundo © 2026 Rafael S. Pinheiro