Intake: req-125.md
Validação: VALIDATION-CHECKLIST.md#batch-127
Status: implemented-pending-homologation
Este lote corrige o laço de sessão expirada no login, mapeia os ícones dos módulos servidos por projetos derivados, sincroniza a visibilidade dos botões abrir/fechar menu e elimina os warnings do Lucide no console.
Atividades Técnicas
-
[x] Reload limpo em erro de CSRF (
gestor_csrf_resposta_invalida)-
gestor_csrf_rotas_identidade()egestor_csrf_destino_recarregamento()emgestor/bibliotecas/gestor.php. -
O caminho da requisição é a fonte PRIMÁRIA (existe mesmo sem referer); o referer é a secundária.
-
Rota de identidade →
location.replace()para a URL de login. Fora delas →history.back(), preservado. -
Cache-Control: no-storena própria tela de erro; destino escrito comodata-c2f-destino, não interpolado no JS.
-
-
[x] Ícones dos módulos servidos por projeto
-
Pares gravados no
ModulosData.jsondoconn2flow-site, com os ids REAIS (3d-catalog,social-connections,publisher-social-media,modulos-grupos-distribuido…). -
Removidos do núcleo os 18 registros (9 módulos × 2 idiomas) com ids em português que não existem em lugar nenhum.
-
Migração
20260821100000_alter_modulos_update_icones_projetosreescrita: ids reais + apelidos, bind de parâmetros, guarda dehasColumn. -
Nomes conferidos contra os catálogos reais (Fomantic 2.9.4 e Lucide 0.544.0), nunca contra memória.
-
-
[x] Alternância de visibilidade dos botões de abrir/fechar
-
sincronizarBotoes()noadmin-tailwind.js, chamada porabrir()/fechar()— cobre também o estado inicial. -
O mecanismo é o atributo booleano
hidden, não só a classe:.inline-flexé emitida DEPOIS de.hiddenno bundle e venceria a classe. -
O botão "abrir" nasce com
lg:hiddene o runtime remove a utility no boot, como já se faz comlg:translate-x-0na barra lateral.
-
-
[x] Saneamento de
data-lucidee eliminação de warnings-
gestor_pagina_menu_icone_lucide_valido()/_atributo()montam o ATRIBUTO INTEIRO —data-lucide=""reclamaria igual, então ele precisa não ser emitido. -
Template do
menu-principal-sistema-tailwindpassou a#icon-lucide#/#icon-2-lucide#(versão1.4→1.5, pt-br e en). -
sanearIcones()no runtime cobre marcação de outras origens (componente sobrescrito por projeto, widget, módulo distribuído).
-
-
[x] Testes e validação
-
composer test630/630,npm run test337/337,php -lenode --checkverdes,c2f resources:synccom 2652 recursos e 0 erros. -
Testes novos:
tests/Unit/PHP/CsrfReloadIconesMenuTest.php(43 casos, comportamentais) e 2 casos emtests/Unit/JS/admin-tailwind.test.js.
-
Decisões de execução
-
As funções puras saíram do bootstrap para a biblioteca.
gestor/gestor.phptermina emgestor_start()e não pode ser incluído por um caso de teste; enquanto as funções morassem lá, o único teste possível era procurar o nome delas no arquivo — o que passa mesmo quando o corpo não faz o que o nome promete. Emgestor/bibliotecas/gestor.php(carregada peloconfig.php, primeira linha do bootstrap) elas são exercitadas de verdade. -
O cadastro do ícone vive no projeto; a migração vive no núcleo. São papéis diferentes: o
*Data.jsoné o que instala e o que o deploy de recursos leva; a migração é o que alcança um banco onde a linha já existe. UmUPDATEsem correspondência é operação bem-sucedida de zero linhas, então a migração pode viver no núcleo sem sujar nada. -
icone2_tailwindfoi deixado nulo de propósito nos módulos do projeto que têmicone2Fomantic. Oicone2guarda modificador de posicionamento (bottom right corner share), que não existe no Lucide; preenchê-lo abriria a célula de dois ícones para desenhar um<i>sem alvo. Mesma regra do BATCH-126.