Rechtesystem: Löschen überall in Ändern falten, Gruppen-Tabelle transponieren

- "Ändern" deckt jetzt ausnahmslos überall Löschen mit ab (auch bei
  Clients) — es gibt kein eigenes *.delete-Recht mehr. Betroffen:
  devices/switches/credentials/users/groups.
- "D" in der Rechtetabelle bedeutet ausschließlich Dashboard-Neustart
  (devices.restart, PoE-Neustart über das Dashboard-Popup) und existiert
  nur bei Clients. Automatische Neustarts bei Ausfall (poe.sh) bleiben
  davon komplett unabhängig.
- Gruppen-Rechtetabelle transponiert: Kategorien jetzt als Zeilen,
  Rechte R(ead)/W(rite)/E(dit)/D(ashboard-Neustart) nebeneinander als
  Spalten statt untereinander. Deckt sich besser mit dem Legenden-Format
  und braucht weniger vertikalen Platz.
- Neue, einmalig laufende Migration (_migrated_permission_delete_fold_v2)
  überführt bestehende *.delete-Grants verlustfrei in *.edit, bevor die
  veralteten Rechte-Zeilen entfernt werden.
- Routen (delete_device/delete_switch/delete_credential/delete_user/
  delete_group) und die zugehörigen can_delete-Template-Variablen prüfen
  jetzt einheitlich *.edit statt *.delete.
- README-Rechtesystem-Abschnitt und Legende an das neue Tabellen-Layout
  angepasst.
- Live getestet: Kill-Switch, alle 5 Delete-Foldings (mit/ohne Recht),
  devices.restart-Gating unabhängig von devices.edit, Eskalationsschutz
  (Admin-Löschschutz, Systemgruppen-Schutz) — alles bestätigt korrekt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 19:49:28 +02:00
co-authored by Claude Sonnet 5
parent 4b7403f476
commit 813b17d002
8 changed files with 291 additions and 136 deletions
+32 -16
View File
@@ -1043,26 +1043,42 @@ select {
margin-bottom: 8px;
}
/* Zweistufiger Rechte-Baum (Gruppen-Detailansicht): eine Zeile pro
Top-Level-Bereich (Geräte/Logs/Einstellungen) mit eigenem "Bereich
anzeigen"-Kästchen, darunter eingerückt die Unterpunkte. */
.permission-area { margin-bottom: 22px; }
/* Rechte-Tabelle (Gruppen-Detailansicht): eine kompakte Tabelle pro
Top-Level-Bereich (Geräte/Logs/Einstellungen). Erste Zeile = der Bereich
selbst "(gesamt)" (nur die R-Spalte aktiv, das ist der Kill-Switch),
weitere Zeilen = je ein Unterpunkt (Clients, Switche, ...). Spalten =
R/W/E/D nebeneinander (siehe Legende im Seitenkopf). */
.permission-area { margin-bottom: 20px; }
.permission-area:last-child { margin-bottom: 0; }
.permission-area-toggle {
font-size: 14.5px;
padding-bottom: 8px;
margin-bottom: 14px;
.permission-table {
border-collapse: collapse;
font-size: 13px;
white-space: nowrap;
}
.permission-table th, .permission-table td {
padding: 7px 14px;
text-align: center;
border-bottom: 1px solid var(--border-soft);
}
.permission-area-toggle strong { font-weight: 700; }
.permission-area-children {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
padding-left: 22px;
border-left: 2px solid var(--border-soft);
margin-left: 5px;
.permission-table th {
font-size: 11.5px;
font-weight: 650;
color: var(--text-faint);
text-transform: uppercase;
letter-spacing: 0.03em;
font-family: var(--font-mono);
}
.permission-table th:first-child { text-transform: none; font-family: inherit; letter-spacing: normal; }
.permission-table td:first-child, .permission-table th:first-child { text-align: left; padding-right: 20px; }
.permission-table tbody tr:last-child td { border-bottom: none; }
.permission-row-label { color: var(--text-dim); }
.permission-table input[type="checkbox"] {
width: 16px; height: 16px;
accent-color: var(--accent);
cursor: pointer;
}
.permission-table input[type="checkbox"]:disabled { cursor: not-allowed; }
.permission-cb-na { opacity: 0.25; accent-color: var(--text-faint) !important; }
.check-list { display: flex; flex-direction: column; gap: 9px; }
.check-row {