From 55c097a50e5ad463d7df3e0c5b1e41ca166b3415 Mon Sep 17 00:00:00 2001 From: swve Date: Wed, 13 Dec 2023 22:03:22 +0100 Subject: [PATCH] feat: init org settings --- apps/api/src/services/orgs/orgs.py | 2 +- .../dash/org/settings/[subpage]/page.tsx | 51 ++++++ .../Org/OrgEditGeneral/OrgEditGeneral.tsx | 154 ++++++++++++++++++ .../components/Dashboard/UI/BreadCrumbs.tsx | 6 +- apps/web/components/Dashboard/UI/LeftMenu.tsx | 24 ++- apps/web/components/Objects/Menu/Menu.tsx | 6 +- 6 files changed, 227 insertions(+), 16 deletions(-) create mode 100644 apps/web/app/orgs/[orgslug]/dash/org/settings/[subpage]/page.tsx create mode 100644 apps/web/components/Dashboard/Org/OrgEditGeneral/OrgEditGeneral.tsx diff --git a/apps/api/src/services/orgs/orgs.py b/apps/api/src/services/orgs/orgs.py index 78afa4fb..dec8f7ff 100644 --- a/apps/api/src/services/orgs/orgs.py +++ b/apps/api/src/services/orgs/orgs.py @@ -142,7 +142,7 @@ async def update_org( slug_available = result.first() - if slug_available: + if slug_available and slug_available.id != org_id: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Organization slug already exists", diff --git a/apps/web/app/orgs/[orgslug]/dash/org/settings/[subpage]/page.tsx b/apps/web/app/orgs/[orgslug]/dash/org/settings/[subpage]/page.tsx new file mode 100644 index 00000000..d5128970 --- /dev/null +++ b/apps/web/app/orgs/[orgslug]/dash/org/settings/[subpage]/page.tsx @@ -0,0 +1,51 @@ +'use client'; +import BreadCrumbs from '@components/Dashboard/UI/BreadCrumbs' +import { getUriWithOrg } from '@services/config/config' +import { Info } from 'lucide-react' +import Link from 'next/link' +import React from 'react' +import { motion } from 'framer-motion' +import OrgEditGeneral from '@components/Dashboard/Org/OrgEditGeneral/OrgEditGeneral' + +export type OrgParams = { + subpage: string + orgslug: string +} + +function OrgPage({ params }: { params: OrgParams }) { + return ( +
+
+ +
+
+
Organization Settings
+
+
+
+ +
+ +
+ +
General
+
+
+ + +
+
+
+ + {params.subpage == 'general' ? : ''} + +
+ ) +} + +export default OrgPage \ No newline at end of file diff --git a/apps/web/components/Dashboard/Org/OrgEditGeneral/OrgEditGeneral.tsx b/apps/web/components/Dashboard/Org/OrgEditGeneral/OrgEditGeneral.tsx new file mode 100644 index 00000000..f7e232c1 --- /dev/null +++ b/apps/web/components/Dashboard/Org/OrgEditGeneral/OrgEditGeneral.tsx @@ -0,0 +1,154 @@ +"use client"; +import React, { use, useEffect, useState } from 'react' +import { Field, Form, Formik } from 'formik'; +import { updateOrganization, uploadOrganizationLogo } from '@services/settings/org'; +import { UploadCloud } from 'lucide-react'; +import { revalidateTags } from '@services/utils/ts/requests'; +import { useRouter } from 'next/navigation'; +import { useOrg } from '@components/Contexts/OrgContext'; + +interface OrganizationValues { + name: string; + description: string; + slug: string; + logo: string; + email: string; +} + +function OrgEditGeneral(props: any) { + const [selectedFile, setSelectedFile] = useState(null); + const router = useRouter(); + const org = useOrg() as any; + // ... + + const handleFileChange = (event: React.ChangeEvent) => { + if (event.target.files && event.target.files.length > 0) { + const file = event.target.files[0]; + setSelectedFile(file); + } + }; + + const uploadLogo = async () => { + if (selectedFile) { + let org_id = org.id; + await uploadOrganizationLogo(org_id, selectedFile); + setSelectedFile(null); // Reset the selected file + await revalidateTags(['organizations'], org.slug); + router.refresh(); + + } + }; + + + let orgValues: OrganizationValues = { + name: org?.name, + description: org?.description, + slug: org?.slug, + logo: org?.logo, + email: org?.email + } + + const updateOrg = async (values: OrganizationValues) => { + let org_id = org.id; + await updateOrganization(org_id, values); + + // Mutate the org + await revalidateTags(['organizations'], org.slug); + router.refresh(); + } + + useEffect(() => { + + } + , [org]) + + return ( +
+ { + setTimeout(() => { + alert(JSON.stringify(values, null, 2)); + setSubmitting(false); + updateOrg(values) + }, 400); + }} + > + {({ isSubmitting }) => ( +
+ + + + + + + + +
+ + +
+ + + + + + + + + + + + )} +
+
+ ) +} + +export default OrgEditGeneral \ No newline at end of file diff --git a/apps/web/components/Dashboard/UI/BreadCrumbs.tsx b/apps/web/components/Dashboard/UI/BreadCrumbs.tsx index e20dc71a..0b12718b 100644 --- a/apps/web/components/Dashboard/UI/BreadCrumbs.tsx +++ b/apps/web/components/Dashboard/UI/BreadCrumbs.tsx @@ -1,10 +1,10 @@ import { useCourse } from '@components/Contexts/CourseContext' -import { Book, ChevronRight, User } from 'lucide-react' +import { Book, ChevronRight, School, User } from 'lucide-react' import Link from 'next/link' import React, { use, useEffect } from 'react' type BreadCrumbsProps = { - type: 'courses' | 'user' | 'users', + type: 'courses' | 'user' | 'users' | 'org' last_breadcrumb?: string } @@ -18,7 +18,7 @@ function BreadCrumbs(props: BreadCrumbsProps) {
{props.type == 'courses' ?
Courses
: ''} {props.type == 'user' ?
Account Settings
: ''} - + {props.type == 'org' ?
Organization Settings
: ''}
{props.last_breadcrumb ? : ''}
{props.last_breadcrumb}
diff --git a/apps/web/components/Dashboard/UI/LeftMenu.tsx b/apps/web/components/Dashboard/UI/LeftMenu.tsx index e3264974..e0d8e511 100644 --- a/apps/web/components/Dashboard/UI/LeftMenu.tsx +++ b/apps/web/components/Dashboard/UI/LeftMenu.tsx @@ -4,7 +4,7 @@ import { useAuth } from '@components/Security/AuthContext'; import ToolTip from '@components/StyledElements/Tooltip/Tooltip' import LearnHouseDashboardLogo from '@public/dashLogo.png'; import Avvvatars from 'avvvatars-react'; -import { ArrowLeft, Book, Home, Settings } from 'lucide-react' +import { ArrowLeft, Book, Home, School, Settings } from 'lucide-react' import Image from 'next/image'; import Link from 'next/link' import React, { use, useEffect } from 'react' @@ -32,26 +32,34 @@ function LeftMenu() { return (
+ className='flex flex-col w-28 bg-black h-screen text-white shadow-xl'>
- - Learnhouse logo + + + Learnhouse logo + + +
{org?.name}
+
- + {/* - + */} + + +
- + @@ -63,7 +71,7 @@ function LeftMenu() {
-
alpha
+
alpha
diff --git a/apps/web/components/Objects/Menu/Menu.tsx b/apps/web/components/Objects/Menu/Menu.tsx index 7644317a..d3df4088 100644 --- a/apps/web/components/Objects/Menu/Menu.tsx +++ b/apps/web/components/Objects/Menu/Menu.tsx @@ -8,8 +8,6 @@ import { HeaderProfileBox } from "@components/Security/HeaderProfileBox"; import MenuLinks from "./MenuLinks"; import { getOrgLogoMediaDirectory } from "@services/media/media"; import { MessageSquareIcon } from "lucide-react"; -import { Tooltip } from "@radix-ui/react-tooltip"; -import ToolTip from "@components/StyledElements/Tooltip/Tooltip"; import Modal from "@components/StyledElements/Modal/Modal"; import FeedbackModal from "../Modals/Feedback/Feedback"; import useSWR from "swr"; @@ -39,9 +37,9 @@ export const Menu = (props: any) => {
- {org?.logo ? ( + {org?.logo_image ? (