diff --git a/apps/api/src/routers/blocks.py b/apps/api/src/routers/blocks.py index a30c6cd4..19f4b03b 100644 --- a/apps/api/src/routers/blocks.py +++ b/apps/api/src/routers/blocks.py @@ -28,14 +28,14 @@ router = APIRouter() async def api_create_image_file_block( request: Request, file_object: UploadFile, - activity_id: str = Form(), + activity_uuid: str = Form(), db_session=Depends(get_db_session), current_user: PublicUser = Depends(get_current_user), ) -> BlockRead: """ Create new image file """ - return await create_image_block(request, file_object, activity_id, db_session) + return await create_image_block(request, file_object, activity_uuid, db_session) @router.get("/image") @@ -60,14 +60,14 @@ async def api_get_image_file_block( async def api_create_video_file_block( request: Request, file_object: UploadFile, - activity_id: str = Form(), + activity_uuid: str = Form(), db_session=Depends(get_db_session), current_user: PublicUser = Depends(get_current_user), ) -> BlockRead: """ Create new video file """ - return await create_video_block(request, file_object, activity_id, db_session) + return await create_video_block(request, file_object, activity_uuid, db_session) @router.get("/video") @@ -92,14 +92,14 @@ async def api_get_video_file_block( async def api_create_pdf_file_block( request: Request, file_object: UploadFile, - activity_id: str = Form(), + activity_uuid: str = Form(), db_session=Depends(get_db_session), current_user: PublicUser = Depends(get_current_user), ) -> BlockRead: """ Create new pdf file """ - return await create_pdf_block(request, file_object, activity_id, db_session) + return await create_pdf_block(request, file_object, activity_uuid, db_session) @router.get("/pdf") diff --git a/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py b/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py index ebabade3..f32e69e9 100644 --- a/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py +++ b/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py @@ -1,5 +1,6 @@ from datetime import datetime from uuid import uuid4 +from src.db.organizations import Organization from fastapi import HTTPException, status, UploadFile, Request from sqlmodel import Session, select from src.db.activities import Activity @@ -10,9 +11,9 @@ from src.services.users.users import PublicUser async def create_image_block( - request: Request, image_file: UploadFile, activity_id: str, db_session: Session + request: Request, image_file: UploadFile, activity_uuid: str, db_session: Session ): - statement = select(Activity).where(Activity.id == activity_id) + statement = select(Activity).where(Activity.activity_uuid == activity_uuid) activity = db_session.exec(statement).first() if not activity: @@ -22,8 +23,9 @@ async def create_image_block( block_type = "imageBlock" - # get org_id from activity - org_id = activity.org_id + # get org_uuid + statement = select(Organization).where(Organization.id == activity.org_id) + org = db_session.exec(statement).first() # get course statement = select(Course).where(Course.id == activity.course_id) @@ -40,12 +42,12 @@ async def create_image_block( block_data = await upload_file_and_return_file_object( request, image_file, - activity_id, + activity_uuid, block_uuid, ["jpg", "jpeg", "png", "gif"], block_type, - str(org_id), - str(course.id), + org.org_uuid, + str(course.course_uuid), ) # create block @@ -53,7 +55,7 @@ async def create_image_block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_IMAGE, content=block_data.dict(), - org_id=org_id, + org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, creation_date=str(datetime.now()), diff --git a/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py b/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py index 708497e2..48c06a20 100644 --- a/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py +++ b/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py @@ -1,5 +1,6 @@ from datetime import datetime from uuid import uuid4 +from src.db.organizations import Organization from fastapi import HTTPException, status, UploadFile, Request from sqlmodel import Session, select from src.db.activities import Activity @@ -11,9 +12,9 @@ from src.services.users.users import PublicUser async def create_pdf_block( - request: Request, pdf_file: UploadFile, activity_id: str, db_session: Session + request: Request, pdf_file: UploadFile, activity_uuid: str, db_session: Session ): - statement = select(Activity).where(Activity.id == activity_id) + statement = select(Activity).where(Activity.activity_uuid == activity_uuid) activity = db_session.exec(statement).first() if not activity: @@ -23,8 +24,9 @@ async def create_pdf_block( block_type = "pdfBlock" - # get org_id from activity - org_id = activity.org_id + # get org_uuid + statement = select(Organization).where(Organization.id == activity.org_id) + org = db_session.exec(statement).first() # get course statement = select(Course).where(Course.id == activity.course_id) @@ -41,12 +43,12 @@ async def create_pdf_block( block_data = await upload_file_and_return_file_object( request, pdf_file, - activity_id, + activity_uuid, block_uuid, ["pdf"], block_type, - str(org_id), - str(course.id), + org.org_uuid, + str(course.course_uuid), ) # create block @@ -54,7 +56,7 @@ async def create_pdf_block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_DOCUMENT_PDF, content=block_data.dict(), - org_id=org_id, + org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, creation_date=str(datetime.now()), diff --git a/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py b/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py index 53006497..ab6735d7 100644 --- a/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py +++ b/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py @@ -1,5 +1,6 @@ from datetime import datetime from uuid import uuid4 +from src.db.organizations import Organization from fastapi import HTTPException, status, UploadFile, Request from sqlmodel import Session, select from src.db.activities import Activity @@ -11,9 +12,9 @@ from src.services.users.users import PublicUser async def create_video_block( - request: Request, video_file: UploadFile, activity_id: str, db_session: Session + request: Request, video_file: UploadFile, activity_uuid: str, db_session: Session ): - statement = select(Activity).where(Activity.id == activity_id) + statement = select(Activity).where(Activity.activity_uuid == activity_uuid) activity = db_session.exec(statement).first() if not activity: @@ -23,8 +24,9 @@ async def create_video_block( block_type = "videoBlock" - # get org_id from activity - org_id = activity.org_id + # get org_uuid + statement = select(Organization).where(Organization.id == activity.org_id) + org = db_session.exec(statement).first() # get course statement = select(Course).where(Course.id == activity.course_id) @@ -41,12 +43,12 @@ async def create_video_block( block_data = await upload_file_and_return_file_object( request, video_file, - activity_id, + activity_uuid, block_uuid, ["mp4", "webm", "ogg"], block_type, - str(org_id), - str(course.id), + org.org_uuid, + str(course.course_uuid), ) # create block @@ -54,7 +56,7 @@ async def create_video_block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_VIDEO, content=block_data.dict(), - org_id=org_id, + org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, creation_date=str(datetime.now()), diff --git a/apps/api/src/services/blocks/schemas/files.py b/apps/api/src/services/blocks/schemas/files.py index c66edf34..dcbef83f 100644 --- a/apps/api/src/services/blocks/schemas/files.py +++ b/apps/api/src/services/blocks/schemas/files.py @@ -7,4 +7,4 @@ class BlockFile(BaseModel): file_name: str file_size: int file_type: str - activity_id: str \ No newline at end of file + activity_uuid: str \ No newline at end of file diff --git a/apps/api/src/services/blocks/utils/upload_files.py b/apps/api/src/services/blocks/utils/upload_files.py index a3ae2096..76ebd1c7 100644 --- a/apps/api/src/services/blocks/utils/upload_files.py +++ b/apps/api/src/services/blocks/utils/upload_files.py @@ -7,12 +7,12 @@ from src.services.utils.upload_content import upload_content async def upload_file_and_return_file_object( request: Request, file: UploadFile, - activity_id: str, + activity_uuid: str, block_id: str, list_of_allowed_file_formats: list, type_of_block: str, - org_id: str, - course_id: str, + org_uuid: str, + course_uuid: str, ): # get file id file_id = str(uuid.uuid4()) @@ -45,12 +45,12 @@ async def upload_file_and_return_file_object( file_name=file_name, file_size=file_size, file_type=file_type, - activity_id=activity_id, + activity_uuid=activity_uuid, ) await upload_content( - f"courses/{course_id}/activities/{activity_id}/dynamic/blocks/{type_of_block}/{block_id}", - org_id=org_id, + f"courses/{course_uuid}/activities/{activity_uuid}/dynamic/blocks/{type_of_block}/{block_id}", + org_uuid=org_uuid, file_binary=file_binary, file_and_format=f"{file_id}.{file_format}", ) 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 e2f76e49..9708b589 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 @@ -12,6 +12,7 @@ import { useRouter } from "next/navigation"; import AuthenticatedClientElement from "@components/Security/AuthenticatedClientElement"; import { getCourseThumbnailMediaDirectory } from "@services/media/media"; import { useOrg } from "@components/Contexts/OrgContext"; +import { CourseProvider } from "@components/Contexts/CourseContext"; interface ActivityClientProps { activityid: string; @@ -44,47 +45,49 @@ function ActivityClient(props: ActivityClientProps) { return ( <> - -
-
-
- - - -
-
-

Course

-

{course.name}

-
-
- - -
-
-

Chapter : {getChapterName(activity.coursechapter_id)}

-

{activity.name}

-
-
- - - - -
-
- - {activity ? ( -
-
- {activity.activity_type == "TYPE_DYNAMIC" && } - {/* todo : use apis & streams instead of this */} - {activity.activity_type == "TYPE_VIDEO" && } - {activity.activity_type == "TYPE_DOCUMENT" && } + + +
+
+
+ + + +
+
+

Course

+

{course.name}

- ) : (
)} - {
} -
-
+ + +
+
+

Chapter : {getChapterName(activity.coursechapter_id)}

+

{activity.name}

+
+
+ + + + +
+
+ + {activity ? ( +
+
+ {activity.activity_type == "TYPE_DYNAMIC" && } + {/* todo : use apis & streams instead of this */} + {activity.activity_type == "TYPE_VIDEO" && } + {activity.activity_type == "TYPE_DOCUMENT" && } +
+
+ ) : (
)} + {
} +
+ + ); } @@ -110,7 +113,7 @@ export function MarkStatus(props: { activity: any, activityid: string, course: a console.log('isActivityCompleted', isActivityCompleted()); return ( - <>{ isActivityCompleted() ? ( + <>{isActivityCompleted() ? (
diff --git a/apps/web/components/Objects/Editor/Editor.tsx b/apps/web/components/Objects/Editor/Editor.tsx index 297a10f8..4db1cc14 100644 --- a/apps/web/components/Objects/Editor/Editor.tsx +++ b/apps/web/components/Objects/Editor/Editor.tsx @@ -36,6 +36,8 @@ import ts from 'highlight.js/lib/languages/typescript' import html from 'highlight.js/lib/languages/xml' import python from 'highlight.js/lib/languages/python' import java from 'highlight.js/lib/languages/java' +import { CourseProvider } from "@components/Contexts/CourseContext"; +import { OrgProvider } from "@components/Contexts/OrgContext"; interface Editor { @@ -127,71 +129,75 @@ function Editor(props: Editor) { return ( - - - - - - - - - - - - {" "} - {props.course.name} {props.activity.name}{" "} - + + + + + + + + + + + + + + {" "} + {props.course.name} {props.activity.name}{" "} + - - - - - - - - {!auth.isAuthenticated && Loading} - {auth.isAuthenticated && } - - - -
props.setContent(editor.getJSON())}> Save
- - -
- -
- -
-
-
-
-
- - - - - +
+ + + +
+ + + {!auth.isAuthenticated && Loading} + {auth.isAuthenticated && } + + + +
props.setContent(editor.getJSON())}> Save
+ + +
+ +
+ +
+
+
+
+
+ + + + + + +
); } diff --git a/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx b/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx index bdfe4bc3..e34d59f0 100644 --- a/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx +++ b/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx @@ -1,19 +1,22 @@ import { NodeViewWrapper } from "@tiptap/react"; -import React from "react"; +import React, { useEffect } from "react"; import styled from "styled-components"; import { Resizable } from 're-resizable'; import { AlertTriangle, Image, Loader } from "lucide-react"; import { uploadNewImageFile } from "../../../../../services/blocks/Image/images"; import { UploadIcon } from "@radix-ui/react-icons"; import { getActivityBlockMediaDirectory } from "@services/media/media"; +import { useOrg } from "@components/Contexts/OrgContext"; +import { useCourse } from "@components/Contexts/CourseContext"; function ImageBlockComponent(props: any) { + const org = useOrg() as any; + const course = useCourse() as any; const [image, setImage] = React.useState(null); const [isLoading, setIsLoading] = React.useState(false); const [blockObject, setblockObject] = React.useState(props.node.attrs.blockObject); const [imageSize, setImageSize] = React.useState({ width: props.node.attrs.size ? props.node.attrs.size.width : 300 }); - const fileId = blockObject ? `${blockObject.block_data.file_id}.${blockObject.block_data.file_format}` : null; - + const fileId = blockObject ? `${blockObject.content.file_id}.${blockObject.content.file_format}` : null; const handleImageChange = (event: React.ChangeEvent) => { setImage(event.target.files[0]); }; @@ -21,7 +24,7 @@ function ImageBlockComponent(props: any) { const handleSubmit = async (e: any) => { e.preventDefault(); setIsLoading(true); - let object = await uploadNewImageFile(image, props.extension.options.activity.activity_id); + let object = await uploadNewImageFile(image, props.extension.options.activity.activity_uuid); setIsLoading(false); setblockObject(object); props.updateAttributes({ @@ -30,6 +33,10 @@ function ImageBlockComponent(props: any) { }); }; + useEffect(() => { + } + , [course, org]); + return ( {!blockObject && props.extension.options.editable && ( @@ -50,10 +57,10 @@ function ImageBlockComponent(props: any) { {blockObject && ( { @@ -68,15 +75,15 @@ function ImageBlockComponent(props: any) { }} > - + diff --git a/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx b/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx index 2ebc9316..b55f935f 100644 --- a/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx +++ b/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx @@ -1,17 +1,21 @@ import { NodeViewWrapper } from "@tiptap/react"; -import React from "react"; +import React, { useEffect } from "react"; import styled from "styled-components"; import { AlertCircle, AlertTriangle, FileText, Image, ImagePlus, Info, Loader } from "lucide-react"; import { getPDFFile, uploadNewPDFFile } from "../../../../../services/blocks/Pdf/pdf"; import { getBackendUrl } from "../../../../../services/config/config"; import { UploadIcon } from "@radix-ui/react-icons"; import { getActivityBlockMediaDirectory } from "@services/media/media"; +import { useOrg } from "@components/Contexts/OrgContext"; +import { useCourse } from "@components/Contexts/CourseContext"; function PDFBlockComponent(props: any) { + const org = useOrg() as any; + const course = useCourse() as any; const [pdf, setPDF] = React.useState(null); const [isLoading, setIsLoading] = React.useState(false); const [blockObject, setblockObject] = React.useState(props.node.attrs.blockObject); - const fileId = blockObject ? `${blockObject.block_data.file_id}.${blockObject.block_data.file_format}` : null; + const fileId = blockObject ? `${blockObject.content.file_id}.${blockObject.content.file_format}` : null; const handlePDFChange = (event: React.ChangeEvent) => { setPDF(event.target.files[0]); @@ -20,7 +24,7 @@ function PDFBlockComponent(props: any) { const handleSubmit = async (e: any) => { e.preventDefault(); setIsLoading(true); - let object = await uploadNewPDFFile(pdf, props.extension.options.activity.activity_id); + let object = await uploadNewPDFFile(pdf, props.extension.options.activity.activity_uuid); setIsLoading(false); setblockObject(object); props.updateAttributes({ @@ -28,6 +32,10 @@ function PDFBlockComponent(props: any) { }); }; + useEffect(() => { + } + , [course, org]); + return ( {!blockObject && ( @@ -49,10 +57,10 @@ function PDFBlockComponent(props: any) {