307 lines
10 KiB
JavaScript
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');
|
|
|
|
})();
|