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.
-
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 postMessagec2f-he:widget-renderenviado pelo motorhtml-editor.jsnão é interceptado por nenhum receptor no Live Editor para realizar a chamada AJAX ao backend e repassar a respostac2f-he:widget-rendered. -
Comportamento Esperado: Adicionar um listener de mensagem no Live Editor (
dashboard.toolbar.js) que capturec2f-he:widget-render. O backend deve disponibilizar o endpointsite-toolbar-widget-renderque repassa a renderização à bibliotecahtml-editor(html_editor_ajax_widget_render()). Ao receber a resposta do backend, o Live Editor deve postar de volta a mensagemc2f-he:widget-renderedcom o HTML renderizado.
-
-
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)).
-
-
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-boxantiga, gerando quebras visuais e de comportamento. -
Comportamento Esperado:
-
Atualizar a rota AJAX
site-toolbar-backup-getno 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-boxobsoleta, 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) pelorawrecebido do servidor. Em seguida, limpar qualquer seleção ativa comdeselectAll(), executar a funçãomapTree()de mapeamento no DOM restaurado para re-anotar as variáveis/widgets ativos, e reativar o editor (restoreChrome()).
-
-
-
Isolamento e Controle Multi-usuário na Editbar:
-
Problema: O site possui hooks em
admin-paginas.hooks.phpepublisher-pages.hooks.phpque 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 campoid_usuariosda página correspondente. -
Se a biblioteca
multiusuarioestiver configurada no projeto, validar a propriedade da página: usuários restritos só podem operar sobre páginas ondeid_usuarioscorresponda 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 chamagestor_acesso_edicao()(ou checagem correspondente), inclui a bibliotecahtml-editore executahtml_editor_ajax_widget_render().
-
-
No frontend (
dashboard.toolbar.js):-
No listener de
messagedewindow, interceptar mensagens cujoactionsejac2f-he:widget-render. -
Chamar a rota AJAX
site-toolbar-widget-renderpassando a assinatura do widget (data.signature). -
Ao receber o retorno JSON com o HTML renderizado, disparar um
window.postMessagepara si mesmo comaction: 'c2f-he:widget-rendered', owrapperIde ohtml.
-
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çõesreplace,beforeouafter). -
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_getedashboard_site_toolbar_boxes_widgets):-
Ajustar
dashboard_site_toolbar_boxes_widgetspara 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 adicionalrawcontendo o valor literal em texto de$row['valor']obtido da tabelabackup_campos.
-
-
No frontend (
dashboard.toolbar.js-restorePageBackuperestoreLayoutBackup):-
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_completodo projeto estiver presente, validar se o usuário atual é o proprietário (id_usuarios) da página caso não possua acesso completo paraadmin-paginasoupublisher-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
-
Validação de Sintaxe:
-
Executar
php -lnos arquivos alterados enode --checknos scripts modificados. -
Garantir que a suíte de testes de regressão passe com 100% de sucesso.
-
-
Testes Unitários:
-
Adicionar testes em
html-editor.live.test.jscobrindo 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-rendere o disparo correspondente dec2f-he:widget-renderedna barra de ferramentas.
-
-
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.
-