Files
AkeshanandClaude Opus 4.8 d8b6772148 Interim-UI-Handover: 55 Vorschau-Screens fuer David (AD-28)
Uebergabe der Dev-Interim-Screens aus HiveGrid-Cloud an den Wireframes-Vault.
INDEX + 7 Domaenen-Seiten (CRM, Leads, HR, Files/Tasks, Audit/Notifications,
Integrations, Auth/RBAC) mit je Screen: D-*-Ziel, Archetyp, Route, VM,
benoetigte ~/ui-Elemente, Actions, States. Layout bleibt Davids freie Hand.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 17:35:12 +02:00

84 lines
6.8 KiB
Markdown

# P07 · Leads (R-P7 → D-P7)
> Interim-UI-Referenz (AD-28). Lauffähige `<X>Page`-Vorschau-Screens aus `~/ui` (VM als Prop) im gebundelten
> `03 Quellen und Referenzen/hivegrid-cloud/`-Checkout. **Layout = Davids freie Hand** — Listen nennen nur
> Elemente/Daten/Aktionen.
### LeadInboxPage · D-P7 „Lead-Inbox" (Archetyp A2 + Triage)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadInboxPage.tsx`
- **Route(n):** `/:tenant/leads` (`routes/app.$tenant/leads._index.tsx`)
- **Daten (VM):** `LeadListVM` — `packages/view-models/src/leads/lead-list.vm.ts`
- **Benötigte UI-Elemente (KEIN Layout):** BadgeFeedback, Button, Checkbox, EmptyState, Select, Table, TextInput · Icons: FeatherBarChart2, FeatherPlus
- **Interaktionen (Actions):** onApplyFilter(query: LeadListQuery), onSetStatus(leadId, status), onBulkStatus(leadIds[], status), onNextPage(), onNew(), onStatistics(); zusätzliche Datenpunkte: Filter (Suche/Quelle/Spam ausblenden/Converted zeigen), Bulk-Status-Select, Zeilen-Marker (duplicate/spam/converted), Per-Zeile Qualify/Spam, „nächste Seite", SSE-Realtime-Hint (`sseHref`), Admin-Quicklinks (sourcesHref/antiSpamHref)
- **States:** Empty (EmptyState — leere Liste `emptyHeadlineKey`/`emptyBodyKey`; Modul-off = `leads.list.locked`) / Loading (synchron im Loader, kein Spinner; `submitting`-Flag an Bulk-Button) / Permission-Denied (404 auf Route bei fehlendem `leads.read_own`)
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen:
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev:
### LeadDetailPage · D-P7 „Lead-Detail" (Archetyp A3) + „Lead → Projekt" (A5)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadDetailPage.tsx`
- **Route(n):** `/:tenant/leads/:id` (`routes/app.$tenant/leads.$id.tsx`)
- **Daten (VM):** `LeadDetailVM` — `packages/view-models/src/leads/lead-detail.vm.ts`
- **Benötigte UI-Elemente (KEIN Layout):** BadgeFeedback, Breadcrumbs, Button, Card, Select, TextArea, TextInput · Icons: keine
- **Interaktionen (Actions):** onSubmit(intent, fields?) — Intents: `update` (Stammdaten vorname/nachname/email/telefon/message/freigabe), `setStatus` (status), `convert` (kontaktId → Lead→Projekt, kein Modal-Zwang); Anzeige: Status-/Marker-Badges, Spam-Score+Reason, DSGVO-Auto-Delete-Hinweis, „konvertiert"-Badge
- **States:** Empty (kein Data → leerer Container-Shell) / Loading (synchron; `submitting` an Save/Convert) / Permission-Denied (404 auf Route; Schreibfelder via `canWrite` disabled)
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen: (Pipeline-/Start-Status-Auswahl beim Convert ist getrackter design-nachzug — Backend nimmt nur projektId/kontaktId)
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev:
### LeadNewPage · D-P7 „Manueller Lead-Eintrag" (Archetyp A4)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadNewPage.tsx`
- **Route(n):** `/:tenant/leads/new` (`routes/app.$tenant/leads.new.tsx`)
- **Daten (VM):** kein `@hivegrid/view-models`-VM — lokaler Formular-Draft `LeadNewFields` (quelle, vorname, nachname, email, telefon, message)
- **Benötigte UI-Elemente (KEIN Layout):** BadgeFeedback, Breadcrumbs, Button, Card, Select, TextArea, TextInput · Icons: keine
- **Interaktionen (Actions):** onCreate(fields: LeadNewFields); Submit disabled bis mind. ein Identitätsfeld gefüllt (`hasIdentity`)
- **States:** Empty (n/a — reines Formular) / Loading (`submitting` an Submit-Button) / Permission-Denied (404 auf Route); Fehler via `errorKey`-Badge
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen:
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev:
### LeadStatisticsPage · D-P7 „Lead-Statistiken" (Archetyp A2 + KPI-Kit)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadStatisticsPage.tsx`
- **Route(n):** `/:tenant/leads/statistics` (`routes/app.$tenant/leads.statistics.tsx`)
- **Daten (VM):** `LeadStatisticsVM` — `packages/view-models/src/leads/lead-statistics.vm.ts`
- **Benötigte UI-Elemente (KEIN Layout):** Breadcrumbs, Card, StatsCard · Icons: FeatherInbox
- **Interaktionen (Actions):** keine Callbacks (read-only); Navigation zurück via `listHref`; Datenpunkte: KPI-Kacheln (`kpis`), Aufschlüsselung nach Quelle (`byQuelle`) und Status (`byStatus`)
- **States:** Empty (kein Data → leerer Container-Shell; keine dedizierte EmptyState-Komponente) / Loading (synchron im Loader) / Permission-Denied (404 auf Route)
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen: (reichere Breakdowns — Reaktionszeit, per-Owner, Wochentag, Trend-Charts — noch nicht vom Service geliefert, getrackter design-nachzug)
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev:
### LeadSourcesAdminPage · D-P7 „Quellen-Verwaltung" (Archetyp A2/A6)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadSourcesAdminPage.tsx`
- **Route(n):** `/:tenant/admin/lead-sources` (`routes/app.$tenant/admin.lead-sources.tsx`)
- **Daten (VM):** `LeadSourceAdminVM` — `packages/view-models/src/leads/lead-source-admin.vm.ts`
- **Benötigte UI-Elemente (KEIN Layout):** BadgeFeedback, Button, Card, EmptyState, Table, TextInput · Icons: keine
- **Interaktionen (Actions):** onUpsert(input: {key, name, displayLabel}); Tabelle mit Typ-Badge, Paused-/Webhook-Status-Badges (Token nur als „vorhanden ja/nein", da gehasht); Create-Card via `canWrite`
- **States:** Empty (EmptyState `leads.sources.empty`) / Loading (`submitting` an Save-Button) / Permission-Denied (404 auf Route; Create-Card nur bei `canWrite`)
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen:
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev:
### LeadAntiSpamAdminPage · D-P7 „Anti-Spam-Settings" (Archetyp A6)
- **Interim-Screen:** `apps/web/app/components/screens/leads/LeadAntiSpamAdminPage.tsx`
- **Route(n):** `/:tenant/admin/lead-anti-spam` (`routes/app.$tenant/admin.lead-anti-spam.tsx`)
- **Daten (VM):** `LeadAntiSpamVM` — `packages/view-models/src/leads/lead-anti-spam.vm.ts`
- **Benötigte UI-Elemente (KEIN Layout):** BadgeFeedback, Button, Card, Checkbox, Select, TextInput · Icons: keine
- **Interaktionen (Actions):** onSave(input: LeadAntiSpamSaveInput) — mode (quarantine/spam), perSourcePerHourLimit, perIpPerHourLimit, anomalySpikeFactor, lostAutoDeleteDays, + Toggles disposableDomainEnabled/honeypotEnabled/fastSubmitEnabled (als „on")
- **States:** Empty (kein Data → leerer Container-Shell) / Loading (`submitting` an Save-Button) / Permission-Denied (404 auf Route)
- **Davids Delta (offen):**
- [ ] Überschriebene/geänderte Spec-Punkte:
- [ ] Neue UI/UX-Entscheidungen:
- [ ] Subframe-Screen-Link(s):
- [ ] Offene Fragen an Dev: