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[];
}