This commit is contained in:
2025-12-06 23:59:14 +01:00
parent 714e075a76
commit b57abb9a81

View File

@@ -258,131 +258,10 @@
            pluginsList.push('gjs-preset-newsletter');             pluginsList.push('gjs-preset-newsletter');
        }         }
                 
        // Speicherkonfiguration extrahieren, um die URL in onLoad zu verwenden. const storageConf = {
        // Verwenden Sie immer die zentrale API-Basis autoload: false,
        const storageBase = B.API_BASE; autosave: false,
        // 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
                };
            },
        };
var ed = grapesjs.init({ var ed = grapesjs.init({
container: '#gjs', container: '#gjs',