From 48acd4de0471629e440448ff637e425eebf6db0a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 20:22:14 +0200 Subject: [PATCH 01/14] feat: add modal prop to ApplicationLayout and create UserSettingsPage --- .../@modal/(.)users/[userId]/settings/page.tsx | 3 +++ src/app/(dashboard)/layout.tsx | 12 ++++++++---- src/app/(dashboard)/users/[userId]/settings/page.tsx | 3 +++ 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 src/app/(dashboard)/@modal/(.)users/[userId]/settings/page.tsx create mode 100644 src/app/(dashboard)/users/[userId]/settings/page.tsx 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)/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 From e90aa4dc9e31da573ad8d87f645dff5f046b0c63 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 20:22:21 +0200 Subject: [PATCH 02/14] feat: create Default component as a placeholder --- src/app/(dashboard)/@modal/default.tsx | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/app/(dashboard)/@modal/default.tsx 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 +} From fb5c3cba081cca8abfbb5650cf12070e4600e521 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 21:21:47 +0200 Subject: [PATCH 03/14] feat: create UserSettingsPage component for user profile management --- .../ce/src/user/pages/UserSettingsPage.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/packages/ce/src/user/pages/UserSettingsPage.tsx diff --git a/src/packages/ce/src/user/pages/UserSettingsPage.tsx b/src/packages/ce/src/user/pages/UserSettingsPage.tsx new file mode 100644 index 00000000..920ae4ba --- /dev/null +++ b/src/packages/ce/src/user/pages/UserSettingsPage.tsx @@ -0,0 +1,45 @@ +"use client" + +import React from "react"; +import {notFound, useParams, useRouter} from "next/navigation"; +import {useService, useStore} from "@code0-tech/pictor"; +import {User} from "@code0-tech/sagittarius-graphql-types"; +import {UserEditDialogComponent} from "@edition/user/components/UserEditDialogComponent"; +import {UserService} from "@edition/user/services/User.service"; +import {useUserSession} from "@edition/user/hooks/User.session.hook"; + +export const UserSettingsPage: React.FC = () => { + + const params = useParams() + const router = useRouter() + const currentSession = useUserSession() + const userService = useService(UserService) + const userStore = useStore(UserService) + + const userIndex = decodeURIComponent(String(params.userId)) as unknown as (number | '@me') + const isMe = userIndex === "@me" + const userId: User['id'] | undefined = isMe + ? currentSession?.user?.id + : `gid://sagittarius/User/${userIndex}` + + const currentUser = React.useMemo( + () => userService.getById(currentSession?.user?.id), + [userStore, currentSession] + ) + + const isSelf = isMe || (!!currentUser && userId === currentUser.id) + + if (currentUser && !isSelf && !currentUser.admin) { + notFound() + } + + return { + if (open) return + const [nav] = performance.getEntriesByType("navigation") as PerformanceNavigationTiming[] + const openedDirectly = !nav || new URL(nav.name).pathname === window.location.pathname + if (openedDirectly) router.push(isMe ? "/users/@me" : "/") + else router.back() + }}/> +} From a224769b3cf6859d18fa194be31682f48da1de23 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 21:22:31 +0200 Subject: [PATCH 04/14] feat: update UsersPage to navigate to user settings on selection --- src/packages/ce/src/user/pages/UsersPage.tsx | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/packages/ce/src/user/pages/UsersPage.tsx b/src/packages/ce/src/user/pages/UsersPage.tsx index 1787d966..6a0bd983 100644 --- a/src/packages/ce/src/user/pages/UsersPage.tsx +++ b/src/packages/ce/src/user/pages/UsersPage.tsx @@ -17,17 +17,16 @@ import { } from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; -import {notFound} from "next/navigation"; +import {notFound, useRouter} from "next/navigation"; import {UserDataTableComponent} from "@edition/user/components/UserDataTableComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {UserDataTableFilterInputComponent} from "@edition/user/components/UserDataTableFilterInputComponent"; -import {UserEditDialogComponent} from "@edition/user/components/UserEditDialogComponent"; import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; import {useUserSession} from "@edition/user/hooks/User.session.hook"; -import {User} from "@code0-tech/sagittarius-graphql-types"; export const UsersPage: React.FC = () => { + const router = useRouter() const currentSession = useUserSession() const userStore = useStore(UserService) const userService = useService(UserService) @@ -35,7 +34,6 @@ export const UsersPage: React.FC = () => { const [filter, setFilter] = React.useState({}) const [sort, setSort] = React.useState({}) - const [editUserId, setEditUserId] = React.useState(undefined) if (currentUser && !currentUser.admin) { notFound() @@ -131,11 +129,8 @@ export const UsersPage: React.FC = () => { setEditUserId(item?.id)}/> - { - if (!open) setEditUserId(undefined) - }}/> + onSelect={(item) => { + if (item?.id) router.push(`/users/${item.id.split("/").pop()}/settings`) + }}/> } \ No newline at end of file From 9f7e3777c894e4de0e511579ffe80238336ef7bd Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 21:23:03 +0200 Subject: [PATCH 05/14] feat: update UserPage to link to user settings for profile editing --- src/packages/ce/src/user/pages/UserPage.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 && ( <> - + + + - - - + {!isSelf && ( + + + + )} + + +} From d336fae4ec76c7c34e3f32cfa58037fc2a1630b2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 22:59:17 +0200 Subject: [PATCH 12/14] feat: add sessions tab in UserEditDialogComponent to display active user sessions --- .../components/UserEditDialogComponent.tsx | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx index 5c83c125..dbbb28c9 100644 --- a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx +++ b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx @@ -35,6 +35,7 @@ import {addIslandSuccessNotification} from "@code0-tech/pictor/dist/components/i 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'] @@ -205,6 +206,12 @@ export const UserEditDialogComponent: React.FC = ( Security + + + + + + - From 98d8f80443db403a269a8905428a3d4f5244244d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 17 Jul 2026 23:02:49 +0200 Subject: [PATCH 14/14] feat: update Edit Profile button to link to user settings page --- src/packages/ce/src/application/pages/ApplicationPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 = () => { - + + +