From b7ef575d83b1cb5c8347f07d7a1e3fb6737a4eda Mon Sep 17 00:00:00 2001 From: swve Date: Wed, 11 Jan 2023 23:06:32 +0100 Subject: [PATCH 1/8] feat: update course ui --- .../[orgslug]/course/[courseid]/page.tsx | 141 +++++++++++------- front/app/layout.tsx | 17 +-- 2 files changed, 98 insertions(+), 60 deletions(-) diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx index 964be16e..95704b73 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx @@ -8,7 +8,7 @@ import Layout from "../../../../../components/UI/Layout"; import { getAPIUrl, getBackendUrl } from "../../../../../services/config"; import { getCourse, getCourseMetadata } from "../../../../../services/courses/courses"; -const CourseIdPage = (params : any) => { +const CourseIdPage = (params: any) => { const router = useRouter(); const courseid = params.params.courseid; const orgslug = params.params.orgslug; @@ -21,7 +21,6 @@ const CourseIdPage = (params : any) => { setCourseInfo(course); - setIsLoading(false); } @@ -43,30 +42,26 @@ const CourseIdPage = (params : any) => {

Course

{courseInfo.course.name}{" "} - - + - {" "}

-
{courseInfo.chapters.map((chapter: any) => { - return <> - {chapter.elements.map((element: any) => { - return <> - - - - - {" "} - ; - })} -      - ; + return ( + <> + {chapter.elements.map((element: any) => { + return ( + <> + + + {" "} + + ); + })} +      + + ); })} @@ -75,34 +70,40 @@ const CourseIdPage = (params : any) => {

Description

-

{courseInfo.course.description}

+ + +

{courseInfo.course.description}

+

What you will learn

-

{courseInfo.course.learnings == ![] ? "no data" : courseInfo.course.learnings}

+ +

{courseInfo.course.learnings == ![] ? "no data" : courseInfo.course.learnings}

+

Course Lessons

- {courseInfo.chapters.map((chapter: any) => { - return <> -

Chapter : {chapter.name}

- {chapter.elements.map((element: any) => { - return <> -

- Element {element.name} - - - - - {" "} -

- ; - })} -      - ; - })} + + {courseInfo.chapters.map((chapter: any) => { + return ( + <> +

Chapter : {chapter.name}

+ {chapter.elements.map((element: any) => { + return ( + <> +

+ Element {element.name} + + + {" "} +

+ + ); + })} +      + + ); + })} +
)} @@ -111,12 +112,12 @@ const CourseIdPage = (params : any) => { const CourseThumbnailWrapper = styled.div` display: flex; + padding-bottom: 20px; img { - width: 794px; - height: 224.28px; + width: 100%; + height: 300px; object-fit: cover; - object-position: top; - + object-position: center; background: url(), #d9d9d9; border: 1px solid rgba(255, 255, 255, 0.19); box-shadow: 0px 13px 33px -13px rgba(0, 0, 0, 0.42); @@ -124,21 +125,39 @@ const CourseThumbnailWrapper = styled.div` } `; const CoursePageLayout = styled.div` - margin-left: 40px; - margin-right: 40px; + width: 1300px; + margin: 0 auto; + p { + margin-bottom: 0px; + letter-spacing: -0.05em; + + color: #727272; + font-weight: 700; + } + h1 { + margin-top: 5px; + letter-spacing: -0.05em; + margin-bottom: 10px; + } + + `; const ChaptersWrapper = styled.div` display: flex; + justify-content: space-around; + width: 100%; `; const ChapterIndicator = styled.div` border-radius: 20px; height: 5px; background: #151515; border-radius: 3px; - width: 40px; + + width: 35px; background-color: black; margin: 10px; + margin-bottom: 20px; margin-left: 0px; transition: all 0.2s ease; @@ -148,4 +167,24 @@ const ChapterIndicator = styled.div` } `; +const BoxWrapper = styled.div` + background: #ffffff; + box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.03); + border-radius: 7px; + padding: 20px; + padding-top: 7px; + padding-left: 30px; + + + p { + font-family: "DM Sans"; + font-style: normal; + font-weight: 500; + line-height: 16px; + letter-spacing: -0.02em; + + color: #9d9d9d; + } +`; + export default CourseIdPage; diff --git a/front/app/layout.tsx b/front/app/layout.tsx index ca3ebae0..71fb5ed3 100644 --- a/front/app/layout.tsx +++ b/front/app/layout.tsx @@ -1,15 +1,14 @@ -import '../styles/globals.css' -import StyledComponentsRegistry from '../services/lib/styled-registry' +import "../styles/globals.css"; +import StyledComponentsRegistry from "../services/lib/styled-registry"; -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - {children} + + {" "} + {children} + - ) + ); } From af8542069ff98384c676ac5df6a49599906d9ca6 Mon Sep 17 00:00:00 2001 From: swve Date: Wed, 11 Jan 2023 23:30:13 +0100 Subject: [PATCH 2/8] feat: update save button ui --- .../[courseid]/element/[elementid]/edit/page.tsx | 5 +---- front/components/Editor/Editor.tsx | 16 +++++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/edit/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/edit/page.tsx index d94769dd..49018d18 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/edit/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/edit/page.tsx @@ -1,3 +1,4 @@ + "use client"; import { default as React, useEffect, useRef } from "react"; @@ -10,10 +11,6 @@ import AuthProvider from "../../../../../../../../components/Security/AuthProvid import EditorWrapper from "../../../../../../../../components/Editor/EditorWrapper"; import { getCourseMetadata } from "../../../../../../../../services/courses/courses"; -// Workaround (Next.js SSR doesn't support tip tap editor) -const Editor: any = dynamic(() => import("../../../../../../../../components/Editor/EditorWrapper") as any, { - ssr: false, -}); function EditElement(params: any) { const router = useRouter(); diff --git a/front/components/Editor/Editor.tsx b/front/components/Editor/Editor.tsx index f4f6c5d7..b24c05c9 100644 --- a/front/components/Editor/Editor.tsx +++ b/front/components/Editor/Editor.tsx @@ -18,6 +18,7 @@ import WarningCallout from "./Extensions/Callout/Warning/WarningCallout"; import ImageBlock from "./Extensions/Image/ImageBlock"; import Youtube from "@tiptap/extension-youtube"; import VideoBlock from "./Extensions/Video/VideoBlock"; +import { Save } from "lucide-react"; interface Editor { content: string; @@ -97,7 +98,7 @@ function Editor(props: Editor) { {" "} {props.course.course.name} {props.element.name}{" "} - props.setContent(editor.getJSON())}>Save + props.setContent(editor.getJSON())}>Save @@ -213,24 +214,29 @@ const EditorInfoDocName = styled.div` const EditorSaveButton = styled.div` display: flex; - border-radius: 6px; + border-radius: 8px; padding: 5px; font-size: 12px; margin-right: 5px; margin-left: 7px; - background: rgba(176, 176, 176, 0.145); + background: #ffffff8d; + color: #5252528d; + border: solid 1px #52525257; + align-items: center; + justify-content: space-between; + width: 53px; + &.is-active { background: rgba(176, 176, 176, 0.5); &:hover { - background: rgba(139, 139, 139, 0.5); + background: rgba(31, 31, 31, 0.5); cursor: pointer; } } &:hover { - background: rgba(217, 217, 217, 0.48); cursor: pointer; } `; From 26e077eed4a248ef1e0046e3b67aa556bcb64f74 Mon Sep 17 00:00:00 2001 From: swve Date: Fri, 13 Jan 2023 18:45:56 +0100 Subject: [PATCH 3/8] feat: init element ui design --- .../[courseid]/element/[elementid]/page.tsx | 130 ++++++++++++++++-- front/app/_orgs/[orgslug]/page.tsx | 2 +- front/app/layout.tsx | 4 +- front/components/UI/Layout.tsx | 6 +- 4 files changed, 124 insertions(+), 18 deletions(-) diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx index 0ddb9693..5c1a41f7 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx @@ -1,26 +1,41 @@ "use client"; import { useRouter } from "next/navigation"; +import Link from "next/link"; import React, { useMemo } from "react"; import Layout from "../../../../../../../components/UI/Layout"; import { getElement } from "../../../../../../../services/courses/elements"; import { getBackendUrl } from "../../../../../../../services/config"; import Canva from "../../../../../../../components/Canva/Canva"; +import styled from "styled-components"; +import { getCourse, getCourseMetadata } from "../../../../../../../services/courses/courses"; + function ElementPage(params: any) { const router = useRouter(); const elementid = params.params.elementid; + const courseid = params.params.courseid; + const orgslug = params.params.orgslug; const [element, setElement] = React.useState({}); + const [course, setCourse] = React.useState({}); const [isLoading, setIsLoading] = React.useState(true); async function fetchElementData() { + setIsLoading(true); const element = await getElement("element_" + elementid); setElement(element); + } + + async function fetchCourseData() { + const course = await getCourseMetadata("course_" + courseid); + setCourse(course); + console.log(course); setIsLoading(false); } React.useEffect(() => { if (elementid) { fetchElementData(); + fetchCourseData(); } return () => {}; // eslint-disable-next-line react-hooks/exhaustive-deps @@ -31,20 +46,115 @@ function ElementPage(params: any) { {isLoading ? (
Loading...
) : ( -
-

element

-

{element.name}

-
+ + + + + + + + +

Lecture

+

{element.name}

+
+
+ + {course.chapters.map((chapter: any) => { + return ( + <> +
+ {chapter.elements.map((element: any) => { + return ( + <> + + + {" "} + + ); + })} +
+      + + ); + })} +
- {element.type == "dynamic" && } - {/* todo : use apis & streams instead of this */} - {element.type == "video" && ( - - )} -
+ + {element.type == "dynamic" && } + {/* todo : use apis & streams instead of this */} + {element.type == "video" && ( + + )} + + )} ); } +const LectureLayout = styled.div``; + +const LectureThumbnail = styled.div` + padding-right: 30px; + justify-self: center; + img { + box-shadow: 0px 13px 33px -13px rgba(0, 0, 0, 0.42); + border-radius: 7px; + width: 100px; + height: 57px; + } +`; +const LectureInfo = styled.div` + h1 { + margin-top: 0px; + } + + p { + margin-top: 0; + margin-bottom: 0; + font-weight: 700; + } +`; + +const ChaptersWrapper = styled.div` + display: flex; + // row + flex-direction: row; + justify-content: space-around; + width: 100%; + width: 1300px; + margin: 0 auto; +`; + +const ChapterIndicator = styled.div` + border-radius: 20px; + height: 5px; + background: #151515; + border-radius: 3px; + + width: 35px; + background-color: black; + margin: 10px; + margin-bottom: 0px; + margin-left: 0px; + transition: all 0.2s ease; + + &:hover { + width: 50px; + cursor: pointer; + } +`; + +const LectureTopWrapper = styled.div` + width: 1300px; + padding-top: 50px; + margin: 0 auto; + display: flex; +`; + +const CourseContent = styled.div` + display: flex; + background-color: white; + min-height: 600px; +`; export default ElementPage; diff --git a/front/app/_orgs/[orgslug]/page.tsx b/front/app/_orgs/[orgslug]/page.tsx index 21c5c527..e2b7e478 100644 --- a/front/app/_orgs/[orgslug]/page.tsx +++ b/front/app/_orgs/[orgslug]/page.tsx @@ -13,7 +13,7 @@ const OrgHomePage = (params: any) => { return (
-
+ Welcome {orgslug} 👋🏻 diff --git a/front/app/layout.tsx b/front/app/layout.tsx index 71fb5ed3..9f0b19de 100644 --- a/front/app/layout.tsx +++ b/front/app/layout.tsx @@ -1,12 +1,12 @@ + import "../styles/globals.css"; import StyledComponentsRegistry from "../services/lib/styled-registry"; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - + - {" "} {children} diff --git a/front/components/UI/Layout.tsx b/front/components/UI/Layout.tsx index 6606e03c..070eea57 100644 --- a/front/components/UI/Layout.tsx +++ b/front/components/UI/Layout.tsx @@ -1,4 +1,4 @@ - +"use client"; import React from "react"; import Head from "next/head"; import styled from "styled-components"; @@ -14,8 +14,6 @@ const Layout = (props: any) => { }; return ( - - 🚧 Dev Phase @@ -33,8 +31,6 @@ const Layout = (props: any) => {

LearnHouse © 2021 - {new Date().getFullYear()} - All rights reserved

- - ); }; From 88dc060bae32dd62f5224ffca70629ded1f05f60 Mon Sep 17 00:00:00 2001 From: swve Date: Sat, 14 Jan 2023 01:36:54 +0100 Subject: [PATCH 4/8] fix: layout updates --- .../_orgs/[orgslug]/collections/new/page.tsx | 4 +- .../app/_orgs/[orgslug]/collections/page.tsx | 4 +- .../[orgslug]/course/[courseid]/edit/page.tsx | 4 +- .../[courseid]/element/[elementid]/page.tsx | 4 +- .../[orgslug]/course/[courseid]/page.tsx | 4 +- .../app/_orgs/[orgslug]/courses/new/page.tsx | 6 +- front/app/_orgs/[orgslug]/courses/page.tsx | 15 +- front/app/_orgs/[orgslug]/layout.tsx | 14 + front/app/_orgs/[orgslug]/page.tsx | 13 +- front/app/_orgs/[orgslug]/template.tsx | 25 + front/app/layout.tsx | 22 +- front/app/login/page.tsx | 4 +- front/app/page.tsx | 3 +- front/app/signup/page.tsx | 1 + front/components/Security/AuthProvider.tsx | 5 +- front/package-lock.json | 3673 +++++++++++++++-- front/package.json | 2 +- front/services/auth/auth.ts | 4 +- 18 files changed, 3479 insertions(+), 328 deletions(-) create mode 100644 front/app/_orgs/[orgslug]/layout.tsx create mode 100644 front/app/_orgs/[orgslug]/template.tsx diff --git a/front/app/_orgs/[orgslug]/collections/new/page.tsx b/front/app/_orgs/[orgslug]/collections/new/page.tsx index 609da319..0a1c0b50 100644 --- a/front/app/_orgs/[orgslug]/collections/new/page.tsx +++ b/front/app/_orgs/[orgslug]/collections/new/page.tsx @@ -57,7 +57,7 @@ function NewCollection(params : any) { }, [params.params.orgslug]); return ( - + <> Add new
@@ -90,7 +90,7 @@ function NewCollection(params : any) {
-
+ ); } diff --git a/front/app/_orgs/[orgslug]/collections/page.tsx b/front/app/_orgs/[orgslug]/collections/page.tsx index ddcffa93..3207daec 100644 --- a/front/app/_orgs/[orgslug]/collections/page.tsx +++ b/front/app/_orgs/[orgslug]/collections/page.tsx @@ -35,7 +35,7 @@ function Collections(params:any) { }, []); return ( - + <> {orgslug} Collections :{" "} <Link href={"/collections/new"}> @@ -61,7 +61,7 @@ function Collections(params:any) { ))} </div> )} - </Layout> + </> ); } diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/edit/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/edit/page.tsx index 8100a8a7..1ea53a4f 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/edit/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/edit/page.tsx @@ -225,7 +225,7 @@ function CourseEdit(params: any) { }; return ( - <Layout> + <> <Header></Header> <Title> Edit Course Chapters{" "} @@ -283,7 +283,7 @@ function CourseEdit(params: any) { </DragDropContext> </ChapterlistWrapper> )} - </Layout> + </> ); } diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx index 5c1a41f7..7ca02e62 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/element/[elementid]/page.tsx @@ -42,7 +42,7 @@ function ElementPage(params: any) { }, [elementid]); return ( - <Layout> + <> {isLoading ? ( <div>Loading...</div> ) : ( @@ -88,7 +88,7 @@ function ElementPage(params: any) { </CourseContent> </LectureLayout> )} - </Layout> + </> ); } diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx index 95704b73..8a3273b6 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/page.tsx @@ -33,7 +33,7 @@ const CourseIdPage = (params: any) => { }, [courseid && orgslug]); return ( - <Layout> + <> {isLoading ? ( <div>Loading...</div> ) : ( @@ -106,7 +106,7 @@ const CourseIdPage = (params: any) => { </BoxWrapper> </CoursePageLayout> )} - </Layout> + </> ); }; diff --git a/front/app/_orgs/[orgslug]/courses/new/page.tsx b/front/app/_orgs/[orgslug]/courses/new/page.tsx index 971ab532..a05ad43c 100644 --- a/front/app/_orgs/[orgslug]/courses/new/page.tsx +++ b/front/app/_orgs/[orgslug]/courses/new/page.tsx @@ -1,3 +1,4 @@ +"use client"; import { useRouter } from "next/navigation"; import React from "react"; import { Header } from "../../../../../components/UI/Header"; @@ -55,8 +56,7 @@ const NewCoursePage = (params: any) => { return ( - <Layout title="New course"> - <Header></Header> + <> <Title>New Course
Name :
@@ -64,7 +64,7 @@ const NewCoursePage = (params: any) => { Cover Photo :
Learnings (empty for now) (separated by ; ) :