From 06b116c24f10b96fda2e38bbaaa81464a7dd8e19 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Fri, 20 Sep 2024 14:45:27 -0600 Subject: [PATCH] run script handles timezones --- nextjs/run.sh | 1 + .../app/course/[courseName]/calendar/Day.tsx | 101 +++++++++++++----- .../src/services/canvas/canvasServiceUtils.ts | 2 + .../fileStorage/settingsFileStorageService.ts | 2 +- 4 files changed, 79 insertions(+), 27 deletions(-) diff --git a/nextjs/run.sh b/nextjs/run.sh index f5b5065..53d24e2 100755 --- a/nextjs/run.sh +++ b/nextjs/run.sh @@ -2,6 +2,7 @@ docker run -it --rm \ --name canvas-manager-2 \ + -e TZ=America/Denver \ -u 1000:1000 \ -p 3000:3000 \ -w /app \ diff --git a/nextjs/src/app/course/[courseName]/calendar/Day.tsx b/nextjs/src/app/course/[courseName]/calendar/Day.tsx index 8500a5b..7f178da 100644 --- a/nextjs/src/app/course/[courseName]/calendar/Day.tsx +++ b/nextjs/src/app/course/[courseName]/calendar/Day.tsx @@ -1,5 +1,6 @@ "use client"; import { + dateToMarkdownString, getDateFromStringOrThrow, getDateOnlyMarkdownString, } from "@/models/local/timeUtils"; @@ -22,6 +23,7 @@ import { CanvasQuiz } from "@/models/canvas/quizzes/canvasQuizModel"; import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment"; import { CanvasPage } from "@/models/canvas/pages/canvasPageModel"; import { canvasService } from "@/services/canvas/canvasService"; +import { ReactNode } from "react"; export default function Day({ day, month }: { day: string; month: number }) { const dayAsDate = getDateFromStringOrThrow( @@ -57,31 +59,36 @@ export default function Day({ day, month }: { day: string; month: number }) {
- {todaysAssignments.map(({ assignment, moduleName, status }) => ( - - ))} - {todaysQuizzes.map(({ quiz, moduleName, status }) => ( + {todaysAssignments.map( + ({ assignment, moduleName, status, message }) => ( + + ) + )} + {todaysQuizzes.map(({ quiz, moduleName, status, message }) => ( ))} - {todaysPages.map(({ page, moduleName, status }) => ( + {todaysPages.map(({ page, moduleName, status, message }) => ( ))}
@@ -115,6 +122,7 @@ function useTodaysItems(day: string) { moduleName: string; assignment: LocalAssignment; status: "localOnly" | "incomplete" | "published"; + message: ReactNode; }[] = todaysModules ? Object.keys(todaysModules).flatMap((moduleName) => todaysModules[moduleName].assignments.map((assignment) => { @@ -124,7 +132,7 @@ function useTodaysItems(day: string) { return { moduleName, assignment, - status: getStatus({ + ...getStatus({ item: assignment, canvasItem: canvasAssignment, type: "assignment", @@ -138,6 +146,7 @@ function useTodaysItems(day: string) { moduleName: string; quiz: LocalQuiz; status: "localOnly" | "incomplete" | "published"; + message: string; }[] = todaysModules ? Object.keys(todaysModules).flatMap((moduleName) => todaysModules[moduleName].quizzes.map((quiz) => { @@ -150,6 +159,7 @@ function useTodaysItems(day: string) { ? "published" : "incomplete" : "localOnly", + message: "", }; }) ) @@ -159,6 +169,7 @@ function useTodaysItems(day: string) { moduleName: string; page: LocalCoursePage; status: "localOnly" | "incomplete" | "published"; + message: string; }[] = todaysModules ? Object.keys(todaysModules).flatMap((moduleName) => todaysModules[moduleName].pages.map((page) => { @@ -171,6 +182,7 @@ function useTodaysItems(day: string) { ? "published" : "incomplete" : "localOnly", + message: "", }; }) ) @@ -183,11 +195,13 @@ function DraggableListItem({ moduleName, status, item, + message, }: { type: "assignment" | "page" | "quiz"; status: "localOnly" | "incomplete" | "published"; moduleName: string; item: IModuleItem; + message: ReactNode; }) { const { courseName } = useCourseContext(); const { dragStart } = useDraggingContext(); @@ -196,6 +210,7 @@ function DraggableListItem({ href={getModuleItemUrl(courseName, moduleName, type, item.name)} shallow={true} className={ + " relative group " + " border rounded-sm px-1 mx-1 break-words mb-1 " + " bg-slate-800 " + " block " + @@ -216,6 +231,20 @@ function DraggableListItem({ }} > {item.name} + {status === "incomplete" && ( +
+ {message} +
+ )} ); } @@ -228,31 +257,51 @@ const getStatus = ({ item: LocalQuiz | LocalAssignment | LocalCoursePage; canvasItem?: CanvasQuiz | CanvasAssignment | CanvasPage; type: "assignment" | "page" | "quiz"; -}): "localOnly" | "incomplete" | "published" => { - if (!canvasItem) return "localOnly"; +}): { + status: "localOnly" | "incomplete" | "published"; + message: ReactNode; +} => { + if (!canvasItem) return { status: "localOnly", message: "not in canvas" }; - if (!canvasItem.published) return "incomplete"; + if (!canvasItem.published) + return { status: "incomplete", message: "not published in canvas" }; if (type === "assignment") { const assignment = item as LocalAssignment; const canvasAssignment = canvasItem as CanvasAssignment; - if (!canvasAssignment.due_at) return "incomplete"; - if (assignment.lockAt && !canvasAssignment.lock_at) return "incomplete"; + if(canvasAssignment.name === "Javascript 1") + console.log('js 1', canvasAssignment.due_at, canvasAssignment); - if ( - getDateFromStringOrThrow( - assignment.dueAt, - "comparing due dates for day" - ).toISOString() !== + + if (!canvasAssignment.due_at) + return { status: "incomplete", message: "due date not in canvas" }; + + if (assignment.lockAt && !canvasAssignment.lock_at) + return { status: "incomplete", message: "lock date not in canvas" }; + + const localDueDate = dateToMarkdownString( + getDateFromStringOrThrow(assignment.dueAt, "comparing due dates for day") + ); + const canvasDueDate = dateToMarkdownString( getDateFromStringOrThrow( canvasAssignment.due_at, "comparing canvas due date for day" - ).toISOString() - ) { - return "incomplete"; + ) + ); + if (localDueDate !== canvasDueDate) { + return { + status: "incomplete", + message: ( +
+ due date different +
{localDueDate}
+
{canvasDueDate}
+
+ ), + }; } } - return "published"; + return { status: "published", message: "" }; }; diff --git a/nextjs/src/services/canvas/canvasServiceUtils.ts b/nextjs/src/services/canvas/canvasServiceUtils.ts index 8aded91..5cc8181 100644 --- a/nextjs/src/services/canvas/canvasServiceUtils.ts +++ b/nextjs/src/services/canvas/canvasServiceUtils.ts @@ -64,3 +64,5 @@ export async function paginatedRequest(request: { return returnData as T; } + + diff --git a/nextjs/src/services/fileStorage/settingsFileStorageService.ts b/nextjs/src/services/fileStorage/settingsFileStorageService.ts index 6089fc4..ef3b85b 100644 --- a/nextjs/src/services/fileStorage/settingsFileStorageService.ts +++ b/nextjs/src/services/fileStorage/settingsFileStorageService.ts @@ -16,7 +16,7 @@ const getCourseSettings = async ( const courseDirectory = path.join(basePath, courseName); const settingsPath = path.join(courseDirectory, "settings.yml"); if (!(await directoryOrFileExists(settingsPath))) { - const errorMessage = `Error loading settings for ${courseName}, settings file ${settingsPath}`; + const errorMessage = `could not find settings for ${courseName}, settings file ${settingsPath}`; console.log(errorMessage); throw new Error(errorMessage); }