This commit is contained in:
2026-01-11 23:26:46 +01:00
parent 68e744788d
commit 2841654f22

View File

@@ -340,6 +340,29 @@
return type === 'text' || type === 'link' || type === 'button'; return type === 'text' || type === 'link' || type === 'button';
}; };
const attachRteTracker = (cmp) => {
if (!cmp || !cmp.view || !cmp.view.el) return;
if (cmp.__bridgeRteTracker && cmp.__bridgeRteTracker.el === cmp.view.el) return;
const el = cmp.view.el;
const handler = () => {
cmp.__bridgeLastRteHtml = el.innerHTML || '';
};
el.addEventListener('input', handler);
el.addEventListener('keyup', handler);
el.addEventListener('paste', handler);
cmp.__bridgeRteTracker = { el, handler };
handler();
};
const detachRteTracker = (cmp) => {
const tracker = cmp && cmp.__bridgeRteTracker;
if (!tracker || !tracker.el || !tracker.handler) return;
tracker.el.removeEventListener('input', tracker.handler);
tracker.el.removeEventListener('keyup', tracker.handler);
tracker.el.removeEventListener('paste', tracker.handler);
cmp.__bridgeRteTracker = null;
};
const fixPlainTextContent = (cmp) => { const fixPlainTextContent = (cmp) => {
if (!cmp || !cmp.view || !cmp.view.el) return; if (!cmp || !cmp.view || !cmp.view.el) return;
if (!isTextLike(cmp)) return; if (!isTextLike(cmp)) return;
@@ -363,13 +386,33 @@
ed.__bridgeFixPlainText = true; ed.__bridgeFixPlainText = true;
setTimeout(() => { setTimeout(() => {
try { try {
detachRteTracker(cmp);
if (!cmp || !cmp.view || !cmp.view.el) return;
const el = cmp.view.el;
const currentHtml = (el.innerHTML || '').trim();
if (!currentHtml && cmp.__bridgeLastRteHtml && cmp.__bridgeLastRteHtml.trim()) {
const tmp = el.ownerDocument.createElement('div');
tmp.innerHTML = cmp.__bridgeLastRteHtml;
const comps = buildTextnodeComponents(tmp);
if (comps.length && typeof cmp.components === 'function') {
cmp.components(comps);
} else if (cmp.__bridgeLastRteHtml && typeof cmp.set === 'function') {
cmp.set('content', cmp.__bridgeLastRteHtml);
}
} else {
fixPlainTextContent(cmp); fixPlainTextContent(cmp);
}
} finally { } finally {
ed.__bridgeFixPlainText = false; ed.__bridgeFixPlainText = false;
} }
}, 0); }, 0);
}); });
ed.on('rte:enable', (cmp) => {
if (!isTextLike(cmp)) return;
attachRteTracker(cmp);
});
// Keep the fix off live updates to avoid cursor jumps; run only on RTE close. // Keep the fix off live updates to avoid cursor jumps; run only on RTE close.
                 
        window.__gjs = ed;         window.__gjs = ed;