From ab15eaa9e7024bffcb31378e5f1a77131f7b9fbc Mon Sep 17 00:00:00 2001 From: JM-Flores Date: Mon, 8 Sep 2025 02:14:56 +0800 Subject: [PATCH 1/4] fix add members modal --- .../kanban_modals/KanbanAddMembersModal.tsx | 65 +++++++++++-------- apps/codebility/app/home/projects/actions.ts | 34 ++++++++++ 2 files changed, 73 insertions(+), 26 deletions(-) diff --git a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx index fe50824a1..91c6abb51 100644 --- a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx +++ b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx @@ -5,6 +5,7 @@ import { usePathname } from "next/navigation"; import { getAllProjects, getMembers, + getProjectByID, getProjectCodevs, getTeamLead, SimpleMemberData, @@ -35,6 +36,7 @@ export default function KanbanAddMembersModal() { const [teamLead, setTeamLead] = useState(null); const [allUsers, setAllUsers] = useState([]); const pathname = usePathname(); + const projectIdFromUrl = pathname?.split("/").slice(-2, -1)[0] || null; const kanbanBoardIdFromUrl = pathname?.split("/").pop() || null; useEffect(() => { @@ -42,45 +44,56 @@ export default function KanbanAddMembersModal() { setIsLoading(true); - const targetProjectId = selectedProject || kanbanBoardIdFromUrl; + // const targetProjectId = selectedProject || kanbanBoardIdFromUrl; - if (!targetProjectId) { - setIsLoading(false); - return; - } + // if (!targetProjectId) { + // setIsLoading(false); + // return; + // } + + setSelectedProject(projectIdFromUrl); const fetchData = async () => { try { setIsLoading(true); - // Fetch project linked to the kanbanBoardId from URL - const result = await getAllProjects(kanbanBoardIdFromUrl ?? undefined); + // // Fetch project linked to the kanbanBoardId from URL + // const result = await getAllProjects(kanbanBoardIdFromUrl ?? undefined); - if (Array.isArray(result) && result.length > 0) { - setProjects(result); + // if (Array.isArray(result) && result.length > 0) { + // setProjects(result); - // Use fetched project ID as selected project - const firstProject = result[0] as { id: string }; - setSelectedProject(firstProject.id); // this is the project.id - } else if (result && typeof result === "object" && "error" in result) { - toast.error(result.error || "Failed to fetch project"); - return; - } + // // Use fetched project ID as selected project + // const firstProject = result[0] as { id: string }; + // setSelectedProject(firstProject.id); // this is the project.id + // } else if (result && typeof result === "object" && "error" in result) { + // toast.error(result.error || "Failed to fetch project"); + // return; + // } + + // const targetProjectId = + // result && + // Array.isArray(result) && + // result[0] && + // typeof result[0] === "object" && + // "id" in result[0] + // ? (result[0] as { id: string }).id + // : undefined; - const targetProjectId = - result && - Array.isArray(result) && - result[0] && - typeof result[0] === "object" && - "id" in result[0] - ? (result[0] as { id: string }).id - : undefined; + // if (!targetProjectId) { + // toast.error("No valid project ID found."); + // return; + // } - if (!targetProjectId) { + if (!projectIdFromUrl) { toast.error("No valid project ID found."); return; } + const targetProjectId = projectIdFromUrl; + + setProjects([await getProjectByID(projectIdFromUrl)]); + const [membersResult, users, teamLeadResult] = await Promise.all([ getMembers(targetProjectId), getProjectCodevs(), @@ -298,4 +311,4 @@ export default function KanbanAddMembersModal() { ); -} \ No newline at end of file +} diff --git a/apps/codebility/app/home/projects/actions.ts b/apps/codebility/app/home/projects/actions.ts index 0f747cd34..d7c98e4ca 100644 --- a/apps/codebility/app/home/projects/actions.ts +++ b/apps/codebility/app/home/projects/actions.ts @@ -708,3 +708,37 @@ export async function getAllProjects(kanbanBoardId?: string) { }; } } + + +export async function getProjectByID(id: string) { + const supabase = await createClientServerComponent(); + + const { data, error } = await supabase + .from("projects") + .select( + ` + *, + project_members ( + id, + codev_id, + role, + joined_at, + codev ( + first_name, + last_name, + image_url + ) + ), + projects_category ( + id, + name + ) + ` + ) + .eq("id", id) + .single(); + + if (error) throw error; + + return data; +} \ No newline at end of file From 37dc1962817cca45e7804c8231b110cc6c2c4657 Mon Sep 17 00:00:00 2001 From: JM-Flores Date: Mon, 8 Sep 2025 02:19:47 +0800 Subject: [PATCH 2/4] clean up comments --- .../kanban_modals/KanbanAddMembersModal.tsx | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx index 91c6abb51..80445495f 100644 --- a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx +++ b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanAddMembersModal.tsx @@ -44,47 +44,12 @@ export default function KanbanAddMembersModal() { setIsLoading(true); - // const targetProjectId = selectedProject || kanbanBoardIdFromUrl; - - // if (!targetProjectId) { - // setIsLoading(false); - // return; - // } - setSelectedProject(projectIdFromUrl); const fetchData = async () => { try { setIsLoading(true); - // // Fetch project linked to the kanbanBoardId from URL - // const result = await getAllProjects(kanbanBoardIdFromUrl ?? undefined); - - // if (Array.isArray(result) && result.length > 0) { - // setProjects(result); - - // // Use fetched project ID as selected project - // const firstProject = result[0] as { id: string }; - // setSelectedProject(firstProject.id); // this is the project.id - // } else if (result && typeof result === "object" && "error" in result) { - // toast.error(result.error || "Failed to fetch project"); - // return; - // } - - // const targetProjectId = - // result && - // Array.isArray(result) && - // result[0] && - // typeof result[0] === "object" && - // "id" in result[0] - // ? (result[0] as { id: string }).id - // : undefined; - - // if (!targetProjectId) { - // toast.error("No valid project ID found."); - // return; - // } - if (!projectIdFromUrl) { toast.error("No valid project ID found."); return; From 52d086f921c918592ac2bf9348da7c0ee444f0e9 Mon Sep 17 00:00:00 2001 From: JM-Flores Date: Mon, 8 Sep 2025 02:41:23 +0800 Subject: [PATCH 3/4] fix add team members on task --- .../[id]/_components/KanbanBoard.tsx | 60 ++++++++++++------- .../kanban_modals/KanbanAddModalMembers.tsx | 12 ++-- .../home/kanban/[projectId]/[id]/actions.ts | 26 ++++---- 3 files changed, 58 insertions(+), 40 deletions(-) diff --git a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanBoard.tsx b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanBoard.tsx index 6731a61bc..b4be11ba9 100644 --- a/apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanBoard.tsx +++ b/apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanBoard.tsx @@ -31,7 +31,7 @@ interface KanbanBoardProps { */ function KanbanBoard({ boardData, projectId }: KanbanBoardProps) { const user = useUserStore((state) => state.user); - + // User permissions - simple boolean checks following YAGNI principle const canAddColumn = user?.role_id === 1 || user?.role_id === 5; const canAddMember = canAddColumn; @@ -61,7 +61,7 @@ function KanbanBoard({ boardData, projectId }: KanbanBoardProps) { imageUrl: user.image_url, isActive: activeFilter === user.id, })), - [allMembers, activeFilter] + [allMembers, activeFilter], ); // Filter handler using useCallback to prevent unnecessary re-renders @@ -80,23 +80,28 @@ function KanbanBoard({ boardData, projectId }: KanbanBoardProps) {
- {/* Three-Level Breadcrumb Navigation */} -
@@ -421,7 +421,7 @@ const TaskEditModal = () => { onMembersChange={(memberIds) => { handleInputChange("sidekick_ids", memberIds); }} - projectId={boardId} + projectId={boardData.project_id} disabledMembers={[data.codev?.id].filter(Boolean)} />
diff --git a/apps/codebility/app/home/kanban/[projectId]/[id]/_services/query.ts b/apps/codebility/app/home/kanban/[projectId]/[id]/_services/query.ts index dd96af474..9a742f7bf 100644 --- a/apps/codebility/app/home/kanban/[projectId]/[id]/_services/query.ts +++ b/apps/codebility/app/home/kanban/[projectId]/[id]/_services/query.ts @@ -15,6 +15,7 @@ export const getBoardData = async (boardId: String) => { description, created_at, updated_at, + project_id, kanban_columns ( id, name,