From 7bcd0f863f2f9ffe168735551fc862aab748f7bc Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 4 Sep 2024 15:26:42 +0100 Subject: [PATCH] ENCOA-133: Teachers within a Group should be able to view the Group assignments --- src/dashboards/AssignmentCreator.tsx | 101 +++++++++++++++++++++------ src/dashboards/Corporate.tsx | 2 +- src/dashboards/MasterCorporate.tsx | 2 +- src/hooks/useAssignments.tsx | 2 +- 4 files changed, 84 insertions(+), 23 deletions(-) diff --git a/src/dashboards/AssignmentCreator.tsx b/src/dashboards/AssignmentCreator.tsx index 1724da6d..fa677f5b 100644 --- a/src/dashboards/AssignmentCreator.tsx +++ b/src/dashboards/AssignmentCreator.tsx @@ -2,7 +2,7 @@ import Input from "@/components/Low/Input"; import Modal from "@/components/Modal"; import {Module} from "@/interfaces"; import clsx from "clsx"; -import {useEffect, useState} from "react"; +import {useEffect, useMemo, useState} from "react"; import {BsBook, BsCheckCircle, BsClipboard, BsHeadphones, BsMegaphone, BsPen, BsXCircle} from "react-icons/bs"; import {generate} from "random-words"; import {capitalize} from "lodash"; @@ -47,7 +47,7 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, }), ); const [isLoading, setIsLoading] = useState(false); - const [startDate, setStartDate] = useState(assignment ? moment(assignment.startDate).toDate() : moment().add(1, 'hour').toDate()); + const [startDate, setStartDate] = useState(assignment ? moment(assignment.startDate).toDate() : moment().add(1, "hour").toDate()); const [endDate, setEndDate] = useState( assignment ? moment(assignment.endDate).toDate() : moment().hours(23).minutes(59).add(8, "day").toDate(), @@ -66,6 +66,9 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, const {exams} = useExams(); + const userStudents = useMemo(() => users.filter((x) => x.type === "student"), [users]); + const userTeachers = useMemo(() => users.filter((x) => x.type === "teacher"), [users]); + useEffect(() => { setExamIDs((prev) => prev.filter((x) => selectedModules.includes(x.module))); }, [selectedModules]); @@ -79,6 +82,10 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, setAssignees((prev) => (prev.includes(user.id) ? prev.filter((a) => a !== user.id) : [...prev, user.id])); }; + const toggleTeacher = (user: User) => { + setTeachers((prev) => (prev.includes(user.id) ? prev.filter((a) => a !== user.id) : [...prev, user.id])); + }; + const createAssignment = () => { setIsLoading(true); @@ -270,22 +277,23 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, onChange={(date) => setEndDate(date)} /> - {autoStart && (
- - moment(date).isSameOrAfter(new Date())} - dateFormat="dd/MM/yyyy HH:mm" - selected={autoStartDate} - showTimeSelect - onChange={(date) => setAutoStartDate(date)} - /> -
+ {autoStart && ( +
+ + moment(date).isSameOrAfter(new Date())} + dateFormat="dd/MM/yyyy HH:mm" + selected={autoStartDate} + showTimeSelect + onChange={(date) => setAutoStartDate(date)} + /> +
)} @@ -364,7 +372,7 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, ))}
- {users.map((user) => ( + {userStudents.map((user) => (
toggleAssignee(user)} className={clsx( @@ -395,7 +403,60 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, ))}
-
+ + {user.type !== "teacher" && ( +
+ Teachers ({teachers.length} selected) +
+ {groups.map((g) => ( + + ))} +
+
+ {userTeachers.map((user) => ( +
toggleTeacher(user)} + className={clsx( + "p-4 flex flex-col gap-2 rounded-xl border cursor-pointer w-72", + "transition ease-in-out duration-300", + teachers.includes(user.id) ? "border-mti-purple" : "border-mti-gray-platinum", + )} + key={user.id}> + + {user.name} + {user.email} + + + Groups:{" "} + {groups + .filter((g) => g.participants.includes(user.id)) + .map((g) => g.name) + .join(", ")} + +
+ ))} +
+
+ )} + +
setVariant((prev) => (prev === "full" ? "partial" : "full"))}> Full length exams diff --git a/src/dashboards/Corporate.tsx b/src/dashboards/Corporate.tsx index 3e74ba42..3de8527b 100644 --- a/src/dashboards/Corporate.tsx +++ b/src/dashboards/Corporate.tsx @@ -175,7 +175,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { () => users.filter( (x) => - x.type === "student" && + (x.type === "student" || x.type === "teacher") && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id) diff --git a/src/dashboards/MasterCorporate.tsx b/src/dashboards/MasterCorporate.tsx index 3578b664..7e587ff6 100644 --- a/src/dashboards/MasterCorporate.tsx +++ b/src/dashboards/MasterCorporate.tsx @@ -320,7 +320,7 @@ export default function MasterCorporateDashboard({user}: Props) { () => users.filter( (x) => - x.type === "student" && + (x.type === "student" || x.type === "teacher") && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id) diff --git a/src/hooks/useAssignments.tsx b/src/hooks/useAssignments.tsx index 5a1c30d3..65151062 100644 --- a/src/hooks/useAssignments.tsx +++ b/src/hooks/useAssignments.tsx @@ -13,7 +13,7 @@ export default function useAssignments({assigner, assignees, corporate}: {assign .get(!corporate ? "/api/assignments" : `/api/assignments/corporate/${corporate}`) .then(async (response) => { if (assigner) { - setAssignments(response.data.filter((a) => a.assigner === assigner)); + setAssignments(response.data.filter((a) => a.assigner === assigner || (!a.teachers ? false : a.teachers.includes(assigner)))); return; }