manage-your-printer/static/js/validation-fix.js
2025-06-04 10:03:22 +02:00

249 lines
8.6 KiB
JavaScript

/**
* 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');
})();