feat: build dashboard lead funnel

This commit is contained in:
2026-06-04 12:35:34 +02:00
parent e660ec24aa
commit 07841aea0f
14 changed files with 766 additions and 64 deletions

View File

@@ -3,8 +3,8 @@ import { DashboardPlaceholderPage } from "@/components/dashboard-placeholder-pag
export default function BlacklistPage() {
return (
<DashboardPlaceholderPage
description="Sperrlisten fuer Domains, E-Mails, Telefonnummern, Firmennamen und Place IDs folgen nach den Datenmodellen."
title="Blacklist"
description="Sperrlisten für Domains, E-Mails, Telefonnummern, Firmennamen und Place IDs folgen nach den Datenmodellen."
title="Sperrliste"
/>
);
}

View File

@@ -4,7 +4,7 @@ export default function CampaignsPage() {
return (
<DashboardPlaceholderPage
description="Kampagnen-Konfiguration, PLZ, Radius, Limits und Laufplanung folgen in TASK-5."
title="Campaigns"
title="Kampagnen"
/>
);
}

View File

@@ -2,6 +2,7 @@ import { redirect } from "next/navigation";
import { isAuthenticated } from "@/lib/auth-server";
import { DashboardSidebar } from "@/components/dashboard-sidebar";
import { DashboardThemeProvider } from "@/components/dashboard-theme";
import { getDashboardRedirectPath } from "@/lib/route-guards";
export default async function DashboardLayout({
@@ -17,9 +18,9 @@ export default async function DashboardLayout({
}
return (
<div className="min-h-dvh bg-background md:flex">
<DashboardThemeProvider>
<DashboardSidebar />
<div className="min-w-0 flex-1">{children}</div>
</div>
</DashboardThemeProvider>
);
}

View File

@@ -3,8 +3,8 @@ import { DashboardPlaceholderPage } from "@/components/dashboard-placeholder-pag
export default function OutreachPage() {
return (
<DashboardPlaceholderPage
description="E-Mail-Entwuerfe, Telefon-Skripte und manuelle Versandfreigaben folgen in TASK-13 und TASK-14."
title="Outreach"
description="E-Mail-Entwürfe, Telefon-Skripte und manuelle Versandfreigaben folgen in TASK-13 und TASK-14."
title="Review"
/>
);
}

View File

@@ -1,9 +1,9 @@
import {
dashboardKpis,
pipelineHealth,
pipelineStages,
reviewQueue,
} from "@/lib/dashboard-model";
import { LeadFunnelBoard } from "@/components/lead-funnel-board";
export default function DashboardPage() {
return (
@@ -15,16 +15,14 @@ export default function DashboardPage() {
Interner Arbeitsbereich
</p>
<h1 className="mt-2 text-3xl font-semibold tracking-normal">
Pipeline-Uebersicht
Pipeline-Übersicht
</h1>
<p className="mt-2 max-w-2xl text-sm leading-6 text-muted-foreground">
Recherche, Audit-Freigabe und Outreach bleiben eng gekoppelt:
wenige gute Leads, manuelle Pruefung, kein automatischer Versand.
wenige gute Leads, manuelle Prüfung, kein automatischer Versand.
</p>
</div>
<p className="text-sm font-medium text-muted-foreground">
Mock-Session aktiv
</p>
<p className="text-sm font-medium text-muted-foreground">MVP intern</p>
</header>
<section className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
@@ -44,36 +42,13 @@ export default function DashboardPage() {
))}
</section>
<section className="grid gap-3 xl:grid-cols-4">
{pipelineStages.map((stage) => {
const Icon = stage.icon;
return (
<article
className="rounded-lg border bg-card p-4 text-card-foreground"
key={stage.title}
>
<div className="flex items-center justify-between gap-4">
<Icon className="size-5 text-muted-foreground" />
<span className="text-2xl font-semibold">{stage.count}</span>
</div>
<h2 className="mt-4 text-sm font-medium">{stage.title}</h2>
<p className="mt-2 text-sm leading-6 text-muted-foreground">
{stage.description}
</p>
<p className="mt-4 rounded-md bg-muted px-2 py-1 text-xs text-muted-foreground">
{stage.meta}
</p>
</article>
);
})}
</section>
<LeadFunnelBoard />
<section className="grid gap-3 lg:grid-cols-[1.45fr_0.55fr]">
<div className="rounded-lg border bg-card text-card-foreground">
<div className="border-b p-4">
<h2 className="text-base font-semibold tracking-normal">
Naechste Review-Schritte
Nächste Review-Schritte
</h2>
<p className="mt-1 text-sm leading-6 text-muted-foreground">
Alles bleibt an manuelle Freigabe gekoppelt.

View File

@@ -4,7 +4,7 @@ export default function SettingsPage() {
return (
<DashboardPlaceholderPage
description="Provider-Status, Secrets-Hinweise und Workspace-Einstellungen folgen mit den Integrationen."
title="Settings"
title="Einstellungen"
/>
);
}