Es scheint, dass Sie eine Reihe von Dateien und Verzeichnissen in einem Backend-Projekt bearbeitet haben. Hier ist eine Zusammenfassung der Änderungen:

This commit is contained in:
Tomczak
2025-06-19 11:49:24 +02:00
parent c16bcca9e6
commit 9bf89f8ddb
389 changed files with 6135 additions and 2886 deletions

View File

@ -68,19 +68,19 @@ document.addEventListener('DOMContentLoaded', function() {
<!-- Navigation Links ohne JavaScript -->
<div class="flex flex-wrap justify-center gap-4 mt-8">
<a href="{{ url_for('admin_users') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<a href="{{ url_for('admin.users_overview') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"/>
</svg>
Benutzer verwalten
</a>
<a href="{{ url_for('admin_printers') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<a href="{{ url_for('admin.printers_overview') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
</svg>
Drucker verwalten
</a>
<a href="{{ url_for('admin_system') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<a href="{{ url_for('admin.system_health') }}" class="inline-flex items-center px-6 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white hover:bg-white/20 transition-all duration-300 hover:scale-105">
<svg class="w-5 h-5 mr-2" 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"/>
@ -105,7 +105,7 @@ document.addEventListener('DOMContentLoaded', function() {
</svg>
</div>
<div class="text-right">
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats.total_users or 0 }}</div>
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats['total_users'] or 0 }}</div>
<div class="text-sm text-slate-500 dark:text-slate-400">Registrierte Benutzer</div>
</div>
</div>
@ -120,8 +120,8 @@ document.addEventListener('DOMContentLoaded', function() {
</svg>
</div>
<div class="text-right">
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats.total_printers or 0 }}</div>
<div class="text-sm text-green-500">{{ stats.online_printers or 0 }} online</div>
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats['total_printers'] or 0 }}</div>
<div class="text-sm text-green-500">{{ stats['online_printers'] or 0 }} online</div>
</div>
</div>
</div>
@ -135,8 +135,8 @@ document.addEventListener('DOMContentLoaded', function() {
</svg>
</div>
<div class="text-right">
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats.active_jobs or 0 }}</div>
<div class="text-sm text-slate-500 dark:text-slate-400">{{ stats.queued_jobs or 0 }} in Warteschlange</div>
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats['active_jobs'] or 0 }}</div>
<div class="text-sm text-slate-500 dark:text-slate-400">{{ stats['total_jobs'] or 0 }} gesamt</div>
</div>
</div>
</div>
@ -150,7 +150,7 @@ document.addEventListener('DOMContentLoaded', function() {
</svg>
</div>
<div class="text-right">
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats.success_rate or 0 }}%</div>
<div class="text-2xl font-bold text-slate-900 dark:text-white">{{ stats['online_printers'] or 0 }}</div>
<div class="text-sm text-green-500">Stabil</div>
</div>
</div>
@ -160,7 +160,7 @@ document.addEventListener('DOMContentLoaded', function() {
<!-- Navigation Tabs -->
<div class="bg-white/80 dark:bg-slate-800/80 backdrop-blur-xl rounded-3xl border border-white/20 dark:border-slate-700/50 p-4 mb-12 shadow-xl">
<nav class="flex flex-wrap gap-2" aria-label="Tabs">
<a href="{{ url_for('admin_users') }}"
<a href="{{ url_for('admin.users_overview') }}"
class="flex items-center px-6 py-3 text-sm font-medium rounded-xl transition-all duration-300 {{ 'bg-gradient-to-r from-blue-500 to-blue-600 text-white shadow-lg' if active_tab == 'users' else 'text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-700/50 hover:text-slate-900 dark:hover:text-white' }}">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"/>
@ -168,7 +168,7 @@ document.addEventListener('DOMContentLoaded', function() {
Benutzer
</a>
<a href="{{ url_for('admin_printers') }}"
<a href="{{ url_for('admin.printers_overview') }}"
class="flex items-center px-6 py-3 text-sm font-medium rounded-xl transition-all duration-300 {{ 'bg-gradient-to-r from-blue-500 to-blue-600 text-white shadow-lg' if active_tab == 'printers' else 'text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-700/50 hover:text-slate-900 dark:hover:text-white' }}">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
@ -184,7 +184,7 @@ document.addEventListener('DOMContentLoaded', function() {
Aufträge
</a>
<a href="{{ url_for('admin_system') }}"
<a href="{{ url_for('admin.system_health') }}"
class="flex items-center px-6 py-3 text-sm font-medium rounded-xl transition-all duration-300 {{ 'bg-gradient-to-r from-blue-500 to-blue-600 text-white shadow-lg' if active_tab == 'system' else 'text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-700/50 hover:text-slate-900 dark:hover:text-white' }}">
<svg class="w-5 h-5 mr-2" 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"/>
@ -193,7 +193,7 @@ document.addEventListener('DOMContentLoaded', function() {
System
</a>
<a href="{{ url_for('admin_logs') }}"
<a href="{{ url_for('admin.logs_overview') }}"
class="flex items-center px-6 py-3 text-sm font-medium rounded-xl transition-all duration-300 {{ 'bg-gradient-to-r from-blue-500 to-blue-600 text-white shadow-lg' if active_tab == 'logs' else 'text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-700/50 hover:text-slate-900 dark:hover:text-white' }}">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
@ -215,13 +215,13 @@ document.addEventListener('DOMContentLoaded', function() {
<!-- Schnellzugriff -->
<div class="mt-8 grid grid-cols-2 gap-4">
<a href="{{ url_for('admin_add_user') }}" class="p-4 bg-blue-50 dark:bg-blue-900/20 rounded-xl border border-blue-200 dark:border-blue-800 hover:bg-blue-100 dark:hover:bg-blue-900/30 transition-colors">
<a href="{{ url_for('admin.add_user_page') }}" class="p-4 bg-blue-50 dark:bg-blue-900/20 rounded-xl border border-blue-200 dark:border-blue-800 hover:bg-blue-100 dark:hover:bg-blue-900/30 transition-colors">
<svg class="w-6 h-6 mx-auto text-blue-600 dark:text-blue-400 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18 9v3m0 0v3m0-3h3m-3 0h-3m-2-5a4 4 0 11-8 0 4 4 0 018 0zM3 20a6 6 0 0112 0v1H3v-1z"/>
</svg>
<span class="text-sm font-medium text-blue-900 dark:text-blue-300">Benutzer hinzufügen</span>
</a>
<a href="{{ url_for('admin_add_printer') }}" class="p-4 bg-green-50 dark:bg-green-900/20 rounded-xl border border-green-200 dark:border-green-800 hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors">
<a href="{{ url_for('admin.add_printer_page') }}" class="p-4 bg-green-50 dark:bg-green-900/20 rounded-xl border border-green-200 dark:border-green-800 hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors">
<svg class="w-6 h-6 mx-auto text-green-600 dark:text-green-400 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"/>
</svg>
@ -246,28 +246,31 @@ document.addEventListener('DOMContentLoaded', function() {
</h3>
<div class="space-y-2">
<form method="POST" action="{{ url_for('maintenance_action', action='clear_cache') }}" class="w-full">
{{ csrf_token() }}
<form method="POST" action="{{ url_for('admin.maintenance') }}" class="w-full">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input type="hidden" name="action" value="clear_cache"/>
<button type="submit" class="w-full px-3 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors text-xs font-medium">
🗑️ Cache leeren
</button>
</form>
<form method="POST" action="{{ url_for('maintenance_action', action='optimize_db') }}" class="w-full">
{{ csrf_token() }}
<form method="POST" action="{{ url_for('admin.maintenance') }}" class="w-full">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input type="hidden" name="action" value="optimize_db"/>
<button type="submit" class="w-full px-3 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors text-xs font-medium">
🔧 DB optimieren
</button>
</form>
<form method="POST" action="{{ url_for('maintenance_action', action='create_backup') }}" class="w-full">
{{ csrf_token() }}
<form method="POST" action="{{ url_for('admin.maintenance') }}" class="w-full">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input type="hidden" name="action" value="create_backup"/>
<button type="submit" class="w-full px-3 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors text-xs font-medium">
💾 Backup
</button>
</form>
<a href="{{ url_for('admin_advanced_settings') }}" class="block w-full px-3 py-2 bg-slate-500 text-white rounded-lg hover:bg-slate-600 transition-colors text-xs font-medium text-center">
<a href="{{ url_for('admin.advanced_settings') }}" class="block w-full px-3 py-2 bg-slate-500 text-white rounded-lg hover:bg-slate-600 transition-colors text-xs font-medium text-center">
⚙️ Erweiterte Einstellungen
</a>
</div>

View File

@ -165,7 +165,7 @@
<!-- Hauptformular -->
<div class="admin-form-container rounded-2xl p-8 transition-all duration-300">
<form id="userForm" action="{{ url_for('admin.create_user_api') }}" method="POST" class="space-y-8">
<form id="userForm" action="{{ url_for('admin_api.create_user_api') }}" method="POST" class="space-y-8">
<!-- CSRF Token -->
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

View File

@ -234,7 +234,7 @@ input:checked + .toggle-slider:before {
<!-- Modern Form with Glass Effect -->
<div class="glass-card rounded-3xl p-10 shadow-2xl">
<form method="POST" action="{{ url_for('admin.update_user_api', user_id=user.id) }}" class="space-y-8" id="userEditForm">
<form method="POST" action="{{ url_for('admin_api.update_user_api', user_id=user.id) }}" class="space-y-8" id="userEditForm">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input type="hidden" name="_method" value="PUT"/>

View File

@ -29,7 +29,7 @@
<!-- Form -->
<div class="bg-white dark:bg-slate-800 rounded-2xl shadow-xl p-8">
<form method="POST" action="{{ url_for('admin.update_printer_api', printer_id=printer.id) }}" class="space-y-6">
<form method="POST" action="{{ url_for('admin_api.update_printer_api', printer_id=printer.id) }}" class="space-y-6">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input type="hidden" name="_method" value="PUT"/>

File diff suppressed because it is too large Load Diff