From 63fd2e9b6f46aa1ca81ce358a4aed5cde5844648 Mon Sep 17 00:00:00 2001 From: Johanna Date: Tue, 19 Mar 2024 21:47:16 +0100 Subject: [PATCH 01/76] //fix parse in NewWeeklyReport --- frontend/src/Components/NewWeeklyReport.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/Components/NewWeeklyReport.tsx b/frontend/src/Components/NewWeeklyReport.tsx index ab9084d..1d029c3 100644 --- a/frontend/src/Components/NewWeeklyReport.tsx +++ b/frontend/src/Components/NewWeeklyReport.tsx @@ -54,8 +54,7 @@ export default function NewWeeklyReport(): JSX.Element { type="week" placeholder="Week" onChange={(e) => { - const weekNumber = parseInt(e.target.value.split("-W")[1]); - setWeek(weekNumber); + setWeek(parseInt(e.target.value)); }} onKeyDown={(event) => { const keyValue = event.key; From 1974607fc705fc17165732ff6282bea955cd55b4 Mon Sep 17 00:00:00 2001 From: Johanna Date: Tue, 19 Mar 2024 22:04:20 +0100 Subject: [PATCH 02/76] Formating --- frontend/src/Components/NewWeeklyReport.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Components/NewWeeklyReport.tsx b/frontend/src/Components/NewWeeklyReport.tsx index 1d029c3..4542855 100644 --- a/frontend/src/Components/NewWeeklyReport.tsx +++ b/frontend/src/Components/NewWeeklyReport.tsx @@ -54,7 +54,7 @@ export default function NewWeeklyReport(): JSX.Element { type="week" placeholder="Week" onChange={(e) => { - setWeek(parseInt(e.target.value)); + setWeek(parseInt(e.target.value)); }} onKeyDown={(event) => { const keyValue = event.key; From 54e42cd2a8939647cc1f9837c76ccc0433f0bb9f Mon Sep 17 00:00:00 2001 From: Davenludd Date: Wed, 20 Mar 2024 15:19:09 +0100 Subject: [PATCH 03/76] Add support for week input in Chrome and Edge browsers --- frontend/src/Components/NewWeeklyReport.tsx | 58 +++++++++++++++------ 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/frontend/src/Components/NewWeeklyReport.tsx b/frontend/src/Components/NewWeeklyReport.tsx index 292ddf5..2593782 100644 --- a/frontend/src/Components/NewWeeklyReport.tsx +++ b/frontend/src/Components/NewWeeklyReport.tsx @@ -38,6 +38,7 @@ export default function NewWeeklyReport(): JSX.Element { }; const navigate = useNavigate(); + const isChromeOrEdge = /Chrome|Edg/.test(navigator.userAgent); return ( <> @@ -55,23 +56,48 @@ export default function NewWeeklyReport(): JSX.Element { }} >
- { - const weekNumber = parseInt(e.target.value.split("-W")[1]); - setWeek(weekNumber); - }} - onKeyDown={(event) => { - const keyValue = event.key; - if (!/\d/.test(keyValue) && keyValue !== "Backspace") + {isChromeOrEdge ? ( + { + const weekNumber = parseInt(e.target.value.split("-W")[1]); + setWeek(weekNumber); + }} + onKeyDown={(event) => { + const keyValue = event.key; + if (!/\d/.test(keyValue) && keyValue !== "Backspace") + event.preventDefault(); + }} + onPaste={(event) => { event.preventDefault(); - }} - onPaste={(event) => { - event.preventDefault(); - }} - /> + }} + /> + ) : ( + { + const weekNumber = parseInt(e.target.value); + if (isNaN(weekNumber) || weekNumber < 1 || weekNumber > 53) { + setWeek(0); + return; + } else { + setWeek(weekNumber); + } + }} + onKeyDown={(event) => { + const keyValue = event.key; + if (!/\d/.test(keyValue) && keyValue !== "Backspace") + event.preventDefault(); + }} + onPaste={(event) => { + event.preventDefault(); + }} + /> + )} From caa793d036d24c29820ff23a345a6cd4114d57bd Mon Sep 17 00:00:00 2001 From: Davenludd Date: Wed, 20 Mar 2024 15:32:14 +0100 Subject: [PATCH 04/76] Fix week validation in NewWeeklyReport component for safari and firefox --- frontend/src/Components/NewWeeklyReport.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/frontend/src/Components/NewWeeklyReport.tsx b/frontend/src/Components/NewWeeklyReport.tsx index 2593782..f1ce3f8 100644 --- a/frontend/src/Components/NewWeeklyReport.tsx +++ b/frontend/src/Components/NewWeeklyReport.tsx @@ -45,8 +45,8 @@ export default function NewWeeklyReport(): JSX.Element {
{ - if (week === 0) { - alert("Please enter a week number"); + if (week === 0 || week > 53 || week < 1) { + alert("Please enter a valid week number"); e.preventDefault(); return; } @@ -81,12 +81,7 @@ export default function NewWeeklyReport(): JSX.Element { placeholder="Week (Numbers Only)" onChange={(e) => { const weekNumber = parseInt(e.target.value); - if (isNaN(weekNumber) || weekNumber < 1 || weekNumber > 53) { - setWeek(0); - return; - } else { - setWeek(weekNumber); - } + setWeek(weekNumber); }} onKeyDown={(event) => { const keyValue = event.key; From 8084f722b50f3742fbb50abdf1cf732618a4b36e Mon Sep 17 00:00:00 2001 From: Davenludd Date: Wed, 20 Mar 2024 15:32:30 +0100 Subject: [PATCH 05/76] Fixies in API and component code --- frontend/src/API/API.ts | 15 +++++++++------ .../src/Components/AllTimeReportsInProject.tsx | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frontend/src/API/API.ts b/frontend/src/API/API.ts index ad6ac02..f82be5a 100644 --- a/frontend/src/API/API.ts +++ b/frontend/src/API/API.ts @@ -282,13 +282,16 @@ export const api: API = { token: string, ): Promise> { try { - const response = await fetch(`/api/getWeeklyReportsUser?username=${username}&projectName=${projectName}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Authorization: "Bearer " + token, + const response = await fetch( + `/api/getWeeklyReportsUser?username=${username}&projectName=${projectName}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer " + token, + }, }, - }); + ); if (!response.ok) { return { diff --git a/frontend/src/Components/AllTimeReportsInProject.tsx b/frontend/src/Components/AllTimeReportsInProject.tsx index 26f26cf..354c44b 100644 --- a/frontend/src/Components/AllTimeReportsInProject.tsx +++ b/frontend/src/Components/AllTimeReportsInProject.tsx @@ -15,7 +15,7 @@ function AllTimeReportsInProject(): JSX.Element { const getWeeklyReports = async (): Promise => { const token = localStorage.getItem("accessToken") ?? ""; - const response = await api.getWeeklyReportsForProject( + const response = await api.getWeeklyReportsForUser( localStorage.getItem("username") ?? "", projectName ?? "", token, From 287e97fe6fd200ac758fb2d3bdcf4fe7172be046 Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:24:10 +0100 Subject: [PATCH 06/76] Updated path in main --- frontend/src/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index bac2292..643eb62 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -84,7 +84,7 @@ const router = createBrowserRouter([ element: , }, { - path: "/PMTimeRole", + path: "/PMTimeRole/:projectName", element: , }, { From dd02c2c5c667aa494380514340db3ed34c0e0053 Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:24:38 +0100 Subject: [PATCH 07/76] Brand new TimePerRole component deluxe edition --- frontend/src/Components/TimePerRole.tsx | 141 ++++++++++++++++++ .../ProjectManagerPages/PMTotalTimeRole.tsx | 7 +- 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 frontend/src/Components/TimePerRole.tsx diff --git a/frontend/src/Components/TimePerRole.tsx b/frontend/src/Components/TimePerRole.tsx new file mode 100644 index 0000000..a43e732 --- /dev/null +++ b/frontend/src/Components/TimePerRole.tsx @@ -0,0 +1,141 @@ +import { useState, useEffect } from "react"; +import { useParams } from "react-router-dom"; + +/** + * Renders the component for showing total time per role in a project. + * @returns JSX.Element + */ +export default function TimePerRole(): JSX.Element { + const [PManagerTime, setPManagerTime] = useState(0); + const [SManagerTime, setSManagerTime] = useState(0); + const [DeveloperTime, setDeveloperTime] = useState(0); + const [TesterTime, setTesterTime] = useState(0); + + // const token = localStorage.getItem("accessToken") ?? ""; + // const username = localStorage.getItem("username") ?? ""; + const { projectName } = useParams(); + + // const fetchTimePerRole = async (): Promise => { + // const response = await api.getTimePerRole( + // username, + // projectName ?? "", + // token, + // ); + // { + // if (response.success) { + // const report: TimePerRole = response.data ?? { + // PManagerTime: 0, + // SManagerTime: 0, + // DeveloperTime: 0, + // TesterTime: 0, + // }; + // } else { + // console.error("Failed to fetch weekly report:", response.message); + // } + // } + + interface TimePerRole { + PManager: number; + SManager: number; + Developer: number; + Tester: number; + } + + const fetchWeeklyReport = async (): Promise => { + // Use mock data + const report: TimePerRole = { + PManager: 120, + SManager: 80, + Developer: 200, + Tester: 150, + }; + + // Set the state with the mock data + setPManagerTime(report.PManager); + setSManagerTime(report.SManager); + setDeveloperTime(report.Developer); + setTesterTime(report.Tester); + + await Promise.resolve(); + }; + + useEffect(() => { + void fetchWeeklyReport(); + }); + + return ( + <> +

+ Total Time Per Role In: {projectName}{" "} +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Role + Total Time (min) +
Project Manager + { + event.preventDefault(); + }} + /> +
System Manager + { + event.preventDefault(); + }} + /> +
Administration + { + event.preventDefault(); + }} + /> +
Own Work + { + event.preventDefault(); + }} + /> +
+
+ + + ); +} diff --git a/frontend/src/Pages/ProjectManagerPages/PMTotalTimeRole.tsx b/frontend/src/Pages/ProjectManagerPages/PMTotalTimeRole.tsx index c0161f8..7caea04 100644 --- a/frontend/src/Pages/ProjectManagerPages/PMTotalTimeRole.tsx +++ b/frontend/src/Pages/ProjectManagerPages/PMTotalTimeRole.tsx @@ -1,8 +1,13 @@ import BasicWindow from "../../Components/BasicWindow"; import BackButton from "../../Components/BackButton"; +import TimePerRole from "../../Components/TimePerRole"; function PMTotalTimeRole(): JSX.Element { - const content = <>; + const content = ( + <> + + + ); const buttons = ( <> From 4030031ce9c1c936e31ac5b8a13f0764e3a33a22 Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:36:24 +0100 Subject: [PATCH 08/76] New comp TimePerActivity --- frontend/src/Components/TimePerActivity.tsx | 175 ++++++++++++++++++ .../PMTotalTimeActivity.tsx | 7 +- 2 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 frontend/src/Components/TimePerActivity.tsx diff --git a/frontend/src/Components/TimePerActivity.tsx b/frontend/src/Components/TimePerActivity.tsx new file mode 100644 index 0000000..3dc1a6b --- /dev/null +++ b/frontend/src/Components/TimePerActivity.tsx @@ -0,0 +1,175 @@ +import { useState, useEffect } from "react"; +import { useParams } from "react-router-dom"; + +/** + * Renders the component for showing total time per role in a project. + * @returns JSX.Element + */ +export default function TimePerRole(): JSX.Element { + const [developmentTime, setDevelopmentTime] = useState(); + const [meetingTime, setMeetingTime] = useState(); + const [adminTime, setAdminTime] = useState(); + const [ownWorkTime, setOwnWorkTime] = useState(); + const [studyTime, setStudyTime] = useState(); + const [testingTime, setTestingTime] = useState(); + + // const token = localStorage.getItem("accessToken") ?? ""; + // const username = localStorage.getItem("username") ?? ""; + const { projectName } = useParams(); + + // const fetchTimePerRole = async (): Promise => { + // const response = await api.getTimePerRole( + // username, + // projectName ?? "", + // token, + // ); + // { + // if (response.success) { + // const report: TimePerRole = response.data ?? { + // PManagerTime: 0, + // SManagerTime: 0, + // DeveloperTime: 0, + // TesterTime: 0, + // }; + // } else { + // console.error("Failed to fetch weekly report:", response.message); + // } + // } + + interface TimePerActivity { + developmentTime: number; + meetingTime: number; + adminTime: number; + ownWorkTime: number; + studyTime: number; + testingTime: number; + } + + const fetchTimePerActivity = async (): Promise => { + // Use mock data + const report: TimePerActivity = { + developmentTime: 100, + meetingTime: 200, + adminTime: 300, + ownWorkTime: 50, + studyTime: 75, + testingTime: 110, + }; + + // Set the state with the mock data + setDevelopmentTime(report.developmentTime); + setMeetingTime(report.meetingTime); + setAdminTime(report.adminTime); + setOwnWorkTime(report.ownWorkTime); + setStudyTime(report.studyTime); + setTestingTime(report.testingTime); + + await Promise.resolve(); + }; + + useEffect(() => { + void fetchTimePerActivity(); + }); + + return ( + <> +

+ Total Time Per Activity In: {projectName}{" "} +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Activity + Total Time (min) +
Development + { + event.preventDefault(); + }} + /> +
Meeting + { + event.preventDefault(); + }} + /> +
Administration + { + event.preventDefault(); + }} + /> +
Own Work + { + event.preventDefault(); + }} + /> +
Studies + { + event.preventDefault(); + }} + /> +
Testing + { + event.preventDefault(); + }} + /> +
+
+
+ + ); +} diff --git a/frontend/src/Pages/ProjectManagerPages/PMTotalTimeActivity.tsx b/frontend/src/Pages/ProjectManagerPages/PMTotalTimeActivity.tsx index 676ea28..257a89c 100644 --- a/frontend/src/Pages/ProjectManagerPages/PMTotalTimeActivity.tsx +++ b/frontend/src/Pages/ProjectManagerPages/PMTotalTimeActivity.tsx @@ -1,14 +1,11 @@ import BackButton from "../../Components/BackButton"; import BasicWindow from "../../Components/BasicWindow"; -import TimeReport from "../../Components/NewWeeklyReport"; +import TimePerActivity from "../../Components/TimePerActivity"; function PMTotalTimeActivity(): JSX.Element { const content = ( <> -

- Total Time Per Activity -

- + ); From a3fc71f4bfc0b6131deef705312a45fb2355f912 Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:36:32 +0100 Subject: [PATCH 09/76] Changed path in main --- frontend/src/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 643eb62..c023660 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -80,7 +80,7 @@ const router = createBrowserRouter([ element: , }, { - path: "/PMTimeActivity", + path: "/PMTimeActivity/:projectName", element: , }, { From 0befc4c7d18ae4ff11fb080d8a60b1868da5cf10 Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:36:39 +0100 Subject: [PATCH 10/76] Minor fix --- frontend/src/Components/TimePerRole.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Components/TimePerRole.tsx b/frontend/src/Components/TimePerRole.tsx index a43e732..f62d83a 100644 --- a/frontend/src/Components/TimePerRole.tsx +++ b/frontend/src/Components/TimePerRole.tsx @@ -41,7 +41,7 @@ export default function TimePerRole(): JSX.Element { Tester: number; } - const fetchWeeklyReport = async (): Promise => { + const fetchTimePerRole = async (): Promise => { // Use mock data const report: TimePerRole = { PManager: 120, @@ -60,7 +60,7 @@ export default function TimePerRole(): JSX.Element { }; useEffect(() => { - void fetchWeeklyReport(); + void fetchTimePerRole(); }); return ( From b99de71c38fa7f030bc43b6678f18f4d24c4c98b Mon Sep 17 00:00:00 2001 From: Mattias Date: Wed, 20 Mar 2024 16:41:32 +0100 Subject: [PATCH 11/76] Update links in PMProjectMembers component --- frontend/src/Pages/ProjectManagerPages/PMProjectMembers.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Pages/ProjectManagerPages/PMProjectMembers.tsx b/frontend/src/Pages/ProjectManagerPages/PMProjectMembers.tsx index 11b8636..f7c902e 100644 --- a/frontend/src/Pages/ProjectManagerPages/PMProjectMembers.tsx +++ b/frontend/src/Pages/ProjectManagerPages/PMProjectMembers.tsx @@ -17,7 +17,7 @@ function PMProjectMembers(): JSX.Element { const buttons = ( <> - +