import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Button, Dropdown, DropdownItem, KebabToggle, PageSection, PageSectionVariants, ToolbarItem, AlertVariant, } from "@patternfly/react-core"; import { UsersIcon } from "@patternfly/react-icons"; import GroupRepresentation from "keycloak-admin/lib/defs/groupRepresentation"; import { GroupsCreateModal } from "./GroupsCreateModal"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { useAdminClient } from "../context/auth/AdminClient"; import { useAlerts } from "../components/alert/Alerts"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import "./GroupsSection.css"; import { Link, useRouteMatch } from "react-router-dom"; type GroupTableData = GroupRepresentation & { membersLength?: number; }; export const GroupsSection = () => { const { t } = useTranslation("groups"); const adminClient = useAdminClient(); const [isKebabOpen, setIsKebabOpen] = useState(false); const [createGroupName, setCreateGroupName] = useState(""); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [selectedRows, setSelectedRows] = useState([]); const { addAlert } = useAlerts(); const { url } = useRouteMatch(); const [key, setKey] = useState(""); const refresh = () => setKey(`${new Date().getTime()}`); const getMembers = async (id: string) => { const response = await adminClient.groups.listMembers({ id }); return response ? response.length : 0; }; const loader = async () => { const groupsData = await adminClient.groups.find(); const memberPromises = groupsData.map((group) => getMembers(group.id!)); const memberData = await Promise.all(memberPromises); const updatedObject = groupsData.map((group: GroupTableData, i) => { group.membersLength = memberData[i]; return group; }); return updatedObject; }; const handleModalToggle = () => { setIsCreateModalOpen(!isCreateModalOpen); }; const deleteGroup = (group: GroupRepresentation) => { try { return adminClient.groups.del({ id: group.id!, }); } catch (error) { addAlert(t("groupDeleteError", { error }), AlertVariant.danger); } }; const multiDelete = async () => { if (selectedRows!.length !== 0) { const chainedPromises = selectedRows!.map((group) => deleteGroup(group)); await Promise.all(chainedPromises); addAlert(t("groupsDeleted"), AlertVariant.success); setSelectedRows([]); refresh(); } }; const GroupNameCell = (group: GroupTableData) => ( <> {group.name} ); const GroupMemberCell = (group: GroupTableData) => (
{group.membersLength}
); return ( <> setSelectedRows([...rows])} canSelectAll={false} loader={loader} ariaLabelKey="client-scopes:clientScopeList" searchPlaceholderKey="client-scopes:searchFor" toolbarItem={ <> setIsKebabOpen(!isKebabOpen)} /> } isOpen={isKebabOpen} isPlain dropdownItems={[ { multiDelete(); setIsKebabOpen(false); }} > {t("common:delete")} , ]} /> } actions={[ { title: t("moveTo"), onRowClick: () => console.log("TO DO: Add move to functionality"), }, { title: t("common:delete"), onRowClick: async (group: GroupRepresentation) => { await deleteGroup(group); return true; }, }, ]} columns={[ { name: "name", displayKey: "groups:groupName", cellRenderer: GroupNameCell, }, { name: "members", displayKey: "groups:members", cellRenderer: GroupMemberCell, }, ]} emptyState={ handleModalToggle()} /> } /> ); };