feat(schnellstart): Kacheln je Geraetetyp in der Oberflaeche pflegen #44

Merged
florian.wilde merged 1 commits from feat/34-schnellstart-pflegen into main 2026-10-04 15:41:48 +00:00
Owner

Welche Vorlagen auf der Geräteseite als Kachel erscheinen, stand bisher nur im Seed. Wer eine eigene Vorlage dort haben wollte, kam nicht heran; wer eine mitgelieferte loswerden wollte, auch nicht.

Die neue Seite

Verwaltung → Schnellstart, eigene Seite statt Abschnitt unter Einstellungen: acht Gerätetypen mit je einer Liste sind zu viel für eine Seite, die schon den Moduswechsel trägt.

Die Reihenfolge läuft über Hoch und Runter, nicht über Drag & Drop. Der Vorlagen-Editor braucht dnd-kit, weil dort hundert Schritte in Abschnitten liegen; hier sind es zwei bis vier Kacheln, und zwei Knöpfe sind am Handy verlässlicher als eine Ziehgeste neben einer scrollenden Seite.

Gespeichert wird die ganze Liste, nicht Zeile für Zeile: position kommt aus der Reihenfolge des Formulars, damit es nur eine Wahrheit darüber gibt.

Was der Seed danach noch darf

Einstellung.schnellstartGepflegt hält ihn heraus, sobald hier gespeichert wurde — auch bei unverändert gespeicherter Liste, denn das Speichern selbst ist die Aussage „ich pflege das jetzt". Eine fehlende Zeile in GeraetetypVorlage sagt nicht, ob sie noch nie da war oder bewusst entfernt wurde; ohne Marke käme eine entfernte Kachel beim nächsten Einrichtungslauf zurück.

Ein Fehler, den nur das Durchklicken gefunden hat

Die Suite war grün, die Seite sah richtig aus — und die Umsortierung wurde nicht gespeichert.

Altdaten tragen mehrere Zeilen desselben Typs auf position 0: der Seed zählt je Vorgabe von 0, und ein Beispielskript legte eine zweite dazu. Bei gleicher Position ist die Reihenfolge in Postgres nicht festgelegt, und Lesemodell und Dienst gaben die Zeilen in unterschiedlicher Reihenfolge zurück. Der Vergleich „unverändert" hielt die echte Umsortierung deshalb für einen Leerlauf: die Marke wurde gesetzt, geschrieben wurde nichts.

Behoben durch einen eindeutigen Tiebreak (position, dann vorlageId) in beiden Abfragen, mit Regressionstest. Nach dem Fix im gebauten Stand nachgemessen: Reihenfolge steht nach dem Neuladen, Positionen 0 und 1 in der Datenbank, Protokolleintrag mit Namen.

Dabei habe ich die Ursache zuerst falsch benannt: eine zusätzliche Prüfung auf aufeinanderfolgende Positionen behebt den Fehler nicht — Gegenprobe gefahren, die Tests blieben grün. Sie zieht nur alte Positionen gerade. Der Kommentar sagt das jetzt so, und ein eigener Test deckt genau das ab.

Oberfläche

Im gebauten Stand durchgeklickt: Reiter vorhanden, acht Abschnitte, umsortieren, Hinweis „nicht gespeichert" erscheint, speichern, neu laden — Reihenfolge steht. Bei 390 px kein horizontales Scrollen.

Tests

Sechzehn neue (1172 statt 1156), darunter alle drei Kriterien des Issues, der Regressionsfall mit gleichen Positionen, das Protokoll mit Namen statt Kennungen, und beide Seed-Richtungen. Zwei Kriterien waren schon durch tests/geraeteseite.test.ts gedeckt — der Leseweg stimmte seit #014, gefehlt hat nur die Pflege.

Alle Tore grün: lint, typecheck, format:pruefen, pruefe:doku, 1172 Vitest-Tests in 53 Dateien.

Closes #34

🤖 Generated with Claude Code

