v0.72.0
AFService Map v0.72.0 — Redesign do mapa
Backup/ponto de rollback desta rodada: tag v0.71.1 (também disponível
como branch backup/mapa-pre-v072-20260802). Pacote preparado pelo
ChatGPT sobre o commit 065a3bb (v0.71.0), aplicado aqui já em cima do
hotfix v0.71.1. Aplicado via apply_map_ui_v072.py (validado antes com
--dry-run, sem erro). Sem migration.
A pergunta que importava: isso desfaz o hotfix v0.71.1?
Não. Conferi isso antes de aplicar qualquer coisa, como combinado. O
pacote só toca em templates/map.html, apps/core/context_processors.py,
config/settings.py/docker-compose.yml (versão) e três arquivos novos
(map-ui-v072.js, map-ui-v072.css, um teste estático). Ele referencia
map-link-monitoring.js só como texto-âncora (pra inserir a tag <script>
nova logo depois) e nunca abre map-optical-editor-v3.js — os dois
arquivos que corrigi no hotfix v0.71.1 continuam exatamente como
ficaram lá.
Só precisei ajustar uma coisa antes de aplicar: o script esperava
encontrar a string literal "0.71.0" pra fazer o bump de versão, mas o
main já estava em "0.71.1" por causa do hotfix. Corrigi isso
manualmente (defini a versão pra 0.72.0 direto) antes de rodar o
aplicador — sem isso ele teria abortado com erro, o que já é o
comportamento esperado (falha fechada) quando a base não bate.
A causa raiz do laço de requisições, finalmente resolvida
O print que você mandou (filtrado por Fetch/XHR) mostrou container-layout-v3
e equipment de map-master-suite.js repetindo dezenas de vezes por
segundo. O ChatGPT identificou a causa real: o template carregava dois
editores de estrutura ao mesmo tempo — o antigo (container-structure-v09.js,
que monta suas próprias abas Resumo/Equipamentos/Diagrama/Fibras/YAML) e
a Master Suite (que monta as abas novas Equipamentos/Canvas 2D/Matriz/
Fibras/YAML) — os dois brigando pelo mesmo <dialog id="container-dialog">,
cada um reagindo às mutações do outro. Meu hotfix v0.71.1 (trava de
"já em andamento" + debounce) reduzia o estrago, mas a causa de fundo —
dois sistemas de abas duplicados e competindo — continuava lá.
Este pacote remove o carregamento do editor antigo por completo. Só a
Master Suite continua ativa.
Verificação extra que fiz antes de liberar
Ao ler o map-ui-v072.js novo, encontrei outro observador de mutação
sem proteção contra reagir à própria mudança — exatamente o padrão de
bug do hotfix anterior, só que num lugar novo:
// como estava:
const observer = new MutationObserver(() => requestAnimationFrame(cleanContainerUi));
observer.observe(container, { childList: true, subtree: true, attributes: true, attributeFilter: ["open", "class"] });cleanContainerUi() adiciona classes CSS (classList.add(...)) em
elementos dentro do diálogo — e como o próprio observador escuta mudança
de class, cada chamada dele podia reagendar a si mesmo indefinidamente
(sem gerar requisição de rede dessa vez, mas consumindo CPU/frame à toa).
O observador vizinho no mesmo arquivo já tinha uma trava contra isso;
apliquei a mesma trava aqui antes de liberar:
let containerScheduled = false;
const observer = new MutationObserver(() => {
if (containerScheduled) return;
containerScheduled = true;
requestAnimationFrame(() => {
containerScheduled = false;
cleanContainerUi();
});
});O que entrou
Sidebar operacional nova
Logo da empresa, seletor de projeto, Início, busca no mapa, Equipamentos,
importar KMZ/KML, Alertas, Configurações, alternar tema, botão Sair
vermelho, dados da empresa no rodapé, recolhimento pra uma barra de 72px,
último estado salvo no navegador. As seções antigas (Camadas, Adicionar
ao mapa, Resumo) saem da lateral — Camadas continua no controle inferior
do mapa.
Whitelabel no mapa
O dashboard já usava current_company.logo; o mapa mostrava sempre a
logo estática da AFService. Agora usa automaticamente a logo, o nome
comercial e a cor principal configurados em "Minha administração →
Marca" — sem cadastro separado pro mapa, com fallback pra AFService
quando a empresa não tem logo própria.
Barra de ferramentas única
Selecionar | CTO | Caixa ▾ (CEO/CDO) | Poste | Cabo | Régua | Área | Mais ▾ (CPD/POP, Rack, Torre) | Rotas | Enlaces
"Rotas" só aparece quando a Master Suite confirma uma rota com ligação
real (não só cadastrada pelo nome, sem cabo conectado). "Enlaces" só
aparece depois de um projeto selecionado.
Régua que vira cabo
Marca vários pontos com distância acumulada, permite desfazer ponto,
continuar editando ou descartar, e converte o traçado num cabo real
(nome, código, tipo, modelo/quantidade de fibras, origem, destino,
descrição) — usando a API já existente /api/map/cables/create/, que já
cuida do modelo e da geração das fibras.
Ferramenta Área
Marca por vértices, calcula m² e converte automaticamente pra hectare ou
km², com desfazer vértice, continuar editando e exportação em GeoJSON
(incluindo project_id e area_m2).
Popups HUD modernos
CTO, CEO, CDO, Rack, Torre, CPD/POP, Poste, cabo e outros ganham um
popup novo: ícone do tipo, nome, tipo, código, status real, ação
principal em destaque, ações secundárias organizadas, botão Excluir
realmente vermelho, tema escuro/claro. Os handlers originais (Cabos e
ligações, Equipamentos, Ficha/QR, Fusões, Editar, Excluir, Monitoramento)
são reaproveitados, não recriados — os botões só são movidos pro popup
novo.
Status SNMP sem informação falsa
O popup só mostra indicador de status quando o elemento tem
monitoramento configurado de verdade (lendo as classes que o sistema de
monitoramento da v0.71.0 já aplica): verde pulsante (normal), vermelho
pulsante (offline), amarelo (degradado/atenção), cinza (sem dados), ou
nenhum indicador (sem monitoramento configurado) — nunca mostra "online"
só por o elemento existir no mapa.
Alertas com ou sem ERP
O sino de alertas superior passa a incluir Q(company_id=company.id)
diretamente e não depende mais de a empresa ter ERP configurado — mostra
queda de equipamento, porta, backbone e enlace PTP mesmo pra empresa só
com cadastro manual ou com outro ERP. Empresa em modo projetista
continua sem alerta operacional (ela não tem cliente pra monitorar).
Tema claro e escuro
Botão na sidebar pra alternar entre tema escuro (NOC) e claro, com
preferência salva no navegador.
Verificação feita nesta rodada
--dry-rundo aplicador rodado antes da aplicação real, sem erro (só
precisei corrigir o descompasso de versão antes, explicado acima).- Confirmado por leitura do próprio script que ele não abre nem
reescrevemap-optical-editor-v3.jsnemmap-link-monitoring.js— só
referencia o segundo como texto-âncora. python -m py_compilenos arquivos Python tocados/adicionados.- Sintaxe de
map-ui-v072.js(novo, 815 linhas) verificada com esprima —
precisou neutralizar também separador numérico (1_000_000, recurso
ES2021 que navegadores reais suportam, mas o parser de checagem não). - Chaves de
map-ui-v072.css(novo, 834 linhas) balanceadas;{% if %}/
{% endif %}detemplates/map.htmlbalanceados;docker-compose.yml
validado como YAML. - Rodei manualmente as 5 asserções do teste estático incluído no
pacote (test_map_ui_v072_static.py, que não depende de banco): CSS/JS
novos carregados,container-structure-v09.jsrealmente removido,
ordem de carregamento correta, whitelabel presente no template, API de
criação de cabo/GeoJSON presentes no JS, seletores legados presentes no
CSS de compatibilidade, filtro de empresa presente no context
processor — todas passaram. - Encontrado e corrigido um segundo observador de mutação sem proteção
contra auto-disparo emmap-ui-v072.js(detalhado acima) antes de
liberar.
A suíte Django completa (manage.py check, manage.py test) e os
testes visuais do docs/TEST_PLAN_V072.md dependem de banco, GDAL e
navegador reais — não rodam neste ambiente de preparação.
Atualização
Execute apply no servidor. Sem migration nesta versão. Depois, um
Ctrl+F5 no navegador garante que o JS/CSS novos sejam carregados
(evita cache dos arquivos antigos — incluindo o container-structure-v09.js
que não deve mais nem ser baixado).
Teste sugerido: abrir o mapa e conferir a sidebar nova, a logo/cor da
empresa aparecendo automaticamente, a barra de ferramentas única; abrir
uma Torre/Rack → Equipamentos e conferir que só um conjunto de abas
aparece agora (sem a duplicação Resumo/Equipamentos por baixo); testar a
Régua convertendo um traçado em cabo real; testar a ferramenta Área;
abrir um popup de CTO/CEO/cabo e conferir os botões antigos funcionando
dentro do visual novo; conferir que o sino de alertas aparece mesmo numa
empresa sem ERP; testar a troca de tema claro/escuro. E, principalmente:
repetir o cenário que travou o navegador (abrir Torre → Equipamentos) e
confirmar no DevTools (Fetch/XHR) que não há mais enxurrada de
requisições.