From 63fd2e9b6f46aa1ca81ce358a4aed5cde5844648 Mon Sep 17 00:00:00 2001 From: Johanna Date: Tue, 19 Mar 2024 21:47:16 +0100 Subject: [PATCH 001/313] //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 002/313] 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 7b78767f5016251fe1d47feecc4c56385526fec5 Mon Sep 17 00:00:00 2001 From: al8763be Date: Wed, 20 Mar 2024 01:14:30 +0100 Subject: [PATCH 003/313] restore --- frontend/src/API/API.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/API/API.ts b/frontend/src/API/API.ts index fc2367b..6a52fb8 100644 --- a/frontend/src/API/API.ts +++ b/frontend/src/API/API.ts @@ -4,6 +4,7 @@ import { User, Project, NewProject, + WeeklyReport, } from "../Types/goTypes"; // This type of pattern should be hard to misuse @@ -49,9 +50,10 @@ interface API { token: string, ): Promise>; getWeeklyReportsForProject( + username: string, projectName: string, token: string, - ): Promise>; + ): Promise>; /** Gets all the projects of a user*/ getUserProjects(token: string): Promise>; /** Gets a project from id*/ @@ -272,15 +274,19 @@ export const api: API = { } }, - async getWeeklyReportsForProject(projectName: string, token: string) { + async getWeeklyReportsForProject( + username: string, + projectName: string, + token: string, + ) { try { - const response = await fetch("/api/getWeeklyReportsForProject", { + const response = await fetch("/api/getWeeklyReportsUser", { method: "GET", headers: { "Content-Type": "application/json", Authorization: "Bearer " + token, }, - body: JSON.stringify({ projectName }), + body: JSON.stringify({ username, projectName }), }); if (!response.ok) { @@ -289,7 +295,7 @@ export const api: API = { message: "Failed to get weekly reports for project", }; } else { - const data = (await response.json()) as NewWeeklyReport[]; + const data = (await response.json()) as WeeklyReport[]; return { success: true, data }; } } catch (e) { From a5adec82e24b959af3d9c0982e66f94987fe4d20 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Wed, 20 Mar 2024 11:51:04 +0100 Subject: [PATCH 004/313] Modul for showing projectinfo *not finished* --- frontend/src/Components/ProjectInfoModal.tsx | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 frontend/src/Components/ProjectInfoModal.tsx diff --git a/frontend/src/Components/ProjectInfoModal.tsx b/frontend/src/Components/ProjectInfoModal.tsx new file mode 100644 index 0000000..11d29c1 --- /dev/null +++ b/frontend/src/Components/ProjectInfoModal.tsx @@ -0,0 +1,44 @@ +import Button from "./Button"; + +function UserInfoModal(props: { + isVisible: boolean; + projectname: string; + onClose: () => void; +}): JSX.Element { + if (!props.isVisible) return <>; + + return ( +
+
+

{props.projectname}

+
+

+ Members of this project: +

