keycloak-scim/src/groups/GroupsSection.tsx

163 lines
4.9 KiB
TypeScript
Raw Normal View History

import React, { useContext, useState, useEffect } from "react";
2020-09-15 19:54:52 +00:00
import { useTranslation } from "react-i18next";
import { HttpClientContext } from "../http-service/HttpClientContext";
import { GroupsList } from "./GroupsList";
2020-09-25 18:21:18 +00:00
import { GroupsCreateModal } from "./GroupsCreateModal";
2020-09-15 19:54:52 +00:00
import { GroupRepresentation } from "./models/groups";
import {
ServerGroupsArrayRepresentation,
ServerGroupMembersRepresentation,
} from "./models/server-info";
2020-09-15 19:54:52 +00:00
import { TableToolbar } from "../components/table-toolbar/TableToolbar";
2020-09-29 18:21:07 +00:00
import { ViewHeader } from "../components/view-header/ViewHeader";
import {
Button,
Dropdown,
DropdownItem,
KebabToggle,
PageSection,
PageSectionVariants,
ToolbarItem,
} from "@patternfly/react-core";
import "./GroupsSection.css";
2020-10-01 18:52:18 +00:00
export const GroupsSection = () => {
2020-09-15 19:54:52 +00:00
const { t } = useTranslation("groups");
const httpClient = useContext(HttpClientContext)!;
const [rawData, setRawData] = useState([{}]);
const [filteredData, setFilteredData] = useState([{}]);
2020-09-15 19:54:52 +00:00
const [max, setMax] = useState(10);
const [first, setFirst] = useState(0);
const [isKebabOpen, setIsKebabOpen] = useState(false);
2020-09-30 13:55:18 +00:00
const [createGroupName, setCreateGroupName] = useState("");
const columnID: keyof GroupRepresentation = "id";
const membersLength: keyof GroupRepresentation = "membersLength";
const columnGroupName: keyof GroupRepresentation = "name";
2020-09-15 19:54:52 +00:00
2020-09-25 18:21:18 +00:00
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
2020-10-01 18:52:18 +00:00
2020-09-25 18:21:18 +00:00
2020-09-15 19:54:52 +00:00
const loader = async () => {
const groups = await httpClient.doGet<ServerGroupsArrayRepresentation[]>(
"/admin/realms/master/groups",
{ params: { first, max } }
);
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;
}
);
return updatedObject;
};
useEffect(() => {
loader().then((data: GroupRepresentation[]) => {
data && setRawData(data);
setFilteredData(data);
});
2020-09-30 13:55:18 +00:00
}, [createGroupName]);
// Filter groups
const filterGroups = (newInput: string) => {
const localRowData: object[] = [];
rawData.forEach(function (obj: { [key: string]: string }) {
const groupName = obj[columnGroupName];
if (groupName.toLowerCase().includes(newInput.toLowerCase())) {
localRowData.push(obj);
}
});
setFilteredData(localRowData);
};
// Kebab delete action
const onKebabToggle = (isOpen: boolean) => {
setIsKebabOpen(isOpen);
};
const onKebabSelect = () => {
setIsKebabOpen(!isKebabOpen);
2020-09-15 19:54:52 +00:00
};
2020-10-01 18:52:18 +00:00
const handleModalToggle = () => {
setIsCreateModalOpen(!isCreateModalOpen)
};
2020-09-15 19:54:52 +00:00
return (
<React.Fragment>
2020-09-29 18:21:07 +00:00
<ViewHeader
titleKey="groups:groups"
subKey="groups:groupsDescription"
/>
<PageSection variant={PageSectionVariants.light}>
<TableToolbar
count={10}
first={first}
max={max}
onNextClick={setFirst}
onPreviousClick={setFirst}
onPerPageSelect={(f, m) => {
setFirst(f);
setMax(m);
}}
inputGroupName="groupsToolbarTextInput"
inputGroupPlaceholder="Search groups"
inputGroupOnChange={filterGroups}
toolbarItem={
<>
<ToolbarItem>
2020-09-28 21:09:34 +00:00
<Button variant="primary" onClick={() => handleModalToggle()}>
{t("createGroup")}
</Button>
</ToolbarItem>
<ToolbarItem>
<Dropdown
onSelect={onKebabSelect}
toggle={<KebabToggle onToggle={onKebabToggle} />}
isOpen={isKebabOpen}
isPlain
dropdownItems={[
<DropdownItem key="action" component="button">
{t("delete")}
</DropdownItem>,
]}
/>
</ToolbarItem>
</>
}
>
{rawData && filteredData && (
2020-10-01 18:52:18 +00:00
<GroupsList
list={filteredData ? filteredData : rawData}
/>
)}
</TableToolbar>
2020-09-30 13:55:18 +00:00
<GroupsCreateModal
isCreateModalOpen={isCreateModalOpen}
handleModalToggle={handleModalToggle}
setIsCreateModalOpen={setIsCreateModalOpen}
createGroupName={createGroupName}
setCreateGroupName={setCreateGroupName}
/>
</PageSection>
</React.Fragment>
2020-09-15 19:54:52 +00:00
);
};