79 lines
5.7 KiB
Markdown
79 lines
5.7 KiB
Markdown
# #010 M5 – Vorlagen-Editor
|
||
|
||
**Status:** erledigt
|
||
**Meilenstein:** v0.1.0
|
||
**Labels:** phase-1, frontend
|
||
**Geschätzt:** 10 h **Tatsächlich:** 2 h 10 min
|
||
|
||
## Ziel
|
||
|
||
Der Editor, in dem ein Redakteur eine Vorlage baut, ohne den Kopf über Versionen zu verlieren.
|
||
|
||
## Aufgaben
|
||
|
||
- [x] Vorlagenliste mit Suche, Filter nach Kategorie und Tag, Kennzeichnung „Entwurf vorhanden“
|
||
- [x] Editor: Abschnitte und Schritte anlegen, bearbeiten, löschen; Abschnitte mit zweistelliger Nummer (`01 · Vorbereitung`)
|
||
- [x] Sortieren per Drag & Drop mit `@dnd-kit`, auch am Handy mit dem Finger bedienbar
|
||
- [x] Je Schritt: Titel, Typ (`HAKEN`, `TEXT`, `ZAHL`, `AUSWAHL`, `DATUM`, `BEFEHL`), Pflicht (roter Stern), Hilfetext als Markdown, Doku-Link
|
||
- [x] Typabhängige `konfig`-Formulare: Auswahloptionen, Min/Max/Einheit, bei `TEXT` mehrzeilig, bei `BEFEHL` die Shell (`powershell`/`bash`/`cmd`) und der Befehlstext
|
||
- [x] Variablen definieren: `key`, Label, Typ, Optionen, Pflicht, Position
|
||
- [x] Vorschau der Vorlage wie im Lauf, mit Beispielwerten
|
||
- [x] Veröffentlichen mit Änderungsnotiz, Versionshistorie ansehen, Vorlage duplizieren, JSON-Export und -Import
|
||
- [x] Warnung im Editor bei unbekannten Platzhaltern in Titel, Hilfetext und Befehlstext
|
||
- [x] Screenshots Liste, Editor, Historie in `docs/screenshots/m5/`
|
||
|
||
## Akzeptanzkriterien
|
||
|
||
- [x] Eine Vorlage lässt sich vollständig ohne Umweg über die Datenbank anlegen, sortieren, veröffentlichen
|
||
- [x] Eine veröffentlichte Version ist im Editor nur lesend; „Bearbeiten“ erzeugt sichtbar einen Entwurf
|
||
- [x] Unbekannte Platzhalter werden als Warnung angezeigt, blockieren aber das Speichern nicht
|
||
- [x] Sortieren funktioniert am Handy bei 390 px Breite ohne horizontales Scrollen
|
||
- [x] Der Markdown-Hilfetext rendert ohne rohes HTML
|
||
|
||
## Beim Bauen aufgefallen
|
||
|
||
- **`next dev` hydriert in dieser Umgebung überhaupt nicht.** Die Seiten werden serverseitig
|
||
gerendert und sehen vollständig richtig aus, aber React hängt sich nie an — kein Knopf tut etwas.
|
||
Gemessen: im Entwicklungsmodus tragen 2 von 1302 Elementen React-Knoten, im gebauten Stand 1281
|
||
von 1296. Es liegt nicht an diesem Code: auch ohne `src/proxy.ts` und ohne `output: "standalone"`
|
||
bleibt es dabei, und der HMR-WebSocket scheitert mit `ERR_INVALID_HTTP_RESPONSE`. Das ist der
|
||
heimtückischste Befund des Meilensteins, denn **ein Screenshot beweist damit nichts über
|
||
Bedienbarkeit** — und genau darauf haben sich die Meilensteine #005 bis #009 verlassen. Seitdem
|
||
steht in `CLAUDE.md`: Oberflächen werden gegen `pnpm build && pnpm start` abgenommen, und was nur
|
||
mit angehängtem React gelingt, gehört in einen Playwright-Test.
|
||
- **Die CSP hatte im Entwicklungsmodus kein `unsafe-eval`.** React braucht es dort, die Konsole
|
||
meldete es auf jeder Seite. Behoben — es war nicht die Ursache des Hydrierungsproblems, aber ein
|
||
echter Fehler. Der ausgelieferte Stand bleibt streng, und der Test dazu prüft jetzt den Proxy
|
||
selbst statt nur die Funktion darunter: der Review hatte zu Recht beanstandet, dass der
|
||
Kommentar eine Zusage machte, die kein Test hielt.
|
||
- **Eine abgelaufene Anmeldung hätte im Editor eine Stunde Arbeit vernichtet.** `rechtErforderlich`
|
||
wirft, der Wurf lief durch die Server Action bis in Nexts Fehlergrenze, und die hängt die Seite
|
||
aus — samt allem, was noch nicht gespeichert war. Nach zwölf Stunden läuft die Sitzung von selbst
|
||
ab; es hätte genau die Person getroffen, die lange an einer Vorlage sitzt. Jetzt wird der Fehler
|
||
gefangen und als Meldung gezeigt, der Aufbau lässt sich bei **jedem** fehlgeschlagenen Speichern
|
||
als JSON herauskopieren, und es gibt eine deutsche Fehlergrenze.
|
||
- **Eine archivierte Kundenzuordnung verschwand beim Speichern der Kopfdaten.** Der archivierte
|
||
Kunde fehlte in der Auswahlliste, der Browser wählte die erste Option („für alle Kunden“), und
|
||
ein Klick auf „Kopfdaten speichern“ machte aus einer kundenspezifischen Vorlage eine für alle
|
||
sichtbare. Genau das, was der Kommentar über der Unterscheidung „Feld fehlt“ gegen „Feld leer“
|
||
zu verhindern versprach — er deckte den Fall „Feld da, aber unvollständig“ nicht ab.
|
||
- **Zwei stille Textverfälscher.** `titelOhneNummer` machte aus „24 · 7 Bereitschaft“ ein
|
||
„7 Bereitschaft“, und `mitBeispielwerten` wertete `$&` im **Ersatztext** als Rückverweis — in
|
||
#012 wäre daraus ein verfälschter PowerShell-Befehl geworden.
|
||
- **Der Editor war 16 986 px hoch**, weil jeder Schritt dauerhaft aufgeklappt war. Mit den sieben
|
||
Vorlagen aus #017 (rund 150 Schritte) wäre er unbenutzbar gewesen. Jetzt klappen Schritte,
|
||
Variablen und Abschnitte zu: dieselbe Vorlage misst 3 482 px am Handy.
|
||
- **`abschnitte.2.schritte.0.titel` ist eine richtige und nutzlose Fehlermeldung.** Daraus wird
|
||
jetzt „Abschnitt 03, Schritt 1: …“. Ein leeres Pflichtfeld weist weiterhin den ganzen Aufbau ab —
|
||
aber man findet die Stelle.
|
||
- **Der „Scannen“-Knopf zeigte auf eine Seite, die es nicht gibt.** Next holt Verweise beim
|
||
Darüberfahren vorab, jede Seite erzeugte also im Hintergrund eine 404. Bis #014 ist er gedämpft
|
||
und nicht verlinkt — dieselbe Regel, die für die Navigation schon galt.
|
||
- **Eine veröffentlichte Vorlage lässt sich nicht mehr löschen**, auch nicht über einen
|
||
Kaskadenlöschvorgang: der Trigger aus #009 verweigert es. Beim Aufräumen der Testdaten selbst
|
||
erlebt. Das ist die Zusage, an der das Archiv hängt — die E2E-Tests archivieren deshalb, statt
|
||
zu löschen, und brauchen ab #018 eine Wegwerf-Datenbank.
|
||
- **`prettier --check` war rot**, ohne dass ein Tor es bemerkt hätte: `lint-staged` formatiert beim
|
||
Commit automatisch nach, und das Ergebnis wäre ein Commit mit Änderungen, die niemand gesehen
|
||
hat. `pnpm format:pruefen` gehört jetzt zu den Toren und zur CI.
|