itemDrop(e, day)}
onDragOver={(e) => e.preventDefault()}
>
@@ -135,14 +134,7 @@ function DraggableListItem({
}}
>
{item.name}
diff --git a/nextjs/src/app/course/[courseName]/calendar/DayItemsInModule.tsx b/nextjs/src/app/course/[courseName]/calendar/DayItemsInModule.tsx
deleted file mode 100644
index 430f584..0000000
--- a/nextjs/src/app/course/[courseName]/calendar/DayItemsInModule.tsx
+++ /dev/null
@@ -1,218 +0,0 @@
-"use client";
-import React, { useMemo } from "react";
-import { useCourseContext } from "../context/courseContext";
-import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
-import Link from "next/link";
-import {
- usePageNamesQuery,
- usePagesQueries,
-} from "@/hooks/localCourse/pageHooks";
-import {
- useQuizNamesQuery,
- useQuizzesQueries,
-} from "@/hooks/localCourse/quizHooks";
-import {
- useAssignmentNamesQuery,
- useAssignmentsQueries,
-} from "@/hooks/localCourse/assignmentHooks";
-
-export default function DayItemsInModule({
- day,
- moduleName,
-}: {
- day: string;
- moduleName: string;
-}) {
- return (
-
- );
-}
-
-function Pages({ moduleName, day }: { moduleName: string; day: string }) {
- const { courseName } = useCourseContext();
- const { data: pageNames } = usePageNamesQuery(moduleName);
- const { data: pages } = usePagesQueries(moduleName, pageNames);
- const todaysPages = useMemo(
- () =>
- pages.filter((p) => {
- const dueDate = getDateFromStringOrThrow(
- p.dueAt,
- "due at for page in day"
- );
- const dayAsDate = getDateFromStringOrThrow(
- day,
- "in pages in DayItemsInModule"
- );
- return (
- dueDate.getFullYear() === dayAsDate.getFullYear() &&
- dueDate.getMonth() === dayAsDate.getMonth() &&
- dueDate.getDate() === dayAsDate.getDate()
- );
- }),
- [day, pages]
- );
- return (
- <>
- {todaysPages.map((p) => (
-
{
- e.dataTransfer.setData(
- "draggableItem",
- JSON.stringify({
- type: "page",
- item: p,
- sourceModuleName: moduleName,
- })
- );
- }}
- >
-
- {p.name}
-
-
- ))}
- >
- );
-}
-
-function Quizzes({ moduleName, day }: { moduleName: string; day: string }) {
- const { data: quizNames } = useQuizNamesQuery(moduleName);
- const { data: quizzes } = useQuizzesQueries(moduleName, quizNames);
- const { courseName } = useCourseContext();
-
- const todaysQuizzes = useMemo(
- () =>
- quizzes.filter((q) => {
- const dueDate = getDateFromStringOrThrow(
- q.dueAt,
- "due at for quiz in day"
- );
- const dayAsDate = getDateFromStringOrThrow(
- day,
- "in quizzes in DayItemsInModule"
- );
- return (
- dueDate.getFullYear() === dayAsDate.getFullYear() &&
- dueDate.getMonth() === dayAsDate.getMonth() &&
- dueDate.getDate() === dayAsDate.getDate()
- );
- }),
- [day, quizzes]
- );
- return (
- <>
- {todaysQuizzes.map((q) => (
-
{
- e.dataTransfer.setData(
- "draggableItem",
- JSON.stringify({
- type: "quiz",
- item: q,
- sourceModuleName: moduleName,
- })
- );
- }}
- onDragEnd={(e) => e.preventDefault()}
- >
-
- {q.name}
-
-
- ))}
- >
- );
-}
-
-function Assignments({ moduleName, day }: { moduleName: string; day: string }) {
- const { data: assignmentNames } = useAssignmentNamesQuery(moduleName);
- const { courseName } = useCourseContext();
- const { data: assignments } = useAssignmentsQueries(
- moduleName,
- assignmentNames
- );
- const todaysAssignments = useMemo(
- () =>
- assignments.filter((a) => {
- const dueDate = getDateFromStringOrThrow(
- a.dueAt,
- "due at for assignment in day"
- );
- const dayAsDate = getDateFromStringOrThrow(
- day,
- "in assignment in DayItemsInModule"
- );
- return (
- dueDate.getFullYear() === dayAsDate.getFullYear() &&
- dueDate.getMonth() === dayAsDate.getMonth() &&
- dueDate.getDate() === dayAsDate.getDate()
- );
- }),
- [assignments, day]
- );
- return (
- <>
- {todaysAssignments.map((a) => (
-
{
- e.dataTransfer.setData(
- "draggableItem",
- JSON.stringify({
- type: "assignment",
- item: a,
- sourceModuleName: moduleName,
- })
- );
- }}
- >
-
- {a.name}
-
-
- ))}
- >
- );
-}
diff --git a/nextjs/src/app/globals.css b/nextjs/src/app/globals.css
index f7aab16..244cbea 100644
--- a/nextjs/src/app/globals.css
+++ b/nextjs/src/app/globals.css
@@ -67,7 +67,7 @@ blockquote {
}
code {
- @apply font-mono text-sm bg-gray-800 px-1;
+ @apply font-mono text-sm bg-gray-800 px-1 leading-tight inline-block;
}
p {
@apply mb-3;
diff --git a/nextjs/src/app/AddNewCourse.tsx b/nextjs/src/app/newCourse/AddNewCourse.tsx
similarity index 69%
rename from nextjs/src/app/AddNewCourse.tsx
rename to nextjs/src/app/newCourse/AddNewCourse.tsx
index a1f69a1..a0b6275 100644
--- a/nextjs/src/app/AddNewCourse.tsx
+++ b/nextjs/src/app/newCourse/AddNewCourse.tsx
@@ -1,9 +1,7 @@
"use client";
-import SelectInput from "@/components/form/SelectInput";
-import { useCanvasTermsQuery } from "@/hooks/canvas/canvasHooks";
import React, { useState } from "react";
-import NewCourseForm from "./NewCourseForm";
import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling";
+import NewCourseForm from "./NewCourseForm";
export default function AddNewCourse() {
const [showForm, setShowForm] = useState(false);
@@ -14,10 +12,9 @@ export default function AddNewCourse() {
-
-
- {showForm && }
-
+
+ {showForm && }
+
diff --git a/nextjs/src/app/newCourse/NewCourseForm.tsx b/nextjs/src/app/newCourse/NewCourseForm.tsx
new file mode 100644
index 0000000..6371705
--- /dev/null
+++ b/nextjs/src/app/newCourse/NewCourseForm.tsx
@@ -0,0 +1,182 @@
+"use client";
+import { DayOfWeekInput } from "@/components/form/DayOfWeekInput";
+import SelectInput from "@/components/form/SelectInput";
+import { Spinner } from "@/components/Spinner";
+import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling";
+import { useCourseListInTermQuery } from "@/hooks/canvas/canvasCourseHooks";
+import { useCanvasTermsQuery } from "@/hooks/canvas/canvasHooks";
+import {
+ useCreateLocalCourseMutation,
+ useLocalCoursesSettingsQuery,
+} from "@/hooks/localCourse/localCoursesHooks";
+import { useEmptyDirectoriesQuery } from "@/hooks/localCourse/storageDirectoryHooks";
+import { CanvasCourseModel } from "@/models/canvas/courses/canvasCourseModel";
+import { CanvasEnrollmentTermModel } from "@/models/canvas/enrollmentTerms/canvasEnrollmentTermModel";
+import { DayOfWeek } from "@/models/local/localCourse";
+import { getCourseUrl } from "@/services/urlUtils";
+import { useRouter } from "next/navigation";
+import React, { useMemo, useState } from "react";
+
+const sampleCompose = `services:
+ canvas_manager:
+ image: alexmickelson/canvas_management:2 # pull this image regularly
+ user: 1000:1000 # userid:groupid that matches file ownership on host system
+ ports:
+ - 8080:8080 # hostPort:containerPort - you can change the first one if you like
+ env_file:
+ - .env # needs to have your CANVAS_TOKEN set
+ environment:
+ - TZ=America/Denver # prevents timezone issues for due dates
+ volumes:
+ - ~/projects/faculty/1430/2024-fall-alex/modules:/app/storage/UX
+ - ~/projects/faculty/4850_AdvancedFE/2024-fall-alex/modules:/app/storage/advanced_frontend
+`;
+
+export default function NewCourseForm() {
+ const router = useRouter();
+ const today = useMemo(() => new Date(), []);
+ const { data: canvasTerms } = useCanvasTermsQuery(today);
+ const [selectedTerm, setSelectedTerm] = useState<
+ CanvasEnrollmentTermModel | undefined
+ >();
+ const [selectedDaysOfWeek, setSelectedDaysOfWeek] = useState