Conn2Flow
Navegação das docs

SDD

Human Request: Correções Residuais de Destaques e Inicialização do Módulo de Menus (req-015)

Esta especificação detalha ajustes refinados sobre a entrega do autocomplete e CodeMirror no módulo publisher-highlights (req-014), e inicia a criação do novo módulo menus a…

Esta especificação detalha ajustes refinados sobre a entrega do autocomplete e CodeMirror no módulo publisher-highlights (req-014), e inicia a criação do novo módulo menus a partir de uma cópia limpa do módulo de destaques.


1. Correções Residuais de Destaques (publisher-highlights)

1.1 Bug de Contagem de Cards na Simulação

  • Bug: O botão de simulação no editor HTML visual (publisherVariablesOrSimulation no JS do editor) usa a quantidade real de publicações para clonar os cards no preview simulado. Se houver poucas publicações no banco, a simulação não preenche a quantidade de cards definida. Ele deve seguir a quantidade máxima especificada pelo usuário.

  • Ajuste:

    • No arquivo gestor/assets/interface/html-editor-interface.js [MODIFY], dentro da função publisherVariablesOrSimulation(), na verificação de alvo === 'publisher-highlights':

    • Ler o valor diretamente do campo #count no DOM (ex: var countVal = $('#count').val()) caso exista.

    • Definir a contagem como Math.max(1, parseInt(countVal || schema.count || 4, 10)). Isso garante que a simulação reflita instantaneamente o número de itens desejado no input de contagem, mesmo antes de salvar a página.

1.2 Alinhamento do Dropdown de Autocomplete

  • Ajuste:

    • A caixa de sugestões #search-suggestions-dropdown aparece deslocada para baixo devido às margens padrões herdadas da classe .ui.vertical.menu do Fomantic UI.

    • Sobrescrever a margem definindo margin: 0 !important; no estilo do elemento nos 6 templates de página (adicionar, editar e clonar em pt-br e en):

      <div id="search-suggestions-dropdown" class="ui vertical menu" style="display: none; position: absolute; top: 100%; left: 0; width: 100%; z-index: 1000; max-height: 250px; overflow-y: auto; box-shadow: 0 4px 6px rgba(0,0,0,0.15); margin: 0 !important;">

