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.
Alles bleibt an manuelle Freigabe gekoppelt.
diff --git a/app/dashboard/settings/page.tsx b/app/dashboard/settings/page.tsx
index 4309962..8d0f5bb 100644
--- a/app/dashboard/settings/page.tsx
+++ b/app/dashboard/settings/page.tsx
@@ -4,7 +4,7 @@ export default function SettingsPage() {
return (
);
}
diff --git a/backlog/tasks/task-4 - Build-the-dashboard-shell-and-lead-funnel.md b/backlog/tasks/task-4 - Build-the-dashboard-shell-and-lead-funnel.md
index 0d86b5f..b9f932a 100644
--- a/backlog/tasks/task-4 - Build-the-dashboard-shell-and-lead-funnel.md
+++ b/backlog/tasks/task-4 - Build-the-dashboard-shell-and-lead-funnel.md
@@ -1,9 +1,10 @@
---
id: TASK-4
title: Build the dashboard shell and lead funnel
-status: To Do
+status: Done
assignee: []
created_date: '2026-06-03 19:12'
+updated_date: '2026-06-04 10:35'
labels:
- mvp
- ui
@@ -13,7 +14,7 @@ dependencies:
references:
- PRD.md
priority: high
-ordinal: 4000
+ordinal: 20000
---
## Description
@@ -24,11 +25,11 @@ Create the internal German-language dashboard shell for the MVP. It should provi
## Acceptance Criteria
-- [ ] #1 Dashboard shell has German navigation for campaigns, leads, audits, analytics, blacklist, and settings
-- [ ] #2 Light/Dark theme toggle works only in the internal dashboard
-- [ ] #3 Kanban/Funnel columns represent the agreed lead states, including Kontakt fehlt, Audit bereit, Freigabe offen, Kontaktiert, Follow-up, and Zurückgestellt
-- [ ] #4 Lead cards show the key scan data: company, niche, location, priority, contact status, and next action
-- [ ] #5 Dashboard remains keyboard accessible and responsive on practical desktop/tablet widths
+- [x] #1 Dashboard shell has German navigation for campaigns, leads, audits, analytics, blacklist, and settings
+- [x] #2 Light/Dark theme toggle works only in the internal dashboard
+- [x] #3 Kanban/Funnel columns represent the agreed lead states, including Kontakt fehlt, Audit bereit, Freigabe offen, Kontaktiert, Follow-up, and Zurückgestellt
+- [x] #4 Lead cards show the key scan data: company, niche, location, priority, contact status, and next action
+- [x] #5 Dashboard remains keyboard accessible and responsive on practical desktop/tablet widths
## Implementation Plan
@@ -40,3 +41,19 @@ Create the internal German-language dashboard shell for the MVP. It should provi
4. Build the Kanban/Funnel view using Convex lead data.
5. Add empty states, loading states, and basic accessibility checks.
+
+## Implementation Notes
+
+
+Started subagent-driven, test-driven implementation for TASK-4. Status model decision: derive required German funnel stages from existing lead/outreach/audit data; no schema migration for this task.
+
+Implemented German dashboard navigation, dashboard-scoped light/dark toggle, Convex-backed derived lead funnel, accessible lead card actions, loading/empty states, and responsive wrapped funnel columns. Verification: pnpm test passed 24/24; pnpm lint passed with only existing generated Convex warnings; pnpm build passed with network allowed for next/font assets. Browser check reached login redirect as expected without an authenticated admin session.
+
+Final Spark review found one listFunnel correctness risk in the bulk outreach lookup. Replaced it with a bounded per-lead indexed latest-outreach lookup so each returned lead preserves its latest outreach state. Re-ran pnpm test, pnpm lint, and pnpm build successfully after the fix.
+
+
+## Final Summary
+
+
+Shipped the German internal dashboard shell with dashboard-scoped light/dark mode, Convex-backed derived lead funnel, accessible responsive lead cards, localized dashboard navigation/placeholders, and verified TASK-4 acceptance criteria. Verification: pnpm test passed 24/24; lint/build were run successfully during implementation with only generated Convex lint warnings noted.
+
diff --git a/components/dashboard-sidebar.tsx b/components/dashboard-sidebar.tsx
index 7d1cbd6..df78cf3 100644
--- a/components/dashboard-sidebar.tsx
+++ b/components/dashboard-sidebar.tsx
@@ -6,6 +6,7 @@ import { LogOut } from "lucide-react";
import { authClient } from "@/lib/auth-client";
import { Button } from "@/components/ui/button";
+import { DashboardThemeToggle } from "@/components/dashboard-theme";
import { dashboardNavigation } from "@/lib/dashboard-navigation";
import { useState } from "react";
import { cn } from "@/lib/utils";
@@ -15,6 +16,7 @@ export function DashboardSidebar() {
const pathname = usePathname();
const router = useRouter();
const [isSigningOut, setIsSigningOut] = useState(false);
+ const [signOutError, setSignOutError] = useState(null);
const { data: session, isPending } = authClient.useSession();
return (
@@ -46,7 +48,7 @@ export function DashboardSidebar() {