Files
planer/src/lib/aufgabe-anzeige.ts
T
Florian WildeandClaude Opus 5 3befcc19a3 feat: Aufgaben einzeln zum Spiegeln freigeben
Der Schalter erscheint nur, wo auch gespiegelt wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 23:58:46 +02:00

101 lines
3.1 KiB
TypeScript

import type { AufgabenStatus, AufgabenTyp, Quelle } from '@/generated/prisma/enums'
import {
faelligkeitEinordnen,
faelligkeitText,
istUeberfaellig,
type Faelligkeit,
} from '@/lib/aufgabe'
import { alsDatum, alsTagesschluessel } from '@/lib/zeit'
/**
* Bereitet eine Aufgabe für die Anzeige auf.
*
* Reine Funktion mit dem Zeitpunkt als Parameter: Formatierung und
* Fälligkeitsrechnung passieren serverseitig in Europe/Berlin, damit im
* Browser nichts nachgerechnet wird und alle Listen gleich aussehen.
*/
export type AufgabeRoh = {
id: string
titel: string
notiz: string | null
typ: AufgabenTyp
status: AufgabenStatus
prioritaet: number
aufwandMinuten: number | null
faelligAm: Date | null
quelle: Quelle
quelleUrl: string | null
spiegeln: boolean
bereich: { id: string; name: string; farbe: string } | null
projekt: { id: string; name: string } | null
}
export type AufgabeAnzeige = {
id: string
titel: string
notiz: string | null
typ: AufgabenTyp
status: AufgabenStatus
prioritaet: number
aufwandMinuten: number | null
/** ISO-Datum für das Formularfeld, sonst leer. */
faelligWert: string
/** "heute fällig", "seit 3 Tagen überfällig", "ohne Termin". */
faelligText: string
/** Ausgeschriebenes Datum für den Titelhinweis, sonst null. */
faelligDatum: string | null
faelligkeit: Faelligkeit['art']
ueberfaellig: boolean
quelle: Quelle
quelleUrl: string | null
/** Ausdruecklich zum Spiegeln freigegeben. */
spiegeln: boolean
bereich: { id: string; name: string; farbe: string } | null
projekt: { id: string; name: string } | null
}
/**
* ISO-Datum in Europe/Berlin, passend für ein <input type="date">.
* Der Wert des Feldes ist ein reines Datum ohne Zeitzone, also der Berliner
* Kalendertag — dieselbe Rechnung wie überall sonst im Planer.
*/
function alsDatumswert(zeitpunkt: Date | null): string {
return zeitpunkt ? alsTagesschluessel(zeitpunkt) : ''
}
export function fuerAnzeige(aufgabe: AufgabeRoh, jetzt: Date): AufgabeAnzeige {
const faelligkeit = faelligkeitEinordnen(aufgabe.faelligAm, jetzt)
return {
id: aufgabe.id,
titel: aufgabe.titel,
notiz: aufgabe.notiz,
typ: aufgabe.typ,
status: aufgabe.status,
prioritaet: aufgabe.prioritaet,
aufwandMinuten: aufgabe.aufwandMinuten,
faelligWert: alsDatumswert(aufgabe.faelligAm),
faelligText: faelligkeitText(faelligkeit),
faelligDatum: aufgabe.faelligAm ? alsDatum(aufgabe.faelligAm) : null,
faelligkeit: faelligkeit.art,
ueberfaellig: istUeberfaellig(aufgabe.faelligAm, aufgabe.status, jetzt),
quelle: aufgabe.quelle,
quelleUrl: aufgabe.quelleUrl,
spiegeln: aufgabe.spiegeln,
bereich: aufgabe.bereich,
projekt: aufgabe.projekt,
}
}
/** Wie dringend die Fälligkeit aussieht — steuert die Farbe des Kennzeichens. */
export function faelligkeitFarbe(
anzeige: AufgabeAnzeige,
): 'neutral' | 'warnung' | 'gefahr' {
if (anzeige.ueberfaellig) return 'gefahr'
if (anzeige.faelligkeit === 'heute' || anzeige.faelligkeit === 'morgen') {
return 'warnung'
}
return 'neutral'
}