Skip to content

v0.72.1

Choose a tag to compare

@adrianfiio adrianfiio released this 02 Aug 01:45

AFService Map v0.72.1 — Hotfix de consistência de UI

Backup/ponto de rollback desta rodada: branch backup/mapa-pre-v0721-20260802
(pointer no commit c6cf0ec, v0.72.0). Pacote preparado pelo ChatGPT sobre
esse mesmo commit. Aplicado via apply_map_ui_v0721.py (validado antes com
--dry-run, sem erro, e com os checksums SHA-256 do pacote conferidos um a
um contra SHA256SUMS). Sem migration.

Isso desfaz algum hotfix anterior?

Não. Antes de aplicar, li o apply_map_ui_v0721.py inteiro: ele só
acrescenta duas linhas novas no templates/map.html (<link> de
map-ui-v0721.css e <script> de map-ui-v0721.js, ambas logo depois das
equivalentes da v0.72.0), faz o bump de versão em config/settings.py e
docker-compose.yml, e cria três arquivos novos (JS, CSS, teste estático).
Ele nunca abre map-optical-editor-v3.js, map-link-monitoring.js ou
map-master-suite.js, e não reescreve map-ui-v072.js/.css — só
convive com eles. Os hotfixes anteriores (v0.71.1) continuam exatamente
como ficaram.

A causa raiz do menu lateral, verificada antes de aceitar

O relato era: ao recolher o menu, ele não ia pra uma faixa fina de ícones —
ficava uma faixa larga. Fui conferir a explicação do pacote direto no CSS
em vez de confiar de olho:

  • map-master-suite.css tem body.map-master-suite #map-sidebar.map-sidebar-master { width: 272px !important; }.
  • map-ui-v072.css (v0.72.0) tem body.map-ui-v072 #map-sidebar.v072-collapsed { width: 72px !important; }.

As duas regras usam !important e têm a mesma especificidade CSS (1 id

  • 2 classes cada). Quando isso empata, quem carrega por último no HTML
    vence — e dependendo da ordem de <link>, a regra de 272px podia ganhar
    mesmo com a classe v072-collapsed já aplicada. Não era uma falha de
    lógica JS, era um empate de especificidade puro.

O hotfix resolve isso com um seletor mais específico:

body.map-ui-v0721 #map-sidebar.map-sidebar-master.map-sidebar-v072.v072-collapsed,
body.map-ui-v0721 #map-sidebar.map-sidebar-v072.v072-collapsed {
    width: 72px !important;
    min-width: 72px !important;
    max-width: 72px !important;
    flex: 0 0 72px !important;
}

Três/quatro classes em vez de duas — especificidade estritamente maior que
a regra de 272px, então passa a vencer sempre, independente da ordem de
carregamento das folhas de estilo. Também reajusta o Leaflet
(invalidateSize) ao abrir/fechar o menu e mantém o último estado
(recolhido ou não) salvo no navegador.

O que entrou

Menu lateral

  • Recolhe de verdade para 72px (causa raiz explicada acima).
  • Reajusta o tamanho do mapa Leaflet ao abrir/fechar.
  • Mantém o último estado salvo no navegador (localStorage).
  • Logo e cor continuam seguindo o whitelabel da empresa.

Barra superior

  • "Selecionar" virou dois modos explícitos: Visualizar e Editar.
    No modo Editar aparecem as ações administrativas permitidas.
  • Menu reorganizado: Caixa ▾ (CTO/CEO/CDO), além de Poste, Cabo, Régua,
    Área, Mais ▾ (CPD/POP, Rack, Torre), Rotas e Enlaces — todos reaproveitando
    os mesmos botões/handlers legados (data-tool/data-quick-tool) por
    baixo, sem duplicar lógica.

