@keycloak/keycloak-admin-ui 26.4.7 → 26.5.1

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.
Files changed (69) hide show
  1. package/lib/.vite/manifest.json +53 -43
  2. package/lib/AddJWTAuthorizationGrant-CmYIQF47.js +69 -0
  3. package/lib/AddJWTAuthorizationGrant-CmYIQF47.js.map +1 -0
  4. package/lib/{AddKubernetesConnect-TKm82MxO.js → AddKubernetesConnect--zBiT7am.js} +4 -4
  5. package/lib/{AddKubernetesConnect-TKm82MxO.js.map → AddKubernetesConnect--zBiT7am.js.map} +1 -1
  6. package/lib/{AddOAuth2-Bg_V5CMD.js → AddOAuth2-BLRNGQKN.js} +15 -15
  7. package/lib/{AddOAuth2-Bg_V5CMD.js.map → AddOAuth2-BLRNGQKN.js.map} +1 -1
  8. package/lib/{AddSpiffeConnect-gH8LxYcP.js → AddSpiffeConnect-NfHagx80.js} +5 -5
  9. package/lib/{AddSpiffeConnect-gH8LxYcP.js.map → AddSpiffeConnect-NfHagx80.js.map} +1 -1
  10. package/lib/{CreateFlow-6M8Wg_2H.js → CreateFlow-Bf02T80Q.js} +2 -2
  11. package/lib/{CreateFlow-6M8Wg_2H.js.map → CreateFlow-Bf02T80Q.js.map} +1 -1
  12. package/lib/DetailOrganization-DWvk7gJ9.js +194 -0
  13. package/lib/DetailOrganization-DWvk7gJ9.js.map +1 -0
  14. package/lib/{ExecutorForm-BYCH7c3u.js → ExecutorForm-DHTRUoB1.js} +2 -2
  15. package/lib/{ExecutorForm-BYCH7c3u.js.map → ExecutorForm-DHTRUoB1.js.map} +1 -1
  16. package/lib/{FlowDetails-Dkl-8lLX.js → FlowDetails--N_U426z.js} +1021 -1048
  17. package/lib/{FlowDetails-Dkl-8lLX.js.map → FlowDetails--N_U426z.js.map} +1 -1
  18. package/lib/{NewOrganization-CBaP7xLv.js → NewOrganization-7we_ianL.js} +12 -12
  19. package/lib/{NewOrganization-CBaP7xLv.js.map → NewOrganization-7we_ianL.js.map} +1 -1
  20. package/lib/{PermissionConfigurationDetails-C0sgaW6Y.js → PermissionConfigurationDetails-u9MRYXxC.js} +18 -18
  21. package/lib/{PermissionConfigurationDetails-C0sgaW6Y.js.map → PermissionConfigurationDetails-u9MRYXxC.js.map} +1 -1
  22. package/lib/{PermissionDetails-CCdfBuaW.js → PermissionDetails-DxeSTYxA.js} +2 -2
  23. package/lib/{PermissionDetails-CCdfBuaW.js.map → PermissionDetails-DxeSTYxA.js.map} +1 -1
  24. package/lib/{RealmSection-CbqC2up8.js → RealmSection-DoqGXY7F.js} +7 -7
  25. package/lib/{RealmSection-CbqC2up8.js.map → RealmSection-DoqGXY7F.js.map} +1 -1
  26. package/lib/{ResourceDetails-DWXjggUc.js → ResourceDetails-Bn6Uim5l.js} +3 -3
  27. package/lib/{ResourceDetails-DWXjggUc.js.map → ResourceDetails-Bn6Uim5l.js.map} +1 -1
  28. package/lib/{ScopeDetails-dcHTfc9f.js → ScopeDetails-BCjTo6cS.js} +2 -2
  29. package/lib/{ScopeDetails-dcHTfc9f.js.map → ScopeDetails-BCjTo6cS.js.map} +1 -1
  30. package/lib/{ScopePicker-DNYZfIbU.js → ScopePicker-Dd6Cs54v.js} +7 -7
  31. package/lib/{ScopePicker-DNYZfIbU.js.map → ScopePicker-Dd6Cs54v.js.map} +1 -1
  32. package/lib/WorkflowDetailForm-alfgEItU.js +4938 -0
  33. package/lib/WorkflowDetailForm-alfgEItU.js.map +1 -0
  34. package/lib/WorkflowsSection-DflIdHaB.js +135 -0
  35. package/lib/WorkflowsSection-DflIdHaB.js.map +1 -0
  36. package/lib/client-scopes/details/SearchFilter.d.ts +1 -1
  37. package/lib/clients/constants.d.ts +2 -0
  38. package/lib/clients/keys/ImportKeyDialog.d.ts +3 -1
  39. package/lib/components/dynamic/ClaimDisplayComponent.d.ts +2 -0
  40. package/lib/components/dynamic/IdentityProviderMultiSelectComponent.d.ts +2 -0
  41. package/lib/components/dynamic/MultivaluedListComponent.d.ts +6 -1
  42. package/lib/components/dynamic/components.d.ts +2 -1
  43. package/lib/components/identity-provider/IdentityProviderSelect.d.ts +10 -0
  44. package/lib/components/users/UserDataTableAttributeSearchForm.d.ts +2 -1
  45. package/lib/groups/GroupRoleMapping.d.ts +2 -1
  46. package/lib/identity-providers/add/AddJWTAuthorizationGrant.d.ts +1 -0
  47. package/lib/identity-providers/add/JWTAuthorizationGrantAssertionSettings.d.ts +1 -0
  48. package/lib/identity-providers/add/JWTAuthorizationGrantSettings.d.ts +1 -0
  49. package/lib/identity-providers/add/JwksSettings.d.ts +5 -0
  50. package/lib/identity-providers/routes/IdentityProviderJWTAuthorizationGrant.d.ts +7 -0
  51. package/lib/{index-YEmLy1gM.js → index-Ddam0zn3.js} +28912 -27332
  52. package/lib/{index-YEmLy1gM.js.map → index-Ddam0zn3.js.map} +1 -1
  53. package/lib/index.d.ts +2 -0
  54. package/lib/keycloak-admin-ui.js +147 -145
  55. package/lib/organizations/Invitations.d.ts +1 -0
  56. package/lib/organizations/MembersSection.d.ts +1 -0
  57. package/lib/realm-settings/TokensTab.d.ts +2 -2
  58. package/lib/utils/useIsFeatureEnabled.d.ts +1 -0
  59. package/lib/workflows/WorkflowDetailForm.d.ts +1 -0
  60. package/lib/workflows/routes/WorkflowDetail.d.ts +9 -0
  61. package/package.json +34 -22
  62. package/lib/CreateWorkflow-zbDnQ8Gr.js +0 -86
  63. package/lib/CreateWorkflow-zbDnQ8Gr.js.map +0 -1
  64. package/lib/DetailOrganization-DfVZ7YOx.js +0 -164
  65. package/lib/DetailOrganization-DfVZ7YOx.js.map +0 -1
  66. package/lib/WorkflowsSection-DZtAH1DA.js +0 -92
  67. package/lib/WorkflowsSection-DZtAH1DA.js.map +0 -1
  68. package/lib/workflows/CreateWorkflow.d.ts +0 -1
  69. package/lib/workflows/routes/AddWorkflow.d.ts +0 -7
