docs(260928-ujj): CHANGELOG und Anleitungen fuer Design Mosaik

- Unveroeffentlicht: Hintergrundwahl (Neu), neues Aussehen (Geaendert), Resize-Fehler (Behoben)
- Anwender-Anleitung: App-Leiste, Seitenleiste, Anmeldeseite, Befehlsleiste, Hintergrund, Kalender
- Entwickler-Anleitung: User.dashboardBackground, PATCH /users/me/dashboard-background, parseDashboardBackground

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-28 22:18:51 +02:00
parent 69d17302e1
commit cb45d2663a
3 changed files with 45 additions and 10 deletions
+20
View File
@@ -677,6 +677,26 @@ Fenster aus; Punkte unter „Unveröffentlicht“ erscheinen darin nie. Lokal st
setzen. Fehlt der Abschnitt der laufenden Version in der Änderungsliste des Web-Abbilds, entsteht
kein Fenster und nichts wird gemerkt.
**Dashboard-Hintergrund pro Benutzer (quick-260928-ujj):** Die Hintergrundwahl des Designs „Mosaik“
steht in der Spalte `User.dashboardBackground` (JSONB, Migration
`20260928120000_user_dashboard_background`): `null` = nie gewählt, sonst ein normalisiertes Objekt
`{ kind: 'none' }`, `{ kind: 'preset', id }` oder `{ kind: 'image', imageId }`. Geschrieben wird
nur über `PATCH /users/me/dashboard-background` mit `{ background }` — ohne Kennungsparameter,
ausschließlich die eigene Zeile (`forTenant()`, `where: { id: currentUser.id }`); ein ungültiger
Wert ergibt 400 und schreibt nichts. Gelesen wird der Wert mit der Sitzungsantwort (`GET /auth/me`,
`AuthService.getMe`, neben `accentColor`) und landet über die `setUser`-Abbildung in `header.tsx`
im Auth-Store; `useDashboardBackground()` in
`apps/web/src/components/dashboard/dashboard-background.tsx` liest von dort und speichert über
`updateDashboardBackgroundAction` (optimistisch, bei Fehlschlag zurückgesetzt). Einzige Prüfregel
ist `parseDashboardBackground` in `packages/shared/src/index.ts` (Laufzeit-Import in API und Web,
angewendet beim Schreiben UND beim Lesen): `kind` und die Preset-Kennungen
(`DASHBOARD_BACKGROUND_PRESET_IDS`) aus einer festen Liste, `imageId` nur als UUID, weil das Web
den Wert als CSS-Hintergrund `url("...")` rendert. Wer ein neues Preset ergänzt, trägt es dort und
in `BACKGROUND_PRESETS` (`apps/web/src/lib/dashboard-background.ts`) ein — ein Test prüft, dass
beide Listen deckungsgleich sind. Der frühere localStorage-Schlüssel
`tessera.dashboardBackground.<userId>` wird von `takeLegacyDashboardBackground` einmal gelesen,
entfernt und nur übernommen, wenn der Server-Wert noch `null` ist.
**i18n — Schlüsselparität zwischen de.json und en.json:** Jeder benutzersichtbare Text gehört in
beide Sprachdateien, `apps/web/src/messages/de.json` und `apps/web/src/messages/en.json`. Ein
strukturelle Wächter-Test, `apps/web/src/messages/tenderRadar-parity.spec.ts`, prüft für den