Seitenleiste: Eintraege ausblendbar (Backend)

Zwei Ebenen in einer Tabelle, nach dem Vorbild von DashboardLayout:
user_id NULL ist die Vorgabe des Administrators, eine Zeile mit user_id
die zusaetzliche Auswahl eines Kontos. Beide Listen gelten zusammen - wer
etwas versteckt, versteckt es zusaetzlich; einblenden, was der
Administrator ausgeblendet hat, kann niemand. Das erspart einen dritten
Zustand je Eintrag.

Als Schluessel dient der Routenpfad; der ist ohnehin eindeutig, eine
zweite Benennung waere nur eine weitere Stelle zum Auseinanderlaufen.

Drei Routen: lesen (Vorgabe, eigene Auswahl und die fertige Vereinigung
in einem Zug), eigene Auswahl setzen, Vorgabe setzen (nur Admin).

Die Eindeutigkeit laeuft ueber einen Index auf coalesce(user_id, -1).
Ein schlichtes UNIQUE(user_id) haette zwei Vorgabezeilen zugelassen, weil
NULL in SQL nie gleich NULL ist - das war im Entwurf noch falsch.

Versteckt wird nur der Eintrag, nicht die Seite: Lesezeichen,
Dashboard-Karten und Lagerort-QR sollen weiter funktionieren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-28 20:27:14 +01:00
co-authored by Claude Opus 5
parent 8f5d679d9d
commit be267e70a5
5 changed files with 305 additions and 0 deletions
+18
View File
@@ -1154,6 +1154,24 @@ class ItemOut(BaseModel):
gehoert_zu: ItemKurz | None = None
# ---- Seitenleiste ----
class NavigationOut(BaseModel):
"""Was die Oberflaechen brauchen, in einem Zug.
``versteckt`` ist die fertige Vereinigung aus Vorgabe und eigener Auswahl –
die Leiste rechnet damit nichts mehr selbst. ``vorgabe`` und ``eigen``
stehen daneben, weil die Einstellungsseite bzw. die Kontoseite genau ihre
eigene Ebene zum Bearbeiten brauchen.
"""
vorgabe: list[str] = []
eigen: list[str] = []
versteckt: list[str] = []
class NavigationSetzen(BaseModel):
versteckt: list[str] = []
# ---- Etiketten-Vorlagen ----
class SpalteOut(BaseModel):
"""Eine waehlbare Spalte – fest oder ein eigenes Feld."""