diff --git a/src/app/(dashboard)/@modal/(.)users/[userId]/settings/page.tsx b/src/app/(dashboard)/@modal/(.)users/[userId]/settings/page.tsx new file mode 100644 index 00000000..9be742b3 --- /dev/null +++ b/src/app/(dashboard)/@modal/(.)users/[userId]/settings/page.tsx @@ -0,0 +1,3 @@ +import {UserSettingsPage} from "@edition/user/pages/UserSettingsPage"; + +export default UserSettingsPage diff --git a/src/app/(dashboard)/@modal/default.tsx b/src/app/(dashboard)/@modal/default.tsx new file mode 100644 index 00000000..cd2081a3 --- /dev/null +++ b/src/app/(dashboard)/@modal/default.tsx @@ -0,0 +1,3 @@ +export default function Default() { + return null +} diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 714ecb0d..c740179c 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -26,9 +26,10 @@ interface ApplicationLayoutProps { children: React.ReactNode bar: React.ReactNode tab: React.ReactNode + modal: React.ReactNode } -const ApplicationLayout: React.FC = ({children, bar, tab}) => { +const ApplicationLayout: React.FC = ({children, bar, tab, modal}) => { const client = useApolloClient() const pathname = usePathname() @@ -83,9 +84,12 @@ const ApplicationLayout: React.FC = ({children, bar, tab }> {bar}}> - - <>{children} - + <> + + <>{children} + + {modal} + diff --git a/src/app/(dashboard)/users/[userId]/settings/page.tsx b/src/app/(dashboard)/users/[userId]/settings/page.tsx new file mode 100644 index 00000000..9be742b3 --- /dev/null +++ b/src/app/(dashboard)/users/[userId]/settings/page.tsx @@ -0,0 +1,3 @@ +import {UserSettingsPage} from "@edition/user/pages/UserSettingsPage"; + +export default UserSettingsPage diff --git a/src/packages/ce/src/application/pages/ApplicationPage.tsx b/src/packages/ce/src/application/pages/ApplicationPage.tsx index 14af16d7..3f3bffb7 100644 --- a/src/packages/ce/src/application/pages/ApplicationPage.tsx +++ b/src/packages/ce/src/application/pages/ApplicationPage.tsx @@ -119,7 +119,9 @@ export const ApplicationPage = () => { - + + + + + + - diff --git a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx index 57c1ff87..dbbb28c9 100644 --- a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx +++ b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx @@ -30,10 +30,12 @@ import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import {User, UsersUpdateInput} from "@code0-tech/sagittarius-graphql-types"; import {UserService} from "@edition/user/services/User.service"; +import {useUserSession} from "@edition/user/hooks/User.session.hook"; import {addIslandSuccessNotification} from "@code0-tech/pictor/dist/components/island/Island.hook"; import {IconAt, IconBackground, IconLock, IconMail, IconSettings2, IconShieldLock} from "@tabler/icons-react"; import {Layout} from "@code0-tech/pictor/dist/components/layout/Layout"; import {motion} from "framer-motion"; +import {UserSessionsDataTableComponent} from "@edition/user/components/UserSessionsDataTableComponent"; export interface UserEditDialogComponentProps { userId?: User['id'] @@ -49,11 +51,14 @@ export const UserEditDialogComponent: React.FC = ( const userStore = useStore(UserService) const [, startTransition] = React.useTransition() + const currentSession = useUserSession() const user = React.useMemo( () => userService.getById(userId), [userStore, userId] ) + const isSelf = !!user && !!currentSession?.user?.id && user.id === currentSession.user.id + const initialValues = React.useMemo(() => ({ firstname: user?.firstname ?? null, lastname: user?.lastname ?? null, @@ -110,8 +115,10 @@ export const UserEditDialogComponent: React.FC = ( if (values.firstname !== (user?.firstname ?? null)) payload.firstname = values.firstname if (values.lastname !== (user?.lastname ?? null)) payload.lastname = values.lastname if (values.readme !== (user?.readme ?? null)) payload.readme = values.readme - if (values.admin !== (user?.admin ?? false)) payload.admin = values.admin - if (values.blocked !== (user?.blocked ?? false)) payload.blocked = values.blocked + if (!isSelf) { + if (values.admin !== (user?.admin ?? false)) payload.admin = values.admin + if (values.blocked !== (user?.blocked ?? false)) payload.blocked = values.blocked + } if (values.password) { payload.password = values.password payload.passwordRepeat = values.repeatPassword @@ -185,16 +192,24 @@ export const UserEditDialogComponent: React.FC = ( General - + {!isSelf && ( + + + + )} + - + @@ -256,7 +271,8 @@ export const UserEditDialogComponent: React.FC = ( description={"A short bio or notes shown on the user's profile."} {...inputs.getInputProps("readme")}/> - + Access + + +} diff --git a/src/packages/ce/src/user/pages/UserPage.tsx b/src/packages/ce/src/user/pages/UserPage.tsx index 34b0cdd4..bb168afd 100644 --- a/src/packages/ce/src/user/pages/UserPage.tsx +++ b/src/packages/ce/src/user/pages/UserPage.tsx @@ -3,6 +3,7 @@ import React from "react"; import {Layout} from "@code0-tech/pictor/dist/components/layout/Layout"; import {useParams} from "next/navigation"; +import Link from "next/link"; import { AuroraBackground, Avatar, @@ -29,15 +30,17 @@ export const UserPage: React.FC = () => { const userService = useService(UserService) const userStore = useStore(UserService) - const userIndex = params.userId as any as number - const userId: User['id'] = `gid://sagittarius/User/${userIndex}` - const currentSession = useUserSession() const currentUser = React.useMemo( () => userService.getById(currentSession?.user?.id), [userStore, currentSession] ) + const userIndex = decodeURIComponent(String(params.userId ?? "")) + const userId: User['id'] = userIndex === "@me" + ? currentSession?.user?.id! + : `gid://sagittarius/User/${userIndex as any as number}` + const user = React.useMemo( () => userService.getById(userId), [userStore, userId, userService] @@ -74,7 +77,9 @@ export const UserPage: React.FC = () => { {currentUser?.id === userId && ( <> - + + +