From 44d182302865360d03cda001b2c6140d241b5fa0 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Tue, 1 Oct 2024 13:59:16 -0600 Subject: [PATCH] adding default offset settings --- .../[courseName]/settings/DefaultDueTime.tsx | 36 +++++++++++++++ .../settings/DefaultLockOffset.tsx | 44 +++++++++++++++++++ nextjs/src/app/newCourse/NewCourseForm.tsx | 1 + nextjs/src/models/local/localCourse.ts | 1 + 4 files changed, 82 insertions(+) create mode 100644 nextjs/src/app/course/[courseName]/settings/DefaultLockOffset.tsx diff --git a/nextjs/src/app/course/[courseName]/settings/DefaultDueTime.tsx b/nextjs/src/app/course/[courseName]/settings/DefaultDueTime.tsx index 8123cfc..058d92d 100644 --- a/nextjs/src/app/course/[courseName]/settings/DefaultDueTime.tsx +++ b/nextjs/src/app/course/[courseName]/settings/DefaultDueTime.tsx @@ -5,10 +5,15 @@ import { useUpdateLocalCourseSettingsMutation, } from "@/hooks/localCourse/localCoursesHooks"; import { TimePicker } from "../../../../components/TimePicker"; +import { useState } from "react"; +import DefaultLockOffset from "./DefaultLockOffset"; export default function DefaultDueTime() { const { data: settings } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); + const [haveLockOffset, setHaveLockOffset] = useState( + !!settings.defaultLockHoursOffset + ); return (
Default Assignment Due Time
@@ -23,6 +28,37 @@ export default function DefaultDueTime() { }); }} /> +
+ {!haveLockOffset && ( + + )} + + {haveLockOffset && } +
+ {haveLockOffset && ( + + )}
); } diff --git a/nextjs/src/app/course/[courseName]/settings/DefaultLockOffset.tsx b/nextjs/src/app/course/[courseName]/settings/DefaultLockOffset.tsx new file mode 100644 index 0000000..4b9cd8a --- /dev/null +++ b/nextjs/src/app/course/[courseName]/settings/DefaultLockOffset.tsx @@ -0,0 +1,44 @@ +"use client"; + +import TextInput from "@/components/form/TextInput"; +import { + useLocalCourseSettingsQuery, + useUpdateLocalCourseSettingsMutation, +} from "@/hooks/localCourse/localCoursesHooks"; +import { useEffect, useState } from "react"; + +export default function DefaultLockOffset() { + const { data: settings } = useLocalCourseSettingsQuery(); + const updateSettings = useUpdateLocalCourseSettingsMutation(); + const [hoursOffset, setHoursOffset] = useState( + settings.defaultLockHoursOffset?.toString() ?? "0" + ); + + useEffect(() => { + const id = setTimeout(() => { + try { + const hoursNumber = parseInt(hoursOffset); + if (hoursNumber && hoursNumber !== settings.defaultLockHoursOffset) { + updateSettings.mutate({ + ...settings, + defaultLockHoursOffset: hoursNumber, + }); + } + } catch {} + }, 500); + return () => clearTimeout(id); + }, [hoursOffset, settings, settings.defaultLockHoursOffset, updateSettings]); + + return ( +
+
Default Assignment Due Time
+
+ + setHoursOffset(n)} + label={"Hours Offset"} + /> +
+ ); +} diff --git a/nextjs/src/app/newCourse/NewCourseForm.tsx b/nextjs/src/app/newCourse/NewCourseForm.tsx index dfc33c8..e4d67f6 100644 --- a/nextjs/src/app/newCourse/NewCourseForm.tsx +++ b/nextjs/src/app/newCourse/NewCourseForm.tsx @@ -95,6 +95,7 @@ export default function NewCourseForm() { AssignmentSubmissionType.ONLINE_UPLOAD, ], defaultFileUploadTypes: ["pdf", "png", "jpg", "jpeg"], + defaultLockHoursOffset: 0 }, }) .then(() => { diff --git a/nextjs/src/models/local/localCourse.ts b/nextjs/src/models/local/localCourse.ts index d326e0b..74859ab 100644 --- a/nextjs/src/models/local/localCourse.ts +++ b/nextjs/src/models/local/localCourse.ts @@ -21,6 +21,7 @@ export interface LocalCourseSettings { startDate: string; endDate: string; defaultDueTime: SimpleTimeOnly; + defaultLockHoursOffset?: number; defaultAssignmentSubmissionTypes: AssignmentSubmissionType[]; defaultFileUploadTypes: string[]; }