From 24bfcfa421c1ab4ff485469eaa7a298733e8b801 Mon Sep 17 00:00:00 2001 From: Lukas May Date: Wed, 4 Feb 2026 21:08:20 +0100 Subject: [PATCH] feat(17-04): wire initiative dashboard with filter, list, and create dialog Replace placeholder DashboardPage with fully functional initiative dashboard: - Page header with title, status filter dropdown, and New Initiative button - InitiativeList with statusFilter prop for backend-driven filtering - CreateInitiativeDialog controlled by local state - Navigation to /initiatives/$id via TanStack Router useNavigate - All card callbacks wired (view, spawn architect, delete placeholder) --- packages/web/src/routes/initiatives/index.tsx | 81 ++++++++++++++++--- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/packages/web/src/routes/initiatives/index.tsx b/packages/web/src/routes/initiatives/index.tsx index 8d7177f..69faebb 100644 --- a/packages/web/src/routes/initiatives/index.tsx +++ b/packages/web/src/routes/initiatives/index.tsx @@ -1,19 +1,76 @@ -import { createFileRoute } from '@tanstack/react-router' -import { trpc } from '../../lib/trpc' +import { useState } from "react"; +import { createFileRoute, useNavigate } from "@tanstack/react-router"; +import { Plus } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { InitiativeList } from "@/components/InitiativeList"; +import { CreateInitiativeDialog } from "@/components/CreateInitiativeDialog"; -export const Route = createFileRoute('/initiatives/')({ +export const Route = createFileRoute("/initiatives/")({ component: DashboardPage, -}) +}); + +type StatusFilter = "all" | "active" | "completed" | "archived"; + +const filterOptions: { value: StatusFilter; label: string }[] = [ + { value: "all", label: "All" }, + { value: "active", label: "Active" }, + { value: "completed", label: "Completed" }, + { value: "archived", label: "Archived" }, +]; function DashboardPage() { - const health = trpc.health.useQuery() + const navigate = useNavigate(); + const [statusFilter, setStatusFilter] = useState("all"); + const [createDialogOpen, setCreateDialogOpen] = useState(false); + return ( -
-

Initiative Dashboard

-

- Server: {health.data?.status ?? 'connecting...'} -

-

Content coming in Phase 17

+
+ {/* Page header */} +
+

Initiatives

+
+ + +
+
+ + {/* Initiative list */} + setCreateDialogOpen(true)} + onViewInitiative={(id) => + navigate({ to: "/initiatives/$id", params: { id } }) + } + onSpawnArchitect={(_initiativeId, _mode) => { + // Architect spawning is self-contained within SpawnArchitectDropdown + // This callback is available for future toast notifications + }} + onDeleteInitiative={(_id) => { + // Delete is a placeholder (no deleteInitiative tRPC procedure yet) + // ActionMenu handles this internally when implemented + }} + /> + + {/* Create initiative dialog */} +
- ) + ); }