import React, { useContext, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { HttpClientContext } from "../context/http-service/HttpClientContext"; import { GroupsList } from "./GroupsList"; import { GroupsCreateModal } from "./GroupsCreateModal"; import { GroupRepresentation } from "./models/groups"; import { ServerGroupsArrayRepresentation, ServerGroupMembersRepresentation, } from "./models/server-info"; import { TableToolbar } from "../components/table-toolbar/TableToolbar"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { Button, Dropdown, DropdownItem, KebabToggle, PageSection, PageSectionVariants, Spinner, ToolbarItem, } from "@patternfly/react-core"; import "./GroupsSection.css"; export const GroupsSection = () => { const { t } = useTranslation("groups"); const httpClient = useContext(HttpClientContext)!; const [rawData, setRawData] = useState<{ [key: string]: any }[]>(); const [filteredData, setFilteredData] = useState(); const [isKebabOpen, setIsKebabOpen] = useState(false); const [createGroupName, setCreateGroupName] = useState(""); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const columnID: keyof GroupRepresentation = "id"; const membersLength: keyof GroupRepresentation = "membersLength"; const columnGroupName: keyof GroupRepresentation = "name"; const loader = async () => { const groups = await httpClient.doGet( "/admin/realms/master/groups" ); const groupsData = groups.data!; const getMembers = async (id: number) => { const response = await httpClient.doGet< ServerGroupMembersRepresentation[] >(`/admin/realms/master/groups/${id}/members`); const responseData = response.data!; return responseData.length; }; const memberPromises = groupsData.map((group: { [key: string]: any }) => getMembers(group[columnID]) ); const memberData = await Promise.all(memberPromises); const updatedObject = groupsData.map( (group: { [key: string]: any }, i: number) => { const object = Object.assign({}, group); object[membersLength] = memberData[i]; return object; } ); setRawData(updatedObject); }; useEffect(() => { loader(); }, []); // Filter groups const filterGroups = (newInput: string) => { const localRowData = rawData!.filter((obj: { [key: string]: string }) => { const groupName = obj[columnGroupName]; return groupName.toLowerCase().includes(newInput.toLowerCase()); }); setFilteredData(localRowData); }; // Kebab delete action const onKebabToggle = (isOpen: boolean) => { setIsKebabOpen(isOpen); }; const onKebabSelect = () => { setIsKebabOpen(!isKebabOpen); }; const handleModalToggle = () => { setIsCreateModalOpen(!isCreateModalOpen); }; return ( <> {rawData && rawData.length > 0 ? ( <> } isOpen={isKebabOpen} isPlain dropdownItems={[ {t("delete")} , ]} /> } > {rawData && ( )} {filteredData && filteredData.length === 0 && ( )} ) : ( )} ); };