diff --git a/frontend/src/hooks/api/assumePrivileges/mutations.tsx b/frontend/src/hooks/api/assumePrivileges/mutations.tsx index 4b08327d5..50e4e5b6c 100644 --- a/frontend/src/hooks/api/assumePrivileges/mutations.tsx +++ b/frontend/src/hooks/api/assumePrivileges/mutations.tsx @@ -1,7 +1,9 @@ import { useMutation } from "@tanstack/react-query"; -import { TProjectAssumePrivilegesDTO } from "./types"; + import { apiRequest } from "@app/config/request"; +import { TProjectAssumePrivilegesDTO } from "./types"; + export const useAssumeProjectPrivileges = () => useMutation({ mutationFn: async ({ projectId, actorId, actorType }: TProjectAssumePrivilegesDTO) => { diff --git a/frontend/src/hooks/api/index.tsx b/frontend/src/hooks/api/index.tsx index 677fad42b..6e8e0ac93 100644 --- a/frontend/src/hooks/api/index.tsx +++ b/frontend/src/hooks/api/index.tsx @@ -1,7 +1,7 @@ export * from "./accessApproval"; -export * from "./assumePrivileges"; export * from "./admin"; export * from "./apiKeys"; +export * from "./assumePrivileges"; export * from "./auditLogs"; export * from "./auditLogStreams"; export * from "./auth"; diff --git a/frontend/src/hooks/api/roles/queries.tsx b/frontend/src/hooks/api/roles/queries.tsx index fdc77a1bb..d8bd8d4c7 100644 --- a/frontend/src/hooks/api/roles/queries.tsx +++ b/frontend/src/hooks/api/roles/queries.tsx @@ -10,6 +10,7 @@ import { ProjectPermissionSet } from "@app/context/ProjectPermissionContext/type import { groupBy } from "@app/lib/fn/array"; import { omit } from "@app/lib/fn/object"; +import { ActorType } from "../auditLogs/enums"; import { OrgUser, TProjectMembership } from "../users/types"; import { TGetUserOrgPermissionsDTO, @@ -18,7 +19,6 @@ import { TPermission, TProjectRole } from "./types"; -import { ActorType } from "../auditLogs/enums"; const $glob: FieldInstruction = { type: "field", diff --git a/frontend/src/layouts/ProjectLayout/ProjectLayout.tsx b/frontend/src/layouts/ProjectLayout/ProjectLayout.tsx index 999e1aa5f..981b177fa 100644 --- a/frontend/src/layouts/ProjectLayout/ProjectLayout.tsx +++ b/frontend/src/layouts/ProjectLayout/ProjectLayout.tsx @@ -19,8 +19,8 @@ import { } from "@app/hooks/api"; import { ProjectType } from "@app/hooks/api/workspace/types"; -import { ProjectSelect } from "./components/ProjectSelect"; import { AssumePrivilegeModeBanner } from "./components/AssumePrivilegeModeBanner"; +import { ProjectSelect } from "./components/ProjectSelect"; // This is a generic layout shared by all types of projects. // If the product layout differs significantly, create a new layout as needed. @@ -64,6 +64,7 @@ export const ProjectLayout = () => { return ( <>
+ {impersonation && }
{
- {impersonation && }

diff --git a/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx b/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx index 0662a32a4..8ae429a20 100644 --- a/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx +++ b/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx @@ -1,7 +1,7 @@ -import { faIdCard, faUser } from "@fortawesome/free-solid-svg-icons"; +import { faInfoCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Button, HoverCard, HoverCardContent, HoverCardTrigger } from "@app/components/v2"; +import { Button } from "@app/components/v2"; import { useProjectPermission, useWorkspace } from "@app/context"; import { useRemoveAssumeProjectPrivilege } from "@app/hooks/api"; import { ActorType } from "@app/hooks/api/auditLogs/enums"; @@ -14,55 +14,36 @@ export const AssumePrivilegeModeBanner = () => { if (!impersonation) return null; return ( -

- - - - - -
-
- -
-
-
{impersonation?.actorName}
- {impersonation?.actorEmail && ( -
{impersonation?.actorEmail}
- )} - {impersonation?.actorType === ActorType.IDENTITY && ( -
{impersonation?.actorId}
- )} -
-
-
-
+ Click to exit + +
); }; diff --git a/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx b/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx index cd67b1276..5110bb76b 100644 --- a/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx +++ b/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx @@ -139,6 +139,7 @@ const Page = () => { a={ProjectPermissionSub.Identity} renderTooltip allowedLabel="Assume or impersonate privileges of the user" + passThrough={false} > {(isAllowed) => ( )} @@ -191,7 +192,7 @@ const Page = () => { handlePopUpToggle("assumePrivileges", isOpen)} onConfirmed={handleAssumePrivileges} diff --git a/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx b/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx index ced486b45..1371d78af 100644 --- a/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx +++ b/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx @@ -130,6 +130,7 @@ export const Page = () => { a={ProjectPermissionSub.Member} renderTooltip allowedLabel="Assume or impersonate privileges of the user" + passThrough={false} > {(isAllowed) => ( )} @@ -187,7 +188,7 @@ export const Page = () => { handlePopUpToggle("assumePrivileges", isOpen)} onConfirmed={handleAssumePrivileges} diff --git a/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx b/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx index 346d410b7..de2295940 100644 --- a/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx +++ b/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx @@ -92,7 +92,8 @@ const MemberPolicyActionSchema = z.object({ [ProjectPermissionMemberActions.Create]: z.boolean().optional(), [ProjectPermissionMemberActions.Edit]: z.boolean().optional(), [ProjectPermissionMemberActions.Delete]: z.boolean().optional(), - [ProjectPermissionMemberActions.GrantPrivileges]: z.boolean().optional() + [ProjectPermissionMemberActions.GrantPrivileges]: z.boolean().optional(), + [ProjectPermissionMemberActions.AssumePrivileges]: z.boolean().optional() }); const IdentityPolicyActionSchema = z.object({ @@ -100,7 +101,8 @@ const IdentityPolicyActionSchema = z.object({ [ProjectPermissionIdentityActions.Create]: z.boolean().optional(), [ProjectPermissionIdentityActions.Edit]: z.boolean().optional(), [ProjectPermissionIdentityActions.Delete]: z.boolean().optional(), - [ProjectPermissionIdentityActions.GrantPrivileges]: z.boolean().optional() + [ProjectPermissionIdentityActions.GrantPrivileges]: z.boolean().optional(), + [ProjectPermissionIdentityActions.AssumePrivileges]: z.boolean().optional() }); const GroupPolicyActionSchema = z.object({