// Was auf der Übersicht als „anstehend" gilt — Zeitraum und Art. // // Die Auswahl steht in der Adresse, nicht im Browser: die Übersicht wird auf // dem Server gebaut, und ein Zeitraum von 90 statt 60 Tagen bringt Zeilen ins // Spiel, die im Browser gar nicht liegen. Nebenbei lässt sich eine so // eingestellte Seite verschicken und wiederfinden. export const ZEITRAEUME = [30, 60, 90, 180] as const; export type Zeitraum = (typeof ZEITRAEUME)[number]; export const STANDARD_ZEITRAUM: Zeitraum = 60; export const ANSTEHEND_ARTEN = [ { value: "hire", label: "Eintritt" }, { value: "exit", label: "Austritt" }, { value: "return", label: "Rückkehr" }, { value: "note", label: "Wiedervorlage" }, ] as const; export type AnstehendArt = (typeof ANSTEHEND_ARTEN)[number]["value"]; const ALLE_ARTEN: AnstehendArt[] = ANSTEHEND_ARTEN.map((a) => a.value); /** Alles, was nicht in der Liste steht, führt auf den Standard zurück. */ export function parseZeitraum(wert: string | undefined): Zeitraum { const zahl = Number(wert); return (ZEITRAEUME as readonly number[]).includes(zahl) ? (zahl as Zeitraum) : STANDARD_ZEITRAUM; } /** * Keine Angabe heisst „alle" — nicht „keine". Wer die Übersicht aufruft, ohne * etwas auszuwählen, will alles sehen; eine leere Karte wäre die falsche * Antwort auf eine nicht gestellte Frage. Aus demselben Grund führt auch eine * Auswahl, in der nur Unbekanntes steht, zurück auf alle. */ export function parseArten(wert: string | undefined): AnstehendArt[] { const gewaehlt = (wert ?? "") .split(",") .map((s) => s.trim()) .filter((s): s is AnstehendArt => (ALLE_ARTEN as string[]).includes(s)); return gewaehlt.length > 0 ? gewaehlt : ALLE_ARTEN; } /** Steht in der Adresse etwas anderes als der Standard? */ export function istEingeschraenkt(zeitraum: Zeitraum, arten: AnstehendArt[]): boolean { return zeitraum !== STANDARD_ZEITRAUM || arten.length !== ALLE_ARTEN.length; }