keycloak-scim/apps/admin-ui/src/clients/authorization/AuthorizationEvaluateResource.tsx

93 lines
2.9 KiB
TypeScript

import { useState } from "react";
import {
ExpandableRowContent,
TableComposable,
Tbody,
Td,
Th,
Thead,
Tr,
} from "@patternfly/react-table";
import { DescriptionList } from "@patternfly/react-core/dist/esm/components";
import { useTranslation } from "react-i18next";
import { AuthorizationEvaluateResourcePolicies } from "./AuthorizationEvaluateResourcePolicies";
import type EvaluationResultRepresentation from "@keycloak/keycloak-admin-client/lib/defs/evaluationResultRepresentation";
import type PolicyResultRepresentation from "@keycloak/keycloak-admin-client/lib/defs/policyResultRepresentation";
type Props = {
rowIndex: number;
resource: EvaluationResultRepresentation;
evaluateResults: any;
};
export const AuthorizationEvaluateResource = ({
rowIndex,
resource,
evaluateResults,
}: Props) => {
const [expanded, setExpanded] = useState<boolean>(false);
const { t } = useTranslation("clients");
return (
<Tbody isExpanded={expanded}>
<Tr>
<Td
expand={{
rowIndex,
isExpanded: expanded,
onToggle: () => setExpanded((prev) => !prev),
}}
/>
<Td data-testid={`name-column-${resource.resource}`}>
{resource.resource?.name}
</Td>
<Td id={resource.status?.toLowerCase()}>
{t(`${resource.status?.toLowerCase()}`)}
</Td>
<Td>
{resource.allowedScopes?.length
? resource.allowedScopes.map((item) => item.name)
: "-"}
</Td>
</Tr>
<Tr key={`child-${resource.resource}`} isExpanded={expanded}>
<Td />
<Td colSpan={5}>
<ExpandableRowContent>
{expanded && (
<DescriptionList
isHorizontal
className="keycloak_resource_details"
>
<TableComposable aria-label={t("evaluationResults")}>
<Thead>
<Tr>
<Th />
<Th>{t("permission")}</Th>
<Th>{t("results")}</Th>
<Th>{t("decisionStrategy")}</Th>
<Th>{t("grantedScopes")}</Th>
<Th>{t("deniedScopes")}</Th>
<Th />
</Tr>
</Thead>
{Object.values(evaluateResults[rowIndex].policies).map(
(outerPolicy, idx) => (
<AuthorizationEvaluateResourcePolicies
key={idx}
idx={idx}
rowIndex={rowIndex}
outerPolicy={outerPolicy as PolicyResultRepresentation}
resource={resource}
/>
)
)}
</TableComposable>
</DescriptionList>
)}
</ExpandableRowContent>
</Td>
</Tr>
</Tbody>
);
};