feat: build dashboard lead funnel
This commit is contained in:
@@ -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"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user