Pond member management UI #54
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#54
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Pond Admins manage who participates, respecting membership quotas (vision: default 5 editors / 50 readers on personal ponds).
Scope
Pond settings 'Members': list current pond-scope grants grouped by role with search; add member by exact username or e-mail (no directory browsing — privacy) with role choice; change role; remove; enforce and display quota usage ('3 of 5 editor seats'); personal-pond rule surfaced (no second admin option there); pending states are not needed (no invitation flow in v1 — adding is immediate; document this simplification in the UI copy).
Acceptance criteria
Technical notes
editors_per_pond,readers_per_pondconsumed here).Dependencies
Depends on #22, #52.
Size: ~1.5 days
Conventions: English code/comments, clear human-readable code, no hard-coded UI strings (ADR 0012, add
deanden), permission checks only via the shared guard (docs/architecture/permissions.md). Read the referenced ADRs before starting.Umgesetzt in
7f1c49d(Claude Opus 4.8), Pipeline komplett grün (CI + CD: Deploy Test, Smoke, Int-Promotion), live auf Test und Int verifiziert.Was #54 liefert
apps/api/src/members/) über die pond-scope-User-Grants (#51/#52):GET /ponds/:id/members(jedes Mitglied — Transparenz: Liste nach effektiver Rolle gruppiert + Seat-Nutzung +canManage),POST(Hinzufügen per exaktem Username oder E-Mail, kein Directory-Browsing),PATCH :userId(Rolle ändern),DELETE :userId(entfernen) — Mutationen Pond-Admin-gated über den Guard.editors_per_pond/readers_per_pond(#22) werden beim Hinzufügen/Rollenwechsel in einer per-Pond advisory-locked Transaktion durchgesetzt (Zählung kann nicht racen); Admins sind unbegrenzt. Owner-Mitgliedschaft ist geschützt, persönliche Teiche verweigern einen zweiten Admin (shared Grant-Regel), der letzte Pond-Admin ist nicht entfernbar. Jede Änderung invalidiert den Pond-Permission-Cache und feuert denpond_access_changed-NOTIFY (#39/#53).apps/web/src/members/):MemberManagerin den Teich-Einstellungen — Liste nach Rolle + Suche + Seat-Anzeige („1 von 5 Bearbeiter-Plätzen"), Hinzufügen-Formular (bei vollem Seat deaktiviert mit lokalisierter Erklärung), Rollenwechsel + Entfernen; read-only für Nicht-Admins (Transparenz); persönlicher-Teich-Hinweis. Kein Einladungsflow (v1): Hinzufügen wirkt sofort, die UI-Copy sagt das.Acceptance criteria
quota_exceeded).Live-Checks
canManagetrue, Seats 0/5 · 0/50; zweiter Admin →grant_pond_admin_personal_pond; unbekannt →member_not_found.canManagefalse, POST → 403); Duplikat →member_exists; Rollenwechsel editor↔reader (Seats 1/5 ↔ 0/5) je 200. Baseline wiederhergestellt.Tests:
members.e2e.db.test.ts(Add/Change/Remove, Seat-Erschöpfung, Personal-Pond- + Owner-Regeln, read-only-Transparenz, Last-Admin) — api-DB 161 grün; neuer Browser-Packmembers.spec.ts(Second-Browser-Sofortzugriff, Quota-Disable, Nicht-Admin-read-only) mit eigenem CI-Step.