From a191b9e844dd2a4ad47e711c421f27bc11c2642d Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Tue, 23 Dec 2025 17:24:07 +0000 Subject: [PATCH] implemented organisations on frontend --- packages/frontend/src/Index.tsx | 139 ++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 33 deletions(-) diff --git a/packages/frontend/src/Index.tsx b/packages/frontend/src/Index.tsx index b440a54..ace5dfd 100644 --- a/packages/frontend/src/Index.tsx +++ b/packages/frontend/src/Index.tsx @@ -1,4 +1,4 @@ -import type { IssueResponse, ProjectResponse, UserRecord } from "@issue/shared"; +import type { IssueResponse, OrganisationResponse, ProjectResponse, UserRecord } from "@issue/shared"; import { useEffect, useRef, useState } from "react"; import { IssueDetailPane } from "@/components/issue-detail-pane"; import { IssuesTable } from "@/components/issues-table"; @@ -12,29 +12,59 @@ function Index() { const user = JSON.parse(localStorage.getItem("user") || "{}") as UserRecord; - const [projectSelectOpen, setProjectSelectOpen] = useState(false); + const organisationsRef = useRef(false); + const [organisations, setOrganisations] = useState([]); + const [organisationSelectOpen, setOrganisationSelectOpen] = useState(false); + const [selectedOrganisation, setSelectedOrganisation] = useState(null); - const [selectedProject, setSelectedProject] = useState(null); const [projects, setProjects] = useState([]); - const projectsRef = useRef(false); + const [projectSelectOpen, setProjectSelectOpen] = useState(false); + const [selectedProject, setSelectedProject] = useState(null); + + const [issues, setIssues] = useState([]); + const [selectedIssue, setSelectedIssue] = useState(null); useEffect(() => { - if (projectsRef.current) return; - projectsRef.current = true; + if (organisationsRef.current) return; + organisationsRef.current = true; - fetch(`${serverURL}/projects/by-creator?creatorId=${user.id}`, { headers: getAuthHeaders() }) + fetch(`${serverURL}/organisation/by-user?userId=${user.id}`, { headers: getAuthHeaders() }) + .then((res) => res.json()) + .then((data: Array) => { + setOrganisations(data); + }) + .catch((err) => { + console.error("error fetching organisations:", err); + }); + }, [user.id]); + + // fetch projects when organisation is selected + useEffect(() => { + setProjects([]); + setSelectedProject(null); + setSelectedIssue(null); + setIssues([]); + if (!selectedOrganisation) { + return; + } + + fetch( + `${serverURL}/projects/by-organisation?organisationId=${selectedOrganisation.Organisation.id}`, + { + headers: getAuthHeaders(), + }, + ) .then((res) => res.json()) .then((data: ProjectResponse[]) => { setProjects(data); }) .catch((err) => { console.error("error fetching projects:", err); + setProjects([]); }); - }, [user.id]); - - const [selectedIssue, setSelectedIssue] = useState(null); - const [issuesData, setIssues] = useState([]); + }, [selectedOrganisation]); + // fetch issues when project is selected useEffect(() => { if (!selectedProject) return; @@ -53,43 +83,86 @@ function Index() { {/* header area */}
+ {/* organisation selection */} - {selectedProject && ( -
- Creator: -
+ + {/* project selection - only shown when organisation is selected */} + {selectedOrganisation && ( + )}
@@ -102,12 +175,12 @@ function Index() {
{/* main body */}
- {selectedProject && issuesData.length > 0 && ( + {selectedProject && issues.length > 0 && ( <> {/* issues list (table) */}