Hinweis 03-3: Statuswechsel und Filter

Stufe 1 zuerst lesen, dann selbst probieren. Die nächste Stufe erst, wenn du nach zwei Versuchen feststeckst.

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.

Zurück zu Mission 3: Daten und Regeln beherrschen