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

307 lines
10 KiB
JavaScript

/**
* Jobs Safety Fix - Mercedes-Benz MYP Platform
* Umfassende Lösung für "jobs undefined" Probleme
* Version: 1.0.0
*/
(function() {
'use strict';
console.log('🛡️ Jobs Safety Fix wird geladen...');
/**
* Globale Jobs-Variable sicher initialisieren
*/
if (typeof window.jobsData === 'undefined') {
window.jobsData = [];
}
if (typeof window.filteredJobs === 'undefined') {
window.filteredJobs = [];
}
/**
* Sichere Jobs-Funktionen
*/
window.safeJobsOperations = {
/**
* Jobs sicher abrufen
*/
getJobs: function() {
if (window.jobManager && Array.isArray(window.jobManager.jobs)) {
return window.jobManager.jobs;
}
if (Array.isArray(window.jobsData)) {
return window.jobsData;
}
return [];
},
/**
* Gefilterte Jobs sicher abrufen
*/
getFilteredJobs: function() {
if (Array.isArray(window.filteredJobs)) {
return window.filteredJobs;
}
return this.getJobs();
},
/**
* Jobs sicher setzen
*/
setJobs: function(jobs) {
if (!Array.isArray(jobs)) {
console.warn('⚠️ Jobs ist kein Array, konvertiere zu leerem Array');
jobs = [];
}
if (window.jobManager) {
window.jobManager.jobs = jobs;
}
window.jobsData = jobs;
console.log(`${jobs.length} Jobs sicher gesetzt`);
},
/**
* Job sicher finden
*/
findJob: function(jobId) {
const jobs = this.getJobs();
return jobs.find(job => job && job.id && job.id.toString() === jobId.toString()) || null;
},
/**
* Jobs sicher filtern
*/
filterJobs: function(filterFn) {
const jobs = this.getJobs();
if (typeof filterFn !== 'function') {
return jobs;
}
try {
return jobs.filter(job => {
if (!job || typeof job !== 'object') {
return false;
}
return filterFn(job);
});
} catch (error) {
console.error('❌ Fehler beim Filtern der Jobs:', error);
return jobs;
}
}
};
/**
* JobManager Sicherheitsprüfungen
*/
function ensureJobManagerSafety() {
if (typeof window.jobManager !== 'undefined' && window.jobManager) {
// Sicherstellen, dass jobs ein Array ist
if (!Array.isArray(window.jobManager.jobs)) {
console.warn('⚠️ JobManager.jobs ist kein Array, korrigiere...');
window.jobManager.jobs = [];
}
// Originale loadJobs Methode wrappen
if (window.jobManager.loadJobs && typeof window.jobManager.loadJobs === 'function') {
const originalLoadJobs = window.jobManager.loadJobs;
window.jobManager.loadJobs = async function(...args) {
try {
await originalLoadJobs.apply(this, args);
// Nach dem Laden sicherstellen, dass jobs ein Array ist
if (!Array.isArray(this.jobs)) {
this.jobs = [];
}
} catch (error) {
console.error('❌ Fehler beim sicheren Laden der Jobs:', error);
this.jobs = [];
throw error;
}
};
}
// Originale renderJobs Methode wrappen
if (window.jobManager.renderJobs && typeof window.jobManager.renderJobs === 'function') {
const originalRenderJobs = window.jobManager.renderJobs;
window.jobManager.renderJobs = function(...args) {
try {
// Sicherstellen, dass jobs ein Array ist vor dem Rendern
if (!Array.isArray(this.jobs)) {
console.warn('⚠️ Jobs ist kein Array vor dem Rendern, korrigiere...');
this.jobs = [];
}
return originalRenderJobs.apply(this, args);
} catch (error) {
console.error('❌ Fehler beim sicheren Rendern der Jobs:', error);
// Fallback-Rendering
const jobsList = document.getElementById('jobs-list');
if (jobsList) {
jobsList.innerHTML = `
<div class="text-center py-12">
<div class="text-red-400 dark:text-red-600 text-6xl mb-4">⚠️</div>
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-2">Renderingfehler</h3>
<p class="text-gray-500 dark:text-gray-400 mb-4">Jobs konnten nicht angezeigt werden</p>
<button onclick="window.jobManager.loadJobs()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">
Erneut laden
</button>
</div>
`;
}
}
};
}
}
}
/**
* Globale Variablen-Überwachung
*/
function setupGlobalVariableWatching() {
// jobsData überwachen
let _jobsData = [];
Object.defineProperty(window, 'jobsData', {
get: function() {
return _jobsData;
},
set: function(value) {
if (!Array.isArray(value)) {
console.warn('⚠️ Versuche jobsData mit Non-Array zu setzen:', value);
_jobsData = [];
} else {
_jobsData = value;
}
},
enumerable: true,
configurable: true
});
// filteredJobs überwachen
let _filteredJobs = [];
Object.defineProperty(window, 'filteredJobs', {
get: function() {
return _filteredJobs;
},
set: function(value) {
if (!Array.isArray(value)) {
console.warn('⚠️ Versuche filteredJobs mit Non-Array zu setzen:', value);
_filteredJobs = [];
} else {
_filteredJobs = value;
}
},
enumerable: true,
configurable: true
});
}
/**
* API-Response Validator
*/
window.validateJobsResponse = function(data) {
if (!data || typeof data !== 'object') {
console.warn('⚠️ Ungültige API-Response:', data);
return { jobs: [], total: 0 };
}
let jobs = [];
// Verschiedene Response-Formate unterstützen
if (Array.isArray(data.jobs)) {
jobs = data.jobs;
} else if (Array.isArray(data.data)) {
jobs = data.data;
} else if (Array.isArray(data)) {
jobs = data;
} else if (data.success && Array.isArray(data.jobs)) {
jobs = data.jobs;
}
// Jobs validieren
jobs = jobs.filter(job => {
if (!job || typeof job !== 'object') {
console.warn('⚠️ Ungültiges Job-Objekt gefiltert:', job);
return false;
}
if (!job.id) {
console.warn('⚠️ Job ohne ID gefiltert:', job);
return false;
}
return true;
});
console.log(`${jobs.length} Jobs validiert`);
return {
jobs: jobs,
total: jobs.length,
current_page: data.current_page || 1,
total_pages: data.total_pages || 1
};
};
/**
* Fehlerbehandlung für undefined Jobs
*/
window.addEventListener('error', function(e) {
if (e.message && e.message.includes('jobs') && e.message.includes('undefined')) {
console.log('🛡️ Jobs undefined Fehler abgefangen:', e.message);
// Versuche Jobs zu reparieren
window.safeJobsOperations.setJobs([]);
e.preventDefault();
return false;
}
});
/**
* Promise rejection handler für Jobs
*/
window.addEventListener('unhandledrejection', function(e) {
if (e.reason && e.reason.message && e.reason.message.includes('jobs')) {
console.log('🛡️ Jobs Promise rejection abgefangen:', e.reason);
// Versuche Jobs zu reparieren
window.safeJobsOperations.setJobs([]);
e.preventDefault();
}
});
/**
* DOM bereit - Setup starten
*/
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
setupGlobalVariableWatching();
ensureJobManagerSafety();
});
} else {
setupGlobalVariableWatching();
ensureJobManagerSafety();
}
/**
* Periodische Sicherheitsprüfung
*/
setInterval(function() {
ensureJobManagerSafety();
// Prüfe ob globale Jobs-Variablen noch Arrays sind
if (!Array.isArray(window.jobsData)) {
console.warn('⚠️ jobsData ist kein Array mehr, repariere...');
window.jobsData = [];
}
if (!Array.isArray(window.filteredJobs)) {
console.warn('⚠️ filteredJobs ist kein Array mehr, repariere...');
window.filteredJobs = [];
}
}, 10000); // Alle 10 Sekunden
console.log('✅ Jobs Safety Fix erfolgreich geladen');
})();