@@ -0,0 +1,194 @@
1
+ import { jsxs as d, jsx as t } from "react/jsx-runtime";
2
+ import { aG as y, aH as s, aI as x, aJ as n, aK as R, u as w, _ as B, a as I, ao as _, b as C, y as H, aL as M, aM as V, ap as j, P as h, F as k, aN as D, aO as G, c as N, aP as $, A as J, e as L, B as Q, aQ as U, aR as q, aS as g, aT as W, aU as X } from "./index-Ddam0zn3.js";
3
+ import { useTranslation as z } from "react-i18next";
4
+ import { useState as E } from "react";
5
+ const Y = () => {
6
+ const { t: c } = z(), [m, b] = E("members");
7
+ return /* @__PURE__ */ d(
8
+ y,
9
+ {
10
+ activeKey: m,
11
+ onSelect: (T, v) => b(v),
12
+ children: [
13
+ /* @__PURE__ */ t(
14
+ s,
15
+ {
16
+ eventKey: "members",
17
+ title: /* @__PURE__ */ t(n, { children: c("members") }),
18
+ "data-testid": "organization-members-tab",
19
+ children: /* @__PURE__ */ t(x, {})
20
+ }
21
+ ),
22
+ /* @__PURE__ */ t(
23
+ s,
24
+ {
25
+ eventKey: "invitations",
26
+ title: /* @__PURE__ */ t(n, { children: c("invitations") }),
27
+ "data-testid": "organization-invitations-tab",
28
+ children: /* @__PURE__ */ t(R, {})
29
+ }
30
+ )
31
+ ]
32
+ }
33
+ );
34
+ };
35
+ function it() {
36
+ const { adminClient: c } = w(), { addAlert: m, addError: b } = B(), { realm: T, realmRepresentation: v } = I(), { id: o } = _(), { t: e } = z(), a = C(), u = async (i) => {
37
+ try {
38
+ const r = W(i);
39
+ await c.organizations.updateById({ id: o }, r), m(e("organizationSaveSuccess"));
40
+ } catch (r) {
41
+ b("organizationSaveError", r);
42
+ }
43
+ };
44
+ H(
45
+ () => c.organizations.findOne({ id: o }),
46
+ (i) => {
47
+ if (!i)
48
+ throw new Error(e("notFound"));
49
+ a.reset({
50
+ ...i,
51
+ domains: i.domains?.map((r) => r.name),
52
+ attributes: M(i.attributes)
53
+ });
54
+ },
55
+ [o]
56
+ );
57
+ const l = (i) => V(
58
+ X({
59
+ realm: T,
60
+ id: o,
61
+ tab: i
62
+ })
63
+ ), p = l("settings"), P = l("attributes"), S = l("members"), f = l("identityProviders"), A = l("events"), { hasAccess: O } = j(), [K, F] = E("adminEvents");
64
+ return /* @__PURE__ */ t(h, { variant: "light", className: "pf-v5-u-p-0", children: /* @__PURE__ */ d(k, { ...a, children: [
65
+ /* @__PURE__ */ t(D, { save: () => u(a.getValues()) }),
66
+ /* @__PURE__ */ d(
67
+ G,
68
+ {
69
+ "data-testid": "organization-tabs",
70
+ "aria-label": e("organization"),
71
+ isBox: !0,
72
+ mountOnEnter: !0,
73
+ children: [
74
+ /* @__PURE__ */ t(
75
+ s,
76
+ {
77
+ id: "settings",
78
+ "data-testid": "settingsTab",
79
+ title: /* @__PURE__ */ t(n, { children: e("settings") }),
80
+ ...p,
81
+ children: /* @__PURE__ */ t(h, { children: /* @__PURE__ */ d(
82
+ N,
83
+ {
84
+ role: "anyone",
85
+ onSubmit: a.handleSubmit(u),
86
+ isHorizontal: !0,
87
+ children: [
88
+ /* @__PURE__ */ t($, { readOnly: !0 }),
89
+ /* @__PURE__ */ d(J, { children: [
90
+ /* @__PURE__ */ t(
91
+ L,
92
+ {
93
+ formState: a.formState,
94
+ "data-testid": "save",
95
+ children: e("save")
96
+ }
97
+ ),
98
+ /* @__PURE__ */ t(
99
+ Q,
100
+ {
101
+ onClick: () => a.reset(),
102
+ "data-testid": "reset",
103
+ variant: "link",
104
+ children: e("reset")
105
+ }
106
+ )
107
+ ] })
108
+ ]
109
+ }
110
+ ) })
111
+ }
112
+ ),
113
+ /* @__PURE__ */ t(
114
+ s,
115
+ {
116
+ id: "attributes",
117
+ "data-testid": "attributeTab",
118
+ title: /* @__PURE__ */ t(n, { children: e("attributes") }),
119
+ ...P,
120
+ children: /* @__PURE__ */ t(h, { variant: "light", children: /* @__PURE__ */ t(
121
+ U,
122
+ {
123
+ form: a,
124
+ save: u,
125
+ reset: () => a.reset({
126
+ ...a.getValues()
127
+ }),
128
+ name: "attributes"
129
+ }
130
+ ) })
131
+ }
132
+ ),
133
+ /* @__PURE__ */ t(
134
+ s,
135
+ {
136
+ id: "members",
137
+ "data-testid": "membersTab",
138
+ title: /* @__PURE__ */ t(n, { children: e("members") }),
139
+ ...S,
140
+ children: /* @__PURE__ */ t(Y, {})
141
+ }
142
+ ),
143
+ /* @__PURE__ */ t(
144
+ s,
145
+ {
146
+ id: "identityProviders",
147
+ "data-testid": "identityProvidersTab",
148
+ title: /* @__PURE__ */ t(n, { children: e("identityProviders") }),
149
+ ...f,
150
+ children: /* @__PURE__ */ t(q, {})
151
+ }
152
+ ),
153
+ v?.adminEventsEnabled && O("view-events") && /* @__PURE__ */ t(
154
+ s,
155
+ {
156
+ "data-testid": "admin-events-tab",
157
+ title: /* @__PURE__ */ t(n, { children: e("adminEvents") }),
158
+ ...A,
159
+ children: /* @__PURE__ */ d(
160
+ y,
161
+ {
162
+ activeKey: K,
163
+ onSelect: (i, r) => F(r),
164
+ children: [
165
+ /* @__PURE__ */ t(
166
+ s,
167
+ {
168
+ eventKey: "adminEvents",
169
+ title: /* @__PURE__ */ t(n, { children: e("adminEvents") }),
170
+ children: /* @__PURE__ */ t(g, { resourcePath: `organizations/${o}` })
171
+ }
172
+ ),
173
+ /* @__PURE__ */ t(
174
+ s,
175
+ {
176
+ eventKey: "membershipEvents",
177
+ title: /* @__PURE__ */ t(n, { children: e("membershipEvents") }),
178
+ children: /* @__PURE__ */ t(g, { resourcePath: `organizations/${o}/members` })
179
+ }
180
+ )
181
+ ]
182
+ }
183
+ )
184
+ }
185
+ )
186
+ ]
187
+ }
188
+ )
189
+ ] }) });
190
+ }
191
+ export {
192
+ it as default
193
+ };
194
+ //# sourceMappingURL=DetailOrganization-DWvk7gJ9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailOrganization-DWvk7gJ9.js","sources":["../src/organizations/MembersSection.tsx","../src/organizations/DetailOrganization.tsx"],"sourcesContent":["import { Tab, Tabs, TabTitleText } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Invitations } from \"./Invitations\";\nimport { Members } from \"./Members\";\n\nexport const MembersSection = () => {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState(\"members\");\n\n return (\n <Tabs\n activeKey={activeTab}\n onSelect={(_, key) => setActiveTab(key as string)}\n >\n <Tab\n eventKey=\"members\"\n title={<TabTitleText>{t(\"members\")}</TabTitleText>}\n data-testid=\"organization-members-tab\"\n >\n <Members />\n </Tab>\n <Tab\n eventKey=\"invitations\"\n title={<TabTitleText>{t(\"invitations\")}</TabTitleText>}\n data-testid=\"organization-invitations-tab\"\n >\n <Invitations />\n </Tab>\n </Tabs>\n );\n};\n","import {\n FormSubmitButton,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n Button,\n PageSection,\n Tab,\n Tabs,\n TabTitleText,\n} from \"@patternfly/react-core\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../admin-client\";\nimport { FormAccess } from \"../components/form/FormAccess\";\nimport { AttributesForm } from \"../components/key-value-form/AttributeForm\";\nimport { arrayToKeyValue } from \"../components/key-value-form/key-value-convert\";\nimport {\n RoutableTabs,\n useRoutableTab,\n} from \"../components/routable-tabs/RoutableTabs\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport { useParams } from \"../utils/useParams\";\nimport { DetailOrganizationHeader } from \"./DetailOraganzationHeader\";\nimport { IdentityProviders } from \"./IdentityProviders\";\nimport { MembersSection } from \"./MembersSection\";\nimport {\n OrganizationForm,\n OrganizationFormType,\n convertToOrg,\n} from \"./OrganizationForm\";\nimport {\n EditOrganizationParams,\n OrganizationTab,\n toEditOrganization,\n} from \"./routes/EditOrganization\";\nimport { useAccess } from \"../context/access/Access\";\nimport { AdminEvents } from \"../events/AdminEvents\";\nimport { useState } from \"react\";\n\nexport default function DetailOrganization() {\n const { adminClient } = useAdminClient();\n const { addAlert, addError } = useAlerts();\n\n const { realm, realmRepresentation } = useRealm();\n const { id } = useParams<EditOrganizationParams>();\n const { t } = useTranslation();\n\n const form = useForm<OrganizationFormType>();\n\n const save = async (org: OrganizationFormType) => {\n try {\n const organization = convertToOrg(org);\n await adminClient.organizations.updateById({ id }, organization);\n addAlert(t(\"organizationSaveSuccess\"));\n } catch (error) {\n addError(\"organizationSaveError\", error);\n }\n };\n\n useFetch(\n () => adminClient.organizations.findOne({ id }),\n (org) => {\n if (!org) {\n throw new Error(t(\"notFound\"));\n }\n form.reset({\n ...org,\n domains: org.domains?.map((d) => d.name),\n attributes: arrayToKeyValue(org.attributes),\n });\n },\n [id],\n );\n\n const useTab = (tab: OrganizationTab) =>\n useRoutableTab(\n toEditOrganization({\n realm,\n id,\n tab,\n }),\n );\n\n const settingsTab = useTab(\"settings\");\n const attributesTab = useTab(\"attributes\");\n const membersTab = useTab(\"members\");\n const identityProvidersTab = useTab(\"identityProviders\");\n const eventsTab = useTab(\"events\");\n\n const { hasAccess } = useAccess();\n const [activeEventsTab, setActiveEventsTab] = useState(\"adminEvents\");\n\n return (\n <PageSection variant=\"light\" className=\"pf-v5-u-p-0\">\n <FormProvider {...form}>\n <DetailOrganizationHeader save={() => save(form.getValues())} />\n <RoutableTabs\n data-testid=\"organization-tabs\"\n aria-label={t(\"organization\")}\n isBox\n mountOnEnter\n >\n <Tab\n id=\"settings\"\n data-testid=\"settingsTab\"\n title={<TabTitleText>{t(\"settings\")}</TabTitleText>}\n {...settingsTab}\n >\n <PageSection>\n <FormAccess\n role=\"anyone\"\n onSubmit={form.handleSubmit(save)}\n isHorizontal\n >\n <OrganizationForm readOnly />\n <ActionGroup>\n <FormSubmitButton\n formState={form.formState}\n data-testid=\"save\"\n >\n {t(\"save\")}\n </FormSubmitButton>\n <Button\n onClick={() => form.reset()}\n data-testid=\"reset\"\n variant=\"link\"\n >\n {t(\"reset\")}\n </Button>\n </ActionGroup>\n </FormAccess>\n </PageSection>\n </Tab>\n <Tab\n id=\"attributes\"\n data-testid=\"attributeTab\"\n title={<TabTitleText>{t(\"attributes\")}</TabTitleText>}\n {...attributesTab}\n >\n <PageSection variant=\"light\">\n <AttributesForm\n form={form}\n save={save}\n reset={() =>\n form.reset({\n ...form.getValues(),\n })\n }\n name=\"attributes\"\n />\n </PageSection>\n </Tab>\n <Tab\n id=\"members\"\n data-testid=\"membersTab\"\n title={<TabTitleText>{t(\"members\")}</TabTitleText>}\n {...membersTab}\n >\n <MembersSection />\n </Tab>\n <Tab\n id=\"identityProviders\"\n data-testid=\"identityProvidersTab\"\n title={<TabTitleText>{t(\"identityProviders\")}</TabTitleText>}\n {...identityProvidersTab}\n >\n <IdentityProviders />\n </Tab>\n {realmRepresentation?.adminEventsEnabled &&\n hasAccess(\"view-events\") && (\n <Tab\n data-testid=\"admin-events-tab\"\n title={<TabTitleText>{t(\"adminEvents\")}</TabTitleText>}\n {...eventsTab}\n >\n <Tabs\n activeKey={activeEventsTab}\n onSelect={(_, key) => setActiveEventsTab(key as string)}\n >\n <Tab\n eventKey=\"adminEvents\"\n title={<TabTitleText>{t(\"adminEvents\")}</TabTitleText>}\n >\n <AdminEvents resourcePath={`organizations/${id}`} />\n </Tab>\n <Tab\n eventKey=\"membershipEvents\"\n title={<TabTitleText>{t(\"membershipEvents\")}</TabTitleText>}\n >\n <AdminEvents resourcePath={`organizations/${id}/members`} />\n </Tab>\n </Tabs>\n </Tab>\n )}\n </RoutableTabs>\n </FormProvider>\n </PageSection>\n );\n}\n"],"names":["MembersSection","t","useTranslation","activeTab","setActiveTab","useState","jsxs","Tabs","_","key","jsx","Tab","TabTitleText","Members","Invitations","DetailOrganization","adminClient","useAdminClient","addAlert","addError","useAlerts","realm","realmRepresentation","useRealm","id","useParams","form","useForm","save","org","organization","convertToOrg","error","useFetch","d","arrayToKeyValue","useTab","tab","useRoutableTab","toEditOrganization","settingsTab","attributesTab","membersTab","identityProvidersTab","eventsTab","hasAccess","useAccess","activeEventsTab","setActiveEventsTab","PageSection","FormProvider","DetailOrganizationHeader","RoutableTabs","FormAccess","OrganizationForm","ActionGroup","FormSubmitButton","Button","AttributesForm","IdentityProviders","AdminEvents"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs as u, Fragment as M, jsx as o } from "react/jsx-runtime";
2
- import { u as R, ao as k, _ as J, b7 as Q, b as U, y as W, V as X, P as Y, c as Z, au as $, al as ee, am as te, an as oe, a4 as re, a7 as V, F as ae, a0 as ce, A as se, B as g, b8 as h, d as ne } from "./index-YEmLy1gM.js";
2
+ import { u as R, ao as k, _ as J, b8 as Q, b as U, y as W, V as X, P as Y, c as Z, au as $, al as ee, am as te, an as oe, a4 as re, a7 as V, F as ae, a0 as ce, A as se, B as g, b9 as h, d as ne } from "./index-Ddam0zn3.js";
3
3
  import { useState as l } from "react";
