/* eslint-disable */ // @ts-nocheck import type PolicyRepresentation from "@keycloak/keycloak-admin-client/lib/defs/policyRepresentation"; import ResourceRepresentation from "@keycloak/keycloak-admin-client/lib/defs/resourceRepresentation"; import ScopeRepresentation from "@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation"; import { KeycloakSpinner, ListEmptyState, PaginatingTableToolbar, useAlerts, useFetch, } from "../../../shared/keycloak-ui-shared"; import { AlertVariant, Button, ButtonVariant, PageSection, ToolbarItem, } from "../../../shared/@patternfly/react-core"; import { ExpandableRowContent, Table, Tbody, Td, Th, Thead, Tr, } from "../../../shared/@patternfly/react-table"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { useRealm } from "../../context/realm-context/RealmContext"; import useSortedResourceTypes from "../../utils/useSortedResourceTypes"; import useToggle from "../../utils/useToggle"; import { AuthorizationScopesDetails } from "../permission-configuration/AuthorizationScopesDetails"; import { SearchDropdown, SearchForm } from "../resource-types/SearchDropdown"; import { toCreatePermissionConfiguration } from "../routes/NewPermissionConfiguration"; import { toPermissionConfigurationDetails } from "../routes/PermissionConfigurationDetails"; import { NewPermissionConfigurationDialog } from "./NewPermissionConfigurationDialog"; type PermissionsConfigurationProps = { clientId: string; }; type ExpandablePolicyRepresentation = PolicyRepresentation & { policies?: PolicyRepresentation[]; resources?: ResourceRepresentation[]; scopes?: ScopeRepresentation[]; isExpanded: boolean; }; export const PermissionsConfigurationTab = ({ clientId, }: PermissionsConfigurationProps) => { const { adminClient } = useAdminClient(); const { t } = useTranslation(); const navigate = useNavigate(); const { addAlert, addError } = useAlerts(); const { realm } = useRealm(); const [permissions, setPermissions] = useState(); const [selectedPermission, setSelectedPermission] = useState(); const [search, setSearch] = useState({}); const [key, setKey] = useState(0); const refresh = () => setKey(key + 1); const [max, setMax] = useState(10); const [first, setFirst] = useState(0); const [newDialog, toggleDialog] = useToggle(); const resourceTypes = useSortedResourceTypes({ clientId }); useFetch( async () => { const permissions = await adminClient.clients.listPermissionScope({ first, max: max + 1, id: clientId, ...search, }); const processedPermissions = await Promise.all( permissions.map(async (permission) => { const policies = await adminClient.clients.getAssociatedPolicies({ id: clientId, permissionId: permission.id!, }); const scopes = await adminClient.clients.getAssociatedScopes({ id: clientId, permissionId: permission.id!, }); const resources = await adminClient.clients.getAssociatedResources({ id: clientId, permissionId: permission.id!, }); return { ...permission, policies, scopes, resources, isExpanded: false, }; }), ); return processedPermissions; }, (permissions) => { setPermissions(permissions as any[]); }, [key, search, first, max], ); const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "deletePermission", messageKey: t("deleteAdminPermissionConfirm", { permission: selectedPermission?.name, }), continueButtonVariant: ButtonVariant.danger, continueButtonLabel: "confirm", onConfirm: async () => { try { await adminClient.clients.delPermission({ id: clientId, type: selectedPermission?.type!, permissionId: selectedPermission?.id!, }); addAlert(t("permissionDeletedSuccess"), AlertVariant.success); refresh(); } catch (error) { addError("permissionDeletedError", error); } }, }); if (!permissions) { return ; } const noData = permissions.length === 0; const searching = Object.keys(search).length !== 0; return ( {(!noData || searching) && ( <> {newDialog && ( navigate( toCreatePermissionConfiguration({ realm, permissionClientId: clientId, resourceType: resourceType.type!, }), ) } toggleDialog={toggleDialog} /> )} { setFirst(first); setMax(max); }} toolbarItem={ <> } > {!noData && ( {permissions.map((permission, rowIndex) => ( {permission.resources && permission.resources.length > 0 ? ( permission.resources!.map( (resource: ResourceRepresentation, index) => ( ), ) ) : ( )}
{permission.policies!.map( (policy: PolicyRepresentation, index) => ( ), )} )} ))}
{t("adminPermissionName")} {t("resourceType")} {t("authorizationScopes")} {t("description")}
{ const rows = permissions.map((p, index) => index === rowIndex ? { ...p, isExpanded: !p.isExpanded } : p, ); setPermissions(rows); }, }} /> {permission.name} {permission.resourceType} ({ name: scope.name || "", }), ), }} /> {permission.description || "—"} { setSelectedPermission(permission); toggleDeleteDialog(); }, }, ], }} >
{permission.isExpanded && ( <> {t("resources")} {resource.displayName || resource.name} {t("allResources")} {t("assignedPolicies")} {policy.name}
)}
)} {noData && !searching && ( <> {newDialog && ( navigate( toCreatePermissionConfiguration({ realm, permissionClientId: clientId, resourceType: resourceType.type!, }), ) } toggleDialog={toggleDialog} /> )} )} {noData && searching && ( )}
); };