import { useState } from "react"; import { useLocation, useNavigate } from "react-router-dom-v5-compat"; import { useTranslation } from "react-i18next"; import { DropdownItem, PageSection, PageSectionVariants, Tab, TabTitleText, Tabs, Drawer, DrawerContent, DrawerContentBody, DrawerPanelContent, DrawerHead, } from "@patternfly/react-core"; import type GroupRepresentation from "@keycloak/keycloak-admin-client/lib/defs/groupRepresentation"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useFetch, useAdminClient } from "../context/auth/AdminClient"; import { useRealm } from "../context/realm-context/RealmContext"; import { useSubGroups } from "./SubGroupsContext"; import { GroupTable } from "./GroupTable"; import { getId, getLastId } from "./groupIdUtils"; import { Members } from "./Members"; import { GroupAttributes } from "./GroupAttributes"; import { GroupsModal } from "./GroupsModal"; import { toGroups } from "./routes/Groups"; import { GroupRoleMapping } from "./GroupRoleMapping"; import helpUrls from "../help-urls"; import { PermissionsTab } from "../components/permission-tab/PermissionTab"; import { useAccess } from "../context/access/Access"; import { GroupTree } from "./components/GroupTree"; import { DeleteGroup } from "./components/DeleteGroup"; import useToggle from "../utils/useToggle"; import { GroupBreadCrumbs } from "../components/bread-crumb/GroupBreadCrumbs"; import "./GroupsSection.css"; export default function GroupsSection() { const { t } = useTranslation("groups"); const [activeTab, setActiveTab] = useState(0); const { adminClient } = useAdminClient(); const { subGroups, setSubGroups, currentGroup } = useSubGroups(); const { realm } = useRealm(); const [rename, setRename] = useState(); const [deleteOpen, toggleDeleteOpen] = useToggle(); const navigate = useNavigate(); const location = useLocation(); const id = getLastId(location.pathname); const [key, setKey] = useState(0); const refresh = () => setKey(key + 1); const { hasAccess } = useAccess(); const canViewPermissions = hasAccess( "manage-authorization", "manage-users", "manage-clients" ); const canManageGroup = hasAccess("manage-users") || currentGroup()?.access?.manage; const canManageRoles = hasAccess("manage-users"); useFetch( async () => { const ids = getId(location.pathname); const isNavigationStateInValid = ids && ids.length > subGroups.length; if (isNavigationStateInValid) { const groups: GroupRepresentation[] = []; for (const i of ids!) { const group = i !== "search" ? await adminClient.groups.findOne({ id: i }) : { name: t("searchGroups"), id: "search" }; if (group) { groups.push(group); } else { throw new Error(t("common:notFound")); } } return groups; } return []; }, (groups: GroupRepresentation[]) => { if (groups.length) setSubGroups(groups); }, [id] ); return ( <> { navigate(toGroups({ realm })); refresh(); }} /> {rename && ( { refresh(); setSubGroups([...subGroups.slice(0, subGroups.length - 1), group!]); }} handleModalToggle={() => setRename(undefined)} /> )} setRename(currentGroup()?.name)} > {t("renameGroup")} , {t("deleteGroup")} , ] : undefined } /> {subGroups.length > 0 && ( setActiveTab(key as number)} isBox > {t("childGroups")}} > {t("members")}} > {t("common:attributes")} } > {canManageRoles && ( {t("roleMapping")} } > )} {canViewPermissions && ( {t("common:permissions")} } > )} )} {subGroups.length === 0 && } } > ); }