Welche Vorlagen auf der Geräteseite als Kachel erscheinen, stand bisher nur im Seed. Wer eine eigene Vorlage dort haben wollte, kam nicht heran; wer eine mitgelieferte loswerden wollte, auch nicht. ## Die neue Seite **Verwaltung → Schnellstart**, eigene Seite statt Abschnitt unter Einstellungen: acht Gerätetypen mit je einer Liste sind zu viel für eine Seite, die schon den Moduswechsel trägt. Die Reihenfolge läuft über **Hoch und Runter, nicht über Drag & Drop**. Der Vorlagen-Editor braucht dnd-kit, weil dort hundert Schritte in Abschnitten liegen; hier sind es zwei bis vier Kacheln, und zwei Knöpfe sind am Handy verlässlicher als eine Ziehgeste neben einer scrollenden Seite. Gespeichert wird die **ganze Liste**, nicht Zeile für Zeile: `position` kommt aus der Reihenfolge des Formulars, damit es nur eine Wahrheit darüber gibt. ## Was der Seed danach noch darf `Einstellung.schnellstartGepflegt` hält ihn heraus, sobald hier gespeichert wurde — **auch bei unverändert gespeicherter Liste**, denn das Speichern selbst ist die Aussage „ich pflege das jetzt". Eine fehlende Zeile in `GeraetetypVorlage` sagt nicht, ob sie noch nie da war oder bewusst entfernt wurde; ohne Marke käme eine entfernte Kachel beim nächsten Einrichtungslauf zurück. ## Ein Fehler, den nur das Durchklicken gefunden hat Die Suite war grün, die Seite sah richtig aus — und **die Umsortierung wurde nicht gespeichert.** Altdaten tragen mehrere Zeilen desselben Typs auf `position` 0: der Seed zählt je Vorgabe von 0, und ein Beispielskript legte eine zweite dazu. Bei gleicher Position ist die Reihenfolge in Postgres nicht festgelegt, und Lesemodell und Dienst gaben die Zeilen in **unterschiedlicher** Reihenfolge zurück. Der Vergleich „unverändert" hielt die echte Umsortierung deshalb für einen Leerlauf: die Marke wurde gesetzt, geschrieben wurde nichts. Behoben durch einen eindeutigen Tiebreak (`position`, dann `vorlageId`) in **beiden** Abfragen, mit Regressionstest. Nach dem Fix im gebauten Stand nachgemessen: Reihenfolge steht nach dem Neuladen, Positionen 0 und 1 in der Datenbank, Protokolleintrag mit Namen. Dabei habe ich die Ursache zuerst falsch benannt: eine zusätzliche Prüfung auf aufeinanderfolgende Positionen behebt den Fehler **nicht** — Gegenprobe gefahren, die Tests blieben grün. Sie zieht nur alte Positionen gerade. Der Kommentar sagt das jetzt so, und ein eigener Test deckt genau das ab. ## Oberfläche **Im gebauten Stand durchgeklickt:** Reiter vorhanden, acht Abschnitte, umsortieren, Hinweis „nicht gespeichert" erscheint, speichern, neu laden — Reihenfolge steht. Bei 390 px kein horizontales Scrollen. ## Tests Sechzehn neue (1172 statt 1156), darunter alle drei Kriterien des Issues, der Regressionsfall mit gleichen Positionen, das Protokoll mit Namen statt Kennungen, und beide Seed-Richtungen. Zwei Kriterien waren schon durch `tests/geraeteseite.test.ts` gedeckt — der Leseweg stimmte seit #014, gefehlt hat nur die Pflege. Alle Tore grün: `lint`, `typecheck`, `format:pruefen`, `pruefe:doku`, **1172 Vitest-Tests** in 53 Dateien. Closes #34 🤖 Generated with [Claude Code](https://claude.com/claude-code)
florian.wilde added 1 commit 2026-10-04 15:41:46 +00:00
feat(schnellstart): Kacheln je Geraetetyp in der Oberflaeche pflegen
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
4bd34c4233
Welche Vorlagen auf der Geraeteseite als Kachel erscheinen, stand nur im Seed.
Wer eine eigene Vorlage dort haben wollte, kam nicht heran; wer eine
mitgelieferte loswerden wollte, auch nicht.

Neue Seite Verwaltung -> Schnellstart: je Geraetetyp eine Liste, Reihenfolge
ueber Hoch und Runter. Kein Drag & Drop -- der Editor braucht dnd-kit fuer
hundert Schritte, hier sind es zwei bis vier Kacheln, und zwei Knoepfe sind am
Handy verlaesslicher als eine Ziehgeste neben einer scrollenden Seite.

Gespeichert wird die ganze Liste; position kommt aus ihrer Reihenfolge, damit es
nur eine Wahrheit darueber gibt. Zur Auswahl stehen nur veroeffentlichte, nicht
archivierte Vorlagen.

Einstellung.schnellstartGepflegt haelt den Seed heraus, sobald jemand
gespeichert hat -- auch bei unveraenderter Liste. Eine fehlende Zeile sagt
nicht, ob sie noch nie da war oder bewusst entfernt wurde.

Das Durchklicken des gebauten Stands fand einen Fehler, den die Suite nicht
gesehen haette: die Umsortierung wurde nicht gespeichert. Altdaten tragen
mehrere Zeilen auf position 0, und bei gleicher Position ist die Reihenfolge in
Postgres nicht festgelegt -- Lesemodell und Dienst gaben sie unterschiedlich
zurueck, und der Vergleich hielt die Umsortierung fuer einen Leerlauf. Behoben
durch einen eindeutigen Tiebreak in beiden Abfragen, mit Regressionstest.

Closes #34
florian.wilde merged commit f5936327a0 into main 2026-10-04 15:41:48 +00:00
florian.wilde deleted branch feat/34-schnellstart-pflegen 2026-10-04 15:41:48 +00:00
Sign in to join this conversation.