diff --git a/config/current.ver b/config/current.ver
index f2f5ed4..5e94d23 100644
--- a/config/current.ver
+++ b/config/current.ver
@@ -1 +1 @@
-1.1.39
\ No newline at end of file
+1.1.40
\ No newline at end of file
diff --git a/public/assets/js/bridge/rte-editor.js b/public/assets/js/bridge/rte-editor.js
index bcb7720..73f2acb 100644
--- a/public/assets/js/bridge/rte-editor.js
+++ b/public/assets/js/bridge/rte-editor.js
@@ -345,6 +345,7 @@
} catch {}
const closeModal = () => {
+ try { window.__bridgeRteOpen = false; } catch {}
this.allowClose = true;
this.modalOpen = false;
if (rteInstance && typeof rteInstance.enable === 'function' && rteTargetEl) {
@@ -366,6 +367,7 @@
const doc = document;
const container = doc.createElement('div');
+ try { window.__bridgeRteOpen = true; } catch {}
container.style.display = 'flex';
container.style.flexDirection = 'column';
container.style.gap = '10px';
diff --git a/public/editor/bridge-core.js b/public/editor/bridge-core.js
index 682e867..776a373 100644
--- a/public/editor/bridge-core.js
+++ b/public/editor/bridge-core.js
@@ -428,6 +428,7 @@
const syncTextFromViewOnDeselect = (model) => {
const target = resolveTextModel(model);
if (!isTextLike(target) || !target.view || !target.view.el || syncing.has(target)) return;
+ if (window.__bridgeRteOpen) return;
const viewHtml = normalizeViewHtmlForModel(target.view.el.innerHTML || '');
if (!viewHtml) return;
const modelHtml = normalizeViewHtmlForModel(target.get ? target.get('content') || '' : '');
@@ -459,11 +460,35 @@
syncing.delete(target);
}
};
+ const syncTextFromViewOnInput = (model) => {
+ const target = resolveTextModel(model);
+ if (!isTextLike(target) || !target.view || !target.view.el || syncing.has(target)) return;
+ if (window.__bridgeRteOpen) return;
+ const viewHtml = normalizeViewHtmlForModel(target.view.el.innerHTML || '');
+ if (!viewHtml) return;
+ const modelHtml = normalizeViewHtmlForModel(target.get ? target.get('content') || '' : '');
+ const comps = target.components ? target.components() : null;
+ const hasComps = !!(comps && comps.length);
+ if (viewHtml === modelHtml && hasComps) return;
+ try {
+ syncing.add(target);
+ if (target.components) {
+ try { target.components(viewHtml); } catch {}
+ }
+ if (target.set) target.set('content', viewHtml);
+ target.trigger && target.trigger('change:content');
+ } catch {} finally {
+ syncing.delete(target);
+ }
+ };
editor.on('component:update', (model) => {
restoreIfEmpty(model);
ensureViewMatchesModel(model);
});
- editor.on('component:input', (model) => restoreIfEmpty(model));
+ editor.on('component:input', (model) => {
+ syncTextFromViewOnInput(model);
+ restoreIfEmpty(model);
+ });
editor.on('component:deselected', (model) => {
syncTextFromViewOnDeselect(model);
restoreIfEmpty(model);
@@ -480,25 +505,6 @@
try {
const modelType = model && model.get ? model.get('type') : undefined;
const selectedEl = model && model.view && model.view.el;
- const normalizeViewHtmlForModel = (html) => {
- return String(html || '')
- .replace(/
]*>/gi, '
')
- .replace(/\sdata-gjs-type="[^"]*"/gi, '')
- .replace(/\sdraggable="[^"]*"/gi, '')
- .replace(/\scontenteditable="[^"]*"/gi, '')
- .trim();
- };
- if (label === 'DESELECT' && modelType === 'text' && selectedEl) {
- try {
- const viewHtml = normalizeViewHtmlForModel(selectedEl.innerHTML || '');
- if (viewHtml && model && model.set) {
- if (model.components) {
- try { model.components(viewHtml); } catch {}
- }
- model.set('content', viewHtml);
- }
- } catch {}
- }
const viewOuter = selectedEl ? String(selectedEl.outerHTML || '') : '';
const modelContent = model && model.get ? String(model.get('content') || '') : '';
const editorHtml = editor && typeof editor.getHtml === 'function' ? String(editor.getHtml() || '') : '';