bifroest/app/templates/admin_users.html
2026-10-27 08:34:17 +01:00

65 lines
4.1 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends "base.html" %}
{% block title %}Nutzer{% endblock %}
{% block content %}
<div class="stack stack-sm">
<h1>Nutzer</h1>
<p class="text-muted">Neue Nutzer bekommen ein Einmal-Passwort und setzen beim ersten Login ein eigenes. Nach 5 Fehlversuchen ist das Konto 15 Minuten gesperrt; „Passwort zurücksetzen“ entsperrt sofort. Mit Keycloak (Phase 5) entfallen Passwörter hier.</p>
</div>
{% include "_flash.html" %}
{% if issued %}
<div class="alert alert-warning" role="alert"><div class="alert-content stack stack-sm">
<p class="alert-title">Einmal-Passwort für {{ issued[0] }}</p>
<p><code class="text-lg">{{ issued[1] }}</code></p>
<p class="text-sm">Nur jetzt sichtbar. Bitte auf sicherem Weg weitergeben; beim ersten Login muss ein eigenes Passwort gesetzt werden.</p>
</div></div>
{% endif %}
<section class="card"><div class="card-body stack">
<div class="table-wrap"><table>
<thead><tr><th>Name</th><th>Nutzername</th><th>Teams</th><th>Status</th><th></th></tr></thead>
<tbody>
{% for u in users %}
<tr>
<td>{{ u.display_name }}{% if u.email %}<p class="text-xs text-muted">{{ u.email }}{% if not u.notify %} · keine E-Mails{% endif %}</p>{% endif %}</td>
<td>{{ u.username }}</td>
<td class="text-sm">{{ teams_by_user.get(u.id, [])|join(', ') or '–' }}</td>
<td>
{% if u.is_admin %}<span class="badge badge-primary">Plattform-Admin</span>{% endif %}
{% if u.is_global_approver %}<span class="badge badge-info">Globaler Approver</span>{% endif %}
<span class="badge {{ 'badge-success' if u.active else 'badge-default' }}">{{ 'aktiv' if u.active else 'deaktiviert' }}</span>
{% if u.locked_until and u.locked_until > now %}<span class="badge badge-danger">gesperrt</span>{% endif %}
{% if u.must_change_password %}<span class="badge badge-warning">Erstanmeldung offen</span>
{% elif not u.password_hash %}<span class="badge badge-default">nur Demo-Passwort</span>{% endif %}
</td>
<td>
<details>
<summary class="text-sm">Bearbeiten</summary>
<form method="post" action="/admin/users/{{ u.id }}" class="stack stack-sm">
<input type="hidden" name="_csrf" value="{{ p.csrf }}">
<input name="display_name" value="{{ u.display_name }}" aria-label="Anzeigename">
<input name="email" type="email" value="{{ u.email or '' }}" placeholder="E-Mail für Benachrichtigungen" aria-label="E-Mail">
<label class="cluster"><input type="checkbox" name="is_admin" value="1" {% if u.is_admin %}checked{% endif %}> Plattform-Admin</label>
<label class="cluster"><input type="checkbox" name="is_global_approver" value="1" {% if u.is_global_approver %}checked{% endif %}> Globaler Approver (entscheidet Anträge mit Freigabestufe „globaler Approver“ in allen Workspaces)</label>
<label class="cluster"><input type="checkbox" name="active" value="1" {% if u.active %}checked{% endif %}> aktiv</label>
<button class="btn btn-secondary btn-sm" type="submit">Speichern</button>
</form>
<form method="post" action="/admin/users/{{ u.id }}/reset-password" data-confirm="Neues Einmal-Passwort für {{ u.display_name }} erzeugen? Alle Sitzungen werden beendet.">
<input type="hidden" name="_csrf" value="{{ p.csrf }}">
<button class="btn btn-ghost btn-sm" type="submit">Passwort zurücksetzen</button>
</form>
</details>
</td>
</tr>
{% endfor %}
</tbody>
</table></div>
<form method="post" action="/admin/users" class="cluster">
<input type="hidden" name="_csrf" value="{{ p.csrf }}">
<input name="username" placeholder="Nutzername" required aria-label="Nutzername">
<input name="display_name" placeholder="Anzeigename" aria-label="Anzeigename">
<input name="email" type="email" placeholder="E-Mail (optional)" aria-label="E-Mail">
<label class="cluster"><input type="checkbox" name="is_admin" value="1"> Plattform-Admin</label>
<button class="btn btn-primary btn-sm" type="submit">Nutzer anlegen</button>
</form>
</div></section>
{% endblock %}