Setzt die Rechte aus dem vorigen Commit in den Oberflaechen um und
ergaenzt die fehlenden Verwaltungsseiten.
Neu:
- /admin/users - Konten anlegen, Rolle und Sperre setzen, Passwort
zuruecksetzen, Gruppenzuordnung je Konto
- /admin/groups - Gruppen anlegen und umbenennen, Mitglieder samt
Rolle pflegen, zugeordnete Domains einsehen
- /admin/profile - eigenes Konto: Gruppenzugehoerigkeit ansehen und
das Passwort aendern. Das fehlte bisher vollstaendig, auch fuer
den einen Administrator.
Domains sind jetzt Administratorsache, weil dort die Gruppe zugewiesen
wird. Kurzlinks, Statistik und QR-Codes richten sich nach der Gruppe:
ein fremder Kurzlink antwortet mit 404 (seine Existenz geht den
Aufrufer nichts an), ein sichtbarer ohne Schreibrecht mit 403.
Geschlossene Luecke: /admin/uploads/{file} pruefte bisher nur, ob
ueberhaupt jemand angemeldet ist. Da alle Logos in einem gemeinsamen
Verzeichnis liegen, war der Dateiname die einzige Huerde. Ausgeliefert
wird jetzt nur noch, was laut Datenbank zu einem Kurzlink aus einer
Gruppe des Aufrufers gehoert.
Die Navigation blendet aus, wofuer die Rechte fehlen - das ist
Bedienkomfort, kein Zugriffsschutz: die Routen pruefen unabhaengig
davon noch einmal.
Der Setup-Assistent legt das erste Konto als Administrator an und
traegt es gleich als Editor der Gruppe "Standard" ein. Ohne das
koennte es zwar verwalten, aber selbst keine Kurzlinks anlegen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
61 lines
2.3 KiB
PHP
61 lines
2.3 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Gruppenuebersicht.
|
||
*
|
||
* @var list<array<string,mixed>> $groups
|
||
* @var App\Security\Csrf $csrf
|
||
*/
|
||
?>
|
||
<div class="page-head">
|
||
<div>
|
||
<h1>Gruppen</h1>
|
||
<p class="muted">Eine Gruppe verbindet Benutzer mit Domains.</p>
|
||
</div>
|
||
<a href="<?= $e($url('/admin/groups/new')) ?>" class="btn btn--primary">Neue Gruppe</a>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<p class="muted small">
|
||
Jede Domain gehört zu genau einer Gruppe, jeder Kurzlink zu seiner Domain. Wer Mitglied einer
|
||
Gruppe ist, sieht damit alle Kurzlinks aller Domains dieser Gruppe – mit der Rolle
|
||
<strong>Editor</strong> darf er sie auch anlegen und ändern, als <strong>Viewer</strong>
|
||
nur ansehen (einschließlich Statistik und QR-Download). Administratoren sehen unabhängig
|
||
von Gruppen alles.
|
||
</p>
|
||
</div>
|
||
|
||
<div class="card card--flush">
|
||
<div class="table-wrap">
|
||
<table class="table">
|
||
<thead>
|
||
<tr>
|
||
<th scope="col">Gruppe</th>
|
||
<th scope="col" class="num">Mitglieder</th>
|
||
<th scope="col" class="num">Domains</th>
|
||
<th scope="col"><span class="sr-only">Aktionen</span></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($groups as $group):
|
||
$id = (int) $group['id'];
|
||
?>
|
||
<tr>
|
||
<td><a href="<?= $e($url('/admin/groups/' . $id . '/edit')) ?>"><?= $e($group['name']) ?></a></td>
|
||
<td class="num"><?= (int) $group['member_count'] ?></td>
|
||
<td class="num"><?= (int) $group['domain_count'] ?></td>
|
||
<td class="actions">
|
||
<a class="btn btn--sm btn--ghost" href="<?= $e($url('/admin/groups/' . $id . '/edit')) ?>">Bearbeiten</a>
|
||
<form method="post" action="<?= $e($url('/admin/groups/' . $id . '/delete')) ?>" class="inline"
|
||
data-confirm="Gruppe <?= $e($group['name']) ?> wirklich löschen?">
|
||
<?= $csrf->field() ?>
|
||
<button type="submit" class="btn btn--sm btn--danger">Löschen</button>
|
||
</form>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|