@keycloak/keycloak-admin-ui 26.0.7 → 26.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/.vite/manifest.json +30 -21
- package/lib/Banners.d.ts +5 -0
- package/lib/{CreateFlow-uRG_I_sd.js → CreateFlow--atMTNJc.js} +13 -13
- package/lib/{CreateFlow-uRG_I_sd.js.map → CreateFlow--atMTNJc.js.map} +1 -1
- package/lib/DetailOrganization-az4NPzMy.js +164 -0
- package/lib/DetailOrganization-az4NPzMy.js.map +1 -0
- package/lib/{ExecutorForm-CwWVGOtW.js → ExecutorForm-DaRc7uVA.js} +27 -27
- package/lib/{ExecutorForm-CwWVGOtW.js.map → ExecutorForm-DaRc7uVA.js.map} +1 -1
- package/lib/FlowDetails-qeT2t76N.js +10786 -0
- package/lib/FlowDetails-qeT2t76N.js.map +1 -0
- package/lib/{NewOrganization-CGV9yUfa.js → NewOrganization-DPk2Gzku.js} +12 -12
- package/lib/{NewOrganization-CGV9yUfa.js.map → NewOrganization-DPk2Gzku.js.map} +1 -1
- package/lib/PageHeaderClearCachesModal.d.ts +4 -0
- package/lib/{PermissionDetails-CpjubjMm.js → PermissionDetails-CnvNqBCb.js} +92 -92
- package/lib/{PermissionDetails-CpjubjMm.js.map → PermissionDetails-CnvNqBCb.js.map} +1 -1
- package/lib/{ResourceDetails-BoQE7rAq.js → ResourceDetails-Cfnqq1uy.js} +34 -34
- package/lib/{ResourceDetails-BoQE7rAq.js.map → ResourceDetails-Cfnqq1uy.js.map} +1 -1
- package/lib/{ScopeDetails-CXbD9GiG.js → ScopeDetails-_i-3BNjz.js} +18 -18
- package/lib/{ScopeDetails-CXbD9GiG.js.map → ScopeDetails-_i-3BNjz.js.map} +1 -1
- package/lib/admin-client.d.ts +1 -1
- package/lib/browser-ponyfill-uH6p8znu.js +342 -0
- package/lib/browser-ponyfill-uH6p8znu.js.map +1 -0
- package/lib/client-scopes/routes/ClientScope.d.ts +1 -1
- package/lib/client-scopes/routes/Mapper.d.ts +1 -0
- package/lib/clients/routes/Client.d.ts +1 -1
- package/lib/clients/routes/Mapper.d.ts +1 -0
- package/lib/components/dynamic/IntComponent.d.ts +2 -0
- package/lib/components/dynamic/NumberComponent.d.ts +2 -0
- package/lib/components/dynamic/components.d.ts +5 -1
- package/lib/components/json-file-upload/FileUploadForm.d.ts +2 -3
- package/lib/components/role-mapping/RoleMapping.d.ts +1 -1
- package/lib/context/RecentRealms.d.ts +1 -1
- package/lib/context/access/Access.d.ts +1 -1
- package/lib/context/realm-context/RealmContext.d.ts +1 -1
- package/lib/context/server-info/ServerInfoProvider.d.ts +1 -1
- package/lib/context/whoami/WhoAmI.d.ts +2 -1
- package/lib/events/AdminEvents.d.ts +5 -1
- package/lib/events/UserEvents.d.ts +6 -0
- package/lib/groups/MembershipsModal.d.ts +7 -0
- package/lib/identity-providers/routes/IdentityProvider.d.ts +1 -1
- package/lib/index-BIuvk4Xf.js +102021 -0
- package/lib/index-BIuvk4Xf.js.map +1 -0
- package/lib/index.d.ts +6 -2
- package/lib/keycloak-admin-ui.css +1 -0
- package/lib/keycloak-admin-ui.js +264 -259
- package/lib/organizations/routes/EditOrganization.d.ts +1 -1
- package/lib/permissions/PermissionsSection.d.ts +1 -0
- package/lib/permissions/routes/Permissions.d.ts +7 -0
- package/lib/permissions/routes/PermissionsTabs.d.ts +9 -0
- package/lib/permissions/routes.d.ts +3 -0
- package/lib/realm-roles/routes/RealmRole.d.ts +1 -1
- package/lib/realm-settings/TokensTab.d.ts +1 -2
- package/lib/realm-settings/routes/ThemesTab.d.ts +9 -0
- package/lib/realm-settings/themes/ImageUpload.d.ts +6 -0
- package/lib/realm-settings/themes/LogoContext.d.ts +9 -0
- package/lib/realm-settings/themes/PatternflyVars.d.ts +10 -0
- package/lib/realm-settings/themes/PreviewWindow.d.ts +5 -0
- package/lib/realm-settings/themes/ThemeColors.d.ts +9 -0
- package/lib/realm-settings/{ThemesTab.d.ts → themes/ThemeSettings.d.ts} +2 -2
- package/lib/realm-settings/themes/ThemesTab.d.ts +11 -0
- package/lib/realm-settings/user-profile/UserProfileContext.d.ts +1 -1
- package/lib/realm-settings/user-profile/attribute/AddTranslationsDialog.d.ts +3 -15
- package/lib/realm-settings/user-profile/attribute/AttributeGeneralSettings.d.ts +1 -14
- package/lib/realm-settings/user-profile/attribute/TranslatableField.d.ts +22 -0
- package/lib/theme/login.css +94 -0
- package/lib/user/routes/User.d.ts +1 -1
- package/lib/utils/useCurrentUser.d.ts +5 -5
- package/lib/utils/useIsAdminPermissionsClient.d.ts +1 -0
- package/lib/utils/useIsFeatureEnabled.d.ts +3 -1
- package/package.json +45 -32
- package/LICENSE.txt +0 -202
- package/lib/DetailOrganization-CqbiK2-2.js +0 -130
- package/lib/DetailOrganization-CqbiK2-2.js.map +0 -1
- package/lib/FlowDetails-CRuEMqzE.js +0 -10593
- package/lib/FlowDetails-CRuEMqzE.js.map +0 -1
- package/lib/components/json-file-upload/patternfly/FileUpload.d.ts +0 -73
- package/lib/components/json-file-upload/patternfly/FileUploadField.d.ts +0 -67
- package/lib/components/json-file-upload/patternfly/fileUtils.d.ts +0 -12
- package/lib/index-WPS7MqzE.js +0 -65977
- package/lib/index-WPS7MqzE.js.map +0 -1
- package/lib/style.css +0 -1
- /package/lib/{clients/scopes → components/copy-to-clipboard-button}/CopyToClipboardButton.d.ts +0 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"PermissionDetails-CpjubjMm.js","sources":["../src/clients/authorization/ScopeSelect.tsx","../src/clients/authorization/PermissionDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { SelectOption } from \"@patternfly/react-core\";\nimport { useRef, useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\n\ntype ScopeSelectProps = {\n clientId: string;\n resourceId?: string;\n preSelected?: string;\n};\n\nexport const ScopeSelect = ({\n clientId,\n resourceId,\n preSelected,\n}: ScopeSelectProps) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n\n const {\n control,\n getValues,\n setValue,\n formState: { errors },\n } = useFormContext();\n\n const [scopes, setScopes] = useState<ScopeRepresentation[]>([]);\n const [selectedScopes, setSelectedScopes] = useState<ScopeRepresentation[]>(\n [],\n );\n const [search, setSearch] = useState(\"\");\n const [open, setOpen] = useState(false);\n const firstUpdate = useRef(true);\n\n const values: string[] | undefined = getValues(\"scopes\");\n\n const toSelectOptions = (scopes: ScopeRepresentation[]) =>\n scopes.map((scope) => (\n <SelectOption key={scope.id} value={scope}>\n {scope.name}\n </SelectOption>\n ));\n\n useFetch(\n async (): Promise<ScopeRepresentation[]> => {\n if (!resourceId) {\n return adminClient.clients.listAllScopes(\n Object.assign(\n { id: clientId, deep: false },\n search === \"\" ? null : { name: search },\n ),\n );\n }\n\n if (resourceId && !firstUpdate.current) {\n setValue(\"scopes\", []);\n }\n\n firstUpdate.current = false;\n return adminClient.clients.listScopesByResource({\n id: clientId,\n resourceName: resourceId,\n });\n },\n (scopes) => {\n setScopes(scopes);\n if (!search)\n setSelectedScopes(\n scopes.filter((s: ScopeRepresentation) => values?.includes(s.id!)),\n );\n },\n [resourceId, search],\n );\n\n return (\n <Controller\n name=\"scopes\"\n defaultValue={preSelected ? [preSelected] : []}\n control={control}\n rules={{ validate: (value) => value.length > 0 }}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n onToggle={(val) => setOpen(val)}\n onFilter={(filter) => {\n setSearch(filter);\n return toSelectOptions(scopes);\n }}\n onClear={() => {\n field.onChange([]);\n setSearch(\"\");\n }}\n selections={selectedScopes.map((s) => s.name!)}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedScopes.find((s) => s.name === selectedValue)!\n : (selectedValue as ScopeRepresentation);\n const changedValue = selectedScopes.find((p) => p.id === option.id)\n ? selectedScopes.filter((p) => p.id !== option.id)\n : [...selectedScopes, option];\n\n field.onChange(changedValue.map((s) => s.id));\n setSelectedScopes(changedValue);\n setSearch(\"\");\n }}\n isOpen={open}\n aria-labelledby={t(\"scopes\")}\n validated={errors.scopes ? \"error\" : \"default\"}\n isDisabled={!!preSelected}\n typeAheadAriaLabel={t(\"scopes\")}\n >\n {toSelectOptions(scopes)}\n </KeycloakSelect>\n )}\n />\n );\n};\n","import type PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport { DecisionStrategy } from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport {\n FormErrorText,\n HelpItem,\n SelectVariant,\n TextAreaControl,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n Radio,\n Switch,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { toUpperCase } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport type { NewPermissionParams } from \"../routes/NewPermission\";\nimport {\n PermissionDetailsParams,\n toPermissionDetails,\n} from \"../routes/PermissionDetails\";\nimport { ResourcesPolicySelect } from \"./ResourcesPolicySelect\";\nimport { ScopeSelect } from \"./ScopeSelect\";\n\ntype FormFields = PolicyRepresentation & {\n resourceType: string;\n};\n\nexport default function PermissionDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n\n const form = useForm<FormFields>({\n mode: \"onChange\",\n });\n const {\n control,\n reset,\n formState: { errors },\n handleSubmit,\n } = form;\n\n const navigate = useNavigate();\n const { id, realm, permissionType, permissionId, selectedId } = useParams<\n NewPermissionParams & PermissionDetailsParams\n >();\n\n const { addAlert, addError } = useAlerts();\n const [permission, setPermission] = useState<PolicyRepresentation>();\n const [applyToResourceTypeFlag, setApplyToResourceTypeFlag] = useState(false);\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n async () => {\n if (!permissionId) {\n return {};\n }\n const [permission, resources, policies, scopes] = await Promise.all([\n adminClient.clients.findOnePermission({\n id,\n type: permissionType,\n permissionId,\n }),\n adminClient.clients.getAssociatedResources({\n id,\n permissionId,\n }),\n adminClient.clients.getAssociatedPolicies({\n id,\n permissionId,\n }),\n adminClient.clients.getAssociatedScopes({\n id,\n permissionId,\n }),\n ]);\n\n if (!permission) {\n throw new Error(t(\"notFound\"));\n }\n\n return {\n permission,\n resources: resources.map((r) => r._id),\n policies: policies.map((p) => p.id!),\n scopes: scopes.map((s) => s.id!),\n };\n },\n ({ permission, resources, policies, scopes }) => {\n reset({ ...permission, resources, policies, scopes });\n if (permission && \"resourceType\" in permission) {\n setApplyToResourceTypeFlag(\n !!(permission as { resourceType: string }).resourceType,\n );\n }\n setPermission({ ...permission, resources, policies });\n },\n [],\n );\n\n const save = async (permission: PolicyRepresentation) => {\n try {\n if (permissionId) {\n await adminClient.clients.updatePermission(\n { id, type: permissionType, permissionId },\n permission,\n );\n } else {\n const result = await adminClient.clients.createPermission(\n { id, type: permissionType },\n permission,\n );\n setPermission(result);\n navigate(\n toPermissionDetails({\n realm,\n id,\n permissionType,\n permissionId: result.id!,\n }),\n );\n }\n addAlert(\n t((permissionId ? \"update\" : \"create\") + \"PermissionSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"permissionSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deletePermission\",\n messageKey: t(\"deletePermissionConfirm\", {\n permission: permission?.name,\n }),\n continueButtonVariant: ButtonVariant.danger,\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delPermission({\n id,\n type: permissionType,\n permissionId: permissionId,\n });\n addAlert(t(\"permissionDeletedSuccess\"), AlertVariant.success);\n navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"permissions\" }),\n );\n } catch (error) {\n addError(\"permissionDeletedError\", error);\n }\n },\n });\n\n const resourcesIds = useWatch({\n control,\n name: \"resources\",\n defaultValue: [],\n });\n\n if (!permission) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={\n permissionId\n ? permission.name!\n : `create${toUpperCase(permissionType)}BasedPermission`\n }\n dropdownItems={\n permissionId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n onSubmit={handleSubmit(save)}\n >\n <FormProvider {...form}>\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n labelIcon={t(\"permissionName\")}\n rules={{\n required: t(\"required\"),\n }}\n />\n <TextAreaControl\n name=\"description\"\n label={t(\"description\")}\n labelIcon={t(\"permissionDescription\")}\n rules={{\n maxLength: {\n value: 255,\n message: t(\"maxLength\", { length: 255 }),\n },\n }}\n />\n <FormGroup\n label={t(\"applyToResourceTypeFlag\")}\n fieldId=\"applyToResourceTypeFlag\"\n labelIcon={\n <HelpItem\n helpText={t(\"applyToResourceTypeFlagHelp\")}\n fieldLabelId=\"applyToResourceTypeFlag\"\n />\n }\n >\n <Switch\n id=\"applyToResourceTypeFlag\"\n name=\"applyToResourceTypeFlag\"\n label={t(\"on\")}\n labelOff={t(\"off\")}\n isChecked={applyToResourceTypeFlag}\n onChange={(_event, val) => setApplyToResourceTypeFlag(val)}\n aria-label={t(\"applyToResourceTypeFlag\")}\n />\n </FormGroup>\n {applyToResourceTypeFlag ? (\n <TextControl\n name=\"resourceType\"\n label={t(\"resourceType\")}\n labelIcon={t(\"resourceTypeHelp\")}\n rules={{\n required: {\n value: permissionType === \"scope\" ? true : false,\n message: t(\"required\"),\n },\n }}\n />\n ) : (\n <FormGroup\n label={t(\"resource\")}\n fieldId=\"resources\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionResources\")}\n fieldLabelId=\"resources\"\n />\n }\n isRequired={permissionType !== \"scope\"}\n >\n <ResourcesPolicySelect\n name=\"resources\"\n clientId={id}\n permissionId={permissionId}\n preSelected={\n permissionType === \"scope\" ? undefined : selectedId\n }\n variant={\n permissionType === \"scope\"\n ? SelectVariant.typeahead\n : SelectVariant.typeaheadMulti\n }\n isRequired={permissionType !== \"scope\"}\n />\n {errors.resources && <FormErrorText message={t(\"required\")} />}\n </FormGroup>\n )}\n {permissionType === \"scope\" && (\n <FormGroup\n label={t(\"authorizationScopes\")}\n fieldId=\"scopes\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionScopesHelp\")}\n fieldLabelId=\"scopesSelect\"\n />\n }\n isRequired\n >\n <ScopeSelect\n clientId={id}\n resourceId={resourcesIds?.[0]}\n preSelected={selectedId}\n />\n {errors.scopes && <FormErrorText message={t(\"required\")} />}\n </FormGroup>\n )}\n <FormGroup\n label={t(\"policies\")}\n fieldId=\"policies\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionPoliciesHelp\")}\n fieldLabelId=\"policies\"\n />\n }\n >\n <ResourcesPolicySelect\n name=\"policies\"\n clientId={id}\n permissionId={permissionId}\n />\n </FormGroup>\n <FormGroup\n label={t(\"decisionStrategy\")}\n labelIcon={\n <HelpItem\n helpText={t(\"permissionDecisionStrategyHelp\")}\n fieldLabelId=\"decisionStrategy\"\n />\n }\n fieldId=\"policyEnforcementMode\"\n hasNoPaddingTop\n >\n <Controller\n name=\"decisionStrategy\"\n data-testid=\"decisionStrategy\"\n defaultValue={DecisionStrategy.UNANIMOUS}\n control={control}\n render={({ field }) => (\n <>\n {Object.values(DecisionStrategy).map((strategy) => (\n <Radio\n id={strategy}\n key={strategy}\n data-testid={strategy}\n isChecked={field.value === strategy}\n isDisabled={isDisabled}\n name=\"decisionStrategies\"\n onChange={() => field.onChange(strategy)}\n label={t(`decisionStrategies.${strategy}`)}\n className=\"pf-v5-u-mb-md\"\n />\n ))}\n </>\n )}\n />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"permissions\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormProvider>\n </FormAccess>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopeSelect","clientId","resourceId","preSelected","adminClient","useAdminClient","t","useTranslation","control","getValues","setValue","errors","useFormContext","scopes","setScopes","useState","selectedScopes","setSelectedScopes","search","setSearch","open","setOpen","firstUpdate","useRef","values","toSelectOptions","scope","jsx","SelectOption","useFetch","s","Controller","value","field","KeycloakSelect","SelectVariant","val","filter","selectedValue","option","changedValue","p","PermissionDetails","form","useForm","reset","handleSubmit","navigate","useNavigate","id","realm","permissionType","permissionId","selectedId","useParams","addAlert","addError","useAlerts","permission","setPermission","applyToResourceTypeFlag","setApplyToResourceTypeFlag","hasAccess","useAccess","isDisabled","resources","policies","r","save","result","toPermissionDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","toAuthorizationTab","resourcesIds","useWatch","jsxs","Fragment","ViewHeader","toUpperCase","DropdownItem","PageSection","FormAccess","FormProvider","TextControl","TextAreaControl","FormGroup","HelpItem","Switch","_event","ResourcesPolicySelect","FormErrorText","DecisionStrategy","strategy","Radio","ActionGroup","Button","props","Link","KeycloakSpinner"],"mappings":";;;;;AAkBO,MAAMA,KAAc,CAAC;AAAA,EAC1B,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AACF,MAAwB;AAChB,QAAA,EAAE,aAAAC,MAAgBC,KAElB,EAAE,GAAAC,MAAMC,KAER;AAAA,IACJ,SAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAW,EAAE,QAAAC,EAAO;AAAA,MAClBC,EAAe,GAEb,CAACC,GAAQC,CAAS,IAAIC,EAAgC,CAAE,CAAA,GACxD,CAACC,GAAgBC,CAAiB,IAAIF;AAAA,IAC1C,CAAC;AAAA,EAAA,GAEG,CAACG,GAAQC,CAAS,IAAIJ,EAAS,EAAE,GACjC,CAACK,GAAMC,CAAO,IAAIN,EAAS,EAAK,GAChCO,IAAcC,GAAO,EAAI,GAEzBC,IAA+Bf,EAAU,QAAQ,GAEjDgB,IAAkB,CAACZ,MACvBA,EAAO,IAAI,CAACa,MACT,gBAAAC,EAAAC,GAAA,EAA4B,OAAOF,GACjC,UAAAA,EAAM,KADU,GAAAA,EAAM,EAEzB,CACD;AAEHG,SAAAA;AAAAA,IACE,YACO3B,KASDA,KAAc,CAACoB,EAAY,WACpBZ,EAAA,UAAU,CAAA,CAAE,GAGvBY,EAAY,UAAU,IACflB,EAAY,QAAQ,qBAAqB;AAAA,MAC9C,IAAIH;AAAA,MACJ,cAAcC;AAAA,IAAA,CACf,KAhBQE,EAAY,QAAQ;AAAA,MACzB,OAAO;AAAA,QACL,EAAE,IAAIH,GAAU,MAAM,GAAM;AAAA,QAC5BiB,MAAW,KAAK,OAAO,EAAE,MAAMA,EAAO;AAAA,MACxC;AAAA,IAAA;AAAA,IAcN,CAACL,MAAW;AACV,MAAAC,EAAUD,CAAM,GACXK,KACHD;AAAA,QACEJ,EAAO,OAAO,CAACiB,MAA2BN,GAAQ,SAASM,EAAE,EAAG,CAAC;AAAA,MAAA;AAAA,IAEvE;AAAA,IACA,CAAC5B,GAAYgB,CAAM;AAAA,EAAA,GAInB,gBAAAS;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAc5B,IAAc,CAACA,CAAW,IAAI,CAAC;AAAA,MAC7C,SAAAK;AAAA,MACA,OAAO,EAAE,UAAU,CAACwB,MAAUA,EAAM,SAAS,EAAE;AAAA,MAC/C,QAAQ,CAAC,EAAE,OAAAC,EAAA,MACT,gBAAAN;AAAA,QAACO;AAAAA,QAAA;AAAA,UACC,UAAS;AAAA,UACT,SAASC,EAAc;AAAA,UACvB,UAAU,CAACC,MAAQf,EAAQe,CAAG;AAAA,UAC9B,UAAU,CAACC,OACTlB,EAAUkB,CAAM,GACTZ,EAAgBZ,CAAM;AAAA,UAE/B,SAAS,MAAM;AACP,YAAAoB,EAAA,SAAS,CAAA,CAAE,GACjBd,EAAU,EAAE;AAAA,UACd;AAAA,UACA,YAAYH,EAAe,IAAI,CAACc,MAAMA,EAAE,IAAK;AAAA,UAC7C,UAAU,CAACQ,MAAkB;AACrB,kBAAAC,IACJ,OAAOD,KAAkB,WACrBtB,EAAe,KAAK,CAACc,MAAMA,EAAE,SAASQ,CAAa,IAClDA,GACDE,IAAexB,EAAe,KAAK,CAACyB,MAAMA,EAAE,OAAOF,EAAO,EAAE,IAC9DvB,EAAe,OAAO,CAACyB,MAAMA,EAAE,OAAOF,EAAO,EAAE,IAC/C,CAAC,GAAGvB,GAAgBuB,CAAM;AAE9B,YAAAN,EAAM,SAASO,EAAa,IAAI,CAACV,MAAMA,EAAE,EAAE,CAAC,GAC5Cb,EAAkBuB,CAAY,GAC9BrB,EAAU,EAAE;AAAA,UACd;AAAA,UACA,QAAQC;AAAA,UACR,mBAAiBd,EAAE,QAAQ;AAAA,UAC3B,WAAWK,EAAO,SAAS,UAAU;AAAA,UACrC,YAAY,CAAC,CAACR;AAAA,UACd,oBAAoBG,EAAE,QAAQ;AAAA,UAE7B,YAAgBO,CAAM;AAAA,QAAA;AAAA,MACzB;AAAA,IAAA;AAAA,EAAA;AAIR;AC/EA,SAAwB6B,KAAoB;AACpC,QAAA,EAAE,aAAAtC,MAAgBC,KAElB,EAAE,GAAAC,MAAMC,KAERoC,IAAOC,EAAoB;AAAA,IAC/B,MAAM;AAAA,EAAA,CACP,GACK;AAAA,IACJ,SAAApC;AAAA,IACA,OAAAqC;AAAA,IACA,WAAW,EAAE,QAAAlC,EAAO;AAAA,IACpB,cAAAmC;AAAA,EACE,IAAAH,GAEEI,IAAWC,MACX,EAAE,IAAAC,GAAI,OAAAC,GAAO,gBAAAC,GAAgB,cAAAC,GAAc,YAAAC,EAAA,IAAeC,KAI1D,EAAE,UAAAC,GAAU,UAAAC,EAAS,IAAIC,GAAU,GACnC,CAACC,GAAYC,CAAa,IAAI5C,EAA+B,GAC7D,CAAC6C,GAAyBC,CAA0B,IAAI9C,EAAS,EAAK,GACtE,EAAE,WAAA+C,MAAcC,MAEhBC,IAAa,CAACF,EAAU,sBAAsB;AAEpDjC,EAAAA;AAAAA,IACE,YAAY;AACV,UAAI,CAACuB;AACH,eAAO;AAEH,YAAA,CAACM,GAAYO,GAAWC,GAAUrD,CAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClET,EAAY,QAAQ,kBAAkB;AAAA,UACpC,IAAA6C;AAAA,UACA,MAAME;AAAA,UACN,cAAAC;AAAA,QAAA,CACD;AAAA,QACDhD,EAAY,QAAQ,uBAAuB;AAAA,UACzC,IAAA6C;AAAA,UACA,cAAAG;AAAA,QAAA,CACD;AAAA,QACDhD,EAAY,QAAQ,sBAAsB;AAAA,UACxC,IAAA6C;AAAA,UACA,cAAAG;AAAA,QAAA,CACD;AAAA,QACDhD,EAAY,QAAQ,oBAAoB;AAAA,UACtC,IAAA6C;AAAA,UACA,cAAAG;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAED,UAAI,CAACM;AACH,cAAM,IAAI,MAAMpD,EAAE,UAAU,CAAC;AAGxB,aAAA;AAAA,QACL,YAAAoD;AAAAA,QACA,WAAWO,EAAU,IAAI,CAACE,MAAMA,EAAE,GAAG;AAAA,QACrC,UAAUD,EAAS,IAAI,CAACzB,MAAMA,EAAE,EAAG;AAAA,QACnC,QAAQ5B,EAAO,IAAI,CAACiB,MAAMA,EAAE,EAAG;AAAA,MAAA;AAAA,IAEnC;AAAA,IACA,CAAC,EAAE,YAAA4B,GAAY,WAAAO,GAAW,UAAAC,GAAU,QAAArD,QAAa;AAC/C,MAAAgC,EAAM,EAAE,GAAGa,GAAY,WAAAO,GAAW,UAAAC,GAAU,QAAArD,GAAQ,GAChD6C,KAAc,kBAAkBA,KAClCG;AAAA,QACE,CAAC,CAAEH,EAAwC;AAAA,MAAA,GAG/CC,EAAc,EAAE,GAAGD,GAAY,WAAAO,GAAW,UAAAC,EAAU,CAAA;AAAA,IACtD;AAAA,IACA,CAAC;AAAA,EAAA;AAGG,QAAAE,IAAO,OAAOV,MAAqC;AACnD,QAAA;AACF,UAAIN;AACF,cAAMhD,EAAY,QAAQ;AAAA,UACxB,EAAE,IAAA6C,GAAI,MAAME,GAAgB,cAAAC,EAAa;AAAA,UACzCM;AAAAA,QAAA;AAAA,WAEG;AACC,cAAAW,IAAS,MAAMjE,EAAY,QAAQ;AAAA,UACvC,EAAE,IAAA6C,GAAI,MAAME,EAAe;AAAA,UAC3BO;AAAAA,QAAA;AAEF,QAAAC,EAAcU,CAAM,GACpBtB;AAAA,UACEuB,GAAoB;AAAA,YAClB,OAAApB;AAAA,YACA,IAAAD;AAAA,YACA,gBAAAE;AAAA,YACA,cAAckB,EAAO;AAAA,UAAA,CACtB;AAAA,QAAA;AAAA,MAEL;AACA,MAAAd;AAAA,QACEjD,GAAG8C,IAAe,WAAW,YAAY,mBAAmB;AAAA,QAC5DmB,EAAa;AAAA,MAAA;AAAA,aAERC,GAAO;AACd,MAAAhB,EAAS,uBAAuBgB,CAAK;AAAA,IACvC;AAAA,EAAA,GAGI,CAACC,GAAoBC,CAAa,IAAIC,GAAiB;AAAA,IAC3D,UAAU;AAAA,IACV,YAAYrE,EAAE,2BAA2B;AAAA,MACvC,YAAYoD,GAAY;AAAA,IAAA,CACzB;AAAA,IACD,uBAAuBkB,EAAc;AAAA,IACrC,qBAAqB;AAAA,IACrB,WAAW,YAAY;AACjB,UAAA;AACI,cAAAxE,EAAY,QAAQ,cAAc;AAAA,UACtC,IAAA6C;AAAA,UACA,MAAME;AAAA,UACN,cAAAC;AAAA,QAAA,CACD,GACDG,EAASjD,EAAE,0BAA0B,GAAGiE,EAAa,OAAO,GAC5DxB;AAAA,UACE8B,EAAmB,EAAE,OAAA3B,GAAO,UAAUD,GAAI,KAAK,eAAe;AAAA,QAAA;AAAA,eAEzDuB,GAAO;AACd,QAAAhB,EAAS,0BAA0BgB,CAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EAAA,CACD,GAEKM,IAAeC,GAAS;AAAA,IAC5B,SAAAvE;AAAA,IACA,MAAM;AAAA,IACN,cAAc,CAAC;AAAA,EAAA,CAChB;AAED,SAAKkD,IAMD,gBAAAsB,EAAAC,GAAA,EAAA,UAAA;AAAA,IAAA,gBAAAtD,EAAC+C,GAAc,EAAA;AAAA,IACf,gBAAA/C;AAAA,MAACuD;AAAA,MAAA;AAAA,QACC,UACE9B,IACIM,EAAW,OACX,SAASyB,GAAYhC,CAAc,CAAC;AAAA,QAE1C,eACEC,IACI;AAAA,UACE,gBAAAzB;AAAA,YAACyD;AAAA,YAAA;AAAA,cAEC,eAAY;AAAA,cACZ,YAAApB;AAAA,cACA,SAAS,MAAMS,EAAmB;AAAA,cAEjC,YAAE,QAAQ;AAAA,YAAA;AAAA,YALP;AAAA,UAMN;AAAA,QAEF,IAAA;AAAA,MAAA;AAAA,IAER;AAAA,IACA,gBAAA9C,EAAC0D,IAAY,EAAA,SAAQ,SACnB,UAAA,gBAAA1D;AAAA,MAAC2D;AAAA,MAAA;AAAA,QACC,cAAY;AAAA,QACZ,MAAK;AAAA,QACL,UAAUxC,EAAasB,CAAI;AAAA,QAE3B,UAAA,gBAAAY,EAACO,IAAc,EAAA,GAAG5C,GAChB,UAAA;AAAA,UAAA,gBAAAhB;AAAA,YAAC6D;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOlF,EAAE,MAAM;AAAA,cACf,WAAWA,EAAE,gBAAgB;AAAA,cAC7B,OAAO;AAAA,gBACL,UAAUA,EAAE,UAAU;AAAA,cACxB;AAAA,YAAA;AAAA,UACF;AAAA,UACA,gBAAAqB;AAAA,YAAC8D;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOnF,EAAE,aAAa;AAAA,cACtB,WAAWA,EAAE,uBAAuB;AAAA,cACpC,OAAO;AAAA,gBACL,WAAW;AAAA,kBACT,OAAO;AAAA,kBACP,SAASA,EAAE,aAAa,EAAE,QAAQ,KAAK;AAAA,gBACzC;AAAA,cACF;AAAA,YAAA;AAAA,UACF;AAAA,UACA,gBAAAqB;AAAA,YAAC+D;AAAA,YAAA;AAAA,cACC,OAAOpF,EAAE,yBAAyB;AAAA,cAClC,SAAQ;AAAA,cACR,WACE,gBAAAqB;AAAA,gBAACgE;AAAAA,gBAAA;AAAA,kBACC,UAAUrF,EAAE,6BAA6B;AAAA,kBACzC,cAAa;AAAA,gBAAA;AAAA,cACf;AAAA,cAGF,UAAA,gBAAAqB;AAAA,gBAACiE;AAAA,gBAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,OAAOtF,EAAE,IAAI;AAAA,kBACb,UAAUA,EAAE,KAAK;AAAA,kBACjB,WAAWsD;AAAA,kBACX,UAAU,CAACiC,GAAQzD,MAAQyB,EAA2BzB,CAAG;AAAA,kBACzD,cAAY9B,EAAE,yBAAyB;AAAA,gBAAA;AAAA,cACzC;AAAA,YAAA;AAAA,UACF;AAAA,UACCsD,IACC,gBAAAjC;AAAA,YAAC6D;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOlF,EAAE,cAAc;AAAA,cACvB,WAAWA,EAAE,kBAAkB;AAAA,cAC/B,OAAO;AAAA,gBACL,UAAU;AAAA,kBACR,OAAO6C,MAAmB;AAAA,kBAC1B,SAAS7C,EAAE,UAAU;AAAA,gBACvB;AAAA,cACF;AAAA,YAAA;AAAA,UAAA,IAGF,gBAAA0E;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,OAAOpF,EAAE,UAAU;AAAA,cACnB,SAAQ;AAAA,cACR,WACE,gBAAAqB;AAAA,gBAACgE;AAAAA,gBAAA;AAAA,kBACC,UAAUrF,EAAE,qBAAqB;AAAA,kBACjC,cAAa;AAAA,gBAAA;AAAA,cACf;AAAA,cAEF,YAAY6C,MAAmB;AAAA,cAE/B,UAAA;AAAA,gBAAA,gBAAAxB;AAAA,kBAACmE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,UAAU7C;AAAA,oBACV,cAAAG;AAAA,oBACA,aACED,MAAmB,UAAU,SAAYE;AAAA,oBAE3C,SACEF,MAAmB,UACfhB,EAAc,YACdA,EAAc;AAAA,oBAEpB,YAAYgB,MAAmB;AAAA,kBAAA;AAAA,gBACjC;AAAA,gBACCxC,EAAO,aAAa,gBAAAgB,EAACoE,KAAc,SAASzF,EAAE,UAAU,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9D;AAAA,UAED6C,MAAmB,WAClB,gBAAA6B;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,OAAOpF,EAAE,qBAAqB;AAAA,cAC9B,SAAQ;AAAA,cACR,WACE,gBAAAqB;AAAA,gBAACgE;AAAAA,gBAAA;AAAA,kBACC,UAAUrF,EAAE,sBAAsB;AAAA,kBAClC,cAAa;AAAA,gBAAA;AAAA,cACf;AAAA,cAEF,YAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAqB;AAAA,kBAAC3B;AAAA,kBAAA;AAAA,oBACC,UAAUiD;AAAA,oBACV,YAAY6B,IAAe,CAAC;AAAA,oBAC5B,aAAazB;AAAA,kBAAA;AAAA,gBACf;AAAA,gBACC1C,EAAO,UAAU,gBAAAgB,EAACoE,KAAc,SAASzF,EAAE,UAAU,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UAC3D;AAAA,UAEF,gBAAAqB;AAAA,YAAC+D;AAAA,YAAA;AAAA,cACC,OAAOpF,EAAE,UAAU;AAAA,cACnB,SAAQ;AAAA,cACR,WACE,gBAAAqB;AAAA,gBAACgE;AAAAA,gBAAA;AAAA,kBACC,UAAUrF,EAAE,wBAAwB;AAAA,kBACpC,cAAa;AAAA,gBAAA;AAAA,cACf;AAAA,cAGF,UAAA,gBAAAqB;AAAA,gBAACmE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU7C;AAAA,kBACV,cAAAG;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UACF;AAAA,UACA,gBAAAzB;AAAA,YAAC+D;AAAA,YAAA;AAAA,cACC,OAAOpF,EAAE,kBAAkB;AAAA,cAC3B,WACE,gBAAAqB;AAAA,gBAACgE;AAAAA,gBAAA;AAAA,kBACC,UAAUrF,EAAE,gCAAgC;AAAA,kBAC5C,cAAa;AAAA,gBAAA;AAAA,cACf;AAAA,cAEF,SAAQ;AAAA,cACR,iBAAe;AAAA,cAEf,UAAA,gBAAAqB;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,eAAY;AAAA,kBACZ,cAAciE,EAAiB;AAAA,kBAC/B,SAAAxF;AAAA,kBACA,QAAQ,CAAC,EAAE,OAAAyB,EACT,MAAA,gBAAAN,EAAAsD,GAAA,EACG,UAAO,OAAA,OAAOe,CAAgB,EAAE,IAAI,CAACC,MACpC,gBAAAtE;AAAA,oBAACuE;AAAA,oBAAA;AAAA,sBACC,IAAID;AAAA,sBAEJ,eAAaA;AAAA,sBACb,WAAWhE,EAAM,UAAUgE;AAAA,sBAC3B,YAAAjC;AAAA,sBACA,MAAK;AAAA,sBACL,UAAU,MAAM/B,EAAM,SAASgE,CAAQ;AAAA,sBACvC,OAAO3F,EAAE,sBAAsB2F,CAAQ,EAAE;AAAA,sBACzC,WAAU;AAAA,oBAAA;AAAA,oBAPLA;AAAA,kBASR,CAAA,GACH;AAAA,gBAAA;AAAA,cAEJ;AAAA,YAAA;AAAA,UACF;AAAA,UACC,gBAAAtE,EAAAwE,IAAA,EACC,UAAC,gBAAAnB,EAAA,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,YAAA,gBAAArD;AAAA,cAACyE;AAAA,cAAA;AAAA,gBACC,SAASxB,EAAc;AAAA,gBACvB,MAAK;AAAA,gBACL,eAAY;AAAA,gBAEX,YAAE,MAAM;AAAA,cAAA;AAAA,YACX;AAAA,YAEA,gBAAAjD;AAAA,cAACyE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,eAAY;AAAA,gBACZ,WAAW,CAACC,MACV,gBAAA1E;AAAA,kBAAC2E;AAAA,kBAAA;AAAA,oBACE,GAAGD;AAAA,oBACJ,IAAIxB,EAAmB;AAAA,sBACrB,OAAA3B;AAAA,sBACA,UAAUD;AAAA,sBACV,KAAK;AAAA,oBAAA,CACN;AAAA,kBAAA;AAAA,gBACF;AAAA,gBAGF,YAAE,QAAQ;AAAA,cAAA;AAAA,YACb;AAAA,UAAA,EAAA,CACF,EACF,CAAA;AAAA,QAAA,GACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EACF,EAAA,CAAA,sBAxNQsD,IAAgB,CAAA,CAAA;AA0N5B;"}
|
1
|
+
{"version":3,"file":"PermissionDetails-CnvNqBCb.js","sources":["../src/clients/authorization/ScopeSelect.tsx","../src/clients/authorization/PermissionDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { SelectOption } from \"@patternfly/react-core\";\nimport { useRef, useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\n\ntype ScopeSelectProps = {\n clientId: string;\n resourceId?: string;\n preSelected?: string;\n};\n\nexport const ScopeSelect = ({\n clientId,\n resourceId,\n preSelected,\n}: ScopeSelectProps) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n\n const {\n control,\n getValues,\n setValue,\n formState: { errors },\n } = useFormContext();\n\n const [scopes, setScopes] = useState<ScopeRepresentation[]>([]);\n const [selectedScopes, setSelectedScopes] = useState<ScopeRepresentation[]>(\n [],\n );\n const [search, setSearch] = useState(\"\");\n const [open, setOpen] = useState(false);\n const firstUpdate = useRef(true);\n\n const values: string[] | undefined = getValues(\"scopes\");\n\n const toSelectOptions = (scopes: ScopeRepresentation[]) =>\n scopes.map((scope) => (\n <SelectOption key={scope.id} value={scope}>\n {scope.name}\n </SelectOption>\n ));\n\n useFetch(\n async (): Promise<ScopeRepresentation[]> => {\n if (!resourceId) {\n return adminClient.clients.listAllScopes(\n Object.assign(\n { id: clientId, deep: false },\n search === \"\" ? null : { name: search },\n ),\n );\n }\n\n if (resourceId && !firstUpdate.current) {\n setValue(\"scopes\", []);\n }\n\n firstUpdate.current = false;\n return adminClient.clients.listScopesByResource({\n id: clientId,\n resourceName: resourceId,\n });\n },\n (scopes) => {\n setScopes(scopes);\n if (!search)\n setSelectedScopes(\n scopes.filter((s: ScopeRepresentation) => values?.includes(s.id!)),\n );\n },\n [resourceId, search],\n );\n\n return (\n <Controller\n name=\"scopes\"\n defaultValue={preSelected ? [preSelected] : []}\n control={control}\n rules={{ validate: (value) => value.length > 0 }}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n onToggle={(val) => setOpen(val)}\n onFilter={(filter) => {\n setSearch(filter);\n return toSelectOptions(scopes);\n }}\n onClear={() => {\n field.onChange([]);\n setSearch(\"\");\n }}\n selections={selectedScopes.map((s) => s.name!)}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedScopes.find((s) => s.name === selectedValue)!\n : (selectedValue as ScopeRepresentation);\n const changedValue = selectedScopes.find((p) => p.id === option.id)\n ? selectedScopes.filter((p) => p.id !== option.id)\n : [...selectedScopes, option];\n\n field.onChange(changedValue.map((s) => s.id));\n setSelectedScopes(changedValue);\n setSearch(\"\");\n }}\n isOpen={open}\n aria-labelledby={t(\"scopes\")}\n validated={errors.scopes ? \"error\" : \"default\"}\n isDisabled={!!preSelected}\n typeAheadAriaLabel={t(\"scopes\")}\n >\n {toSelectOptions(scopes)}\n </KeycloakSelect>\n )}\n />\n );\n};\n","import type PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport { DecisionStrategy } from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport {\n FormErrorText,\n HelpItem,\n SelectVariant,\n TextAreaControl,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n Radio,\n Switch,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { toUpperCase } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport type { NewPermissionParams } from \"../routes/NewPermission\";\nimport {\n PermissionDetailsParams,\n toPermissionDetails,\n} from \"../routes/PermissionDetails\";\nimport { ResourcesPolicySelect } from \"./ResourcesPolicySelect\";\nimport { ScopeSelect } from \"./ScopeSelect\";\n\ntype FormFields = PolicyRepresentation & {\n resourceType: string;\n};\n\nexport default function PermissionDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n\n const form = useForm<FormFields>({\n mode: \"onChange\",\n });\n const {\n control,\n reset,\n formState: { errors },\n handleSubmit,\n } = form;\n\n const navigate = useNavigate();\n const { id, realm, permissionType, permissionId, selectedId } = useParams<\n NewPermissionParams & PermissionDetailsParams\n >();\n\n const { addAlert, addError } = useAlerts();\n const [permission, setPermission] = useState<PolicyRepresentation>();\n const [applyToResourceTypeFlag, setApplyToResourceTypeFlag] = useState(false);\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n async () => {\n if (!permissionId) {\n return {};\n }\n const [permission, resources, policies, scopes] = await Promise.all([\n adminClient.clients.findOnePermission({\n id,\n type: permissionType,\n permissionId,\n }),\n adminClient.clients.getAssociatedResources({\n id,\n permissionId,\n }),\n adminClient.clients.getAssociatedPolicies({\n id,\n permissionId,\n }),\n adminClient.clients.getAssociatedScopes({\n id,\n permissionId,\n }),\n ]);\n\n if (!permission) {\n throw new Error(t(\"notFound\"));\n }\n\n return {\n permission,\n resources: resources.map((r) => r._id),\n policies: policies.map((p) => p.id!),\n scopes: scopes.map((s) => s.id!),\n };\n },\n ({ permission, resources, policies, scopes }) => {\n reset({ ...permission, resources, policies, scopes });\n if (permission && \"resourceType\" in permission) {\n setApplyToResourceTypeFlag(\n !!(permission as { resourceType: string }).resourceType,\n );\n }\n setPermission({ ...permission, resources, policies });\n },\n [],\n );\n\n const save = async (permission: PolicyRepresentation) => {\n try {\n if (permissionId) {\n await adminClient.clients.updatePermission(\n { id, type: permissionType, permissionId },\n permission,\n );\n } else {\n const result = await adminClient.clients.createPermission(\n { id, type: permissionType },\n permission,\n );\n setPermission(result);\n navigate(\n toPermissionDetails({\n realm,\n id,\n permissionType,\n permissionId: result.id!,\n }),\n );\n }\n addAlert(\n t((permissionId ? \"update\" : \"create\") + \"PermissionSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"permissionSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deletePermission\",\n messageKey: t(\"deletePermissionConfirm\", {\n permission: permission?.name,\n }),\n continueButtonVariant: ButtonVariant.danger,\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delPermission({\n id,\n type: permissionType,\n permissionId: permissionId,\n });\n addAlert(t(\"permissionDeletedSuccess\"), AlertVariant.success);\n navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"permissions\" }),\n );\n } catch (error) {\n addError(\"permissionDeletedError\", error);\n }\n },\n });\n\n const resourcesIds = useWatch({\n control,\n name: \"resources\",\n defaultValue: [],\n });\n\n if (!permission) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={\n permissionId\n ? permission.name!\n : `create${toUpperCase(permissionType)}BasedPermission`\n }\n dropdownItems={\n permissionId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n onSubmit={handleSubmit(save)}\n >\n <FormProvider {...form}>\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n labelIcon={t(\"permissionName\")}\n rules={{\n required: t(\"required\"),\n }}\n />\n <TextAreaControl\n name=\"description\"\n label={t(\"description\")}\n labelIcon={t(\"permissionDescription\")}\n rules={{\n maxLength: {\n value: 255,\n message: t(\"maxLength\", { length: 255 }),\n },\n }}\n />\n <FormGroup\n label={t(\"applyToResourceTypeFlag\")}\n fieldId=\"applyToResourceTypeFlag\"\n labelIcon={\n <HelpItem\n helpText={t(\"applyToResourceTypeFlagHelp\")}\n fieldLabelId=\"applyToResourceTypeFlag\"\n />\n }\n >\n <Switch\n id=\"applyToResourceTypeFlag\"\n name=\"applyToResourceTypeFlag\"\n label={t(\"on\")}\n labelOff={t(\"off\")}\n isChecked={applyToResourceTypeFlag}\n onChange={(_event, val) => setApplyToResourceTypeFlag(val)}\n aria-label={t(\"applyToResourceTypeFlag\")}\n />\n </FormGroup>\n {applyToResourceTypeFlag ? (\n <TextControl\n name=\"resourceType\"\n label={t(\"resourceType\")}\n labelIcon={t(\"resourceTypeHelp\")}\n rules={{\n required: {\n value: permissionType === \"scope\" ? true : false,\n message: t(\"required\"),\n },\n }}\n />\n ) : (\n <FormGroup\n label={t(\"resource\")}\n fieldId=\"resources\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionResources\")}\n fieldLabelId=\"resources\"\n />\n }\n isRequired={permissionType !== \"scope\"}\n >\n <ResourcesPolicySelect\n name=\"resources\"\n clientId={id}\n permissionId={permissionId}\n preSelected={\n permissionType === \"scope\" ? undefined : selectedId\n }\n variant={\n permissionType === \"scope\"\n ? SelectVariant.typeahead\n : SelectVariant.typeaheadMulti\n }\n isRequired={permissionType !== \"scope\"}\n />\n {errors.resources && <FormErrorText message={t(\"required\")} />}\n </FormGroup>\n )}\n {permissionType === \"scope\" && (\n <FormGroup\n label={t(\"authorizationScopes\")}\n fieldId=\"scopes\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionScopesHelp\")}\n fieldLabelId=\"scopesSelect\"\n />\n }\n isRequired\n >\n <ScopeSelect\n clientId={id}\n resourceId={resourcesIds?.[0]}\n preSelected={selectedId}\n />\n {errors.scopes && <FormErrorText message={t(\"required\")} />}\n </FormGroup>\n )}\n <FormGroup\n label={t(\"policies\")}\n fieldId=\"policies\"\n labelIcon={\n <HelpItem\n helpText={t(\"permissionPoliciesHelp\")}\n fieldLabelId=\"policies\"\n />\n }\n >\n <ResourcesPolicySelect\n name=\"policies\"\n clientId={id}\n permissionId={permissionId}\n />\n </FormGroup>\n <FormGroup\n label={t(\"decisionStrategy\")}\n labelIcon={\n <HelpItem\n helpText={t(\"permissionDecisionStrategyHelp\")}\n fieldLabelId=\"decisionStrategy\"\n />\n }\n fieldId=\"policyEnforcementMode\"\n hasNoPaddingTop\n >\n <Controller\n name=\"decisionStrategy\"\n data-testid=\"decisionStrategy\"\n defaultValue={DecisionStrategy.UNANIMOUS}\n control={control}\n render={({ field }) => (\n <>\n {Object.values(DecisionStrategy).map((strategy) => (\n <Radio\n id={strategy}\n key={strategy}\n data-testid={strategy}\n isChecked={field.value === strategy}\n isDisabled={isDisabled}\n name=\"decisionStrategies\"\n onChange={() => field.onChange(strategy)}\n label={t(`decisionStrategies.${strategy}`)}\n className=\"pf-v5-u-mb-md\"\n />\n ))}\n </>\n )}\n />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"permissions\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormProvider>\n </FormAccess>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopeSelect","clientId","resourceId","preSelected","adminClient","useAdminClient","t","useTranslation","control","getValues","setValue","errors","useFormContext","scopes","setScopes","useState","selectedScopes","setSelectedScopes","search","setSearch","open","setOpen","firstUpdate","useRef","values","toSelectOptions","scope","jsx","SelectOption","useFetch","s","Controller","value","field","KeycloakSelect","SelectVariant","val","filter","selectedValue","option","changedValue","p","PermissionDetails","form","useForm","reset","handleSubmit","navigate","useNavigate","id","realm","permissionType","permissionId","selectedId","useParams","addAlert","addError","useAlerts","permission","setPermission","applyToResourceTypeFlag","setApplyToResourceTypeFlag","hasAccess","useAccess","isDisabled","resources","policies","r","save","result","toPermissionDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","toAuthorizationTab","resourcesIds","useWatch","jsxs","Fragment","ViewHeader","toUpperCase","DropdownItem","PageSection","FormAccess","FormProvider","TextControl","TextAreaControl","FormGroup","HelpItem","Switch","_event","ResourcesPolicySelect","FormErrorText","DecisionStrategy","strategy","Radio","ActionGroup","Button","props","Link","KeycloakSpinner"],"mappings":"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"}
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import { jsx as e, jsxs as
|
2
|
-
import { u as T, b5 as
|
1
|
+
import { jsx as e, jsxs as v, Fragment as x } from "react/jsx-runtime";
|
2
|
+
import { u as T, b5 as z, n as H, bd as L, bf as w, bg as C, b6 as M, b7 as j, b8 as E, aP as G, B as K, b as U, b9 as W, ba as Y, aY as J, bm as Q, e as D, bb as F, V as X, aG as Z, P as $, F as ee, c as ae, q as g, bn as se, bo as re, bp as te, A as ne, d as N, h as oe, aO as le, bq as ie, aN as ce } from "./index-BIuvk4Xf.js";
|
3
3
|
import { useState as m } from "react";
|
4
4
|
import { useTranslation as V } from "react-i18next";
|
5
5
|
import { useNavigate as ue, Link as de } from "react-router-dom";
|
6
6
|
const me = ({ clientId: l }) => {
|
7
|
-
const { adminClient: a } = T(), { t: i } = V(), { control: y } =
|
7
|
+
const { adminClient: a } = T(), { t: i } = V(), { control: y } = z(), [A, I] = m(!1), [u, S] = m(), [p, b] = m("");
|
8
8
|
H(
|
9
9
|
() => {
|
10
10
|
const o = {
|
@@ -16,15 +16,15 @@ const me = ({ clientId: l }) => {
|
|
16
16
|
};
|
17
17
|
return a.clients.listAllScopes(o);
|
18
18
|
},
|
19
|
-
|
19
|
+
S,
|
20
20
|
[p]
|
21
21
|
);
|
22
|
-
const h = (o) => o.map((s) => /* @__PURE__ */ e(
|
22
|
+
const h = (o) => o.map((s) => /* @__PURE__ */ e(G, { value: s, children: s.name }, s.id));
|
23
23
|
return u ? /* @__PURE__ */ e(
|
24
|
-
|
24
|
+
w,
|
25
25
|
{
|
26
26
|
label: i("authorizationScopes"),
|
27
|
-
labelIcon: /* @__PURE__ */ e(
|
27
|
+
labelIcon: /* @__PURE__ */ e(C, { helpText: i("clientScopesHelp"), fieldLabelId: "scopes" }),
|
28
28
|
fieldId: "scopes",
|
29
29
|
children: /* @__PURE__ */ e(
|
30
30
|
M,
|
@@ -33,16 +33,16 @@ const me = ({ clientId: l }) => {
|
|
33
33
|
defaultValue: [],
|
34
34
|
control: y,
|
35
35
|
render: ({ field: o }) => /* @__PURE__ */ e(
|
36
|
-
|
36
|
+
j,
|
37
37
|
{
|
38
38
|
toggleId: "scopes",
|
39
|
-
variant:
|
39
|
+
variant: E.typeaheadMulti,
|
40
40
|
chipGroupProps: {
|
41
41
|
numChips: 3,
|
42
42
|
expandedText: i("hide"),
|
43
43
|
collapsedText: i("showRemaining")
|
44
44
|
},
|
45
|
-
onToggle: (s) =>
|
45
|
+
onToggle: (s) => I(s),
|
46
46
|
isOpen: A,
|
47
47
|
selections: o.value.map((s) => s.name),
|
48
48
|
onFilter: (s) => (b(s), h(u)),
|
@@ -64,12 +64,12 @@ const me = ({ clientId: l }) => {
|
|
64
64
|
}
|
65
65
|
) : /* @__PURE__ */ e(L, {});
|
66
66
|
};
|
67
|
-
function
|
68
|
-
const { adminClient: l } = T(), { t: a } = V(), [i, y] = m(), [A,
|
67
|
+
function Ie() {
|
68
|
+
const { adminClient: l } = T(), { t: a } = V(), [i, y] = m(), [A, I] = m(), [u, S] = m(), { addAlert: p, addError: b } = K(), h = U({
|
69
69
|
mode: "onChange"
|
70
|
-
}), { setValue: o, handleSubmit: s } = h, { id: r, resourceId: t, realm: c } =
|
70
|
+
}), { setValue: o, handleSubmit: s } = h, { id: r, resourceId: t, realm: c } = W(), P = ue(), B = (n = {}) => {
|
71
71
|
ce(n, o);
|
72
|
-
}, { hasAccess:
|
72
|
+
}, { hasAccess: O } = Y(), R = !O("manage-authorization");
|
73
73
|
H(
|
74
74
|
() => Promise.all([
|
75
75
|
l.clients.findOne({ id: r }),
|
@@ -79,11 +79,11 @@ function ve() {
|
|
79
79
|
([n, d, f]) => {
|
80
80
|
if (!n)
|
81
81
|
throw new Error(a("notFound"));
|
82
|
-
y(n),
|
82
|
+
y(n), S(f), I(d), B(d);
|
83
83
|
},
|
84
84
|
[]
|
85
85
|
);
|
86
|
-
const
|
86
|
+
const _ = async (n) => {
|
87
87
|
const d = le(n);
|
88
88
|
try {
|
89
89
|
if (t)
|
@@ -93,7 +93,7 @@ function ve() {
|
|
93
93
|
{ id: r },
|
94
94
|
d
|
95
95
|
);
|
96
|
-
|
96
|
+
I(d), P(ie({ realm: c, id: r, resourceId: f._id }));
|
97
97
|
}
|
98
98
|
p(
|
99
99
|
a((t ? "update" : "create") + "ResourceSuccess"),
|
@@ -102,12 +102,12 @@ function ve() {
|
|
102
102
|
} catch (f) {
|
103
103
|
b("resourceSaveError", f);
|
104
104
|
}
|
105
|
-
}, [
|
105
|
+
}, [k, q] = J({
|
106
106
|
titleKey: "deleteResource",
|
107
|
-
children: /* @__PURE__ */
|
107
|
+
children: /* @__PURE__ */ v(x, { children: [
|
108
108
|
a("deleteResourceConfirm"),
|
109
109
|
u?.length !== 0 && /* @__PURE__ */ e(
|
110
|
-
|
110
|
+
Q,
|
111
111
|
{
|
112
112
|
variant: "warning",
|
113
113
|
isInline: !0,
|
@@ -130,19 +130,19 @@ function ve() {
|
|
130
130
|
}
|
131
131
|
}
|
132
132
|
});
|
133
|
-
return i ? /* @__PURE__ */
|
134
|
-
/* @__PURE__ */ e(
|
133
|
+
return i ? /* @__PURE__ */ v(x, { children: [
|
134
|
+
/* @__PURE__ */ e(q, {}),
|
135
135
|
/* @__PURE__ */ e(
|
136
|
-
|
136
|
+
X,
|
137
137
|
{
|
138
138
|
titleKey: t ? A?.name : "createResource",
|
139
139
|
dropdownItems: t ? [
|
140
140
|
/* @__PURE__ */ e(
|
141
|
-
|
141
|
+
Z,
|
142
142
|
{
|
143
143
|
"data-testid": "delete-resource",
|
144
144
|
isDisabled: R,
|
145
|
-
onClick: () =>
|
145
|
+
onClick: () => k(),
|
146
146
|
children: a("delete")
|
147
147
|
},
|
148
148
|
"delete"
|
@@ -150,13 +150,13 @@ function ve() {
|
|
150
150
|
] : void 0
|
151
151
|
}
|
152
152
|
),
|
153
|
-
/* @__PURE__ */ e(
|
153
|
+
/* @__PURE__ */ e($, { variant: "light", children: /* @__PURE__ */ e(ee, { ...h, children: /* @__PURE__ */ v(
|
154
154
|
ae,
|
155
155
|
{
|
156
156
|
isHorizontal: !0,
|
157
157
|
role: "manage-authorization",
|
158
158
|
className: "keycloak__resource-details__form",
|
159
|
-
onSubmit: s(
|
159
|
+
onSubmit: s(_),
|
160
160
|
children: [
|
161
161
|
/* @__PURE__ */ e(
|
162
162
|
g,
|
@@ -195,11 +195,11 @@ function ve() {
|
|
195
195
|
}
|
196
196
|
),
|
197
197
|
/* @__PURE__ */ e(
|
198
|
-
|
198
|
+
w,
|
199
199
|
{
|
200
200
|
label: a("uris"),
|
201
201
|
fieldId: "uris",
|
202
|
-
labelIcon: /* @__PURE__ */ e(
|
202
|
+
labelIcon: /* @__PURE__ */ e(C, { helpText: a("urisHelp"), fieldLabelId: "uris" }),
|
203
203
|
children: /* @__PURE__ */ e(
|
204
204
|
se,
|
205
205
|
{
|
@@ -230,12 +230,12 @@ function ve() {
|
|
230
230
|
}
|
231
231
|
),
|
232
232
|
/* @__PURE__ */ e(
|
233
|
-
|
233
|
+
w,
|
234
234
|
{
|
235
235
|
hasNoPaddingTop: !0,
|
236
236
|
label: a("resourceAttribute"),
|
237
237
|
labelIcon: /* @__PURE__ */ e(
|
238
|
-
|
238
|
+
C,
|
239
239
|
{
|
240
240
|
helpText: a("resourceAttributeHelp"),
|
241
241
|
fieldLabelId: "resourceAttribute"
|
@@ -245,7 +245,7 @@ function ve() {
|
|
245
245
|
children: /* @__PURE__ */ e(te, { name: "attributes", isDisabled: R })
|
246
246
|
}
|
247
247
|
),
|
248
|
-
/* @__PURE__ */ e(ne, { children: /* @__PURE__ */
|
248
|
+
/* @__PURE__ */ e(ne, { children: /* @__PURE__ */ v("div", { className: "pf-v5-u-mt-md", children: [
|
249
249
|
/* @__PURE__ */ e(
|
250
250
|
N,
|
251
251
|
{
|
@@ -281,6 +281,6 @@ function ve() {
|
|
281
281
|
] }) : /* @__PURE__ */ e(L, {});
|
282
282
|
}
|
283
283
|
export {
|
284
|
-
|
284
|
+
Ie as default
|
285
285
|
};
|
286
|
-
//# sourceMappingURL=ResourceDetails-
|
286
|
+
//# sourceMappingURL=ResourceDetails-Cfnqq1uy.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ResourceDetails-BoQE7rAq.js","sources":["../src/clients/authorization/ScopePicker.tsx","../src/clients/authorization/ResourceDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { FormGroup, SelectOption } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\n\ntype Scope = {\n id: string;\n name: string;\n};\n\nexport const ScopePicker = ({ clientId }: { clientId: string }) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { control } = useFormContext();\n\n const [open, setOpen] = useState(false);\n const [scopes, setScopes] = useState<ScopeRepresentation[]>();\n const [search, setSearch] = useState(\"\");\n\n useFetch(\n () => {\n const params = {\n id: clientId,\n first: 0,\n max: 20,\n deep: false,\n name: search,\n };\n return adminClient.clients.listAllScopes(params);\n },\n setScopes,\n [search],\n );\n\n const renderScopes = (scopes: ScopeRepresentation[]) =>\n scopes.map((option) => (\n <SelectOption key={option.id} value={option}>\n {option.name}\n </SelectOption>\n ));\n\n if (!scopes) return <KeycloakSpinner />;\n return (\n <FormGroup\n label={t(\"authorizationScopes\")}\n labelIcon={\n <HelpItem helpText={t(\"clientScopesHelp\")} fieldLabelId=\"scopes\" />\n }\n fieldId=\"scopes\"\n >\n <Controller\n name=\"scopes\"\n defaultValue={[]}\n control={control}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n chipGroupProps={{\n numChips: 3,\n expandedText: t(\"hide\"),\n collapsedText: t(\"showRemaining\"),\n }}\n onToggle={(val) => setOpen(val)}\n isOpen={open}\n selections={field.value.map((o: Scope) => o.name)}\n onFilter={(value) => {\n setSearch(value);\n return renderScopes(scopes);\n }}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedValue\n : (selectedValue as Scope).name;\n const changedValue = field.value.find(\n (o: Scope) => o.name === option,\n )\n ? field.value.filter((item: Scope) => item.name !== option)\n : [...field.value, selectedValue];\n field.onChange(changedValue);\n }}\n onClear={() => {\n setSearch(\"\");\n field.onChange([]);\n }}\n typeAheadAriaLabel={t(\"authorizationScopes\")}\n >\n {renderScopes(scopes)}\n </KeycloakSelect>\n )}\n />\n </FormGroup>\n );\n};\n","import type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type ResourceRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceRepresentation\";\nimport type ResourceServerRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceServerRepresentation\";\nimport {\n HelpItem,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { DefaultSwitchControl } from \"../../components/SwitchControl\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeyValueInput } from \"../../components/key-value-form/KeyValueInput\";\nimport type { KeyValueType } from \"../../components/key-value-form/key-value-convert\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { MultiLineInput } from \"../../components/multi-line-input/MultiLineInput\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { convertFormValuesToObject, convertToFormValues } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport { ResourceDetailsParams, toResourceDetails } from \"../routes/Resource\";\nimport { ScopePicker } from \"./ScopePicker\";\nimport \"./resource-details.css\";\n\ntype SubmittedResource = Omit<\n ResourceRepresentation,\n \"attributes\" | \"scopes\"\n> & {\n attributes: KeyValueType[];\n};\n\nexport default function ResourceDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const [client, setClient] = useState<ClientRepresentation>();\n const [resource, setResource] = useState<ResourceRepresentation>();\n\n const [permissions, setPermission] =\n useState<ResourceServerRepresentation[]>();\n\n const { addAlert, addError } = useAlerts();\n const form = useForm<SubmittedResource>({\n mode: \"onChange\",\n });\n const { setValue, handleSubmit } = form;\n\n const { id, resourceId, realm } = useParams<ResourceDetailsParams>();\n const navigate = useNavigate();\n\n const setupForm = (resource: ResourceRepresentation = {}) => {\n convertToFormValues(resource, setValue);\n };\n\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n () =>\n Promise.all([\n adminClient.clients.findOne({ id }),\n resourceId\n ? adminClient.clients.getResource({ id, resourceId })\n : Promise.resolve(undefined),\n resourceId\n ? adminClient.clients.listPermissionsByResource({ id, resourceId })\n : Promise.resolve(undefined),\n ]),\n ([client, resource, permissions]) => {\n if (!client) {\n throw new Error(t(\"notFound\"));\n }\n setClient(client);\n setPermission(permissions);\n setResource(resource);\n setupForm(resource);\n },\n [],\n );\n\n const submit = async (submitted: SubmittedResource) => {\n const resource = convertFormValuesToObject<\n SubmittedResource,\n ResourceRepresentation\n >(submitted);\n\n try {\n if (resourceId) {\n await adminClient.clients.updateResource({ id, resourceId }, resource);\n } else {\n const result = await adminClient.clients.createResource(\n { id },\n resource,\n );\n setResource(resource);\n navigate(toResourceDetails({ realm, id, resourceId: result._id! }));\n }\n addAlert(\n t((resourceId ? \"update\" : \"create\") + \"ResourceSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"resourceSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deleteResource\",\n children: (\n <>\n {t(\"deleteResourceConfirm\")}\n {permissions?.length !== 0 && (\n <Alert\n variant=\"warning\"\n isInline\n isPlain\n title={t(\"deleteResourceWarning\")}\n className=\"pf-v5-u-pt-lg\"\n >\n <p className=\"pf-v5-u-pt-xs\">\n {permissions?.map((permission) => (\n <strong key={permission.id} className=\"pf-v5-u-pr-md\">\n {permission.name}\n </strong>\n ))}\n </p>\n </Alert>\n )}\n </>\n ),\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delResource({\n id,\n resourceId: resourceId!,\n });\n addAlert(t(\"resourceDeletedSuccess\"), AlertVariant.success);\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"resources\" }));\n } catch (error) {\n addError(\"resourceDeletedError\", error);\n }\n },\n });\n\n if (!client) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={resourceId ? resource?.name! : \"createResource\"}\n dropdownItems={\n resourceId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n className=\"keycloak__resource-details__form\"\n onSubmit={handleSubmit(submit)}\n >\n <TextControl\n name={resourceId ? \"owner.name\" : \"\"}\n label={t(\"owner\")}\n labelIcon={t(\"ownerHelp\")}\n defaultValue={client.clientId}\n readOnly\n />\n <TextControl\n name={\"name\"}\n label={t(\"name\")}\n labelIcon={t(\"resourceNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"displayNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"type\"\n label={t(\"type\")}\n labelIcon={t(\"resourceDetailsTypeHelp\")}\n />\n <FormGroup\n label={t(\"uris\")}\n fieldId=\"uris\"\n labelIcon={\n <HelpItem helpText={t(\"urisHelp\")} fieldLabelId=\"uris\" />\n }\n >\n <MultiLineInput\n name=\"uris\"\n type=\"url\"\n aria-label={t(\"uris\")}\n addButtonLabel=\"addUri\"\n />\n </FormGroup>\n <ScopePicker clientId={id} />\n <TextControl\n name=\"icon_uri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n type=\"url\"\n />\n <DefaultSwitchControl\n name=\"ownerManagedAccess\"\n label={t(\"ownerManagedAccess\")}\n labelIcon={t(\"ownerManagedAccessHelp\")}\n />\n <FormGroup\n hasNoPaddingTop\n label={t(\"resourceAttribute\")}\n labelIcon={\n <HelpItem\n helpText={t(\"resourceAttributeHelp\")}\n fieldLabelId=\"resourceAttribute\"\n />\n }\n fieldId=\"resourceAttribute\"\n >\n <KeyValueInput name=\"attributes\" isDisabled={isDisabled} />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"resources\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopePicker","clientId","adminClient","useAdminClient","t","useTranslation","control","useFormContext","open","setOpen","useState","scopes","setScopes","search","setSearch","useFetch","params","renderScopes","option","jsx","SelectOption","FormGroup","HelpItem","Controller","field","KeycloakSelect","SelectVariant","val","o","value","selectedValue","changedValue","item","KeycloakSpinner","ResourceDetails","client","setClient","resource","setResource","permissions","setPermission","addAlert","addError","useAlerts","form","useForm","setValue","handleSubmit","id","resourceId","realm","useParams","navigate","useNavigate","setupForm","convertToFormValues","hasAccess","useAccess","isDisabled","submit","submitted","convertFormValuesToObject","result","toResourceDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","jsxs","Fragment","Alert","permission","toAuthorizationTab","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","MultiLineInput","DefaultSwitchControl","KeyValueInput","ActionGroup","Button","ButtonVariant","props","Link"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ResourceDetails-Cfnqq1uy.js","sources":["../src/clients/authorization/ScopePicker.tsx","../src/clients/authorization/ResourceDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { FormGroup, SelectOption } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\n\ntype Scope = {\n id: string;\n name: string;\n};\n\nexport const ScopePicker = ({ clientId }: { clientId: string }) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { control } = useFormContext();\n\n const [open, setOpen] = useState(false);\n const [scopes, setScopes] = useState<ScopeRepresentation[]>();\n const [search, setSearch] = useState(\"\");\n\n useFetch(\n () => {\n const params = {\n id: clientId,\n first: 0,\n max: 20,\n deep: false,\n name: search,\n };\n return adminClient.clients.listAllScopes(params);\n },\n setScopes,\n [search],\n );\n\n const renderScopes = (scopes: ScopeRepresentation[]) =>\n scopes.map((option) => (\n <SelectOption key={option.id} value={option}>\n {option.name}\n </SelectOption>\n ));\n\n if (!scopes) return <KeycloakSpinner />;\n return (\n <FormGroup\n label={t(\"authorizationScopes\")}\n labelIcon={\n <HelpItem helpText={t(\"clientScopesHelp\")} fieldLabelId=\"scopes\" />\n }\n fieldId=\"scopes\"\n >\n <Controller\n name=\"scopes\"\n defaultValue={[]}\n control={control}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n chipGroupProps={{\n numChips: 3,\n expandedText: t(\"hide\"),\n collapsedText: t(\"showRemaining\"),\n }}\n onToggle={(val) => setOpen(val)}\n isOpen={open}\n selections={field.value.map((o: Scope) => o.name)}\n onFilter={(value) => {\n setSearch(value);\n return renderScopes(scopes);\n }}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedValue\n : (selectedValue as Scope).name;\n const changedValue = field.value.find(\n (o: Scope) => o.name === option,\n )\n ? field.value.filter((item: Scope) => item.name !== option)\n : [...field.value, selectedValue];\n field.onChange(changedValue);\n }}\n onClear={() => {\n setSearch(\"\");\n field.onChange([]);\n }}\n typeAheadAriaLabel={t(\"authorizationScopes\")}\n >\n {renderScopes(scopes)}\n </KeycloakSelect>\n )}\n />\n </FormGroup>\n );\n};\n","import type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type ResourceRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceRepresentation\";\nimport type ResourceServerRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceServerRepresentation\";\nimport {\n HelpItem,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { DefaultSwitchControl } from \"../../components/SwitchControl\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeyValueInput } from \"../../components/key-value-form/KeyValueInput\";\nimport type { KeyValueType } from \"../../components/key-value-form/key-value-convert\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { MultiLineInput } from \"../../components/multi-line-input/MultiLineInput\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { convertFormValuesToObject, convertToFormValues } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport { ResourceDetailsParams, toResourceDetails } from \"../routes/Resource\";\nimport { ScopePicker } from \"./ScopePicker\";\nimport \"./resource-details.css\";\n\ntype SubmittedResource = Omit<\n ResourceRepresentation,\n \"attributes\" | \"scopes\"\n> & {\n attributes: KeyValueType[];\n};\n\nexport default function ResourceDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const [client, setClient] = useState<ClientRepresentation>();\n const [resource, setResource] = useState<ResourceRepresentation>();\n\n const [permissions, setPermission] =\n useState<ResourceServerRepresentation[]>();\n\n const { addAlert, addError } = useAlerts();\n const form = useForm<SubmittedResource>({\n mode: \"onChange\",\n });\n const { setValue, handleSubmit } = form;\n\n const { id, resourceId, realm } = useParams<ResourceDetailsParams>();\n const navigate = useNavigate();\n\n const setupForm = (resource: ResourceRepresentation = {}) => {\n convertToFormValues(resource, setValue);\n };\n\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n () =>\n Promise.all([\n adminClient.clients.findOne({ id }),\n resourceId\n ? adminClient.clients.getResource({ id, resourceId })\n : Promise.resolve(undefined),\n resourceId\n ? adminClient.clients.listPermissionsByResource({ id, resourceId })\n : Promise.resolve(undefined),\n ]),\n ([client, resource, permissions]) => {\n if (!client) {\n throw new Error(t(\"notFound\"));\n }\n setClient(client);\n setPermission(permissions);\n setResource(resource);\n setupForm(resource);\n },\n [],\n );\n\n const submit = async (submitted: SubmittedResource) => {\n const resource = convertFormValuesToObject<\n SubmittedResource,\n ResourceRepresentation\n >(submitted);\n\n try {\n if (resourceId) {\n await adminClient.clients.updateResource({ id, resourceId }, resource);\n } else {\n const result = await adminClient.clients.createResource(\n { id },\n resource,\n );\n setResource(resource);\n navigate(toResourceDetails({ realm, id, resourceId: result._id! }));\n }\n addAlert(\n t((resourceId ? \"update\" : \"create\") + \"ResourceSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"resourceSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deleteResource\",\n children: (\n <>\n {t(\"deleteResourceConfirm\")}\n {permissions?.length !== 0 && (\n <Alert\n variant=\"warning\"\n isInline\n isPlain\n title={t(\"deleteResourceWarning\")}\n className=\"pf-v5-u-pt-lg\"\n >\n <p className=\"pf-v5-u-pt-xs\">\n {permissions?.map((permission) => (\n <strong key={permission.id} className=\"pf-v5-u-pr-md\">\n {permission.name}\n </strong>\n ))}\n </p>\n </Alert>\n )}\n </>\n ),\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delResource({\n id,\n resourceId: resourceId!,\n });\n addAlert(t(\"resourceDeletedSuccess\"), AlertVariant.success);\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"resources\" }));\n } catch (error) {\n addError(\"resourceDeletedError\", error);\n }\n },\n });\n\n if (!client) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={resourceId ? resource?.name! : \"createResource\"}\n dropdownItems={\n resourceId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n className=\"keycloak__resource-details__form\"\n onSubmit={handleSubmit(submit)}\n >\n <TextControl\n name={resourceId ? \"owner.name\" : \"\"}\n label={t(\"owner\")}\n labelIcon={t(\"ownerHelp\")}\n defaultValue={client.clientId}\n readOnly\n />\n <TextControl\n name={\"name\"}\n label={t(\"name\")}\n labelIcon={t(\"resourceNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"displayNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"type\"\n label={t(\"type\")}\n labelIcon={t(\"resourceDetailsTypeHelp\")}\n />\n <FormGroup\n label={t(\"uris\")}\n fieldId=\"uris\"\n labelIcon={\n <HelpItem helpText={t(\"urisHelp\")} fieldLabelId=\"uris\" />\n }\n >\n <MultiLineInput\n name=\"uris\"\n type=\"url\"\n aria-label={t(\"uris\")}\n addButtonLabel=\"addUri\"\n />\n </FormGroup>\n <ScopePicker clientId={id} />\n <TextControl\n name=\"icon_uri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n type=\"url\"\n />\n <DefaultSwitchControl\n name=\"ownerManagedAccess\"\n label={t(\"ownerManagedAccess\")}\n labelIcon={t(\"ownerManagedAccessHelp\")}\n />\n <FormGroup\n hasNoPaddingTop\n label={t(\"resourceAttribute\")}\n labelIcon={\n <HelpItem\n helpText={t(\"resourceAttributeHelp\")}\n fieldLabelId=\"resourceAttribute\"\n />\n }\n fieldId=\"resourceAttribute\"\n >\n <KeyValueInput name=\"attributes\" isDisabled={isDisabled} />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"resources\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopePicker","clientId","adminClient","useAdminClient","t","useTranslation","control","useFormContext","open","setOpen","useState","scopes","setScopes","search","setSearch","useFetch","params","renderScopes","option","jsx","SelectOption","FormGroup","HelpItem","Controller","field","KeycloakSelect","SelectVariant","val","o","value","selectedValue","changedValue","item","KeycloakSpinner","ResourceDetails","client","setClient","resource","setResource","permissions","setPermission","addAlert","addError","useAlerts","form","useForm","setValue","handleSubmit","id","resourceId","realm","useParams","navigate","useNavigate","setupForm","convertToFormValues","hasAccess","useAccess","isDisabled","submit","submitted","convertFormValuesToObject","result","toResourceDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","jsxs","Fragment","Alert","permission","toAuthorizationTab","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","MultiLineInput","DefaultSwitchControl","KeyValueInput","ActionGroup","Button","ButtonVariant","props","Link"],"mappings":"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"}
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import { jsxs as c, Fragment as D, jsx as t } from "react/jsx-runtime";
|
2
|
-
import { u as w, b9 as N,
|
3
|
-
import { useState as
|
2
|
+
import { u as w, b9 as N, B as z, aH as F, b as H, n as k, br as C, bb as l, V as U, aG as B, P, F as V, c as j, q as d, A as q, d as m, h as x, e as E } from "./index-BIuvk4Xf.js";
|
3
|
+
import { useState as T } from "react";
|
4
4
|
import { useTranslation as G } from "react-i18next";
|
5
|
-
import { useNavigate as
|
6
|
-
function
|
7
|
-
const { adminClient: r } = w(), { t: e } = G(), { id: i, scopeId: o, realm: s } = N(), p =
|
5
|
+
import { useNavigate as K, Link as L } from "react-router-dom";
|
6
|
+
function W() {
|
7
|
+
const { adminClient: r } = w(), { t: e } = G(), { id: i, scopeId: o, realm: s } = N(), p = K(), { addAlert: S, addError: f } = z(), [v, u] = F(), [n, h] = T(), b = H({
|
8
8
|
mode: "onChange"
|
9
9
|
}), { reset: g, handleSubmit: y } = b;
|
10
|
-
|
10
|
+
k(
|
11
11
|
async () => {
|
12
12
|
if (o) {
|
13
13
|
const a = await r.clients.getAuthorizationScope({
|
@@ -38,18 +38,18 @@ function R() {
|
|
38
38
|
}
|
39
39
|
), p(l({ realm: s, clientId: i, tab: "scopes" }))), S(
|
40
40
|
e((o ? "update" : "create") + "ScopeSuccess"),
|
41
|
-
|
41
|
+
E.success
|
42
42
|
);
|
43
43
|
} catch (I) {
|
44
|
-
|
44
|
+
f("scopeSaveError", I);
|
45
45
|
}
|
46
46
|
};
|
47
47
|
return /* @__PURE__ */ c(D, { children: [
|
48
48
|
/* @__PURE__ */ t(
|
49
|
-
|
49
|
+
C,
|
50
50
|
{
|
51
51
|
clientId: i,
|
52
|
-
open:
|
52
|
+
open: v,
|
53
53
|
toggleDialog: u,
|
54
54
|
selectedScope: n,
|
55
55
|
refresh: () => p(l({ realm: s, clientId: i, tab: "scopes" }))
|
@@ -61,7 +61,7 @@ function R() {
|
|
61
61
|
titleKey: o ? n?.name : e("createAuthorizationScope"),
|
62
62
|
dropdownItems: o ? [
|
63
63
|
/* @__PURE__ */ t(
|
64
|
-
|
64
|
+
B,
|
65
65
|
{
|
66
66
|
"data-testid": "delete-resource",
|
67
67
|
onClick: () => u(),
|
@@ -72,8 +72,8 @@ function R() {
|
|
72
72
|
] : void 0
|
73
73
|
}
|
74
74
|
),
|
75
|
-
/* @__PURE__ */ t(
|
76
|
-
|
75
|
+
/* @__PURE__ */ t(P, { variant: "light", children: /* @__PURE__ */ t(V, { ...b, children: /* @__PURE__ */ c(
|
76
|
+
j,
|
77
77
|
{
|
78
78
|
isHorizontal: !0,
|
79
79
|
role: "manage-authorization",
|
@@ -104,11 +104,11 @@ function R() {
|
|
104
104
|
labelIcon: e("iconUriHelp")
|
105
105
|
}
|
106
106
|
),
|
107
|
-
/* @__PURE__ */ t(
|
107
|
+
/* @__PURE__ */ t(q, { children: /* @__PURE__ */ c("div", { className: "pf-v5-u-mt-md", children: [
|
108
108
|
/* @__PURE__ */ t(
|
109
109
|
m,
|
110
110
|
{
|
111
|
-
variant:
|
111
|
+
variant: x.primary,
|
112
112
|
type: "submit",
|
113
113
|
"data-testid": "save",
|
114
114
|
children: e("save")
|
@@ -128,7 +128,7 @@ function R() {
|
|
128
128
|
variant: "link",
|
129
129
|
"data-testid": "cancel",
|
130
130
|
component: (a) => /* @__PURE__ */ t(
|
131
|
-
|
131
|
+
L,
|
132
132
|
{
|
133
133
|
...a,
|
134
134
|
to: l({
|
@@ -148,6 +148,6 @@ function R() {
|
|
148
148
|
] });
|
149
149
|
}
|
150
150
|
export {
|
151
|
-
|
151
|
+
W as default
|
152
152
|
};
|
153
|
-
//# sourceMappingURL=ScopeDetails-
|
153
|
+
//# sourceMappingURL=ScopeDetails-_i-3BNjz.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ScopeDetails-
|
1
|
+
{"version":3,"file":"ScopeDetails-_i-3BNjz.js","sources":["../src/clients/authorization/ScopeDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport { TextControl, useAlerts, useFetch } from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useParams } from \"../../utils/useParams\";\nimport useToggle from \"../../utils/useToggle\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport type { ScopeDetailsParams } from \"../routes/Scope\";\nimport { DeleteScopeDialog } from \"./DeleteScopeDialog\";\n\ntype FormFields = Omit<ScopeRepresentation, \"resources\">;\n\nexport default function ScopeDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { id, scopeId, realm } = useParams<ScopeDetailsParams>();\n const navigate = useNavigate();\n const { addAlert, addError } = useAlerts();\n const [deleteDialog, toggleDeleteDialog] = useToggle();\n const [scope, setScope] = useState<ScopeRepresentation>();\n const form = useForm<FormFields>({\n mode: \"onChange\",\n });\n const { reset, handleSubmit } = form;\n\n useFetch(\n async () => {\n if (scopeId) {\n const scope = await adminClient.clients.getAuthorizationScope({\n id,\n scopeId,\n });\n if (!scope) {\n throw new Error(t(\"notFound\"));\n }\n return scope;\n }\n },\n (scope) => {\n setScope(scope);\n reset({ ...scope });\n },\n [],\n );\n\n const onSubmit = async (scope: ScopeRepresentation) => {\n try {\n if (scopeId) {\n await adminClient.clients.updateAuthorizationScope(\n { id, scopeId },\n scope,\n );\n setScope(scope);\n } else {\n await adminClient.clients.createAuthorizationScope(\n { id },\n {\n name: scope.name!,\n displayName: scope.displayName,\n iconUri: scope.iconUri,\n },\n );\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }));\n }\n addAlert(\n t((scopeId ? \"update\" : \"create\") + \"ScopeSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"scopeSaveError\", error);\n }\n };\n\n return (\n <>\n <DeleteScopeDialog\n clientId={id}\n open={deleteDialog}\n toggleDialog={toggleDeleteDialog}\n selectedScope={scope}\n refresh={() =>\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }))\n }\n />\n <ViewHeader\n titleKey={scopeId ? scope?.name! : t(\"createAuthorizationScope\")}\n dropdownItems={\n scopeId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n labelIcon={t(\"scopeNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"scopeDisplayNameHelp\")}\n />\n <TextControl\n name=\"iconUri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n />\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n {!scope ? (\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"scopes\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n ) : (\n <Button\n variant=\"link\"\n data-testid=\"revert\"\n onClick={() => reset({ ...scope })}\n >\n {t(\"revert\")}\n </Button>\n )}\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopeDetails","adminClient","useAdminClient","t","useTranslation","id","scopeId","realm","useParams","navigate","useNavigate","addAlert","addError","useAlerts","deleteDialog","toggleDeleteDialog","useToggle","scope","setScope","useState","form","useForm","reset","handleSubmit","useFetch","onSubmit","toAuthorizationTab","AlertVariant","error","jsxs","Fragment","jsx","DeleteScopeDialog","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","ActionGroup","Button","ButtonVariant","props","Link"],"mappings":"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"}
|
package/lib/admin-client.d.ts
CHANGED
@@ -5,6 +5,6 @@ export type AdminClientProps = {
|
|
5
5
|
keycloak: Keycloak;
|
6
6
|
adminClient: KeycloakAdminClient;
|
7
7
|
};
|
8
|
-
export declare const AdminClientContext: import('
|
8
|
+
export declare const AdminClientContext: import('libs/ui-shared/dist/utils/createNamedContext').NamedContext<AdminClientProps | undefined>;
|
9
9
|
export declare const useAdminClient: () => AdminClientProps;
|
10
10
|
export declare function initAdminClient(keycloak: Keycloak, environment: Environment): Promise<KeycloakAdminClient>;
|