From b6e947d4011cbe7910467ed4aad198e83db22a97 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Wed, 10 Dec 2025 22:50:27 +0100 Subject: [PATCH] sdsad --- public/assets/js/bridge/blocks-placeholder.js | 68 +++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/public/assets/js/bridge/blocks-placeholder.js b/public/assets/js/bridge/blocks-placeholder.js index b6dccf4..533c300 100644 --- a/public/assets/js/bridge/blocks-placeholder.js +++ b/public/assets/js/bridge/blocks-placeholder.js @@ -197,6 +197,33 @@ const buildPlaceholderHTML = (payload) => { } }; + const captureRteSelection = (rteInstance) => { + const doc = rteInstance && rteInstance.doc + ? rteInstance.doc + : (rteInstance && rteInstance.el && rteInstance.el.ownerDocument) || document; + if (!doc || !doc.getSelection) return null; + const sel = doc.getSelection(); + if (!sel || !sel.rangeCount) return null; + return { + doc, + range: sel.getRangeAt(0).cloneRange() + }; + }; + + const restoreRteSelection = (snapshot) => { + if (!snapshot || !snapshot.doc || !snapshot.range) return false; + const sel = snapshot.doc.getSelection && snapshot.doc.getSelection(); + if (!sel) return false; + try { + sel.removeAllRanges(); + sel.addRange(snapshot.range); + return true; + } catch (err) { + log('PLACEHOLDER WARN', `Auswahl konnte nicht wiederhergestellt werden: ${err && err.message ? err.message : err}`, '#b45309'); + return false; + } + }; + const insertPlaceholderIntoSelection = (rteInstance, html) => { const doc = rteInstance && rteInstance.doc ? rteInstance.doc @@ -586,14 +613,31 @@ const buildPlaceholderHTML = (payload) => { log('PLACEHOLDER INFO', 'Bitte zuerst ein Text-Element auswählen.', '#888'); return; } - const markerId = `bridge-placeholder-marker-${Date.now()}-${Math.random().toString(36).slice(2)}`; - const markerInserted = insertCaretMarker(rteInstance, markerId); - if (!markerInserted) { - log('PLACEHOLDER ERROR', 'Marker konnte nicht gesetzt werden. Bitte erneut versuchen.', 'red', 'error'); + const selectionSnapshot = captureRteSelection(rteInstance); + if (!selectionSnapshot) { + log('PLACEHOLDER ERROR', 'Keine Text-Selektion gefunden. Bitte Cursor setzen und erneut versuchen.', 'red', 'error'); return; } - setTimeout(() => reparseTextComponent(target, editor), 0); - const cleanupMarker = () => removeMarkerFromComponent(target, markerId, editor); + let markerId = null; + const restoreSelection = () => restoreRteSelection(selectionSnapshot); + const ensureMarker = () => { + if (markerId) return true; + if (!restoreSelection()) return false; + markerId = `bridge-placeholder-marker-${Date.now()}-${Math.random().toString(36).slice(2)}`; + const inserted = insertPlaceholderIntoSelection(rteInstance, ``); + if (inserted) { + setTimeout(() => reparseTextComponent(target, editor), 0); + return true; + } + markerId = null; + return false; + }; + const cleanupMarker = () => { + if (markerId) { + removeMarkerFromComponent(target, markerId, editor); + markerId = null; + } + }; openPlaceholderModal(editor, null, { onCancel: () => { cleanupMarker(); @@ -602,6 +646,18 @@ const buildPlaceholderHTML = (payload) => { } }, onSubmit: (payload) => { + if (!ensureMarker()) { + cleanupMarker(); + if (restoreSelection()) { + const html = buildPlaceholderHTML(payload); + if (insertPlaceholderIntoSelection(rteInstance, html)) { + setTimeout(() => reparseTextComponent(target, editor), 0); + return true; + } + } + log('PLACEHOLDER ERROR', 'Placeholder konnte nicht eingefügt werden (Marker fehlte).', 'red', 'error'); + return false; + } const replaced = replaceMarkerWithPlaceholder(target, markerId, payload, editor); if (!replaced) { cleanupMarker();