+
Members
@@ -223,58 +266,90 @@ export const MemberListTab = () => {
{isMembersLoading && }
{!isMembersLoading &&
- filterdUsers?.map(({ user: u, inviteEmail, id: membershipId, roles }) => {
- const name = u ? `${u.firstName} ${u.lastName}` : "-";
- const email = u?.email || inviteEmail;
+ filterdUsers?.map(
+ (
+ { user: u, inviteEmail, id: membershipId, roles, additionalPrivileges },
+ index
+ ) => {
+ const name = u ? `${u.firstName} ${u.lastName}` : "-";
+ const email = u?.email || inviteEmail;
+ const hasAdditionalPrivilege = Boolean(additionalPrivileges.length);
- return (
-
- | {name} |
- {email} |
-
-
- {(isAllowed) => (
-
- handlePopUpOpen("upgradePlan", { description })
- }
- membershipId={membershipId}
- />
- )}
-
- |
-
- {userId !== u?.id && (
+ return (
+ |
+ | {name} |
+ {email} |
+
{(isAllowed) => (
-
- handlePopUpOpen("removeMember", { username: u.username })
+
+ handlePopUpOpen("upgradePlan", { description })
}
- >
-
-
+ membershipId={membershipId}
+ />
)}
- )}
- |
-
- );
- })}
+
+
+ {userId !== u?.id && (
+
+
+ {(isAllowed) => (
+
+ handlePopUpOpen("additionalPrivilege", {
+ name: `${user.firstName} ${user.lastName || ""}`,
+ index,
+ projectMembershipId: membershipId
+ })
+ }
+ >
+
+
+ )}
+
+
+ {(isAllowed) => (
+
+ handlePopUpOpen("removeMember", { username: u.username })
+ }
+ >
+
+
+ )}
+
+
+ )}
+ |
+
+ );
+ }
+ )}
{!isMembersLoading && filterdUsers?.length === 0 && (
@@ -355,6 +430,6 @@ export const MemberListTab = () => {
onOpenChange={(isOpen) => handlePopUpToggle("upgradePlan", isOpen)}
text={(popUp.upgradePlan?.data as { description: string })?.description}
/>
-
+
);
};
diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/MultiEnvProjectPermission.tsx b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/MultiEnvProjectPermission.tsx
index db18822f4..188d81c65 100644
--- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/MultiEnvProjectPermission.tsx
+++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/MultiEnvProjectPermission.tsx
@@ -1,5 +1,5 @@
import { useMemo } from "react";
-import { Control, Controller, UseFormSetValue, useWatch } from "react-hook-form";
+import { Control, Controller, UseFormGetValues, UseFormSetValue, useWatch } from "react-hook-form";
import { IconProp } from "@fortawesome/fontawesome-svg-core";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { motion } from "framer-motion";
@@ -28,6 +28,7 @@ type Props = {
formName: "secrets";
isNonEditable?: boolean;
setValue: UseFormSetValue
;
+ getValue: UseFormGetValues;
control: Control;
title: string;
subtitle: string;
@@ -44,6 +45,7 @@ enum Permission {
export const MultiEnvProjectPermission = ({
isNonEditable,
setValue,
+ getValue,
control,
formName,
title,
@@ -69,9 +71,12 @@ export const MultiEnvProjectPermission = ({
const handlePermissionChange = (val: Permission) => {
switch (val) {
- case Permission.NoAccess:
- setValue(`permissions.${formName}`, undefined, { shouldDirty: true });
+ case Permission.NoAccess: {
+ const permissions = getValue("permissions");
+ if (permissions) delete permissions[formName];
+ setValue("permissions", permissions, { shouldDirty: true });
break;
+ }
case Permission.FullAccess:
setValue(
`permissions.${formName}`,
@@ -101,7 +106,7 @@ export const MultiEnvProjectPermission = ({
className={twMerge(
"rounded-md bg-mineshaft-800 px-10 py-6",
(selectedPermissionCategory !== Permission.NoAccess || isCustom) &&
- "border-l-2 border-primary-600"
+ "border-l-2 border-primary-600"
)}
>
diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx
index cf2e7e8b9..4349b0913 100644
--- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx
+++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx
@@ -128,6 +128,7 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => {
register,
formState: { isSubmitting, isDirty, errors },
setValue,
+ getValues,
control
} = useForm({
defaultValues: role ? { ...role, permissions: rolePermission2Form(role.permissions) } : {},
@@ -226,6 +227,7 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => {