feat: Interviews, Mail-Papierkorb, Kontaktart

Drei Aenderungen aus dem Alltagsgebrauch:

- Der Kalender heisst jetzt "Interviews" - dafuer wird er benutzt. Der Wert in
  ViewState wandert mit, damit Menue und Kopfzeile nicht auseinanderlaufen.
  Sichtbare Reste ("Kalenderfarbe") heissen jetzt Terminfarbe.

- Mails haben einen Papierkorb, der unter dem Menuepunkt aufklappt. Loeschen
  heisst dabei ausschliesslich: im CRM. Im Postfach crm@perinco.de bleibt die
  Mail unberuehrt - Schreibrechte darauf hat die Anwendung nicht. Damit der
  Delta-Abgleich geloeschte Mails nicht wieder einliest, bleibt nach dem Leeren
  eine leere Zeile als Merker stehen (crm_purged); runMailSync() ueberspringt
  alles, was im CRM geloescht ist. Zurueckholen und Leeren darf jeder
  Angemeldete, Leeren nach einer Warnung.

- Der Kontaktstatus (Neu .. Verloren) wird zur Kontaktart: Recruiter, Partner,
  Endkunde. Die Spalte heisst jetzt kind, weil "Status" das Feld falsch
  benannte. migrateLeadKind() stellt bestehende Datenbanken um und setzt alle
  vorhandenen Kontakte auf Recruiter - welche Art jemand ist, sagt der alte
  Status nicht (so mit dem Nutzer entschieden).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-08-18 11:12:49 +02:00
co-authored by Claude Opus 5
parent 025390e18a
commit 8741a9ae0c
39 changed files with 719 additions and 199 deletions
+3 -3
View File
@@ -11,7 +11,7 @@ import {
type SimulationLinkDatum,
type SimulationNodeDatum,
} from 'd3-force';
import { STATUS_COLORS } from './leadUi';
import { KIND_COLORS } from './leadUi';
import { connectionsApi } from '../../lib/api';
import { useToast } from '../Toast';
import {
@@ -134,7 +134,7 @@ export const LeadNetwork: React.FC<LeadNetworkProps> = ({
leadId: lead.id,
label: leadFullName(lead),
sublabel: lead.company || lead.position || '',
color: STATUS_COLORS[lead.status],
color: KIND_COLORS[lead.kind],
degree: deg,
radius: 14 + Math.min(deg, 8) * 1.8,
avatar: lead.avatar,
@@ -875,7 +875,7 @@ export const LeadNetwork: React.FC<LeadNetworkProps> = ({
<div className="flex items-start gap-3">
<span
className="mt-1 h-3 w-3 shrink-0 rounded-full"
style={{ backgroundColor: STATUS_COLORS[selectedLead.status] }}
style={{ backgroundColor: KIND_COLORS[selectedLead.kind] }}
/>
<div className="min-w-0">
<h3 className="truncate text-base text-ink-900">{leadFullName(selectedLead)}</h3>