From 574800e5a994464f3135f697a53fd26a3bed5d0e Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 6 Feb 2026 02:17:32 +0530 Subject: [PATCH] feat: enhance BoardApprovalsPanel with detailed approval views and chart integration --- .../app/boards/[boardId]/approvals/page.tsx | 45 ++ frontend/src/app/boards/[boardId]/page.tsx | 45 +- .../src/components/BoardApprovalsPanel.tsx | 737 ++++++++++++------ frontend/src/components/charts/chart.tsx | 501 ++++++++++++ .../src/components/molecules/TaskCard.tsx | 2 - .../src/components/organisms/TaskBoard.tsx | 9 +- 6 files changed, 1038 insertions(+), 301 deletions(-) create mode 100644 frontend/src/app/boards/[boardId]/approvals/page.tsx create mode 100644 frontend/src/components/charts/chart.tsx diff --git a/frontend/src/app/boards/[boardId]/approvals/page.tsx b/frontend/src/app/boards/[boardId]/approvals/page.tsx new file mode 100644 index 0000000..a362a64 --- /dev/null +++ b/frontend/src/app/boards/[boardId]/approvals/page.tsx @@ -0,0 +1,45 @@ +"use client"; + +import { useParams } from "next/navigation"; + +import { SignInButton, SignedIn, SignedOut } from "@clerk/nextjs"; + +import { BoardApprovalsPanel } from "@/components/BoardApprovalsPanel"; +import { DashboardSidebar } from "@/components/organisms/DashboardSidebar"; +import { DashboardShell } from "@/components/templates/DashboardShell"; +import { Button } from "@/components/ui/button"; + +export default function BoardApprovalsPage() { + const params = useParams(); + const boardIdParam = params?.boardId; + const boardId = Array.isArray(boardIdParam) ? boardIdParam[0] : boardIdParam; + + return ( + + +
+

Sign in to view approvals.

+ + + +
+
+ + +
+
+ {boardId ? ( +
+ +
+ ) : null} +
+
+
+
+ ); +} diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index ebb1f40..1cdf9ad 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -7,7 +7,6 @@ import { SignInButton, SignedIn, SignedOut, useAuth } from "@clerk/nextjs"; import { MessageSquare, Pencil, Settings, X } from "lucide-react"; import ReactMarkdown from "react-markdown"; -import { BoardApprovalsPanel } from "@/components/BoardApprovalsPanel"; import { DashboardSidebar } from "@/components/organisms/DashboardSidebar"; import { TaskBoard } from "@/components/organisms/TaskBoard"; import { DashboardShell } from "@/components/templates/DashboardShell"; @@ -157,7 +156,6 @@ export default function BoardDetailPage() { const approvalsRef = useRef([]); const agentsRef = useRef([]); const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); - const [isApprovalsOpen, setIsApprovalsOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [approvals, setApprovals] = useState([]); @@ -172,6 +170,7 @@ export default function BoardDetailPage() { const [isChatSending, setIsChatSending] = useState(false); const [chatError, setChatError] = useState(null); const chatMessagesRef = useRef([]); + const chatEndRef = useRef(null); const [isDeletingTask, setIsDeletingTask] = useState(false); const [deleteTaskError, setDeleteTaskError] = useState(null); const [viewMode, setViewMode] = useState<"board" | "list">("board"); @@ -303,6 +302,14 @@ export default function BoardDetailPage() { chatMessagesRef.current = chatMessages; }, [chatMessages]); + useEffect(() => { + if (!isChatOpen) return; + const timeout = window.setTimeout(() => { + chatEndRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }); + }, 50); + return () => window.clearTimeout(timeout); + }, [chatMessages, isChatOpen]); + const loadApprovals = useCallback(async () => { if (!isSignedIn || !boardId) return; setIsApprovalsLoading(true); @@ -1433,7 +1440,7 @@ export default function BoardDetailPage() { @@ -1926,33 +1931,6 @@ export default function BoardDetailPage() { - - - - Approvals - - Review pending decisions from your lead agent. - - - {boardId ? ( -
- -
- ) : null} -
-
-