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

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
This commit is contained in:
Florian Wilde
2026-10-04 17:40:46 +02:00
parent 0060a55387
commit 4bd34c4233
17 changed files with 910 additions and 24 deletions
+38 -11
View File
@@ -1,10 +1,10 @@
# #022 Schnellstart je Gerätetyp pflegen
**Status:** offen
**Status:** erledigt
**Im Tracker:** [#34](https://git.wilde-server.de/florian.wilde/Laufzettel/issues/34)
**Meilenstein:** v0.2.0
**Labels:** phase-2, frontend, backend
**Geschätzt:** 3 h **Tatsächlich:** –
**Geschätzt:** 3 h **Tatsächlich:** 1 h 10 min
## Ziel
@@ -18,17 +18,44 @@ den Schnellstart, konnte aber nicht sagen, wer ihn einrichtet.
## Aufgaben
- [ ] Admin-Seite (oder ein Abschnitt unter Admin → Einstellungen): je Gerätetyp eine sortierbare
Liste der Vorlagen, die dort erscheinen sollen
- [ ] Nur **veröffentlichte**, nicht archivierte Vorlagen zur Auswahl; die Reihenfolge ist die
- [x] Eigene Seite **Verwaltung → Schnellstart** (kein Abschnitt unter Einstellungen: acht Gerätetypen
mit je einer Liste sind zu viel für eine Seite, die schon den Moduswechsel trägt)
- [x] Nur **veröffentlichte**, nicht archivierte Vorlagen zur Auswahl; die Reihenfolge ist die
Reihenfolge der Kacheln (`position`)
- [ ] Recht `verwaltung`, Änderung ins `Protokoll`
- [ ] Der Seed legt die Vorgaben weiter an, überschreibt aber nie eine im Betrieb geänderte
- [x] Recht `verwaltung`, Änderung ins `Protokoll`
- [x] Der Seed legt die Vorgaben weiter an, überschreibt aber nie eine im Betrieb geänderte
Zuordnung — dieselbe Regel wie für alles andere im Seed
- [ ] Anleitung Kapitel 03 und 07 nachziehen
- [x] Anleitung Kapitel 03 und 07 nachziehen
## Akzeptanzkriterien
- [ ] Test: eine zugewiesene Vorlage erscheint als Kachel auf der Geräteseite des passenden Typs
- [ ] Test: eine archivierte Vorlage verschwindet aus dem Schnellstart, ohne dass jemand aufräumt
- [ ] Test: `LESER` und `TECHNIKER` dürfen nicht ändern
- [x] Test: eine zugewiesene Vorlage erscheint als Kachel auf der Geräteseite des passenden Typs
- [x] Test: eine archivierte Vorlage verschwindet aus dem Schnellstart, ohne dass jemand aufräumt
- [x] Test: `LESER` und `TECHNIKER` dürfen nicht ändern
## Beim Umsetzen dazugekommen
- **Die Reihenfolge läuft über Hoch und Runter, nicht über Drag & Drop.** Der Vorlagen-Editor
benutzt 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.
- **`Einstellung.schnellstartGepflegt` als Marke.** 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 Seed-Lauf zurück. Gesetzt wird sie **auch bei unverändert gespeicherter Liste**: das
Speichern selbst ist die Aussage „ich pflege das jetzt“.
- **Gespeichert wird die ganze Liste, nicht Zeile für Zeile.** `position` kommt aus der Reihenfolge
des Formulars; zwei Wahrheiten über die Reihenfolge gäbe es sonst.
- **Das Durchklicken des gebauten Stands hat einen echten Fehler gefunden**, den die Suite nicht
gesehen hätte: die Umsortierung wurde nicht gespeichert. Altdaten tragen mehrere Zeilen 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 das Lesemodell gab die
Zeilen anders zurück als der Dienst. Der Vergleich „unverändert" hielt die Umsortierung deshalb
für einen Leerlauf: die Marke wurde gesetzt, geschrieben wurde nichts. Behoben durch einen
eindeutigen Tiebreak (`position`, dann `vorlageId`) in **beiden** Abfragen.
- Dabei fiel auf, dass ich die Ursache zuerst falsch benannt hatte: eine zusätzliche Prüfung auf
aufeinanderfolgende Positionen behebt den Fehler **nicht** (Gegenprobe gefahren, Tests blieben
grün). Sie zieht nur alte Positionen gerade; der Kommentar sagt das jetzt so, und ein eigener Test
deckt genau das ab.
- Zwei der drei Akzeptanzkriterien waren schon durch `tests/geraeteseite.test.ts` gedeckt — die
Kachel am passenden Typ und das Verschwinden einer archivierten Vorlage. Das stand bei
[#014](014-qr-tags-geraeteseite.md) schon richtig im Leseweg; gefehlt hat nur die Pflege.
+2 -2
View File
@@ -26,10 +26,10 @@ Diese Dateien sind die Quelle; `pnpm issues:sync` spiegelt sie in den Gitea-Trac
| #019 | [M14 – Betriebswege und Release v0.1.0](019-betrieb-release.md) | erledigt | v0.1.0 | 10 h | 5 h 25 min |
| #020 | [Vorgesetzter auch für von Hand angelegte Personen](020-vorgesetzter-manuell.md) | erledigt | v0.2.0 | 3 h | 1 h 20 min |
| #021 | [Stabiler Schlüssel für Seed-Vorlagen](021-stabiler-schluessel-vorlagen.md) | erledigt | v0.2.0 | 2 h | 55 min |
| #022 | [Schnellstart je Gerätetyp pflegen](022-schnellstart-pflegen.md) | offen | v0.2.0 | 3 h | – |
| #022 | [Schnellstart je Gerätetyp pflegen](022-schnellstart-pflegen.md) | erledigt | v0.2.0 | 3 h | 1 h 10 min |
| #023 | [Protokoll ansehen](023-protokoll-ansicht.md) | offen | v0.2.0 | 4 h | – |
| #024 | [Proxmox-Einzeiler auf einem echten PVE-Host gegenprüfen](024-proxmox-echtlauf.md) | offen | v0.2.0 | 2 h | – |
| #025 | [Healthcheck gibt die rohe Datenbankfehlermeldung heraus](025-gesundheit-fehlermeldung.md) | erledigt | v0.2.0 | 1 h | 25 min |
| #026 | [Zwei Konventionen präzisieren, die strenger klingen als sie gemeint sind](026-konventionen-praezisieren.md) | erledigt | v0.2.0 | 1 h | 20 min |
| #027 | [Die Editor-Abläufe lassen ihre Vorlagen stehen](027-e2e-reste-vorlagen.md) | offen | v0.2.0 | 1 h | – |
| | **Summe** | | | **153 h** | **38 h 20 min** |
| | **Summe** | | | **153 h** | **39 h 30 min** |