diff --git a/nextjs/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx b/nextjs/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx index 1e42699..45609f0 100644 --- a/nextjs/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx +++ b/nextjs/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx @@ -9,6 +9,7 @@ import { useEffect, useState } from "react"; import TextInput from "../../../../components/form/TextInput"; import { useSetAssignmentGroupsMutation } from "@/hooks/canvas/canvasCourseHooks"; import { settingsBox } from "./sharedSettings"; +import { Spinner } from "@/components/Spinner"; export default function AssignmentGroupManagement() { const [settings] = useLocalCourseSettingsQuery(); @@ -93,6 +94,29 @@ export default function AssignmentGroupManagement() { Add Assignment Group +
+
+ + {applyInCanvas.isPending && } + {applyInCanvas.isSuccess && ( +
+ { + "You will need to go to your course assignments page > settings > Assignment Group Weights" + } +
+ { + "and check the 'Weight final grade based on assignment groups' box" + } +
+ )} +
); } diff --git a/nextjs/src/app/newCourse/NewCourseForm.tsx b/nextjs/src/app/newCourse/NewCourseForm.tsx index 235c27f..e6cc791 100644 --- a/nextjs/src/app/newCourse/NewCourseForm.tsx +++ b/nextjs/src/app/newCourse/NewCourseForm.tsx @@ -100,7 +100,7 @@ export default function NewCourseForm() { (assignmentGroup) => { const { canvasId, ...groupWithoutCanvas } = assignmentGroup; - return groupWithoutCanvas; + return { ...groupWithoutCanvas, canvasId: undefined }; } ), } diff --git a/nextjs/src/hooks/canvas/canvasCourseHooks.ts b/nextjs/src/hooks/canvas/canvasCourseHooks.ts index f340a14..a3ec5cf 100644 --- a/nextjs/src/hooks/canvas/canvasCourseHooks.ts +++ b/nextjs/src/hooks/canvas/canvasCourseHooks.ts @@ -1,9 +1,12 @@ import { CanvasAssignmentGroup } from "@/models/canvas/assignments/canvasAssignmentGroup"; import { CanvasCourseModel } from "@/models/canvas/courses/canvasCourseModel"; import { LocalAssignmentGroup } from "@/models/local/assignment/localAssignmentGroup"; +import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import { canvasAssignmentGroupService } from "@/services/canvas/canvasAssignmentGroupService"; import { canvasService } from "@/services/canvas/canvasService"; +import { trpc } from "@/services/trpc/utils"; import { useMutation, useQuery } from "@tanstack/react-query"; +import { useUpdateLocalCourseSettingsMutation } from "../localCourse/localCoursesHooks"; export const canvasCourseKeys = { courseDetails: (canavasId: number) => @@ -22,39 +25,65 @@ export const useCourseListInTermQuery = (canvasTermId: number | undefined) => enabled: !!canvasTermId, }); -// export const useCanvasCourseQuery = (canvasId: number) => -// useQuery({ -// queryKey: canvasCourseKeys.courseDetails(canvasId), -// queryFn: async () => await canvasService.getCourse(canvasId), -// }); - export const useSetAssignmentGroupsMutation = (canvasId: number) => { + const updateSettingsMutation = useUpdateLocalCourseSettingsMutation(); const { data: canvasAssignmentGroups } = useAssignmentGroupsQuery(canvasId); return useMutation({ - mutationFn: async (localAssignmentGroups: LocalAssignmentGroup[]) => { - if (!canvasAssignmentGroups) return; + mutationFn: async (settings: LocalCourseSettings) => { + if (typeof canvasAssignmentGroups === "undefined") { + console.log("cannot apply groups if no groups loaded"); + return; + } + const localAssignmentGroups = settings.assignmentGroups; const localNames = localAssignmentGroups.map((g) => g.name); const groupsToDelete = canvasAssignmentGroups.filter( (c: CanvasAssignmentGroup) => !localNames.includes(c.name) ); - await Promise.all([ - ...groupsToDelete.map( + console.log("updating canvas groups", groupsToDelete); + await Promise.all( + groupsToDelete.map( async (g: CanvasAssignmentGroup) => await canvasAssignmentGroupService.delete(canvasId, g.id, g.name) - ), - ...localAssignmentGroups.map(async (group) => { - const canvasGroup = canvasAssignmentGroups.find( - (c: CanvasAssignmentGroup) => c.name === group.name - ); - if (!canvasGroup) { - await canvasAssignmentGroupService.create(canvasId, group); - } else { - if (canvasGroup.group_weight !== group.weight) - await canvasAssignmentGroupService.update(canvasId, group); + ) + ); + const updatedGroups = await Promise.all( + localAssignmentGroups.map( + async (group): Promise => { + const canvasGroup = canvasAssignmentGroups.find( + (c: CanvasAssignmentGroup) => c.name === group.name + ); + if (!canvasGroup) { + const newGroup = await canvasAssignmentGroupService.create( + canvasId, + group + ); + return { + ...group, + canvasId: newGroup.canvasId, + }; + } else { + if (canvasGroup.group_weight !== group.weight) { + await canvasAssignmentGroupService.update(canvasId, group); + } + return { + ...group, + canvasId: canvasGroup.id, + }; + } } - }), - ]); + ) + ); + + const updatedSettings: LocalCourseSettings = { + ...settings, + assignmentGroups: updatedGroups, + }; + console.log( + "finished updating canvas assignment groups, updating settings of file system", + updatedSettings + ); + await updateSettingsMutation.mutateAsync({ settings: updatedSettings }); }, }); }; @@ -62,6 +91,7 @@ export const useSetAssignmentGroupsMutation = (canvasId: number) => { export const useAssignmentGroupsQuery = (canvasId: number) => { return useQuery({ queryKey: canvasCourseKeys.assignmentGroups(canvasId), - queryFn: async (): Promise => await canvasAssignmentGroupService.getAll(canvasId), + queryFn: async (): Promise => + await canvasAssignmentGroupService.getAll(canvasId), }); }; diff --git a/nextjs/src/hooks/localCourse/localCoursesHooks.ts b/nextjs/src/hooks/localCourse/localCoursesHooks.ts index ab1f84a..9cf2c3d 100644 --- a/nextjs/src/hooks/localCourse/localCoursesHooks.ts +++ b/nextjs/src/hooks/localCourse/localCoursesHooks.ts @@ -24,7 +24,7 @@ export const useUpdateLocalCourseSettingsMutation = () => { const { courseName } = useCourseContext(); const utils = trpc.useUtils(); - return trpc.settings.createCourse.useMutation({ + return trpc.settings.updateSettings.useMutation({ onSuccess: () => { utils.settings.allCoursesSettings.invalidate(); utils.settings.courseSettings.invalidate({ courseName });