From b97dee5f7141c1f3d7a6be62762b72657ef45738 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sun, 19 Oct 2025 10:28:53 +1100 Subject: [PATCH 1/6] feat: User submit roadmap ideas --- .../roadmap/TriageSubmissionModal.tsx | 148 ++++++++++++++++++ .../_sites/[site]/roadmap/[roadmap_slug].tsx | 47 +++++- apps/page/pages/api/roadmap/submit-triage.ts | 84 ++++++++++ apps/web/components/roadmap/RoadmapBoard.tsx | 41 +++++ .../web/components/roadmap/TriageItemCard.tsx | 100 ++++++++++++ apps/web/components/roadmap/TriageRow.tsx | 88 +++++++++++ apps/web/components/roadmap/types.ts | 5 + apps/web/pages/api/roadmap/triage/delete.ts | 63 ++++++++ .../pages/api/roadmap/triage/move-to-board.ts | 118 ++++++++++++++ .../pages/[page_id]/roadmap/[board_id].tsx | 9 ++ .../migrations/20_roadmap_triage_items.sql | 30 ++++ packages/supabase/types/index.ts | 45 ++++++ 12 files changed, 770 insertions(+), 8 deletions(-) create mode 100644 apps/page/components/roadmap/TriageSubmissionModal.tsx create mode 100644 apps/page/pages/api/roadmap/submit-triage.ts create mode 100644 apps/web/components/roadmap/TriageItemCard.tsx create mode 100644 apps/web/components/roadmap/TriageRow.tsx create mode 100644 apps/web/pages/api/roadmap/triage/delete.ts create mode 100644 apps/web/pages/api/roadmap/triage/move-to-board.ts create mode 100644 packages/supabase/migrations/20_roadmap_triage_items.sql diff --git a/apps/page/components/roadmap/TriageSubmissionModal.tsx b/apps/page/components/roadmap/TriageSubmissionModal.tsx new file mode 100644 index 0000000..6f03df9 --- /dev/null +++ b/apps/page/components/roadmap/TriageSubmissionModal.tsx @@ -0,0 +1,148 @@ +import { Dialog } from "@headlessui/react"; +import { XIcon } from "@heroicons/react/outline"; +import { useState } from "react"; +import { httpPost } from "../../utils/http"; + +interface TriageSubmissionModalProps { + isOpen: boolean; + onClose: () => void; + boardId: string; + onSuccess?: () => void; +} + +export default function TriageSubmissionModal({ + isOpen, + onClose, + boardId, + onSuccess, +}: TriageSubmissionModalProps) { + const [title, setTitle] = useState(""); + const [description, setDescription] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(""); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsLoading(true); + setError(""); + + try { + await httpPost({ + url: "/api/roadmap/submit-triage", + data: { + board_id: boardId, + title: title.trim(), + description: description.trim() || null, + }, + }); + + setTitle(""); + setDescription(""); + onSuccess?.(); + onClose(); + } catch (err) { + setError( + err instanceof Error + ? err.message + : "Something went wrong. Please try again." + ); + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + if (isLoading) return; + setTitle(""); + setDescription(""); + setError(""); + onClose(); + }; + + return ( + +