From ca08ba0a89e658e9c5ce203ddd244cb77daf6f91 Mon Sep 17 00:00:00 2001 From: shubham79a Date: Sat, 11 Apr 2026 09:21:53 +0530 Subject: [PATCH] feat(#347): add bulk document review dialog with shared notes - Replace inline status dropdown in bulk action bar with a "Review Selected" button that opens a confirmation dialog. The dialog lets consultants pick a review status, add optional shared notes, and see the list of selected documents before executing parallel PATCH calls. --- .../(features)/documents/DocumentsTab.tsx | 126 +++++++++++++++--- 1 file changed, 105 insertions(+), 21 deletions(-) diff --git a/app/dashboard/consultant/[consultantId]/(features)/documents/DocumentsTab.tsx b/app/dashboard/consultant/[consultantId]/(features)/documents/DocumentsTab.tsx index 463055b27..bc6f5cee5 100644 --- a/app/dashboard/consultant/[consultantId]/(features)/documents/DocumentsTab.tsx +++ b/app/dashboard/consultant/[consultantId]/(features)/documents/DocumentsTab.tsx @@ -100,6 +100,11 @@ export function DocumentsTab({ const [selectedIds, setSelectedIds] = useState>(new Set()); const [isBulkUpdating, setIsBulkUpdating] = useState(false); + // Bulk review dialog state + const [bulkReviewDialogOpen, setBulkReviewDialogOpen] = useState(false); + const [bulkReviewStatus, setBulkReviewStatus] = useState(""); + const [bulkReviewNotes, setBulkReviewNotes] = useState(""); + // Debounce search input. Search is local to the current page, so we don't // need to reset server-side pagination on every keystroke. useEffect(() => { @@ -183,7 +188,7 @@ export function DocumentsTab({ setSelectedIds(next); }; - const handleBulkStatusUpdate = async (newStatus: string) => { + const handleBulkStatusUpdate = async (newStatus: string, notes?: string) => { if (selectedIds.size === 0) return; setIsBulkUpdating(true); @@ -196,7 +201,10 @@ export function DocumentsTab({ { method: "PATCH", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ reviewStatus: newStatus }), + body: JSON.stringify({ + reviewStatus: newStatus, + reviewNotes: notes?.trim() || null, + }), }, ), ), @@ -206,7 +214,7 @@ export function DocumentsTab({ const failed = results.length - succeeded; toast({ - title: "Bulk Update Complete", + title: "Bulk Review Complete", description: failed ? `${succeeded} updated, ${failed} failed` : `${succeeded} document${succeeded !== 1 ? "s" : ""} updated to ${getStatusLabel(newStatus)}`, @@ -214,6 +222,9 @@ export function DocumentsTab({ }); setSelectedIds(new Set()); + setBulkReviewDialogOpen(false); + setBulkReviewStatus(""); + setBulkReviewNotes(""); onRefresh?.(); } catch { toast({ @@ -408,26 +419,13 @@ export function DocumentsTab({ {selectedIds.size} selected - + {isBulkUpdating ? "Updating..." : "Review Selected"} +