import { useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { faUsers, faXmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { useNavigate } from "@tanstack/react-router"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, DeleteActionModal, EmptyState, FormControl, IconButton, Input, Modal, ModalContent, Select, SelectItem, Table, TableContainer, TableSkeleton, TBody, Td, Th, THead, Tr } from "@app/components/v2"; import { useOrganization } from "@app/context"; import { useCreateLDAPGroupMapping, useDeleteLDAPGroupMapping, useGetLDAPConfig, useGetLDAPGroupMaps, useGetOrganizationGroups } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; const schema = z.object({ ldapGroupCN: z.string().min(1, "LDAP Group CN is required"), groupSlug: z.string().min(1, "Group Slug is required") }); export type TFormData = z.infer; type Props = { popUp: UsePopUpState<["ldapGroupMap", "deleteLdapGroupMap"]>; handlePopUpOpen: ( popUpName: keyof UsePopUpState<["deleteLdapGroupMap"]>, data?: { ldapGroupMapId: string; ldapGroupCN: string; } ) => void; handlePopUpToggle: ( popUpName: keyof UsePopUpState<["ldapGroupMap", "deleteLdapGroupMap"]>, state?: boolean ) => void; }; export const LDAPGroupMapModal = ({ popUp, handlePopUpOpen, handlePopUpToggle }: Props) => { const { currentOrg } = useOrganization(); const { data: ldapConfig } = useGetLDAPConfig(currentOrg?.id ?? ""); const { data: groups } = useGetOrganizationGroups(currentOrg?.id ?? ""); const { data: groupMaps, isPending } = useGetLDAPGroupMaps(ldapConfig?.id ?? ""); const { mutateAsync: createLDAPGroupMapping, isPending: createIsLoading } = useCreateLDAPGroupMapping(); const { mutateAsync: deleteLDAPGroupMapping } = useDeleteLDAPGroupMapping(); const navigate = useNavigate(); const { control, handleSubmit, reset, setValue } = useForm({ resolver: zodResolver(schema), defaultValues: { ldapGroupCN: "", groupSlug: "" } }); const onFormSubmit = async ({ groupSlug, ldapGroupCN }: TFormData) => { try { if (!ldapConfig) return; await createLDAPGroupMapping({ ldapConfigId: ldapConfig.id, groupSlug, ldapGroupCN }); reset(); createNotification({ text: `Successfully added LDAP group mapping for ${ldapGroupCN}`, type: "success" }); } catch (err) { console.error(err); createNotification({ text: `Failed to add LDAP group mapping for ${ldapGroupCN}`, type: "error" }); } }; const onDeleteGroupMapSubmit = async ({ ldapConfigId, ldapGroupMapId, ldapGroupCN }: { ldapConfigId: string; ldapGroupMapId: string; ldapGroupCN: string; }) => { try { await deleteLDAPGroupMapping({ ldapConfigId, ldapGroupMapId }); handlePopUpToggle("deleteLdapGroupMap", false); createNotification({ text: `Successfully deleted LDAP group mapping ${ldapGroupCN}`, type: "success" }); } catch (err) { console.error(err); createNotification({ text: `Failed to delete LDAP group mapping ${ldapGroupCN}`, type: "error" }); } }; useEffect(() => { if (groups && groups.length > 0) { setValue("groupSlug", groups[0].slug); } }, [groups, popUp.ldapGroupMap.isOpen]); return ( { handlePopUpToggle("ldapGroupMap", isOpen); reset(); }} > {groups && groups.length > 0 && ( <>

New Group Mapping

( )} /> (
)} />

Group Mappings

{isPending && } {!isPending && groupMaps?.map(({ id, ldapGroupCN, group }) => { return ( ); })}
LDAP Group CN Infisical Group
{ldapGroupCN} {group.name} { handlePopUpOpen("deleteLdapGroupMap", { ldapGroupMapId: id, ldapGroupCN }); }} size="lg" colorSchema="danger" variant="plain" ariaLabel="update" >
{groupMaps?.length === 0 && ( )}
handlePopUpToggle("deleteLdapGroupMap", isOpen)} deleteKey="confirm" onDeleteApproved={() => { const deleteLdapGroupMapData = popUp?.deleteLdapGroupMap?.data as { ldapGroupMapId: string; ldapGroupCN: string; }; return onDeleteGroupMapSubmit({ ldapConfigId: ldapConfig?.id ?? "", ldapGroupMapId: deleteLdapGroupMapData.ldapGroupMapId, ldapGroupCN: deleteLdapGroupMapData.ldapGroupCN }); }} /> )} {groups && groups.length === 0 && (
You do not have any Infisical groups in your organization. Create one in order to proceed.
)}
); };