@keycloak/keycloak-admin-ui 26.3.5 → 26.4.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.
Files changed (58) hide show
  1. package/lib/.vite/manifest.json +71 -31
  2. package/lib/AddKubernetesConnect-CLVPWkrb.js +65 -0
  3. package/lib/AddKubernetesConnect-CLVPWkrb.js.map +1 -0
  4. package/lib/{AddOAuth2-Dxp1J1jb.js → AddOAuth2-CC0H-fVr.js} +8 -8
  5. package/lib/{AddOAuth2-Dxp1J1jb.js.map → AddOAuth2-CC0H-fVr.js.map} +1 -1
  6. package/lib/AddSpiffeConnect-Dji06y_O.js +69 -0
  7. package/lib/AddSpiffeConnect-Dji06y_O.js.map +1 -0
  8. package/lib/{CreateFlow-4l-mqWSc.js → CreateFlow-Cz-lg73m.js} +2 -2
  9. package/lib/{CreateFlow-4l-mqWSc.js.map → CreateFlow-Cz-lg73m.js.map} +1 -1
  10. package/lib/CreateWorkflow-ua79h89c.js +86 -0
  11. package/lib/CreateWorkflow-ua79h89c.js.map +1 -0
  12. package/lib/{DetailOrganization-D3FMNAgS.js → DetailOrganization-Ysk1nTgF.js} +2 -2
  13. package/lib/{DetailOrganization-D3FMNAgS.js.map → DetailOrganization-Ysk1nTgF.js.map} +1 -1
  14. package/lib/{ExecutorForm-q7jXfMr5.js → ExecutorForm-BccZ7QZF.js} +2 -2
  15. package/lib/{ExecutorForm-q7jXfMr5.js.map → ExecutorForm-BccZ7QZF.js.map} +1 -1
  16. package/lib/{FlowDetails-Dtszkmi9.js → FlowDetails-B4lQG8Pg.js} +17 -17
  17. package/lib/{FlowDetails-Dtszkmi9.js.map → FlowDetails-B4lQG8Pg.js.map} +1 -1
  18. package/lib/{NewOrganization-DVCQIWM9.js → NewOrganization-DnnmflIu.js} +2 -2
  19. package/lib/{NewOrganization-DVCQIWM9.js.map → NewOrganization-DnnmflIu.js.map} +1 -1
  20. package/lib/{PermissionConfigurationDetails-BlV-QaHz.js → PermissionConfigurationDetails-OCQEx-d3.js} +32 -32
  21. package/lib/PermissionConfigurationDetails-OCQEx-d3.js.map +1 -0
  22. package/lib/{PermissionDetails-ClVKBmnl.js → PermissionDetails-DgCmusN2.js} +2 -2
  23. package/lib/{PermissionDetails-ClVKBmnl.js.map → PermissionDetails-DgCmusN2.js.map} +1 -1
  24. package/lib/{RealmSection-BzcmhOlZ.js → RealmSection-CxxB3s3W.js} +3 -3
  25. package/lib/RealmSection-CxxB3s3W.js.map +1 -0
  26. package/lib/{ResourceDetails-BEmkHc1N.js → ResourceDetails-BbSJrYuX.js} +3 -3
  27. package/lib/{ResourceDetails-BEmkHc1N.js.map → ResourceDetails-BbSJrYuX.js.map} +1 -1
  28. package/lib/{ScopeDetails-DS7tttxU.js → ScopeDetails-DJNNCcbt.js} +2 -2
  29. package/lib/{ScopeDetails-DS7tttxU.js.map → ScopeDetails-DJNNCcbt.js.map} +1 -1
  30. package/lib/{ScopePicker-Ccn0shUc.js → ScopePicker-BB_n0zxI.js} +2 -2
  31. package/lib/{ScopePicker-Ccn0shUc.js.map → ScopePicker-BB_n0zxI.js.map} +1 -1
  32. package/lib/WorkflowsSection-DbR36xIx.js +92 -0
  33. package/lib/WorkflowsSection-DbR36xIx.js.map +1 -0
  34. package/lib/clients/add/SamlEncryption.d.ts +1 -0
  35. package/lib/clients/advanced/OpenIdVerifiableCredentials.d.ts +9 -0
  36. package/lib/components/form/CodeEditor.d.ts +1 -1
  37. package/lib/components/json-file-upload/FileUploadForm.d.ts +2 -1
  38. package/lib/context/whoami/WhoAmI.d.ts +2 -16
  39. package/lib/help-urls.d.ts +1 -0
  40. package/lib/identity-providers/add/AddKubernetesConnect.d.ts +1 -0
  41. package/lib/identity-providers/add/AddSpiffeConnect.d.ts +1 -0
  42. package/lib/identity-providers/add/KubernetesSettings.d.ts +1 -0
  43. package/lib/identity-providers/add/SpiffeSettings.d.ts +1 -0
  44. package/lib/identity-providers/routes/IdentityProviderKubernetes.d.ts +7 -0
  45. package/lib/identity-providers/routes/IdentityProviderSpiffe.d.ts +7 -0
  46. package/lib/{index-CzrFBAyz.js → index-DyTQe_VT.js} +21342 -20732
  47. package/lib/{index-CzrFBAyz.js.map → index-DyTQe_VT.js.map} +1 -1
  48. package/lib/keycloak-admin-ui.js +78 -78
  49. package/lib/utils/useIsFeatureEnabled.d.ts +3 -1
  50. package/lib/workflows/CreateWorkflow.d.ts +1 -0
  51. package/lib/workflows/WorkflowsSection.d.ts +1 -0
  52. package/lib/workflows/routes/AddWorkflow.d.ts +7 -0
  53. package/lib/workflows/routes/Workflows.d.ts +7 -0
  54. package/lib/workflows/routes.d.ts +3 -0
  55. package/package.json +25 -19
  56. package/lib/PermissionConfigurationDetails-BlV-QaHz.js.map +0 -1
  57. package/lib/RealmSection-BzcmhOlZ.js.map +0 -1
  58. package/lib/components/keycloak-spinner/KeycloakSpinner.d.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { ds as s, bO as t, ce as i, eV as o, en as n, bX as r, dR as d, dS as l, bE as c, dT as p, dU as S, cq as g, dh as b, dV as m, cv as C, eW as u, eG as f, eH as A, g3 as D, aR as T, g0 as P, bY as v, cD as R, g5 as F, bZ as y, eI as L, eJ as U, eK as I, eL as M, aN as G, eN as h, eO as E, eP as K, eQ as w, b_ as z, bD as k, c7 as x, c8 as O, c6 as H, c5 as V, c3 as B, c4 as N, bN as W, cQ as J, eB as q, bP as X, ch as Q, bJ as Y, dD as Z, dd as _, cE as $, cF as j, e3 as ee, eX as ae, cr as se, cs as te, cM as ie, bK as oe, cw as ne, c9 as re, cL as de, cR as le, cG as ce, cH as pe, cI as Se, b$ as ge, cN as be, cx as me, cu as Ce, bL as ue, cf as fe, ej as Ae, fq as De, fQ as Te, fj as Pe, fk as ve, ca as Re, fD as Fe, dz as ye, cy as Le, cz as Ue, eY as Ie, aC as Me, dE as Ge, dX as he, aI as Ee, ct as Ke, dY as we, e4 as ze, dZ as ke, e5 as xe, cO as Oe, cP as He, a0 as Ve, bM as Be, fr as Ne, ey as We, dx as Je, d3 as qe, cA as Xe, eo as Qe, ep as Ye, dB as Ze, eq as _e, er as $e, ci as je, fN as ea, d_ as aa, fs as sa, cS as ta, d9 as ia, c0 as oa, d5 as na, fY as ra, c as da, e6 as la, d4 as ca, bQ as pa, cj as Sa, cB as ga, dI as ba, cJ as ma, cT as Ca, d6 as ua, d7 as fa, dJ as Aa, dM as Da, dF as Ta, dG as Pa, dK as va, dL as Ra, fZ as Fa, eC as ya, d8 as La, eD as Ua, ea as Ia, dW as Ma, d$ as Ga, cd as ha, ck as Ea, cg as Ka, fl as wa, ec as za, eR as ka, da as xa, fE as Oa, es as Ha, et as Va, eu as Ba, db as Na, aD as Wa, de as Ja, g1 as qa, cl as Xa, ev as Qa, ew as Ya, ex as Za, fF as _a, fG as $a, fH as ja, fI as es, fJ as as, fK as ss, fL as ts, fM as is, fm as os, ed as ns, cU as rs, ez as ds, bR as ls, bS as cs, bT as ps, eb as Ss, fR as gs, cV as bs, bF as ms, bG as Cs, dO as us, dN as fs, dH as As, aB as Ds, cW as Ts, cX as Ps, f0 as vs, bU as Rs, f1 as Fs, f2 as ys, ei as Ls, bz as Us, bx as Is, c1 as Ms, by as Gs, aL as hs, aP as Es, aO as Ks, ee as ws, ef as zs, cK as ks, eg as xs, eh as Os, f_ as Hs, f$ as Vs, f3 as Bs, f4 as Ns, cY as Ws, g6 as Js, df as qs, f5 as Xs, dA as Qs, dt as Ys, eA as Zs, el as _s, ek as $s, eZ as js, e_ as et, e$ as at, f6 as st, f8 as tt, f7 as it, fc as ot, dy as nt, e7 as rt, e0 as dt, fn as lt, fo as ct, fp as pt, dC as St, fe as gt, cZ as bt, dg as mt, di as Ct, dj as ut, aJ as ft, bV as At, e1 as Dt, e2 as Tt, cm as Pt, cn as vt, co as Rt, bW as Ft, bH as yt, c_ as Lt, bI as Ut, fi as It, eE as Mt, du as Gt, cC as ht, ff as Et, fg as Kt, fP as wt, cb as zt, cp as kt, c$ as xt, dQ as Ot, e8 as Ht, d0 as Vt, e9 as Bt, fa as Nt, fb as Wt, f9 as Jt, eF as qt, dk as Xt, dl as Qt, dm as Yt, c2 as Zt, d1 as _t, ft as $t, fu as jt, fv as ei, dn as ai, dp as si, dq as ti, fO as ii, fS as oi, fT as ni, fU as ri, fV as di, fW as li, fX as ci, fw as pi, fx as Si, fy as gi, fz as bi, d2 as mi, eS as Ci, eU as ui, fd as fi, fA as Ai, fh as Di, fC as Ti, fB as Pi, em as vi, eM as Ri, dc as Fi, V as yi, dv as Li, dr as Ui, cc as Ii, b3 as Mi, g4 as Gi, ap as hi, aa as Ei, g2 as Ki, dw as wi, a as zi, b5 as ki, b7 as xi, dP as Oi, eT as Hi, aW as Vi } from "./index-CzrFBAyz.js";
