Este lote de trabalho (BATCH-053) visa refinar a funcionalidade de múltiplos menus dinâmicos com visibilidade condicional implementada no BATCH-052. As melhorias envolvem a sincronização automática de blocos HTML no CodeMirror ao criar novas condições, a sincronização do Live Preview (hep-preview) com a aba de condição ativa, e a evolução da condição "Perfil de Usuário" para suportar a seleção de múltiplos perfis por meio de um autocomplete baseado na tabela usuarios_perfis.
1. Modificações na Interface Administrativa (CRUD de Menus)
1.1 Autocomplete de Múltiplos Perfis para a Condição "Perfil de Usuário"
Modificar o formulário de cadastro de condições em gestor/modulos/menus/menus.js e as páginas do CRUD administrativo:
-
Quando o tipo de condição selecionado for
perfil_usuario:-
Exibir um campo input de Autocomplete abaixo do tipo e slug.
-
O autocomplete deve buscar dinamicamente na tabela
usuarios_perfis(com status ativostatus="A") através de uma chamada AJAX. -
O usuário pode selecionar múltiplos perfis.
-
Cada perfil selecionado deve ser renderizado logo abaixo do input como um "tag" (ou caixinha) contendo um botão
xpara remoção do perfil selecionado. -
Persistir a lista de IDs de perfis selecionados (ex:
[1, 5, 8]) dentro do objeto da condição correspondente no schema JSON defields_schema.conditions.
-
1.2 Geração Automática de Blocos de Comentário HTML no CodeMirror
-
No JS (
menus.js), ao confirmar a criação de uma nova condição com o slugSLUG:-
Obter o conteúdo HTML atual da aba "Editor HTML" (instância CodeMirror correspondente).
-
Verificar se o marcador de comentário daquela condição (
<!-- menu-conditional-SLUG < -->) já existe no código. -
Caso não exista:
-
Extrair a marcação delimitada pelo bloco padrão
<!-- menu-visible < -->...<!-- menu-visible > -->. -
Duplicar este bloco de HTML, substituindo o comentário de controle para a nova condição:
<!-- menu-conditional-SLUG < --> ... HTML CÓPIA DO VISIBLE ... <!-- menu-conditional-SLUG > --> -
Concatenar este novo bloco ao final do código HTML no editor CodeMirror.
-
Sincronizar o editor e marcar o estado da página como alterado.
-
Assim, garante-se que cada condição nova criada crie automaticamente seu bloco HTML no editor, eliminando a necessidade de reescrever manualmente os arquivos físicos de modelos.
-
1.3 Endpoint AJAX para Busca de Perfis
Modificar gestor/modulos/menus/menus.php:
-
Implementar um endpoint AJAX no switch de opções (
opcao === 'adicionar' || opcao === 'editar') para responder à busca de perfis de usuários (ex:profiles-search). -
A consulta deve retornar o ID (
id_usuarios_perfis) e o Nome (nome/idtextual) dos registros ativos na tabelausuarios_perfis, retornando uma lista JSON formatada para o componente de dropdown/autocomplete do Fomantic-UI.
2. Sincronização do Live Preview com a Aba Ativa (hep-preview)
Modificar a integração do pré-visualizador (live widget-preview) no JS e PHP:
-
Ao alternar abas no construtor de menu:
-
Detectar a aba selecionada.
-
Se a disponibilidade for
todos, o preview renderiza o menu padrão (visible_to_all). -
Se a disponibilidade for
condicional, ao selecionar a aba da condição com o slugSLUG, disparar a atualização do preview passando um parâmetro extra na chamada AJAX (ex:preview_slug=SLUG).
-
-
No renderizador do widget para preview (
menus.widget.phpou AJAX de preview):-
Se o parâmetro
preview_slugfor fornecido na requisição de preview: -
Forçar o renderizador do widget a renderizar exclusivamente os itens daquela chave de menu (
menus[preview_slug]) e utilizar o bloco de HTML delimitado por<!-- menu-conditional-[preview_slug] < -->daquele template, simulando de forma fiel a exibição do menu da condição ativa na tela do usuário.
-
3. Renderização Dinâmica e Resolução de Múltiplos Perfis no Widget Público
Modificar gestor/modulos/menus/menus.widget.php:
-
No processamento do widget público, ao avaliar a lista de condições cadastradas:
-
Se a condição for
perfil_usuario: -
Validar se o usuário ativo (retornado por
gestor_usuario()) está logado. -
Se estiver logado, comparar o
id_usuarios_perfisdo usuário ativo contra a lista de IDs de perfis cadastrados/permitidos naquela condição específica (obtidos do schema JSON). -
Se o ID do perfil do usuário coincidir com qualquer um dos perfis selecionados na condição, a condição é avaliada como verdadeira.
-
Renderizar e retornar o respectivo bloco condicional HTML (
<!-- menu-conditional-[SLUG] < -->).
-
4. Validação e Testes Unitários
-
Testes PHPUnit:
-
Atualizar a suíte de testes em
tests/Unit/PHP/MenusWidgetConditionalVisibilityTest.phppara validar:-
Usuário com perfil ID
Xacessando um menu com a condiçãoperfil_usuariocontendo múltiplos perfis ([X, Y, Z]) -> deve renderizar com sucesso. -
Usuário com perfil ID
W(não contido em[X, Y, Z]) acessando o mesmo menu -> não deve satisfazer a condição (e deve cair no fallback adequado). -
Testar a passagem do parâmetro
preview_slugno widget renderizado em simulação e validar se o bloco e itens corretos são retornados.
-
-
-
Testes Estáticos / Sintaxe:
-
Garantir que todos os arquivos alterados passem na verificação de sintaxe básica:
-
php -l gestor/modulos/menus/menus.php -
php -l gestor/modulos/menus/menus.widget.php -
node --check gestor/modulos/menus/menus.js
-
-