All Downloads are FREE. Search and download functionalities are using the official Maven repository.

theme.keycloak.v2.admin.resources.assets.NewClientPolicyForm-be9f691e.js.map Maven / Gradle / Ivy

There is a newer version: 25.0.1
Show newest version
{"version":3,"file":"NewClientPolicyForm-be9f691e.js","sources":["../../src/realm-settings/AddClientProfileModal.tsx","../../src/realm-settings/NewClientPolicyForm.tsx"],"sourcesContent":["import type ClientProfileRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientProfileRepresentation\";\nimport type RoleRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/roleRepresentation\";\nimport { Button, Label, Modal, ModalVariant } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { adminClient } from \"../admin-client\";\nimport { KeycloakSpinner } from \"../components/keycloak-spinner/KeycloakSpinner\";\nimport { ListEmptyState } from \"../components/list-empty-state/ListEmptyState\";\nimport { KeycloakDataTable } from \"../components/table-toolbar/KeycloakDataTable\";\nimport { useFetch } from \"../utils/useFetch\";\n\ntype ClientProfile = ClientProfileRepresentation & {\n  global: boolean;\n};\n\nconst AliasRenderer = ({ name, global }: ClientProfile) => {\n  const { t } = useTranslation(\"roles\");\n\n  return (\n    <>\n      {name}{\" \"}\n      {global && }\n    \n  );\n};\n\nexport type AddClientProfileModalProps = {\n  open: boolean;\n  toggleDialog: () => void;\n  onConfirm: (newReps: RoleRepresentation[]) => void;\n  allProfiles: string[];\n};\n\nexport const AddClientProfileModal = (props: AddClientProfileModalProps) => {\n  const { t } = useTranslation(\"roles\");\n  const [selectedRows, setSelectedRows] = useState([]);\n\n  const [tableProfiles, setTableProfiles] = useState();\n\n  useFetch(\n    () =>\n      adminClient.clientPolicies.listProfiles({\n        includeGlobalProfiles: true,\n      }),\n    (allProfiles) => {\n      const globalProfiles = allProfiles.globalProfiles?.map(\n        (globalProfiles) => ({\n          ...globalProfiles,\n          global: true,\n        })\n      );\n\n      const profiles = allProfiles.profiles?.map((profiles) => ({\n        ...profiles,\n        global: false,\n      }));\n\n      setTableProfiles([...(globalProfiles ?? []), ...(profiles ?? [])]);\n    },\n    []\n  );\n\n  const loader = async () =>\n    tableProfiles?.filter((item) => !props.allProfiles.includes(item.name!)) ??\n    [];\n\n  if (!tableProfiles) {\n    return ;\n  }\n\n  return (\n     {\n            props.toggleDialog();\n            props.onConfirm(selectedRows);\n          }}\n        >\n          {t(\"common:add\")}\n        ,\n         {\n            props.toggleDialog();\n          }}\n        >\n          {t(\"common:cancel\")}\n        ,\n      ]}\n    >\n       {\n          setSelectedRows([...rows]);\n        }}\n        columns={[\n          {\n            name: \"name\",\n            displayKey: \"realm-settings:clientProfileName\",\n            cellRenderer: AliasRenderer,\n          },\n          {\n            name: \"description\",\n            displayKey: \"common:description\",\n          },\n        ]}\n        emptyState={\n          \n        }\n      />\n    \n  );\n};\n","import type ClientPolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientPolicyRepresentation\";\nimport type ClientProfileRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientProfileRepresentation\";\nimport {\n  ActionGroup,\n  AlertVariant,\n  Button,\n  ButtonVariant,\n  DataList,\n  DataListCell,\n  DataListItem,\n  DataListItemCells,\n  DataListItemRow,\n  Divider,\n  DropdownItem,\n  Flex,\n  FlexItem,\n  FormGroup,\n  PageSection,\n  Text,\n  TextVariants,\n  ValidatedOptions,\n} from \"@patternfly/react-core\";\nimport { PlusCircleIcon, TrashIcon } from \"@patternfly/react-icons\";\nimport { useState } from \"react\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { HelpItem } from \"ui-shared\";\n\nimport { adminClient } from \"../admin-client\";\nimport { useAlerts } from \"../components/alert/Alerts\";\nimport { useConfirmDialog } from \"../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../components/form/FormAccess\";\nimport { KeycloakSpinner } from \"../components/keycloak-spinner/KeycloakSpinner\";\nimport { KeycloakTextArea } from \"../components/keycloak-text-area/KeycloakTextArea\";\nimport { KeycloakTextInput } from \"../components/keycloak-text-input/KeycloakTextInput\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport { useServerInfo } from \"../context/server-info/ServerInfoProvider\";\nimport { useFetch } from \"../utils/useFetch\";\nimport { useParams } from \"../utils/useParams\";\nimport { AddClientProfileModal } from \"./AddClientProfileModal\";\nimport { toNewClientPolicyCondition } from \"./routes/AddCondition\";\nimport { toClientPolicies } from \"./routes/ClientPolicies\";\nimport { toClientProfile } from \"./routes/ClientProfile\";\nimport {\n  EditClientPolicyParams,\n  toEditClientPolicy,\n} from \"./routes/EditClientPolicy\";\nimport { toEditClientPolicyCondition } from \"./routes/EditCondition\";\n\nimport \"./realm-settings-section.css\";\n\ntype NewClientPolicyForm = Required;\n\nconst defaultValues: NewClientPolicyForm = {\n  name: \"\",\n  description: \"\",\n  conditions: [],\n  enabled: true,\n  profiles: [],\n};\n\ntype PolicyDetailAttributes = {\n  idx: number;\n  name: string;\n};\n\nexport default function NewClientPolicyForm() {\n  const { t } = useTranslation(\"realm-settings\");\n  const { realm } = useRealm();\n  const { addAlert, addError } = useAlerts();\n  const [policies, setPolicies] = useState();\n  const [clientProfiles, setClientProfiles] = useState<\n    ClientProfileRepresentation[]\n  >([]);\n\n  const [currentPolicy, setCurrentPolicy] =\n    useState();\n  const [\n    showAddConditionsAndProfilesForm,\n    setShowAddConditionsAndProfilesForm,\n  ] = useState(false);\n\n  const [conditionToDelete, setConditionToDelete] =\n    useState();\n\n  const [profilesModalOpen, setProfilesModalOpen] = useState(false);\n\n  const [profileToDelete, setProfileToDelete] =\n    useState();\n\n  const { policyName } = useParams();\n\n  const navigate = useNavigate();\n  const form = useForm({\n    mode: \"onChange\",\n    defaultValues,\n  });\n  const { handleSubmit } = form;\n\n  const formValues = form.getValues();\n\n  type ClientPoliciesHeaderProps = {\n    onChange: (value: boolean) => void;\n    value: boolean;\n    save: () => void;\n    realmName: string;\n  };\n\n  const ClientPoliciesHeader = ({\n    save,\n    onChange,\n    value,\n  }: ClientPoliciesHeaderProps) => {\n    const { t } = useTranslation(\"realm-settings\");\n\n    const [toggleDisableDialog, DisableConfirm] = useConfirmDialog({\n      titleKey: \"realm-settings:disablePolicyConfirmTitle\",\n      messageKey: \"realm-settings:disablePolicyConfirm\",\n      continueButtonLabel: \"common:disable\",\n      onConfirm: () => {\n        onChange(!value);\n        save();\n      },\n    });\n\n    if (!policies) {\n      return ;\n    }\n\n    return (\n      <>\n        \n        \n         {\n                      toggleDeleteDialog();\n                    }}\n                    data-testid=\"deleteClientPolicyDropdown\"\n                  >\n                    {t(\"deleteClientPolicy\")}\n                  ,\n                ]\n              : undefined\n          }\n          isEnabled={value}\n          onToggle={(value) => {\n            if (!value) {\n              toggleDisableDialog();\n            } else {\n              onChange(value);\n              save();\n            }\n          }}\n        />\n      \n    );\n  };\n\n  useFetch(\n    async () => {\n      const [policies, profiles] = await Promise.all([\n        adminClient.clientPolicies.listPolicies(),\n        adminClient.clientPolicies.listProfiles({\n          includeGlobalProfiles: true,\n        }),\n      ]);\n\n      return { policies, profiles };\n    },\n    ({ policies, profiles }) => {\n      const currentPolicy = policies.policies?.find(\n        (item) => item.name === policyName\n      );\n\n      const allClientProfiles = [\n        ...(profiles.globalProfiles ?? []),\n        ...(profiles.profiles ?? []),\n      ];\n\n      setPolicies(policies.policies ?? []);\n      if (currentPolicy) {\n        setupForm(currentPolicy);\n        setClientProfiles(allClientProfiles);\n        setCurrentPolicy(currentPolicy);\n        setShowAddConditionsAndProfilesForm(true);\n      }\n    },\n    []\n  );\n\n  const setupForm = (policy: ClientPolicyRepresentation) => {\n    form.reset(policy);\n  };\n\n  const policy = (policies || []).filter(\n    (policy) => policy.name === policyName\n  );\n  const policyConditions = policy[0]?.conditions || [];\n  const policyProfiles = policy[0]?.profiles || [];\n\n  const serverInfo = useServerInfo();\n\n  const conditionTypes =\n    serverInfo.componentTypes?.[\n      \"org.keycloak.services.clientpolicy.condition.ClientPolicyConditionProvider\"\n    ];\n\n  const save = async () => {\n    const createdForm = form.getValues();\n    const createdPolicy = {\n      ...createdForm,\n      profiles: [],\n      conditions: [],\n    };\n\n    const getAllPolicies = () => {\n      const policyNameExists = policies?.some(\n        (policy) => policy.name === createdPolicy.name\n      );\n\n      if (policyNameExists) {\n        return policies?.map((policy) =>\n          policy.name === createdPolicy.name ? createdPolicy : policy\n        );\n      } else if (createdForm.name !== policyName) {\n        return policies\n          ?.filter((item) => item.name !== policyName)\n          .concat(createdForm);\n      }\n      return policies?.concat(createdForm);\n    };\n\n    try {\n      await adminClient.clientPolicies.updatePolicy({\n        policies: getAllPolicies(),\n      });\n      addAlert(\n        policyName\n          ? t(\"realm-settings:updateClientPolicySuccess\")\n          : t(\"realm-settings:createClientPolicySuccess\"),\n        AlertVariant.success\n      );\n      navigate(toEditClientPolicy({ realm, policyName: createdForm.name! }));\n      setShowAddConditionsAndProfilesForm(true);\n    } catch (error) {\n      addError(\"realm-settings:createClientPolicyError\", error);\n    }\n  };\n\n  const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n    titleKey: t(\"deleteClientPolicyConfirmTitle\"),\n    messageKey: t(\"deleteClientPolicyConfirm\", {\n      policyName: policyName,\n    }),\n    continueButtonLabel: t(\"delete\"),\n    continueButtonVariant: ButtonVariant.danger,\n    onConfirm: async () => {\n      const updatedPolicies = policies?.filter(\n        (policy) => policy.name !== policyName\n      );\n\n      try {\n        await adminClient.clientPolicies.updatePolicy({\n          policies: updatedPolicies,\n        });\n        addAlert(t(\"deleteClientPolicySuccess\"), AlertVariant.success);\n        navigate(\n          toClientPolicies({\n            realm,\n            tab: \"policies\",\n          })\n        );\n      } catch (error) {\n        addError(t(\"deleteClientPolicyError\"), error);\n      }\n    },\n  });\n\n  const [toggleDeleteConditionDialog, DeleteConditionConfirm] =\n    useConfirmDialog({\n      titleKey: t(\"deleteClientPolicyConditionConfirmTitle\"),\n      messageKey: t(\"deleteClientPolicyConditionConfirm\", {\n        condition: conditionToDelete?.name,\n      }),\n      continueButtonLabel: t(\"delete\"),\n      continueButtonVariant: ButtonVariant.danger,\n      onConfirm: async () => {\n        if (conditionToDelete?.name) {\n          currentPolicy?.conditions?.splice(conditionToDelete.idx!, 1);\n          try {\n            await adminClient.clientPolicies.updatePolicy({\n              policies: policies,\n            });\n            addAlert(t(\"deleteConditionSuccess\"), AlertVariant.success);\n            navigate(\n              toEditClientPolicy({ realm, policyName: formValues.name! })\n            );\n          } catch (error) {\n            addError(t(\"deleteConditionError\"), error);\n          }\n        } else {\n          const updatedPolicies = policies?.filter(\n            (policy) => policy.name !== policyName\n          );\n\n          try {\n            await adminClient.clientPolicies.updatePolicy({\n              policies: updatedPolicies,\n            });\n            addAlert(t(\"deleteClientSuccess\"), AlertVariant.success);\n            navigate(\n              toClientPolicies({\n                realm,\n                tab: \"policies\",\n              })\n            );\n          } catch (error) {\n            addError(t(\"deleteClientError\"), error);\n          }\n        }\n      },\n    });\n\n  const [toggleDeleteProfileDialog, DeleteProfileConfirm] = useConfirmDialog({\n    titleKey: t(\"deleteClientPolicyProfileConfirmTitle\"),\n    messageKey: t(\"deleteClientPolicyProfileConfirm\", {\n      profileName: profileToDelete?.name,\n      policyName,\n    }),\n    continueButtonLabel: t(\"delete\"),\n    continueButtonVariant: ButtonVariant.danger,\n    onConfirm: async () => {\n      if (profileToDelete?.name) {\n        currentPolicy?.profiles?.splice(profileToDelete.idx!, 1);\n        try {\n          await adminClient.clientPolicies.updatePolicy({\n            policies: policies,\n          });\n          addAlert(t(\"deleteClientPolicyProfileSuccess\"), AlertVariant.success);\n          navigate(toEditClientPolicy({ realm, policyName: formValues.name! }));\n        } catch (error) {\n          addError(t(\"deleteClientPolicyProfileError\"), error);\n        }\n      } else {\n        const updatedPolicies = policies?.filter(\n          (policy) => policy.name !== policyName\n        );\n\n        try {\n          await adminClient.clientPolicies.updatePolicy({\n            policies: updatedPolicies,\n          });\n          addAlert(t(\"deleteClientSuccess\"), AlertVariant.success);\n          navigate(\n            toClientPolicies({\n              realm,\n              tab: \"policies\",\n            })\n          );\n        } catch (error) {\n          addError(t(\"deleteClientError\"), error);\n        }\n      }\n    },\n  });\n\n  const reset = () => {\n    if (currentPolicy?.name !== undefined) {\n      form.setValue(\"name\", currentPolicy.name);\n    }\n\n    if (currentPolicy?.description !== undefined) {\n      form.setValue(\"description\", currentPolicy.description);\n    }\n  };\n\n  const toggleModal = () => {\n    setProfilesModalOpen(!profilesModalOpen);\n  };\n\n  const addProfiles = async (profiles: string[]) => {\n    const createdPolicy = {\n      ...currentPolicy,\n      profiles: policyProfiles.concat(profiles),\n      conditions: currentPolicy?.conditions,\n    };\n\n    const index = policies?.findIndex(\n      (policy) => createdPolicy.name === policy.name\n    );\n\n    if (index === undefined || index === -1) {\n      return;\n    }\n\n    const newPolicies = [\n      ...(policies || []).slice(0, index),\n      createdPolicy,\n      ...(policies || []).slice(index + 1),\n    ];\n\n    try {\n      await adminClient.clientPolicies.updatePolicy({\n        policies: newPolicies,\n      });\n      setPolicies(newPolicies);\n      navigate(toEditClientPolicy({ realm, policyName: formValues.name! }));\n      addAlert(\n        t(\"realm-settings:addClientProfileSuccess\"),\n        AlertVariant.success\n      );\n    } catch (error) {\n      addError(\"realm-settings:addClientProfileError\", error);\n    }\n  };\n\n  return (\n    <>\n      \n      \n       {\n          addProfiles(profiles.map((item) => item.name!));\n        }}\n        allProfiles={policyProfiles}\n        open={profilesModalOpen}\n        toggleDialog={toggleModal}\n      />\n       (\n          \n        )}\n      />\n      \n        \n          \n            \n                  policies?.some((policy) => policy.name === value)\n                    ? t(\"createClientProfileNameHelperText\").toString()\n                    : true,\n              })}\n            />\n          \n          \n            \n          \n          \n            \n              {t(\"common:save\")}\n            \n            \n                showAddConditionsAndProfilesForm || policyName\n                  ? reset()\n                  : navigate(\n                      toClientPolicies({\n                        realm,\n                        tab: \"policies\",\n                      })\n                    )\n              }\n              data-testid=\"cancelCreatePolicy\"\n            >\n              {showAddConditionsAndProfilesForm\n                ? t(\"common:reload\")\n                : t(\"common:cancel\")}\n            \n          \n          {(showAddConditionsAndProfilesForm || form.formState.isSubmitted) && (\n            <>\n              \n                \n                  \n                    {t(\"conditions\")}\n                    \n                  \n                \n                \n                   (\n                      \n                    )}\n                    variant=\"link\"\n                    className=\"kc-addCondition\"\n                    data-testid=\"addCondition\"\n                    icon={}\n                  >\n                    {t(\"realm-settings:addCondition\")}\n                  \n                \n              \n              {policyConditions.length > 0 ? (\n                \n                  {policyConditions.map((condition, idx) => (\n                    \n                      \n                        \n                              {Object.keys(condition.configuration!).length !==\n                              0 ? (\n                                \n                                  {condition.condition}\n                                \n                              ) : (\n                                condition.condition\n                              )}\n                              {conditionTypes?.map(\n                                (type) =>\n                                  type.id === condition.condition && (\n                                    <>\n                                      \n                                       {\n                                              toggleDeleteConditionDialog();\n                                              setConditionToDelete({\n                                                idx: idx,\n                                                name: type.id!,\n                                              });\n                                            }}\n                                          />\n                                        }\n                                      >\n                                    \n                                  )\n                              )}\n                            ,\n                          ]}\n                        />\n                      \n                    \n                  ))}\n                \n              ) : (\n                <>\n                  \n                  \n                    {t(\"realm-settings:emptyConditions\")}\n                  \n                \n              )}\n            \n          )}\n          {(showAddConditionsAndProfilesForm || form.formState.isSubmitted) && (\n            <>\n              \n                \n                  \n                    {t(\"clientProfiles\")}\n                    \n                  \n                \n                \n                  }\n                    onClick={toggleModal}\n                  >\n                    {t(\"realm-settings:addClientProfile\")}\n                  \n                \n              \n              {policyProfiles.length > 0 ? (\n                \n                  {policyProfiles.map((profile, idx) => (\n                    \n                      \n                        \n                              {profile && (\n                                \n                                  {profile}\n                                \n                              )}\n                              {policyProfiles\n                                .filter((type) => type === profile)\n                                .map((type) => (\n                                  <>\n                                     type === profile.name\n                                        )?.description\n                                      }\n                                      fieldLabelId={profile}\n                                    />\n                                     {\n                                            toggleDeleteProfileDialog();\n                                            setProfileToDelete({\n                                              idx: idx,\n                                              name: type!,\n                                            });\n                                          }}\n                                        />\n                                      }\n                                    >\n                                  \n                                ))}\n                            ,\n                          ]}\n                        />\n                      \n                    \n                  ))}\n                \n              ) : (\n                <>\n                  \n                  \n                    {t(\"realm-settings:emptyProfiles\")}\n                  \n                \n              )}\n            \n          )}\n        \n      \n    \n  );\n}\n"],"names":["AliasRenderer","name","global","t","useTranslation","jsxs","Fragment","jsx","Label","AddClientProfileModal","props","selectedRows","setSelectedRows","useState","tableProfiles","setTableProfiles","useFetch","adminClient","allProfiles","globalProfiles","profiles","loader","item","Modal","ModalVariant","Button","KeycloakDataTable","rows","ListEmptyState","KeycloakSpinner","defaultValues","NewClientPolicyForm","realm","useRealm","addAlert","addError","useAlerts","policies","setPolicies","clientProfiles","setClientProfiles","currentPolicy","setCurrentPolicy","showAddConditionsAndProfilesForm","setShowAddConditionsAndProfilesForm","conditionToDelete","setConditionToDelete","profilesModalOpen","setProfilesModalOpen","profileToDelete","setProfileToDelete","policyName","useParams","navigate","useNavigate","form","useForm","handleSubmit","formValues","ClientPoliciesHeader","save","onChange","value","toggleDisableDialog","DisableConfirm","useConfirmDialog","DeleteConfirm","ViewHeader","DropdownItem","toggleDeleteDialog","allClientProfiles","setupForm","policy","policyConditions","policyProfiles","conditionTypes","useServerInfo","createdForm","createdPolicy","getAllPolicies","AlertVariant","toEditClientPolicy","error","ButtonVariant","updatedPolicies","toClientPolicies","toggleDeleteConditionDialog","DeleteConditionConfirm","toggleDeleteProfileDialog","DeleteProfileConfirm","reset","toggleModal","addProfiles","index","newPolicies","Controller","field","PageSection","FormAccess","FormGroup","ValidatedOptions","KeycloakTextInput","KeycloakTextArea","ActionGroup","Flex","FlexItem","Text","TextVariants","HelpItem","Link","toNewClientPolicyCondition","PlusCircleIcon","DataList","condition","idx","DataListItem","DataListItemRow","DataListItemCells","DataListCell","toEditClientPolicyCondition","type","TrashIcon","Divider","profile","toClientProfile"],"mappings":"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"}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy