QueryBuilder/app/templates/admin/dashboard.html
DGSoft f176560c02 Add comprehensive admin panel with user management
Features added:
- Admin authentication system with is_admin field
- Complete admin dashboard with user statistics
- User management (create, edit, delete, toggle admin)
- Protected admin routes with @admin_required decorator
- Security features (prevent self-deletion, last admin protection)
- Responsive admin UI with Bootstrap integration
- Database migration script for admin field
- Admin navigation link for authorized users

Technical improvements:
- Enhanced 3-column dashboard layout (tables | editor | saved queries)
- Removed plus button and made right sidebar more compact
- Admin user (admin/admin123) automatically created with admin privileges
- Full CRUD operations for user management
- Flash messages for user feedback
- Form validation and error handling
2025-10-14 21:33:11 +02:00

173 lines
8.8 KiB
HTML

{% extends "base.html" %}
{% block title %}Admin Dashboard{% endblock %}
{% block content %}
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2><i class="fas fa-users-cog"></i> Admin Dashboard</h2>
<a href="{{ url_for('main.dashboard') }}" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left"></i> Zurück zum Dashboard
</a>
</div>
<!-- Statistiken -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h4>{{ users|length }}</h4>
<small>Benutzer gesamt</small>
</div>
<i class="fas fa-users fa-2x opacity-75"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h4>{{ users|selectattr('is_admin')|list|length }}</h4>
<small>Administratoren</small>
</div>
<i class="fas fa-user-shield fa-2x opacity-75"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h4>{{ users|rejectattr('is_admin')|list|length }}</h4>
<small>Standard-Benutzer</small>
</div>
<i class="fas fa-user fa-2x opacity-75"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h4>{{ (users|selectattr('created_at')|map(attribute='created_at')|list|length) }}</h4>
<small>Aktive Benutzer</small>
</div>
<i class="fas fa-chart-line fa-2x opacity-75"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Schnellzugriff -->
<div class="row mb-4">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5><i class="fas fa-tachometer-alt"></i> Schnellzugriff</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 mb-3">
<a href="{{ url_for('admin.users') }}" class="btn btn-outline-primary btn-lg w-100">
<i class="fas fa-users"></i>
<div class="mt-2">
<strong>Benutzerverwaltung</strong>
<br><small class="text-muted">Benutzer anzeigen, bearbeiten und erstellen</small>
</div>
</a>
</div>
<div class="col-md-6 mb-3">
<a href="{{ url_for('admin.create_user') }}" class="btn btn-outline-success btn-lg w-100">
<i class="fas fa-user-plus"></i>
<div class="mt-2">
<strong>Neuen Benutzer erstellen</strong>
<br><small class="text-muted">Schnell einen neuen Benutzer hinzufügen</small>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Letzte Benutzer -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5><i class="fas fa-clock"></i> Letzte Benutzer</h5>
</div>
<div class="card-body">
{% if users %}
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Benutzername</th>
<th>E-Mail</th>
<th>Rolle</th>
<th>Erstellt am</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
{% for user in users[:5] %}
<tr>
<td>
<strong>{{ user.username }}</strong>
{% if user.id == current_user.id %}
<span class="badge bg-primary ms-1">Sie</span>
{% endif %}
</td>
<td>{{ user.email }}</td>
<td>
{% if user.is_admin %}
<span class="badge bg-danger"><i class="fas fa-user-shield"></i> Administrator</span>
{% else %}
<span class="badge bg-secondary"><i class="fas fa-user"></i> Benutzer</span>
{% endif %}
</td>
<td>{{ user.created_at.strftime('%d.%m.%Y %H:%M') }}</td>
<td>
<a href="{{ url_for('admin.edit_user', user_id=user.id) }}"
class="btn btn-sm btn-outline-primary" title="Bearbeiten">
<i class="fas fa-edit"></i>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="text-center mt-3">
<a href="{{ url_for('admin.users') }}" class="btn btn-primary">
Alle Benutzer anzeigen <i class="fas fa-arrow-right"></i>
</a>
</div>
{% else %}
<div class="text-center text-muted py-4">
<i class="fas fa-users fa-3x mb-3"></i>
<h5>Keine Benutzer gefunden</h5>
<p>Erstellen Sie den ersten Benutzer über den Button oben.</p>
</div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}