From e8b2862e2eece61b394f5dc40d2006586d514c8c Mon Sep 17 00:00:00 2001 From: Aron Buzogany <108480125+AronBuzogany@users.noreply.github.com> Date: Thu, 23 May 2024 09:27:02 +0200 Subject: [PATCH] Fix #265 (#353) --- frontend/package-lock.json | 3 +- .../components/Courses/AllCoursesTeacher.tsx | 70 +++++++++++++------ .../src/components/Courses/CourseUtils.tsx | 4 +- 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9143b918..d060e871 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -61,8 +61,7 @@ "ts-jest": "^29.1.2", "typescript": "^5.4.5", "vite": "^5.1.7", - "vitest": "^1.5.2", - "wait-on": "^7.2.0" + "vitest": "^1.5.2" } }, "node_modules/@aashutoshrathi/word-wrap": { diff --git a/frontend/src/components/Courses/AllCoursesTeacher.tsx b/frontend/src/components/Courses/AllCoursesTeacher.tsx index a0e15145..fb3a3b62 100644 --- a/frontend/src/components/Courses/AllCoursesTeacher.tsx +++ b/frontend/src/components/Courses/AllCoursesTeacher.tsx @@ -1,30 +1,42 @@ -import { Button, Dialog, DialogActions, DialogTitle, FormControl, FormHelperText, Grid, Input, InputLabel } from "@mui/material"; +import { + Button, + Dialog, + DialogActions, + DialogTitle, + FormControl, + FormHelperText, + Grid, + Input, + InputLabel, +} from "@mui/material"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { SideScrollableCourses } from "./CourseUtilComponents"; -import {Course, callToApiToCreateCourse, ProjectDetail} from "./CourseUtils"; +import { Course, callToApiToCreateCourse, ProjectDetail } from "./CourseUtils"; import { Title } from "../Header/Title"; import { useLoaderData } from "react-router-dom"; +import { Me } from "../../types/me"; /** * @returns A jsx component representing all courses for a teacher */ export function AllCoursesTeacher(): JSX.Element { const [open, setOpen] = useState(false); - const loader = useLoaderData() as { + const { courses, projects, me } = useLoaderData() as { courses: Course[]; + me: Me; projects: { [courseId: string]: ProjectDetail[] }; }; - const courses = loader.courses; - const projects = loader.projects; - const [courseName, setCourseName] = useState(''); - const [error, setError] = useState(''); + const [courseName, setCourseName] = useState(""); + const [error, setError] = useState(""); const navigate = useNavigate(); - const { t } = useTranslation('translation', { keyPrefix: 'allCoursesTeacher' }); + const { t } = useTranslation("translation", { + keyPrefix: "allCoursesTeacher", + }); const handleClickOpen = () => { setOpen(true); @@ -36,14 +48,14 @@ export function AllCoursesTeacher(): JSX.Element { const handleInputChange = (event: React.ChangeEvent) => { setCourseName(event.target.value); - setError(''); // Clearing error message when user starts typing + setError(""); // Clearing error message when user starts typing }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Prevents the default form submission behaviour if (!courseName.trim()) { - setError(t('emptyCourseNameError')); + setError(t("emptyCourseNameError")); return; } @@ -52,14 +64,21 @@ export function AllCoursesTeacher(): JSX.Element { }; return ( <> - - - + + + - {t('courseForm')} + {t("courseForm")}
- {t('courseName')} + {t("courseName")} - {error && {error}} + {error && ( + {error} + )} - - + +
- - - + {me && me.role === "TEACHER" && ( + + + + )}
); -} \ No newline at end of file +} diff --git a/frontend/src/components/Courses/CourseUtils.tsx b/frontend/src/components/Courses/CourseUtils.tsx index 68c81383..118f8b88 100644 --- a/frontend/src/components/Courses/CourseUtils.tsx +++ b/frontend/src/components/Courses/CourseUtils.tsx @@ -1,6 +1,7 @@ import { NavigateFunction, Params } from "react-router-dom"; import { authenticatedFetch } from "../../utils/authenticated-fetch"; import { Me } from "../../types/me"; +import { fetchMe } from "../../utils/fetches/FetchMe"; export interface Course { course_id: string; @@ -125,11 +126,12 @@ export const dataLoaderCourses = async () => { const courses = await fetchData(`courses`); const projects = await fetchProjectsCourse(courses); + const me = await fetchMe(); for( const c of courses){ const teacher = await fetchData(`users/${c.teacher}`) c.teacher = teacher.display_name } - return {courses, projects} + return {courses, projects, me} }; /**