Universen: Standardreihenfolge festlegen können #4
Notifications
Total Time Spent: 14 minutes
florian.wilde
14 minutes
No due date set.
Dependencies
No dependencies set.
Reference: florian.wilde/flimmer#4
Reference in New Issue
Block a user
Worum es geht
Ein Universum kann mehrere Reihenfolgen haben. Welche beim Öffnen erscheint, lässt sich aber nicht bestimmen — es ist immer die Erscheinungsreihenfolge. Wer sich eine Story-Chronologie oder eine Einsteiger-Route gebaut hat, muss sie bei jedem Aufruf erst anklicken.
Gerade bei Universen wie Sternenpfad ist die selbst gebaute Reihenfolge ja der eigentliche Grund, warum man sie angelegt hat.
Was schon da ist
Das Datenmodell trägt die Information bereits, und sie wird auch ausgewertet:
UniverseOrder.isDefault(prisma/schema.prisma:445)getUniverse()wählt die aktive Reihenfolge in dieser Rangfolge (src/lib/universes.ts:400):?reihenfolge=…)isDefaultGesetzt wird
isDefaultallerdings nur an einer Stelle: beim Anlegen des Universums für die automatisch erzeugte Erscheinungsreihenfolge (src/lib/universes.ts:94).createOrder()setzt es nie, und es gibt keine Funktion, keine Server-Aktion und keinen Knopf, um es zu ändern.Es fehlt also nur der Weg dorthin, nicht das Fundament.
Zu entscheiden: geteilt oder persönlich?
Reihenfolgen gehören dem Universum und sind bei geteilten Universen für alle sichtbar. Die Standardreihenfolge kann man auf zwei Arten verstehen:
a) Eigenschaft des Universums (Empfehlung). Wer Schreibrecht hat, legt sie fest; sie gilt für alle. Passt dazu, dass die Reihenfolgen selbst auch geteilt sind, und ist mit einem Feld erledigt, das es schon gibt.
b) Vorliebe je Person. Jede Person hat ihre eigene. Ehrlicher bei geteilten Universen, kostet aber eine zusätzliche Tabelle und wirft die Frage auf, was gilt, wenn jemand nie etwas ausgewählt hat.
Vorschlag: (a), und als leichte persönliche Ergänzung merkt sich der Browser die zuletzt gewählte Reihenfolge je Universum. Wer bewusst umschaltet, landet beim nächsten Mal wieder dort, ohne dass das für andere etwas ändert. Die URL schlägt weiterhin alles.
Umzusetzen
setDefaultOrder(userId, orderId)insrc/lib/universes.ts, mitrequireWriteisDefault. Das Setzen muss in einer Transaktion das alte zurücksetzen, sonst gibt es zwei undfind()entscheidet nach Zufall der Sortierung.OrderTabs(src/components/universes/UniverseTools.tsx) — etwa ein „Als Standard" neben der aktiven Reihenfolge, und ein Häkchen an der, die es schon istRandfall, der heute noch nicht auffällt
deleteOrder()löscht eine eigene Reihenfolge, ohneisDefaultanzufassen (src/lib/universes.ts:253). Solange nur die Erscheinungsreihenfolge Standard sein kann, ist das harmlos. Sobald man eine eigene zum Standard machen kann, hinterlässt das Löschen ein Universum ohne Standard — dann greift zwar noch die dritte Stufe („die erste"), aber das ist Zufall statt Absicht. Beim Löschen muss der Standard auf die Erscheinungsreihenfolge zurückfallen.Abnahme
?reihenfolge=…in der Adresse schlägt den Standard weiterhinAufwand
Klein bis mittel — eine Funktion mit Transaktion, eine Aktion, ein Knopf, zwei Tests. Das Datenmodell bleibt unangetastet.
Angelegt auf ausdrücklichen Wunsch direkt in Gitea, ohne Verknüpfung zu einem Nebula-Task.
🤖 Claude Code hat mit der Umsetzung begonnen.
feat/4-standardreihenfolgesetDefaultOrder()mitrequireWrite, das Umsetzen in einer Transaktion, damit nie zwei Standards nebeneinander stehendeleteOrder()so ergänzen, dass der Standard auf die Erscheinungsreihenfolge zurückfällt, wenn die Standardreihenfolge gelöscht wirdWas ich bewusst weglasse: die im Vorschlag erwähnte Browser-Erinnerung an die zuletzt gewählte Reihenfolge. Sie wäre eine dritte, unsichtbare Quelle neben URL und Standard — schwer nachzuvollziehen, wenn zwei Leute dasselbe Universum unterschiedlich sehen. Die Rangfolge bleibt damit die schlichte: URL schlägt Standard schlägt erste. Sag Bescheid, wenn du sie trotzdem willst, dann kommt sie separat.
Zeiterfassung läuft.
✅ Umsetzung abgeschlossen — bereit zum Testen.
Was geändert wurde
setDefaultOrder()mitrequireWrite; Zurücksetzen und Setzen in einer Transaktion, damit nie zwei Standards nebeneinander stehendeleteOrder()fängt den Rückfall ab: wird die Standardreihenfolge gelöscht, übernimmt die ErscheinungsreihenfolgePATCH /api/v1/universen/{id}samt Prüfung, dass die Reihenfolge zu diesem Universum gehört — ohne die setzte ein PATCH auf A den Standard in Bdocs/API.mdundopenapi.jsonnachgezogenGeänderte Dateien
src/lib/universes.tssrc/app/actions/universes.tssrc/components/universes/UniverseTools.tsxsrc/app/api/v1/universen/[id]/route.tssrc/app/api/v1/openapi.json/route.tsdocs/API.mdtests/universes.test.tsGeprüft
56 Tests grün (vier neue), Typecheck sauber. Klickweg und Endpunkt zusätzlich gegen einen Produktionsbau durchgespielt:
?reihenfolge=…PATCHmit fremder ReihenfolgePATCHmit eigener ReihenfolgeactiveOrderIdfolgtSo testest du es
git switch feat/4-standardreihenfolgenpm run dev(Port 3011), ein Universum mit mehreren Reihenfolgen öffnen?reihenfolge=neu öffnen → sie führt jetzt.?reihenfolge=<andere>in der Adresse gewinnt weiterhin.Bewusst nicht umgesetzt: die Browser-Erinnerung an die zuletzt gewählte Reihenfolge (siehe Startkommentar). Sag Bescheid, wenn du sie doch willst.
Aufgewendete Zeit: 00:15
Pull Request: #8
Nach Freigabe:
/issue-freigabe 4📝 Nebenbei aufgefallen — gehört nicht in diesen PR, hier festgehalten:
Klickwege lassen sich im Entwicklungsmodus nicht mit Playwright prüfen. Beim Verifizieren fiel auf, dass unter headless Chromium gegen
npm run devkeine einzige Seite hydratisiert — kein Reiter, kein Knopf, nicht einmal der Theme-Umschalter im Kopf. Ursache ist der HMR-Socket:ws://127.0.0.1:3011/_next/hmrscheitert mitERR_INVALID_HTTP_RESPONSE, und damit kommt die React-Wurzel nicht hoch. Es gibt dabei keinen Seitenfehler und keine fehlgeschlagene Anfrage — es passiert einfach nichts, was zunächst wie ein Fehler im eigenen Code aussieht.Nachgewiesen: derselbe Klickweg gegen
npm run build && npm startfunktioniert vollständig.Zwei Folgerungen:
CLAUDE.mdunter „Nützliches für spätere Arbeiten".Formulare sind übrigens nicht betroffen (die Anmeldung funktioniert auch ohne JavaScript) — das verschleiert das Problem zusätzlich.
🚀 Freigegeben und nach
mainübernommen.5673055Vor dem Merge noch einmal geprüft: Typecheck sauber, 56 Tests grün.
Issue wird geschlossen.