import React, { useState } from "react"; import { Link, useHistory, useRouteMatch } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { AlertVariant, Button, ButtonVariant, PageSection, } from "@patternfly/react-core"; import { IFormatter, IFormatterValueType } from "@patternfly/react-table"; import { useAdminClient } from "../context/auth/AdminClient"; import { ViewHeader } from "../components/view-header/ViewHeader"; import RoleRepresentation from "keycloak-admin/lib/defs/roleRepresentation"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import { formattedLinkTableCell } from "../components/external-link/FormattedLink"; import { useAlerts } from "../components/alert/Alerts"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { emptyFormatter, toUpperCase } from "../util"; export const RealmRolesSection = () => { const { t } = useTranslation("roles"); const history = useHistory(); const adminClient = useAdminClient(); const { addAlert } = useAlerts(); const { url } = useRouteMatch(); const [selectedRole, setSelectedRole] = useState(); const loader = async (to?: number, max?: number, search?: string) => { const params: { [name: string]: string | number } = { to: to!, max: max!, search: search!, }; return await adminClient.roles.find(params); }; const RoleDetailLink = (role: RoleRepresentation) => ( <> {role.name} ); const boolFormatter = (): IFormatter => (data?: IFormatterValueType) => { const boolVal = data?.toString(); return (boolVal ? toUpperCase(boolVal) : undefined) as string; }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "roles:roleDeleteConfirm", messageKey: t("roles:roleDeleteConfirmDialog", { selectedRoleName: selectedRole ? selectedRole!.name : "", }), continueButtonLabel: "common:delete", continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { try { await adminClient.roles.delById({ id: selectedRole!.id!, }); setSelectedRole(undefined); addAlert(t("roleDeletedSuccess"), AlertVariant.success); } catch (error) { addAlert(`${t("roleDeleteError")} ${error}`, AlertVariant.danger); } }, }); const goToCreate = () => history.push(`${url}/add-role`); return ( <> } actions={[ { title: t("common:delete"), onRowClick: (role) => { setSelectedRole(role); toggleDeleteDialog(); }, }, ]} columns={[ { name: "name", displayKey: "roles:roleName", cellRenderer: RoleDetailLink, cellFormatters: [formattedLinkTableCell(), emptyFormatter()], }, { name: "composite", displayKey: "roles:composite", cellFormatters: [boolFormatter(), emptyFormatter()], }, { name: "description", displayKey: "common:description", cellFormatters: [emptyFormatter()], }, ]} emptyState={ } /> ); };