mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-05 13:26:31 +00:00
improvement: edit user role filterable select
This commit is contained in:
@@ -148,7 +148,8 @@ export const UserPage = withPermission(
|
|||||||
onClick={() =>
|
onClick={() =>
|
||||||
handlePopUpOpen("orgMembership", {
|
handlePopUpOpen("orgMembership", {
|
||||||
membershipId: membership.id,
|
membershipId: membership.id,
|
||||||
role: membership.role
|
role: membership.role,
|
||||||
|
roleId: membership.roleId
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
disabled={!isAllowed}
|
disabled={!isAllowed}
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ export const UserDetailsSection = ({ membershipId, handlePopUpOpen }: Props) =>
|
|||||||
handlePopUpOpen("orgMembership", {
|
handlePopUpOpen("orgMembership", {
|
||||||
membershipId: membership.id,
|
membershipId: membership.id,
|
||||||
role: membership.role,
|
role: membership.role,
|
||||||
|
roleId: membership.roleId,
|
||||||
metadata: membership.metadata
|
metadata: membership.metadata
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { Controller, useFieldArray, useForm } from "react-hook-form";
|
import { Controller, useFieldArray, useForm } from "react-hook-form";
|
||||||
|
import { SingleValue } from "react-select";
|
||||||
import { faPlus, faTrash } from "@fortawesome/free-solid-svg-icons";
|
import { faPlus, faTrash } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { zodResolver } from "@hookform/resolvers/zod";
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
@@ -8,21 +9,21 @@ import { z } from "zod";
|
|||||||
import { createNotification } from "@app/components/notifications";
|
import { createNotification } from "@app/components/notifications";
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
|
FilterableSelect,
|
||||||
FormControl,
|
FormControl,
|
||||||
FormLabel,
|
FormLabel,
|
||||||
IconButton,
|
IconButton,
|
||||||
Input,
|
Input,
|
||||||
Modal,
|
Modal,
|
||||||
ModalContent,
|
ModalContent
|
||||||
Select,
|
|
||||||
SelectItem
|
|
||||||
} from "@app/components/v2";
|
} from "@app/components/v2";
|
||||||
import { useOrganization, useSubscription } from "@app/context";
|
import { useOrganization, useSubscription } from "@app/context";
|
||||||
|
import { isCustomOrgRole } from "@app/helpers/roles";
|
||||||
import { useGetOrgRoles, useUpdateOrgMembership } from "@app/hooks/api";
|
import { useGetOrgRoles, useUpdateOrgMembership } from "@app/hooks/api";
|
||||||
import { UsePopUpState } from "@app/hooks/usePopUp";
|
import { UsePopUpState } from "@app/hooks/usePopUp";
|
||||||
|
|
||||||
const schema = z.object({
|
const schema = z.object({
|
||||||
role: z.string(),
|
role: z.object({ name: z.string(), slug: z.string() }),
|
||||||
metadata: z
|
metadata: z
|
||||||
.object({
|
.object({
|
||||||
key: z.string().trim().min(1),
|
key: z.string().trim().min(1),
|
||||||
@@ -45,7 +46,7 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
const { currentOrg } = useOrganization();
|
const { currentOrg } = useOrganization();
|
||||||
const orgId = currentOrg?.id || "";
|
const orgId = currentOrg?.id || "";
|
||||||
|
|
||||||
const { data: roles } = useGetOrgRoles(orgId);
|
const { data: roles = [] } = useGetOrgRoles(orgId);
|
||||||
|
|
||||||
const { mutateAsync: updateOrgMembership } = useUpdateOrgMembership();
|
const { mutateAsync: updateOrgMembership } = useUpdateOrgMembership();
|
||||||
|
|
||||||
@@ -66,6 +67,7 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
const popUpData = popUp?.orgMembership?.data as {
|
const popUpData = popUp?.orgMembership?.data as {
|
||||||
membershipId: string;
|
membershipId: string;
|
||||||
role: string;
|
role: string;
|
||||||
|
roleId?: string;
|
||||||
metadata: { key: string; value: string }[];
|
metadata: { key: string; value: string }[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -73,13 +75,18 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
if (!roles?.length) return;
|
if (!roles?.length) return;
|
||||||
|
|
||||||
if (popUpData) {
|
if (popUpData) {
|
||||||
|
console.log("roles", roles, popUpData.roleId);
|
||||||
reset({
|
reset({
|
||||||
role: popUpData.role,
|
role: popUpData.roleId
|
||||||
|
? roles?.find((role) => role.id === popUpData.roleId)
|
||||||
|
: roles?.find((role) => role.slug === popUpData.role),
|
||||||
metadata: popUpData.metadata
|
metadata: popUpData.metadata
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
reset({
|
reset({
|
||||||
role: roles[0].slug
|
role: isCustomOrgRole(currentOrg?.defaultMembershipRole!)
|
||||||
|
? roles?.find((role) => role.id === currentOrg?.defaultMembershipRole)
|
||||||
|
: roles?.find((role) => role.slug === currentOrg?.defaultMembershipRole)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [popUp?.orgMembership?.data, roles]);
|
}, [popUp?.orgMembership?.data, roles]);
|
||||||
@@ -91,7 +98,7 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
await updateOrgMembership({
|
await updateOrgMembership({
|
||||||
organizationId: orgId,
|
organizationId: orgId,
|
||||||
membershipId: popUpData.membershipId,
|
membershipId: popUpData.membershipId,
|
||||||
role,
|
role: role.slug,
|
||||||
metadata
|
metadata
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -123,23 +130,26 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
reset();
|
reset();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ModalContent title="Update Membership">
|
<ModalContent bodyClassName="overflow-visible" title="Update Membership">
|
||||||
<form onSubmit={handleSubmit(onFormSubmit)}>
|
<form onSubmit={handleSubmit(onFormSubmit)}>
|
||||||
<Controller
|
<Controller
|
||||||
control={control}
|
control={control}
|
||||||
name="role"
|
name="role"
|
||||||
defaultValue=""
|
render={({ field: { onChange, value }, fieldState: { error } }) => (
|
||||||
render={({ field: { onChange, ...field }, fieldState: { error } }) => (
|
|
||||||
<FormControl
|
<FormControl
|
||||||
label="Update Organization Role"
|
label="Update Organization Role"
|
||||||
errorText={error?.message}
|
errorText={error?.message}
|
||||||
isError={Boolean(error)}
|
isError={Boolean(error)}
|
||||||
>
|
>
|
||||||
<Select
|
<FilterableSelect
|
||||||
defaultValue={field.value}
|
placeholder="Select role..."
|
||||||
{...field}
|
options={roles}
|
||||||
onValueChange={(e) => {
|
onChange={(newValue) => {
|
||||||
const isCustomRole = !["admin", "member", "no-access"].includes(e);
|
const role = newValue as SingleValue<(typeof roles)[number]>;
|
||||||
|
|
||||||
|
if (!role) return;
|
||||||
|
|
||||||
|
const isCustomRole = isCustomOrgRole(role.slug);
|
||||||
|
|
||||||
if (isCustomRole && subscription && !subscription?.rbac) {
|
if (isCustomRole && subscription && !subscription?.rbac) {
|
||||||
handlePopUpOpen("upgradePlan", {
|
handlePopUpOpen("upgradePlan", {
|
||||||
@@ -149,16 +159,12 @@ export const UserOrgMembershipModal = ({ popUp, handlePopUpOpen, handlePopUpTogg
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
onChange(e);
|
onChange(role);
|
||||||
}}
|
}}
|
||||||
className="w-full"
|
value={value}
|
||||||
>
|
getOptionValue={(option) => option.slug}
|
||||||
{(roles || []).map(({ name, slug }) => (
|
getOptionLabel={(option) => option.name}
|
||||||
<SelectItem value={slug} key={`st-role-${slug}`}>
|
/>
|
||||||
{name}
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
|
||||||
</Select>
|
|
||||||
</FormControl>
|
</FormControl>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user