1
+ import { dy as s, bU as t, ck as i, e$ as o, et as n, c1 as r, dX as d, dY as l, bK as c, dZ as p, d_ as g, cw as S, dn as m, d$ as C, cB as b, f0 as u, eM as f, eN as A, g9 as D, aR as T, g6 as P, c2 as v, cJ as R, gb as F, c3 as y, eO as L, eP as U, eQ as M, eR as I, aN as G, eT as h, eU as E, eV as K, eW as w, c4 as k, bJ as z, cd as O, ce as x, cc as H, cb as B, c9 as V, ca as N, bT as W, cW as J, eH as q, bV as X, cn as Q, bP as Y, dJ as Z, dj as _, cK as $, cL as j, e9 as ee, f1 as ae, cx as se, cy as te, cS as ie, bQ as oe, cC as ne, cf as re, cR as de, cX as le, cM as ce, cN as pe, cO as ge, c5 as Se, cT as me, cD as Ce, cA as be, bR as ue, cl as fe, ep as Ae, fw as De, fW as Te, fp as Pe, fq as ve, cg as Re, fJ as Fe, dF as ye, cE as Le, cF as Ue, f2 as Me, aC as Ie, dK as Ge, e1 as he, aI as Ee, cz as Ke, e2 as we, ea as ke, e3 as ze, eb as Oe, cU as xe, cV as He, a0 as Be, bS as Ve, fx as Ne, eE as We, dD as Je, d9 as qe, cG as Xe, eu as Qe, ev as Ye, dH as Ze, ew as _e, ex as $e, co as je, fT as ea, e4 as aa, fy as sa, cY as ta, df as ia, c6 as oa, db as na, g2 as ra, c as da, ec as la, da as ca, bW as pa, cp as ga, cH as Sa, dO as ma, cP as Ca, cZ as ba, dc as ua, dd as fa, dP as Aa, dS as Da, dL as Ta, dM as Pa, dQ as va, dR as Ra, g3 as Fa, eI as ya, de as La, eJ as Ua, eg as Ma, e0 as Ia, e5 as Ga, cj as ha, cq as Ea, cm as Ka, fr as wa, ei as ka, eX as za, dg as Oa, fK as xa, ey as Ha, ez as Ba, eA as Va, dh as Na, aD as Wa, dk as Ja, g7 as qa, cr as Xa, eB as Qa, eC as Ya, eD as Za, fL as _a, fM as $a, fN as ja, fO as es, fP as as, fQ as ss, fR as ts, fS as is, fs as os, ej as ns, c_ as rs, eF as ds, bX as ls, bY as cs, bZ as ps, eh as gs, fX as Ss, c$ as ms, bL as Cs, bM as bs, dU as us, dT as fs, dN as As, aB as Ds, d0 as Ts, d1 as Ps, f6 as vs, b_ as Rs, f7 as Fs, f8 as ys, eo as Ls, bD as Us, bB as Ms, c7 as Is, bC as Gs, aL as hs, aP as Es, aO as Ks, ek as ws, el as ks, cQ as zs, em as Os, en as xs, g4 as Hs, g5 as Bs, f9 as Vs, fa as Ns, d2 as Ws, gc as Js, dl as qs, fb as Xs, dG as Qs, dz as Ys, eG as Zs, er as _s, eq as $s, f3 as js, f4 as et, f5 as at, fc as st, fe as tt, fd as it, fi as ot, dE as nt, ed as rt, e6 as dt, ft as lt, fu as ct, fv as pt, dI as gt, fk as St, d3 as mt, dm as Ct, dp as bt, dq as ut, aJ as ft, b$ as At, e7 as Dt, e8 as Tt, cs as Pt, ct as vt, cu as Rt, c0 as Ft, bN as yt, d4 as Lt, bO as Ut, fo as Mt, eK as It, dA as Gt, cI as ht, fl as Et, fm as Kt, fV as wt, ch as kt, cv as zt, d5 as Ot, dW as xt, ee as Ht, d6 as Bt, ef as Vt, fg as Nt, fh as Wt, ff as Jt, eL as qt, dr as Xt, ds as Qt, dt as Yt, c8 as Zt, d7 as _t, fz as $t, fA as jt, fB as ei, du as ai, dv as si, dw as ti, fU as ii, fY as oi, fZ as ni, f_ as ri, f$ as di, g0 as li, g1 as ci, fC as pi, fD as gi, fE as Si, fF as mi, d8 as Ci, eY as bi, e_ as ui, fj as fi, fG as Ai, fn as Di, fI as Ti, fH as Pi, es as vi, eS as Ri, di as Fi, V as yi, dB as Li, dx as Ui, ci as Mi, b3 as Ii, ga as Gi, ap as hi, aa as Ei, g8 as Ki, dC as wi, a as ki, b5 as zi, b7 as Oi, dV as xi, eZ as Hi, aW as Bi } from "./index-DyTQe_VT.js";
2
2
  export {
3
3
  s as AccessContextProvider,
4
4
  t as AccessSettings,
@@ -10,11 +10,11 @@ export {
10
10
  l as AddMapper,
11
11
  c as AddMapperDialog,
12
12
  p as AddMapperForm,
13
- S as AddOpenIdConnect,
14
- g as AddProviderDialog,
15
- b as AddRoleMappingModal,
16
- m as AddSamlConnect,
17
- C as AddScopeDialog,
13
+ g as AddOpenIdConnect,
14
+ S as AddProviderDialog,
15
+ m as AddRoleMappingModal,
16
+ C as AddSamlConnect,
17
+ b as AddScopeDialog,
18
18
  u as AddTranslationModal,
19
19
  f as AddTranslationsDialog,
20
20
  A as AddValidatorDialog,
@@ -27,20 +27,20 @@ export {
27
27
  y as ApplicationUrls,
28
28
  L as AttributeAnnotations,
29
29
  U as AttributeGeneralSettings,
30
- I as AttributePermission,
31
- M as AttributeValidations,
30
+ M as AttributePermission,
31
+ I as AttributeValidations,
32
32
  G as AttributesForm,
33
33
  h as AttributesGroupDetails,
34
34
  E as AttributesGroupForm,
35
35
  K as AttributesGroupTab,
36
36
  w as AttributesTab,
37
- z as AuthenticationOverrides,
38
- k as AuthenticationSection,
39
- x as AuthorizationEvaluate,
40
- O as AuthorizationExport,
37
+ k as AuthenticationOverrides,
38
+ z as AuthenticationSection,
39
+ O as AuthorizationEvaluate,
40
+ x as AuthorizationExport,
41
41
  H as AuthorizationPermissions,
42
- V as AuthorizationPolicies,
43
- B as AuthorizationResources,
42
+ B as AuthorizationPolicies,
43
+ V as AuthorizationResources,
44
44
  N as AuthorizationScopes,
45
45
  W as AuthorizationSettings,
46
46
  J as BooleanComponent,
@@ -64,11 +64,11 @@ export {
64
64
  le as ClientSelectComponent,
65
65
  ce as ClientSessions,
66
66
  pe as ClientSettings,
67
- Se as ClientsSection,
68
- ge as ClusteringPanel,
69
- be as ConfirmDialogModal,
70
- me as CopyToClipboardButton,
71
- Ce as CreateClientRole,
67
+ ge as ClientsSection,
68
+ Se as ClusteringPanel,
69
+ me as ConfirmDialogModal,
70
+ Ce as CopyToClipboardButton,
71
+ be as CreateClientRole,
72
72
  ue as CreateClientScope,
73
73
  fe as CreateInitialAccessToken,
74
74
  Ae as CreateRealmRole,
@@ -81,20 +81,20 @@ export {
81
81
  ye as DashboardSection,
82
82
  Le as DedicatedScope,
83
83
  Ue as DedicatedScopes,
84
- Ie as DefaultGroupsTab,
85
- Me as DefaultSwitchControl,
84
+ Me as DefaultGroupsTab,
85
+ Ie as DefaultSwitchControl,
86
86
  Ge as DeleteGroup,
87
87
  he as DescriptorSettings,
88
88
  Ee as DetailOrganizationHeader,
89
89
  Ke as DetailProvider,
90
90
  we as DetailSettings,
91
- ze as DiscoveryEndpointField,
92
- ke as DiscoverySettings,
93
- xe as DisplayOrder,
94
- Oe as DownloadDialog,
91
+ ke as DiscoveryEndpointField,
92
+ ze as DiscoverySettings,
93
+ Oe as DisplayOrder,
94
+ xe as DownloadDialog,
95
95
  He as DropdownPanel,
96
- Ve as DynamicComponents,
97
- Be as EditClientScope,
96
+ Be as DynamicComponents,
97
+ Ve as EditClientScope,
98
98
  Ne as EditUser,
99
99
  We as EffectiveMessageBundles,
100
100
  Je as ErrorBoundaryProvider,
@@ -118,11 +118,11 @@ export {
118
118
  la as FormGroupField,
119
119
  ca as FormattedLink,
120
120
  pa as GeneralSettings,
121
- Sa as GenerateKeyDialog,
122
- ga as GeneratedCodeTab,
123
- ba as GroupAttributes,
124
- ma as GroupBreadCrumbs,
125
- Ca as GroupComponent,
121
+ ga as GenerateKeyDialog,
122
+ Sa as GeneratedCodeTab,
123
+ ma as GroupAttributes,
124
+ Ca as GroupBreadCrumbs,
125
+ ba as GroupComponent,
126
126
  ua as GroupPath,
127
127
  fa as GroupPickerDialog,
128
128
  Aa as GroupRoleMapping,
@@ -135,20 +135,20 @@ export {
135
135
  ya as HeadersForm,
136
136
  La as HelpHeader,
137
137
  Ua as HelpLinkTextInput,
138
- Ia as IdentityProvidersSection,
139
- Ma as IdpAdvancedSettings,
138
+ Ma as IdentityProvidersSection,
139
+ Ia as IdpAdvancedSettings,
140
140
  Ga as IdpGeneralSettings,
141
141
  ha as ImportForm,
142
142
  Ea as ImportKeyDialog,
143
143
  Ka as InitialAccessTokenList,
144
144
  wa as InlineLabelEdit,
145
- za as InviteMemberModal,
146
- ka as JsonEditorTab,
147
- xa as JsonFileUpload,
148
- Oa as KerberosSettingsRequired,
145
+ ka as InviteMemberModal,
146
+ za as JsonEditorTab,
147
+ Oa as JsonFileUpload,
148
+ xa as KerberosSettingsRequired,
149
149
  Ha as KeyProviderForm,
150
- Va as KeyProviderModal,
151
- Ba as KeyProvidersPicker,
150
+ Ba as KeyProviderModal,
151
+ Va as KeyProvidersPicker,
152
152
  Na as KeySelect,
153
153
  Wa as KeyValueInput,
154
154
  Ja as KeycloakCard,
@@ -172,11 +172,11 @@ export {
172
172
  ls as LoginSettings,
173
173
  cs as LoginSettingsPanel,
174
174
  ps as LogoutPanel,
175
- Ss as ManageOrderDialog,
176
- gs as ManagePriorityDialog,
177
- bs as MapComponent,
178
- ms as MapperList,
179
- Cs as MappingDetails,
175
+ gs as ManageOrderDialog,
176
+ Ss as ManagePriorityDialog,
177
+ ms as MapComponent,
178
+ Cs as MapperList,
179
+ bs as MappingDetails,
180
180
  us as MemberModal,
181
181
  fs as Members,
182
182
  As as MoveDialog,
@@ -189,20 +189,20 @@ export {
189
189
  ys as NewClientPolicyCondition,
190
190
  Ls as NewRealmForm,
191
191
  Us as OIDCAuthentication,
192
- Is as OIDCGeneralSettings,
193
- Ms as OpenIdConnectCompatibilityModes,
192
+ Ms as OIDCGeneralSettings,
193
+ Is as OpenIdConnectCompatibilityModes,
194
194
  Gs as OpenIdConnectSettings,
195
195
  hs as OrganizationForm,
196
196
  Es as OrganizationIdentityProviders,
197
197
  Ks as OrganizationMembers,
198
198
  ws as OrganizationSection,
199
- zs as Page,
200
- ks as PageBreadCrumbs,
201
- xs as PageHandler,
202
- Os as PageList,
199
+ ks as Page,
200
+ zs as PageBreadCrumbs,
201
+ Os as PageHandler,
202
+ xs as PageList,
203
203
  Hs as PageNav,
204
- Vs as PageNotFoundSection,
205
- Bs as PartialExportDialog,
204
+ Bs as PageNotFoundSection,
205
+ Vs as PartialExportDialog,
206
206
  Ns as PartialImportDialog,
207
207
  Ws as PasswordComponent,
208
208
  Js as PermissionsConfigurationSection,
@@ -226,11 +226,11 @@ export {
226
226
  lt as RequiredActionMultiSelect,
227
227
  ct as ResetCredentialDialog,
228
228
  pt as ResetPasswordDialog,
229
- St as ResourceLink,
230
- gt as RevocationModal,
231
- bt as RoleComponent,
232
- mt as RoleForm,
233
- Ct as RoleMapping,
229
+ gt as ResourceLink,
230
+ St as RevocationModal,
231
+ mt as RoleComponent,
232
+ Ct as RoleForm,
233
+ bt as RoleMapping,
234
234
  ut as RolesList,
235
235
  ft as RoutableTabs,
236
236
  At as SamlConfig,
@@ -243,20 +243,20 @@ export {
243
243
  yt as ScopeForm,
244
244
  Lt as ScriptComponent,
245
245
  Ut as SearchDropdown,
246
- It as SearchToolbar,
247
- Mt as SecurityDefenses,
246
+ Mt as SearchToolbar,
247
+ It as SecurityDefenses,
248
248
  Gt as ServerInfoProvider,
249
249
  ht as ServiceAccount,
250
250
  Et as SessionsSection,
251
251
  Kt as SessionsTable,
252
252
  wt as SettingsCache,
253
- zt as SignedJWT,
254
- kt as StoreSettings,
255
- xt as StringComponent,
256
- Ot as SubGroups,
253
+ kt as SignedJWT,
254
+ zt as StoreSettings,
255
+ Ot as StringComponent,
256
+ xt as SubGroups,
257
257
  Ht as SwitchField,
258
- Vt as TextComponent,
259
- Bt as TextField,
258
+ Bt as TextComponent,
259
+ Vt as TextField,
260
260
  Nt as ThemeColors,
261
261
  Wt as ThemeSettingsTab,
262
262
  Jt as ThemesTab,
@@ -280,11 +280,11 @@ export {
280
280
  li as UserFederationLdapWizard,
281
281
  ci as UserFederationSection,
282
282
  pi as UserForm,
283
- Si as UserGroups,
284
- gi as UserIdentityProviderLinks,
285
- bi as UserIdpModal,
286
- mi as UserProfileAttributeListComponent,
287
- Ci as UserProfileContext,
283
+ gi as UserGroups,
284
+ Si as UserIdentityProviderLinks,
285
+ mi as UserIdpModal,
286
+ Ci as UserProfileAttributeListComponent,
287
+ bi as UserProfileContext,
288
288
  ui as UserProfileTab,
289
289
  fi as UserRegistration,
290
290
  Ai as UserRoleMapping,
@@ -297,18 +297,18 @@ export {
297
297
  yi as ViewHeader,
298
298
  Li as WhoAmIContextProvider,
299
299
  Ui as WizardSectionHeader,
300
- Ii as X509,
301
- Mi as fetchAdminUI,
300
+ Mi as X509,
301
+ Ii as fetchAdminUI,
302
302
  Gi as initAdminClient,
303
303
  hi as useAccess,
304
304
  Ei as useConfirmDialog,
305
305
  Ki as useEnvironment,
306
306
  wi as useErrorBoundary,
307
- zi as useRealm,
308
- ki as useRecentRealms,
309
- xi as useServerInfo,
310
- Oi as useSubGroups,
307
+ ki as useRealm,
308
+ zi as useRecentRealms,
309
+ Oi as useServerInfo,
310
+ xi as useSubGroups,
311
311
  Hi as useUserProfile,
312
- Vi as useWhoAmI
312
+ Bi as useWhoAmI
313
313
  };
314
314
  //# sourceMappingURL=keycloak-admin-ui.js.map
@@ -13,6 +13,8 @@ export declare enum Feature {
13
13
  OpenId4VCI = "OID4VC_VCI",
14
14
  QuickTheme = "QUICK_THEME",
15
15
  StandardTokenExchangeV2 = "TOKEN_EXCHANGE_STANDARD_V2",
16
- Passkeys = "PASSKEYS"
16
+ Passkeys = "PASSKEYS",
17
+ ClientAuthFederated = "CLIENT_AUTH_FEDERATED",
18
+ Workflows = "WORKFLOWS"
17
19
  }
18
20
  export default function useIsFeatureEnabled(): (feature: Feature) => boolean;
@@ -0,0 +1 @@
1
+ export default function CreateWorkflow(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function WorkflowsSection(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { Path } from 'react-router-dom';
2
+ import { AppRouteObject } from '../../routes';
3
+ export type AddWorkflowParams = {
4
+ realm: string;
5
+ };
6
+ export declare const AddWorkflowRoute: AppRouteObject;
7
+ export declare const toAddWorkflow: (params: AddWorkflowParams) => Partial<Path>;
@@ -0,0 +1,7 @@
1
+ import { Path } from 'react-router-dom';
2
+ import { AppRouteObject } from '../../routes';
3
+ export type WorkflowsParams = {
4
+ realm: string;
5
+ };
6
+ export declare const WorkflowsRoute: AppRouteObject;
7
+ export declare const toWorkflows: (params: WorkflowsParams) => Partial<Path>;
@@ -0,0 +1,3 @@
1
+ import { AppRouteObject } from '../routes';
2
+ declare const routes: AppRouteObject[];
3
+ export default routes;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keycloak/keycloak-admin-ui",
3
- "version": "26.3.5",
3
+ "version": "26.4.0",
4
4
  "type": "module",
5
5
  "main": "lib/keycloak-admin-ui.js",
6
6
  "types": "./lib/keycloak-admin-ui.d.ts",
@@ -67,6 +67,12 @@
67
67
  "../../libs/ui-shared:build",
68
68
  "../../libs/keycloak-admin-client:build"
69
69
  ]
70
+ },
71
+ "test:integration": {
72
+ "command": "playwright test",
73
+ "dependencies": [
74
+ "../../libs/keycloak-admin-client:build"
75
+ ]
70
76
  }
71
77
  },
72
78
  "dependencies": {
@@ -80,42 +86,42 @@
80
86
  "admin-ui": "file:",
81
87
  "file-saver": "^2.0.5",
82
88
  "flat": "^6.0.1",
83
- "i18next": "^25.2.1",
89
+ "i18next": "^25.5.2",
84
90
  "i18next-fetch-backend": "^6.0.0",
85
91
  "jszip": "^3.10.1",
86
92
  "keycloak-js": "^26.2.0",
87
93
  "lodash-es": "^4.17.21",
88
- "p-debounce": "^4.0.0",
94
+ "p-debounce": "^5.0.0",
89
95
  "react": "^18.3.1",
90
96
  "react-dom": "^18.3.1",
91
- "react-hook-form": "^7.59.0",
92
- "react-i18next": "^15.5.3",
97
+ "react-hook-form": "^7.63.0",
98
+ "react-i18next": "^15.7.3",
93
99
  "react-router-dom": "^6.30.1",
94
100
  "reactflow": "^11.11.4",
95
101
  "use-react-router-breadcrumbs": "^4.0.1",
96
- "@keycloak/keycloak-admin-client": "26.3.5",
97
- "@keycloak/keycloak-ui-shared": "26.3.5"
102
+ "@keycloak/keycloak-ui-shared": "26.4.0",
103
+ "@keycloak/keycloak-admin-client": "26.4.0"
98
104
  },
99
105
  "devDependencies": {
100
106
  "@axe-core/playwright": "^4.10.2",
101
- "@playwright/test": "^1.53.1",
102
- "@testing-library/dom": "^10.4.0",
103
- "@testing-library/jest-dom": "^6.6.3",
107
+ "@playwright/test": "^1.55.1",
108
+ "@testing-library/dom": "^10.4.1",
109
+ "@testing-library/jest-dom": "^6.8.0",
104
110
  "@testing-library/react": "^16.3.0",
105
- "@types/dagre": "^0.7.52",
111
+ "@types/dagre": "^0.7.53",
106
112
  "@types/file-saver": "^2.0.7",
107
113
  "@types/lodash-es": "^4.17.12",
108
114
  "@types/react": "^18.3.18",
109
115
  "@types/react-dom": "^18.3.5",
110
- "@vitejs/plugin-react-swc": "^3.10.2",
111
- "cross-env": "^7.0.3",
112
- "jsdom": "^26.1.0",
116
+ "@vitejs/plugin-react-swc": "^4.1.0",
117
+ "cross-env": "^10.0.0",
118
+ "jsdom": "^27.0.0",
113
119
  "lightningcss": "^1.30.1",
114
- "properties-file": "^3.5.12",
120
+ "properties-file": "^3.6.1",
115
121
  "ts-node": "^10.9.2",
116
- "uuid": "^11.1.0",
117
- "vite": "^7.0.0",
118
- "vite-plugin-checker": "^0.9.3",
122
+ "uuid": "^13.0.0",
123
+ "vite": "^7.1.6",
124
+ "vite-plugin-checker": "^0.10.3",
119
125
  "vite-plugin-dts": "^4.5.4",
120
126
  "vitest": "^3.2.4"
121
127
  },
@@ -126,6 +132,6 @@
126
132
  "preview": "wireit",
127
133
  "lint": "wireit",
128
134
  "test": "wireit",
129
- "test:integration": "playwright test"
135
+ "test:integration": "wireit"
130
136
  }
131
137
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"PermissionConfigurationDetails-BlV-QaHz.js","sources":["../src/permissions-configuration/permission-configuration/NewPermissionPolicyDialog.tsx","../src/permissions-configuration/permission-configuration/ExistingPoliciesDialog.tsx","../src/permissions-configuration/permission-configuration/AssignedPolicies.tsx","../src/permissions-configuration/permission-configuration/PermissionConfigurationDetails.tsx"],"sourcesContent":["import PolicyRepresentation, {\n DecisionStrategy,\n Logic,\n} from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport PolicyProviderRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyProviderRepresentation\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Modal,\n ModalVariant,\n TextContent,\n Text,\n TextVariants,\n ActionGroup,\n Button,\n Form,\n ButtonVariant,\n AlertVariant,\n} from \"@patternfly/react-core\";\nimport {\n SelectControl,\n TextControl,\n useAlerts,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { useRealm } from \"../../context/realm-context/RealmContext\";\nimport { Client } from \"../../clients/authorization/policy/Client\";\nimport { User } from \"../../clients/authorization/policy/User\";\nimport {\n ClientScope,\n RequiredIdValue,\n} from \"../../clients/authorization/policy/ClientScope\";\nimport { Group, GroupValue } from \"../../clients/authorization/policy/Group\";\nimport { Regex } from \"../../clients/authorization/policy/Regex\";\nimport { Role } from \"../../clients/authorization/policy/Role\";\nimport { Time } from \"../../clients/authorization/policy/Time\";\nimport { JavaScript } from \"../../clients/authorization/policy/JavaScript\";\nimport { LogicSelector } from \"../../clients/authorization/policy/LogicSelector\";\nimport { Aggregate } from \"../../clients/authorization/policy/Aggregate\";\nimport { capitalize } from \"lodash-es\";\nimport { useEffect, type JSX } from \"react\";\n\ntype Policy = Omit<PolicyRepresentation, \"roles\"> & {\n groups?: GroupValue[];\n clientScopes?: RequiredIdValue[];\n roles?: RequiredIdValue[];\n clients?: [];\n};\n\ntype ComponentsProps = {\n isPermissionClient?: boolean;\n permissionClientId: string;\n};\n\nconst defaultValues: Policy = {\n name: \"\",\n description: \"\",\n type: \"group\",\n policies: [],\n decisionStrategy: DecisionStrategy.UNANIMOUS,\n logic: Logic.POSITIVE,\n};\n\nconst COMPONENTS: {\n [index: string]: ({\n isPermissionClient,\n permissionClientId,\n }: ComponentsProps) => JSX.Element;\n} = {\n aggregate: Aggregate,\n client: Client,\n user: User,\n \"client-scope\": ClientScope,\n group: Group,\n regex: Regex,\n role: Role,\n time: Time,\n js: JavaScript,\n default: Group,\n} as const;\n\nexport const isValidComponentType = (value: string) => value in COMPONENTS;\n\ntype NewPermissionConfigurationDialogProps = {\n permissionClientId: string;\n providers: PolicyProviderRepresentation[];\n policies: PolicyRepresentation[];\n resourceType: string;\n toggleDialog: () => void;\n onAssign: (newPolicy: PolicyRepresentation) => void;\n};\n\nexport const NewPermissionPolicyDialog = ({\n permissionClientId,\n providers,\n policies,\n toggleDialog,\n onAssign,\n}: NewPermissionConfigurationDialogProps) => {\n const { adminClient } = useAdminClient();\n const { realmRepresentation } = useRealm();\n const { t } = useTranslation();\n const form = useForm<Policy>({\n mode: \"onChange\",\n defaultValues,\n });\n const { addAlert, addError } = useAlerts();\n const { handleSubmit, reset } = form;\n const isPermissionClient = realmRepresentation?.adminPermissionsEnabled;\n\n const policyTypeSelector = useWatch({\n control: form.control,\n name: \"type\",\n });\n\n function getComponentType() {\n if (policyTypeSelector && isValidComponentType(policyTypeSelector)) {\n return COMPONENTS[policyTypeSelector];\n }\n return COMPONENTS[\"default\"];\n }\n\n const ComponentType = getComponentType();\n\n useEffect(() => {\n if (policyTypeSelector) {\n const { name, description, decisionStrategy, logic } = form.getValues();\n\n reset({\n type: policyTypeSelector,\n name,\n description,\n decisionStrategy,\n logic,\n });\n }\n }, [policyTypeSelector, reset, form]);\n\n const save = async (policy: Policy) => {\n const { groups, roles, policies, clients, ...rest } = policy;\n\n const cleanedPolicy = {\n ...rest,\n ...(groups && groups.length > 0 && { groups }),\n ...(roles && roles.length > 0 && { roles }),\n ...(policies && policies.length > 0 && { policies }),\n ...(clients && clients.length > 0 && { clients }),\n ...(rest.type === \"group\" &&\n (!groups || groups.length === 0) && { groups: [] }),\n ...(rest.type === \"client\" &&\n (!clients || clients.length === 0) && { clients: [] }),\n };\n\n try {\n const createdPolicy = await adminClient.clients.createPolicy(\n { id: permissionClientId, type: policyTypeSelector! },\n cleanedPolicy,\n );\n\n onAssign(createdPolicy);\n toggleDialog();\n addAlert(t(\"createPolicySuccess\"), AlertVariant.success);\n } catch (error) {\n addError(\"policySaveError\", error);\n }\n };\n\n return (\n <Modal\n aria-label={t(\"createPermissionPolicy\")}\n variant={ModalVariant.medium}\n header={\n <TextContent>\n <Text component={TextVariants.h1}>{t(\"createPermissionPolicy\")}</Text>\n </TextContent>\n }\n isOpen\n onClose={toggleDialog}\n >\n <Form\n id=\"createPermissionPolicy-form\"\n onSubmit={(e) => {\n e.stopPropagation();\n handleSubmit(save)(e);\n }}\n isHorizontal\n >\n <FormProvider {...form}>\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl name=\"description\" label={t(\"description\")} />\n {providers && providers.length > 0 && (\n <SelectControl\n name=\"type\"\n label={t(\"policyType\")}\n labelIcon={t(\"policyTypeHelpText\")}\n options={providers.map((provider) => ({\n key: provider.type!,\n value: capitalize(provider.type!),\n }))}\n controller={{ defaultValue: \"\" }}\n />\n )}\n <ComponentType\n isPermissionClient={isPermissionClient}\n permissionClientId={permissionClientId}\n />\n <LogicSelector />\n </FormProvider>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n className=\"pf-v5-u-mr-md\"\n type=\"submit\"\n data-testid=\"save\"\n isDisabled={\n policies?.length === 0 && policyTypeSelector === \"aggregate\"\n }\n >\n {t(\"save\")}\n </Button>\n <Button variant=\"link\" data-testid=\"cancel\" onClick={toggleDialog}>\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </Form>\n </Modal>\n );\n};\n","import PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport { PolicyQuery } from \"@keycloak/keycloak-admin-client/lib/resources/clients\";\nimport {\n KeycloakDataTable,\n ListEmptyState,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n Button,\n ButtonVariant,\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n Modal,\n ModalVariant,\n} from \"@patternfly/react-core\";\nimport { CaretDownIcon, FilterIcon } from \"@patternfly/react-icons\";\nimport { sortBy } from \"lodash-es\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { capitalizeFirstLetterFormatter } from \"../../util\";\nimport useToggle from \"../../utils/useToggle\";\n\nexport type ExistingPoliciesDialogProps = {\n toggleDialog: () => void;\n onAssign: (policies: { policy: PolicyRepresentation }[]) => void;\n open: boolean;\n permissionClientId: string;\n};\n\nexport const ExistingPoliciesDialog = ({\n toggleDialog,\n onAssign,\n open,\n permissionClientId,\n}: ExistingPoliciesDialogProps) => {\n const { t } = useTranslation();\n const { adminClient } = useAdminClient();\n const [rows, setRows] = useState<PolicyRepresentation[]>([]);\n const [filterType, setFilterType] = useState<string | undefined>(undefined);\n const [isFilterTypeDropdownOpen, toggleIsFilterTypeDropdownOpen] =\n useToggle();\n const [providers, setProviders] = useState<string[]>([]);\n\n useFetch(\n () =>\n adminClient.clients.listPolicyProviders({\n id: permissionClientId!,\n }),\n (providers) => {\n const formattedProviders = providers\n .filter((p) => p.type !== \"resource\" && p.type !== \"scope\")\n .map((provider) => provider.name)\n .filter((name) => name !== undefined);\n setProviders(sortBy(formattedProviders));\n },\n [permissionClientId],\n );\n\n const loader = async (first?: number, max?: number, search?: string) => {\n const params: PolicyQuery = {\n id: permissionClientId!,\n permission: \"false\",\n first,\n max,\n };\n\n if (search) {\n params.name = search;\n }\n\n if (filterType) {\n params.type = filterType;\n }\n\n return (await adminClient.clients.listPolicies(params)) || [];\n };\n\n return (\n <Modal\n variant={ModalVariant.medium}\n title={t(\"assignExistingPolicies\")}\n isOpen={open}\n onClose={toggleDialog}\n actions={[\n <>\n <Button\n id=\"modal-assignExistingPolicies\"\n data-testid=\"confirm\"\n key=\"assign\"\n variant={ButtonVariant.primary}\n onClick={() => {\n const selectedPolicies = rows.map((policy) => ({ policy }));\n onAssign(selectedPolicies);\n toggleDialog();\n }}\n isDisabled={rows.length === 0}\n >\n {t(\"assign\")}\n </Button>\n <Button\n id=\"modal-cancelExistingPolicies\"\n data-testid=\"cancel\"\n key=\"cancel\"\n variant={ButtonVariant.link}\n onClick={() => {\n setRows([]);\n toggleDialog();\n }}\n >\n {t(\"cancel\")}\n </Button>\n </>,\n ]}\n >\n <KeycloakDataTable\n key={filterType}\n loader={loader}\n ariaLabelKey={t(\"chooseAPolicyType\")}\n searchPlaceholderKey={t(\"searchClientAuthorizationPolicy\")}\n isSearching={true}\n searchTypeComponent={\n <Dropdown\n onSelect={(_, value) => {\n setFilterType(value as string | undefined);\n toggleIsFilterTypeDropdownOpen();\n }}\n onOpenChange={toggleIsFilterTypeDropdownOpen}\n toggle={(ref) => (\n <MenuToggle\n ref={ref}\n data-testid=\"filter-type-dropdown-existingPolicies\"\n id=\"toggle-id-10\"\n onClick={toggleIsFilterTypeDropdownOpen}\n icon={<FilterIcon />}\n statusIcon={<CaretDownIcon />}\n >\n {filterType ? filterType : t(\"allTypes\")}\n </MenuToggle>\n )}\n isOpen={isFilterTypeDropdownOpen}\n >\n <DropdownList>\n <DropdownItem\n data-testid=\"filter-type-dropdown-existingPolicies-all\"\n key=\"all\"\n onClick={() => setFilterType(undefined)}\n >\n {t(\"allTypes\")}\n </DropdownItem>\n {providers.map((name) => (\n <DropdownItem\n data-testid={`filter-type-dropdown-existingPolicies-${name}`}\n key={name}\n onClick={() => setFilterType(name)}\n >\n {name}\n </DropdownItem>\n ))}\n </DropdownList>\n </Dropdown>\n }\n canSelectAll\n onSelect={(selectedRows) => setRows(selectedRows)}\n columns={[\n { name: \"name\" },\n {\n name: \"type\",\n cellFormatters: [capitalizeFirstLetterFormatter()],\n },\n { name: \"description\" },\n ]}\n emptyState={\n <ListEmptyState\n message={t(\"emptyAssignExistingPolicies\")}\n instructions={t(\"emptyAssignExistingPoliciesInstructions\")}\n />\n }\n />\n </Modal>\n );\n};\n","import PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport {\n Action,\n FormErrorText,\n HelpItem,\n KeycloakDataTable,\n ListEmptyState,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n Button,\n Dropdown,\n DropdownItem,\n DropdownList,\n FormGroup,\n MenuToggle,\n} 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 { NewPermissionPolicyDialog } from \"./NewPermissionPolicyDialog\";\nimport PolicyProviderRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyProviderRepresentation\";\nimport { ExistingPoliciesDialog } from \"./ExistingPoliciesDialog\";\nimport { CaretDownIcon, FilterIcon } from \"@patternfly/react-icons\";\nimport { capitalize, sortBy } from \"lodash-es\";\nimport useToggle from \"../../utils/useToggle\";\nimport { IRowData } from \"@patternfly/react-table\";\n\ntype AssignedPoliciesProps = {\n permissionClientId: string;\n providers: PolicyProviderRepresentation[];\n policies: PolicyRepresentation[] | undefined;\n resourceType: string;\n};\n\ntype AssignedPolicyForm = {\n policies?: { id: string; type?: string }[];\n};\n\nexport const AssignedPolicies = ({\n permissionClientId,\n providers,\n policies,\n resourceType,\n}: AssignedPoliciesProps) => {\n const { adminClient } = useAdminClient();\n const { t } = useTranslation();\n const {\n control,\n getValues,\n setValue,\n trigger,\n formState: { errors },\n } = useFormContext<AssignedPolicyForm>();\n const values = getValues(\"policies\");\n const [existingPoliciesOpen, setExistingPoliciesOpen] = useState(false);\n const [newPolicyOpen, setNewPolicyOpen] = useState(false);\n const [selectedPolicies, setSelectedPolicies] = useState<\n PolicyRepresentation[]\n >([]);\n const [filterType, setFilterType] = useState<string | undefined>(undefined);\n const [isFilterTypeDropdownOpen, toggleIsFilterTypeDropdownOpen] =\n useToggle();\n\n useFetch(\n () => {\n if (values && values.length > 0)\n return Promise.all(\n values.map((p) =>\n adminClient.clients.findOnePolicy({\n id: permissionClientId,\n type: p.type!,\n policyId: p.id,\n }),\n ),\n );\n return Promise.resolve([]);\n },\n (policies) => {\n const filteredPolicy = policies.filter((p) => p) as [];\n setSelectedPolicies(filteredPolicy);\n },\n [policies],\n );\n\n const sortedProviders = sortBy(\n providers\n ? providers\n .filter((p) => p.type !== \"resource\" && p.type !== \"scope\")\n .map((provider) => provider.name)\n : [],\n );\n\n const assign = (policies: { policy: PolicyRepresentation }[]) => {\n const assignedPolicies = policies.map(({ policy }) => ({\n id: policy.id!,\n }));\n\n setValue(\"policies\", [\n ...(getValues(\"policies\") || []),\n ...assignedPolicies,\n ]);\n trigger(\"policies\");\n setSelectedPolicies([\n ...selectedPolicies,\n ...policies.map(({ policy }) => policy),\n ]);\n };\n\n const unAssign = (policy: PolicyRepresentation) => {\n const updatedPolicies = selectedPolicies.filter(\n (selectedPolicy) => selectedPolicy.id !== policy.id,\n );\n setSelectedPolicies(updatedPolicies);\n setValue(\n \"policies\",\n updatedPolicies.map((policy) => ({\n id: policy.id!,\n name: policy.name!,\n type: policy.type!,\n description: policy.description!,\n })),\n );\n };\n\n const filteredPolicies = filterType\n ? selectedPolicies.filter(\n (policy) => capitalize(policy.type) === filterType,\n )\n : selectedPolicies;\n\n return (\n <FormGroup\n label={t(\"policies\")}\n labelIcon={\n <HelpItem\n helpText={t(\"permissionPoliciesHelp\")}\n fieldLabelId=\"policies\"\n />\n }\n fieldId=\"policies\"\n isRequired\n >\n <Controller\n name=\"policies\"\n control={control}\n defaultValue={[]}\n rules={{\n validate: (value?: { id: string }[]) => {\n if (!value || value.length === 0) return false;\n return value.every(({ id }) => id && id.trim().length > 0);\n },\n }}\n render={() => (\n <>\n {existingPoliciesOpen && (\n <ExistingPoliciesDialog\n permissionClientId={permissionClientId}\n open={existingPoliciesOpen}\n toggleDialog={() =>\n setExistingPoliciesOpen(!existingPoliciesOpen)\n }\n onAssign={assign}\n />\n )}\n {newPolicyOpen && (\n <NewPermissionPolicyDialog\n toggleDialog={() => setNewPolicyOpen(!newPolicyOpen)}\n permissionClientId={permissionClientId}\n providers={providers!}\n policies={policies!}\n resourceType={resourceType}\n onAssign={(newPolicy) => {\n assign([{ policy: newPolicy }]);\n }}\n />\n )}\n <Button\n data-testid=\"select-assignedPolicy-button\"\n variant=\"secondary\"\n onClick={() => {\n setExistingPoliciesOpen(true);\n }}\n >\n {t(\"assignExistingPolicies\")}\n </Button>\n <Button\n data-testid=\"select-createNewPolicy-button\"\n className=\"pf-v5-u-ml-md\"\n variant=\"secondary\"\n onClick={() => {\n setNewPolicyOpen(true);\n }}\n >\n {t(\"createNewPolicy\")}\n </Button>\n </>\n )}\n />\n {selectedPolicies.length > 0 && (\n <KeycloakDataTable\n loader={filteredPolicies}\n ariaLabelKey={t(\"policies\")}\n searchPlaceholderKey={t(\"searchClientAuthorizationPolicy\")}\n isSearching={true}\n searchTypeComponent={\n <Dropdown\n onSelect={(event, value) => {\n setFilterType(value as string | undefined);\n toggleIsFilterTypeDropdownOpen();\n }}\n onOpenChange={toggleIsFilterTypeDropdownOpen}\n toggle={(ref) => (\n <MenuToggle\n ref={ref}\n data-testid=\"filter-type-dropdown-existingPolicies\"\n id=\"toggle-id-10\"\n onClick={toggleIsFilterTypeDropdownOpen}\n icon={<FilterIcon />}\n statusIcon={<CaretDownIcon />}\n >\n {filterType ? capitalize(filterType) : t(\"allTypes\")}\n </MenuToggle>\n )}\n isOpen={isFilterTypeDropdownOpen}\n >\n <DropdownList>\n <DropdownItem\n data-testid=\"filter-type-dropdown-existingPolicies-all\"\n key=\"all\"\n onClick={() => setFilterType(undefined)}\n >\n {t(\"allTypes\")}\n </DropdownItem>\n {sortedProviders.map((name) => (\n <DropdownItem\n data-testid={`filter-type-dropdown-existingPolicies-${name}`}\n key={name}\n onClick={() => setFilterType(name)}\n >\n {name}\n </DropdownItem>\n ))}\n </DropdownList>\n </Dropdown>\n }\n actionResolver={(rowData: IRowData) => [\n {\n title: t(\"unAssignPolicy\"),\n onClick: () => unAssign(rowData.data as PolicyRepresentation),\n } as Action<PolicyRepresentation>,\n ]}\n columns={[\n { name: \"name\", displayKey: t(\"name\") },\n {\n name: \"type\",\n displayKey: t(\"type\"),\n cellFormatters: [(value) => capitalize(String(value || \"\"))],\n },\n { name: \"description\", displayKey: t(\"description\") },\n ]}\n emptyState={\n <ListEmptyState\n message={t(\"emptyAssignExistingPolicies\")}\n instructions={t(\"emptyAssignExistingPoliciesInstructions\")}\n />\n }\n />\n )}\n {errors.policies && <FormErrorText message={t(\"requiredPolicies\")} />}\n </FormGroup>\n );\n};\n","import PolicyProviderRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyProviderRepresentation\";\nimport { 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 { useMemo, 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 { 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 { useParams } from \"../../utils/useParams\";\nimport {\n PermissionConfigurationDetailsParams,\n toPermissionConfigurationDetails,\n} from \"../routes/PermissionConfigurationDetails\";\nimport { toPermissionsConfigurationTabs } from \"../routes/PermissionsConfigurationTabs\";\nimport PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport { AssignedPolicies } from \"./AssignedPolicies\";\nimport { ScopePicker } from \"../../clients/authorization/ScopePicker\";\nimport { ResourceType } from \"../resource-types/ResourceType\";\nimport { sortBy } from \"lodash-es\";\nimport { NameDescription } from \"../../clients/authorization/policy/NameDescription\";\nimport useSortedResourceTypes from \"../../utils/useSortedResourceTypes\";\n\nexport default function PermissionConfigurationDetails() {\n const { adminClient } = useAdminClient();\n const { t } = useTranslation();\n const { realm, permissionClientId, permissionId, resourceType } =\n useParams<PermissionConfigurationDetailsParams>();\n const navigate = useNavigate();\n const form = useForm();\n const { handleSubmit, reset } = form;\n const { addAlert, addError } = useAlerts();\n const [permission, setPermission] = useState<PolicyRepresentation>();\n const [providers, setProviders] = useState<PolicyProviderRepresentation[]>();\n const [policies, setPolicies] = useState<PolicyRepresentation[]>();\n const resourceTypes = useSortedResourceTypes({\n clientId: permissionClientId,\n });\n\n const resourceTypeScopes = useMemo(\n () =>\n resourceTypes\n .filter(({ type }) => type === resourceType)\n .flatMap(({ scopes = [] }) => scopes)\n .map((scope) => scope || \"\"),\n [resourceTypes, resourceType],\n );\n\n useFetch(\n async () => {\n if (!permissionClientId) {\n return {};\n }\n\n const [providers, policies] = await Promise.all([\n adminClient.clients.listPolicyProviders({ id: permissionClientId }),\n adminClient.clients.listPolicies({\n id: permissionClientId,\n permission: \"false\",\n }),\n ]);\n\n return { providers, policies };\n },\n ({ providers, policies }) => {\n const filteredProviders = providers?.filter(\n (p) => p.type !== \"resource\" && p.type !== \"scope\",\n );\n\n setProviders(\n sortBy(\n filteredProviders,\n (provider: PolicyProviderRepresentation) => provider.type,\n ),\n );\n setPolicies(policies || []);\n },\n [permissionClientId],\n );\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: permissionClientId,\n type: \"scope\",\n permissionId,\n }),\n adminClient.clients.getAssociatedResources({\n id: permissionClientId,\n permissionId,\n }),\n adminClient.clients.getAssociatedPolicies({\n id: permissionClientId,\n permissionId,\n }),\n adminClient.clients.getAssociatedScopes({\n id: permissionClientId,\n permissionId,\n }),\n ]);\n\n if (!permission) {\n throw new Error(t(\"notFound\"));\n }\n\n return {\n permission,\n resources,\n policies,\n scopes,\n };\n },\n ({ permission, resources, policies, scopes }) => {\n const resourceIds = resources?.map((resource) => resource.name!) || [];\n const policyIds = policies?.map((policy) => policy.id!) || [];\n const scopeNames = scopes?.map((scope) => scope.name) || [];\n\n reset({\n ...permission,\n resources: resourceIds!,\n policies,\n scopes,\n });\n\n setPermission({\n ...permission,\n resources: resourceIds!,\n policies: policyIds,\n scopes: scopeNames,\n });\n },\n [permissionClientId, permissionId],\n );\n\n const save = async (permission: PolicyRepresentation) => {\n try {\n const newPermission = {\n ...permission,\n policies: permission.policies?.map((policy: any) => policy.id),\n scopes: permission.scopes?.map((scope: any) => scope.name),\n resourceType: resourceType,\n };\n\n if (permissionId) {\n await adminClient.clients.updatePermission(\n { id: permissionClientId, type: \"scope\", permissionId },\n newPermission,\n );\n } else {\n const result = await adminClient.clients.createPermission(\n { id: permissionClientId, type: \"scope\" },\n newPermission,\n );\n setPermission(result);\n navigate(\n toPermissionConfigurationDetails({\n realm,\n permissionClientId: permissionClientId,\n permissionId: result.id!,\n resourceType,\n }),\n );\n }\n\n addAlert(\n t(permissionId ? \"updatePermissionSuccess\" : \"createPermissionSuccess\"),\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(\"deleteAdminPermissionConfirm\", {\n permission: permission?.name,\n }),\n continueButtonVariant: ButtonVariant.danger,\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delPermission({\n id: permissionClientId!,\n type: \"scope\",\n permissionId: permissionId,\n });\n addAlert(t(\"permissionDeletedSuccess\"), AlertVariant.success);\n navigate(\n toPermissionsConfigurationTabs({\n realm,\n permissionClientId,\n tab: \"permissions\",\n }),\n );\n } catch (error) {\n addError(\"permissionDeletedError\", error);\n }\n },\n });\n\n if (!permission) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={permissionId ? permission?.name! : t(\"createPermission\")}\n subKey={\n permissionId\n ? permission?.description!\n : t(\"createPermissionOfType\", { resourceType })\n }\n dropdownItems={\n permissionId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-permission\"\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormAccess isHorizontal onSubmit={handleSubmit(save)} role=\"anyone\">\n <FormProvider {...form}>\n <NameDescription clientId={permissionClientId} />\n <ScopePicker\n clientId={permissionClientId}\n resourceTypeScopes={resourceTypeScopes ?? []}\n />\n <ResourceType resourceType={resourceType} />\n <AssignedPolicies\n permissionClientId={permissionClientId}\n providers={providers!}\n policies={policies!}\n resourceType={resourceType}\n />\n </FormProvider>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n className=\"pf-v5-u-mr-md\"\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toPermissionsConfigurationTabs({\n realm,\n permissionClientId,\n tab: \"permissions\",\n })}\n />\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormAccess>\n </PageSection>\n </>\n );\n}\n"],"names":["defaultValues","DecisionStrategy","Logic","COMPONENTS","Aggregate","Client","User","ClientScope","Group","Regex","Role","Time","JavaScript","isValidComponentType","value","NewPermissionPolicyDialog","permissionClientId","providers","policies","toggleDialog","onAssign","adminClient","useAdminClient","realmRepresentation","useRealm","t","useTranslation","form","useForm","addAlert","addError","useAlerts","handleSubmit","reset","isPermissionClient","policyTypeSelector","useWatch","getComponentType","ComponentType","useEffect","name","description","decisionStrategy","logic","save","policy","groups","roles","clients","rest","cleanedPolicy","createdPolicy","AlertVariant","error","jsx","Modal","ModalVariant","TextContent","Text","TextVariants","jsxs","Form","e","FormProvider","TextControl","SelectControl","provider","capitalize","LogicSelector","ActionGroup","Button","ButtonVariant","ExistingPoliciesDialog","open","rows","setRows","useState","filterType","setFilterType","isFilterTypeDropdownOpen","toggleIsFilterTypeDropdownOpen","useToggle","setProviders","useFetch","formattedProviders","p","sortBy","loader","first","max","search","params","Fragment","selectedPolicies","KeycloakDataTable","Dropdown","_","ref","MenuToggle","FilterIcon","CaretDownIcon","DropdownList","DropdownItem","selectedRows","capitalizeFirstLetterFormatter","ListEmptyState","AssignedPolicies","resourceType","control","getValues","setValue","trigger","errors","useFormContext","values","existingPoliciesOpen","setExistingPoliciesOpen","newPolicyOpen","setNewPolicyOpen","setSelectedPolicies","filteredPolicy","sortedProviders","assign","assignedPolicies","unAssign","updatedPolicies","selectedPolicy","filteredPolicies","FormGroup","HelpItem","Controller","id","newPolicy","event","rowData","FormErrorText","PermissionConfigurationDetails","realm","permissionId","useParams","navigate","useNavigate","permission","setPermission","setPolicies","resourceTypes","useSortedResourceTypes","resourceTypeScopes","useMemo","type","scopes","scope","filteredProviders","resources","resourceIds","resource","policyIds","scopeNames","newPermission","result","toPermissionConfigurationDetails","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","toPermissionsConfigurationTabs","ViewHeader","PageSection","FormAccess","NameDescription","ScopePicker","ResourceType","props","Link","KeycloakSpinner"],"mappings":";;;;;;AAsDA,MAAMA,KAAwB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU,CAAA;AAAA,EACV,kBAAkBC,GAAiB;AAAA,EACnC,OAAOC,GAAM;AACf,GAEMC,IAKF;AAAA,EACF,WAAWC;AAAA,EACX,QAAQC;AAAA,EACR,MAAMC;AAAA,EACN,gBAAgBC;AAAA,EAChB,OAAOC;AAAA,EACP,OAAOC;AAAA,EACP,MAAMC;AAAA,EACN,MAAMC;AAAA,EACN,IAAIC;AAAA,EACJ,SAASJ;AACX,GAEaK,KAAuB,CAACC,MAAkBA,KAASX,GAWnDY,KAA4B,CAAC;AAAA,EACxC,oBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AACF,MAA6C;AAC3C,QAAM,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAClB,EAAE,qBAAAC,EAAA,IAAwBC,GAAA,GAC1B,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAOC,EAAgB;AAAA,IAC3B,MAAM;AAAA,IACN,eAAA5B;AAAA,EAAA,CACD,GACK,EAAE,UAAA6B,GAAU,UAAAC,EAAA,IAAaC,EAAA,GACzB,EAAE,cAAAC,GAAc,OAAAC,EAAA,IAAUN,GAC1BO,IAAqBX,GAAqB,yBAE1CY,IAAqBC,GAAS;AAAA,IAClC,SAAST,EAAK;AAAA,IACd,MAAM;AAAA,EAAA,CACP;AAED,WAASU,IAAmB;AAC1B,WAAIF,KAAsBtB,GAAqBsB,CAAkB,IACxDhC,EAAWgC,CAAkB,IAE/BhC,EAAW;AAAA,EAAS;AAG7B,QAAMmC,IAAgBD,EAAA;AAEtB,EAAAE,GAAU,MAAM;AACd,QAAIJ,GAAoB;AACtB,YAAM,EAAE,MAAAK,GAAM,aAAAC,GAAa,kBAAAC,GAAkB,OAAAC,EAAA,IAAUhB,EAAK,UAAA;AAE5D,MAAAM,EAAM;AAAA,QACJ,MAAME;AAAA,QACN,MAAAK;AAAA,QACA,aAAAC;AAAA,QACA,kBAAAC;AAAA,QACA,OAAAC;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EACH,GACC,CAACR,GAAoBF,GAAON,CAAI,CAAC;AAEpC,QAAMiB,IAAO,OAAOC,MAAmB;AACrC,UAAM,EAAE,QAAAC,GAAQ,OAAAC,GAAO,UAAA7B,GAAU,SAAA8B,GAAS,GAAGC,MAASJ,GAEhDK,IAAgB;AAAA,MACpB,GAAGD;AAAA,MACH,GAAIH,KAAUA,EAAO,SAAS,KAAK,EAAE,QAAAA,EAAA;AAAA,MACrC,GAAIC,KAASA,EAAM,SAAS,KAAK,EAAE,OAAAA,EAAA;AAAA,MACnC,GAAI7B,KAAYA,EAAS,SAAS,KAAK,EAAE,UAAAA,EAAAA;AAAAA,MACzC,GAAI8B,KAAWA,EAAQ,SAAS,KAAK,EAAE,SAAAA,EAAA;AAAA,MACvC,GAAIC,EAAK,SAAS,YACf,CAACH,KAAUA,EAAO,WAAW,MAAM,EAAE,QAAQ,CAAA,EAAC;AAAA,MACjD,GAAIG,EAAK,SAAS,aACf,CAACD,KAAWA,EAAQ,WAAW,MAAM,EAAE,SAAS,CAAA,EAAC;AAAA,IAAE;AAGxD,QAAI;AACF,YAAMG,IAAgB,MAAM9B,EAAY,QAAQ;AAAA,QAC9C,EAAE,IAAIL,GAAoB,MAAMmB,EAAA;AAAA,QAChCe;AAAA,MAAA;AAGF,MAAA9B,EAAS+B,CAAa,GACtBhC,EAAA,GACAU,EAASJ,EAAE,qBAAqB,GAAG2B,EAAa,OAAO;AAAA,IAAA,SAChDC,GAAO;AACd,MAAAvB,EAAS,mBAAmBuB,CAAK;AAAA,IAAA;AAAA,EACnC;AAGF,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,cAAY9B,EAAE,wBAAwB;AAAA,MACtC,SAAS+B,EAAa;AAAA,MACtB,QACE,gBAAAF,EAACG,IAAA,EACC,UAAA,gBAAAH,EAACI,IAAA,EAAK,WAAWC,GAAa,IAAK,UAAAlC,EAAE,wBAAwB,EAAA,CAAE,GACjE;AAAA,MAEF,QAAM;AAAA,MACN,SAASN;AAAA,MAET,UAAA,gBAAAyC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH,UAAU,CAACC,MAAM;AACf,YAAAA,EAAE,gBAAA,GACF9B,EAAaY,CAAI,EAAEkB,CAAC;AAAA,UAAA;AAAA,UAEtB,cAAY;AAAA,UAEZ,UAAA;AAAA,YAAA,gBAAAF,EAACG,GAAA,EAAc,GAAGpC,GAChB,UAAA;AAAA,cAAA,gBAAA2B;AAAA,gBAACU;AAAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOvC,EAAE,MAAM;AAAA,kBACf,OAAO,EAAE,UAAUA,EAAE,UAAU,EAAA;AAAA,gBAAE;AAAA,cAAA;AAAA,gCAElCuC,GAAA,EAAY,MAAK,eAAc,OAAOvC,EAAE,aAAa,GAAG;AAAA,cACxDR,KAAaA,EAAU,SAAS,KAC/B,gBAAAqC;AAAA,gBAACW;AAAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOxC,EAAE,YAAY;AAAA,kBACrB,WAAWA,EAAE,oBAAoB;AAAA,kBACjC,SAASR,EAAU,IAAI,CAACiD,OAAc;AAAA,oBACpC,KAAKA,EAAS;AAAA,oBACd,OAAOC,EAAWD,EAAS,IAAK;AAAA,kBAAA,EAChC;AAAA,kBACF,YAAY,EAAE,cAAc,GAAA;AAAA,gBAAG;AAAA,cAAA;AAAA,cAGnC,gBAAAZ;AAAA,gBAAChB;AAAA,gBAAA;AAAA,kBACC,oBAAAJ;AAAA,kBACA,oBAAAlB;AAAA,gBAAA;AAAA,cAAA;AAAA,gCAEDoD,IAAA,CAAA,CAAc;AAAA,YAAA,GACjB;AAAA,YACA,gBAAAd,EAACe,GAAA,EACC,UAAA,gBAAAT,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAACgB;AAAA,gBAAA;AAAA,kBACC,SAASC,EAAc;AAAA,kBACvB,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,eAAY;AAAA,kBACZ,YACErD,GAAU,WAAW,KAAKiB,MAAuB;AAAA,kBAGlD,YAAE,MAAM;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEX,gBAAAmB,EAACgB,GAAA,EAAO,SAAQ,QAAO,eAAY,UAAS,SAASnD,GAClD,UAAAM,EAAE,QAAQ,EAAA,CACb;AAAA,YAAA,EAAA,CACF,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN,GCzMa+C,KAAyB,CAAC;AAAA,EACrC,cAAArD;AAAA,EACA,UAAAC;AAAA,EACA,MAAAqD;AAAA,EACA,oBAAAzD;AACF,MAAmC;AACjC,QAAM,EAAE,GAAAS,EAAA,IAAMC,EAAA,GACR,EAAE,aAAAL,EAAA,IAAgBC,EAAA,GAClB,CAACoD,GAAMC,CAAO,IAAIC,EAAiC,CAAA,CAAE,GACrD,CAACC,GAAYC,CAAa,IAAIF,EAA6B,MAAS,GACpE,CAACG,GAA0BC,CAA8B,IAC7DC,EAAA,GACI,CAAChE,GAAWiE,CAAY,IAAIN,EAAmB,CAAA,CAAE;AAEvDO,EAAAA;AAAAA,IACE,MACE9D,EAAY,QAAQ,oBAAoB;AAAA,MACtC,IAAIL;AAAA,IAAA,CACL;AAAA,IACH,CAACC,MAAc;AACb,YAAMmE,IAAqBnE,EACxB,OAAO,CAACoE,MAAMA,EAAE,SAAS,cAAcA,EAAE,SAAS,OAAO,EACzD,IAAI,CAACnB,MAAaA,EAAS,IAAI,EAC/B,OAAO,CAAC1B,MAASA,MAAS,MAAS;AACtC,MAAA0C,EAAaI,EAAOF,CAAkB,CAAC;AAAA,IAAA;AAAA,IAEzC,CAACpE,CAAkB;AAAA,EAAA;AAGrB,QAAMuE,IAAS,OAAOC,GAAgBC,GAAcC,MAAoB;AACtE,UAAMC,IAAsB;AAAA,MAC1B,IAAI3E;AAAA,MACJ,YAAY;AAAA,MACZ,OAAAwE;AAAA,MACA,KAAAC;AAAA,IAAA;AAGF,WAAIC,MACFC,EAAO,OAAOD,IAGZb,MACFc,EAAO,OAAOd,IAGR,MAAMxD,EAAY,QAAQ,aAAasE,CAAM,KAAM,CAAA;AAAA,EAAC;AAG9D,SACE,gBAAArC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAASC,EAAa;AAAA,MACtB,OAAO/B,EAAE,wBAAwB;AAAA,MACjC,QAAQgD;AAAA,MACR,SAAStD;AAAA,MACT,SAAS;AAAA,QACP,gBAAAyC,EAAAgC,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAtC;AAAA,YAACgB;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,eAAY;AAAA,cAEZ,SAASC,EAAc;AAAA,cACvB,SAAS,MAAM;AACb,sBAAMsB,IAAmBnB,EAAK,IAAI,CAAC7B,OAAY,EAAE,QAAAA,IAAS;AAC1D,gBAAAzB,EAASyE,CAAgB,GACzB1E,EAAA;AAAA,cAAa;AAAA,cAEf,YAAYuD,EAAK,WAAW;AAAA,cAE3B,YAAE,QAAQ;AAAA,YAAA;AAAA,YATP;AAAA,UAAA;AAAA,UAWN,gBAAApB;AAAA,YAACgB;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,eAAY;AAAA,cAEZ,SAASC,EAAc;AAAA,cACvB,SAAS,MAAM;AACb,gBAAAI,EAAQ,CAAA,CAAE,GACVxD,EAAA;AAAA,cAAa;AAAA,cAGd,YAAE,QAAQ;AAAA,YAAA;AAAA,YAPP;AAAA,UAAA;AAAA,QAQN,EAAA,CACF;AAAA,MAAA;AAAA,MAGF,UAAA,gBAAAmC;AAAA,QAACwC;AAAAA,QAAA;AAAA,UAEC,QAAAP;AAAA,UACA,cAAc9D,EAAE,mBAAmB;AAAA,UACnC,sBAAsBA,EAAE,iCAAiC;AAAA,UACzD,aAAa;AAAA,UACb,qBACE,gBAAA6B;AAAA,YAACyC;AAAA,YAAA;AAAA,cACC,UAAU,CAACC,GAAGlF,MAAU;AACtB,gBAAAgE,EAAchE,CAA2B,GACzCkE,EAAA;AAAA,cAA+B;AAAA,cAEjC,cAAcA;AAAA,cACd,QAAQ,CAACiB,MACP,gBAAA3C;AAAA,gBAAC4C;AAAA,gBAAA;AAAA,kBACC,KAAAD;AAAA,kBACA,eAAY;AAAA,kBACZ,IAAG;AAAA,kBACH,SAASjB;AAAA,kBACT,wBAAOmB,IAAA,EAAW;AAAA,kBAClB,8BAAaC,IAAA,EAAc;AAAA,kBAE1B,UAAAvB,KAA0BpD,EAAE,UAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAG3C,QAAQsD;AAAA,cAER,4BAACsB,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAA/C;AAAA,kBAACgD;AAAA,kBAAA;AAAA,oBACC,eAAY;AAAA,oBAEZ,SAAS,MAAMxB,EAAc,MAAS;AAAA,oBAErC,YAAE,UAAU;AAAA,kBAAA;AAAA,kBAHT;AAAA,gBAAA;AAAA,gBAKL7D,EAAU,IAAI,CAACuB,MACd,gBAAAc;AAAA,kBAACgD;AAAA,kBAAA;AAAA,oBACC,eAAa,yCAAyC9D,CAAI;AAAA,oBAE1D,SAAS,MAAMsC,EAActC,CAAI;AAAA,oBAEhC,UAAAA;AAAA,kBAAA;AAAA,kBAHIA;AAAA,gBAAA,CAKR;AAAA,cAAA,EAAA,CACH;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJ,cAAY;AAAA,UACZ,UAAU,CAAC+D,MAAiB5B,EAAQ4B,CAAY;AAAA,UAChD,SAAS;AAAA,YACP,EAAE,MAAM,OAAA;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,gBAAgB,CAACC,GAAA,CAAgC;AAAA,YAAA;AAAA,YAEnD,EAAE,MAAM,cAAA;AAAA,UAAc;AAAA,UAExB,YACE,gBAAAlD;AAAA,YAACmD;AAAAA,YAAA;AAAA,cACC,SAAShF,EAAE,6BAA6B;AAAA,cACxC,cAAcA,EAAE,yCAAyC;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3D;AAAA,QA5DGoD;AAAA,MAAA;AAAA,IA8DP;AAAA,EAAA;AAGN,GC/Ia6B,KAAmB,CAAC;AAAA,EAC/B,oBAAA1F;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAyF;AACF,MAA6B;AAC3B,QAAM,EAAE,aAAAtF,EAAA,IAAgBC,EAAA,GAClB,EAAE,GAAAG,EAAA,IAAMC,EAAA,GACR;AAAA,IACJ,SAAAkF;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAW,EAAE,QAAAC,EAAA;AAAA,EAAO,IAClBC,GAAA,GACEC,IAASL,EAAU,UAAU,GAC7B,CAACM,GAAsBC,CAAuB,IAAIxC,EAAS,EAAK,GAChE,CAACyC,GAAeC,CAAgB,IAAI1C,EAAS,EAAK,GAClD,CAACiB,GAAkB0B,CAAmB,IAAI3C,EAE9C,CAAA,CAAE,GACE,CAACC,GAAYC,CAAa,IAAIF,EAA6B,MAAS,GACpE,CAACG,GAA0BC,CAA8B,IAC7DC,EAAA;AAEFE,EAAAA;AAAAA,IACE,MACM+B,KAAUA,EAAO,SAAS,IACrB,QAAQ;AAAA,MACbA,EAAO;AAAA,QAAI,CAAC7B,MACVhE,EAAY,QAAQ,cAAc;AAAA,UAChC,IAAIL;AAAA,UACJ,MAAMqE,EAAE;AAAA,UACR,UAAUA,EAAE;AAAA,QAAA,CACb;AAAA,MAAA;AAAA,IACH,IAEG,QAAQ,QAAQ,EAAE;AAAA,IAE3B,CAACnE,MAAa;AACZ,YAAMsG,IAAiBtG,EAAS,OAAO,CAACmE,MAAMA,CAAC;AAC/C,MAAAkC,EAAoBC,CAAc;AAAA,IAAA;AAAA,IAEpC,CAACtG,CAAQ;AAAA,EAAA;AAGX,QAAMuG,IAAkBnC;AAAA,IACtBrE,IACIA,EACG,OAAO,CAACoE,MAAMA,EAAE,SAAS,cAAcA,EAAE,SAAS,OAAO,EACzD,IAAI,CAACnB,MAAaA,EAAS,IAAI,IAClC,CAAA;AAAA,EAAC,GAGDwD,IAAS,CAACxG,MAAiD;AAC/D,UAAMyG,IAAmBzG,EAAS,IAAI,CAAC,EAAE,QAAA2B,SAAc;AAAA,MACrD,IAAIA,EAAO;AAAA,IAAA,EACX;AAEF,IAAAiE,EAAS,YAAY;AAAA,MACnB,GAAID,EAAU,UAAU,KAAK,CAAA;AAAA,MAC7B,GAAGc;AAAA,IAAA,CACJ,GACDZ,EAAQ,UAAU,GAClBQ,EAAoB;AAAA,MAClB,GAAG1B;AAAA,MACH,GAAG3E,EAAS,IAAI,CAAC,EAAE,QAAA2B,EAAA,MAAaA,CAAM;AAAA,IAAA,CACvC;AAAA,EAAA,GAGG+E,IAAW,CAAC/E,MAAiC;AACjD,UAAMgF,IAAkBhC,EAAiB;AAAA,MACvC,CAACiC,MAAmBA,EAAe,OAAOjF,EAAO;AAAA,IAAA;AAEnD,IAAA0E,EAAoBM,CAAe,GACnCf;AAAA,MACE;AAAA,MACAe,EAAgB,IAAI,CAAChF,OAAY;AAAA,QAC/B,IAAIA,EAAO;AAAA,QACX,MAAMA,EAAO;AAAA,QACb,MAAMA,EAAO;AAAA,QACb,aAAaA,EAAO;AAAA,MAAA,EACpB;AAAA,IAAA;AAAA,EACJ,GAGIkF,IAAmBlD,IACrBgB,EAAiB;AAAA,IACf,CAAChD,MAAWsB,EAAWtB,EAAO,IAAI,MAAMgC;AAAA,EAAA,IAE1CgB;AAEJ,SACE,gBAAAjC;AAAA,IAACoE;AAAA,IAAA;AAAA,MACC,OAAOvG,EAAE,UAAU;AAAA,MACnB,WACE,gBAAA6B;AAAA,QAAC2E;AAAAA,QAAA;AAAA,UACC,UAAUxG,EAAE,wBAAwB;AAAA,UACpC,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,MAGjB,SAAQ;AAAA,MACR,YAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAA6B;AAAA,UAAC4E;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAAtB;AAAA,YACA,cAAc,CAAA;AAAA,YACd,OAAO;AAAA,cACL,UAAU,CAAC9F,MACL,CAACA,KAASA,EAAM,WAAW,IAAU,KAClCA,EAAM,MAAM,CAAC,EAAE,IAAAqH,EAAA,MAASA,KAAMA,EAAG,KAAA,EAAO,SAAS,CAAC;AAAA,YAC3D;AAAA,YAEF,QAAQ,MACN,gBAAAvE,EAAAgC,GAAA,EACG,UAAA;AAAA,cAAAuB,KACC,gBAAA7D;AAAA,gBAACkB;AAAA,gBAAA;AAAA,kBACC,oBAAAxD;AAAA,kBACA,MAAMmG;AAAA,kBACN,cAAc,MACZC,EAAwB,CAACD,CAAoB;AAAA,kBAE/C,UAAUO;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGbL,KACC,gBAAA/D;AAAA,gBAACvC;AAAA,gBAAA;AAAA,kBACC,cAAc,MAAMuG,EAAiB,CAACD,CAAa;AAAA,kBACnD,oBAAArG;AAAA,kBACA,WAAAC;AAAA,kBACA,UAAAC;AAAA,kBACA,cAAAyF;AAAA,kBACA,UAAU,CAACyB,MAAc;AACvB,oBAAAV,EAAO,CAAC,EAAE,QAAQU,EAAA,CAAW,CAAC;AAAA,kBAAA;AAAA,gBAChC;AAAA,cAAA;AAAA,cAGJ,gBAAA9E;AAAA,gBAACgB;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,oBAAA8C,EAAwB,EAAI;AAAA,kBAAA;AAAA,kBAG7B,YAAE,wBAAwB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAE7B,gBAAA9D;AAAA,gBAACgB;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,oBAAAgD,EAAiB,EAAI;AAAA,kBAAA;AAAA,kBAGtB,YAAE,iBAAiB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACtB,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAGHzB,EAAiB,SAAS,KACzB,gBAAAvC;AAAA,UAACwC;AAAAA,UAAA;AAAA,YACC,QAAQiC;AAAA,YACR,cAActG,EAAE,UAAU;AAAA,YAC1B,sBAAsBA,EAAE,iCAAiC;AAAA,YACzD,aAAa;AAAA,YACb,qBACE,gBAAA6B;AAAA,cAACyC;AAAA,cAAA;AAAA,gBACC,UAAU,CAACsC,GAAOvH,MAAU;AAC1B,kBAAAgE,EAAchE,CAA2B,GACzCkE,EAAA;AAAA,gBAA+B;AAAA,gBAEjC,cAAcA;AAAA,gBACd,QAAQ,CAACiB,MACP,gBAAA3C;AAAA,kBAAC4C;AAAA,kBAAA;AAAA,oBACC,KAAAD;AAAA,oBACA,eAAY;AAAA,oBACZ,IAAG;AAAA,oBACH,SAASjB;AAAA,oBACT,wBAAOmB,IAAA,EAAW;AAAA,oBAClB,8BAAaC,IAAA,EAAc;AAAA,oBAE1B,UAAAvB,IAAaV,EAAWU,CAAU,IAAIpD,EAAE,UAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGvD,QAAQsD;AAAA,gBAER,4BAACsB,IAAA,EACC,UAAA;AAAA,kBAAA,gBAAA/C;AAAA,oBAACgD;AAAA,oBAAA;AAAA,sBACC,eAAY;AAAA,sBAEZ,SAAS,MAAMxB,EAAc,MAAS;AAAA,sBAErC,YAAE,UAAU;AAAA,oBAAA;AAAA,oBAHT;AAAA,kBAAA;AAAA,kBAKL2C,EAAgB,IAAI,CAACjF,MACpB,gBAAAc;AAAA,oBAACgD;AAAA,oBAAA;AAAA,sBACC,eAAa,yCAAyC9D,CAAI;AAAA,sBAE1D,SAAS,MAAMsC,EAActC,CAAI;AAAA,sBAEhC,UAAAA;AAAA,oBAAA;AAAA,oBAHIA;AAAA,kBAAA,CAKR;AAAA,gBAAA,EAAA,CACH;AAAA,cAAA;AAAA,YAAA;AAAA,YAGJ,gBAAgB,CAAC8F,MAAsB;AAAA,cACrC;AAAA,gBACE,OAAO7G,EAAE,gBAAgB;AAAA,gBACzB,SAAS,MAAMmG,EAASU,EAAQ,IAA4B;AAAA,cAAA;AAAA,YAC9D;AAAA,YAEF,SAAS;AAAA,cACP,EAAE,MAAM,QAAQ,YAAY7G,EAAE,MAAM,EAAA;AAAA,cACpC;AAAA,gBACE,MAAM;AAAA,gBACN,YAAYA,EAAE,MAAM;AAAA,gBACpB,gBAAgB,CAAC,CAACX,MAAUqD,EAAW,OAAOrD,KAAS,EAAE,CAAC,CAAC;AAAA,cAAA;AAAA,cAE7D,EAAE,MAAM,eAAe,YAAYW,EAAE,aAAa,EAAA;AAAA,YAAE;AAAA,YAEtD,YACE,gBAAA6B;AAAA,cAACmD;AAAAA,cAAA;AAAA,gBACC,SAAShF,EAAE,6BAA6B;AAAA,gBACxC,cAAcA,EAAE,yCAAyC;AAAA,cAAA;AAAA,YAAA;AAAA,UAC3D;AAAA,QAAA;AAAA,QAILuF,EAAO,YAAY,gBAAA1D,EAACiF,MAAc,SAAS9G,EAAE,kBAAkB,EAAA,CAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGzE;AChPA,SAAwB+G,KAAiC;AACvD,QAAM,EAAE,aAAAnH,EAAA,IAAgBC,EAAA,GAClB,EAAE,GAAAG,EAAA,IAAMC,EAAA,GACR,EAAE,OAAA+G,GAAO,oBAAAzH,GAAoB,cAAA0H,GAAc,cAAA/B,EAAA,IAC/CgC,GAAA,GACIC,IAAWC,GAAA,GACXlH,IAAOC,EAAA,GACP,EAAE,cAAAI,GAAc,OAAAC,EAAA,IAAUN,GAC1B,EAAE,UAAAE,GAAU,UAAAC,EAAA,IAAaC,EAAA,GACzB,CAAC+G,GAAYC,CAAa,IAAInE,EAAA,GAC9B,CAAC3D,GAAWiE,CAAY,IAAIN,EAAA,GAC5B,CAAC1D,GAAU8H,CAAW,IAAIpE,EAAA,GAC1BqE,IAAgBC,GAAuB;AAAA,IAC3C,UAAUlI;AAAA,EAAA,CACX,GAEKmI,IAAqBC;AAAA,IACzB,MACEH,EACG,OAAO,CAAC,EAAE,MAAAI,EAAA,MAAWA,MAAS1C,CAAY,EAC1C,QAAQ,CAAC,EAAE,QAAA2C,IAAS,CAAA,EAAC,MAAQA,CAAM,EACnC,IAAI,CAACC,MAAUA,KAAS,EAAE;AAAA,IAC/B,CAACN,GAAetC,CAAY;AAAA,EAAA;AAG9BxB,EAAAA;AAAAA,IACE,YAAY;AACV,UAAI,CAACnE;AACH,eAAO,CAAA;AAGT,YAAM,CAACC,GAAWC,CAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC9CG,EAAY,QAAQ,oBAAoB,EAAE,IAAIL,GAAoB;AAAA,QAClEK,EAAY,QAAQ,aAAa;AAAA,UAC/B,IAAIL;AAAA,UACJ,YAAY;AAAA,QAAA,CACb;AAAA,MAAA,CACF;AAED,aAAO,EAAE,WAAAC,GAAW,UAAAC,EAAAA;AAAAA,IAAS;AAAA,IAE/B,CAAC,EAAE,WAAAD,GAAW,UAAAC,QAAe;AAC3B,YAAMsI,IAAoBvI,GAAW;AAAA,QACnC,CAACoE,MAAMA,EAAE,SAAS,cAAcA,EAAE,SAAS;AAAA,MAAA;AAG7C,MAAAH;AAAA,QACEI;AAAA,UACEkE;AAAA,UACA,CAACtF,MAA2CA,EAAS;AAAA,QAAA;AAAA,MACvD,GAEF8E,EAAY9H,KAAY,EAAE;AAAA,IAAA;AAAA,IAE5B,CAACF,CAAkB;AAAA,EAAA,GAGrBmE;AAAAA,IACE,YAAY;AACV,UAAI,CAACuD;AACH,eAAO,CAAA;AAET,YAAM,CAACI,GAAYW,GAAWvI,GAAUoI,CAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClEjI,EAAY,QAAQ,kBAAkB;AAAA,UACpC,IAAIL;AAAA,UACJ,MAAM;AAAA,UACN,cAAA0H;AAAA,QAAA,CACD;AAAA,QACDrH,EAAY,QAAQ,uBAAuB;AAAA,UACzC,IAAIL;AAAA,UACJ,cAAA0H;AAAA,QAAA,CACD;AAAA,QACDrH,EAAY,QAAQ,sBAAsB;AAAA,UACxC,IAAIL;AAAA,UACJ,cAAA0H;AAAA,QAAA,CACD;AAAA,QACDrH,EAAY,QAAQ,oBAAoB;AAAA,UACtC,IAAIL;AAAA,UACJ,cAAA0H;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAED,UAAI,CAACI;AACH,cAAM,IAAI,MAAMrH,EAAE,UAAU,CAAC;AAG/B,aAAO;AAAA,QACL,YAAAqH;AAAAA,QACA,WAAAW;AAAA,QACA,UAAAvI;AAAAA,QACA,QAAAoI;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,CAAC,EAAE,YAAAR,GAAY,WAAAW,GAAW,UAAAvI,GAAU,QAAAoI,QAAa;AAC/C,YAAMI,IAAcD,GAAW,IAAI,CAACE,MAAaA,EAAS,IAAK,KAAK,CAAA,GAC9DC,IAAY1I,GAAU,IAAI,CAAC2B,MAAWA,EAAO,EAAG,KAAK,CAAA,GACrDgH,KAAaP,GAAQ,IAAI,CAACC,MAAUA,EAAM,IAAI,KAAK,CAAA;AAEzD,MAAAtH,EAAM;AAAA,QACJ,GAAG6G;AAAAA,QACH,WAAWY;AAAA,QACX,UAAAxI;AAAAA,QACA,QAAAoI;AAAA,MAAA,CACD,GAEDP,EAAc;AAAA,QACZ,GAAGD;AAAAA,QACH,WAAWY;AAAA,QACX,UAAUE;AAAA,QACV,QAAQC;AAAA,MAAA,CACT;AAAA,IAAA;AAAA,IAEH,CAAC7I,GAAoB0H,CAAY;AAAA,EAAA;AAGnC,QAAM9F,IAAO,OAAOkG,MAAqC;AACvD,QAAI;AACF,YAAMgB,IAAgB;AAAA,QACpB,GAAGhB;AAAAA,QACH,UAAUA,EAAW,UAAU,IAAI,CAACjG,MAAgBA,EAAO,EAAE;AAAA,QAC7D,QAAQiG,EAAW,QAAQ,IAAI,CAACS,MAAeA,EAAM,IAAI;AAAA,QACzD,cAAA5C;AAAA,MAAA;AAGF,UAAI+B;AACF,cAAMrH,EAAY,QAAQ;AAAA,UACxB,EAAE,IAAIL,GAAoB,MAAM,SAAS,cAAA0H,EAAA;AAAA,UACzCoB;AAAA,QAAA;AAAA,WAEG;AACL,cAAMC,IAAS,MAAM1I,EAAY,QAAQ;AAAA,UACvC,EAAE,IAAIL,GAAoB,MAAM,QAAA;AAAA,UAChC8I;AAAA,QAAA;AAEF,QAAAf,EAAcgB,CAAM,GACpBnB;AAAA,UACEoB,GAAiC;AAAA,YAC/B,OAAAvB;AAAA,YACA,oBAAAzH;AAAA,YACA,cAAc+I,EAAO;AAAA,YACrB,cAAApD;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,MACH;AAGF,MAAA9E;AAAA,QACEJ,EAAEiH,IAAe,4BAA4B,yBAAyB;AAAA,QACtEtF,EAAa;AAAA,MAAA;AAAA,IACf,SACOC,GAAO;AACd,MAAAvB,EAAS,uBAAuBuB,CAAK;AAAA,IAAA;AAAA,EACvC,GAGI,CAAC4G,GAAoBC,CAAa,IAAIC,GAAiB;AAAA,IAC3D,UAAU;AAAA,IACV,YAAY1I,EAAE,gCAAgC;AAAA,MAC5C,YAAYqH,GAAY;AAAA,IAAA,CACzB;AAAA,IACD,uBAAuBvE,EAAc;AAAA,IACrC,qBAAqB;AAAA,IACrB,WAAW,YAAY;AACrB,UAAI;AACF,cAAMlD,EAAY,QAAQ,cAAc;AAAA,UACtC,IAAIL;AAAA,UACJ,MAAM;AAAA,UACN,cAAA0H;AAAA,QAAA,CACD,GACD7G,EAASJ,EAAE,0BAA0B,GAAG2B,EAAa,OAAO,GAC5DwF;AAAA,UACEwB,EAA+B;AAAA,YAC7B,OAAA3B;AAAA,YACA,oBAAAzH;AAAA,YACA,KAAK;AAAA,UAAA,CACN;AAAA,QAAA;AAAA,MACH,SACOqC,GAAO;AACd,QAAAvB,EAAS,0BAA0BuB,CAAK;AAAA,MAAA;AAAA,IAC1C;AAAA,EACF,CACD;AAED,SAAKyF,IAKH,gBAAAlF,EAAAgC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAtC,EAAC4G,GAAA,EAAc;AAAA,IACf,gBAAA5G;AAAA,MAAC+G;AAAA,MAAA;AAAA,QACC,UAAU3B,IAAeI,GAAY,OAAQrH,EAAE,kBAAkB;AAAA,QACjE,QACEiH,IACII,GAAY,cACZrH,EAAE,0BAA0B,EAAE,cAAAkF,GAAc;AAAA,QAElD,eACE+B,IACI;AAAA,UACE,gBAAApF;AAAA,YAACgD;AAAA,YAAA;AAAA,cAEC,eAAY;AAAA,cACZ,SAAS,MAAM2D,EAAA;AAAA,cAEd,YAAE,QAAQ;AAAA,YAAA;AAAA,YAJP;AAAA,UAAA;AAAA,QAKN,IAEF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGR,gBAAA3G,EAACgH,IAAA,EAAY,SAAQ,SACnB,UAAA,gBAAA1G,EAAC2G,IAAA,EAAW,cAAY,IAAC,UAAUvI,EAAaY,CAAI,GAAG,MAAK,UAC1D,UAAA;AAAA,MAAA,gBAAAgB,EAACG,GAAA,EAAc,GAAGpC,GAChB,UAAA;AAAA,QAAA,gBAAA2B,EAACkH,IAAA,EAAgB,UAAUxJ,EAAA,CAAoB;AAAA,QAC/C,gBAAAsC;AAAA,UAACmH;AAAA,UAAA;AAAA,YACC,UAAUzJ;AAAA,YACV,oBAAoBmI,KAAsB,CAAA;AAAA,UAAC;AAAA,QAAA;AAAA,QAE7C,gBAAA7F,EAACoH,MAAa,cAAA/D,GAA4B;AAAA,QAC1C,gBAAArD;AAAA,UAACoD;AAAA,UAAA;AAAA,YACC,oBAAA1F;AAAA,YACA,WAAAC;AAAA,YACA,UAAAC;AAAA,YACA,cAAAyF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACF;AAAA,MACA,gBAAArD,EAACe,GAAA,EACC,UAAA,gBAAAT,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAACgB;AAAA,UAAA;AAAA,YACC,SAASC,EAAc;AAAA,YACvB,WAAU;AAAA,YACV,MAAK;AAAA,YACL,eAAY;AAAA,YAEX,YAAE,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAEX,gBAAAjB;AAAA,UAACgB;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,eAAY;AAAA,YACZ,WAAW,CAACqG,MACV,gBAAArH;AAAA,cAACsH;AAAA,cAAA;AAAA,gBACE,GAAGD;AAAA,gBACJ,IAAIP,EAA+B;AAAA,kBACjC,OAAA3B;AAAA,kBACA,oBAAAzH;AAAA,kBACA,KAAK;AAAA,gBAAA,CACN;AAAA,cAAA;AAAA,YAAA;AAAA,YAIJ,YAAE,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACb,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF,sBAzEQ6J,IAAA,EAAgB;AA2E5B;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RealmSection-BzcmhOlZ.js","sources":["../src/realm/RealmSection.tsx"],"sourcesContent":["import { NetworkError } from \"@keycloak/keycloak-admin-client\";\nimport { KeycloakDataTable, useAlerts } from \"@keycloak/keycloak-ui-shared\";\nimport {\n AlertVariant,\n Badge,\n Button,\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n PageSection,\n Popover,\n ToolbarItem,\n} from \"@patternfly/react-core\";\nimport { EllipsisVIcon } from \"@patternfly/react-icons\";\nimport { cellWidth } from \"@patternfly/react-table\";\nimport { useState } from \"react\";\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 { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { fetchAdminUI } from \"../context/auth/admin-ui-endpoint\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport { useRecentRealms } from \"../context/RecentRealms\";\nimport { useWhoAmI } from \"../context/whoami/WhoAmI\";\nimport { translationFormatter } from \"../utils/translationFormatter\";\nimport NewRealmForm from \"./add/NewRealmForm\";\nimport { toRealm } from \"./RealmRoutes\";\nimport { toDashboard } from \"../dashboard/routes/Dashboard\";\n\nexport type RealmNameRepresentation = {\n name: string;\n displayName?: string;\n};\n\nconst RecentRealmsDropdown = () => {\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const recentRealms = useRecentRealms();\n\n if (recentRealms.length < 3) return null;\n return (\n <Dropdown\n shouldFocusToggleOnSelect\n onOpenChange={(isOpen) => setOpen(isOpen)}\n toggle={(ref) => (\n <MenuToggle\n data-testid=\"kebab\"\n aria-label=\"Kebab toggle\"\n ref={ref}\n onClick={() => setOpen(!open)}\n >\n {t(\"recentRealms\")}\n </MenuToggle>\n )}\n isOpen={open}\n >\n <DropdownList>\n {recentRealms.map(({ name }) => (\n <DropdownItem\n key=\"server info\"\n component={(props) => (\n <Link {...props} to={toDashboard({ realm: name })} />\n )}\n >\n {name}\n </DropdownItem>\n ))}\n </DropdownList>\n </Dropdown>\n );\n};\n\ntype KebabDropdownProps = {\n onClick: () => void;\n isDisabled?: boolean;\n};\n\nconst KebabDropdown = ({ onClick, isDisabled }: KebabDropdownProps) => {\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n return (\n <Dropdown\n shouldFocusToggleOnSelect\n onOpenChange={(isOpen) => setOpen(isOpen)}\n toggle={(ref) => (\n <MenuToggle\n data-testid=\"kebab\"\n aria-label=\"Kebab toggle\"\n ref={ref}\n onClick={() => setOpen(!open)}\n variant=\"plain\"\n isDisabled={isDisabled}\n >\n <EllipsisVIcon />\n </MenuToggle>\n )}\n isOpen={open}\n >\n <DropdownList>\n <DropdownItem\n data-testid=\"delete\"\n onClick={() => {\n setOpen(false);\n onClick();\n }}\n >\n {t(\"delete\")}\n </DropdownItem>\n </DropdownList>\n </Dropdown>\n );\n};\n\ntype RealmRow = RealmNameRepresentation & { id: string };\n\nexport default function RealmSection() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { whoAmI } = useWhoAmI();\n const { realm } = useRealm();\n const { adminClient } = useAdminClient();\n const { addAlert, addError } = useAlerts();\n\n const [selected, setSelected] = useState<RealmRow[]>([]);\n const [openNewRealm, setOpenNewRealm] = useState(false);\n const [key, setKey] = useState(0);\n const refresh = () => setKey(key + 1);\n\n const loader = async (first?: number, max?: number, search?: string) => {\n try {\n const result = await fetchAdminUI<RealmNameRepresentation[]>(\n adminClient,\n \"ui-ext/realms/names\",\n { first: `${first}`, max: `${max}`, search: search || \"\" },\n );\n return result.map((r) => ({ ...r, id: r.name }));\n } catch (error) {\n if (error instanceof NetworkError && error.response.status < 500) {\n return [];\n }\n\n throw error;\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: t(\"deleteConfirmRealm\", {\n count: selected.length,\n name: selected[0]?.name,\n }),\n messageKey: \"deleteConfirmRealmSetting\",\n continueButtonLabel: \"delete\",\n onConfirm: async () => {\n try {\n if (selected.filter(({ name }) => name === \"master\").length > 0) {\n addAlert(t(\"cantDeleteMasterRealm\"), AlertVariant.warning);\n }\n const filtered = selected.filter(({ name }) => name !== \"master\");\n if (filtered.length === 0) return;\n await Promise.all(\n filtered.map(({ name: realmName }) =>\n adminClient.realms.del({ realm: realmName }),\n ),\n );\n addAlert(t(\"deletedSuccessRealmSetting\"));\n if (selected.filter(({ name }) => name === realm).length > 0) {\n navigate(toRealm({ realm: \"master\" }));\n }\n refresh();\n setSelected([]);\n } catch (error) {\n addError(\"deleteError\", error);\n }\n },\n });\n\n return (\n <>\n <DeleteConfirm />\n {openNewRealm && (\n <NewRealmForm\n onClose={() => {\n setOpenNewRealm(false);\n refresh();\n }}\n />\n )}\n <ViewHeader titleKey=\"manageRealms\" divider={false} />\n <PageSection variant=\"light\" className=\"pf-v5-u-p-0\">\n <KeycloakDataTable\n key={key}\n loader={loader}\n isPaginated\n onSelect={setSelected}\n canSelectAll\n ariaLabelKey=\"selectRealm\"\n searchPlaceholderKey=\"search\"\n actions={[\n {\n title: t(\"delete\"),\n onRowClick: (selected) => {\n setSelected([selected]);\n toggleDeleteDialog();\n },\n },\n ]}\n toolbarItem={\n <>\n <ToolbarItem>\n {whoAmI.canCreateRealm() && (\n <Button\n onClick={() => setOpenNewRealm(true)}\n data-testid=\"add-realm\"\n >\n {t(\"createRealm\")}\n </Button>\n )}\n </ToolbarItem>\n <ToolbarItem>\n <RecentRealmsDropdown />\n </ToolbarItem>\n <ToolbarItem>\n <KebabDropdown\n onClick={toggleDeleteDialog}\n isDisabled={selected.length === 0}\n />\n </ToolbarItem>\n </>\n }\n columns={[\n {\n name: \"name\",\n transforms: [cellWidth(20)],\n cellRenderer: ({ name }) =>\n name !== realm ? (\n <Link to={toDashboard({ realm: name })}>{name}</Link>\n ) : (\n <Popover\n bodyContent={t(\"currentRealmExplain\")}\n triggerAction=\"hover\"\n >\n <>\n {name} <Badge isRead>{t(\"currentRealm\")}</Badge>\n </>\n </Popover>\n ),\n },\n {\n name: \"displayName\",\n transforms: [cellWidth(80)],\n cellFormatters: [translationFormatter(t)],\n },\n ]}\n />\n </PageSection>\n </>\n );\n}\n"],"names":["RecentRealmsDropdown","t","useTranslation","open","setOpen","useState","recentRealms","useRecentRealms","jsx","Dropdown","isOpen","ref","MenuToggle","DropdownList","name","DropdownItem","props","Link","toDashboard","KebabDropdown","onClick","isDisabled","EllipsisVIcon","RealmSection","navigate","useNavigate","whoAmI","useWhoAmI","realm","useRealm","adminClient","useAdminClient","addAlert","addError","useAlerts","selected","setSelected","openNewRealm","setOpenNewRealm","key","setKey","refresh","loader","first","max","search","fetchAdminUI","r","error","NetworkError","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","AlertVariant","filtered","realmName","toRealm","jsxs","Fragment","NewRealmForm","ViewHeader","PageSection","KeycloakDataTable","ToolbarItem","Button","cellWidth","Popover","Badge","translationFormatter"],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare const KeycloakSpinner: () => import("react/jsx-runtime").JSX.Element;