From 664ffbca3516d676653c59cb4141858db4eab68f Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Wed, 28 Jan 2026 02:04:56 +0100 Subject: [PATCH] gggg --- config/current.ver | 2 +- public/editor/bridge-core.js | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/config/current.ver b/config/current.ver index b3aa6b7..e16ab47 100644 --- a/config/current.ver +++ b/config/current.ver @@ -1 +1 @@ -1.1.45 \ No newline at end of file +1.1.46 \ No newline at end of file diff --git a/public/editor/bridge-core.js b/public/editor/bridge-core.js index 3272cca..ba85beb 100644 --- a/public/editor/bridge-core.js +++ b/public/editor/bridge-core.js @@ -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)));