From 1c118a42f3ec8cb106e32992a6f19e71081f6e20 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Tue, 20 May 2025 13:50:24 +0200 Subject: [PATCH] fix: snackbar message bij groep aanpassen --- backend/src/services/assignments.ts | 32 +++++++++------ .../views/assignments/TeacherAssignment.vue | 39 +++++++++++-------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index b9ad9212..e96b8dd8 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -103,6 +103,7 @@ function hasDuplicates(arr: string[]): boolean { export async function putAssignment(classid: string, id: number, assignmentData: Partial): Promise { const assignment = await fetchAssignment(classid, id); + if (assignmentData.groups) { if (hasDuplicates(assignmentData.groups.flat() as string[])) { throw new BadRequestException('Student can only be in one group'); @@ -110,17 +111,26 @@ export async function putAssignment(classid: string, id: number, assignmentData: const studentLists = await Promise.all((assignmentData.groups as string[][]).map(async (group) => await fetchStudents(group))); - const groupRepository = getGroupRepository(); - await groupRepository.deleteAllByAssignment(assignment); - await Promise.all( - studentLists.map(async (students) => { - const newGroup = groupRepository.create({ - assignment: assignment, - members: students, - }); - await groupRepository.save(newGroup); - }) - ); + try { + const groupRepository = getGroupRepository(); + await groupRepository.deleteAllByAssignment(assignment); + + await Promise.all( + studentLists.map(async (students) => { + const newGroup = groupRepository.create({ + assignment: assignment, + members: students, + }); + await groupRepository.save(newGroup); + }) + ); + } catch(e: unknown) { + if (e instanceof ForeignKeyConstraintViolationException || e instanceof PostgreSqlExceptionConverter) { + throw new ConflictException('Cannot update assigment with questions or submissions'); + } else { + throw e; + } + } delete assignmentData.groups; } diff --git a/frontend/src/views/assignments/TeacherAssignment.vue b/frontend/src/views/assignments/TeacherAssignment.vue index 631692bc..c860fc04 100644 --- a/frontend/src/views/assignments/TeacherAssignment.vue +++ b/frontend/src/views/assignments/TeacherAssignment.vue @@ -130,13 +130,28 @@ return `/learningPath/${lp.hruid}/${lp.language}/${lp.startNode.learningobjectHruid}?forGroup=${groupNo}&assignmentNo=${props.assignmentId}&classId=${props.classId}`; } - const { mutate, data, isSuccess } = useUpdateAssignmentMutation(); + const updateAssignmentMutate = useUpdateAssignmentMutation(); - watch([isSuccess, data], async ([success, newData]) => { - if (success && newData?.assignment) { - await assignmentQueryResult.refetch(); - } - }); + function updateAssignment(assignmentDTO) { + updateAssignmentMutate.mutate( + { + cid: assignmentQueryResult.data.value?.assignment.within, + an: assignmentQueryResult.data.value?.assignment.id, + data: assignmentDTO, + }, + { + onSuccess: async (newData) => { + if (newData?.assignment) { + await assignmentQueryResult.refetch(); + } + }, + onError: (err: any) => { + const message = err.response?.data?.error || err.message || t("unknownError"); + showSnackbar(t("failed") + ": " + message, "error"); + }, + } + ); + } async function saveChanges(): Promise { const { valid } = await form.value.validate(); @@ -149,22 +164,14 @@ deadline: deadline.value ?? null, }; - mutate({ - cid: assignmentQueryResult.data.value?.assignment.within, - an: assignmentQueryResult.data.value?.assignment.id, - data: assignmentDTO, - }); + updateAssignment(assignmentDTO); } async function handleGroupsUpdated(updatedGroups: string[][]): Promise { const assignmentDTO: AssignmentDTO = { groups: updatedGroups, }; - mutate({ - cid: assignmentQueryResult.data.value?.assignment.within, - an: assignmentQueryResult.data.value?.assignment.id, - data: assignmentDTO, - }); + updateAssignment(assignmentDTO); }