diff --git a/apps/page/pages/_sites/[site]/roadmap/[roadmap_slug].tsx b/apps/page/pages/_sites/[site]/roadmap/[roadmap_slug].tsx index 9e87aa7..a84f281 100644 --- a/apps/page/pages/_sites/[site]/roadmap/[roadmap_slug].tsx +++ b/apps/page/pages/_sites/[site]/roadmap/[roadmap_slug].tsx @@ -260,10 +260,10 @@ export default function RoadmapPage({ handleVote(item.id); }} disabled={votingItems.has(item.id)} - className={`flex items-center text-xs px-2 py-1 rounded transition-colors ${ + className={`flex items-center text-xs px-2 py-1 rounded border transition-colors ${ votes[item.id]?.voted - ? "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200" - : "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600" + ? "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 border-blue-300 dark:border-blue-700" + : "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600 border-gray-200 dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-500" } ${ votingItems.has(item.id) ? "opacity-50 cursor-not-allowed" @@ -420,10 +420,10 @@ export default function RoadmapPage({ disabled={ !selectedItem || votingItems.has(selectedItem.id) } - className={`flex items-center text-sm px-3 py-1.5 rounded-lg transition-colors ${ + className={`flex items-center text-sm px-3 py-1.5 rounded-lg border transition-colors ${ selectedItem && votes[selectedItem.id]?.voted - ? "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200" - : "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600" + ? "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 border-blue-300 dark:border-blue-700" + : "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600 border-gray-200 dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-500" } ${ !selectedItem || votingItems.has(selectedItem.id) ? "opacity-50 cursor-not-allowed" diff --git a/apps/web/components/roadmap/RoadmapItem.tsx b/apps/web/components/roadmap/RoadmapItem.tsx index 905d664..002ed7a 100644 --- a/apps/web/components/roadmap/RoadmapItem.tsx +++ b/apps/web/components/roadmap/RoadmapItem.tsx @@ -86,7 +86,7 @@ export default function RoadmapItem({ )} -
+
{ + const handleUpdateCategory = async (categoryId: string) => { if (!categoryToEdit.trim() || !isPageOwner) return; try { @@ -355,7 +360,7 @@ export default function BoardSettings({ } }; - const handleDeleteCategory = async (categoryId) => { + const handleDeleteCategory = async (categoryId: string) => { // Check if category has items try { const { data: itemsWithCategory, error: checkError } = await supabase @@ -438,7 +443,7 @@ export default function BoardSettings({ } }; - const handleUpdateColumn = async (columnId) => { + const handleUpdateColumn = async (columnId: string) => { if (!columnToEdit.trim() || !isPageOwner) return; try { @@ -478,7 +483,7 @@ export default function BoardSettings({ } }; - const handleDeleteColumn = async (columnId) => { + const handleDeleteColumn = async (columnId: string) => { // Check if stage has items try { const { data: itemsInColumn, error: checkError } = await supabase @@ -607,6 +612,38 @@ export default function BoardSettings({ setDragOverIndex(null); }; + // Delete board function + const handleDeleteBoard = async () => { + if (!isPageOwner) return; + + setIsDeletingBoard(true); + try { + const { error } = await supabase + .from("roadmap_boards") + .delete() + .eq("id", board.id) + .eq("page_id", page_id); + + if (error) throw error; + + // Create audit log for board deletion + await createAuditLog(supabase, { + page_id: page_id, + actor_id: user.id, + action: `Deleted Roadmap Board: ${board.title}`, + changes: { board: board }, + }); + + // Redirect to roadmap list + router.push(`/pages/${page_id}/roadmap`); + } catch (error) { + console.error("Error deleting board:", error); + alert("Failed to delete board"); + setIsDeletingBoard(false); + } + setShowDeleteDialog(false); + }; + if (!page_id || !board || !isPageOwner) { return
Access denied
; } @@ -767,7 +804,15 @@ export default function BoardSettings({ />
-
+
+
+ + {/* Delete Board Confirmation Dialog */} + ); } diff --git a/packages/supabase/migrations/18_roadmap.sql b/packages/supabase/migrations/18_roadmap.sql index 28d2ae7..7c13fc8 100644 --- a/packages/supabase/migrations/18_roadmap.sql +++ b/packages/supabase/migrations/18_roadmap.sql @@ -111,32 +111,6 @@ alter table roadmap_votes add constraint unique_item_visitor unique (item_id, vi alter table roadmap_votes enable row level security; --- Function to get vote count for roadmap items -CREATE OR REPLACE FUNCTION roadmap_item_votes_count(itemid uuid) -RETURNS bigint -AS $$ -BEGIN - RETURN ( - SELECT COUNT(*) - FROM roadmap_votes - WHERE item_id = itemid - ); -END; -$$ LANGUAGE 'plpgsql'; - --- Function to check if a visitor has voted for an item -CREATE OR REPLACE FUNCTION roadmap_item_has_voted(itemid uuid, visitorid uuid) -RETURNS boolean -AS $$ -BEGIN - RETURN EXISTS ( - SELECT 1 - FROM roadmap_votes - WHERE item_id = itemid AND visitor_id = visitorid - ); -END; -$$ LANGUAGE 'plpgsql'; - -- Function to initialize default columns for a roadmap board CREATE OR REPLACE FUNCTION initialize_roadmap_columns(board_id uuid) RETURNS void