added group page to account console (#4445)
This commit is contained in:
parent
7a014f0df8
commit
f6512fabda
5 changed files with 157 additions and 11 deletions
|
@ -19,6 +19,7 @@
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"device-activity": "Device activity",
|
"device-activity": "Device activity",
|
||||||
"deviceActivity": "Device activity",
|
"deviceActivity": "Device activity",
|
||||||
|
"directMembership": "Direct membership",
|
||||||
"doDeny": "Deny",
|
"doDeny": "Deny",
|
||||||
"done": "Done",
|
"done": "Done",
|
||||||
"doSignOut": "Sign out",
|
"doSignOut": "Sign out",
|
||||||
|
@ -29,6 +30,8 @@
|
||||||
"filterByName": "Filter By Name ...",
|
"filterByName": "Filter By Name ...",
|
||||||
"firstName": "First name",
|
"firstName": "First name",
|
||||||
"fullName": "{{givenName}} {{familyName}}",
|
"fullName": "{{givenName}} {{familyName}}",
|
||||||
|
"groupDescriptionLabel": "View groups that you are associated with",
|
||||||
|
"groupLabel": "Groups",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"infoMessage": "By clicking Remove Access, you will remove granted permissions of this application. This application will no longer use your information.",
|
"infoMessage": "By clicking Remove Access, you will remove granted permissions of this application. This application will no longer use your information.",
|
||||||
"internalApp": "Internal",
|
"internalApp": "Internal",
|
||||||
|
@ -47,6 +50,8 @@
|
||||||
"manageAccount": "Manage account",
|
"manageAccount": "Manage account",
|
||||||
"myResources": "My Resources",
|
"myResources": "My Resources",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
|
"noGroups": "No groups",
|
||||||
|
"noGroupsText": "You are not joined in any group",
|
||||||
"notInUse": "Not in use",
|
"notInUse": "Not in use",
|
||||||
"notSetUp": "{{0}} is not set up.",
|
"notSetUp": "{{0}} is not set up.",
|
||||||
"offlineAccess": "Offline access",
|
"offlineAccess": "Offline access",
|
||||||
|
@ -55,6 +60,7 @@
|
||||||
"password-display-name": "Password",
|
"password-display-name": "Password",
|
||||||
"password-help-text": "Sign in by entering your password.",
|
"password-help-text": "Sign in by entering your password.",
|
||||||
"password": "My password",
|
"password": "My password",
|
||||||
|
"path": "Path",
|
||||||
"permissionRequest": "Permission requests - {{0}}",
|
"permissionRequest": "Permission requests - {{0}}",
|
||||||
"permissionRequests": "Permission requests",
|
"permissionRequests": "Permission requests",
|
||||||
"permissions": "Permissions",
|
"permissions": "Permissions",
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
import {
|
import { DataList, Stack, StackItem, Title } from "@patternfly/react-core";
|
||||||
DataList,
|
|
||||||
PageSection,
|
|
||||||
Stack,
|
|
||||||
StackItem,
|
|
||||||
Title,
|
|
||||||
} from "@patternfly/react-core";
|
|
||||||
import { useMemo, useState } from "react";
|
import { useMemo, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { getLinkedAccounts } from "../api/methods";
|
import { getLinkedAccounts } from "../api/methods";
|
||||||
import { LinkedAccountRepresentation } from "../api/representations";
|
import { LinkedAccountRepresentation } from "../api/representations";
|
||||||
import { EmptyRow } from "../components/datalist/EmptyRow";
|
import { EmptyRow } from "../components/datalist/EmptyRow";
|
||||||
|
import { Page } from "../components/page/Page";
|
||||||
import { usePromise } from "../utils/usePromise";
|
import { usePromise } from "../utils/usePromise";
|
||||||
import { AccountRow } from "./AccountRow";
|
import { AccountRow } from "./AccountRow";
|
||||||
|
|
||||||
|
@ -33,7 +28,10 @@ const LinkedAccounts = () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageSection isFilled variant="light">
|
<Page
|
||||||
|
title={t("linkedAccountsTitle")}
|
||||||
|
description={t("linkedAccountsIntroMessage")}
|
||||||
|
>
|
||||||
<Stack hasGutter>
|
<Stack hasGutter>
|
||||||
<StackItem>
|
<StackItem>
|
||||||
<Title headingLevel="h2" className="pf-u-mb-lg" size="xl">
|
<Title headingLevel="h2" className="pf-u-mb-lg" size="xl">
|
||||||
|
@ -73,7 +71,7 @@ const LinkedAccounts = () => {
|
||||||
</DataList>
|
</DataList>
|
||||||
</StackItem>
|
</StackItem>
|
||||||
</Stack>
|
</Stack>
|
||||||
</PageSection>
|
</Page>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import {
|
||||||
CredentialContainer,
|
CredentialContainer,
|
||||||
CredentialRepresentation,
|
CredentialRepresentation,
|
||||||
DeviceRepresentation,
|
DeviceRepresentation,
|
||||||
|
Group,
|
||||||
LinkedAccountRepresentation,
|
LinkedAccountRepresentation,
|
||||||
Permission,
|
Permission,
|
||||||
UserRepresentation,
|
UserRepresentation,
|
||||||
|
@ -103,3 +104,10 @@ export async function linkAccount(account: LinkedAccountRepresentation) {
|
||||||
});
|
});
|
||||||
return parseResponse<{ accountLinkUri: string }>(response);
|
return parseResponse<{ accountLinkUri: string }>(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getGroups({ signal }: CallOptions) {
|
||||||
|
const response = await request("/groups", {
|
||||||
|
signal,
|
||||||
|
});
|
||||||
|
return parseResponse<Group[]>(response);
|
||||||
|
}
|
||||||
|
|
|
@ -202,3 +202,9 @@ export interface Permissions {
|
||||||
permissions: Permission[];
|
permissions: Permission[];
|
||||||
row?: number;
|
row?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Group {
|
||||||
|
id?: string;
|
||||||
|
name: string;
|
||||||
|
path: string;
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,133 @@
|
||||||
import { PageSection } from "@patternfly/react-core";
|
import {
|
||||||
|
Checkbox,
|
||||||
|
DataList,
|
||||||
|
DataListCell,
|
||||||
|
DataListItem,
|
||||||
|
DataListItemCells,
|
||||||
|
DataListItemRow,
|
||||||
|
} from "@patternfly/react-core";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { getGroups } from "../api/methods";
|
||||||
|
import { Group } from "../api/representations";
|
||||||
|
import { Page } from "../components/page/Page";
|
||||||
|
import { usePromise } from "../utils/usePromise";
|
||||||
|
|
||||||
const Groups = () => <PageSection>This is the groups page.</PageSection>;
|
const Groups = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [groups, setGroups] = useState<Group[]>([]);
|
||||||
|
const [directMembership, setDirectMembership] = useState(false);
|
||||||
|
|
||||||
|
usePromise(
|
||||||
|
(signal) => getGroups({ signal }),
|
||||||
|
(groups) => {
|
||||||
|
if (directMembership) {
|
||||||
|
groups.forEach((el) =>
|
||||||
|
getParents(
|
||||||
|
el,
|
||||||
|
groups,
|
||||||
|
groups.map(({ path }) => path)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setGroups(groups);
|
||||||
|
},
|
||||||
|
[directMembership]
|
||||||
|
);
|
||||||
|
|
||||||
|
const getParents = (el: Group, groups: Group[], groupsPaths: string[]) => {
|
||||||
|
const parentPath = el.path.slice(0, el.path.lastIndexOf("/"));
|
||||||
|
if (parentPath && !groupsPaths.includes(parentPath)) {
|
||||||
|
el = {
|
||||||
|
name: parentPath.slice(parentPath.lastIndexOf("/") + 1),
|
||||||
|
path: parentPath,
|
||||||
|
};
|
||||||
|
groups.push(el);
|
||||||
|
groupsPaths.push(parentPath);
|
||||||
|
|
||||||
|
getParents(el, groups, groupsPaths);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Page title={t("groupLabel")} description={t("groupDescriptionLabel")}>
|
||||||
|
<DataList id="groups-list" aria-label={t("groupLabel")} isCompact>
|
||||||
|
<DataListItem id="groups-list-header" aria-labelledby="Columns names">
|
||||||
|
<DataListItemRow>
|
||||||
|
<DataListItemCells
|
||||||
|
dataListCells={[
|
||||||
|
<DataListCell key="directMembership-header">
|
||||||
|
<Checkbox
|
||||||
|
label={t("directMembership")}
|
||||||
|
id="directMembership-checkbox"
|
||||||
|
isChecked={directMembership}
|
||||||
|
onChange={(checked) => setDirectMembership(checked)}
|
||||||
|
/>
|
||||||
|
</DataListCell>,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</DataListItemRow>
|
||||||
|
</DataListItem>
|
||||||
|
<DataListItem id="groups-list-header" aria-labelledby="Columns names">
|
||||||
|
<DataListItemRow>
|
||||||
|
<DataListItemCells
|
||||||
|
dataListCells={[
|
||||||
|
<DataListCell key="group-name-header" width={2}>
|
||||||
|
<strong>{t("name")}</strong>
|
||||||
|
</DataListCell>,
|
||||||
|
<DataListCell key="group-path-header" width={2}>
|
||||||
|
<strong>{t("path")}</strong>
|
||||||
|
</DataListCell>,
|
||||||
|
<DataListCell key="group-direct-membership-header" width={2}>
|
||||||
|
<strong>{t("directMembership")}</strong>
|
||||||
|
</DataListCell>,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</DataListItemRow>
|
||||||
|
</DataListItem>
|
||||||
|
{groups.map((group, appIndex) => (
|
||||||
|
<DataListItem
|
||||||
|
id={`${appIndex}-group`}
|
||||||
|
key={"group-" + appIndex}
|
||||||
|
aria-labelledby="groups-list"
|
||||||
|
>
|
||||||
|
<DataListItemRow>
|
||||||
|
<DataListItemCells
|
||||||
|
dataListCells={[
|
||||||
|
<DataListCell
|
||||||
|
id={`${appIndex}-group-name`}
|
||||||
|
width={2}
|
||||||
|
key={"name-" + appIndex}
|
||||||
|
>
|
||||||
|
{group.name}
|
||||||
|
</DataListCell>,
|
||||||
|
<DataListCell
|
||||||
|
id={`${appIndex}-group-path`}
|
||||||
|
width={2}
|
||||||
|
key={"path-" + appIndex}
|
||||||
|
>
|
||||||
|
{group.path}
|
||||||
|
</DataListCell>,
|
||||||
|
<DataListCell
|
||||||
|
id={`${appIndex}-group-directMembership`}
|
||||||
|
width={2}
|
||||||
|
key={"directMembership-" + appIndex}
|
||||||
|
>
|
||||||
|
<Checkbox
|
||||||
|
id={`${appIndex}-checkbox-directMembership`}
|
||||||
|
isChecked={group.id != null}
|
||||||
|
isDisabled={true}
|
||||||
|
/>
|
||||||
|
</DataListCell>,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</DataListItemRow>
|
||||||
|
</DataListItem>
|
||||||
|
))}
|
||||||
|
</DataList>
|
||||||
|
</Page>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default Groups;
|
export default Groups;
|
||||||
|
|
Loading…
Reference in a new issue