🔧 Update: Enhanced error handling and logging across various modules
**Änderungen:** - ✅ app.py: Hinzugefügt, um CSRF-Fehler zu behandeln - ✅ models.py: Fehlerprotokollierung bei der Suche nach Gastanfragen per OTP - ✅ api.py: Fehlerprotokollierung beim Markieren von Benachrichtigungen als gelesen - ✅ calendar.py: Fallback-Daten zurückgeben, wenn keine Kalenderereignisse vorhanden sind - ✅ guest.py: Status-Check-Seite für Gäste aktualisiert - ✅ hardware_integration.py: Debugging-Informationen für erweiterte Geräteinformationen hinzugefügt - ✅ tapo_status_manager.py: Rückgabewert für Statusabfrage hinzugefügt **Ergebnis:** - Verbesserte Fehlerbehandlung und Protokollierung für eine robustere Anwendung - Bessere Nachverfolgbarkeit von Fehlern und Systemverhalten 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,23 +1,25 @@
|
||||
/**
|
||||
* Jobs Safety Fix - Mercedes-Benz MYP Platform
|
||||
* Umfassende Lösung für "jobs undefined" Probleme
|
||||
* Version: 1.0.0
|
||||
* Version: 2.0.0 - Erweiterte Fehlerbehandlung
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
console.log('🛡️ Jobs Safety Fix wird geladen...');
|
||||
console.log('🛡️ Jobs Safety Fix v2.0.0 wird geladen...');
|
||||
|
||||
/**
|
||||
* Globale Jobs-Variable sicher initialisieren
|
||||
*/
|
||||
if (typeof window.jobsData === 'undefined') {
|
||||
window.jobsData = [];
|
||||
console.log('✅ window.jobsData initialisiert');
|
||||
}
|
||||
|
||||
if (typeof window.filteredJobs === 'undefined') {
|
||||
window.filteredJobs = [];
|
||||
console.log('✅ window.filteredJobs initialisiert');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -28,70 +30,122 @@
|
||||
* Jobs sicher abrufen
|
||||
*/
|
||||
getJobs: function() {
|
||||
if (window.jobManager && Array.isArray(window.jobManager.jobs)) {
|
||||
return window.jobManager.jobs;
|
||||
try {
|
||||
if (window.jobManager && Array.isArray(window.jobManager.jobs)) {
|
||||
return window.jobManager.jobs;
|
||||
}
|
||||
if (Array.isArray(window.jobsData)) {
|
||||
return window.jobsData;
|
||||
}
|
||||
console.warn('⚠️ Keine gültigen Jobs gefunden, gebe leeres Array zurück');
|
||||
return [];
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim Abrufen der Jobs:', error);
|
||||
return [];
|
||||
}
|
||||
if (Array.isArray(window.jobsData)) {
|
||||
return window.jobsData;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Gefilterte Jobs sicher abrufen
|
||||
*/
|
||||
getFilteredJobs: function() {
|
||||
if (Array.isArray(window.filteredJobs)) {
|
||||
return window.filteredJobs;
|
||||
try {
|
||||
if (Array.isArray(window.filteredJobs)) {
|
||||
return window.filteredJobs;
|
||||
}
|
||||
return this.getJobs();
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim Abrufen der gefilterten Jobs:', error);
|
||||
return [];
|
||||
}
|
||||
return this.getJobs();
|
||||
},
|
||||
|
||||
/**
|
||||
* Jobs sicher setzen
|
||||
*/
|
||||
setJobs: function(jobs) {
|
||||
if (!Array.isArray(jobs)) {
|
||||
console.warn('⚠️ Jobs ist kein Array, konvertiere zu leerem Array');
|
||||
jobs = [];
|
||||
try {
|
||||
if (!Array.isArray(jobs)) {
|
||||
console.warn('⚠️ Jobs ist kein Array, konvertiere zu leerem Array:', typeof jobs);
|
||||
jobs = [];
|
||||
}
|
||||
|
||||
if (window.jobManager) {
|
||||
window.jobManager.jobs = jobs;
|
||||
}
|
||||
window.jobsData = jobs;
|
||||
|
||||
console.log(`✅ ${jobs.length} Jobs sicher gesetzt`);
|
||||
|
||||
// Event für andere Komponenten
|
||||
window.dispatchEvent(new CustomEvent('jobsUpdated', {
|
||||
detail: { jobs: jobs, count: jobs.length }
|
||||
}));
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim Setzen der Jobs:', error);
|
||||
window.jobsData = [];
|
||||
if (window.jobManager) {
|
||||
window.jobManager.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;
|
||||
try {
|
||||
const jobs = this.getJobs();
|
||||
const job = jobs.find(job => job && job.id && job.id.toString() === jobId.toString());
|
||||
if (!job) {
|
||||
console.warn(`⚠️ Job mit ID ${jobId} nicht gefunden`);
|
||||
}
|
||||
return job || null;
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim Suchen des Jobs:', error);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Jobs sicher filtern
|
||||
*/
|
||||
filterJobs: function(filterFn) {
|
||||
const jobs = this.getJobs();
|
||||
if (typeof filterFn !== 'function') {
|
||||
return jobs;
|
||||
}
|
||||
|
||||
try {
|
||||
const jobs = this.getJobs();
|
||||
if (typeof filterFn !== 'function') {
|
||||
console.warn('⚠️ Filter-Funktion ist nicht gültig');
|
||||
return jobs;
|
||||
}
|
||||
|
||||
return jobs.filter(job => {
|
||||
if (!job || typeof job !== 'object') {
|
||||
return false;
|
||||
}
|
||||
return filterFn(job);
|
||||
try {
|
||||
return filterFn(job);
|
||||
} catch (filterError) {
|
||||
console.warn('⚠️ Fehler beim Filtern eines Jobs:', filterError);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim Filtern der Jobs:', error);
|
||||
return jobs;
|
||||
return this.getJobs();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Debug-Informationen ausgeben
|
||||
*/
|
||||
debugInfo: function() {
|
||||
console.group('🔍 Jobs Debug Info');
|
||||
console.log('jobsData:', window.jobsData);
|
||||
console.log('filteredJobs:', window.filteredJobs);
|
||||
console.log('jobManager:', window.jobManager);
|
||||
console.log('jobManager.jobs:', window.jobManager?.jobs);
|
||||
console.groupEnd();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -99,61 +153,72 @@
|
||||
* 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)) {
|
||||
try {
|
||||
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...', typeof window.jobManager.jobs);
|
||||
window.jobManager.jobs = [];
|
||||
}
|
||||
|
||||
// Originale loadJobs Methode wrappen
|
||||
if (window.jobManager.loadJobs && typeof window.jobManager.loadJobs === 'function' && !window.jobManager._loadJobsWrapped) {
|
||||
const originalLoadJobs = window.jobManager.loadJobs;
|
||||
window.jobManager.loadJobs = async function(...args) {
|
||||
try {
|
||||
console.log('🔄 Lade Jobs sicher...');
|
||||
await originalLoadJobs.apply(this, args);
|
||||
// Nach dem Laden sicherstellen, dass jobs ein Array ist
|
||||
if (!Array.isArray(this.jobs)) {
|
||||
console.warn('⚠️ Jobs nach dem Laden kein Array, korrigiere...');
|
||||
this.jobs = [];
|
||||
}
|
||||
console.log(`✅ ${this.jobs.length} Jobs erfolgreich geladen`);
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler beim sicheren Laden der Jobs:', error);
|
||||
this.jobs = [];
|
||||
throw error;
|
||||
}
|
||||
} 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>
|
||||
`;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
window.jobManager._loadJobsWrapped = true;
|
||||
}
|
||||
|
||||
// Originale renderJobs Methode wrappen
|
||||
if (window.jobManager.renderJobs && typeof window.jobManager.renderJobs === 'function' && !window.jobManager._renderJobsWrapped) {
|
||||
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 = [];
|
||||
}
|
||||
console.log(`🎨 Rendere ${this.jobs.length} 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.safeJobsOperations.debugInfo(); window.jobManager?.loadJobs?.()"
|
||||
class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">
|
||||
Erneut laden
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
}
|
||||
};
|
||||
window.jobManager._renderJobsWrapped = true;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler bei JobManager-Sicherheitsprüfung:', error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,97 +226,114 @@
|
||||
* 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
|
||||
});
|
||||
try {
|
||||
// jobsData überwachen
|
||||
let _jobsData = window.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:', typeof value, value);
|
||||
_jobsData = [];
|
||||
} else {
|
||||
_jobsData = value;
|
||||
console.log(`✅ jobsData gesetzt: ${value.length} Jobs`);
|
||||
}
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
|
||||
// filteredJobs überwachen
|
||||
let _filteredJobs = window.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:', typeof value, value);
|
||||
_filteredJobs = [];
|
||||
} else {
|
||||
_filteredJobs = value;
|
||||
console.log(`✅ filteredJobs gesetzt: ${value.length} Jobs`);
|
||||
}
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
|
||||
console.log('✅ Globale Variablen-Überwachung eingerichtet');
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler bei Variablen-Überwachung:', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API-Response Validator
|
||||
*/
|
||||
window.validateJobsResponse = function(data) {
|
||||
if (!data || typeof data !== 'object') {
|
||||
console.warn('⚠️ Ungültige API-Response:', data);
|
||||
try {
|
||||
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
|
||||
const validJobs = 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(`✅ ${validJobs.length} von ${jobs.length} Jobs validiert`);
|
||||
return {
|
||||
jobs: validJobs,
|
||||
total: validJobs.length,
|
||||
current_page: data.current_page || 1,
|
||||
total_pages: data.total_pages || 1
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler bei API-Response-Validierung:', error);
|
||||
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')) {
|
||||
if (e.message && e.message.toLowerCase().includes('jobs') && e.message.toLowerCase().includes('undefined')) {
|
||||
console.log('🛡️ Jobs undefined Fehler abgefangen:', e.message);
|
||||
console.log('🛡️ Stack:', e.error?.stack);
|
||||
|
||||
// Versuche Jobs zu reparieren
|
||||
window.safeJobsOperations.setJobs([]);
|
||||
|
||||
// Debug-Info ausgeben
|
||||
window.safeJobsOperations.debugInfo();
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
@@ -261,7 +343,7 @@
|
||||
* Promise rejection handler für Jobs
|
||||
*/
|
||||
window.addEventListener('unhandledrejection', function(e) {
|
||||
if (e.reason && e.reason.message && e.reason.message.includes('jobs')) {
|
||||
if (e.reason && e.reason.message && e.reason.message.toLowerCase().includes('jobs')) {
|
||||
console.log('🛡️ Jobs Promise rejection abgefangen:', e.reason);
|
||||
|
||||
// Versuche Jobs zu reparieren
|
||||
@@ -274,34 +356,49 @@
|
||||
/**
|
||||
* DOM bereit - Setup starten
|
||||
*/
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
function initializeSafety() {
|
||||
try {
|
||||
setupGlobalVariableWatching();
|
||||
ensureJobManagerSafety();
|
||||
});
|
||||
console.log('✅ Jobs Safety Fix erfolgreich initialisiert');
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler bei Safety Fix Initialisierung:', error);
|
||||
}
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initializeSafety);
|
||||
} else {
|
||||
setupGlobalVariableWatching();
|
||||
ensureJobManagerSafety();
|
||||
initializeSafety();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 = [];
|
||||
try {
|
||||
ensureJobManagerSafety();
|
||||
|
||||
// Prüfe ob globale Jobs-Variablen noch Arrays sind
|
||||
if (!Array.isArray(window.jobsData)) {
|
||||
console.warn('⚠️ jobsData ist kein Array mehr, repariere...', typeof window.jobsData);
|
||||
window.jobsData = [];
|
||||
}
|
||||
|
||||
if (!Array.isArray(window.filteredJobs)) {
|
||||
console.warn('⚠️ filteredJobs ist kein Array mehr, repariere...', typeof window.filteredJobs);
|
||||
window.filteredJobs = [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Fehler bei periodischer Sicherheitsprüfung:', error);
|
||||
}
|
||||
|
||||
if (!Array.isArray(window.filteredJobs)) {
|
||||
console.warn('⚠️ filteredJobs ist kein Array mehr, repariere...');
|
||||
window.filteredJobs = [];
|
||||
}
|
||||
}, 10000); // Alle 10 Sekunden
|
||||
}, 15000); // Alle 15 Sekunden
|
||||
|
||||
console.log('✅ Jobs Safety Fix erfolgreich geladen');
|
||||
// Globale Debug-Funktion verfügbar machen
|
||||
window.debugJobs = function() {
|
||||
window.safeJobsOperations.debugInfo();
|
||||
};
|
||||
|
||||
console.log('✅ Jobs Safety Fix v2.0.0 erfolgreich geladen');
|
||||
|
||||
})();
|
Reference in New Issue
Block a user