1.3 Visibilidade Dinâmica do Contêiner de Tags

  • Ajuste:

    • O elemento #selected-labels-container (área cinza de tags selecionadas) fica visível em tela mesmo quando está vazio. Ele deve aparecer apenas quando houver pelo menos um item selecionado.

    • No arquivo publisher-highlights.js [MODIFY], criar ou adaptar uma função de verificação:

      function toggleSelectedLabelsVisibility() {
      var $container = $('#selected-labels-container');
      if (schema.selected_items && schema.selected_items.length > 0) {
          $container.show();
      } else {
          $container.hide();
      }
      }
    • Invocar esta função nos seguintes momentos:

      1. Ao final de renderSelectedLabels().

      2. Logo após adicionar uma nova tag no callback de clique de uma sugestão (#search-suggestions-dropdown .item).

      3. Logo após remover uma tag no callback de clique do botão de excluir (.remove-tag-btn).

1.4 Controle do Drag Handle e Estilo do Cursor (grab/grabbing)

  • Ajuste:

    • Atualmente, a reordenação está restrita apenas ao ícone de arrastar (handle: '.grip.vertical.icon'), mas o cursor de mão aberta (grab) aparece no label inteiro. Se o usuário arrasta pelo texto da tag, nada acontece.

    • Lógica Sortable: Em publisher-highlights.js, remover a restrição de handle nas opções do Sortable para que toda a área da tag seja arrastável.

    • Filtro de Exclusão: Adicionar a opção filter: '.remove-tag-btn' para impedir que a ação de arrastar seja acionada ao tentar clicar no botão "x" de exclusão.

    • Cursores CSS: Adicionar uma tag <style> nos templates ou injetar programaticamente no head via JS os seguintes estilos para aplicar o cursor grab e grabbing de forma intuitiva durante a interação física com o mouse:

      .drag-label {
      cursor: grab !important;
      }
      .drag-label .grip.vertical.icon {
      cursor: grab !important;
      }
      .drag-label:active,
      .drag-label:active * {
      cursor: grabbing !important;
      }
      .sortable-drag {
      cursor: grabbing !important;
      }
      .remove-tag-btn {
      cursor: pointer !important;
      }

2. Inicialização do Módulo de Menus (menus)

2.1 Clonagem da Estrutura Física do Módulo

  • Ação: Copiar toda a pasta gestor/modulos/publisher-highlights/ para gestor/modulos/menus/ [NEW].

  • Renomeação Física:

    • Renomear todos os arquivos da nova pasta substituindo publisher-highlights por menus:

    • menus.php

    • menus.json

    • menus.js

    • menus.widget.php

    • Renomear os diretórios e arquivos de templates em resources/{pt-br,en}/pages/:

    • menus-adicionar/menus-adicionar.html

    • menus-editar/menus-editar.html

    • menus-clonar/menus-clonar.html

2.2 Substituição de Identificadores Internos

  • Substituir todas as ocorrências de strings contendo publisher-highlights ou publisher_highlights por suas versões correspondentes menus ou menus nos arquivos clonados PHP, JS, JSON e HTML.

    • Exemplos: id_publisher_highlights -> id_menus, PublisherHighlights -> Menus, publisher_highlights -> menus.

  • Mapear o ID do módulo no novo menus.json e no cabeçalho de menus.php para 'menus'.

2.3 Registro de Módulo no Banco (ModulosData.json)

  • Local: gestor/db/data/ModulosData.json [MODIFY]

  • Ação: Cadastrar o novo módulo menus (entradas para pt-br e en) sob o grupo administracao-gestor (mesmo grupo de destaques e publicador páginas).

    • ID do módulo: "menus".

    • Ícone sugerido para o menu administrativo: "sitemap" ou "bars".

    • Nomes sugeridos: pt-br: "Menus do Site" / en: "Site Menus".

2.4 Nova Tabela no Banco de Dados

  • Migração Phinx: Criar arquivo de migração em gestor/db/migrations/ [NEW] (ex: YYYYMMDDHHMMSS_create_menus_table.php) para criar a tabela menus com o ID da chave primária definido como id_menus.

  • Colunas:

    • A tabela deve ser análoga a publisher_highlights, contendo: id_usuarios, name, id (slug do menu), fields_schema (JSON), html (MEDIUMTEXT para o template do menu), css (TEXT), plugin, language, status (default 'A'), versao (default 1), data_criacao, data_modificacao, user_modified, system_updated.

    • ATENÇÃO: Como os menus do site são livres de publicadores (não têm relação direta com canais de posts), a coluna publisher_id não deve existir na tabela menus.

2.5 Limpeza Preliminar de Campos Específicos

  • HTML/Templates de Páginas:

    • Nas telas de montagem do menu (adicionar, editar, clonar), remover o dropdown de "Publicador de Origem" (#publisher_id), a regra de alimentação automática (#rule), a quantidade máxima (#count) e a ordenação (#order_by).

    • Remover a seção do painel de Mapeamento de Variáveis (#linked-fields-list, #available-fields-list e afins), pois menus não mapeiam variáveis dinâmicas de publicadores.

    • Manter o wrapper de autocomplete manual que serve como base para selecionar os itens de menu. (Nos lotes futuros expandiremos este autocomplete para montar a árvore de menus multi-nível).

  • Processamento de Widget (menus.widget.php):

    • Limpar as rotinas de paginação dinâmica e herança de publisher, adaptando o renderizador para processar a injeção simples do widget de menu baseado no template e nos dados curados de selected_items ou itens de menu criados.


3. Restrições e Execução

  • Sincronização de Recursos: Ao final da cópia e migrações, o executor deve executar a tarefa de sincronização de recursos php ./gestor/controladores/agents/arquitetura/atualizacao-dados-recursos.php para calcular checksums, gerar as páginas traduzidas no banco em runtime de testes e validar que os metadados do módulo de menus estão integrados com o Conn2Flow.

  • ATENÇÃO: NÃO realizar commits (git commit) ou envios (git push) de forma automática. Todas as modificações locais de código e documentação devem ser mantidas locais no workspace de trabalho para posterior avaliação e aprovação pelo Engenheiro Chefe Humano.

O Futuro é Híbrido: Humano + IA.

O Conn2Flow é a ferramenta. Se você precisa do Arquiteto para desenhar a estratégia da sua empresa usando essa tecnologia...

Contrate Consultoria Especializada