/* eslint-disable */ // @ts-nocheck import OrganizationRepresentation from "@keycloak/keycloak-admin-client/lib/defs/organizationRepresentation"; import UserRepresentation from "@keycloak/keycloak-admin-client/lib/defs/userRepresentation"; import { ListEmptyState, OrganizationTable, useAlerts, useFetch, } from "../../shared/keycloak-ui-shared"; import { Button, ButtonVariant, Dropdown, DropdownItem, DropdownList, MenuToggle, ToolbarItem, } from "../../shared/@patternfly/react-core"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { useRealm } from "../context/realm-context/RealmContext"; import { OrganizationModal } from "../organizations/OrganizationModal"; import { toEditOrganization } from "../organizations/routes/EditOrganization"; import useToggle from "../utils/useToggle"; import { UserParams } from "./routes/User"; import { toUsers } from "./routes/Users"; import { CheckboxFilterComponent } from "../components/dynamic/CheckboxFilterComponent"; import { capitalizeFirstLetterFormatter } from "../util"; import { SearchInputComponent } from "../components/dynamic/SearchInputComponent"; import { MembershipsModal } from "../groups/MembershipsModal"; import { GroupResourceContext } from "../context/group-resource/GroupResourceContext"; import OrganizationMemberRepresentation from "@keycloak/keycloak-admin-client/lib/defs/organizationMemberRepresentation"; type OrganizationProps = { user: UserRepresentation; }; export const Organizations = ({ user }: OrganizationProps) => { const { adminClient } = useAdminClient(); const { t } = useTranslation(); const { id } = useParams(); const navigate = useNavigate(); const { addAlert, addError } = useAlerts(); const { realm } = useRealm(); const [key, setKey] = useState(0); const refresh = () => setKey(key + 1); const [joinToggle, toggle, setJoinToggle] = useToggle(); const [shouldJoin, setShouldJoin] = useState(true); const [openOrganizationPicker, setOpenOrganizationPicker] = useState(false); const [userOrgs, setUserOrgs] = useState([]); const [selectedOrgs, setSelectedOrgs] = useState< OrganizationRepresentation[] >([]); const [searchText, setSearchText] = useState(""); const [searchTriggerText, setSearchTriggerText] = useState(""); const [filteredMembershipTypes, setFilteredMembershipTypes] = useState< string[] >([]); const [isOpen, setIsOpen] = useState(false); const [showMemberships, toggleShowMemberships] = useToggle(); const [selectedOrg, setSelectedOrg] = useState(); const membershipOptions = [ { value: "Managed", label: "Managed" }, { value: "Unmanaged", label: "Unmanaged" }, ]; const onToggleClick = () => { setIsOpen(!isOpen); }; const onSelect = (_event: any, value: string) => { if (filteredMembershipTypes.includes(value)) { setFilteredMembershipTypes( filteredMembershipTypes.filter((item) => item !== value), ); } else { setFilteredMembershipTypes([...filteredMembershipTypes, value]); } setIsOpen(false); refresh(); }; useFetch( async () => { const userOrganizations = await adminClient.organizations.memberOrganizations({ userId: id! }); const userOrganizationsWithMembershipTypes = await Promise.all( userOrganizations.map(async (org) => { const orgId = org.id; const membership: OrganizationMemberRepresentation = await adminClient.organizations.getMember({ userId: user.id!, orgId: orgId!, }); const membershipType = capitalizeFirstLetterFormatter()( membership.membershipType, ); return { ...org, membershipType }; }), ); let filteredOrgs = userOrganizationsWithMembershipTypes; if (filteredMembershipTypes.length > 0) { filteredOrgs = filteredOrgs.filter((org) => filteredMembershipTypes.includes(org.membershipType as string), ); } if (searchTriggerText) { filteredOrgs = filteredOrgs.filter((org) => org.name?.toLowerCase().includes(searchTriggerText.toLowerCase()), ); } return filteredOrgs; }, setUserOrgs, [key, filteredMembershipTypes, searchTriggerText], ); const handleChange = (value: string) => { setSearchText(value); }; const handleSearch = () => { setSearchTriggerText(searchText); refresh(); }; const clearInput = () => { setSearchText(""); setSearchTriggerText(""); refresh(); }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "removeConfirmOrganizationTitle", messageKey: t("organizationRemoveConfirm", { count: selectedOrgs.length }), continueButtonLabel: "remove", continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { try { await Promise.all( selectedOrgs.map((org) => adminClient.organizations.delMember({ orgId: org.id!, userId: id!, }), ), ); addAlert(t("organizationRemovedSuccess")); const user = await adminClient.users.findOne({ id: id! }); if (!user) { navigate(toUsers({ realm: realm })); } setSelectedOrgs([]); refresh(); } catch (error) { addError("organizationRemoveError", error); } }, }); return ( <> {showMemberships && selectedOrg && ( )} {openOrganizationPicker && ( setOpenOrganizationPicker(false)} onAdd={async (orgs) => { try { await Promise.all( orgs.map((org) => { const form = new FormData(); form.append("id", id!); return shouldJoin ? adminClient.organizations.addMember({ orgId: org.id!, userId: `"${user.id!}"`, }) : adminClient.organizations.inviteExistingUser( { orgId: org.id! }, form, ); }), ); addAlert( t( shouldJoin ? "userAddedOrganization" : "userInvitedOrganization", { count: orgs.length }, ), ); refresh(); } catch (error) { addError( shouldJoin ? "userAddedOrganizationError" : "userInvitedError", error, ); } }} /> )} ( {children} )} loader={userOrgs} isSearching={ searchTriggerText.length > 0 || filteredMembershipTypes.length > 0 } onSelect={(orgs) => setSelectedOrgs(orgs)} deleteLabel="remove" onDelete={(org) => { setSelectedOrgs([org]); toggleDeleteDialog(); }} actions={[ { title: t("showGroupMemberships"), onRowClick: (org: OrganizationRepresentation) => { setSelectedOrg(org); toggleShowMemberships(); }, }, ]} toolbarItem={ <> ( {t("joinOrganization")} )} isOpen={joinToggle} > { setShouldJoin(true); setOpenOrganizationPicker(true); }} > {t("joinOrganization")} { setShouldJoin(false); setOpenOrganizationPicker(true); }} > {t("sendInvite")} setIsOpen(nextOpen)} onToggleClick={onToggleClick} onSelect={onSelect} selectedItems={filteredMembershipTypes} width={"260px"} /> } > { setShouldJoin(true); setOpenOrganizationPicker(true); }, }, { text: t("sendInvitation"), onClick: () => { setShouldJoin(false); setOpenOrganizationPicker(true); }, }, ]} /> ); };