/* eslint-disable */ // @ts-nocheck import type ClientProfileRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientProfileRepresentation"; import type ClientProfilesRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientProfilesRepresentation"; import { HelpItem, TextAreaControl, TextControl, useAlerts, useFetch, } from "../../shared/keycloak-ui-shared"; import { ActionGroup, AlertVariant, Button, ButtonVariant, DataList, DataListCell, DataListItem, DataListItemCells, DataListItemRow, Divider, DropdownItem, Flex, FlexItem, Label, PageSection, Text, TextVariants, } from "../../shared/@patternfly/react-core"; import { PlusCircleIcon, TrashIcon } from "../../shared/@patternfly/react-icons"; import { Fragment, useMemo, useState } from "react"; import { FormProvider, useFieldArray, useForm } from "react-hook-form"; 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 { FormAccess } from "../components/form/FormAccess"; import { KeycloakSpinner } from "../../shared/keycloak-ui-shared"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useServerInfo } from "../context/server-info/ServerInfoProvider"; import { useParams } from "../utils/useParams"; import { toAddExecutor } from "./routes/AddExecutor"; import { toClientPolicies } from "./routes/ClientPolicies"; import { ClientProfileParams, toClientProfile } from "./routes/ClientProfile"; import { toExecutor } from "./routes/Executor"; import "./realm-settings-section.css"; type ClientProfileForm = Required; const defaultValues: ClientProfileForm = { name: "", description: "", executors: [], }; export default function ClientProfileForm() { const { adminClient } = useAdminClient(); const { t } = useTranslation(); const navigate = useNavigate(); const form = useForm({ defaultValues, mode: "onChange", }); const { handleSubmit, getValues, formState: { isDirty, isValid }, control, } = form; const { fields: profileExecutors, remove } = useFieldArray({ name: "executors", control, }); const { addAlert, addError } = useAlerts(); const [profiles, setProfiles] = useState(); const [isGlobalProfile, setIsGlobalProfile] = useState(false); const { realm, profileName } = useParams(); const serverInfo = useServerInfo(); const executorTypes = useMemo( () => serverInfo.componentTypes?.[ "org.keycloak.services.clientpolicy.executor.ClientPolicyExecutorProvider" ], [], ); const [executorToDelete, setExecutorToDelete] = useState<{ idx: number; name: string; }>(); const editMode = profileName ? true : false; const [key, setKey] = useState(0); const reload = () => setKey(key + 1); const setupForm = (profile?: ClientProfileRepresentation) => { form.reset({ name: profile?.name ?? "", description: profile?.description ?? "", executors: profile?.executors ?? [], }); }; useFetch( () => adminClient.clientPolicies.listProfiles({ includeGlobalProfiles: true }), (profiles) => { setProfiles({ globalProfiles: profiles.globalProfiles, profiles: profiles.profiles?.filter((p) => p.name !== profileName), }); const globalProfile = profiles.globalProfiles?.find( (p) => p.name === profileName, ); const profile = profiles.profiles?.find((p) => p.name === profileName); setIsGlobalProfile(globalProfile !== undefined); const source = globalProfile ?? profile; setupForm(source); }, [key], ); const save = async (form: ClientProfileForm) => { const updatedProfiles = form; try { await adminClient.clientPolicies.createProfiles({ ...profiles, profiles: [...(profiles?.profiles || []), updatedProfiles], }); addAlert( editMode ? t("updateClientProfileSuccess") : t("createClientProfileSuccess"), AlertVariant.success, ); navigate(toClientProfile({ realm, profileName: form.name })); } catch (error) { addError( editMode ? "updateClientProfileError" : "createClientProfileError", error, ); } }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: executorToDelete?.name! ? t("deleteExecutorProfileConfirmTitle") : t("deleteClientProfileConfirmTitle"), messageKey: executorToDelete?.name! ? t("deleteExecutorProfileConfirm", { executorName: executorToDelete.name!, }) : t("deleteClientProfileConfirm", { profileName, }), continueButtonLabel: t("delete"), continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { if (executorToDelete?.name!) { remove(executorToDelete.idx); try { await adminClient.clientPolicies.createProfiles({ ...profiles, profiles: [...(profiles!.profiles || []), getValues()], }); addAlert(t("deleteExecutorSuccess"), AlertVariant.success); navigate(toClientProfile({ realm, profileName })); } catch (error) { addError("deleteExecutorError", error); } } else { try { await adminClient.clientPolicies.createProfiles(profiles); addAlert(t("deleteClientSuccess"), AlertVariant.success); navigate(toClientPolicies({ realm, tab: "profiles" })); } catch (error) { addError("deleteClientError", error); } } }, }); if (!profiles) { return ; } return ( <> {t("global")} ) : ( "" ), }, ]} divider dropdownItems={ editMode && !isGlobalProfile ? [ {t("deleteClientProfile")} , ] : undefined } /> {!isGlobalProfile && ( )} {editMode && !isGlobalProfile && ( )} {!editMode && !isGlobalProfile && ( )} {editMode && ( <> {t("executors")} {!isGlobalProfile && ( )} {profileExecutors.length > 0 && ( <> {profileExecutors.map((executor, idx) => ( {executor.configuration ? ( ) : ( {executor.executor} )} {executorTypes ?.filter( (type) => type.id === executor.executor, ) .map((type) => ( {!isGlobalProfile && ( )} )} {profileExecutors.length === 0 && ( <> {t("emptyExecutors")} )} )} ); }