From 304322d88a97bd7a738b47a93ef78e5450bfdbf9 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Tue, 24 May 2022 13:44:06 +0200 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Add=20studentSubject?= =?UTF-8?q?=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubjectAttendanceTable.tsx | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/components/subject-attendance-table/SubjectAttendanceTable.tsx diff --git a/src/components/subject-attendance-table/SubjectAttendanceTable.tsx b/src/components/subject-attendance-table/SubjectAttendanceTable.tsx new file mode 100644 index 0000000..865da40 --- /dev/null +++ b/src/components/subject-attendance-table/SubjectAttendanceTable.tsx @@ -0,0 +1,51 @@ +import { Table, TableContainer, Tbody, Th, Thead, Tr } from "@chakra-ui/react"; +import { ReactElement } from "react"; +import { useNavigate } from "react-router-dom"; +import { TableRow } from "../table-row/TableRow"; + +export interface StudentSubject { + subjectId: number; + name: string; + class: string; + attendance: number; + studentsCount: number; +} + +interface SubjectTableProps { + data?: StudentSubject[]; + isLoading?: boolean; +} + +export function SubjectAttendanceTable({ + data = [], + isLoading = false, +}: SubjectTableProps) { + const navigate = useNavigate(); + const getTableRows = (subjects: StudentSubject[]): ReactElement[] => { + return subjects?.map((subject) => { + return ( + navigate(`/`, { state: subject })} + /> + ); + }); + }; + + return ( + + + + + + + + + + + {!isLoading && {getTableRows(data)}} +
CLASSSUBJECT NAMESTUDENTSATTENDANCE
+
+ ); +} \ No newline at end of file From 3807665a81f07e6da2ec60ad9c07c55fa7d4718a Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Tue, 24 May 2022 13:44:29 +0200 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20student=20atte?= =?UTF-8?q?ndance=20overview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentAttendanceOverview.tsx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/layout/student-attendance-overview/StudentAttendanceOverview.tsx diff --git a/src/layout/student-attendance-overview/StudentAttendanceOverview.tsx b/src/layout/student-attendance-overview/StudentAttendanceOverview.tsx new file mode 100644 index 0000000..d7fd1b5 --- /dev/null +++ b/src/layout/student-attendance-overview/StudentAttendanceOverview.tsx @@ -0,0 +1,48 @@ +import { HStack } from "@chakra-ui/react"; +import { MainCard } from "../../components/main-card/MainCard"; +import { StudentSubject, SubjectAttendanceTable } from "../../components/subject-attendance-table/SubjectAttendanceTable"; + +export function StudentAttendanceOverview() { + const subjects: StudentSubject[] = [ + { + subjectId: 1, + name: "Testing", + class: "SW20", + attendance: 95, + studentsCount: 38, + }, + { + subjectId: 2, + name: "Web Development", + class: "SW20", + attendance: 82, + studentsCount: 38, + }, + { + subjectId: 3, + name: "Databases", + class: "SW20", + attendance: 88, + studentsCount: 38, + }, + ]; + + const getAttendanceAverage = (subjects: StudentSubject[]) => { + let sum = 0; + let i = 0; + for( i; i < subjects.length; i++ ) { + sum += subjects[i].attendance; + } + const average = sum / i; + return average.toFixed(2); + } + + return ( + + +

Total attendance: {getAttendanceAverage(subjects)} %

+ +
+
+ ); +} \ No newline at end of file From b46694f65b95344c153469d1647620da3e915318 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Tue, 24 May 2022 13:44:41 +0200 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Update=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/route/SwitchGuard.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/route/SwitchGuard.tsx b/src/route/SwitchGuard.tsx index 679d5a5..22e52e4 100644 --- a/src/route/SwitchGuard.tsx +++ b/src/route/SwitchGuard.tsx @@ -8,6 +8,7 @@ import { LoginSuccess } from "../layout/login-page/login-success/LoginSuccess"; import { AttendancePage } from "../layout/attendance-page/AttendancePage"; import { useContext } from "react"; import { UserContext } from "../provider/UserProvider"; +import { StudentAttendanceOverview } from "../layout/student-attendance-overview/StudentAttendanceOverview"; export function SwitchGuard() { const { userDetail, setUserDetail } = useContext(UserContext); @@ -24,6 +25,7 @@ export function SwitchGuard() { return ( } /> + } /> } /> ); From ac5401b4c92213db662347deb54ea84ec6d4c771 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Tue, 24 May 2022 13:57:58 +0200 Subject: [PATCH 4/8] =?UTF-8?q?test:=20=F0=9F=92=8D=20Add=20tests=20for=20?= =?UTF-8?q?student=20att=20overview=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentAttendanceOverview.test.tsx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/layout/student-attendance-overview/StudentAttendanceOverview.test.tsx diff --git a/src/layout/student-attendance-overview/StudentAttendanceOverview.test.tsx b/src/layout/student-attendance-overview/StudentAttendanceOverview.test.tsx new file mode 100644 index 0000000..9a38a91 --- /dev/null +++ b/src/layout/student-attendance-overview/StudentAttendanceOverview.test.tsx @@ -0,0 +1,30 @@ +import { screen } from "@testing-library/react"; +import { UserDetail } from "../../provider/UserProvider"; +import { UserType } from "../navigation-bar/authorized-navigation-bar/AuthorizedNavigationBar"; +import { StudentAttendanceOverview } from "./StudentAttendanceOverview"; +import { createMemoryHistory } from "history"; +import { Router } from "react-router-dom"; +import { renderWithUseContextUser } from "../../test-util"; + +describe("student attendance overview page", () => { + const studentDetail: UserDetail = { + userId: "10", + username: "student test", + role: UserType.STUDENT, + }; + it("contains the correct titles", () => { + const history = createMemoryHistory(); + + renderWithUseContextUser( + + + , + studentDetail + ); + + screen.getByText("CLASS"); + screen.getByText("SUBJECT NAME"); + screen.getByText("STUDENTS"); + screen.getByText("ATTENDANCE"); + }) +}); \ No newline at end of file From bac8db17ad5427f1a744b09544f7caa80a75b349 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Wed, 25 May 2022 16:52:17 +0200 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Add=20student=20list?= =?UTF-8?q?=20generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ' --- .../teacher-class-list/TeacherClassList.tsx | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/components/teacher-class-list/TeacherClassList.tsx diff --git a/src/components/teacher-class-list/TeacherClassList.tsx b/src/components/teacher-class-list/TeacherClassList.tsx new file mode 100644 index 0000000..3229dc8 --- /dev/null +++ b/src/components/teacher-class-list/TeacherClassList.tsx @@ -0,0 +1,72 @@ +import { Table, TableContainer, Tbody, Th, Thead, Tr } from "@chakra-ui/react"; +import { ReactElement } from "react"; +import { TableRow } from "../table-row/TableRow"; + +export interface Student { + studentId: number; + name: string; + attendance: string; + pressent: string; +} + +export function TeacherClassList({ + studentNr = 20 +}) { + const getName = () => { + const names = [ + "Casper", + "Marie", + "Johanne", + "Kream", + "Buddah", + "JAnus", + "Frederikke", + "Camilla", + "Christoffer", + "Jannick", + "Neja", + "Amanda", + "Alex", + "Maccagnan", + "Jonas", + "Hannah" + ]; + return names[Math.floor(Math.random()*names.length)] + } + const getTableRows = (studentNr: number): ReactElement[] => { + let students: Student[] = [] + for( let i = 0; i < studentNr; i++ ) { + const student: Student = { + studentId: i+1, + name: getName(), + attendance: (50 + Math.floor(Math.random()*50)).toString() + "%", + pressent: (Math.floor(Math.random()*10) % 2 === 0).toString() + } + students.push(student) + } + + return students?.map((students) => { + return ( + + ); + }); + }; + + return ( + + + + + + + + + + {getTableRows(studentNr)} +
STUDENTATTENDANCEPRESENT
+
+ ); +} \ No newline at end of file From 88aa146c7cfe42e3d3f5dd413244cc598dbfbffa Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Wed, 25 May 2022 16:52:38 +0200 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20attend=20class?= =?UTF-8?q?=20overview=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClassAttendanceOverview.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/layout/class-attendance-overview/ClassAttendanceOverview.tsx diff --git a/src/layout/class-attendance-overview/ClassAttendanceOverview.tsx b/src/layout/class-attendance-overview/ClassAttendanceOverview.tsx new file mode 100644 index 0000000..e882476 --- /dev/null +++ b/src/layout/class-attendance-overview/ClassAttendanceOverview.tsx @@ -0,0 +1,20 @@ +import { Button, HStack } from "@chakra-ui/react"; +import { useLocation, useNavigate } from "react-router-dom"; +import { MainCard } from "../../components/main-card/MainCard"; +import { TeacherClassList } from "../../components/teacher-class-list/TeacherClassList"; + +export function ClassAttendanceOverview() { + const location = useLocation(); + const studentNr = location.state as number; + const navigate = useNavigate(); + + return ( + + +
Student list
+ +
+ +
+ ); +} From 121c7acc4a03e20412d31165a3a5b7971a2eac79 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Wed, 25 May 2022 16:52:53 +0200 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20new=20route=20?= =?UTF-8?q?in=20switchguard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/route/SwitchGuard.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/route/SwitchGuard.tsx b/src/route/SwitchGuard.tsx index 22e52e4..5be56f5 100644 --- a/src/route/SwitchGuard.tsx +++ b/src/route/SwitchGuard.tsx @@ -9,6 +9,7 @@ import { AttendancePage } from "../layout/attendance-page/AttendancePage"; import { useContext } from "react"; import { UserContext } from "../provider/UserProvider"; import { StudentAttendanceOverview } from "../layout/student-attendance-overview/StudentAttendanceOverview"; +import { ClassAttendanceOverview } from "../layout/class-attendance-overview/ClassAttendanceOverview"; export function SwitchGuard() { const { userDetail, setUserDetail } = useContext(UserContext); @@ -33,7 +34,8 @@ export function SwitchGuard() { return ( } /> - } path="/attendance-code" /> + } /> + } /> } /> ); From e6d2e2681ffa41a0c7721581c5e02766b0274943 Mon Sep 17 00:00:00 2001 From: Teodor_Jonasson Date: Wed, 25 May 2022 16:53:20 +0200 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20new=20button?= =?UTF-8?q?=20to=20see=20overview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/attendance-page/attendanceView/AttendanceView.tsx | 3 +++ .../teacher-subject-management/TeacherSubjectManagement.tsx | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/layout/attendance-page/attendanceView/AttendanceView.tsx b/src/layout/attendance-page/attendanceView/AttendanceView.tsx index 8c13d04..6eba6a3 100644 --- a/src/layout/attendance-page/attendanceView/AttendanceView.tsx +++ b/src/layout/attendance-page/attendanceView/AttendanceView.tsx @@ -27,6 +27,9 @@ export function AttendanceView({ subject }: AttendanceViewProps) { + ); } diff --git a/src/layout/teacher-subject-management/TeacherSubjectManagement.tsx b/src/layout/teacher-subject-management/TeacherSubjectManagement.tsx index f2d9b3e..af877f0 100644 --- a/src/layout/teacher-subject-management/TeacherSubjectManagement.tsx +++ b/src/layout/teacher-subject-management/TeacherSubjectManagement.tsx @@ -6,6 +6,7 @@ import { SubjectTable } from "../../components/subject-table/SubjectTable"; import { useSubject } from "../../api/useSubject"; import { useContext } from "react"; import { UserContext } from "../../provider/UserProvider"; + export function TeacherSubjectManagement() { const { userDetail } = useContext(UserContext); const { data: subjects, isLoading } = useSubject(userDetail.userId!!); @@ -15,7 +16,7 @@ export function TeacherSubjectManagement() { - Add + Add