+
{/*Show all members in project*/}
+
+
+
+
+
+ ); +} + +export default UserInfoModal; From e271794b57faf12b1635ddc6fde73adcb5784196 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Wed, 20 Mar 2024 11:51:50 +0100 Subject: [PATCH 005/313] List for showing all projects as admin --- frontend/src/Components/ProjectListAdmin.tsx | 56 ++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 frontend/src/Components/ProjectListAdmin.tsx diff --git a/frontend/src/Components/ProjectListAdmin.tsx b/frontend/src/Components/ProjectListAdmin.tsx new file mode 100644 index 0000000..dbc7403 --- /dev/null +++ b/frontend/src/Components/ProjectListAdmin.tsx @@ -0,0 +1,56 @@ +import { useState } from "react"; +import { NewProject } from "../Types/goTypes"; +import ProjectInfoModal from "./ProjectInfoModal"; + +/** + * A list of projects for admin manage projects page, that sets an onClick + * function for eact project
  • element, which displays a modul with + * user info. + * @param props - An array of projects to display + * @returns {JSX.Element} The project list + * @example + * const projects: NewProject[] = [{ name: "Project", description: "New" }]; + * return + */ + +export function ProjectListAdmin(props: { + projects: NewProject[]; +}): JSX.Element { + const [modalVisible, setModalVisible] = useState(false); + const [projectname, setProjectname] = useState(""); + + const handleClick = (username: string): void => { + setProjectname(username); + setModalVisible(true); + }; + + const handleClose = (): void => { + setProjectname(""); + setModalVisible(false); + }; + + return ( + <> + +
    +
      + {props.projects.map((project) => ( +
    • { + handleClick(project.name); + }} + > + {project.name} +
    • + ))} +
    +
    + + ); +} From 6317c7674c0957a9b3eed01d7ade1143a57b38c7 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Wed, 20 Mar 2024 11:53:27 +0100 Subject: [PATCH 006/313] Now uses projectListAdmin to show projects --- .../src/Pages/AdminPages/AdminManageProjects.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/frontend/src/Pages/AdminPages/AdminManageProjects.tsx b/frontend/src/Pages/AdminPages/AdminManageProjects.tsx index 177f55b..14e44be 100644 --- a/frontend/src/Pages/AdminPages/AdminManageProjects.tsx +++ b/frontend/src/Pages/AdminPages/AdminManageProjects.tsx @@ -2,9 +2,20 @@ import { Link } from "react-router-dom"; import BackButton from "../../Components/BackButton"; import BasicWindow from "../../Components/BasicWindow"; import Button from "../../Components/Button"; +import { ProjectListAdmin } from "../../Components/ProjectListAdmin"; +import { NewProject } from "../../Types/goTypes"; function AdminManageProjects(): JSX.Element { - const content = <>; + //TODO: Use fetch to get all projects + const projects: NewProject[] = [{ name: "Project", description: "New" }]; + const content = ( + <> +

    Manage Projects

    +
    + +
    + + ); const buttons = ( <> From cea2b6c03cba35a49a421a93420009fb59ebc9cf Mon Sep 17 00:00:00 2001 From: Peter KW Date: Wed, 20 Mar 2024 12:25:07 +0100 Subject: [PATCH 007/313] GetProjects compo --- frontend/src/Components/GetProjects.tsx | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 frontend/src/Components/GetProjects.tsx diff --git a/frontend/src/Components/GetProjects.tsx b/frontend/src/Components/GetProjects.tsx new file mode 100644 index 0000000..d6ab1f7 --- /dev/null +++ b/frontend/src/Components/GetProjects.tsx @@ -0,0 +1,37 @@ +import { Dispatch, useEffect } from "react"; +import { Project } from "../Types/goTypes"; +import { api } from "../API/API"; + +/** + * Gets all projects that user is a member of + * @param props - A setStateAction for the array you want to put projects in + * @returns {void} Nothing + * @example + * const [projects, setProjects] = useState([]); + * GetAllUsers({ setProjectsProp: setProjects }); + */ +function GetProjects(props: { + setProjectsProp: Dispatch>; +}): void { + const setProjects: Dispatch> = + props.setProjectsProp; + useEffect(() => { + const fetchUsers = async (): Promise => { + try { + const token = localStorage.getItem("accessToken") ?? ""; + const response = await api.getUserProjects(token); + if (response.success) { + setProjects(response.data ?? []); + } else { + console.error("Failed to fetch projects:", response.message); + } + } catch (error) { + console.error("Error fetching projects:", error); + } + }; + + void fetchUsers(); + }, [setProjects]); +} + +export default GetProjects; From 33b269e0c987faacfe8e487c516ae772cb880736 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Wed, 20 Mar 2024 12:25:59 +0100 Subject: [PATCH 008/313] Now uses GetProjects --- frontend/src/Pages/AdminPages/AdminManageProjects.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/Pages/AdminPages/AdminManageProjects.tsx b/frontend/src/Pages/AdminPages/AdminManageProjects.tsx index 14e44be..7ea45df 100644 --- a/frontend/src/Pages/AdminPages/AdminManageProjects.tsx +++ b/frontend/src/Pages/AdminPages/AdminManageProjects.tsx @@ -3,11 +3,13 @@ import BackButton from "../../Components/BackButton"; import BasicWindow from "../../Components/BasicWindow"; import Button from "../../Components/Button"; import { ProjectListAdmin } from "../../Components/ProjectListAdmin"; -import { NewProject } from "../../Types/goTypes"; +import { Project } from "../../Types/goTypes"; +import GetProjects from "../../Components/GetProjects"; +import { useState } from "react"; function AdminManageProjects(): JSX.Element { - //TODO: Use fetch to get all projects - const projects: NewProject[] = [{ name: "Project", description: "New" }]; + const [projects, setProjects] = useState([]); + GetProjects({ setProjectsProp: setProjects }); const content = ( <>

    Manage Projects

    From 54e42cd2a8939647cc1f9837c76ccc0433f0bb9f Mon Sep 17 00:00:00 2001 From: Davenludd Date: Wed, 20 Mar 2024 15:19:09 +0100 Subject: [PATCH 009/313] 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 0076a9f4bb7f16808d6e9752f0e57300f3a64cc4 Mon Sep 17 00:00:00 2001 From: pavel Hamawand Date: Wed, 20 Mar 2024 15:30:16 +0100 Subject: [PATCH 010/313] backButton --- frontend/src/Pages/AdminPages/AdminProjectAddMember.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/frontend/src/Pages/AdminPages/AdminProjectAddMember.tsx b/frontend/src/Pages/AdminPages/AdminProjectAddMember.tsx index 96167cb..712df86 100644 --- a/frontend/src/Pages/AdminPages/AdminProjectAddMember.tsx +++ b/frontend/src/Pages/AdminPages/AdminProjectAddMember.tsx @@ -1,3 +1,4 @@ +import BackButton from "../../Components/BackButton"; import BasicWindow from "../../Components/BasicWindow"; import Button from "../../Components/Button"; @@ -13,13 +14,7 @@ function AdminProjectAddMember(): JSX.Element { }} type="button" /> -
    + + + + + + + + + + + + + + + + + + + + + + + + +
    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 021/313] 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 022/313] 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 023/313] 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 024/313] 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 = ( <> - + - - ); } export default ChangeUsername; From 3981190c7a61ef5c1b925e896e5ba80aca27d675 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Mon, 1 Apr 2024 02:16:06 +0200 Subject: [PATCH 163/313] Can now change username in this modal + moved some stuff to a separate modal --- frontend/src/Components/UserInfoModal.tsx | 73 ++++++++++++++++------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/frontend/src/Components/UserInfoModal.tsx b/frontend/src/Components/UserInfoModal.tsx index 9d8dc11..7888c6b 100644 --- a/frontend/src/Components/UserInfoModal.tsx +++ b/frontend/src/Components/UserInfoModal.tsx @@ -1,34 +1,38 @@ -import { Link } from "react-router-dom"; import Button from "./Button"; import DeleteUser from "./DeleteUser"; import UserProjectListAdmin from "./UserProjectListAdmin"; +import { useState } from "react"; +import InputField from "./InputField"; +import ChangeUsername from "./ChangeUsername"; +import { StrNameChange } from "../Types/goTypes"; function UserInfoModal(props: { isVisible: boolean; - manageMember: boolean; username: string; onClose: () => void; - onDelete: (username: string) => void; }): JSX.Element { - if (!props.isVisible) return <>; - const ManageUserOrMember = (check: boolean): JSX.Element => { - if (check) { - return ( - -

    - (Change Role) -

    - - ); + const [showInput, setShowInput] = useState(false); + const [newUsername, setNewUsername] = useState(""); + if (!props.isVisible) { + return <>; + } + + const handleChangeNameView = (): void => { + if (showInput) { + setShowInput(false); + } else { + setShowInput(true); } - return ( - -

    - (Change Username) -

    - - ); }; + + const handleClickChangeName = (): void => { + const nameChange: StrNameChange = { + prevName: props.username, + newName: newUsername, + }; + ChangeUsername({ nameChange: nameChange }); + }; + return (

    {props.username}

    - {ManageUserOrMember(props.manageMember)} +

    + (Change Username) +

    + {showInput && ( +
    + +
    + )}

    Member of these projects: @@ -62,6 +91,8 @@ function UserInfoModal(props: {

    +
    + + ); +} + +export default MemberInfoModal; From 58deef400a9d448059bad1dfb75fea9fdd9b4d1e Mon Sep 17 00:00:00 2001 From: Peter KW Date: Mon, 1 Apr 2024 02:17:02 +0200 Subject: [PATCH 165/313] Removed unused code --- frontend/src/Components/ProjectListAdmin.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/frontend/src/Components/ProjectListAdmin.tsx b/frontend/src/Components/ProjectListAdmin.tsx index f25ee47..7305ea4 100644 --- a/frontend/src/Components/ProjectListAdmin.tsx +++ b/frontend/src/Components/ProjectListAdmin.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import { NewProject } from "../Types/goTypes"; import ProjectInfoModal from "./ProjectInfoModal"; -import UserInfoModal from "./UserInfoModal"; +import MemberInfoModal from "./MemberInfoModal"; /** * A list of projects for admin manage projects page, that sets an onClick @@ -51,13 +51,8 @@ export function ProjectListAdmin(props: { isVisible={projectModalVisible} projectname={projectname} /> - { - return; - }} isVisible={userModalVisible} username={username} /> From dc98fb510e896259169b658b0453c60ceb9627f6 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Mon, 1 Apr 2024 02:17:57 +0200 Subject: [PATCH 166/313] Clears username+password fields on successful register --- frontend/src/Components/Register.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/Components/Register.tsx b/frontend/src/Components/Register.tsx index 6192637..8a22806 100644 --- a/frontend/src/Components/Register.tsx +++ b/frontend/src/Components/Register.tsx @@ -22,6 +22,8 @@ export default function Register(): JSX.Element { const response = await api.registerUser(newUser); if (response.success) { alert("User added!"); + setPassword(""); + setUsername(""); } else { alert("User not added"); setErrMessage(response.message ?? "Unknown error"); From 1212b3c5efb301e895edee48e08a5063afdcf06c Mon Sep 17 00:00:00 2001 From: Peter KW Date: Mon, 1 Apr 2024 02:20:48 +0200 Subject: [PATCH 167/313] Removed some stuff --- frontend/src/Components/UserListAdmin.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/frontend/src/Components/UserListAdmin.tsx b/frontend/src/Components/UserListAdmin.tsx index c08b05c..76cae9f 100644 --- a/frontend/src/Components/UserListAdmin.tsx +++ b/frontend/src/Components/UserListAdmin.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; import UserInfoModal from "./UserInfoModal"; -import DeleteUser from "./DeleteUser"; /** * A list of users for admin manage users page, that sets an onClick @@ -30,9 +29,7 @@ export function UserListAdmin(props: { users: string[] }): JSX.Element { return ( <> DeleteUser} isVisible={modalVisible} username={username} /> From f3466854c7e0664d4e4045f6617c8382589c2089 Mon Sep 17 00:00:00 2001 From: Peter KW Date: Mon, 1 Apr 2024 02:24:26 +0200 Subject: [PATCH 168/313] Removed unused pages and paths to them in main --- .../Pages/AdminPages/AdminChangeUsername.tsx | 28 ------------------- .../AdminPages/AdminProjectChangeUserRole.tsx | 23 --------------- frontend/src/main.tsx | 11 -------- 3 files changed, 62 deletions(-) delete mode 100644 frontend/src/Pages/AdminPages/AdminChangeUsername.tsx delete mode 100644 frontend/src/Pages/AdminPages/AdminProjectChangeUserRole.tsx diff --git a/frontend/src/Pages/AdminPages/AdminChangeUsername.tsx b/frontend/src/Pages/AdminPages/AdminChangeUsername.tsx deleted file mode 100644 index b130fae..0000000 --- a/frontend/src/Pages/AdminPages/AdminChangeUsername.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import BackButton from "../../Components/BackButton"; -import BasicWindow from "../../Components/BasicWindow"; -import Button from "../../Components/Button"; -import ChangeUsername from "../../Components/ChangeUsername"; - -function AdminChangeUsername(): JSX.Element { - const content = ( - <> - - - ); - - const buttons = ( - <> - + ); +} From bcac9c020eeee96e9ffce70ac6252375811d4bef Mon Sep 17 00:00:00 2001 From: Peter KW Date: Sat, 13 Apr 2024 21:09:07 +0200 Subject: [PATCH 277/313] Checks if new project name meets requirements --- frontend/src/Components/ProjectInfoModal.tsx | 27 ++++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/frontend/src/Components/ProjectInfoModal.tsx b/frontend/src/Components/ProjectInfoModal.tsx index 66cffc2..71a72fb 100644 --- a/frontend/src/Components/ProjectInfoModal.tsx +++ b/frontend/src/Components/ProjectInfoModal.tsx @@ -5,11 +5,14 @@ import { Link } from "react-router-dom"; import GetProjectTimes, { projectTimes } from "./GetProjectTimes"; import DeleteProject from "./DeleteProject"; import InputField from "./InputField"; +import ProjectNameInput from "./Inputs/ProjectNameInput"; +import { alphanumeric } from "../Data/regex"; +import { projNameHighLimit, projNameLowLimit } from "../Data/constants"; function ProjectInfoModal(props: { projectname: string; onClose: () => void; - onClick: (username: string) => void; + onClick: (username: string, userRole: string) => void; }): JSX.Element { const [showInput, setShowInput] = useState(false); const [users, setUsers] = useState([]); @@ -23,6 +26,7 @@ function ProjectInfoModal(props: { const handleChangeNameView = (): void => { if (showInput) { + setNewProjName(""); setShowInput(false); } else { setShowInput(true); @@ -30,7 +34,16 @@ function ProjectInfoModal(props: { }; const handleClickChangeName = (): void => { - if (newProjName === "") return; + if ( + newProjName.length > projNameHighLimit || + newProjName.length < projNameLowLimit || + !alphanumeric.test(newProjName) + ) { + alert( + "Please provide valid project name: \n-Between 10-99 characters \n-No special characters (.-!?/*)", + ); + return; + } if ( confirm( @@ -68,14 +81,12 @@ function ProjectInfoModal(props: { {showInput && ( <>

    Change name:

    -
    - +
    + )} + {showPwordInput && ( +
    + { + setNewPassword(e.target.value); + }} + /> +