/** * MYP Platform - JavaScript Fehler Validierung und Überwachung * Überprüft die behobenen Fehler und aktiviert weitere Fallbacks bei Bedarf */ (function() { 'use strict'; console.log('🔍 JavaScript Fehlervalidierung wird gestartet...'); /** * Validierung der showToast-Verfügbarkeit */ function validateShowToast() { const testsPassed = []; // Test 1: Grundfunktion verfügbar if (typeof window.showToast === 'function') { testsPassed.push('✅ window.showToast ist verfügbar'); } else { console.warn('⚠️ window.showToast nicht verfügbar - aktiviere Fallback'); // Fallback aktivieren window.showToast = function(message, type = 'info', duration = 5000) { console.log(`🔧 Validation-Fallback showToast: [${type.toUpperCase()}] ${message}`); // Versuche MYP.UI.toast zu verwenden if (window.MYP && window.MYP.UI && window.MYP.UI.toast && window.MYP.UI.toast.show) { window.MYP.UI.toast.show(message, type, duration); } }; testsPassed.push('🔧 Fallback showToast aktiviert'); } // Test 2: MYP.UI.toast verfügbar if (window.MYP && window.MYP.UI && window.MYP.UI.toast) { testsPassed.push('✅ MYP.UI.toast ist verfügbar'); } else { testsPassed.push('⚠️ MYP.UI.toast noch nicht verfügbar (wird später geladen)'); } return testsPassed; } /** * Validierung der Manager-Verfügbarkeit */ function validateManagers() { const testsPassed = []; // JobManager-Test if (typeof window.jobManager !== 'undefined' && window.jobManager) { testsPassed.push('✅ window.jobManager ist verfügbar'); } else if (typeof jobManager !== 'undefined' && jobManager) { testsPassed.push('✅ jobManager (global) ist verfügbar'); } else { testsPassed.push('⚠️ JobManager nicht verfügbar - API-Fallback wird verwendet'); } // Refresh-Funktionen Test if (typeof window.refreshJobs === 'function') { testsPassed.push('✅ refreshJobs-Funktion ist verfügbar'); } else { testsPassed.push('❌ refreshJobs-Funktion fehlt'); } if (typeof window.refreshStats === 'function') { testsPassed.push('✅ refreshStats-Funktion ist verfügbar'); } else { testsPassed.push('❌ refreshStats-Funktion fehlt'); } return testsPassed; } /** * API-Endpunkt Validierung */ async function validateAPIEndpoints() { const testsPassed = []; const endpoints = [ { url: '/api/stats', name: 'Statistiken' }, { url: '/api/jobs', name: 'Jobs' } ]; for (const endpoint of endpoints) { try { const response = await fetch(endpoint.url, { method: 'HEAD', // Nur Header abrufen, kein Body headers: { 'Content-Type': 'application/json' } }); if (response.ok || response.status === 405) { // 405 = Method Not Allowed ist OK testsPassed.push(`✅ ${endpoint.name} API (${endpoint.url}) ist erreichbar`); } else { testsPassed.push(`⚠️ ${endpoint.name} API (${endpoint.url}) antwortet mit Status ${response.status}`); } } catch (error) { testsPassed.push(`❌ ${endpoint.name} API (${endpoint.url}) nicht erreichbar: ${error.message}`); } } return testsPassed; } /** * DOM-Element Validierung */ function validateDOMElements() { const testsPassed = []; const criticalElements = [ 'total-print-time', 'completed-jobs-count', 'total-material-used', 'last-updated-time' ]; criticalElements.forEach(elementId => { const element = document.getElementById(elementId); if (element) { testsPassed.push(`✅ Element #${elementId} gefunden`); } else { testsPassed.push(`⚠️ Element #${elementId} nicht gefunden`); } }); // Container-Elemente const containers = [ '.jobs-container', '#jobs-container', '.job-grid', '#refresh-button' ]; containers.forEach(selector => { const element = document.querySelector(selector); if (element) { testsPassed.push(`✅ Container ${selector} gefunden`); } else { testsPassed.push(`⚠️ Container ${selector} nicht gefunden`); } }); return testsPassed; } /** * Error Handler Validierung */ function validateErrorHandling() { const testsPassed = []; // Test ob unser error handler aktiv ist const testError = new Error('Validation Test Error'); window.dispatchEvent(new ErrorEvent('error', { message: 'Test error for validation', filename: 'validation-fix.js', lineno: 1, error: testError })); testsPassed.push('✅ Error Handler Funktionalität getestet'); return testsPassed; } /** * Vollständige Validierung durchführen */ async function runCompleteValidation() { console.log('🔍 Starte vollständige JavaScript-Validierung...'); const results = { showToast: validateShowToast(), managers: validateManagers(), domElements: validateDOMElements(), errorHandling: validateErrorHandling(), apiEndpoints: await validateAPIEndpoints() }; // Ergebnisse ausgeben console.group('🔍 Validierungsergebnisse:'); Object.keys(results).forEach(category => { console.group(`📋 ${category}:`); results[category].forEach(result => console.log(result)); console.groupEnd(); }); console.groupEnd(); // Zusammenfassung const allResults = Object.values(results).flat(); const successCount = allResults.filter(r => r.startsWith('✅')).length; const warningCount = allResults.filter(r => r.startsWith('⚠️')).length; const errorCount = allResults.filter(r => r.startsWith('❌')).length; console.log(`📊 Validierung abgeschlossen: ${successCount} OK, ${warningCount} Warnungen, ${errorCount} Fehler`); // Status-Toast anzeigen if (typeof window.showToast === 'function') { if (errorCount === 0) { window.showToast(`✅ JavaScript-Validierung erfolgreich: ${successCount} Checks bestanden`, 'success'); } else { window.showToast(`⚠️ JavaScript-Validierung: ${errorCount} Probleme gefunden`, 'warning'); } } return results; } /** * Kontinuierliche Überwachung */ function startContinuousMonitoring() { setInterval(() => { // Prüfe kritische Funktionen if (typeof window.showToast !== 'function') { console.warn('⚠️ showToast-Funktion verloren - reaktiviere Fallback'); validateShowToast(); } // Prüfe auf neue Fehler const errorElements = document.querySelectorAll('.text-red-500'); if (errorElements.length > 0) { console.warn(`⚠️ ${errorElements.length} Fehler-Elemente gefunden`); } }, 30000); // Alle 30 Sekunden } // Globale Funktionen exportieren window.validateJavaScript = runCompleteValidation; window.validateShowToast = validateShowToast; // DOMContentLoaded abwarten und dann validieren if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { setTimeout(runCompleteValidation, 2000); // 2 Sekunden warten startContinuousMonitoring(); }); } else { setTimeout(runCompleteValidation, 2000); startContinuousMonitoring(); } console.log('✅ JavaScript Fehlervalidierung initialisiert'); })();