import { useMemo } from "react"; import { faArrowDown, faArrowUp, faFolder, faMagnifyingGlass, faSearch } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { OrgPermissionCan } from "@app/components/permissions"; import { Button, EmptyState, IconButton, Input, Pagination, Table, TableContainer, TableSkeleton, TBody, Th, THead, Tooltip, Tr } from "@app/components/v2"; import { OrgPermissionGroupActions, OrgPermissionSubjects, useOrganization } from "@app/context"; import { getUserTablePreference, PreferenceKey, setUserTablePreference } from "@app/helpers/userTablePreferences"; import { usePagination, useResetPageHelper } from "@app/hooks"; import { useListGroupUsers, useOidcManageGroupMembershipsEnabled } from "@app/hooks/api"; import { OrderByDirection } from "@app/hooks/api/generic/types"; import { EFilterReturnedUsers } from "@app/hooks/api/groups/types"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { GroupMembershipRow } from "./GroupMembershipRow"; type Props = { groupId: string; groupSlug: string; handlePopUpOpen: ( popUpName: keyof UsePopUpState<["removeMemberFromGroup", "addGroupMembers"]>, data?: object ) => void; }; enum GroupMembersOrderBy { Name = "name" } export const GroupMembersTable = ({ groupId, groupSlug, handlePopUpOpen }: Props) => { const { search, setSearch, setPage, page, perPage, setPerPage, offset, orderDirection, toggleOrderDirection } = usePagination(GroupMembersOrderBy.Name, { initPerPage: getUserTablePreference("groupMembersTable", PreferenceKey.PerPage, 20) }); const handlePerPageChange = (newPerPage: number) => { setPerPage(newPerPage); setUserTablePreference("groupMembersTable", PreferenceKey.PerPage, newPerPage); }; const { currentOrg } = useOrganization(); const { data: isOidcManageGroupMembershipsEnabled = false } = useOidcManageGroupMembershipsEnabled(currentOrg.id); const { data: groupMemberships, isPending } = useListGroupUsers({ id: groupId, groupSlug, offset, limit: perPage, search, filter: EFilterReturnedUsers.EXISTING_MEMBERS }); const filteredGroupMemberships = useMemo(() => { return groupMemberships && groupMemberships?.users ? groupMemberships?.users ?.filter((membership) => { const userSearchString = `${membership.firstName && membership.firstName} ${ membership.lastName && membership.lastName } ${membership.email && membership.email} ${ membership.username && membership.username }`; return userSearchString.toLowerCase().includes(search.trim().toLowerCase()); }) .sort((a, b) => { const [membershipOne, membershipTwo] = orderDirection === OrderByDirection.ASC ? [a, b] : [b, a]; const membershipOneComparisonString = membershipOne.firstName ? membershipOne.firstName : membershipOne.email; const membershipTwoComparisonString = membershipTwo.firstName ? membershipTwo.firstName : membershipTwo.email; const comparison = membershipOneComparisonString .toLowerCase() .localeCompare(membershipTwoComparisonString.toLowerCase()); return comparison; }) : []; }, [groupMemberships, orderDirection, search]); useResetPageHelper({ totalCount: filteredGroupMemberships?.length, offset, setPage }); return (
setSearch(e.target.value)} leftIcon={} placeholder="Search users..." /> {isPending && } {!isPending && filteredGroupMemberships.slice(offset, perPage * page).map((userGroupMembership) => { return ( ); })}
Name
Email Added On
{Boolean(filteredGroupMemberships.length) && ( )} {!isPending && !filteredGroupMemberships?.length && ( )} {!groupMemberships?.users.length && ( {(isAllowed) => (
)}
)}
); };