diff --git a/features/INDEX.md b/features/INDEX.md index 1f8dd73..1acb1ad 100644 --- a/features/INDEX.md +++ b/features/INDEX.md @@ -84,8 +84,8 @@ | PROJ-66 | Backup-Strategie für Store, Keyfile, PostgreSQL (Produktiv + Teilproduktiv) | Deployed | [PROJ-66](PROJ-66-backup-strategie.md) | 2026-07-04 | | PROJ-67 | Manticore Search Upgrade 25.0.0 → 27.1.5 + Auto-Upgrade-Pfad | Deployed | [PROJ-67](PROJ-67-manticore-upgrade-25-zu-27.md) | 2026-07-05 | | PROJ-68 | sudo-Provisionierung für Admin-Dienststeuerung fehlte komplett | Deployed | [PROJ-68](PROJ-68-sudo-provisionierung-dienststeuerung.md) | 2026-07-05 | -| PROJ-69 | Admin-Dashboard Tab-Gruppierung (2-Ebenen-Navigation) | Planned | [PROJ-69](PROJ-69-admin-tabs-gruppierung.md) | 2026-07-06 | -| PROJ-70 | User-Self-Service IMAP-Rückholung (Archiv-Mail zurück ins Postfach) | In Review | [PROJ-70](PROJ-70-imap-rueckholung-self-service.md) | 2026-07-07 | +| PROJ-69 | Admin-Dashboard Tab-Gruppierung (2-Ebenen-Navigation) | Deployed | [PROJ-69](PROJ-69-admin-tabs-gruppierung.md) | 2026-07-06 | +| PROJ-70 | User-Self-Service IMAP-Rückholung (Archiv-Mail zurück ins Postfach) | Deployed | [PROJ-70](PROJ-70-imap-rueckholung-self-service.md) | 2026-07-07 | diff --git a/features/PROJ-69-admin-tabs-gruppierung.md b/features/PROJ-69-admin-tabs-gruppierung.md new file mode 100644 index 0000000..9340fe5 --- /dev/null +++ b/features/PROJ-69-admin-tabs-gruppierung.md @@ -0,0 +1,74 @@ +--- +id: PROJ-69 +title: Admin-Dashboard Tab-Gruppierung (2-Ebenen-Navigation) +status: Deployed +created: 2026-07-06 +--- + +## Problem + +`/admin` zeigt 17 flache Tabs in einer Zeile (`src/app/admin/page.tsx:152-175`). +Für superadmin fast alle sichtbar, unübersichtlich, schlecht skalierbar. + +## Ziel + +Zweistufige Navigation: Gruppe → Tab, analog zu bestehenden rollenbasierten +Sichtbarkeitsregeln (`isSuperAdmin`, `canViewDSGVO`, etc.). Kein neues +shadcn-Primitive, nur Layout-Umbau. + +## Gruppen + +1. **Übersicht** — Dashboard, Dienste (superadmin) +2. **Benutzer & Zugriff** — Benutzer, LDAP (Global, superadmin), LDAP (Tenant), + Mandanten (superadmin) +3. **Compliance** — Audit-Log, DSGVO-Anfragen (canViewDSGVO), Retention + (superadmin), Archivierungs-Regeln (superadmin) +4. **Mail-Eingang** — Import, IMAP-Einstellungen, Routing-Regeln, SMTP-Out + (superadmin), Quotas (superadmin) +5. **System** — Security (superadmin), Zertifikat (superadmin), Module + (superadmin) + +## Acceptance Criteria + +- [ ] Gruppen-Leiste über der bestehenden `TabsList` (z.B. Button-Segmentleiste + oder zweite `Tabs`-Ebene), Klick auf Gruppe zeigt nur ihre Sub-Tabs. +- [ ] Eine Gruppe wird nur angezeigt, wenn mindestens ein Tab darin für die + aktuelle Rolle sichtbar ist (kein leerer Gruppen-Button). +- [ ] Bestehende rollenbasierte Sichtbarkeit pro Tab bleibt unverändert + (`isSuperAdmin`, `canViewDSGVO`, `tenantAccessAllowed()`-Muster etc.). +- [ ] Für nicht-superadmin-Rollen (admin, domain_admin, domain_auditor): + nur Gruppen mit sichtbaren Tabs erscheinen — z.B. domain_auditor sieht + vermutlich nur "Compliance" + evtl. "Benutzer & Zugriff". +- [ ] Deep-Link/Reload auf einen Tab (z.B. `?tab=users`) bleibt funktionsfähig + falls das aktuell schon unterstützt wird (prüfen). +- [ ] Keine Funktionalität der einzelnen Tabs verändert, nur Navigation/Layout. +- [ ] Responsive: Gruppen-Leiste bricht auf Mobile sinnvoll um (analog + `.claude/rules/frontend.md` — 375px/768px/1440px). + +## Non-Goals + +- Keine neuen Tabs/Features, reine Navigations-Restrukturierung. +- Keine Backend-/API-Änderungen. + +## Implementation Notes + +`src/app/admin/page.tsx` (Commit 3b2a838): 5 Gruppen (Übersicht, Benutzer & +Zugriff, Compliance, Mail-Eingang, System) als Button-Leiste über der +bestehenden shadcn `Tabs`. Klick filtert sichtbare `TabsTrigger`, +`TabsContent` bleibt unverändert im DOM (Radix matched weiter per `value` +unabhängig von der Gruppen-Filterung). Rollenbasierte Sichtbarkeit pro Tab +1:1 übernommen, keine Funktionsänderung. `npx tsc --noEmit` lief sauber. + +## QA Test Results + +Kein Browser-/E2E-Test mit den 3 Rollen durchgeführt (Testuser-Frage blieb +ungeklärt, siehe Memory `project_proj69_admin_tabs_status`). Deploy auf +User-Anweisung trotzdem durchgeführt (2026-07-07): Frontend-Build auf 131 +lief sauber, `/admin` liefert HTTP 200. Funktionale Prüfung der +Rollen-Filterung steht noch aus. + +## Deployment + +- 2026-07-07, 192.168.1.132 (Test) und 192.168.1.131 (Produktiv), je + `update.sh` (2 Läufe wegen Self-Update-Timing, siehe PROJ-67/68). + Frontend-Build erfolgreich, `/admin` erreichbar. diff --git a/features/PROJ-70-imap-rueckholung-self-service.md b/features/PROJ-70-imap-rueckholung-self-service.md index 4b8f662..556beed 100644 --- a/features/PROJ-70-imap-rueckholung-self-service.md +++ b/features/PROJ-70-imap-rueckholung-self-service.md @@ -1,7 +1,7 @@ --- id: PROJ-70 title: User-Self-Service IMAP-Rückholung (Archiv-Mail zurück ins Postfach) -status: Planned +status: Deployed created: 2026-07-07 --- @@ -132,11 +132,24 @@ Mail- und IMAP-Handler dupliziert): `fetch`, um das `error`-JSON-Feld als `Error.message` durchzureichen). - `npx tsc --noEmit -p .` lief sauber durch (Exit 0). -**Noch offen:** QA gegen Acceptance Criteria (insb. Tenant-Isolation-Test, -Sichtbarkeits-Gating), Kompilierung/Deploy auf 132. - ## QA Test Results -_wird nach Umsetzung ergänzt._ + +Nur Smoke-Tests, kein vollständiger E2E-Test: +- 132: Backend/Frontend kompilieren, Dienste laufen, `imap_restore_enabled`- + Spalte vorhanden, `PATCH /api/auth/imap-restore` und + `POST /api/mails/{id}/restore` liefern 401 (Auth erforderlich) statt 404 — + Endpoints korrekt registriert. +- 131: identische Smoke-Test-Ergebnisse. +- **Nicht getestet** (bewusst, keine Produktiv-/Test-Zugangsdaten angefasst): + echter Login-Flow, Passwort-Bestätigungs-Dialog, Restore-Button- + Sichtbarkeit, 422-Fehlermeldung bei Postfach-Ablehnung, + Tenant-Isolation-Test (User A → Postfach von User B). Empfehlung: mit + dediziertem Testuser nachholen (QA Engineer oder integration-tester-Skill). ## Deployment -_wird nach Abschluss ergänzt._ + +- 2026-07-07, 192.168.1.132 (Test): 2x `update.sh` (Self-Update-Timing, + siehe PROJ-67/68), Migration lief, Dienste `active`, Health-Check grün. +- 2026-07-07, 192.168.1.131 (Produktiv): identisch, 2x `update.sh`, Migration + lief, Dienste `active`, Health-Check grün. Kein Login mit + Produktiv-Zugangsdaten durchgeführt.