Conn2Flow
Navegação das docs

SDD

req-082: Correção de Carregamento de Widgets, Seleção de Modelos, Restauração de Backups e Hooks de Controle Multi-usuário

Bug no Carregamento de Widgets Dinâmicos no Live Editor: * Problema: Ao adicionar um widget pelo painel "+", o placeholder de carregamento (Carregando widget…) permanece em…

Descrição do Problema / Contexto

Esta requisição (BATCH-082) resolve bugs críticos encontrados na homologação de widgets, modelos e backups do Live Editor, além de implementar o controle de permissão e isolamento de usuários nos endpoints da Editbar seguindo os hooks existentes do site.

  1. Bug no Carregamento de Widgets Dinâmicos no Live Editor:

    • Problema: Ao adicionar um widget pelo painel "+", o placeholder de carregamento (Carregando widget…) permanece em exibição por tempo indeterminado. Isso ocorre porque o postMessage c2f-he:widget-render enviado pelo motor html-editor.js não é interceptado por nenhum receptor no Live Editor para realizar a chamada AJAX ao backend e repassar a resposta c2f-he:widget-rendered.

    • Comportamento Esperado: Adicionar um listener de mensagem no Live Editor (dashboard.toolbar.js) que capture c2f-he:widget-render. O backend deve disponibilizar o endpoint site-toolbar-widget-render que repassa a renderização à biblioteca html-editor (html_editor_ajax_widget_render()). Ao receber a resposta do backend, o Live Editor deve postar de volta a mensagem c2f-he:widget-rendered com o HTML renderizado.

  2. Seleção Automática do Modelo Adicionado:

    • Problema: Ao inserir um novo modelo de seção na página, o elemento adicionado não vem selecionado pelo editor, exigindo que o usuário clique manualmente sobre ele para editá-lo.

    • Comportamento Esperado: Logo após inserir o HTML do modelo na posição desejada (seja em "Substituir", "Antes" ou "Depois"), o primeiro elemento válido do novo bloco inserido deve ser automaticamente selecionado no editor (this.selectElement(node)).

  3. Perda de Referência de Widgets e Variáveis ao Restaurar Backup:

    • Problema: Ao restaurar um backup de página ou de layout, o editor visual perde as referências e anotações visuais (data-c2f-widget-id, data-c2f-variable), e os widgets passam a exibir a marcação de template .c2f-widget-box antiga, gerando quebras visuais e de comportamento.

    • Comportamento Esperado:

      • Atualizar a rota AJAX site-toolbar-backup-get no backend para retornar tanto o HTML renderizado (html) quanto o HTML original cru (raw) da versão salva.

      • Na renderização do backup de página, envolver os widgets em marcadores de comentários (<!-- widgets#SIG < -->...<!-- widgets#SIG > -->) em vez da div .c2f-widget-box obsoleta, alinhando com a especificação marker-based.

      • No frontend (dashboard.toolbar.js), ao aplicar o HTML do backup no DOM vivo, substituir também o conteúdo do contêiner de backup oculto (#c2f-raw-content) pelo raw recebido do servidor. Em seguida, limpar qualquer seleção ativa com deselectAll(), executar a função mapTree() de mapeamento no DOM restaurado para re-anotar as variáveis/widgets ativos, e reativar o editor (restoreChrome()).

  4. Isolamento e Controle Multi-usuário na Editbar:

    • Problema: O site possui hooks em admin-paginas.hooks.php e publisher-pages.hooks.php que limitam as operações de CRUD apenas aos registros pertencentes ao usuário logado (exceto administradores com acesso completo). Os endpoints da toolbar do Live Editor (site-toolbar-render, site-toolbar-save, site-toolbar-backups, site-toolbar-backup-get) não realizam essa checagem, permitindo o bypass do isolamento.

    • Comportamento Esperado:

      • Nos endpoints de carregamento, salvamento, listagem e restauração de backups em dashboard.php, selecionar também o campo id_usuarios da página correspondente.

      • Se a biblioteca multiusuario estiver configurada no projeto, validar a propriedade da página: usuários restritos só podem operar sobre páginas onde id_usuarios corresponda ao seu próprio ID de usuário.

      • Retornar erro de permissão imediatamente caso a verificação falhe.


Proposta de Alterações Detalhada

1. Carregamento de Widgets Dinâmicos

  • No backend (dashboard.php):

    • Adicionar a rota AJAX site-toolbar-widget-render.

    • Implementar o handler dashboard_ajax_site_toolbar_widget_render() que chama gestor_acesso_edicao() (ou checagem correspondente), inclui a biblioteca html-editor e executa html_editor_ajax_widget_render().

  • No frontend (dashboard.toolbar.js):

    • No listener de message de window, interceptar mensagens cujo action seja c2f-he:widget-render.

    • Chamar a rota AJAX site-toolbar-widget-render passando a assinatura do widget (data.signature).

    • Ao receber o retorno JSON com o HTML renderizado, disparar um window.postMessage para si mesmo com action: 'c2f-he:widget-rendered', o wrapperId e o html.

2. Seleção de Modelos

  • No frontend (html-editor.js - insertTemplate):

    • Rastrear o primeiro nó de elemento inserido (nodeType === 1) no DOM durante a iteração de inserção do template (seja nas relações replace, before ou after).

    • No encerramento da função, se um elemento foi identificado e adicionado, selecioná-lo automaticamente através de this.selectElement(firstInserted).

3. Restauração de Backups com Mapeamento Completo

  • No backend (dashboard.php - dashboard_ajax_site_toolbar_backup_get e dashboard_site_toolbar_boxes_widgets):

    • Ajustar dashboard_site_toolbar_boxes_widgets para que os widgets sejam embrulhados na estrutura de comentários padrão: '<!-- widgets#'.$signature.' < -->'.$rendered.'<!-- widgets#'.$signature.' > -->'

    • No retorno JSON de dashboard_ajax_site_toolbar_backup_get, enviar um campo adicional raw contendo o valor literal em texto de $row['valor'] obtido da tabela backup_campos.

  • No frontend (dashboard.toolbar.js - restorePageBackup e restoreLayoutBackup):

    • Limpar a seleção do editor antes da alteração (c2fEditor.deselectAll()).

    • Injetar o HTML renderizado no DOM vivo da página e o HTML cru recebido (raw) no elemento #c2f-raw-content.

    • Reinicializar os dicionários de mapeamento: varMap = {}, varSeq = 0, mapRoot = root.

    • Chamar mapTree(mapRoot, backupElement) para redefinir as conexões dinâmicas.

    • Disparar c2fEditor.restoreChrome() para restabelecer os manipuladores e a interface visual.

4. Integração dos Hooks Multi-usuário na Editbar

  • No backend (dashboard.php):

    • Criar um helper PHP dashboard_site_toolbar_verificar_permissao_pagina($pagina) para encapsular a lógica de validação:

    • Se multiusuario_tem_acesso_completo do projeto estiver presente, validar se o usuário atual é o proprietário (id_usuarios) da página caso não possua acesso completo para admin-paginas ou publisher-pages.

    • Chamar este helper logo após selecionar a página correspondente nas rotas:

    • site-toolbar-render

    • site-toolbar-save

    • site-toolbar-backups

    • site-toolbar-backup-get (validando o registro da página proprietária do backup).


Validação e Testes

  1. Validação de Sintaxe:

    • Executar php -l nos arquivos alterados e node --check nos scripts modificados.

    • Garantir que a suíte de testes de regressão passe com 100% de sucesso.

  2. Testes Unitários:

    • Adicionar testes em html-editor.live.test.js cobrindo a nova lógica de seleção automática do primeiro nó de elemento inserido ao adicionar modelos.

    • Adicionar testes simulando a recepção da mensagem c2f-he:widget-render e o disparo correspondente de c2f-he:widget-rendered na barra de ferramentas.

  3. Validação Visual e Manual:

    • Inserir um widget pelo painel "+" e confirmar que ele é renderizado na tela imediatamente (sem ficar travado em "Carregando widget…").

    • Adicionar um modelo e verificar se ele é selecionado automaticamente após a inserção.

    • Restaurar backups e confirmar que as variáveis e widgets continuam selecionáveis e interativos sem erros.

    • Logar com um usuário restrito e tentar editar/salvar/restaurar backups de páginas de outros proprietários, validando o bloqueio de segurança.

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