syncing assignments works

This commit is contained in:
2024-11-14 13:31:14 -07:00
parent 27cd96acf5
commit b1e48e0ea9
8 changed files with 43 additions and 39 deletions

1
nextjs/.gitignore vendored
View File

@@ -1,6 +1,7 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
.pnpm-store/
tmp.json
# dependencies

View File

@@ -12,9 +12,9 @@ import { settingsBox } from "./sharedSettings";
import { Spinner } from "@/components/Spinner";
export default function AssignmentGroupManagement() {
const [settings] = useLocalCourseSettingsQuery();
const [settings, { isPending }] = useLocalCourseSettingsQuery();
const updateSettings = useUpdateLocalCourseSettingsMutation();
const applyInCanvas = useSetAssignmentGroupsMutation(settings.canvasId); // untested
const applyInCanvas = useSetAssignmentGroupsMutation(settings.canvasId);
const [assignmentGroups, setAssignmentGroups] = useState<
LocalAssignmentGroup[]
@@ -26,6 +26,12 @@ export default function AssignmentGroupManagement() {
if (
!areAssignmentGroupsEqual(assignmentGroups, settings.assignmentGroups)
) {
console.log(
"updating",
assignmentGroups,
updateSettings.isPending,
isPending
);
updateSettings.mutate({
settings: {
...settings,
@@ -38,7 +44,7 @@ export default function AssignmentGroupManagement() {
return () => {
clearTimeout(handler);
};
}, [assignmentGroups, settings, updateSettings]);
}, [assignmentGroups, isPending, settings, updateSettings]);
return (
<div className={settingsBox}>
@@ -97,8 +103,11 @@ export default function AssignmentGroupManagement() {
<br />
<div className="flex justify-end">
<button
onClick={() => {
applyInCanvas.mutate(settings);
onClick={async () => {
const newSettings = await applyInCanvas.mutateAsync(settings);
// prevent debounce from resetting
if (newSettings) setAssignmentGroups(newSettings.assignmentGroups);
}}
disabled={applyInCanvas.isPending}
>

View File

@@ -1,12 +1,16 @@
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 {
LocalCourseSettings,
zodLocalCourseSettings,
} 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";
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
export const canvasCourseKeys = {
courseDetails: (canavasId: number) =>
@@ -40,7 +44,7 @@ export const useSetAssignmentGroupsMutation = (canvasId: number) => {
const groupsToDelete = canvasAssignmentGroups.filter(
(c: CanvasAssignmentGroup) => !localNames.includes(c.name)
);
console.log("updating canvas groups", groupsToDelete);
await Promise.all(
groupsToDelete.map(
async (g: CanvasAssignmentGroup) =>
@@ -63,13 +67,17 @@ export const useSetAssignmentGroupsMutation = (canvasId: number) => {
canvasId: newGroup.canvasId,
};
} else {
if (canvasGroup.group_weight !== group.weight) {
await canvasAssignmentGroupService.update(canvasId, group);
}
return {
const groupWithCanvasId = {
...group,
canvasId: canvasGroup.id,
};
if (canvasGroup.group_weight !== group.weight) {
await canvasAssignmentGroupService.update(
canvasId,
groupWithCanvasId
);
}
return groupWithCanvasId;
}
}
)
@@ -79,11 +87,9 @@ export const useSetAssignmentGroupsMutation = (canvasId: number) => {
...settings,
assignmentGroups: updatedGroups,
};
console.log(
"finished updating canvas assignment groups, updating settings of file system",
updatedSettings
);
await updateSettingsMutation.mutateAsync({ settings: updatedSettings });
return updatedSettings;
},
});
};

View File

@@ -7,8 +7,8 @@ export interface LocalAssignmentGroup {
weight: number;
}
export const zodLocalAssignmentGroup = z.object({
canvasId: z.number().optional(), // canvasId is optional
id: z.string(), // id is a required string
name: z.string(), // name is a required string
weight: z.number(), // weight is a required number
});
canvasId: z.optional(z.number()),
id: z.string(),
name: z.string(),
weight: z.number(),
});

View File

@@ -40,7 +40,7 @@ export const canvasAssignmentGroupService = {
canvasCourseId: number,
localAssignmentGroup: LocalAssignmentGroup
): Promise<void> {
console.log(`Updating assignment group: ${localAssignmentGroup.name}`);
console.log(`Updating assignment group: ${localAssignmentGroup.name}, ${localAssignmentGroup.canvasId}`);
if (!localAssignmentGroup.canvasId) {
throw new Error("Cannot update assignment group if canvas ID is null");
}

View File

@@ -73,6 +73,7 @@ export const settingsFileStorageService = {
const settingsPath = path.join(courseDirectory, "settings.yml");
const { name, ...settingsWithoutName } = settings;
const settingsMarkdown =
localCourseYamlUtils.settingsToYaml(settingsWithoutName);

View File

@@ -54,19 +54,6 @@ export const settingsRouter = router({
const oldModules = await fileStorageService.modules.getModuleNames(
oldCourseName
);
console.log(
"old course name",
oldCourseName,
"new course name",
newCourseName
);
console.log(
"old start date",
settingsFromCourseToImport.startDate,
"new start date",
settings.startDate
);
await Promise.all(
oldModules.map(async (moduleName) => {
await fileStorageService.modules.createModule(
@@ -96,7 +83,7 @@ export const settingsRouter = router({
const newAssignment = prepAssignmentForNewSemester(
oldAssignment,
settingsFromCourseToImport.startDate,
settings.startDate,
settings.startDate
);
await fileStorageService.assignments.updateOrCreateAssignment({
courseName: newCourseName,
@@ -109,7 +96,7 @@ export const settingsRouter = router({
const newQuiz = prepQuizForNewSemester(
oldQuiz,
settingsFromCourseToImport.startDate,
settings.startDate,
settings.startDate
);
await fileStorageService.quizzes.updateQuiz({
courseName: newCourseName,
@@ -122,7 +109,7 @@ export const settingsRouter = router({
const newPage = prepPageForNewSemester(
oldPage,
settingsFromCourseToImport.startDate,
settings.startDate,
settings.startDate
);
await fileStorageService.pages.updatePage({
courseName: newCourseName,
@@ -136,7 +123,7 @@ export const settingsRouter = router({
const newLecture = prepLectureForNewSemester(
oldLecture,
settingsFromCourseToImport.startDate,
settings.startDate,
settings.startDate
);
await updateLecture(newCourseName, settings, newLecture);
})