feat(archiv): Uebersicht, Volltextsuche und Druckansicht
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 was merged in pull request #29.
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Was „ueberfaellig“ heisst — an einer Stelle (#015).
|
||||
*
|
||||
* Die Regel steht im Auftrag: **`faelligAm` verstrichen und der Lauf laeuft
|
||||
* noch.** Zwei Feinheiten entscheiden darueber, ob sie stimmt:
|
||||
*
|
||||
* 1. **Verstrichen heisst „vor heute“, nicht „vor jetzt“.** Ein Datumsfeld im
|
||||
* Browser liefert einen Tag, keine Uhrzeit; gespeichert wird daraus
|
||||
* Mitternacht UTC. Verglichen mit dem Augenblick waere ein Lauf, der *heute*
|
||||
* faellig ist, hierzulande ab zwei Uhr morgens „ueberfaellig“ — an dem Tag,
|
||||
* an dem er erledigt werden soll. Wer eine Warnung zweimal umsonst sieht,
|
||||
* liest die dritte nicht mehr (Reviewbefund zu #015).
|
||||
* 2. **Fertig ist nicht ueberfaellig.** Ein abgeschlossener Lauf mit
|
||||
* verstrichenem Datum ist fertig, kein Rueckstand; ein archivierter erst
|
||||
* recht nicht.
|
||||
*
|
||||
* Framework- und datenbankfrei, damit Lesemodell und Anzeige **dieselbe** Grenze
|
||||
* benutzen. Zwei Fassungen derselben Regel laufen auseinander, und dann steht
|
||||
* ein Lauf im Block „Ueberfaellig“ und traegt daneben eine unauffaellige Frist.
|
||||
*/
|
||||
|
||||
/** Mitternacht des Tages, in dem dieser Zeitpunkt liegt – in **lokaler** Zeit. */
|
||||
export function tagesbeginn(zeitpunkt: Date): Date {
|
||||
const beginn = new Date(zeitpunkt);
|
||||
beginn.setHours(0, 0, 0, 0);
|
||||
return beginn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ist diese Frist verstrichen?
|
||||
*
|
||||
* Ohne Frist gibt es nichts zu versaeumen. Der heutige Tag gilt **nicht** als
|
||||
* verstrichen.
|
||||
*/
|
||||
export function fristVerstrichen(faelligAm: Date | null | undefined, jetzt: Date): boolean {
|
||||
return faelligAm !== null && faelligAm !== undefined && faelligAm < tagesbeginn(jetzt);
|
||||
}
|
||||
@@ -48,7 +48,7 @@ export const NAVIGATION: readonly NavEintrag[] = [
|
||||
symbol: "Building2",
|
||||
verfuegbar: true,
|
||||
},
|
||||
{ pfad: "/archiv", beschriftung: "Archiv", symbol: "Archive", verfuegbar: false, ausIssue: 15 },
|
||||
{ pfad: "/archiv", beschriftung: "Archiv", symbol: "Archive", verfuegbar: true },
|
||||
{ pfad: "/admin", beschriftung: "Admin", symbol: "Settings", recht: "verwaltung", verfuegbar: true },
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user