mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 07:38:33 -06:00
syncing assignments works
This commit is contained in:
1
nextjs/.gitignore
vendored
1
nextjs/.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
.pnpm-store/
|
||||
tmp.json
|
||||
|
||||
|
||||
# dependencies
|
||||
|
||||
@@ -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}
|
||||
>
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ export const settingsFileStorageService = {
|
||||
const settingsPath = path.join(courseDirectory, "settings.yml");
|
||||
|
||||
const { name, ...settingsWithoutName } = settings;
|
||||
|
||||
const settingsMarkdown =
|
||||
localCourseYamlUtils.settingsToYaml(settingsWithoutName);
|
||||
|
||||
|
||||
@@ -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);
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user