From b0077e49117f94ca87d62459cfe649d12c8ac4ba Mon Sep 17 00:00:00 2001 From: laurejablonski Date: Thu, 17 Apr 2025 09:59:17 +0200 Subject: [PATCH 1/8] refactor: gebruik queries ipv controllers --- frontend/src/views/classes/SingleClass.vue | 266 ++++++++---------- frontend/src/views/classes/TeacherClasses.vue | 2 +- 2 files changed, 126 insertions(+), 142 deletions(-) diff --git a/frontend/src/views/classes/SingleClass.vue b/frontend/src/views/classes/SingleClass.vue index ea413282..0e165fa3 100644 --- a/frontend/src/views/classes/SingleClass.vue +++ b/frontend/src/views/classes/SingleClass.vue @@ -4,27 +4,28 @@ import { onMounted, ref } from "vue"; import type { ClassDTO } from "@dwengo-1/common/interfaces/class"; import { useRoute } from "vue-router"; - import { ClassController, type ClassResponse } from "@/controllers/classes"; + import { type ClassResponse } from "@/controllers/classes"; import type { JoinRequestsResponse, StudentsResponse } from "@/controllers/students"; import type { StudentDTO } from "@dwengo-1/common/interfaces/student"; import UsingQueryResult from "@/components/UsingQueryResult.vue"; import { useTeacherJoinRequestsQuery, useUpdateJoinRequestMutation } from "@/queries/teachers"; import type { ClassJoinRequestDTO } from "@dwengo-1/common/interfaces/class-join-request"; + import { useClassQuery, useClassStudentsQuery } from "@/queries/classes"; const { t } = useI18n(); // Username of logged in teacher const username = ref(undefined); - const classController: ClassController = new ClassController(); // Find class id from route const route = useRoute(); const classId: string = route.params.id as string; - const isLoading = ref(true); const currentClass = ref(undefined); const students = ref([]); + const getClass = useClassQuery(classId); + const getStudents = useClassStudentsQuery(classId); const joinRequestsQuery = useTeacherJoinRequestsQuery(username, classId); const { mutate } = useUpdateJoinRequestMutation(); @@ -33,17 +34,6 @@ onMounted(async () => { const userObject = await authState.loadUser(); username.value = userObject?.profile?.preferred_username ?? undefined; - - // Get class of which information should be shown - const classResponse: ClassResponse = await classController.getById(classId); - if (classResponse && classResponse.class) { - currentClass.value = classResponse.class; - isLoading.value = false; - } - - // Fetch all students of the class - const studentsResponse: StudentsResponse = await classController.getStudents(classId); - if (studentsResponse && studentsResponse.students) students.value = studentsResponse.students as StudentDTO[]; }); // TODO: Boolean that handles visibility for dialogs @@ -59,15 +49,10 @@ // Remove student from class async function removeStudentFromclass(): Promise { // TODO: replace by query - if (selectedStudent.value) await classController.deleteStudent(classId, selectedStudent.value.username); - dialog.value = false; - - selectedStudent.value = null; - //TODO when query; reload table so student not longer in table } // TODO: query + relaoding - function handleJoinRequest(c: ClassJoinRequestDTO, accepted: boolean) : void { + function handleJoinRequest(c: ClassJoinRequestDTO, accepted: boolean): void { mutate( { teacherUsername: username.value!, @@ -80,8 +65,7 @@ showSnackbar(t("sent"), "success"); }, onError: (e) => { - // ShowSnackbar(t("failed") + ": " + e.message, "error"); - throw e; + showSnackbar(t("failed") + ": " + e.message, "error"); }, }, ); @@ -100,132 +84,132 @@ From feb6bc3d9dacd0cf1ba1877143688b749c9f6df7 Mon Sep 17 00:00:00 2001 From: laurejablonski Date: Thu, 17 Apr 2025 11:17:50 +0200 Subject: [PATCH 7/8] feat: laad pagina na laden van user --- frontend/src/views/classes/SingleClass.vue | 28 ++++++++++++++-- frontend/src/views/classes/StudentClasses.vue | 33 ++++++++++++++++--- frontend/src/views/classes/TeacherClasses.vue | 31 ++++++++++++++--- 3 files changed, 81 insertions(+), 11 deletions(-) diff --git a/frontend/src/views/classes/SingleClass.vue b/frontend/src/views/classes/SingleClass.vue index 500a25f4..f058d6be 100644 --- a/frontend/src/views/classes/SingleClass.vue +++ b/frontend/src/views/classes/SingleClass.vue @@ -16,6 +16,9 @@ const route = useRoute(); const classId: string = route.params.id as string; const username = ref(undefined); + const isLoading = ref(false); + const isError = ref(false); + const errorMessage = ref(""); // Queries used to access the backend and catch loading or errors @@ -32,8 +35,16 @@ // Load current user before rendering the page onMounted(async () => { - const userObject = await authState.loadUser(); - username.value = userObject?.profile?.preferred_username ?? undefined; + isLoading.value = true; + try { + const userObject = await authState.loadUser(); + username.value = userObject!.profile!.preferred_username; + } catch (error) { + isError.value = true; + errorMessage.value = error instanceof Error ? error.message : String(error); + } finally { + isLoading.value = false; + } }); // Used to set the visibility of the dialog @@ -109,6 +120,19 @@