keycloak-scim/src/realm-settings/user-profile/AttributesGroupTab.tsx
2022-05-13 12:34:27 +02:00

120 lines
3.7 KiB
TypeScript

import type { UserProfileGroup } from "@keycloak/keycloak-admin-client/lib/defs/userProfileConfig";
import {
Button,
ButtonVariant,
PageSection,
ToolbarItem,
} from "@patternfly/react-core";
import React, { useEffect, useState } from "react";
import { Trans, useTranslation } from "react-i18next";
import { Link, useHistory } from "react-router-dom";
import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog";
import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState";
import { KeycloakDataTable } from "../../components/table-toolbar/KeycloakDataTable";
import { useRealm } from "../../context/realm-context/RealmContext";
import { toEditAttributesGroup } from "../routes/EditAttributesGroup";
import { toNewAttributesGroup } from "../routes/NewAttributesGroup";
import { useUserProfile } from "./UserProfileContext";
export const AttributesGroupTab = () => {
const { config, save } = useUserProfile();
const { t } = useTranslation("attributes-group");
const history = useHistory();
const { realm } = useRealm();
const [key, setKey] = useState(0);
const [groupToDelete, setGroupToDelete] = useState<UserProfileGroup>();
// Refresh data in table when config changes.
useEffect(() => setKey((value) => value + 1), [config]);
async function loader() {
return config?.groups ?? [];
}
const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({
titleKey: "attributes-group:deleteDialogTitle",
children: (
<Trans i18nKey="attributes-group:deleteDialogDescription">
{" "}
<strong>{{ group: groupToDelete?.name }}</strong>.
</Trans>
),
continueButtonLabel: "common:delete",
continueButtonVariant: ButtonVariant.danger,
onConfirm() {
const groups = (config?.groups ?? []).filter(
(group) => group !== groupToDelete
);
save(
{ ...config, groups },
{
successMessageKey: "attributes-group:deleteSuccess",
errorMessageKey: "attributes-group:deleteError",
}
);
},
});
function deleteAttributeGroup(group: UserProfileGroup) {
setGroupToDelete(group);
toggleDeleteDialog();
}
return (
<PageSection variant="light" className="pf-u-p-0">
<DeleteConfirm />
<KeycloakDataTable
key={key}
loader={loader}
ariaLabelKey="attributes-group:tableTitle"
toolbarItem={
<ToolbarItem>
<Button
component={(props) => (
<Link {...props} to={toNewAttributesGroup({ realm })} />
)}
>
{t("createGroupText")}
</Button>
</ToolbarItem>
}
columns={[
{
name: "name",
displayKey: "attributes-group:columnName",
cellRenderer: (group) => (
<Link to={toEditAttributesGroup({ realm, name: group.name! })}>
{group.name}
</Link>
),
},
{
name: "displayHeader",
displayKey: "attributes-group:columnDisplayName",
},
{
name: "displayDescription",
displayKey: "attributes-group:columnDisplayDescription",
},
]}
actions={[
{
title: t("common:delete"),
onRowClick: deleteAttributeGroup,
},
]}
emptyState={
<ListEmptyState
message={t("emptyStateMessage")}
instructions={t("emptyStateInstructions")}
primaryActionText={t("createGroupText")}
onPrimaryAction={() =>
history.push(toNewAttributesGroup({ realm }))
}
/>
}
/>
</PageSection>
);
};