v0.72.1
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.csstembody.map-master-suite #map-sidebar.map-sidebar-master { width: 272px !important; }.map-ui-v072.css(v0.72.0) tembody.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 classev072-collapsedjá 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_COMMITdo pacote (c6cf0ec) confirmado igual aoHEADdomain
antes de aplicar.- Leitura completa do
apply_map_ui_v0721.pyconfirmando 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 flagdataset.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-rundo aplicador, sem erro.python -m py_compilenos arquivos Python tocados.- Sintaxe do
map-ui-v0721.jsvalidada com esprima (nenhuma sintaxe nova
precisou de neutralização desta vez). - Chaves do
map-ui-v0721.cssbalanceadas (72/72). {% if %}/{% endif %}detemplates/map.htmlbalanceados (10/10).docker-compose.ymlvalidado 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.