From dab80069d4793f7987bf0b1effaaa840c5f2cdea Mon Sep 17 00:00:00 2001 From: swve Date: Sat, 20 Jul 2024 21:12:13 +0200 Subject: [PATCH] feat: init assignment subpages and misc python and ts improvements --- apps/api/migrations/env.py | 2 +- apps/api/migrations/script.py.mako | 4 +- .../versions/6295e05ff7d0_enum_updates.py | 4 +- ...95932_add_reference_for_assignmenttasks.py | 2 +- .../df2981bf24dd_initial_migration.py | 4 +- apps/api/src/db/courses/assignments.py | 2 +- apps/api/src/routers/courses/assignments.py | 1 - .../courses/activities/assignments.py | 3 +- .../courses/activities/uploads/sub_file.py | 3 +- .../activities/uploads/tasks_ref_files.py | 3 +- apps/web/app/home/home.tsx | 3 - .../activity/[activityid]/activity.tsx | 8 ++- .../_components/TaskEditor/TaskEditor.tsx | 3 +- .../assignments/[assignmentuuid]/page.tsx | 56 ++++++++++++------- .../subpages/AssignmentEditorSubPage.tsx | 29 ++++++++++ .../subpages/AssignmentSubmissionsSubPage.tsx | 25 +++++++++ .../Assignments/AssignmentsTaskContext.tsx | 1 - .../DraggableElements/ActivityElement.tsx | 3 - .../Create/NewActivityModal/Assignment.tsx | 2 - 19 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentEditorSubPage.tsx create mode 100644 apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentSubmissionsSubPage.tsx diff --git a/apps/api/migrations/env.py b/apps/api/migrations/env.py index 08a2dd30..f4f75f2c 100644 --- a/apps/api/migrations/env.py +++ b/apps/api/migrations/env.py @@ -1,7 +1,7 @@ import importlib from logging.config import fileConfig import os -import alembic_postgresql_enum +import alembic_postgresql_enum # noqa: F401 from sqlalchemy import engine_from_config from sqlalchemy import pool from sqlmodel import SQLModel diff --git a/apps/api/migrations/script.py.mako b/apps/api/migrations/script.py.mako index 6ce33510..0c1e80d5 100644 --- a/apps/api/migrations/script.py.mako +++ b/apps/api/migrations/script.py.mako @@ -8,8 +8,8 @@ Create Date: ${create_date} from typing import Sequence, Union from alembic import op -import sqlalchemy as sa -import sqlmodel +import sqlalchemy as sa # noqa: F401 +import sqlmodel # noqa: F401 ${imports if imports else ""} # revision identifiers, used by Alembic. diff --git a/apps/api/migrations/versions/6295e05ff7d0_enum_updates.py b/apps/api/migrations/versions/6295e05ff7d0_enum_updates.py index 4ff2406e..762028ce 100644 --- a/apps/api/migrations/versions/6295e05ff7d0_enum_updates.py +++ b/apps/api/migrations/versions/6295e05ff7d0_enum_updates.py @@ -8,8 +8,8 @@ Create Date: 2024-07-11 20:46:26.582170 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa -import sqlmodel +import sqlalchemy as sa # noqa: F401 +import sqlmodel # noqa: F401 from alembic_postgresql_enum import TableReference # type: ignore # revision identifiers, used by Alembic. diff --git a/apps/api/migrations/versions/d8bc71595932_add_reference_for_assignmenttasks.py b/apps/api/migrations/versions/d8bc71595932_add_reference_for_assignmenttasks.py index 10634418..ae5c5e2a 100644 --- a/apps/api/migrations/versions/d8bc71595932_add_reference_for_assignmenttasks.py +++ b/apps/api/migrations/versions/d8bc71595932_add_reference_for_assignmenttasks.py @@ -9,7 +9,7 @@ from typing import Sequence, Union from alembic import op import sqlalchemy as sa -import sqlmodel +import sqlmodel # noqa: F401 # revision identifiers, used by Alembic. diff --git a/apps/api/migrations/versions/df2981bf24dd_initial_migration.py b/apps/api/migrations/versions/df2981bf24dd_initial_migration.py index a6a5be8a..7dac90ee 100644 --- a/apps/api/migrations/versions/df2981bf24dd_initial_migration.py +++ b/apps/api/migrations/versions/df2981bf24dd_initial_migration.py @@ -8,9 +8,9 @@ Create Date: 2024-07-11 19:33:37.993767 from typing import Sequence, Union from alembic import op -from grpc import server +from grpc import server # noqa: F401 import sqlalchemy as sa -import sqlmodel +import sqlmodel # noqa: F401 # revision identifiers, used by Alembic. diff --git a/apps/api/src/db/courses/assignments.py b/apps/api/src/db/courses/assignments.py index a2884114..dd30b221 100644 --- a/apps/api/src/db/courses/assignments.py +++ b/apps/api/src/db/courses/assignments.py @@ -1,5 +1,5 @@ from typing import Optional, Dict -from sqlalchemy import JSON, Column, ForeignKey, null +from sqlalchemy import JSON, Column, ForeignKey from sqlmodel import Field, SQLModel from enum import Enum diff --git a/apps/api/src/routers/courses/assignments.py b/apps/api/src/routers/courses/assignments.py index 8211b776..ba3f30e4 100644 --- a/apps/api/src/routers/courses/assignments.py +++ b/apps/api/src/routers/courses/assignments.py @@ -3,7 +3,6 @@ from src.db.courses.assignments import ( AssignmentCreate, AssignmentRead, AssignmentTaskCreate, - AssignmentTaskSubmissionCreate, AssignmentTaskSubmissionUpdate, AssignmentTaskUpdate, AssignmentUpdate, diff --git a/apps/api/src/services/courses/activities/assignments.py b/apps/api/src/services/courses/activities/assignments.py index 447ec12b..14acb75b 100644 --- a/apps/api/src/services/courses/activities/assignments.py +++ b/apps/api/src/services/courses/activities/assignments.py @@ -7,7 +7,6 @@ from typing import Literal from uuid import uuid4 from fastapi import HTTPException, Request, UploadFile from sqlmodel import Session, select -from sympy import Sum from src.db.courses.activities import Activity from src.db.courses.assignments import ( @@ -1172,7 +1171,7 @@ async def read_user_assignment_submissions( # Find assignments tasks for an assignment statement = select(AssignmentUserSubmission).where( - assignment.assignment_uuid == assignment_uuid, + AssignmentUserSubmission.assignment_id == assignment.id, AssignmentUserSubmission.user_id == user_id, ) diff --git a/apps/api/src/services/courses/activities/uploads/sub_file.py b/apps/api/src/services/courses/activities/uploads/sub_file.py index 48df3cc5..9ebd46f5 100644 --- a/apps/api/src/services/courses/activities/uploads/sub_file.py +++ b/apps/api/src/services/courses/activities/uploads/sub_file.py @@ -1,4 +1,3 @@ -from uuid import uuid4 from src.services.utils.upload_content import upload_content @@ -12,7 +11,7 @@ async def upload_submission_file( assignment_task_uuid, ): contents = file.file.read() - file_format = file.filename.split(".")[-1] + file.filename.split(".")[-1] await upload_content( f"courses/{course_uuid}/activities/{activity_uuid}/assignments/{assignment_uuid}/tasks/{assignment_task_uuid}/subs", diff --git a/apps/api/src/services/courses/activities/uploads/tasks_ref_files.py b/apps/api/src/services/courses/activities/uploads/tasks_ref_files.py index d9f7c128..56981cc0 100644 --- a/apps/api/src/services/courses/activities/uploads/tasks_ref_files.py +++ b/apps/api/src/services/courses/activities/uploads/tasks_ref_files.py @@ -1,4 +1,3 @@ -from uuid import uuid4 from src.services.utils.upload_content import upload_content @@ -12,7 +11,7 @@ async def upload_reference_file( assignment_task_uuid, ): contents = file.file.read() - file_format = file.filename.split(".")[-1] + file.filename.split(".")[-1] await upload_content( f"courses/{course_uuid}/activities/{activity_uuid}/assignments/{assignment_uuid}/tasks/{assignment_task_uuid}", diff --git a/apps/web/app/home/home.tsx b/apps/web/app/home/home.tsx index 6c5c83ae..6755a7c1 100644 --- a/apps/web/app/home/home.tsx +++ b/apps/web/app/home/home.tsx @@ -17,9 +17,6 @@ function HomeClient() { const { data: orgs } = useSWR(`${getAPIUrl()}orgs/user/page/1/limit/10`, (url) => swrFetcher(url, access_token)) useEffect(() => { - console.log(orgs) - - }, [session, orgs]) return (
diff --git a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx index fe12ea9d..d441b31c 100644 --- a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx +++ b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx @@ -8,7 +8,7 @@ import { markActivityAsComplete } from '@services/courses/activity' import DocumentPdfActivity from '@components/Objects/Activities/DocumentPdf/DocumentPdf' import ActivityIndicators from '@components/Pages/Courses/ActivityIndicators' import GeneralWrapperStyled from '@components/StyledElements/Wrappers/GeneralWrapper' -import { useRouter } from 'next/navigation' +import { usePathname, useRouter } from 'next/navigation' import AuthenticatedClientElement from '@components/Security/AuthenticatedClientElement' import { getCourseThumbnailMediaDirectory } from '@services/media/media' import { useOrg } from '@components/Contexts/OrgContext' @@ -42,6 +42,7 @@ function ActivityClient(props: ActivityClientProps) { const course = props.course const org = useOrg() as any const session = useLHSession() as any; + const pathname = usePathname() const access_token = session?.data?.tokens?.access_token; const [bgColor, setBgColor] = React.useState('bg-white') const [assignment, setAssignment] = React.useState(null) as any; @@ -78,7 +79,7 @@ function ActivityClient(props: ActivityClientProps) { setBgColor('bg-zinc-950'); } } - , [activity]) + , [activity,pathname ]) return ( <> @@ -126,6 +127,7 @@ function ActivityClient(props: ActivityClientProps) {
+ {activity && activity.published == true && ( {activity.activity_type != 'TYPE_ASSIGNMENT' && <> @@ -141,7 +143,6 @@ function ActivityClient(props: ActivityClientProps) { } {activity.activity_type == 'TYPE_ASSIGNMENT' && <> - + )}
{activity && activity.published == false && ( diff --git a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/TaskEditor.tsx b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/TaskEditor.tsx index 09ba8d58..e5f910c5 100644 --- a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/TaskEditor.tsx +++ b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/TaskEditor.tsx @@ -8,8 +8,9 @@ import { GalleryVerticalEnd, Info, TentTree, Trash } from 'lucide-react' import React, { useEffect } from 'react' import toast from 'react-hot-toast'; import { mutate } from 'swr'; +import dynamic from 'next/dynamic'; import { AssignmentTaskGeneralEdit } from './Subs/AssignmentTaskGeneralEdit'; -import AssignmentTaskContentEdit from './Subs/AssignmentTaskContentEdit'; +const AssignmentTaskContentEdit = dynamic(() => import('./Subs/AssignmentTaskContentEdit')) function AssignmentTaskEditor({ page }: any) { const [selectedSubPage, setSelectedSubPage] = React.useState(page) diff --git a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/page.tsx b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/page.tsx index a31fd711..b4056e04 100644 --- a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/page.tsx +++ b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/page.tsx @@ -1,12 +1,9 @@ 'use client'; import BreadCrumbs from '@components/Dashboard/UI/BreadCrumbs' -import { BookOpen, BookX, EllipsisVertical, Eye, LayoutList } from 'lucide-react' +import { BookOpen, BookX, EllipsisVertical, Eye, Layers2, UserRoundPen } from 'lucide-react' import React, { useEffect } from 'react' import { AssignmentProvider, useAssignments } from '@components/Contexts/Assignments/AssignmentContext'; -import AssignmentTasks from './_components/Tasks'; -import { AssignmentsTaskProvider } from '@components/Contexts/Assignments/AssignmentsTaskContext'; import ToolTip from '@components/StyledElements/Tooltip/Tooltip'; -import AssignmentTaskEditor from './_components/TaskEditor/TaskEditor'; import { updateAssignment } from '@services/courses/assignments'; import { useLHSession } from '@components/Contexts/LHSessionContext'; import { mutate } from 'swr'; @@ -15,40 +12,59 @@ import toast from 'react-hot-toast'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { updateActivity } from '@services/courses/activities'; +// Lazy Loading +import dynamic from 'next/dynamic'; +import AssignmentEditorSubPage from './subpages/AssignmentEditorSubPage'; +const AssignmentSubmissionsSubPage = dynamic(() => import('./subpages/AssignmentSubmissionsSubPage')) function AssignmentEdit() { const params = useParams<{ assignmentuuid: string; }>() + const [selectedSubPage, setSelectedSubPage] = React.useState('editor') return (
-
+
-
Assignment Editor
+
Assignment Tools
+
+
setSelectedSubPage('editor')} + className={`flex space-x-4 py-2 w-fit text-center border-black transition-all ease-linear ${selectedSubPage === 'editor' + ? 'border-b-4' + : 'opacity-50' + } cursor-pointer`} + > +
+ +
Editor
+
+
+
setSelectedSubPage('submissions')} + className={`flex space-x-4 py-2 w-fit text-center border-black transition-all ease-linear ${selectedSubPage === 'submissions' + ? 'border-b-4' + : 'opacity-50' + } cursor-pointer`} + > +
+ +
Submissions
+
+
+
- -
-
- -

Tasks

-
- -
-
- - - -
-
+ {selectedSubPage === 'editor' && } + {selectedSubPage === 'submissions' && }
diff --git a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentEditorSubPage.tsx b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentEditorSubPage.tsx new file mode 100644 index 00000000..70756060 --- /dev/null +++ b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentEditorSubPage.tsx @@ -0,0 +1,29 @@ +'use client'; +import { AssignmentsTaskProvider } from '@components/Contexts/Assignments/AssignmentsTaskContext' +import { LayoutList } from 'lucide-react' +import React from 'react' +import AssignmentTasks from '../_components/Tasks' +import { AssignmentProvider } from '@components/Contexts/Assignments/AssignmentContext' +import dynamic from 'next/dynamic'; +const AssignmentTaskEditor = dynamic(() => import('../_components/TaskEditor/TaskEditor')) + +function AssignmentEditorSubPage({ assignmentuuid }: { assignmentuuid: string }) { + return ( + +
+
+ +

Tasks

+
+ +
+
+ + + +
+
+ ) +} + +export default AssignmentEditorSubPage \ No newline at end of file diff --git a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentSubmissionsSubPage.tsx b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentSubmissionsSubPage.tsx new file mode 100644 index 00000000..c4266fe8 --- /dev/null +++ b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/subpages/AssignmentSubmissionsSubPage.tsx @@ -0,0 +1,25 @@ +import { useLHSession } from '@components/Contexts/LHSessionContext'; +import { getAPIUrl } from '@services/config/config' +import { swrFetcher } from '@services/utils/ts/requests'; +import React from 'react' +import useSWR from 'swr'; + +function AssignmentSubmissionsSubPage({ assignment_uuid }: { assignment_uuid: string }) { + const session = useLHSession() as any; + const access_token = session?.data?.tokens?.access_token; + + const { data: assignmentSubmission, error: assignmentError } = useSWR( + `${getAPIUrl()}assignments/assignment_${assignment_uuid}/submissions`, + (url) => swrFetcher(url, access_token) + ) + return ( +
+ {assignmentSubmission && assignmentSubmission.length > 0 && ( +
s
+ )} + +
+ ) +} + +export default AssignmentSubmissionsSubPage \ No newline at end of file diff --git a/apps/web/components/Contexts/Assignments/AssignmentsTaskContext.tsx b/apps/web/components/Contexts/Assignments/AssignmentsTaskContext.tsx index 32b69145..6cfeccfc 100644 --- a/apps/web/components/Contexts/Assignments/AssignmentsTaskContext.tsx +++ b/apps/web/components/Contexts/Assignments/AssignmentsTaskContext.tsx @@ -78,7 +78,6 @@ export function useAssignmentsTaskDispatch() { function assignmentstaskReducer(state: State, action: Action): State { switch (action.type) { case 'setSelectedAssignmentTaskUUID': - console.log('st', action.payload) return { ...state, selectedAssignmentTaskUUID: action.payload }; case 'setAssignmentTask': return { ...state, assignmentTask: action.payload }; diff --git a/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx b/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx index 9a226bb0..3af1484a 100644 --- a/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx +++ b/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx @@ -254,9 +254,6 @@ const ActivityElementOptions = ({ activity }: any) => { }; useEffect(() => { - - console.log(activity) - fetchAssignmentUUID(); }, [activity, course]); diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx index 95abf80b..f69d7cbc 100644 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx @@ -55,8 +55,6 @@ function NewAssignment({ submitActivity, chapterId, course, closeModal }: any) { } const activity_res = await createActivity(activity, chapterId, org?.id, session.data?.tokens?.access_token) - console.log(course) - console.log(activity_res) await createAssignment({ title: activityName, description: activityDescription,