Autosave e ciclo draft/active no mapping editor
Autosave a cada 5s salva mudanças como rascunho (draft); pipeline só aplica quando você clica Ativar. Protege contra publicar mudanças não-revisadas.
Como funciona\n\nO editor de mapping agora autosalva suas mudanças a cada 5 segundos como rascunho (status: draft). O pipeline NÃO aplica mappings em draft — ele continua usando a última versão ativa.\n\n### Estados visuais\n\n- Indicador no header:\n - "Salvando rascunho..." (loader azul)\n - "Rascunho salvo às HH:MM:SS" (check verde)\n - "Falha ao salvar rascunho" (X vermelho)\n\n- Banner amarelo sticky quando o mapping está em DRAFT: "Mapping em DRAFT — pipeline ignora drafts. Suas mudanças estão salvas em rascunho — clique Ativar quando quiser publicar."\n\n### Botão Ativar\n\nSubstitui o botão "Salvar" antigo. Clicar promove o mapping pra status=active — pipeline passa a aplicar essa versão.\n\n### Comportamento importante\n\nSe o mapping JÁ está active e você edita qualquer campo, o autosave reverte status pra draft em 5 segundos. Isso protege o pipeline — mudanças não-revisadas não vão pra produção sem você confirmar via Ativar.
Histórico de versões
- 9.0
PR #248: UX destino-first completa. Cards reorder (729 DESTINO lead, 115 OBRIG SEM ORIGEM 🚨, 62 COBERTO, 31 IA, 0 MANUAL, 321 ORIGEM secundário). Banner trocado pra "X campos obrigatórios do destino sem origem". Chips reorder: Todos/Mapeados/Obrig Sem Origem/Destino Sem Cobertura/IA/Manual/Dados Não Usados/Conflitos. Tree nested SAP via loopPath (to_Item.to_PricingElement vira filho de to_Item em vez de sibling). v8.0 era god component 1999→495 LoC.
5/24/2026 · updated
- 8.0
Fase 0 Nexio Next Level COMPLETA (#263) — refactor estrutural do god-component. mapping-editor.tsx 1999 → 495 LoC (-1504 LoC, -75.3%). Meta < 500 atingida. Extraído em PR #229 (stack 6 commits, branch feat/phase-0-rule-drawer): - MappingRuleDrawer (~400 LoC + 3 sub-componentes ConcatenateEditor/ValueMapEditor/CatalogFieldInput movidos + 7 helpers puros exportados: fieldTypeLabel, getActiveCatalogField, computeRuleStatusBadge, hasMigrationCandidates, operatorDisablesValue, buildTransformOptions, CONDITIONAL_OPERATORS) - MappingEditorModals — wrapper dos 5 modais finais (Output, Templates, Confirm, ConversionRules, ConflictResolver) - useMappingDerived (220 LoC + 6 helpers puros: isRejectedSuggestion, matchesFilter, matchesCoverage, matchesSearch, computeStats, isOdataLikeFormat) — agrupa filtered, stats, destCoverage, conflictDests, conflictDestSet, cardinalityConflictCount, availableUnmappedSources, destGroupMap, isOdataLikeSource, odataNavProperties - useMappingFetches (440 LoC) — handlers async + autosave debounced (5s) + beforeunload guard + auto-suggest after sync + SSE streaming pirâmide IA - chore trim de comentários verbosos pra bater < 500 LoC - e2e/mapping-editor.spec.ts — 2 Playwright smoke tests (Fase 0.1) + fixture seedMappingRules Tests vitest: 1150 → 1223 (+73). Playwright: 3 → 4 specs. Lint zero, tsc verde. Pattern Fase 0 consolidado: pure-functional + helper puro exportado + useTranslations interno só quando 60+ keys + FilterKey vive na fonte canônica use-mapping-derived.
5/22/2026 · updated
- 7.0
Stack #162-#168 (7 PRs): refazem o mapping editor end-to-end. Eliminada view Tabela (drawer lateral 680px), Sugerir IA + Sugerir Regras fundidos com 4 chips de progresso, Preview + Output unificados em modal único com 2 tabs, cards de cobertura viram filtros clicáveis (ring info-azul), busca textual no header das views (Opção A: anchors sem match somem), loops colapsáveis com hierarquia recursiva (loopChainOf parser nested LIN[*].FTX[*]), templates gate atrás de super_admin (defense in depth UI+API), autosave debounced 5s força status=draft com banner sticky amarelo (botão Salvar → Ativar). Lint baseline ZERO (3 errors + 6 warnings limpos junto). Net: ~110 linhas removidas no editor + ~500 linhas duplicadas em modais
5/21/2026 · updated