diff --git a/public/editor/bridge-core.js b/public/editor/bridge-core.js index 8241a35..0bd2f80 100644 --- a/public/editor/bridge-core.js +++ b/public/editor/bridge-core.js @@ -258,131 +258,10 @@             pluginsList.push('gjs-preset-newsletter');         }          -        // Speicherkonfiguration extrahieren, um die URL in onLoad zu verwenden. -        // Verwenden Sie immer die zentrale API-Basis -        const storageBase = B.API_BASE; - -        // Robustes Anhängen von Query-Parametern. -        // Prüft, ob 'storageBase' bereits Query-Parameter enthält ('?') -        const actionSeparator = storageBase.indexOf('?') === -1 ? '?' : '&'; - - const resourceName = (window.__editorMode || 'templates'); - const entityId = (window.__editorId || 0); - const loadUrl = `${storageBase}${actionSeparator}action=${encodeURIComponent(resourceName)}.get&resource=${encodeURIComponent(resourceName)}&id=${encodeURIComponent(entityId)}`; - const storeUrl = `${storageBase}${actionSeparator}action=${encodeURIComponent(resourceName)}.update&resource=${encodeURIComponent(resourceName)}&id=${encodeURIComponent(entityId)}`; - -        const storageConf = { -            type: 'remote', -            // urlLoad: loadUrl, // ENTFERNT (korrekt, da customFetch verwendet wird) -            urlStore: storeUrl, -             -            // 🛑 KRITISCHER ABSCHNITT: customFetch MUSS DIE ERWARTETE SIGNATUR HABEN: customFetch(url, options) -            customFetch: async (url, options) => { // <<< KORREKTUR DER SIGNATUR -                // 1. Log Start -                log('STORAGE START', 'Template wird geladen.', '#008080', 'info', true);  -                // 2. Log Link -                log('API REQUEST', `Link für den API Request: ${loadUrl}`, '#4682B4', 'log', false);  - - const fetchOptions = { - method: 'GET', - headers: { 'Content-Type': 'application/json' }, - // Wichtig: Die übergebenen Optionen nicht vergessen zu mergen - ...options - }; - fetchOptions.headers = { - ...(options?.headers || {}), - 'Content-Type': 'application/json', - }; - if (!fetchOptions.credentials || fetchOptions.credentials === 'omit') { - fetchOptions.credentials = 'include'; - } -                 -                let data = {}; -                let rawResponse = ''; - -                try { -                    // Verwendung der intern definierten loadUrl -                    const response = await fetch(loadUrl, fetchOptions);  -                     -                    if (!response.ok) { -                        const errorText = await response.text(); -                        throw new Error(`HTTP-Fehler ${response.status}: ${errorText}`); -                    } - -                    // Holen des Raw Texts, um ihn loggen und parsen zu können -                    rawResponse = await response.text(); -                     -                    // 3. Log Result -                    log('API RESPONSE', 'Result vom API Request (Raw Text/JSON):', '#4682B4', 'log', false); -                    console.log(rawResponse); // Loggt den reinen String für die Analyse -                     -                    // Versuch der JSON-Analyse (um den GrapesJS-Fehler zu vermeiden) -                    try { -                        data = JSON.parse(rawResponse); -                        log('STORAGE PARSE', 'Raw Response als JSON geparst.', 'green'); -                    } catch (e) { -                        log('STORAGE PARSE ERROR', `Fehler beim Parsen der Antwort: ${e.message}. Antwort war wahrscheinlich kein gültiges JSON.`, 'red', 'error', true); -                        // Im Falle eines Parsing-Fehlers, leeres Objekt für Fallback-Logik -                        data = {}; -                    } - -                } catch (e) { -                    log('STORAGE FETCH ERROR', `Fehler beim Abruf: ${e.message}`, 'red', 'error', true); -                    // Sicherstellen, dass die Promise mit einem leeren Zustand erfüllt wird -                    // Wir müssen dennoch den Log End ausführen, bevor wir zurückkehren -                } -                 -                // 4. Log End -                log('STORAGE END', 'Template wurde geladen.', '#008080', 'info', true);  -                 -                // --- Logik zur Extraktion des GrapesJS States aus der API-Antwort --- -                let state = {}; - -                if (data && data.gjs_data) { -                    log('STORAGE LOAD', 'Voller GrapesJS State aus "gjs_data" geladen.', 'green'); -                    state = data.gjs_data;  -                } -                else if (data && data.content) { -                    try { -                        const parsedState = JSON.parse(data.content); -                        log('STORAGE LOAD', 'Voller GrapesJS State aus "content" (JSON-String) geladen.', 'yellow'); -                        state = parsedState; -                    } catch (e) { -                        log('STORAGE ERROR', `Fehler beim Parsen von "content": ${e.message}.`, 'red', 'error'); -                    } -                } -                // HINWEIS: Füge Fallback für "topContent" hinzu, basierend auf dem Server-Log -                else if (data && data.topContent) { -                    try { -                        const parsedState = JSON.parse(data.topContent); -                        log('STORAGE LOAD', 'Voller GrapesJS State aus "topContent" (JSON-String) geladen.', 'green'); -                        state = parsedState; -                    } catch (e) { -                        log('STORAGE ERROR', `Fehler beim Parsen von "topContent": ${e.message}.`, 'red', 'error'); -                    } -                } -                else { -                    log('STORAGE WARNING', 'Kein vollständiger GrapesJS State gefunden. Editor lädt leeren State.', 'orange', 'warn'); -                } - -                // customFetch MUSS den geladenen State zurückgeben -                return state; -            }, -            // --- ENDE customFetch --- - -            // onLoad ist bei customFetch nicht mehr nötig -            // onLoad: (response) => { ... },  -             -            // KRITISCH: Speichert den vollen State als JSON-String im Feld 'json_content'. -            onStore: (data) => { -                // ACHTUNG: ed existiert hier nicht, muss über window.__gjs geladen werden ODER ed als Argument akzeptiert werden -                const ed = window.__gjs; -                return { -                    json_content: JSON.stringify(data),  -                    html: ed ? ed.getHtml() : '' // Fügen Sie den HTML-Output zur Abwärtskompatibilität hinzu -                }; -            }, -        }; + const storageConf = { + autoload: false, + autosave: false, + }; var ed = grapesjs.init({ container: '#gjs',