improvement: edit user role filterable select

This commit is contained in:
Scott Wilson
2024-11-28 12:58:03 -08:00
parent 9ca58894f0
commit 8b3af92d23
3 changed files with 34 additions and 26 deletions
+2 -1
View File
@@ -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>
)} )}
/> />