Hinweis 03-3: Statuswechsel und Filter
Stufe 1: Denkfrage
ALLOWED_TRANSITIONS ist schon da: eine Tabelle, die zu jedem Status sagt, wohin er
wechseln darf. Was muss canTransition("new", "contacted") also nachschauen? Und was ist
der kürzeste Weg, ein Objekt mit nur einem geänderten Feld zu bekommen, ohne das alte zu verändern?
Stufe 2: Teilbeispiel
export function canTransition(from: LeadStatus, to: LeadStatus): boolean {
return ALLOWED_TRANSITIONS[from].includes(to);
}
export function transitionLead(lead: Lead, to: LeadStatus): Lead {
if (!canTransition(lead.status, to)) {
throw new Error(`Statuswechsel von "${lead.status}" nach "${to}" ist nicht erlaubt`);
}
return { ...lead, status: to };
}
Stufe 3: Konkrete Erklärung
{ ...lead, status: to } kopiert alle Felder und überschreibt eines. Das Original bleibt,
und genau das prüft C02-M3-07. Für filterLeads nutzt du leads.filter(...): Es gibt
immer ein neues Array zurück. Ein Lead bleibt drin, wenn (kein Statusfilter oder Status
passt) und (kein Überfällig-Filter oder isOverdue(lead, filter.overdueOn) ist wahr).
Zwei Bedingungen, mit && verbunden. Für die Filterleiste: select mit value={value.status ?? ""}
und einem onChange, das ein neues Filterobjekt an onChange gibt; die Checkbox setzt
overdueOn auf today oder entfernt den Schlüssel.