mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 07:38:33 -06:00
only working with dates at at string level on the model
This commit is contained in:
@@ -4,8 +4,8 @@ import { RubricItem } from "./rubricItem";
|
||||
export interface LocalAssignment {
|
||||
name: string;
|
||||
description: string;
|
||||
lockAt?: string; // ISO 8601 date string
|
||||
dueAt: string; // ISO 8601 date string
|
||||
lockAt?: string; // 21/08/2023 23:59:00
|
||||
dueAt: string; // 21/08/2023 23:59:00
|
||||
localAssignmentGroupName?: string;
|
||||
submissionTypes: AssignmentSubmissionType[];
|
||||
allowedFileUploadExtensions: string[];
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { timeUtils } from "../../timeUtils";
|
||||
import { AssignmentSubmissionType } from "../assignmentSubmissionType";
|
||||
import { LocalAssignment } from "../localAssignment";
|
||||
import { RubricItem } from "../rubricItem";
|
||||
@@ -50,12 +51,8 @@ const parseSettings = (input: string) => {
|
||||
const submissionTypes = parseSubmissionTypes(input);
|
||||
const fileUploadExtensions = parseFileUploadExtensions(input);
|
||||
|
||||
const lockAt = (rawLockAt ? new Date(rawLockAt) : undefined)?.toISOString();
|
||||
const dueAt = new Date(rawDueAt).toISOString();
|
||||
|
||||
if (isNaN(new Date(dueAt).getTime())) {
|
||||
throw new Error(`Error with DueAt: ${rawDueAt}`);
|
||||
}
|
||||
const dueAt = timeUtils.parseDateOrThrow(rawDueAt, "DueAt");
|
||||
const lockAt = timeUtils.parseDateOrUndefined(rawLockAt);
|
||||
|
||||
return {
|
||||
name,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { timeUtils } from "../../timeUtils";
|
||||
import { LocalQuiz } from "../localQuiz";
|
||||
import { quizQuestionMarkdownUtils } from "./quizQuestionMarkdownUtils";
|
||||
|
||||
@@ -36,34 +37,6 @@ const parseNumberOrThrow = (value: string, label: string): number => {
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
const parseDateOrThrow = (value: string, label: string): string => {
|
||||
const [datePart, timePart] = value.split(" ");
|
||||
const [day, month, year] = datePart.split("/").map(Number);
|
||||
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
||||
const date = new Date(year, month - 1, day, hours, minutes, seconds);
|
||||
|
||||
if (isNaN(date.getTime())) {
|
||||
throw new Error(`Error with ${label}: ${value}`);
|
||||
}
|
||||
const stringDay = String(date.getDate()).padStart(2, "0");
|
||||
const stringMonth = String(date.getMonth() + 1).padStart(2, "0"); // Months are zero-based
|
||||
const stringYear = date.getFullYear();
|
||||
const stringHours = String(date.getHours()).padStart(2, "0");
|
||||
const stringMinutes = String(date.getMinutes()).padStart(2, "0");
|
||||
const stringSeconds = String(date.getSeconds()).padStart(2, "0");
|
||||
|
||||
return `${stringDay}/${stringMonth}/${stringYear} ${stringHours}:${stringMinutes}:${stringSeconds}`;
|
||||
};
|
||||
|
||||
const parseDateOrNull = (value: string): string | undefined => {
|
||||
const [datePart, timePart] = value.split(" ");
|
||||
const [day, month, year] = datePart.split("/").map(Number);
|
||||
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
||||
const date = new Date(year, month - 1, day, hours, minutes, seconds);
|
||||
return isNaN(date.getTime()) ? undefined : date.toISOString();
|
||||
};
|
||||
|
||||
const getQuizWithOnlySettings = (settings: string): LocalQuiz => {
|
||||
const name = extractLabelValue(settings, "Name");
|
||||
|
||||
@@ -101,10 +74,10 @@ const getQuizWithOnlySettings = (settings: string): LocalQuiz => {
|
||||
);
|
||||
|
||||
const rawDueAt = extractLabelValue(settings, "DueAt");
|
||||
const dueAt = parseDateOrThrow(rawDueAt, "DueAt");
|
||||
const dueAt = timeUtils.parseDateOrThrow(rawDueAt, "DueAt");
|
||||
|
||||
const rawLockAt = extractLabelValue(settings, "LockAt");
|
||||
const lockAt = parseDateOrNull(rawLockAt);
|
||||
const lockAt = timeUtils.parseDateOrUndefined(rawLockAt);
|
||||
|
||||
const description = extractDescription(settings);
|
||||
const localAssignmentGroupName = extractLabelValue(
|
||||
|
||||
35
nextjs/src/models/local/timeUtils.ts
Normal file
35
nextjs/src/models/local/timeUtils.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
const parseDateOrUndefined = (value: string): string | undefined => {
|
||||
|
||||
// may need to check for other formats
|
||||
const validDateRegex = /([1-9][1-9]|[0-2])\/(0[1-9]|[1-2][0-9]|3[01])\/\d{4} (0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/;
|
||||
if (!validDateRegex.test(value)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
|
||||
const [datePart, timePart] = value.split(" ");
|
||||
const [day, month, year] = datePart.split("/").map(Number);
|
||||
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
||||
const date = new Date(year, month - 1, day, hours, minutes, seconds);
|
||||
|
||||
if (isNaN(date.getTime())) {
|
||||
return undefined;
|
||||
}
|
||||
const stringDay = String(date.getDate()).padStart(2, "0");
|
||||
const stringMonth = String(date.getMonth() + 1).padStart(2, "0"); // Months are zero-based
|
||||
const stringYear = date.getFullYear();
|
||||
const stringHours = String(date.getHours()).padStart(2, "0");
|
||||
const stringMinutes = String(date.getMinutes()).padStart(2, "0");
|
||||
const stringSeconds = String(date.getSeconds()).padStart(2, "0");
|
||||
|
||||
return `${stringDay}/${stringMonth}/${stringYear} ${stringHours}:${stringMinutes}:${stringSeconds}`;
|
||||
};
|
||||
|
||||
export const timeUtils = {
|
||||
parseDateOrUndefined,
|
||||
parseDateOrThrow: (value: string, labelForError: string): string => {
|
||||
const myDate = parseDateOrUndefined(value);
|
||||
if (!myDate) throw new Error(`Invalid format for ${labelForError}: ${value}`);
|
||||
return myDate;
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user