4
4
  import { useTranslation as ie } from "react-i18next";
5
5
  import { useNavigate as le, Link as F } from "react-router-dom";
@@ -196,4 +196,4 @@ function ge() {
196
196
  export {
197
197
  ge as default
198
198
  };
199
- //# sourceMappingURL=ExecutorForm-BYCH7c3u.js.map
199
+ //# sourceMappingURL=ExecutorForm-DHTRUoB1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutorForm-BYCH7c3u.js","sources":["../src/realm-settings/ExecutorForm.tsx"],"sourcesContent":["import type { ConfigPropertyRepresentation } from \"@keycloak/keycloak-admin-client/lib/defs/authenticatorConfigInfoRepresentation\";\nimport type ClientProfileRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientProfileRepresentation\";\nimport type ComponentTypeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/componentTypeRepresentation\";\nimport {\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n FormGroup,\n PageSection,\n SelectOption,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../admin-client\";\nimport { DynamicComponents } from \"../components/dynamic/DynamicComponents\";\nimport { FormAccess } from \"../components/form/FormAccess\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { useServerInfo } from \"../context/server-info/ServerInfoProvider\";\nimport { useParams } from \"../utils/useParams\";\nimport { ClientProfileParams, toClientProfile } from \"./routes/ClientProfile\";\nimport type { ExecutorParams } from \"./routes/Executor\";\n\ntype ExecutorForm = {\n config?: object;\n executor: string;\n};\n\nconst defaultValues: ExecutorForm = {\n config: {},\n executor: \"\",\n};\n\nexport default function ExecutorForm() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { realm, profileName } = useParams<ClientProfileParams>();\n const { executorName } = useParams<ExecutorParams>();\n const { addAlert, addError } = useAlerts();\n const [selectExecutorTypeOpen, setSelectExecutorTypeOpen] = useState(false);\n const serverInfo = useServerInfo();\n const executorTypes =\n serverInfo.componentTypes?.[\n \"org.keycloak.services.clientpolicy.executor.ClientPolicyExecutorProvider\"\n ];\n const [executors, setExecutors] = useState<ComponentTypeRepresentation[]>([]);\n const [executorProperties, setExecutorProperties] = useState<\n ConfigPropertyRepresentation[]\n >([]);\n const [globalProfiles, setGlobalProfiles] = useState<\n ClientProfileRepresentation[]\n >([]);\n const [profiles, setProfiles] = useState<ClientProfileRepresentation[]>([]);\n const form = useForm({ defaultValues });\n const { control, reset, handleSubmit } = form;\n const editMode = !!executorName;\n\n const setupForm = (profiles: ClientProfileRepresentation[]) => {\n const profile = profiles.find((profile) => profile.name === profileName);\n const executor = profile?.executors?.find(\n (executor) => executor.executor === executorName,\n );\n if (executor) reset({ config: executor.configuration });\n };\n\n useFetch(\n () =>\n adminClient.clientPolicies.listProfiles({ includeGlobalProfiles: true }),\n (profiles) => {\n setGlobalProfiles(profiles.globalProfiles!);\n setProfiles(profiles.profiles!);\n\n setupForm(profiles.profiles!);\n setupForm(profiles.globalProfiles!);\n },\n [],\n );\n\n const save = async () => {\n const formValues = form.getValues();\n const updatedProfiles = profiles.map((profile) => {\n if (profile.name !== profileName) {\n return profile;\n }\n\n const executors = (profile.executors ?? []).concat({\n executor: formValues.executor,\n configuration: formValues.config || {},\n });\n\n if (editMode) {\n const profileExecutor = profile.executors!.find(\n (executor) => executor.executor === executorName,\n );\n profileExecutor!.configuration = {\n ...profileExecutor!.configuration,\n ...formValues.config,\n };\n }\n\n if (editMode) {\n return profile;\n }\n return {\n ...profile,\n executors,\n };\n });\n try {\n await adminClient.clientPolicies.createProfiles({\n profiles: updatedProfiles,\n globalProfiles: globalProfiles,\n });\n addAlert(\n editMode ? t(\"updateExecutorSuccess\") : t(\"addExecutorSuccess\"),\n AlertVariant.success,\n );\n\n navigate(toClientProfile({ realm, profileName }));\n } catch (error) {\n addError(editMode ? \"updateExecutorError\" : \"addExecutorError\", error);\n }\n };\n\n const globalProfile = globalProfiles.find(\n (globalProfile) => globalProfile.name === profileName,\n );\n\n const profileExecutorType = executorTypes?.find(\n (executor) => executor.id === executorName,\n );\n\n const editedProfileExecutors =\n profileExecutorType?.properties.map<ConfigPropertyRepresentation>(\n (property) => {\n const globalDefaultValues = editMode ? property.defaultValue : \"\";\n return {\n ...property,\n defaultValue: globalDefaultValues,\n };\n },\n );\n\n return (\n <>\n <ViewHeader\n titleKey={editMode ? executorName : t(\"addExecutor\")}\n divider\n />\n <PageSection variant=\"light\">\n <FormAccess\n isHorizontal\n role=\"manage-realm\"\n className=\"pf-v5-u-mt-lg\"\n isReadOnly={!!globalProfile}\n >\n <FormGroup\n label={t(\"executorType\")}\n fieldId=\"kc-executorType\"\n labelIcon={\n executors.length > 0 && executors[0].helpText! !== \"\" ? (\n <HelpItem\n helpText={executors[0].helpText}\n fieldLabelId=\"executorTypeHelpText\"\n />\n ) : editMode ? (\n <HelpItem\n helpText={profileExecutorType?.helpText}\n fieldLabelId=\"executorTypeHelpText\"\n />\n ) : undefined\n }\n >\n <Controller\n name=\"executor\"\n defaultValue=\"\"\n control={control}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"kc-executor\"\n placeholderText=\"Select an executor\"\n onToggle={(isOpen) => setSelectExecutorTypeOpen(isOpen)}\n onSelect={(value) => {\n reset({ ...defaultValues, executor: value.toString() });\n const selectedExecutor = executorTypes?.filter(\n (type) => type.id === value,\n );\n setExecutors(selectedExecutor ?? []);\n setExecutorProperties(\n selectedExecutor?.[0].properties ?? [],\n );\n setSelectExecutorTypeOpen(false);\n }}\n selections={editMode ? executorName : field.value}\n variant={SelectVariant.single}\n data-testid=\"executorType-select\"\n aria-label={t(\"executorType\")}\n isOpen={selectExecutorTypeOpen}\n maxHeight={580}\n isDisabled={editMode}\n >\n {executorTypes?.map((option) => (\n <SelectOption\n data-testid={option.id}\n selected={option.id === field.value}\n key={option.id}\n value={option.id}\n description={option.helpText}\n >\n {option.id}\n </SelectOption>\n ))}\n </KeycloakSelect>\n )}\n />\n </FormGroup>\n <FormProvider {...form}>\n <DynamicComponents\n properties={\n editMode ? editedProfileExecutors! : executorProperties\n }\n />\n </FormProvider>\n {!globalProfile && (\n <ActionGroup>\n <Button\n variant=\"primary\"\n onClick={() => handleSubmit(save)()}\n data-testid=\"addExecutor-saveBtn\"\n >\n {editMode ? t(\"save\") : t(\"add\")}\n </Button>\n <Button\n variant=\"link\"\n component={(props) => (\n <Link\n {...props}\n to={toClientProfile({ realm, profileName })}\n />\n )}\n data-testid=\"addExecutor-cancelBtn\"\n >\n {t(\"cancel\")}\n </Button>\n </ActionGroup>\n )}\n </FormAccess>\n {editMode && globalProfile && (\n <div className=\"kc-backToProfile\">\n <Button\n component={(props) => (\n <Link {...props} to={toClientProfile({ realm, profileName })} />\n )}\n variant=\"primary\"\n >\n {t(\"back\")}\n </Button>\n </div>\n )}\n </PageSection>\n </>\n );\n}\n"],"names":["defaultValues","ExecutorForm","adminClient","useAdminClient","t","useTranslation","navigate","useNavigate","realm","profileName","useParams","executorName","addAlert","addError","useAlerts","selectExecutorTypeOpen","setSelectExecutorTypeOpen","useState","executorTypes","useServerInfo","executors","setExecutors","executorProperties","setExecutorProperties","globalProfiles","setGlobalProfiles","profiles","setProfiles","form","useForm","control","reset","handleSubmit","editMode","setupForm","executor","profile","useFetch","save","formValues","updatedProfiles","profileExecutor","AlertVariant","toClientProfile","error","globalProfile","profileExecutorType","editedProfileExecutors","property","globalDefaultValues","jsxs","Fragment","jsx","ViewHeader","PageSection","FormAccess","FormGroup","HelpItem","Controller","field","KeycloakSelect","isOpen","value","selectedExecutor","type","SelectVariant","option","SelectOption","FormProvider","DynamicComponents","ActionGroup","Button","props","Link"],"mappings":"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"}
1
+ {"version":3,"file":"ExecutorForm-DHTRUoB1.js","sources":["../src/realm-settings/ExecutorForm.tsx"],"sourcesContent":["import type { ConfigPropertyRepresentation } from \"@keycloak/keycloak-admin-client/lib/defs/authenticatorConfigInfoRepresentation\";\nimport type ClientProfileRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientProfileRepresentation\";\nimport type ComponentTypeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/componentTypeRepresentation\";\nimport {\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n FormGroup,\n PageSection,\n SelectOption,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../admin-client\";\nimport { DynamicComponents } from \"../components/dynamic/DynamicComponents\";\nimport { FormAccess } from \"../components/form/FormAccess\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { useServerInfo } from \"../context/server-info/ServerInfoProvider\";\nimport { useParams } from \"../utils/useParams\";\nimport { ClientProfileParams, toClientProfile } from \"./routes/ClientProfile\";\nimport type { ExecutorParams } from \"./routes/Executor\";\n\ntype ExecutorForm = {\n config?: object;\n executor: string;\n};\n\nconst defaultValues: ExecutorForm = {\n config: {},\n executor: \"\",\n};\n\nexport default function ExecutorForm() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { realm, profileName } = useParams<ClientProfileParams>();\n const { executorName } = useParams<ExecutorParams>();\n const { addAlert, addError } = useAlerts();\n const [selectExecutorTypeOpen, setSelectExecutorTypeOpen] = useState(false);\n const serverInfo = useServerInfo();\n const executorTypes =\n serverInfo.componentTypes?.[\n \"org.keycloak.services.clientpolicy.executor.ClientPolicyExecutorProvider\"\n ];\n const [executors, setExecutors] = useState<ComponentTypeRepresentation[]>([]);\n const [executorProperties, setExecutorProperties] = useState<\n ConfigPropertyRepresentation[]\n >([]);\n const [globalProfiles, setGlobalProfiles] = useState<\n ClientProfileRepresentation[]\n >([]);\n const [profiles, setProfiles] = useState<ClientProfileRepresentation[]>([]);\n const form = useForm({ defaultValues });\n const { control, reset, handleSubmit } = form;\n const editMode = !!executorName;\n\n const setupForm = (profiles: ClientProfileRepresentation[]) => {\n const profile = profiles.find((profile) => profile.name === profileName);\n const executor = profile?.executors?.find(\n (executor) => executor.executor === executorName,\n );\n if (executor) reset({ config: executor.configuration });\n };\n\n useFetch(\n () =>\n adminClient.clientPolicies.listProfiles({ includeGlobalProfiles: true }),\n (profiles) => {\n setGlobalProfiles(profiles.globalProfiles!);\n setProfiles(profiles.profiles!);\n\n setupForm(profiles.profiles!);\n setupForm(profiles.globalProfiles!);\n },\n [],\n );\n\n const save = async () => {\n const formValues = form.getValues();\n const updatedProfiles = profiles.map((profile) => {\n if (profile.name !== profileName) {\n return profile;\n }\n\n const executors = (profile.executors ?? []).concat({\n executor: formValues.executor,\n configuration: formValues.config || {},\n });\n\n if (editMode) {\n const profileExecutor = profile.executors!.find(\n (executor) => executor.executor === executorName,\n );\n profileExecutor!.configuration = {\n ...profileExecutor!.configuration,\n ...formValues.config,\n };\n }\n\n if (editMode) {\n return profile;\n }\n return {\n ...profile,\n executors,\n };\n });\n try {\n await adminClient.clientPolicies.createProfiles({\n profiles: updatedProfiles,\n globalProfiles: globalProfiles,\n });\n addAlert(\n editMode ? t(\"updateExecutorSuccess\") : t(\"addExecutorSuccess\"),\n AlertVariant.success,\n );\n\n navigate(toClientProfile({ realm, profileName }));\n } catch (error) {\n addError(editMode ? \"updateExecutorError\" : \"addExecutorError\", error);\n }\n };\n\n const globalProfile = globalProfiles.find(\n (globalProfile) => globalProfile.name === profileName,\n );\n\n const profileExecutorType = executorTypes?.find(\n (executor) => executor.id === executorName,\n );\n\n const editedProfileExecutors =\n profileExecutorType?.properties.map<ConfigPropertyRepresentation>(\n (property) => {\n const globalDefaultValues = editMode ? property.defaultValue : \"\";\n return {\n ...property,\n defaultValue: globalDefaultValues,\n };\n },\n );\n\n return (\n <>\n <ViewHeader\n titleKey={editMode ? executorName : t(\"addExecutor\")}\n divider\n />\n <PageSection variant=\"light\">\n <FormAccess\n isHorizontal\n role=\"manage-realm\"\n className=\"pf-v5-u-mt-lg\"\n isReadOnly={!!globalProfile}\n >\n <FormGroup\n label={t(\"executorType\")}\n fieldId=\"kc-executorType\"\n labelIcon={\n executors.length > 0 && executors[0].helpText! !== \"\" ? (\n <HelpItem\n helpText={executors[0].helpText}\n fieldLabelId=\"executorTypeHelpText\"\n />\n ) : editMode ? (\n <HelpItem\n helpText={profileExecutorType?.helpText}\n fieldLabelId=\"executorTypeHelpText\"\n />\n ) : undefined\n }\n >\n <Controller\n name=\"executor\"\n defaultValue=\"\"\n control={control}\n render={({ field }) => (\n <KeycloakSelect\n toggleId=\"kc-executor\"\n placeholderText=\"Select an executor\"\n onToggle={(isOpen) => setSelectExecutorTypeOpen(isOpen)}\n onSelect={(value) => {\n reset({ ...defaultValues, executor: value.toString() });\n const selectedExecutor = executorTypes?.filter(\n (type) => type.id === value,\n );\n setExecutors(selectedExecutor ?? []);\n setExecutorProperties(\n selectedExecutor?.[0].properties ?? [],\n );\n setSelectExecutorTypeOpen(false);\n }}\n selections={editMode ? executorName : field.value}\n variant={SelectVariant.single}\n data-testid=\"executorType-select\"\n aria-label={t(\"executorType\")}\n isOpen={selectExecutorTypeOpen}\n maxHeight={580}\n isDisabled={editMode}\n >\n {executorTypes?.map((option) => (\n <SelectOption\n data-testid={option.id}\n selected={option.id === field.value}\n key={option.id}\n value={option.id}\n description={option.helpText}\n >\n {option.id}\n </SelectOption>\n ))}\n </KeycloakSelect>\n )}\n />\n </FormGroup>\n <FormProvider {...form}>\n <DynamicComponents\n properties={\n editMode ? editedProfileExecutors! : executorProperties\n }\n />\n </FormProvider>\n {!globalProfile && (\n <ActionGroup>\n <Button\n variant=\"primary\"\n onClick={() => handleSubmit(save)()}\n data-testid=\"addExecutor-saveBtn\"\n >\n {editMode ? t(\"save\") : t(\"add\")}\n </Button>\n <Button\n variant=\"link\"\n component={(props) => (\n <Link\n {...props}\n to={toClientProfile({ realm, profileName })}\n />\n )}\n data-testid=\"addExecutor-cancelBtn\"\n >\n {t(\"cancel\")}\n </Button>\n </ActionGroup>\n )}\n </FormAccess>\n {editMode && globalProfile && (\n <div className=\"kc-backToProfile\">\n <Button\n component={(props) => (\n <Link {...props} to={toClientProfile({ realm, profileName })} />\n )}\n variant=\"primary\"\n >\n {t(\"back\")}\n </Button>\n </div>\n )}\n </PageSection>\n </>\n );\n}\n"],"names":["defaultValues","ExecutorForm","adminClient","useAdminClient","t","useTranslation","navigate","useNavigate","realm","profileName","useParams","executorName","addAlert","addError","useAlerts","selectExecutorTypeOpen","setSelectExecutorTypeOpen","useState","executorTypes","useServerInfo","executors","setExecutors","executorProperties","setExecutorProperties","globalProfiles","setGlobalProfiles","profiles","setProfiles","form","useForm","control","reset","handleSubmit","editMode","setupForm","executor","profile","useFetch","save","formValues","updatedProfiles","profileExecutor","AlertVariant","toClientProfile","error","globalProfile","profileExecutorType","editedProfileExecutors","property","globalDefaultValues","jsxs","Fragment","jsx","ViewHeader","PageSection","FormAccess","FormGroup","HelpItem","Controller","field","KeycloakSelect","isOpen","value","selectedExecutor","type","SelectVariant","option","SelectOption","FormProvider","DynamicComponents","ActionGroup","Button","props","Link"],"mappings":"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"}