65 lines
4.1 KiB
HTML
65 lines
4.1 KiB
HTML
{% 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 %}
|