From e842866ea23acd91aed3473ad333ead620b70cb3 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Tue, 11 Nov 2025 10:10:04 +0800 Subject: [PATCH 1/3] fix: allow users with a base role of admin or owner to change user roles --- src/pages/instances/[zuid]/users.js | 18 ++++++++++++------ src/views/accounts/instances/Users.js | 19 +++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/pages/instances/[zuid]/users.js b/src/pages/instances/[zuid]/users.js index 11d4a8be6..049884c9c 100644 --- a/src/pages/instances/[zuid]/users.js +++ b/src/pages/instances/[zuid]/users.js @@ -3,7 +3,6 @@ import { useZestyStore } from 'store'; import { useRouter } from 'next/router'; import { Users } from 'views/accounts'; import { ErrorMsg, SuccessMsg } from 'components/accounts'; -import * as helpers from 'utils'; import InstanceContainer from 'components/accounts/instances/InstanceContainer'; export { default as getServerSideProps } from 'lib/accounts/protectedRouteGetServerSideProps'; @@ -138,10 +137,17 @@ export default function UsersPage() { } }, [router.isReady]); - const isInstanceOwner = helpers.isInstanceOwner( - instanceUserWithRoles, - userInfo, - ); + const canUpdateUsers = React.useMemo(() => { + if (!userInfo || !instanceUserWithRoles?.length) { + return false; + } + + const updateUsersPermission = instanceUserWithRoles.find( + (user) => user.ZUID === userInfo.ZUID, + )?.role.systemRole.grant; + + return updateUsersPermission || userInfo.staff; + }, [instanceUserWithRoles, userInfo]); const filteredUsers = instanceUserWithRoles?.filter((e) => { const name = `${e?.firstName?.toLowerCase() || '-'} ${ @@ -155,7 +161,7 @@ export default function UsersPage() { deleteUserRole, instanceRoles, createInvite, - isOwner: isInstanceOwner, + canUpdateUsers, instanceZUID: zuid, loading, search, diff --git a/src/views/accounts/instances/Users.js b/src/views/accounts/instances/Users.js index 369069a32..4bfe05375 100644 --- a/src/views/accounts/instances/Users.js +++ b/src/views/accounts/instances/Users.js @@ -51,7 +51,7 @@ const CustomTable = ({ handleUpdateRole, handleDeleteRole, instanceRoles, - isOwner, + canUpdateUsers, loading, }) => { const ROWS = data?.map((e) => { @@ -120,7 +120,7 @@ const CustomTable = ({ handleUpdateRole(val); }; - const role = isOwner + const role = canUpdateUsers ? RoleSwitcher({ role: e.role.name, handleOnChange, @@ -189,7 +189,10 @@ const CustomTable = ({ }, ]; const actionOwner = [ - { title: 'Delete User', action: isOwner ? handleDeleteUser : null }, + { + title: 'Delete User', + action: canUpdateUsers ? handleDeleteUser : null, + }, { title: 'Email', action: () => window.open(`mailto:${params.row.email}`), @@ -205,7 +208,7 @@ const CustomTable = ({ } id={'actions'} - items={isOwner ? actionOwner : action} + items={canUpdateUsers ? actionOwner : action} colorInvert={false} /> @@ -276,7 +279,7 @@ const Index = ({ deleteUserRole, instanceRoles, createInvite, - isOwner, + canUpdateUsers, instanceZUID, loading, search, @@ -347,7 +350,7 @@ const Index = ({ handleUpdateRole={handleUpdateRole} handleDeleteRole={handleDeleteRole} instanceRoles={instanceRoles} - isOwner={isOwner} + canUpdateUsers={canUpdateUsers} loading={loading} /> @@ -357,7 +360,7 @@ const Index = ({ data={pendingUsers} instanceRoles={instanceRoles} respondToInvite={respondToInvite} - isOwner={isOwner} + canUpdateUsers={canUpdateUsers} loading={loading} /> @@ -369,7 +372,7 @@ export const Users = React.memo(Index); const PendingTable = ({ data, instanceRoles, - // isOwner, + // canUpdateUsers, loading, respondToInvite, }) => { From f3c17e180fa7860ec2c443d1ca669686e1020f1c Mon Sep 17 00:00:00 2001 From: Nar -- <28705606+finnar-bin@users.noreply.github.com> Date: Thu, 28 May 2026 07:33:49 +0800 Subject: [PATCH 2/3] Update src/pages/instances/[zuid]/users.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: Nar -- <28705606+finnar-bin@users.noreply.github.com> --- src/pages/instances/[zuid]/users.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/instances/[zuid]/users.js b/src/pages/instances/[zuid]/users.js index 049884c9c..ee1cb1183 100644 --- a/src/pages/instances/[zuid]/users.js +++ b/src/pages/instances/[zuid]/users.js @@ -144,7 +144,9 @@ export default function UsersPage() { const updateUsersPermission = instanceUserWithRoles.find( (user) => user.ZUID === userInfo.ZUID, - )?.role.systemRole.grant; + const updateUsersPermission = instanceUserWithRoles.find( + (user) => user.ZUID === userInfo.ZUID, + )?.role?.systemRole?.grant; return updateUsersPermission || userInfo.staff; }, [instanceUserWithRoles, userInfo]); From 3d2b7b3a78ed913271edb3e58a40a4cbed23727c Mon Sep 17 00:00:00 2001 From: Nar -- <28705606+finnar-bin@users.noreply.github.com> Date: Thu, 28 May 2026 07:35:58 +0800 Subject: [PATCH 3/3] Update src/pages/instances/[zuid]/users.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: Nar -- <28705606+finnar-bin@users.noreply.github.com> --- src/pages/instances/[zuid]/users.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pages/instances/[zuid]/users.js b/src/pages/instances/[zuid]/users.js index ee1cb1183..dd3e479f6 100644 --- a/src/pages/instances/[zuid]/users.js +++ b/src/pages/instances/[zuid]/users.js @@ -142,8 +142,6 @@ export default function UsersPage() { return false; } - const updateUsersPermission = instanceUserWithRoles.find( - (user) => user.ZUID === userInfo.ZUID, const updateUsersPermission = instanceUserWithRoles.find( (user) => user.ZUID === userInfo.ZUID, )?.role?.systemRole?.grant;