templates/editor: defer insercao pos-transicao + pointer-events na saida
Trava persistia mesmo apos fix anterior. Causa raiz: append no form ocorria durante a transicao CSS do drawer (250ms slide out). Vue reagia ao v-model -> Jodit re-renderia HTML com nova variavel -> concorrencia entre repaint do drawer saindo + reflow do Jodit mobile = trava. Fix: 1. setTimeout(280ms) — append no form so executa DEPOIS que a transicao do drawer terminou. Drawer sai limpo, depois Jodit re-renderiza isolado. 2. CSS: .dte-mobile-drawer:not(.is-open) ganha pointer-events:none durante saida. Evita captura de touch/click "perdidos" que tentavam triggerar handlers no drawer ja saindo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -66,28 +66,37 @@ const editorRodape = ref(null)
|
|||||||
|
|
||||||
function insertVariable(varKey) {
|
function insertVariable(varKey) {
|
||||||
const tag = `{{${varKey}}}`
|
const tag = `{{${varKey}}}`
|
||||||
|
|
||||||
|
// No mobile: 1) fecha drawer (imediato); 2) deferir append do form e
|
||||||
|
// re-render do Jodit pra DEPOIS da transição (250ms). Modificar o form
|
||||||
|
// durante a transição causa concorrência entre repaint do drawer
|
||||||
|
// saindo + Jodit re-rendering com novo HTML → trava.
|
||||||
|
if (isMobile.value) {
|
||||||
|
drawerOpen.value = false;
|
||||||
|
const field = cursorField.value;
|
||||||
|
// setTimeout > duração da transição CSS (.dte-mobile-drawer = 250ms)
|
||||||
|
setTimeout(() => {
|
||||||
|
form.value[field] = (form.value[field] || '') + tag;
|
||||||
|
if (!form.value.variaveis.includes(varKey)) {
|
||||||
|
form.value.variaveis = [...form.value.variaveis, varKey];
|
||||||
|
}
|
||||||
|
}, 280);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Desktop: insertHTML mantém posição do cursor
|
||||||
const editorMap = {
|
const editorMap = {
|
||||||
cabecalho_html: editorCabecalho,
|
cabecalho_html: editorCabecalho,
|
||||||
corpo_html: editorCorpo,
|
corpo_html: editorCorpo,
|
||||||
rodape_html: editorRodape
|
rodape_html: editorRodape
|
||||||
}
|
}
|
||||||
const editorRef = editorMap[cursorField.value]
|
const editorRef = editorMap[cursorField.value]
|
||||||
|
if (editorRef?.value?.insertHTML) {
|
||||||
// No mobile: drawer está aberto, foco está nos botões do drawer.
|
|
||||||
// Tentar editor.insertHTML enquanto o cursor está fora do Jodit faz
|
|
||||||
// ele travar tentando resolver selection. Usamos o fallback (append
|
|
||||||
// direto no form via v-model) e fechamos o drawer ANTES — Jodit
|
|
||||||
// sincroniza com v-model na próxima tick.
|
|
||||||
if (isMobile.value) {
|
|
||||||
drawerOpen.value = false;
|
|
||||||
form.value[cursorField.value] = (form.value[cursorField.value] || '') + tag
|
|
||||||
} else if (editorRef?.value?.insertHTML) {
|
|
||||||
editorRef.value.insertHTML(tag)
|
editorRef.value.insertHTML(tag)
|
||||||
} else {
|
} else {
|
||||||
form.value[cursorField.value] = (form.value[cursorField.value] || '') + tag
|
form.value[cursorField.value] = (form.value[cursorField.value] || '') + tag
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adiciona a variavel na lista se nao estiver
|
|
||||||
if (!form.value.variaveis.includes(varKey)) {
|
if (!form.value.variaveis.includes(varKey)) {
|
||||||
form.value.variaveis = [...form.value.variaveis, varKey]
|
form.value.variaveis = [...form.value.variaveis, varKey]
|
||||||
}
|
}
|
||||||
@@ -504,6 +513,9 @@ onBeforeUnmount(() => {
|
|||||||
box-shadow: 4px 0 24px rgba(0, 0, 0, 0.18);
|
box-shadow: 4px 0 24px rgba(0, 0, 0, 0.18);
|
||||||
}
|
}
|
||||||
.dte-mobile-drawer.is-open { transform: translateX(0); }
|
.dte-mobile-drawer.is-open { transform: translateX(0); }
|
||||||
|
/* Durante a transição de saída, drawer ignora eventos pra não capturar
|
||||||
|
touch/click "perdidos" e prevenir trava no Jodit. */
|
||||||
|
.dte-mobile-drawer:not(.is-open) { pointer-events: none; }
|
||||||
|
|
||||||
.dte-mobile-drawer__tabs {
|
.dte-mobile-drawer__tabs {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
Reference in New Issue
Block a user