This commit is contained in:
2026-01-28 02:04:56 +01:00
parent 9c61167a93
commit 664ffbca35
2 changed files with 42 additions and 1 deletions

View File

@@ -590,11 +590,52 @@
editorHtml: editorHtml.slice(0, 1000),
};
};
const resolveComponentFromTarget = (target) => {
if (!target || !target.closest) return null;
const rootEl = target.closest('[data-gjs-type="text"]') || target;
const id = rootEl && rootEl.getAttribute ? rootEl.getAttribute('id') : null;
if (!id || !editor.getWrapper || !editor.getWrapper().find) return null;
const found = editor.getWrapper().find(`#${id}`);
return found && found[0];
};
const syncFromBlur = (evt) => {
const target = evt && evt.target;
if (!target || window.__bridgeRteOpen) return;
const isEditable = !!(target.isContentEditable || (target.getAttribute && target.getAttribute('contenteditable') === 'true'));
if (!isEditable) return;
const component = resolveComponentFromTarget(target) || (editor.getSelected && editor.getSelected());
if (!component || syncing.has(component)) return;
const type = component.get && component.get('type');
if (type && type !== 'text' && type !== 'textnode') return;
const viewEl = component.view && component.view.el;
if (!viewEl) return;
const viewHtml = normalizeViewHtml(viewEl.innerHTML || '');
if (!viewHtml) return;
const modelHtml = normalizeViewHtml(component.get ? component.get('content') || '' : '');
if (viewHtml === modelHtml) return;
try {
syncing.add(component);
if (component.components) {
try { component.components(viewHtml); } catch {}
}
if (component.set) component.set('content', viewHtml);
component.trigger && component.trigger('change:content');
if (component.view && typeof component.view.render === 'function') {
component.view.render();
}
if (editor && typeof editor.trigger === 'function') {
editor.trigger('component:update', component);
}
} catch {} finally {
syncing.delete(component);
}
};
const logBlur = (evt) => {
const target = evt && evt.target;
if (!target) return;
const isEditable = !!(target.isContentEditable || (target.getAttribute && target.getAttribute('contenteditable') === 'true'));
if (!isEditable) return;
syncFromBlur(evt);
const selected = editor.getSelected && editor.getSelected();
const selectedEl = selected && selected.view && selected.view.el;
const inSelected = !!(selectedEl && (selectedEl === target || selectedEl.contains(target)));