Rotas

  • O botão abre a gaveta de rotas diretamente, sem depender de outro botão
    oculto.
  • Só aparece quando existe rota óptica com ligação real (cabo conectado),
    não só um nome cadastrado sem topologia.
  • Projeto sem rota nenhuma mostra mensagem objetiva em vez de ficar
    escondido sem explicação.

Popups

Padrão único de HUD para CTO, CEO, CDO, Rack, Torre, CPD/POP, Poste e
cabos: ícone do tipo, nome, status (quando monitorado), ações organizadas
(Cabos e ligações, Equipamentos, Ficha/QR, Editar/Excluir conforme
permissão), botão Excluir realmente vermelho. A normalização do popup
agora é idempotente — compara uma assinatura do conteúdo (nome + tipo +
código + ações + status) antes de remontar, e só remonta se algo mudou de
verdade. Isso resolve a alternância entre popup moderno e popup antigo que
acontecia quando outro módulo injetava uma ação depois do popup já ter
sido montado.

Busca

Continua usando os handlers antigos por baixo (endereço, busca no
projeto), mas agora abre dentro de um painel com o visual do mapa novo,
cor de whitelabel, atalho Ctrl+K e fechamento por botão ou Esc.

Monitoramento

Sem mudança de comportamento: o indicador nos popups continua batendo
com o status real do SNMP (verde=normal, vermelho=offline,
amarelo=degradado/atenção, cinza=sem dados), some quando não há perfil
configurado. Este pacote não mexe em backbone, PTP, InfluxDB, Telegraf
ou no motor de alertas.

Verificação feita nesta rodada

  • Checksums SHA-256 do pacote conferidos um a um contra SHA256SUMS
    antes de tocar em qualquer arquivo.
  • BASE_COMMIT do pacote (c6cf0ec) confirmado igual ao HEAD do main
    antes de aplicar.
  • Leitura completa do apply_map_ui_v0721.py confirmando que ele não
    toca nos arquivos dos hotfixes anteriores (detalhado acima).
  • Revisão do JS novo (map-ui-v0721.js) atrás do mesmo padrão de bug já
    visto duas vezes este ano (observador de mutação reagindo à própria
    mudança): o observador que reconstrói sidebar/busca/toolbar ao detectar
    mudanças no <body> tem guarda-antes-de-mutar em todos os três pontos
    que ele chama (fixSidebar, fixSearchTriggers, rebuildToolbar
    cada um marca a flag dataset.v0721 = "1" antes de mexer no DOM, não
    depois), e o observador de popup usa assinatura idempotente antes de
    remontar. Não encontrei o padrão de bug desta vez.
  • --dry-run do aplicador, sem erro.
  • python -m py_compile nos arquivos Python tocados.
  • Sintaxe do map-ui-v0721.js validada com esprima (nenhuma sintaxe nova
    precisou de neutralização desta vez).
  • Chaves do map-ui-v0721.css balanceadas (72/72).
  • {% if %}/{% endif %} de templates/map.html balanceados (10/10).
  • docker-compose.yml validado como YAML.
  • Rodei manualmente as 5 asserções do teste estático incluído
    (test_map_ui_v0721_static.py, que não depende de banco/GDAL): ordem de
    carregamento do JS/CSS novo, toolbar com os modos e submenu de Caixa,
    seletor de especificidade do menu lateral presente no CSS, contextualidade
    de rotas/busca, normalização de popup idempotente — todas passaram.

A suíte Django completa (manage.py check, manage.py test) e o teste
visual real dependem de banco, GDAL e navegador — 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 CSS/JS novos sejam carregados.

Teste sugerido: recolher e expandir o menu lateral e confirmar que ele
realmente vira uma faixa de 72px (não uma faixa larga só com ícones);
alternar entre Visualizar e Editar na barra superior; abrir Rotas num
projeto com e sem rota conectada; abrir um popup de CTO/Rack/Torre e
confirmar que o visual não pisca entre moderno e antigo ao clicar em ações
diferentes; testar a busca com Ctrl+K.