🎉 Improved backend structure & documentation, added new GLASSMORPHISM_NOTIFICATIONS feature 🎨
This commit is contained in:
parent
19eeed46fb
commit
f0fe4c29d5
Binary file not shown.
186
backend/app.py
186
backend/app.py
@ -1254,10 +1254,12 @@ def user_update_settings():
|
|||||||
finally:
|
finally:
|
||||||
db_session.close()
|
db_session.close()
|
||||||
|
|
||||||
@app.route("/api/user/settings", methods=["GET"])
|
@app.route("/api/user/settings", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def get_user_settings():
|
def get_user_settings():
|
||||||
"""Holt die aktuellen Benutzereinstellungen"""
|
"""Holt die aktuellen Benutzereinstellungen (GET) oder speichert sie (POST)"""
|
||||||
|
|
||||||
|
if request.method == "GET":
|
||||||
try:
|
try:
|
||||||
# Einstellungen aus Session oder Datenbank laden
|
# Einstellungen aus Session oder Datenbank laden
|
||||||
user_settings = session.get('user_settings', {})
|
user_settings = session.get('user_settings', {})
|
||||||
@ -1295,6 +1297,91 @@ def get_user_settings():
|
|||||||
"error": "Fehler beim Laden der Einstellungen"
|
"error": "Fehler beim Laden der Einstellungen"
|
||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
|
elif request.method == "POST":
|
||||||
|
"""Benutzereinstellungen über API aktualisieren"""
|
||||||
|
db_session = get_db_session()
|
||||||
|
try:
|
||||||
|
# JSON-Daten extrahieren
|
||||||
|
if not request.is_json:
|
||||||
|
return jsonify({"error": "Anfrage muss im JSON-Format sein"}), 400
|
||||||
|
|
||||||
|
data = request.get_json()
|
||||||
|
if not data:
|
||||||
|
return jsonify({"error": "Keine Daten empfangen"}), 400
|
||||||
|
|
||||||
|
# Einstellungen aus der Anfrage extrahieren
|
||||||
|
theme = data.get("theme", "system")
|
||||||
|
reduced_motion = bool(data.get("reduced_motion", False))
|
||||||
|
contrast = data.get("contrast", "normal")
|
||||||
|
notifications = data.get("notifications", {})
|
||||||
|
privacy = data.get("privacy", {})
|
||||||
|
|
||||||
|
# Validierung der Eingaben
|
||||||
|
valid_themes = ["light", "dark", "system"]
|
||||||
|
if theme not in valid_themes:
|
||||||
|
theme = "system"
|
||||||
|
|
||||||
|
valid_contrasts = ["normal", "high"]
|
||||||
|
if contrast not in valid_contrasts:
|
||||||
|
contrast = "normal"
|
||||||
|
|
||||||
|
# Benutzer aus der Datenbank laden
|
||||||
|
user = db_session.query(User).filter(User.id == int(current_user.id)).first()
|
||||||
|
|
||||||
|
if not user:
|
||||||
|
return jsonify({"error": "Benutzer nicht gefunden"}), 404
|
||||||
|
|
||||||
|
# Einstellungen-Dictionary erstellen
|
||||||
|
settings = {
|
||||||
|
"theme": theme,
|
||||||
|
"reduced_motion": reduced_motion,
|
||||||
|
"contrast": contrast,
|
||||||
|
"notifications": {
|
||||||
|
"new_jobs": bool(notifications.get("new_jobs", True)),
|
||||||
|
"job_updates": bool(notifications.get("job_updates", True)),
|
||||||
|
"system": bool(notifications.get("system", True)),
|
||||||
|
"email": bool(notifications.get("email", False))
|
||||||
|
},
|
||||||
|
"privacy": {
|
||||||
|
"activity_logs": bool(privacy.get("activity_logs", True)),
|
||||||
|
"two_factor": bool(privacy.get("two_factor", False)),
|
||||||
|
"auto_logout": max(5, min(480, int(privacy.get("auto_logout", 60)))) # 5-480 Minuten
|
||||||
|
},
|
||||||
|
"last_updated": datetime.now().isoformat()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prüfen, ob User-Tabelle eine settings-Spalte hat
|
||||||
|
if hasattr(user, 'settings'):
|
||||||
|
# Einstellungen in der Datenbank speichern
|
||||||
|
import json
|
||||||
|
user.settings = json.dumps(settings)
|
||||||
|
else:
|
||||||
|
# Fallback: In Session speichern (temporär)
|
||||||
|
session['user_settings'] = settings
|
||||||
|
|
||||||
|
user.updated_at = datetime.now()
|
||||||
|
db_session.commit()
|
||||||
|
|
||||||
|
user_logger.info(f"Benutzer {current_user.username} hat seine Einstellungen über die API aktualisiert")
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"message": "Einstellungen erfolgreich aktualisiert",
|
||||||
|
"settings": settings
|
||||||
|
})
|
||||||
|
|
||||||
|
except ValueError as e:
|
||||||
|
error = f"Ungültige Eingabedaten: {str(e)}"
|
||||||
|
user_logger.warning(f"Ungültige Einstellungsdaten von Benutzer {current_user.username}: {str(e)}")
|
||||||
|
return jsonify({"error": error}), 400
|
||||||
|
except Exception as e:
|
||||||
|
db_session.rollback()
|
||||||
|
error = f"Fehler beim Aktualisieren der Einstellungen: {str(e)}"
|
||||||
|
user_logger.error(f"Fehler beim Aktualisieren der Einstellungen für Benutzer {current_user.username}: {str(e)}")
|
||||||
|
return jsonify({"error": "Interner Serverfehler"}), 500
|
||||||
|
finally:
|
||||||
|
db_session.close()
|
||||||
|
|
||||||
@app.route("/user/change-password", methods=["POST"])
|
@app.route("/user/change-password", methods=["POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def user_change_password():
|
def user_change_password():
|
||||||
@ -1523,8 +1610,6 @@ def kiosk_deactivate():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
kiosk_logger.error(f"Unerwarteter Fehler bei Kiosk-Deaktivierung: {str(e)}")
|
kiosk_logger.error(f"Unerwarteter Fehler bei Kiosk-Deaktivierung: {str(e)}")
|
||||||
return jsonify({"error": "Unerwarteter Fehler"}), 500
|
return jsonify({"error": "Unerwarteter Fehler"}), 500
|
||||||
@app.route('/api/kiosk/activate', methods=['POST'])
|
|
||||||
@login_required
|
|
||||||
def kiosk_activate():
|
def kiosk_activate():
|
||||||
"""Kiosk-Modus aktivieren (nur für Admins)."""
|
"""Kiosk-Modus aktivieren (nur für Admins)."""
|
||||||
try:
|
try:
|
||||||
@ -6396,6 +6481,99 @@ def api_admin_system_status():
|
|||||||
'health_status': 'error'
|
'health_status': 'error'
|
||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
|
|
||||||
|
# ===== ÖFFENTLICHE STATISTIK-API =====
|
||||||
|
|
||||||
|
@app.route("/api/statistics/public", methods=['GET'])
|
||||||
|
def api_public_statistics():
|
||||||
|
"""
|
||||||
|
Öffentliche Statistiken ohne Authentifizierung.
|
||||||
|
|
||||||
|
Stellt grundlegende, nicht-sensible Systemstatistiken bereit,
|
||||||
|
die auf der Startseite angezeigt werden können.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
JSON: Öffentliche Statistiken
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
db_session = get_db_session()
|
||||||
|
|
||||||
|
# Grundlegende, nicht-sensible Statistiken
|
||||||
|
total_jobs = db_session.query(Job).count()
|
||||||
|
completed_jobs = db_session.query(Job).filter(Job.status == "finished").count()
|
||||||
|
total_printers = db_session.query(Printer).count()
|
||||||
|
active_printers = db_session.query(Printer).filter(
|
||||||
|
Printer.active == True,
|
||||||
|
Printer.status.in_(["online", "available", "idle"])
|
||||||
|
).count()
|
||||||
|
|
||||||
|
# Erfolgsrate berechnen
|
||||||
|
success_rate = round((completed_jobs / total_jobs * 100) if total_jobs > 0 else 0, 1)
|
||||||
|
|
||||||
|
# Anonymisierte Benutzerstatistiken
|
||||||
|
total_users = db_session.query(User).filter(User.active == True).count()
|
||||||
|
|
||||||
|
# Letzte 30 Tage Aktivität (anonymisiert)
|
||||||
|
thirty_days_ago = datetime.now() - timedelta(days=30)
|
||||||
|
recent_jobs = db_session.query(Job).filter(
|
||||||
|
Job.created_at >= thirty_days_ago
|
||||||
|
).count()
|
||||||
|
|
||||||
|
db_session.close()
|
||||||
|
|
||||||
|
public_stats = {
|
||||||
|
"system_info": {
|
||||||
|
"total_jobs": total_jobs,
|
||||||
|
"completed_jobs": completed_jobs,
|
||||||
|
"success_rate": success_rate,
|
||||||
|
"total_printers": total_printers,
|
||||||
|
"active_printers": active_printers,
|
||||||
|
"active_users": total_users,
|
||||||
|
"recent_activity": recent_jobs
|
||||||
|
},
|
||||||
|
"health_indicators": {
|
||||||
|
"system_status": "operational",
|
||||||
|
"printer_availability": round((active_printers / total_printers * 100) if total_printers > 0 else 0, 1),
|
||||||
|
"last_updated": datetime.now().isoformat()
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"multi_location_support": True,
|
||||||
|
"real_time_monitoring": True,
|
||||||
|
"automated_scheduling": True,
|
||||||
|
"advanced_reporting": True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonify(public_stats)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"Fehler bei öffentlichen Statistiken: {str(e)}")
|
||||||
|
|
||||||
|
# Fallback-Statistiken bei Fehler
|
||||||
|
return jsonify({
|
||||||
|
"system_info": {
|
||||||
|
"total_jobs": 0,
|
||||||
|
"completed_jobs": 0,
|
||||||
|
"success_rate": 0,
|
||||||
|
"total_printers": 0,
|
||||||
|
"active_printers": 0,
|
||||||
|
"active_users": 0,
|
||||||
|
"recent_activity": 0
|
||||||
|
},
|
||||||
|
"health_indicators": {
|
||||||
|
"system_status": "maintenance",
|
||||||
|
"printer_availability": 0,
|
||||||
|
"last_updated": datetime.now().isoformat()
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"multi_location_support": True,
|
||||||
|
"real_time_monitoring": True,
|
||||||
|
"automated_scheduling": True,
|
||||||
|
"advanced_reporting": True
|
||||||
|
},
|
||||||
|
"error": "Statistiken temporär nicht verfügbar"
|
||||||
|
}), 200 # 200 statt 500 um Frontend nicht zu brechen
|
||||||
|
|
||||||
@app.route("/api/stats", methods=['GET'])
|
@app.route("/api/stats", methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
def api_stats():
|
def api_stats():
|
||||||
|
BIN
backend/blueprints/__pycache__/admin_api.cpython-313.pyc
Normal file
BIN
backend/blueprints/__pycache__/admin_api.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
backend/docs/GLASSMORPHISM_NOTIFICATIONS.md
Normal file
1
backend/docs/GLASSMORPHISM_NOTIFICATIONS.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
130
backend/fix_public_stats.py
Normal file
130
backend/fix_public_stats.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Temporäres Skript zum Hinzufügen der fehlenden /api/statistics/public Route
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open('app.py', 'r', encoding='utf-8') as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Die neue Route die hinzugefügt werden soll
|
||||||
|
new_route = '''
|
||||||
|
# ===== ÖFFENTLICHE STATISTIK-API =====
|
||||||
|
|
||||||
|
@app.route("/api/statistics/public", methods=['GET'])
|
||||||
|
def api_public_statistics():
|
||||||
|
"""
|
||||||
|
Öffentliche Statistiken ohne Authentifizierung.
|
||||||
|
|
||||||
|
Stellt grundlegende, nicht-sensible Systemstatistiken bereit,
|
||||||
|
die auf der Startseite angezeigt werden können.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
JSON: Öffentliche Statistiken
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
db_session = get_db_session()
|
||||||
|
|
||||||
|
# Grundlegende, nicht-sensible Statistiken
|
||||||
|
total_jobs = db_session.query(Job).count()
|
||||||
|
completed_jobs = db_session.query(Job).filter(Job.status == "finished").count()
|
||||||
|
total_printers = db_session.query(Printer).count()
|
||||||
|
active_printers = db_session.query(Printer).filter(
|
||||||
|
Printer.active == True,
|
||||||
|
Printer.status.in_(["online", "available", "idle"])
|
||||||
|
).count()
|
||||||
|
|
||||||
|
# Erfolgsrate berechnen
|
||||||
|
success_rate = round((completed_jobs / total_jobs * 100) if total_jobs > 0 else 0, 1)
|
||||||
|
|
||||||
|
# Anonymisierte Benutzerstatistiken
|
||||||
|
total_users = db_session.query(User).filter(User.active == True).count()
|
||||||
|
|
||||||
|
# Letzte 30 Tage Aktivität (anonymisiert)
|
||||||
|
thirty_days_ago = datetime.now() - timedelta(days=30)
|
||||||
|
recent_jobs = db_session.query(Job).filter(
|
||||||
|
Job.created_at >= thirty_days_ago
|
||||||
|
).count()
|
||||||
|
|
||||||
|
db_session.close()
|
||||||
|
|
||||||
|
public_stats = {
|
||||||
|
"system_info": {
|
||||||
|
"total_jobs": total_jobs,
|
||||||
|
"completed_jobs": completed_jobs,
|
||||||
|
"success_rate": success_rate,
|
||||||
|
"total_printers": total_printers,
|
||||||
|
"active_printers": active_printers,
|
||||||
|
"active_users": total_users,
|
||||||
|
"recent_activity": recent_jobs
|
||||||
|
},
|
||||||
|
"health_indicators": {
|
||||||
|
"system_status": "operational",
|
||||||
|
"printer_availability": round((active_printers / total_printers * 100) if total_printers > 0 else 0, 1),
|
||||||
|
"last_updated": datetime.now().isoformat()
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"multi_location_support": True,
|
||||||
|
"real_time_monitoring": True,
|
||||||
|
"automated_scheduling": True,
|
||||||
|
"advanced_reporting": True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonify(public_stats)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"Fehler bei öffentlichen Statistiken: {str(e)}")
|
||||||
|
|
||||||
|
# Fallback-Statistiken bei Fehler
|
||||||
|
return jsonify({
|
||||||
|
"system_info": {
|
||||||
|
"total_jobs": 0,
|
||||||
|
"completed_jobs": 0,
|
||||||
|
"success_rate": 0,
|
||||||
|
"total_printers": 0,
|
||||||
|
"active_printers": 0,
|
||||||
|
"active_users": 0,
|
||||||
|
"recent_activity": 0
|
||||||
|
},
|
||||||
|
"health_indicators": {
|
||||||
|
"system_status": "maintenance",
|
||||||
|
"printer_availability": 0,
|
||||||
|
"last_updated": datetime.now().isoformat()
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"multi_location_support": True,
|
||||||
|
"real_time_monitoring": True,
|
||||||
|
"automated_scheduling": True,
|
||||||
|
"advanced_reporting": True
|
||||||
|
},
|
||||||
|
"error": "Statistiken temporär nicht verfügbar"
|
||||||
|
}), 200 # 200 statt 500 um Frontend nicht zu brechen
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Füge die Route vor @app.route("/api/stats", methods=['GET']) hinzu
|
||||||
|
marker = '@app.route("/api/stats", methods=[\'GET\'])'
|
||||||
|
if marker in content:
|
||||||
|
parts = content.split(marker, 1)
|
||||||
|
new_content = parts[0] + new_route + marker + parts[1]
|
||||||
|
|
||||||
|
with open('app.py', 'w', encoding='utf-8') as f:
|
||||||
|
f.write(new_content)
|
||||||
|
print('✅ Öffentliche Statistik-API Route hinzugefügt')
|
||||||
|
else:
|
||||||
|
print('❌ Marker nicht gefunden - versuche alternativen Marker')
|
||||||
|
# Versuche alternativen Marker
|
||||||
|
alt_marker = '@app.route("/api/stats", methods=[\"GET\"])'
|
||||||
|
if alt_marker in content:
|
||||||
|
parts = content.split(alt_marker, 1)
|
||||||
|
new_content = parts[0] + new_route + alt_marker + parts[1]
|
||||||
|
|
||||||
|
with open('app.py', 'w', encoding='utf-8') as f:
|
||||||
|
f.write(new_content)
|
||||||
|
print('✅ Öffentliche Statistik-API Route mit alternativem Marker hinzugefügt')
|
||||||
|
else:
|
||||||
|
print('❌ Auch alternativer Marker nicht gefunden')
|
||||||
|
print('Suche verfügbare Marker...')
|
||||||
|
import re
|
||||||
|
stats_markers = re.findall(r'@app\.route\("/api/stats".*?\)', content)
|
||||||
|
print(f'Gefundene Stats-Marker: {stats_markers}')
|
0
backend/logs/admin_api/admin_api.log
Normal file
0
backend/logs/admin_api/admin_api.log
Normal file
@ -17,3 +17,10 @@
|
|||||||
2025-06-01 04:14:22 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
2025-06-01 04:14:22 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
2025-06-01 04:16:09 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
2025-06-01 04:16:09 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
2025-06-01 04:22:49 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
2025-06-01 04:22:49 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:26:29 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:26:32 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:28:39 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:28:58 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:29:28 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:31:09 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
2025-06-01 04:36:21 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||||
|
@ -616,3 +616,72 @@ WHERE users.id = ?
|
|||||||
2025-06-01 04:24:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
2025-06-01 04:24:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
||||||
2025-06-01 04:25:22 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
2025-06-01 04:25:22 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
||||||
2025-06-01 04:25:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
2025-06-01 04:25:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
||||||
|
2025-06-01 04:26:22 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
|
||||||
|
2025-06-01 04:26:29 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
|
||||||
|
2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - Job-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
|
||||||
|
2025-06-01 04:26:31 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
|
||||||
|
2025-06-01 04:26:32 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:26:33 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:26:33 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:26:34 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:26:44 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:26:54 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:27:06 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:27:09 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:28:39 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:28:40 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:28:40 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:28:58 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:28:59 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:28:59 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:29:27 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:29:28 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - Job-Scheduler gestartet
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
|
||||||
|
2025-06-01 04:29:29 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
|
||||||
|
2025-06-01 04:29:36 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:29:45 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:29:53 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:30:34 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:30:42 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:31:08 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - Job-Scheduler gestartet
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
|
||||||
|
2025-06-01 04:31:10 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
|
||||||
|
2025-06-01 04:31:12 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead?
|
||||||
|
2025-06-01 04:36:21 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
|
||||||
|
2025-06-01 04:36:22 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
|
||||||
|
2025-06-01 04:36:22 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
|
||||||
|
@ -17,3 +17,10 @@
|
|||||||
2025-06-01 04:14:22 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
2025-06-01 04:14:22 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
2025-06-01 04:16:09 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
2025-06-01 04:16:09 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
2025-06-01 04:22:49 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
2025-06-01 04:22:49 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:26:29 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:26:32 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:28:39 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:28:58 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:29:28 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:31:09 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
2025-06-01 04:36:21 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||||
|
@ -10,3 +10,6 @@
|
|||||||
2025-06-01 04:08:27 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
2025-06-01 04:08:27 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
2025-06-01 04:08:48 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
2025-06-01 04:08:48 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
2025-06-01 04:16:18 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
2025-06-01 04:16:18 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
|
2025-06-01 04:31:18 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
|
2025-06-01 04:31:38 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
|
2025-06-01 04:31:41 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||||
|
@ -61,3 +61,31 @@
|
|||||||
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:29:28 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||||
|
2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||||
|
2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||||
|
@ -17,3 +17,10 @@
|
|||||||
2025-06-01 04:14:22 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
2025-06-01 04:14:22 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
2025-06-01 04:16:09 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
2025-06-01 04:16:09 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
2025-06-01 04:22:49 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
2025-06-01 04:22:49 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:29 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:32 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:39 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:58 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:29:28 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:31:09 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:36:21 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||||
|
@ -15,3 +15,10 @@
|
|||||||
2025-06-01 04:14:23 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
2025-06-01 04:14:23 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
2025-06-01 04:16:10 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
2025-06-01 04:16:10 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
2025-06-01 04:22:50 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
2025-06-01 04:22:50 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:26:30 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:26:33 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:28:40 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:28:59 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:29:28 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:31:10 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
2025-06-01 04:36:22 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||||
|
@ -47,3 +47,8 @@
|
|||||||
2025-06-01 04:16:16 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
2025-06-01 04:16:16 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
2025-06-01 04:16:58 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
2025-06-01 04:16:58 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
2025-06-01 04:17:52 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
2025-06-01 04:17:52 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
2025-06-01 04:22:55 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
2025-06-01 04:31:23 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
2025-06-01 04:31:36 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
2025-06-01 04:31:53 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
2025-06-01 04:32:03 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
||||||
|
@ -30,3 +30,17 @@
|
|||||||
2025-06-01 04:16:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
2025-06-01 04:16:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:30 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:30 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:33 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:26:33 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:28:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:29:28 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:29:29 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:31:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:31:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:36:22 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
2025-06-01 04:36:22 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||||
|
@ -30,3 +30,17 @@
|
|||||||
2025-06-01 04:16:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
2025-06-01 04:16:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:26:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:26:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:26:33 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:26:33 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:28:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:28:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:28:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:28:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:29:28 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:29:29 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:31:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:31:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:36:22 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
2025-06-01 04:36:22 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||||
|
@ -13,3 +13,10 @@
|
|||||||
2025-06-01 04:14:23 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
2025-06-01 04:14:23 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
2025-06-01 04:16:10 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
2025-06-01 04:16:10 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
2025-06-01 04:22:50 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
2025-06-01 04:22:50 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:26:30 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:26:33 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:28:40 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:28:59 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:29:29 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:31:10 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
2025-06-01 04:36:22 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||||
|
@ -638,3 +638,78 @@
|
|||||||
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:26:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:26:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
|
||||||
|
2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
|
||||||
|
2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
|
||||||
|
2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:26:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
|
||||||
|
2025-06-01 04:26:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
|
||||||
|
2025-06-01 04:26:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
|
||||||
|
2025-06-01 04:26:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
|
||||||
|
2025-06-01 04:27:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
|
||||||
|
2025-06-01 04:27:07 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s
|
||||||
|
2025-06-01 04:28:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:28:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:28:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:28:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:29:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:29:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:29:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
|
||||||
|
2025-06-01 04:29:29 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
|
||||||
|
2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
|
||||||
|
2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
|
||||||
|
2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:29:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
|
||||||
|
2025-06-01 04:29:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
|
||||||
|
2025-06-01 04:29:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
|
||||||
|
2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:29:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
|
||||||
|
2025-06-01 04:30:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
|
||||||
|
2025-06-01 04:30:06 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s
|
||||||
|
2025-06-01 04:31:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:31:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
2025-06-01 04:31:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
|
||||||
|
2025-06-01 04:31:10 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
|
||||||
|
2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
|
||||||
|
2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
|
||||||
|
2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
|
||||||
|
2025-06-01 04:31:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
|
||||||
|
2025-06-01 04:31:23 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
|
||||||
|
2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
|
||||||
|
2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:31:35 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
|
||||||
|
2025-06-01 04:31:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
|
||||||
|
2025-06-01 04:31:47 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s
|
||||||
|
2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||||
|
2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||||
|
2025-06-01 04:36:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||||
|
2025-06-01 04:36:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||||
|
@ -3312,3 +3312,28 @@
|
|||||||
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.68ms
|
2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.68ms
|
||||||
|
2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.53ms
|
||||||
|
2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.65ms
|
||||||
|
2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 5.38ms
|
||||||
|
2025-06-01 04:31:23 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
|
||||||
|
2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
|
||||||
|
2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.61ms
|
||||||
|
2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
|
||||||
|
2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 5.46ms
|
||||||
|
2025-06-01 04:31:36 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
|
||||||
|
2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.91ms
|
||||||
|
2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||||
|
2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||||
|
2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.71ms
|
||||||
|
@ -2869,3 +2869,16 @@
|
|||||||
2025-06-01 04:22:49 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
2025-06-01 04:22:49 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||||
2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||||
|
2025-06-01 04:26:29 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:26:31 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||||
|
2025-06-01 04:26:31 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||||
|
2025-06-01 04:26:32 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:28:39 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:28:58 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:29:28 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:29:29 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||||
|
2025-06-01 04:29:29 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||||
|
2025-06-01 04:31:09 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
2025-06-01 04:31:10 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||||
|
2025-06-01 04:31:10 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||||
|
2025-06-01 04:36:21 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||||
|
@ -13,3 +13,10 @@
|
|||||||
2025-06-01 04:14:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
2025-06-01 04:14:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
2025-06-01 04:16:10 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
2025-06-01 04:16:10 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
2025-06-01 04:22:50 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
2025-06-01 04:22:50 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:26:30 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:26:33 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:28:40 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:28:59 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:29:29 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:31:10 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
2025-06-01 04:36:22 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||||
|
@ -46,3 +46,26 @@
|
|||||||
2025-06-01 04:14:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
2025-06-01 04:14:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
2025-06-01 04:16:10 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
2025-06-01 04:16:10 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
2025-06-01 04:22:50 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
2025-06-01 04:22:50 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:26:30 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
|
||||||
|
2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
|
||||||
|
2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
|
||||||
|
2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
|
||||||
|
2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
|
||||||
|
2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
|
||||||
|
2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
|
||||||
|
2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
|
||||||
|
2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
|
||||||
|
2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
|
||||||
|
2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
|
||||||
|
2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
|
||||||
|
2025-06-01 04:29:29 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:31:10 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||||
|
2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
|
||||||
|
2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
|
||||||
|
2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
|
||||||
|
2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
|
||||||
|
@ -129,3 +129,66 @@
|
|||||||
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - ==================================================
|
2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:26:30.681481
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:26:33.469002
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:28:40.487299
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:28:59.128550
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:29:28.997767
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:31:10.171279
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:36:22.434555
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||||
|
2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ==================================================
|
||||||
|
@ -1 +1,3 @@
|
|||||||
2025-06-01 04:07:12 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen
|
2025-06-01 04:07:12 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen
|
||||||
|
2025-06-01 04:32:24 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen
|
||||||
|
2025-06-01 04:33:16 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen
|
||||||
|
@ -66,3 +66,31 @@
|
|||||||
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||||
|
2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||||
|
2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||||
|
2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||||
|
@ -309,13 +309,13 @@ class GlassmorphismNotificationSystem {
|
|||||||
const toasts = Array.from(container.children);
|
const toasts = Array.from(container.children);
|
||||||
toasts.forEach((toast, index) => {
|
toasts.forEach((toast, index) => {
|
||||||
// Gestaffelte Positionierung mit smooth transition
|
// Gestaffelte Positionierung mit smooth transition
|
||||||
toast.style.top = `${1 + index * 4.5}rem`;
|
toast.style.top = `${1 + index * 3.75}rem`;
|
||||||
toast.style.zIndex = 1000 - index;
|
toast.style.zIndex = 1000 - index;
|
||||||
|
|
||||||
// Leichter Versatz für Tiefeneffekt
|
// Leichter Versatz für Tiefeneffekt
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
toast.style.transform = `scale(${1 - index * 0.02})`;
|
toast.style.transform = `scale(${1 - index * 0.015})`;
|
||||||
toast.style.opacity = `${1 - index * 0.1}`;
|
toast.style.opacity = `${1 - index * 0.08}`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -579,31 +579,31 @@ class GlassmorphismNotificationSystem {
|
|||||||
styles.id = 'glassmorphism-notification-styles';
|
styles.id = 'glassmorphism-notification-styles';
|
||||||
styles.textContent = `
|
styles.textContent = `
|
||||||
.glassmorphism-toast {
|
.glassmorphism-toast {
|
||||||
margin-bottom: 0.75rem;
|
margin-bottom: 0.625rem;
|
||||||
transform: translateX(100%);
|
transform: translateX(100%);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: all 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
|
transition: all 0.7s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
will-change: transform, opacity, filter;
|
will-change: transform, opacity, filter;
|
||||||
/* Erweiterte Premium Glassmorphism-Eigenschaften */
|
/* Erweiterte Premium Glassmorphism-Eigenschaften */
|
||||||
backdrop-filter: blur(60px) saturate(220%) brightness(125%) contrast(115%);
|
backdrop-filter: blur(50px) saturate(200%) brightness(120%) contrast(110%);
|
||||||
-webkit-backdrop-filter: blur(60px) saturate(220%) brightness(125%) contrast(115%);
|
-webkit-backdrop-filter: blur(50px) saturate(200%) brightness(120%) contrast(110%);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 40px 80px rgba(0, 0, 0, 0.12),
|
0 32px 64px rgba(0, 0, 0, 0.1),
|
||||||
0 20px 40px rgba(0, 0, 0, 0.08),
|
0 16px 32px rgba(0, 0, 0, 0.06),
|
||||||
0 8px 16px rgba(0, 0, 0, 0.06),
|
0 6px 12px rgba(0, 0, 0, 0.05),
|
||||||
inset 0 3px 0 rgba(255, 255, 255, 0.5),
|
inset 0 2px 0 rgba(255, 255, 255, 0.4),
|
||||||
inset 0 1px 2px rgba(255, 255, 255, 0.8),
|
inset 0 1px 2px rgba(255, 255, 255, 0.7),
|
||||||
0 0 0 1px rgba(255, 255, 255, 0.2);
|
0 0 0 1px rgba(255, 255, 255, 0.18);
|
||||||
border-radius: 1.75rem;
|
border-radius: 1.5rem;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: relative;
|
position: relative;
|
||||||
/* Subtile Farbverläufe */
|
/* Subtile Farbverläufe */
|
||||||
background: linear-gradient(145deg,
|
background: linear-gradient(145deg,
|
||||||
rgba(255, 255, 255, 0.15) 0%,
|
rgba(255, 255, 255, 0.12) 0%,
|
||||||
rgba(255, 255, 255, 0.08) 25%,
|
rgba(255, 255, 255, 0.06) 25%,
|
||||||
rgba(255, 255, 255, 0.12) 50%,
|
rgba(255, 255, 255, 0.1) 50%,
|
||||||
rgba(255, 255, 255, 0.06) 75%,
|
rgba(255, 255, 255, 0.05) 75%,
|
||||||
rgba(255, 255, 255, 0.1) 100%);
|
rgba(255, 255, 255, 0.08) 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Erweiterte Glassmorphism-Overlay-Effekte */
|
/* Erweiterte Glassmorphism-Overlay-Effekte */
|
||||||
@ -873,37 +873,37 @@ class GlassmorphismNotificationSystem {
|
|||||||
.toast-content {
|
.toast-content {
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 1.5rem;
|
padding: 1rem;
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-header {
|
.toast-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
gap: 1.25rem;
|
gap: 0.875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-icon {
|
.toast-icon {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
width: 3rem;
|
width: 2.25rem;
|
||||||
height: 3rem;
|
height: 2.25rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: linear-gradient(145deg,
|
background: linear-gradient(145deg,
|
||||||
rgba(255, 255, 255, 0.4) 0%,
|
rgba(255, 255, 255, 0.35) 0%,
|
||||||
rgba(255, 255, 255, 0.25) 50%,
|
rgba(255, 255, 255, 0.2) 50%,
|
||||||
rgba(255, 255, 255, 0.35) 100%);
|
rgba(255, 255, 255, 0.3) 100%);
|
||||||
backdrop-filter: blur(20px) saturate(150%);
|
backdrop-filter: blur(16px) saturate(140%);
|
||||||
-webkit-backdrop-filter: blur(20px) saturate(150%);
|
-webkit-backdrop-filter: blur(16px) saturate(140%);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.5);
|
border: 1px solid rgba(255, 255, 255, 0.4);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 12px 24px rgba(0, 0, 0, 0.08),
|
0 8px 16px rgba(0, 0, 0, 0.06),
|
||||||
0 4px 8px rgba(0, 0, 0, 0.05),
|
0 2px 4px rgba(0, 0, 0, 0.04),
|
||||||
inset 0 2px 0 rgba(255, 255, 255, 0.7),
|
inset 0 1px 0 rgba(255, 255, 255, 0.6),
|
||||||
inset 0 -1px 0 rgba(0, 0, 0, 0.05);
|
inset 0 -1px 0 rgba(0, 0, 0, 0.03);
|
||||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@ -916,7 +916,7 @@ class GlassmorphismNotificationSystem {
|
|||||||
left: -50%;
|
left: -50%;
|
||||||
width: 200%;
|
width: 200%;
|
||||||
height: 200%;
|
height: 200%;
|
||||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%);
|
background: radial-gradient(circle, rgba(255, 255, 255, 0.25) 0%, transparent 70%);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.3s ease;
|
transition: opacity 0.3s ease;
|
||||||
animation: icon-pulse 3s ease-in-out infinite;
|
animation: icon-pulse 3s ease-in-out infinite;
|
||||||
@ -924,7 +924,7 @@ class GlassmorphismNotificationSystem {
|
|||||||
|
|
||||||
@keyframes icon-pulse {
|
@keyframes icon-pulse {
|
||||||
0%, 100% { opacity: 0; transform: scale(0.8); }
|
0%, 100% { opacity: 0; transform: scale(0.8); }
|
||||||
50% { opacity: 0.5; transform: scale(1.2); }
|
50% { opacity: 0.4; transform: scale(1.1); }
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-icon:hover::before {
|
.toast-icon:hover::before {
|
||||||
@ -933,29 +933,29 @@ class GlassmorphismNotificationSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.toast-icon:hover {
|
.toast-icon:hover {
|
||||||
transform: scale(1.15) rotate(10deg);
|
transform: scale(1.08) rotate(8deg);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 20px 40px rgba(0, 0, 0, 0.12),
|
0 12px 24px rgba(0, 0, 0, 0.08),
|
||||||
0 8px 16px rgba(0, 0, 0, 0.08),
|
0 4px 8px rgba(0, 0, 0, 0.06),
|
||||||
inset 0 2px 0 rgba(255, 255, 255, 0.8),
|
inset 0 1px 0 rgba(255, 255, 255, 0.7),
|
||||||
inset 0 -1px 0 rgba(0, 0, 0, 0.08);
|
inset 0 -1px 0 rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-icon {
|
.dark .toast-icon {
|
||||||
background: linear-gradient(145deg,
|
background: linear-gradient(145deg,
|
||||||
rgba(0, 0, 0, 0.4) 0%,
|
rgba(0, 0, 0, 0.35) 0%,
|
||||||
rgba(15, 15, 15, 0.3) 50%,
|
rgba(15, 15, 15, 0.25) 50%,
|
||||||
rgba(0, 0, 0, 0.35) 100%);
|
rgba(0, 0, 0, 0.3) 100%);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.15);
|
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 12px 24px rgba(0, 0, 0, 0.3),
|
0 8px 16px rgba(0, 0, 0, 0.25),
|
||||||
0 4px 8px rgba(0, 0, 0, 0.2),
|
0 2px 4px rgba(0, 0, 0, 0.15),
|
||||||
inset 0 2px 0 rgba(255, 255, 255, 0.15),
|
inset 0 1px 0 rgba(255, 255, 255, 0.12),
|
||||||
inset 0 -1px 0 rgba(255, 255, 255, 0.05);
|
inset 0 -1px 0 rgba(255, 255, 255, 0.03);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-icon::before {
|
.dark .toast-icon::before {
|
||||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 70%);
|
background: radial-gradient(circle, rgba(255, 255, 255, 0.12) 0%, transparent 70%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-body {
|
.toast-body {
|
||||||
@ -964,56 +964,90 @@ class GlassmorphismNotificationSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.toast-title {
|
.toast-title {
|
||||||
font-weight: 700;
|
font-weight: 600;
|
||||||
font-size: 1rem;
|
font-size: 0.875rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.375rem;
|
||||||
line-height: 1.4;
|
line-height: 1.3;
|
||||||
letter-spacing: 0.015em;
|
letter-spacing: 0.01em;
|
||||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
|
||||||
background: linear-gradient(135deg, currentColor 0%, currentColor 100%);
|
background: linear-gradient(135deg, currentColor 0%, currentColor 100%);
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-message {
|
.toast-message {
|
||||||
font-size: 0.9rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.6;
|
line-height: 1.4;
|
||||||
opacity: 0.92;
|
opacity: 0.9;
|
||||||
font-weight: 500;
|
font-weight: 450;
|
||||||
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-actions {
|
.toast-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 0.625rem;
|
gap: 0.5rem;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-btn {
|
.toast-action-btn {
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 0.875rem;
|
||||||
border-radius: 0.75rem;
|
border-radius: 0.75rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.75rem;
|
||||||
font-weight: 600;
|
font-weight: 500;
|
||||||
border: none;
|
border: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.375rem;
|
gap: 0.375rem;
|
||||||
background: rgba(255, 255, 255, 0.2);
|
background: linear-gradient(145deg,
|
||||||
|
rgba(255, 255, 255, 0.25) 0%,
|
||||||
|
rgba(255, 255, 255, 0.12) 50%,
|
||||||
|
rgba(255, 255, 255, 0.2) 100%);
|
||||||
color: inherit;
|
color: inherit;
|
||||||
backdrop-filter: blur(15px);
|
backdrop-filter: blur(16px) saturate(130%);
|
||||||
-webkit-backdrop-filter: blur(15px);
|
-webkit-backdrop-filter: blur(16px) saturate(130%);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
box-shadow:
|
||||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
0 4px 8px rgba(0, 0, 0, 0.06),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.04),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||||
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Button-Shimmer-Effekt */
|
||||||
|
.toast-action-btn::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255, 255, 255, 0.3) 50%,
|
||||||
|
transparent 100%);
|
||||||
|
transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toast-action-btn:hover::before {
|
||||||
|
left: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-btn:hover {
|
.toast-action-btn:hover {
|
||||||
background: rgba(255, 255, 255, 0.35);
|
background: linear-gradient(145deg,
|
||||||
transform: translateY(-2px) scale(1.05);
|
rgba(255, 255, 255, 0.35) 0%,
|
||||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
|
rgba(255, 255, 255, 0.2) 50%,
|
||||||
|
rgba(255, 255, 255, 0.3) 100%);
|
||||||
|
transform: translateY(-2px) scale(1.04);
|
||||||
|
box-shadow:
|
||||||
|
0 8px 16px rgba(0, 0, 0, 0.08),
|
||||||
|
0 2px 4px rgba(0, 0, 0, 0.06),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.6);
|
||||||
|
border-color: rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-btn:active {
|
.toast-action-btn:active {
|
||||||
@ -1022,71 +1056,148 @@ class GlassmorphismNotificationSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-primary {
|
.toast-action-primary {
|
||||||
background: linear-gradient(135deg,
|
background: linear-gradient(145deg,
|
||||||
rgba(59, 130, 246, 0.9) 0%,
|
rgba(59, 130, 246, 0.8) 0%,
|
||||||
rgba(37, 99, 235, 0.9) 100%);
|
rgba(37, 99, 235, 0.85) 50%,
|
||||||
|
rgba(59, 130, 246, 0.75) 100%);
|
||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(59, 130, 246, 0.6);
|
border-color: rgba(59, 130, 246, 0.6);
|
||||||
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
|
box-shadow:
|
||||||
|
0 4px 12px rgba(59, 130, 246, 0.2),
|
||||||
|
0 1px 3px rgba(59, 130, 246, 0.12),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.25);
|
||||||
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toast-action-primary::before {
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255, 255, 255, 0.25) 50%,
|
||||||
|
transparent 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-primary:hover {
|
.toast-action-primary:hover {
|
||||||
background: linear-gradient(135deg,
|
background: linear-gradient(145deg,
|
||||||
rgba(59, 130, 246, 1) 0%,
|
rgba(59, 130, 246, 0.9) 0%,
|
||||||
rgba(37, 99, 235, 1) 100%);
|
rgba(37, 99, 235, 0.95) 50%,
|
||||||
box-shadow: 0 8px 20px rgba(59, 130, 246, 0.4);
|
rgba(59, 130, 246, 0.85) 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 8px 20px rgba(59, 130, 246, 0.25),
|
||||||
|
0 2px 6px rgba(59, 130, 246, 0.18),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-action-btn {
|
.dark .toast-action-btn {
|
||||||
background: rgba(0, 0, 0, 0.3);
|
background: linear-gradient(145deg,
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
rgba(0, 0, 0, 0.35) 0%,
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
rgba(15, 15, 15, 0.25) 50%,
|
||||||
|
rgba(0, 0, 0, 0.3) 100%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 8px rgba(0, 0, 0, 0.15),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.12),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-action-btn:hover {
|
.dark .toast-action-btn:hover {
|
||||||
background: rgba(0, 0, 0, 0.4);
|
background: linear-gradient(145deg,
|
||||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
|
rgba(0, 0, 0, 0.45) 0%,
|
||||||
|
rgba(15, 15, 15, 0.35) 50%,
|
||||||
|
rgba(0, 0, 0, 0.4) 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 8px 16px rgba(0, 0, 0, 0.2),
|
||||||
|
0 2px 4px rgba(0, 0, 0, 0.15),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.12);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-close {
|
.toast-close {
|
||||||
padding: 0.375rem;
|
padding: 0.375rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.625rem;
|
||||||
border: none;
|
border: none;
|
||||||
background: rgba(255, 255, 255, 0.15);
|
background: linear-gradient(145deg,
|
||||||
|
rgba(255, 255, 255, 0.18) 0%,
|
||||||
|
rgba(255, 255, 255, 0.08) 50%,
|
||||||
|
rgba(255, 255, 255, 0.12) 100%);
|
||||||
color: inherit;
|
color: inherit;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
opacity: 0.8;
|
opacity: 0.75;
|
||||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
backdrop-filter: blur(15px);
|
backdrop-filter: blur(16px) saturate(110%);
|
||||||
-webkit-backdrop-filter: blur(15px);
|
-webkit-backdrop-filter: blur(16px) saturate(110%);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
box-shadow:
|
||||||
|
0 2px 4px rgba(0, 0, 0, 0.06),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.04),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.3);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close-Button-Ripple-Effekt */
|
||||||
|
.toast-close::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
transition: width 0.25s ease, height 0.25s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toast-close:hover::after {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-close:hover {
|
.toast-close:hover {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
background: rgba(255, 255, 255, 0.25);
|
background: linear-gradient(145deg,
|
||||||
transform: scale(1.15) rotate(90deg);
|
rgba(255, 255, 255, 0.28) 0%,
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
rgba(255, 255, 255, 0.15) 50%,
|
||||||
|
rgba(255, 255, 255, 0.22) 100%);
|
||||||
|
transform: scale(1.1) rotate(90deg);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 8px rgba(0, 0, 0, 0.08),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.06),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-close:active {
|
.toast-close:active {
|
||||||
transform: scale(1.1) rotate(90deg);
|
transform: scale(1.05) rotate(90deg);
|
||||||
transition: transform 0.1s ease;
|
transition: transform 0.1s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-close {
|
.dark .toast-close {
|
||||||
background: rgba(0, 0, 0, 0.2);
|
background: linear-gradient(145deg,
|
||||||
border: 1px solid rgba(255, 255, 255, 0.15);
|
rgba(0, 0, 0, 0.25) 0%,
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
rgba(15, 15, 15, 0.15) 50%,
|
||||||
|
rgba(0, 0, 0, 0.2) 100%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
|
box-shadow:
|
||||||
|
0 2px 4px rgba(0, 0, 0, 0.15),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.12),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .toast-close::after {
|
||||||
|
background: rgba(255, 255, 255, 0.15);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark .toast-close:hover {
|
.dark .toast-close:hover {
|
||||||
background: rgba(0, 0, 0, 0.3);
|
background: linear-gradient(145deg,
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
|
rgba(0, 0, 0, 0.35) 0%,
|
||||||
|
rgba(15, 15, 15, 0.25) 50%,
|
||||||
|
rgba(0, 0, 0, 0.4) 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 8px rgba(0, 0, 0, 0.25),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.18),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-progress {
|
.toast-progress {
|
||||||
@ -1094,25 +1205,51 @@ class GlassmorphismNotificationSystem {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 4px;
|
height: 3px;
|
||||||
background: rgba(255, 255, 255, 0.15);
|
background: linear-gradient(90deg,
|
||||||
|
rgba(255, 255, 255, 0.08) 0%,
|
||||||
|
rgba(255, 255, 255, 0.04) 50%,
|
||||||
|
rgba(255, 255, 255, 0.08) 100%);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-radius: 0 0 1.5rem 1.5rem;
|
border-radius: 0 0 1.75rem 1.75rem;
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
-webkit-backdrop-filter: blur(8px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-progress-bar {
|
.toast-progress-bar {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(90deg,
|
background: linear-gradient(90deg,
|
||||||
rgba(255, 255, 255, 0.7) 0%,
|
rgba(255, 255, 255, 0.6) 0%,
|
||||||
|
rgba(255, 255, 255, 0.8) 25%,
|
||||||
rgba(255, 255, 255, 0.9) 50%,
|
rgba(255, 255, 255, 0.9) 50%,
|
||||||
rgba(255, 255, 255, 0.7) 100%);
|
rgba(255, 255, 255, 0.8) 75%,
|
||||||
|
rgba(255, 255, 255, 0.6) 100%);
|
||||||
width: 0%;
|
width: 0%;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.25s ease;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 0 8px rgba(255, 255, 255, 0.5),
|
0 0 8px rgba(255, 255, 255, 0.4),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
0 0 4px rgba(255, 255, 255, 0.3),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.7);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Progress-Bar-Animationen */
|
||||||
|
.toast-progress-bar::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255, 255, 255, 0.4) 25%,
|
||||||
|
rgba(255, 255, 255, 0.6) 50%,
|
||||||
|
rgba(255, 255, 255, 0.4) 75%,
|
||||||
|
transparent 100%);
|
||||||
|
animation: progress-shimmer 2s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-progress-bar::after {
|
.toast-progress-bar::after {
|
||||||
@ -1122,11 +1259,15 @@ class GlassmorphismNotificationSystem {
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: linear-gradient(90deg,
|
background: linear-gradient(45deg,
|
||||||
transparent 0%,
|
transparent 25%,
|
||||||
rgba(255, 255, 255, 0.4) 50%,
|
rgba(255, 255, 255, 0.2) 25%,
|
||||||
transparent 100%);
|
rgba(255, 255, 255, 0.2) 50%,
|
||||||
animation: progress-shimmer 2s ease-in-out infinite;
|
transparent 50%,
|
||||||
|
transparent 75%,
|
||||||
|
rgba(255, 255, 255, 0.2) 75%);
|
||||||
|
background-size: 12px 12px;
|
||||||
|
animation: progress-stripes 0.8s linear infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes progress-shimmer {
|
@keyframes progress-shimmer {
|
||||||
@ -1134,21 +1275,55 @@ class GlassmorphismNotificationSystem {
|
|||||||
100% { transform: translateX(100%); }
|
100% { transform: translateX(100%); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes progress-stripes {
|
||||||
|
0% { background-position: 0 0; }
|
||||||
|
100% { background-position: 12px 0; }
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes toast-progress {
|
@keyframes toast-progress {
|
||||||
from { width: 100%; }
|
from { width: 100%; }
|
||||||
to { width: 0%; }
|
to { width: 0%; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-settings {
|
.notification-settings {
|
||||||
max-width: 350px;
|
max-width: 320px;
|
||||||
padding: 0.5rem 0;
|
padding: 0.875rem;
|
||||||
|
background: linear-gradient(145deg,
|
||||||
|
rgba(255, 255, 255, 0.12) 0%,
|
||||||
|
rgba(255, 255, 255, 0.06) 50%,
|
||||||
|
rgba(255, 255, 255, 0.1) 100%);
|
||||||
|
border-radius: 1.25rem;
|
||||||
|
backdrop-filter: blur(24px) saturate(140%);
|
||||||
|
-webkit-backdrop-filter: blur(24px) saturate(140%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
|
box-shadow:
|
||||||
|
0 16px 32px rgba(0, 0, 0, 0.08),
|
||||||
|
0 6px 12px rgba(0, 0, 0, 0.04),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .notification-settings {
|
||||||
|
background: linear-gradient(145deg,
|
||||||
|
rgba(0, 0, 0, 0.35) 0%,
|
||||||
|
rgba(15, 15, 15, 0.25) 50%,
|
||||||
|
rgba(0, 0, 0, 0.3) 100%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
|
box-shadow:
|
||||||
|
0 16px 32px rgba(0, 0, 0, 0.25),
|
||||||
|
0 6px 12px rgba(0, 0, 0, 0.15),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.06);
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-settings h3 {
|
.notification-settings h3 {
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
font-size: 1.1rem;
|
font-size: 1rem;
|
||||||
font-weight: 700;
|
font-weight: 600;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
text-align: center;
|
||||||
|
background: linear-gradient(135deg, currentColor 0%, currentColor 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting-item {
|
.setting-item {
|
||||||
@ -1157,40 +1332,98 @@ class GlassmorphismNotificationSystem {
|
|||||||
gap: 0.75rem;
|
gap: 0.75rem;
|
||||||
margin: 1rem 0;
|
margin: 1rem 0;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 0.9rem;
|
font-size: 0.875rem;
|
||||||
font-weight: 500;
|
font-weight: 450;
|
||||||
padding: 0.5rem;
|
padding: 0.75rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.875rem;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
background: linear-gradient(145deg,
|
||||||
|
rgba(255, 255, 255, 0.08) 0%,
|
||||||
|
rgba(255, 255, 255, 0.04) 100%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
-webkit-backdrop-filter: blur(12px);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setting-Item-Hover-Effekt */
|
||||||
|
.setting-item::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255, 255, 255, 0.08) 50%,
|
||||||
|
transparent 100%);
|
||||||
|
transition: left 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-item:hover::before {
|
||||||
|
left: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting-item:hover {
|
.setting-item:hover {
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: linear-gradient(145deg,
|
||||||
transform: translateX(4px);
|
rgba(255, 255, 255, 0.16) 0%,
|
||||||
|
rgba(255, 255, 255, 0.08) 100%);
|
||||||
|
transform: translateX(6px) scale(1.01);
|
||||||
|
box-shadow:
|
||||||
|
0 6px 12px rgba(0, 0, 0, 0.06),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.04),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .setting-item {
|
||||||
|
background: linear-gradient(145deg,
|
||||||
|
rgba(0, 0, 0, 0.18) 0%,
|
||||||
|
rgba(15, 15, 15, 0.12) 100%);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .setting-item:hover {
|
||||||
|
background: linear-gradient(145deg,
|
||||||
|
rgba(0, 0, 0, 0.25) 0%,
|
||||||
|
rgba(15, 15, 15, 0.18) 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 6px 12px rgba(0, 0, 0, 0.15),
|
||||||
|
0 1px 2px rgba(0, 0, 0, 0.12),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting-item input[type="checkbox"] {
|
.setting-item input[type="checkbox"] {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
width: 1.2rem;
|
width: 1.25rem;
|
||||||
height: 1.2rem;
|
height: 1.25rem;
|
||||||
accent-color: currentColor;
|
accent-color: currentColor;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 0.3rem;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-item input[type="checkbox"]:checked {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(59, 130, 246, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive Design */
|
/* Responsive Design */
|
||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
.notifications-container {
|
.notifications-container {
|
||||||
left: 0.75rem;
|
left: 0.5rem;
|
||||||
right: 0.75rem;
|
right: 0.5rem;
|
||||||
top: 0.75rem;
|
top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.glassmorphism-toast {
|
.glassmorphism-toast {
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
border-radius: 1rem;
|
border-radius: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-content {
|
.toast-content {
|
||||||
padding: 1rem;
|
padding: 0.875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-header {
|
.toast-header {
|
||||||
@ -1203,17 +1436,21 @@ class GlassmorphismNotificationSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.toast-title {
|
.toast-title {
|
||||||
font-size: 0.85rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toast-message {
|
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-action-btn {
|
.toast-message {
|
||||||
padding: 0.4rem 0.8rem;
|
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toast-action-btn {
|
||||||
|
padding: 0.4rem 0.7rem;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toast-close {
|
||||||
|
padding: 0.3rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* High Contrast Mode */
|
/* High Contrast Mode */
|
||||||
|
@ -575,4 +575,225 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Wartungs-Modal -->
|
||||||
|
<div id="maintenance-modal" class="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 hidden">
|
||||||
|
<div class="flex items-center justify-center h-full p-4">
|
||||||
|
<div class="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-2xl max-w-md w-full">
|
||||||
|
<div class="text-center mb-6">
|
||||||
|
<div class="mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 dark:bg-blue-900 mb-4">
|
||||||
|
<svg class="h-6 w-6 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-medium text-slate-900 dark:text-white mb-2">System-Wartung</h3>
|
||||||
|
<p class="text-sm text-slate-500 dark:text-slate-400">Wählen Sie eine Wartungsoption:</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-3 mb-6">
|
||||||
|
<button id="modal-clear-cache" class="w-full px-4 py-3 bg-blue-500 text-white rounded-xl hover:bg-blue-600 transition-all duration-300 text-sm font-medium">
|
||||||
|
🗑️ Cache leeren
|
||||||
|
</button>
|
||||||
|
<button id="modal-optimize-db" class="w-full px-4 py-3 bg-green-500 text-white rounded-xl hover:bg-green-600 transition-all duration-300 text-sm font-medium">
|
||||||
|
🔧 Datenbank optimieren
|
||||||
|
</button>
|
||||||
|
<button id="modal-create-backup" class="w-full px-4 py-3 bg-purple-500 text-white rounded-xl hover:bg-purple-600 transition-all duration-300 text-sm font-medium">
|
||||||
|
💾 Backup erstellen
|
||||||
|
</button>
|
||||||
|
<button id="modal-advanced-settings" class="w-full px-4 py-3 bg-slate-500 text-white rounded-xl hover:bg-slate-600 transition-all duration-300 text-sm font-medium">
|
||||||
|
⚙️ Erweiterte Einstellungen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-end">
|
||||||
|
<button id="close-maintenance-modal" class="px-4 py-2 bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-xl hover:bg-slate-300 dark:hover:bg-slate-600 transition-colors text-sm font-medium">
|
||||||
|
Schließen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// ===== WARTUNGS-FUNKTIONALITÄT =====
|
||||||
|
|
||||||
|
// Wartung Modal Event Listeners
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const maintenanceBtn = document.getElementById('maintenance-btn');
|
||||||
|
const maintenanceModal = document.getElementById('maintenance-modal');
|
||||||
|
const closeModalBtn = document.getElementById('close-maintenance-modal');
|
||||||
|
|
||||||
|
// Modal öffnen
|
||||||
|
if (maintenanceBtn) {
|
||||||
|
maintenanceBtn.addEventListener('click', function() {
|
||||||
|
maintenanceModal.classList.remove('hidden');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal schließen
|
||||||
|
if (closeModalBtn) {
|
||||||
|
closeModalBtn.addEventListener('click', function() {
|
||||||
|
maintenanceModal.classList.add('hidden');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal schließen beim Klick außerhalb
|
||||||
|
maintenanceModal.addEventListener('click', function(e) {
|
||||||
|
if (e.target === maintenanceModal) {
|
||||||
|
maintenanceModal.classList.add('hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wartungs-Funktionen
|
||||||
|
document.getElementById('modal-clear-cache').addEventListener('click', clearCache);
|
||||||
|
document.getElementById('modal-optimize-db').addEventListener('click', optimizeDatabase);
|
||||||
|
document.getElementById('modal-create-backup').addEventListener('click', createBackup);
|
||||||
|
document.getElementById('modal-advanced-settings').addEventListener('click', function() {
|
||||||
|
window.location.href = '{{ url_for("admin_settings") }}';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Notification anzeigen
|
||||||
|
function showNotification(message, type = 'info') {
|
||||||
|
// Erstelle temporäre Notification
|
||||||
|
const notification = document.createElement('div');
|
||||||
|
notification.className = `fixed top-4 right-4 z-50 p-4 rounded-xl shadow-lg max-w-sm transition-all duration-300 ${
|
||||||
|
type === 'success' ? 'bg-green-500 text-white' :
|
||||||
|
type === 'error' ? 'bg-red-500 text-white' :
|
||||||
|
'bg-blue-500 text-white'
|
||||||
|
}`;
|
||||||
|
|
||||||
|
notification.innerHTML = `
|
||||||
|
<div class="flex items-center space-x-3">
|
||||||
|
<div class="flex-shrink-0">
|
||||||
|
${type === 'success' ? '✅' : type === 'error' ? '❌' : 'ℹ️'}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm font-medium">${message}</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.body.appendChild(notification);
|
||||||
|
|
||||||
|
// Animation einblenden
|
||||||
|
setTimeout(() => {
|
||||||
|
notification.style.transform = 'translateX(0)';
|
||||||
|
notification.style.opacity = '1';
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
// Automatisch entfernen nach 5 Sekunden
|
||||||
|
setTimeout(() => {
|
||||||
|
notification.style.transform = 'translateX(100%)';
|
||||||
|
notification.style.opacity = '0';
|
||||||
|
setTimeout(() => {
|
||||||
|
if (notification.parentNode) {
|
||||||
|
notification.parentNode.removeChild(notification);
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSRF Token
|
||||||
|
function getCsrfToken() {
|
||||||
|
const token = document.querySelector('meta[name="csrf-token"]');
|
||||||
|
return token ? token.getAttribute('content') : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache leeren
|
||||||
|
async function clearCache() {
|
||||||
|
if (!confirm('Möchten Sie den Cache wirklich leeren?')) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification('Cache wird geleert...', 'info');
|
||||||
|
|
||||||
|
const response = await fetch('/api/admin/cache/clear', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': getCsrfToken()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (response.ok && result.success) {
|
||||||
|
showNotification('Cache erfolgreich geleert', 'success');
|
||||||
|
// Modal schließen
|
||||||
|
document.getElementById('maintenance-modal').classList.add('hidden');
|
||||||
|
} else {
|
||||||
|
showNotification(result.message || 'Fehler beim Leeren des Cache', 'error');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
showNotification('Netzwerkfehler: ' + error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Datenbank optimieren
|
||||||
|
async function optimizeDatabase() {
|
||||||
|
if (!confirm('Möchten Sie die Datenbank optimieren? Dies kann einige Minuten dauern.')) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification('Datenbank wird optimiert...', 'info');
|
||||||
|
|
||||||
|
const response = await fetch('/api/admin/database/optimize', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': getCsrfToken()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (response.ok && result.success) {
|
||||||
|
showNotification('Datenbank erfolgreich optimiert', 'success');
|
||||||
|
// Modal schließen
|
||||||
|
document.getElementById('maintenance-modal').classList.add('hidden');
|
||||||
|
} else {
|
||||||
|
showNotification(result.message || 'Fehler bei der Datenbankoptimierung', 'error');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
showNotification('Netzwerkfehler: ' + error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backup erstellen
|
||||||
|
async function createBackup() {
|
||||||
|
if (!confirm('Möchten Sie ein Backup erstellen?')) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification('Backup wird erstellt...', 'info');
|
||||||
|
|
||||||
|
const response = await fetch('/api/admin/backup/create', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': getCsrfToken()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (response.ok && result.success) {
|
||||||
|
showNotification('Backup erfolgreich erstellt', 'success');
|
||||||
|
// Modal schließen
|
||||||
|
document.getElementById('maintenance-modal').classList.add('hidden');
|
||||||
|
} else {
|
||||||
|
showNotification(result.message || 'Fehler beim Erstellen des Backups', 'error');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
showNotification('Netzwerkfehler: ' + error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape-Taste um Modal zu schließen
|
||||||
|
document.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
const modal = document.getElementById('maintenance-modal');
|
||||||
|
if (!modal.classList.contains('hidden')) {
|
||||||
|
modal.classList.add('hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -1108,10 +1108,7 @@ function setupErrorHandling() {
|
|||||||
function setupPerformanceOptimizations() {
|
function setupPerformanceOptimizations() {
|
||||||
// Preload critical resources
|
// Preload critical resources
|
||||||
const preloadLinks = [
|
const preloadLinks = [
|
||||||
'/api/statistics/public',
|
'/api/statistics/public'
|
||||||
'/static/icons/iso-27001.svg',
|
|
||||||
'/static/icons/mercedes-star.svg',
|
|
||||||
'/static/icons/gdpr.svg'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
preloadLinks.forEach(href => {
|
preloadLinks.forEach(href => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user