feat(archiv): Uebersicht, Volltextsuche und Druckansicht
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

Der Einstieg am Schreibtisch und das Gedaechtnis der Anwendung. Die Uebersicht
sortiert nach Dringlichkeit — ueberfaellig zuerst, und das ist das Einzige in
Warnfarbe; alles andere auf der Seite ist Auskunft.

Das Archiv sucht ueber Titel, Notizen, erfasste Werte und Kommentare in einer
SQL-Anweisung: `Schrittergebnis.wert` ist ein Json, und nur `("wert")::text`
trifft den Trigramm-Index aus #006. Vor allem aber gehoert die Fundstelle zum
Treffer — ein Treffer ohne sichtbaren Grund ist fuer den Suchenden wertlos.

Die Druckansicht ist ein eigenes Lesemodell und kein Schalter an
`laufZumAbarbeiten`: dort entsteht beim Fuellen der Befehle ein Passwort, und auf
einem Blatt, das jemand abheftet, darf keines stehen. Vom Mitarbeiter holt sie
nur Name, UPN und Abteilung — nicht alles und dann gefiltert.

Der unabhaengige Review fand zwei Blocker, beide im Dashboard: „ueberfaellig“
verglich mit dem Augenblick statt mit dem Tagesbeginn, und der Schnellstart
zaehlte Laeufe fremder Kunden mit. Was „ueberfaellig“ heisst, steht seitdem in
`src/lib/fristen.ts` — eine Regel fuer Lesemodell und Anzeige.

Closes #15

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-25 22:59:02 +02:00
co-authored by Claude Opus 5
parent e7a2e2d5c7
commit 8146e33f48
32 changed files with 4202 additions and 38 deletions
+20
View File
@@ -190,6 +190,26 @@ const SEITEN: readonly Seite[] = [
await tab.waitForURL(/\/t\/LZ-/);
},
},
{ name: "archiv", pfad: "/archiv?suche=Inventar" },
{
/*
* Die Druckansicht braucht einen Lauf, und welcher das ist, weiss nur die
* Datenbank. Also den Weg gehen, den auch ein Mensch geht: von der Laufliste
* aus zum Lauf und von dort auf „Drucken“.
*/
name: "druckansicht",
pfad: "/laeufe",
hell: true,
vorbereiten: async (tab) => {
await tab
.getByRole("link", { name: /NB-001/ })
.first()
.click();
await tab.waitForURL(/\/laeufe\/[^/]+$/);
await tab.getByRole("link", { name: "Drucken" }).click();
await tab.waitForURL(/\/drucken\/lauf\//);
},
},
{ name: "etikett-62x29", pfad: "/drucken/etiketten?layout=etikett", hell: true },
{ name: "etiketten-a4", pfad: "/drucken/etiketten?layout=bogen", hell: true },
];