@keycloak/keycloak-admin-ui 26.5.7 → 26.6.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 (84) hide show
  1. package/lib/.vite/manifest.json +40 -40
  2. package/lib/{AddJWTAuthorizationGrant-B9fNafs-.js → AddJWTAuthorizationGrant-CeMENUIM.js} +19 -19
  3. package/lib/{AddJWTAuthorizationGrant-B9fNafs-.js.map → AddJWTAuthorizationGrant-CeMENUIM.js.map} +1 -1
  4. package/lib/{AddKubernetesConnect-_-fIYkCu.js → AddKubernetesConnect-0RUT9aV2.js} +13 -13
  5. package/lib/{AddKubernetesConnect-_-fIYkCu.js.map → AddKubernetesConnect-0RUT9aV2.js.map} +1 -1
  6. package/lib/{AddOAuth2-GWdhXpZu.js → AddOAuth2-Cw67bzVu.js} +12 -12
  7. package/lib/{AddOAuth2-GWdhXpZu.js.map → AddOAuth2-Cw67bzVu.js.map} +1 -1
  8. package/lib/{AddSpiffeConnect-CEycf6Um.js → AddSpiffeConnect-Cd9x7mR2.js} +9 -9
  9. package/lib/{AddSpiffeConnect-CEycf6Um.js.map → AddSpiffeConnect-Cd9x7mR2.js.map} +1 -1
  10. package/lib/{CreateFlow-C1gSi1GV.js → CreateFlow-9cA71I0U.js} +10 -10
  11. package/lib/{CreateFlow-C1gSi1GV.js.map → CreateFlow-9cA71I0U.js.map} +1 -1
  12. package/lib/DetailOrganization-C14l_h62.js +204 -0
  13. package/lib/DetailOrganization-C14l_h62.js.map +1 -0
  14. package/lib/{ExecutorForm-D3r69dqU.js → ExecutorForm-BwTQyA36.js} +17 -17
  15. package/lib/{ExecutorForm-D3r69dqU.js.map → ExecutorForm-BwTQyA36.js.map} +1 -1
  16. package/lib/{FlowDetails-DNNCBfY5.js → FlowDetails-BpGnLs_D.js} +1998 -2039
  17. package/lib/FlowDetails-BpGnLs_D.js.map +1 -0
  18. package/lib/NewOrganization-SUmXcFih.js +36 -0
  19. package/lib/{NewOrganization-KSp9gXMo.js.map → NewOrganization-SUmXcFih.js.map} +1 -1
  20. package/lib/{PermissionConfigurationDetails-LVkEXehk.js → PermissionConfigurationDetails-B7AeRfGJ.js} +118 -118
  21. package/lib/{PermissionConfigurationDetails-LVkEXehk.js.map → PermissionConfigurationDetails-B7AeRfGJ.js.map} +1 -1
  22. package/lib/{PermissionDetails-DlPJ8m6r.js → PermissionDetails-CY6ytovN.js} +79 -79
  23. package/lib/{PermissionDetails-DlPJ8m6r.js.map → PermissionDetails-CY6ytovN.js.map} +1 -1
  24. package/lib/{RealmSection-BKt0CL1J.js → RealmSection-CMquQhw3.js} +26 -26
  25. package/lib/{RealmSection-BKt0CL1J.js.map → RealmSection-CMquQhw3.js.map} +1 -1
  26. package/lib/{ResourceDetails-CV230nyS.js → ResourceDetails-BsRxSUu-.js} +36 -36
  27. package/lib/ResourceDetails-BsRxSUu-.js.map +1 -0
  28. package/lib/{ScopeDetails-BleAAOMS.js → ScopeDetails-puMEG5G1.js} +27 -27
  29. package/lib/{ScopeDetails-BleAAOMS.js.map → ScopeDetails-puMEG5G1.js.map} +1 -1
  30. package/lib/{ScopePicker-BpZ35vej.js → ScopePicker-Bc9l9PJg.js} +15 -15
  31. package/lib/{ScopePicker-BpZ35vej.js.map → ScopePicker-Bc9l9PJg.js.map} +1 -1
  32. package/lib/WorkflowDetailForm-B-cQjnC9.js +147 -0
  33. package/lib/WorkflowDetailForm-B-cQjnC9.js.map +1 -0
  34. package/lib/{WorkflowsSection-C6tPZTDa.js → WorkflowsSection-BB9dHYmO.js} +20 -20
  35. package/lib/{WorkflowsSection-C6tPZTDa.js.map → WorkflowsSection-BB9dHYmO.js.map} +1 -1
  36. package/lib/client-scopes/details/oid4vciAttributes.d.ts +4 -0
  37. package/lib/clients/keys/Certificate.d.ts +3 -1
  38. package/lib/components/dynamic/MapComponent.d.ts +1 -1
  39. package/lib/components/key-value-form/KeyValueInput.d.ts +4 -1
  40. package/lib/components/realm-loa-mapping/RealmLoAMapping.d.ts +13 -0
  41. package/lib/components/role-mapping/queries.d.ts +1 -2
  42. package/lib/components/role-mapping/resource.d.ts +33 -0
  43. package/lib/components/view-header/ViewHeader.d.ts +2 -1
  44. package/lib/context/auth/admin-ui-endpoint.d.ts +1 -0
  45. package/lib/context/group-resource/GroupResourceContext.d.ts +9 -0
  46. package/lib/groups/GroupsSection.d.ts +3 -1
  47. package/lib/groups/MembersModal.d.ts +5 -1
  48. package/lib/groups/MembershipsModal.d.ts +2 -1
  49. package/lib/groups/routes/Groups.d.ts +3 -0
  50. package/lib/help-urls.d.ts +1 -0
  51. package/lib/i18n/constants.d.ts +1 -0
  52. package/lib/i18n/i18n.d.ts +0 -1
  53. package/lib/{index-D3mEQ9NL.js → index-iLxEY-Jz.js} +44585 -35236
  54. package/lib/{index-D3mEQ9NL.js.map → index-iLxEY-Jz.js.map} +1 -1
  55. package/lib/index.d.ts +6 -4
  56. package/lib/keycloak-admin-ui.css +1 -1
  57. package/lib/keycloak-admin-ui.js +298 -294
  58. package/lib/organizations/routes/EditOrganization.d.ts +1 -1
  59. package/lib/realm-settings/routes/ThemesTab.d.ts +1 -1
  60. package/lib/realm-settings/themes/BackgroundContext.d.ts +9 -0
  61. package/lib/realm-settings/themes/ColorControl.d.ts +8 -0
  62. package/lib/realm-settings/themes/DefaultColorAccordion.d.ts +7 -0
  63. package/lib/realm-settings/themes/FileNameDialog.d.ts +1 -1
  64. package/lib/realm-settings/themes/LoginPreviewWindow.d.ts +5 -0
  65. package/lib/realm-settings/themes/LoginThemeProperties.d.ts +63 -0
  66. package/lib/realm-settings/themes/PatternflyVars.d.ts +29 -8
  67. package/lib/realm-settings/themes/QuickTheme.d.ts +17 -0
  68. package/lib/realm-settings/themes/ThemeColors.d.ts +3 -3
  69. package/lib/realm-settings/themes/ThemesTab.d.ts +0 -6
  70. package/lib/realm-settings/themes/UploadJar.d.ts +1 -1
  71. package/lib/realm-settings/themes/fileUtils.d.ts +1 -0
  72. package/lib/user/UserWorkflows.d.ts +5 -0
  73. package/lib/user/routes/User.d.ts +1 -1
  74. package/lib/user/utils/user-profile.d.ts +10 -0
  75. package/lib/utils/useIsFeatureEnabled.d.ts +4 -1
  76. package/package.json +10 -9
  77. package/lib/DetailOrganization-CV52xkX3.js +0 -194
  78. package/lib/DetailOrganization-CV52xkX3.js.map +0 -1
  79. package/lib/FlowDetails-DNNCBfY5.js.map +0 -1
  80. package/lib/NewOrganization-KSp9gXMo.js +0 -36
  81. package/lib/ResourceDetails-CV230nyS.js.map +0 -1
  82. package/lib/WorkflowDetailForm-CH1O9UEB.js +0 -4938
  83. package/lib/WorkflowDetailForm-CH1O9UEB.js.map +0 -1
  84. package/lib/theme/login.css +0 -94
@@ -1,18 +1,18 @@
1
1
  import { jsxs as c, Fragment as D, jsx as t } from "react/jsx-runtime";
2
- import { u as w, ao as N, _ as z, S as F, b as k, y as C, aF as H, aq as l, V as U, K as P, P as V, F as q, c as x, Q as d, A as B, B as m, m as E, d as T } from "./index-D3mEQ9NL.js";
2
+ import { u as w, aq as N, q as z, U as F, b as H, n as U, aH as k, as as l, V as q, Q as C, P, F as V, c as x, X as d, A as B, B as m, l as E, e as T } from "./index-iLxEY-Jz.js";
3
3
  import { useState as j } from "react";
4
- import { useTranslation as K } from "react-i18next";
5
- import { useNavigate as Q, Link as _ } from "react-router-dom";
4
+ import { useTranslation as X } from "react-i18next";
5
+ import { useNavigate as G, Link as K } from "react-router-dom";
6
6
  function R() {
7
- const { adminClient: r } = w(), { t: e } = K(), { id: o, scopeId: i, realm: s } = N(), p = Q(), { addAlert: b, addError: v } = z(), [f, u] = F(), [n, h] = j(), g = k({
7
+ const { adminClient: r } = w(), { t: e } = X(), { id: i, scopeId: o, realm: s } = N(), p = G(), { addAlert: S, addError: v } = z(), [f, u] = F(), [n, h] = j(), g = H({
8
8
  mode: "onChange"
9
- }), { reset: S, handleSubmit: y } = g;
10
- C(
9
+ }), { reset: b, handleSubmit: y } = g;
10
+ U(
11
11
  async () => {
12
- if (i) {
12
+ if (o) {
13
13
  const a = await r.clients.getAuthorizationScope({
14
- id: o,
15
- scopeId: i
14
+ id: i,
15
+ scopeId: o
16
16
  });
17
17
  if (!a)
18
18
  throw new Error(e("notFound"));
@@ -20,24 +20,24 @@ function R() {
20
20
  }
21
21
  },
22
22
  (a) => {
23
- h(a), S({ ...a });
23
+ h(a), b({ ...a });
24
24
  },
25
25
  []
26
26
  );
27
27
  const A = async (a) => {
28
28
  try {
29
- i ? (await r.clients.updateAuthorizationScope(
30
- { id: o, scopeId: i },
29
+ o ? (await r.clients.updateAuthorizationScope(
30
+ { id: i, scopeId: o },
31
31
  a
32
32
  ), h(a)) : (await r.clients.createAuthorizationScope(
33
- { id: o },
33
+ { id: i },
34
34
  {
35
35
  name: a.name,
36
36
  displayName: a.displayName,
37
37
  iconUri: a.iconUri
38
38
  }
39
- ), p(l({ realm: s, clientId: o, tab: "scopes" }))), b(
40
- e((i ? "update" : "create") + "ScopeSuccess"),
39
+ ), p(l({ realm: s, clientId: i, tab: "scopes" }))), S(
40
+ e((o ? "update" : "create") + "ScopeSuccess"),
41
41
  T.success
42
42
  );
43
43
  } catch (I) {
@@ -46,22 +46,22 @@ function R() {
46
46
  };
47
47
  return /* @__PURE__ */ c(D, { children: [
48
48
  /* @__PURE__ */ t(
49
- H,
49
+ k,
50
50
  {
51
- clientId: o,
51
+ clientId: i,
52
52
  open: f,
53
53
  toggleDialog: u,
54
54
  selectedScope: n,
55
- refresh: () => p(l({ realm: s, clientId: o, tab: "scopes" }))
55
+ refresh: () => p(l({ realm: s, clientId: i, tab: "scopes" }))
56
56
  }
57
57
  ),
58
58
  /* @__PURE__ */ t(
59
- U,
59
+ q,
60
60
  {
61
- titleKey: i ? n?.name : e("createAuthorizationScope"),
62
- dropdownItems: i ? [
61
+ titleKey: o ? n?.name : e("createAuthorizationScope"),
62
+ dropdownItems: o ? [
63
63
  /* @__PURE__ */ t(
64
- P,
64
+ C,
65
65
  {
66
66
  "data-testid": "delete-resource",
67
67
  onClick: () => u(),
@@ -72,7 +72,7 @@ function R() {
72
72
  ] : void 0
73
73
  }
74
74
  ),
75
- /* @__PURE__ */ t(V, { variant: "light", children: /* @__PURE__ */ t(q, { ...g, children: /* @__PURE__ */ c(
75
+ /* @__PURE__ */ t(P, { variant: "light", children: /* @__PURE__ */ t(V, { ...g, children: /* @__PURE__ */ c(
76
76
  x,
77
77
  {
78
78
  isHorizontal: !0,
@@ -119,7 +119,7 @@ function R() {
119
119
  {
120
120
  variant: "link",
121
121
  "data-testid": "revert",
122
- onClick: () => S({ ...n }),
122
+ onClick: () => b({ ...n }),
123
123
  children: e("revert")
124
124
  }
125
125
  ) : /* @__PURE__ */ t(
@@ -128,12 +128,12 @@ function R() {
128
128
  variant: "link",
129
129
  "data-testid": "cancel",
130
130
  component: (a) => /* @__PURE__ */ t(
131
- _,
131
+ K,
132
132
  {
133
133
  ...a,
134
134
  to: l({
135
135
  realm: s,
136
- clientId: o,
136
+ clientId: i,
137
137
  tab: "scopes"
138
138
  })
139
139
  }
@@ -150,4 +150,4 @@ function R() {
150
150
  export {
151
151
  R as default
152
152
  };
153
- //# sourceMappingURL=ScopeDetails-BleAAOMS.js.map
153
+ //# sourceMappingURL=ScopeDetails-puMEG5G1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScopeDetails-BleAAOMS.js","sources":["../src/clients/authorization/ScopeDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport { TextControl, useAlerts, useFetch } from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useParams } from \"../../utils/useParams\";\nimport useToggle from \"../../utils/useToggle\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport type { ScopeDetailsParams } from \"../routes/Scope\";\nimport { DeleteScopeDialog } from \"./DeleteScopeDialog\";\n\ntype FormFields = Omit<ScopeRepresentation, \"resources\">;\n\nexport default function ScopeDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { id, scopeId, realm } = useParams<ScopeDetailsParams>();\n const navigate = useNavigate();\n const { addAlert, addError } = useAlerts();\n const [deleteDialog, toggleDeleteDialog] = useToggle();\n const [scope, setScope] = useState<ScopeRepresentation>();\n const form = useForm<FormFields>({\n mode: \"onChange\",\n });\n const { reset, handleSubmit } = form;\n\n useFetch(\n async () => {\n if (scopeId) {\n const scope = await adminClient.clients.getAuthorizationScope({\n id,\n scopeId,\n });\n if (!scope) {\n throw new Error(t(\"notFound\"));\n }\n return scope;\n }\n },\n (scope) => {\n setScope(scope);\n reset({ ...scope });\n },\n [],\n );\n\n const onSubmit = async (scope: ScopeRepresentation) => {\n try {\n if (scopeId) {\n await adminClient.clients.updateAuthorizationScope(\n { id, scopeId },\n scope,\n );\n setScope(scope);\n } else {\n await adminClient.clients.createAuthorizationScope(\n { id },\n {\n name: scope.name!,\n displayName: scope.displayName,\n iconUri: scope.iconUri,\n },\n );\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }));\n }\n addAlert(\n t((scopeId ? \"update\" : \"create\") + \"ScopeSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"scopeSaveError\", error);\n }\n };\n\n return (\n <>\n <DeleteScopeDialog\n clientId={id}\n open={deleteDialog}\n toggleDialog={toggleDeleteDialog}\n selectedScope={scope}\n refresh={() =>\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }))\n }\n />\n <ViewHeader\n titleKey={scopeId ? scope?.name! : t(\"createAuthorizationScope\")}\n dropdownItems={\n scopeId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n labelIcon={t(\"scopeNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"scopeDisplayNameHelp\")}\n />\n <TextControl\n name=\"iconUri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n />\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n {!scope ? (\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"scopes\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n ) : (\n <Button\n variant=\"link\"\n data-testid=\"revert\"\n onClick={() => reset({ ...scope })}\n >\n {t(\"revert\")}\n </Button>\n )}\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopeDetails","adminClient","useAdminClient","t","useTranslation","id","scopeId","realm","useParams","navigate","useNavigate","addAlert","addError","useAlerts","deleteDialog","toggleDeleteDialog","useToggle","scope","setScope","useState","form","useForm","reset","handleSubmit","useFetch","onSubmit","toAuthorizationTab","AlertVariant","error","jsxs","Fragment","jsx","DeleteScopeDialog","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","ActionGroup","Button","ButtonVariant","props","Link"],"mappings":";;;;;AAyBA,SAAwBA,IAAe;AACrC,QAAM,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAElB,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,IAAAC,GAAI,SAAAC,GAAS,OAAAC,EAAA,IAAUC,EAAA,GACzBC,IAAWC,EAAA,GACX,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaC,EAAA,GACzB,CAACC,GAAcC,CAAkB,IAAIC,EAAA,GACrC,CAACC,GAAOC,CAAQ,IAAIC,EAAA,GACpBC,IAAOC,EAAoB;AAAA,IAC/B,MAAM;AAAA,EAAA,CACP,GACK,EAAE,OAAAC,GAAO,cAAAC,EAAA,IAAiBH;AAEhCI,EAAAA;AAAAA,IACE,YAAY;AACV,UAAIlB,GAAS;AACX,cAAMW,IAAQ,MAAMhB,EAAY,QAAQ,sBAAsB;AAAA,UAC5D,IAAAI;AAAA,UACA,SAAAC;AAAA,QAAA,CACD;AACD,YAAI,CAACW;AACH,gBAAM,IAAI,MAAMd,EAAE,UAAU,CAAC;AAE/B,eAAOc;AAAAA,MACT;AAAA,IACF;AAAA,IACA,CAACA,MAAU;AACT,MAAAC,EAASD,CAAK,GACdK,EAAM,EAAE,GAAGL,GAAO;AAAA,IACpB;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMQ,IAAW,OAAOR,MAA+B;AACrD,QAAI;AACF,MAAIX,KACF,MAAML,EAAY,QAAQ;AAAA,QACxB,EAAE,IAAAI,GAAI,SAAAC,EAAA;AAAA,QACNW;AAAAA,MAAA,GAEFC,EAASD,CAAK,MAEd,MAAMhB,EAAY,QAAQ;AAAA,QACxB,EAAE,IAAAI,EAAA;AAAA,QACF;AAAA,UACE,MAAMY,EAAM;AAAA,UACZ,aAAaA,EAAM;AAAA,UACnB,SAASA,EAAM;AAAA,QAAA;AAAA,MACjB,GAEFR,EAASiB,EAAmB,EAAE,OAAAnB,GAAO,UAAUF,GAAI,KAAK,SAAA,CAAU,CAAC,IAErEM;AAAA,QACER,GAAGG,IAAU,WAAW,YAAY,cAAc;AAAA,QAClDqB,EAAa;AAAA,MAAA;AAAA,IAEjB,SAASC,GAAO;AACd,MAAAhB,EAAS,kBAAkBgB,CAAK;AAAA,IAClC;AAAA,EACF;AAEA,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,UAAU3B;AAAA,QACV,MAAMS;AAAA,QACN,cAAcC;AAAA,QACd,eAAeE;AAAA,QACf,SAAS,MACPR,EAASiB,EAAmB,EAAE,OAAAnB,GAAO,UAAUF,GAAI,KAAK,UAAU,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAGvE,gBAAA0B;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,UAAU3B,IAAUW,GAAO,OAAQd,EAAE,0BAA0B;AAAA,QAC/D,eACEG,IACI;AAAA,UACE,gBAAAyB;AAAA,YAACG;AAAA,YAAA;AAAA,cAEC,eAAY;AAAA,cACZ,SAAS,MAAMnB,EAAA;AAAA,cAEd,YAAE,QAAQ;AAAA,YAAA;AAAA,YAJP;AAAA,UAAA;AAAA,QAKN,IAEF;AAAA,MAAA;AAAA,IAAA;AAAA,sBAGPoB,GAAA,EAAY,SAAQ,SACnB,UAAA,gBAAAJ,EAACK,GAAA,EAAc,GAAGhB,GAChB,UAAA,gBAAAS;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,cAAY;AAAA,QACZ,MAAK;AAAA,QACL,UAAUd,EAAaE,CAAQ;AAAA,QAE/B,UAAA;AAAA,UAAA,gBAAAM;AAAA,YAACO;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOnC,EAAE,MAAM;AAAA,cACf,WAAWA,EAAE,eAAe;AAAA,cAC5B,OAAO,EAAE,UAAUA,EAAE,UAAU,EAAA;AAAA,YAAE;AAAA,UAAA;AAAA,UAEnC,gBAAA4B;AAAA,YAACO;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOnC,EAAE,aAAa;AAAA,cACtB,WAAWA,EAAE,sBAAsB;AAAA,YAAA;AAAA,UAAA;AAAA,UAErC,gBAAA4B;AAAA,YAACO;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOnC,EAAE,SAAS;AAAA,cAClB,WAAWA,EAAE,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAE5B,gBAAA4B,EAACQ,GAAA,EACC,UAAA,gBAAAV,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,YAAA,gBAAAE;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,SAASC,EAAc;AAAA,gBACvB,MAAK;AAAA,gBACL,eAAY;AAAA,gBAEX,YAAE,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAGTxB,IAkBA,gBAAAc;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,eAAY;AAAA,gBACZ,SAAS,MAAMlB,EAAM,EAAE,GAAGL,GAAO;AAAA,gBAEhC,YAAE,QAAQ;AAAA,cAAA;AAAA,YAAA,IAtBb,gBAAAc;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,eAAY;AAAA,gBACZ,WAAW,CAACE,MACV,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACE,GAAGD;AAAA,oBACJ,IAAIhB,EAAmB;AAAA,sBACrB,OAAAnB;AAAA,sBACA,UAAUF;AAAA,sBACV,KAAK;AAAA,oBAAA,CACN;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIJ,YAAE,QAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,UASb,EAAA,CAEJ,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEJ,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"ScopeDetails-puMEG5G1.js","sources":["../src/clients/authorization/ScopeDetails.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport { TextControl, useAlerts, useFetch } from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useParams } from \"../../utils/useParams\";\nimport useToggle from \"../../utils/useToggle\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport type { ScopeDetailsParams } from \"../routes/Scope\";\nimport { DeleteScopeDialog } from \"./DeleteScopeDialog\";\n\ntype FormFields = Omit<ScopeRepresentation, \"resources\">;\n\nexport default function ScopeDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { id, scopeId, realm } = useParams<ScopeDetailsParams>();\n const navigate = useNavigate();\n const { addAlert, addError } = useAlerts();\n const [deleteDialog, toggleDeleteDialog] = useToggle();\n const [scope, setScope] = useState<ScopeRepresentation>();\n const form = useForm<FormFields>({\n mode: \"onChange\",\n });\n const { reset, handleSubmit } = form;\n\n useFetch(\n async () => {\n if (scopeId) {\n const scope = await adminClient.clients.getAuthorizationScope({\n id,\n scopeId,\n });\n if (!scope) {\n throw new Error(t(\"notFound\"));\n }\n return scope;\n }\n },\n (scope) => {\n setScope(scope);\n reset({ ...scope });\n },\n [],\n );\n\n const onSubmit = async (scope: ScopeRepresentation) => {\n try {\n if (scopeId) {\n await adminClient.clients.updateAuthorizationScope(\n { id, scopeId },\n scope,\n );\n setScope(scope);\n } else {\n await adminClient.clients.createAuthorizationScope(\n { id },\n {\n name: scope.name!,\n displayName: scope.displayName,\n iconUri: scope.iconUri,\n },\n );\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }));\n }\n addAlert(\n t((scopeId ? \"update\" : \"create\") + \"ScopeSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"scopeSaveError\", error);\n }\n };\n\n return (\n <>\n <DeleteScopeDialog\n clientId={id}\n open={deleteDialog}\n toggleDialog={toggleDeleteDialog}\n selectedScope={scope}\n refresh={() =>\n navigate(toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }))\n }\n />\n <ViewHeader\n titleKey={scopeId ? scope?.name! : t(\"createAuthorizationScope\")}\n dropdownItems={\n scopeId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <TextControl\n name=\"name\"\n label={t(\"name\")}\n labelIcon={t(\"scopeNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"scopeDisplayNameHelp\")}\n />\n <TextControl\n name=\"iconUri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n />\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n {!scope ? (\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"scopes\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n ) : (\n <Button\n variant=\"link\"\n data-testid=\"revert\"\n onClick={() => reset({ ...scope })}\n >\n {t(\"revert\")}\n </Button>\n )}\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ScopeDetails","adminClient","useAdminClient","t","useTranslation","id","scopeId","realm","useParams","navigate","useNavigate","addAlert","addError","useAlerts","deleteDialog","toggleDeleteDialog","useToggle","scope","setScope","useState","form","useForm","reset","handleSubmit","useFetch","onSubmit","toAuthorizationTab","AlertVariant","error","jsxs","Fragment","jsx","DeleteScopeDialog","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","ActionGroup","Button","ButtonVariant","props","Link"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import { jsx as n, jsxs as q, Fragment as F } from "react/jsx-runtime";
2
- import { u as y, ak as I, aV as P, y as O, as as T, au as j, al as k, am as z, an as G, ax as L, a7 as R, a4 as V } from "./index-D3mEQ9NL.js";
1
+ import { jsx as n, jsxs as F, Fragment as q } from "react/jsx-runtime";
2
+ import { u as I, am as P, aY as z, n as O, au as T, aw as j, an as w, ao as y, ap as G, az as L, a7 as R, a4 as k } from "./index-iLxEY-Jz.js";
3
3
  import { useState as c } from "react";
4
- import { useTranslation as w } from "react-i18next";
5
- const D = ({
4
+ import { useTranslation as H } from "react-i18next";
5
+ const _ = ({
6
6
  clientId: m,
7
7
  resourceTypeScopes: r
8
8
  }) => {
9
- const { adminClient: S } = y(), { t: a } = w(), {
9
+ const { adminClient: S } = I(), { t: a } = H(), {
10
10
  control: f,
11
- formState: { errors: x }
12
- } = I(), [C, v] = c(!1), [p, A] = c(), [u, d] = c(""), o = P(m);
11
+ formState: { errors: C }
12
+ } = P(), [x, v] = c(!1), [p, A] = c(), [u, d] = c(""), o = z(m);
13
13
  O(
14
14
  () => {
15
15
  const e = {
@@ -24,7 +24,7 @@ const D = ({
24
24
  A,
25
25
  [u]
26
26
  );
27
- const h = (e) => e.map((t, s) => /* @__PURE__ */ n(V, { value: t, children: typeof t == "string" ? t : t.name }, s));
27
+ const h = (e) => e.map((t, s) => /* @__PURE__ */ n(k, { value: t, children: typeof t == "string" ? t : t.name }, s));
28
28
  if (!p && !r) return /* @__PURE__ */ n(T, {});
29
29
  const g = o && r ? r : p?.map((e) => e.name);
30
30
  return /* @__PURE__ */ n(
@@ -35,7 +35,7 @@ const D = ({
35
35
  fieldId: "scopes",
36
36
  isRequired: o,
37
37
  children: /* @__PURE__ */ n(
38
- k,
38
+ w,
39
39
  {
40
40
  name: "scopes",
41
41
  defaultValue: [],
@@ -43,9 +43,9 @@ const D = ({
43
43
  rules: o ? { required: a("requiredField") } : {},
44
44
  render: ({ field: e }) => {
45
45
  const t = e.value.map((s) => s.name);
46
- return /* @__PURE__ */ q(F, { children: [
46
+ return /* @__PURE__ */ F(q, { children: [
47
47
  /* @__PURE__ */ n(
48
- z,
48
+ y,
49
49
  {
50
50
  toggleId: "scopes",
51
51
  variant: G.typeaheadMulti,
@@ -55,7 +55,7 @@ const D = ({
55
55
  collapsedText: a("showRemaining")
56
56
  },
57
57
  onToggle: (s) => v(s),
58
- isOpen: C,
58
+ isOpen: x,
59
59
  selections: t,
60
60
  onFilter: (s) => (d(s), h(g || [])),
61
61
  onSelect: (s) => {
@@ -71,7 +71,7 @@ const D = ({
71
71
  children: h(g || [])
72
72
  }
73
73
  ),
74
- o && x.scopes && /* @__PURE__ */ n(L, { message: a("required") })
74
+ o && C.scopes && /* @__PURE__ */ n(L, { message: a("required") })
75
75
  ] });
76
76
  }
77
77
  }
@@ -80,6 +80,6 @@ const D = ({
80
80
  );
81
81
  };
82
82
  export {
83
- D as S
83
+ _ as S
84
84
  };
85
- //# sourceMappingURL=ScopePicker-BpZ35vej.js.map
85
+ //# sourceMappingURL=ScopePicker-Bc9l9PJg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScopePicker-BpZ35vej.js","sources":["../src/clients/authorization/ScopePicker.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n FormErrorText,\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { FormGroup, SelectOption } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { useIsAdminPermissionsClient } from \"../../utils/useIsAdminPermissionsClient\";\n\ntype Scope = {\n id: string;\n name: string;\n};\n\ntype ScopePickerProps = {\n clientId: string;\n resourceTypeScopes?: string[];\n};\n\nexport const ScopePicker = ({\n clientId,\n resourceTypeScopes,\n}: ScopePickerProps) => {\n const { adminClient } = useAdminClient();\n const { t } = useTranslation();\n const {\n control,\n formState: { errors },\n } = useFormContext();\n const [open, setOpen] = useState(false);\n const [scopes, setScopes] = useState<ScopeRepresentation[]>();\n const [search, setSearch] = useState(\"\");\n const isAdminPermissionsClient = useIsAdminPermissionsClient(clientId);\n\n useFetch(\n () => {\n const params = {\n id: clientId,\n first: 0,\n max: 20,\n deep: false,\n name: search,\n };\n return adminClient.clients.listAllScopes(params);\n },\n setScopes,\n [search],\n );\n\n const renderScopes = (scopes: ScopeRepresentation[] | string[]) =>\n scopes.map((option, index) => (\n <SelectOption key={index} value={option}>\n {typeof option === \"string\" ? option : option.name}\n </SelectOption>\n ));\n\n if (!scopes && !resourceTypeScopes) return <KeycloakSpinner />;\n\n const allScopes =\n isAdminPermissionsClient && resourceTypeScopes\n ? resourceTypeScopes\n : scopes?.map((scope) => scope.name!);\n\n return (\n <FormGroup\n label={t(\"authorizationScopes\")}\n labelIcon={\n <HelpItem helpText={t(\"clientScopesHelp\")} fieldLabelId=\"scopes\" />\n }\n fieldId=\"scopes\"\n isRequired={isAdminPermissionsClient}\n >\n <Controller\n name=\"scopes\"\n defaultValue={[]}\n control={control}\n rules={isAdminPermissionsClient ? { required: t(\"requiredField\") } : {}}\n render={({ field }) => {\n const selectedValues = field.value.map((o: Scope) => o.name);\n return (\n <>\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n chipGroupProps={{\n numChips: 3,\n expandedText: t(\"hide\"),\n collapsedText: t(\"showRemaining\"),\n }}\n onToggle={(val) => setOpen(val)}\n isOpen={open}\n selections={selectedValues}\n onFilter={(value) => {\n setSearch(value);\n return renderScopes(allScopes || []);\n }}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedValue\n : (selectedValue as Scope).name;\n const changedValue = field.value.find(\n (o: Scope) => o.name === option,\n )\n ? field.value.filter((item: Scope) => item.name !== option)\n : [...field.value, { name: option }];\n field.onChange(changedValue);\n }}\n onClear={() => {\n setSearch(\"\");\n field.onChange([]);\n }}\n typeAheadAriaLabel={t(\"authorizationScopes\")}\n >\n {renderScopes(allScopes || [])}\n </KeycloakSelect>\n {isAdminPermissionsClient && errors.scopes && (\n <FormErrorText message={t(\"required\")} />\n )}\n </>\n );\n }}\n />\n </FormGroup>\n );\n};\n"],"names":["ScopePicker","clientId","resourceTypeScopes","adminClient","useAdminClient","t","useTranslation","control","errors","useFormContext","open","setOpen","useState","scopes","setScopes","search","setSearch","isAdminPermissionsClient","useIsAdminPermissionsClient","useFetch","params","renderScopes","option","index","jsx","SelectOption","KeycloakSpinner","allScopes","scope","FormGroup","HelpItem","Controller","field","selectedValues","o","jsxs","Fragment","KeycloakSelect","SelectVariant","val","value","selectedValue","changedValue","item","FormErrorText"],"mappings":"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"}
1
+ {"version":3,"file":"ScopePicker-Bc9l9PJg.js","sources":["../src/clients/authorization/ScopePicker.tsx"],"sourcesContent":["import type ScopeRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/scopeRepresentation\";\nimport {\n FormErrorText,\n HelpItem,\n KeycloakSelect,\n SelectVariant,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { FormGroup, SelectOption } from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { useIsAdminPermissionsClient } from \"../../utils/useIsAdminPermissionsClient\";\n\ntype Scope = {\n id: string;\n name: string;\n};\n\ntype ScopePickerProps = {\n clientId: string;\n resourceTypeScopes?: string[];\n};\n\nexport const ScopePicker = ({\n clientId,\n resourceTypeScopes,\n}: ScopePickerProps) => {\n const { adminClient } = useAdminClient();\n const { t } = useTranslation();\n const {\n control,\n formState: { errors },\n } = useFormContext();\n const [open, setOpen] = useState(false);\n const [scopes, setScopes] = useState<ScopeRepresentation[]>();\n const [search, setSearch] = useState(\"\");\n const isAdminPermissionsClient = useIsAdminPermissionsClient(clientId);\n\n useFetch(\n () => {\n const params = {\n id: clientId,\n first: 0,\n max: 20,\n deep: false,\n name: search,\n };\n return adminClient.clients.listAllScopes(params);\n },\n setScopes,\n [search],\n );\n\n const renderScopes = (scopes: ScopeRepresentation[] | string[]) =>\n scopes.map((option, index) => (\n <SelectOption key={index} value={option}>\n {typeof option === \"string\" ? option : option.name}\n </SelectOption>\n ));\n\n if (!scopes && !resourceTypeScopes) return <KeycloakSpinner />;\n\n const allScopes =\n isAdminPermissionsClient && resourceTypeScopes\n ? resourceTypeScopes\n : scopes?.map((scope) => scope.name!);\n\n return (\n <FormGroup\n label={t(\"authorizationScopes\")}\n labelIcon={\n <HelpItem helpText={t(\"clientScopesHelp\")} fieldLabelId=\"scopes\" />\n }\n fieldId=\"scopes\"\n isRequired={isAdminPermissionsClient}\n >\n <Controller\n name=\"scopes\"\n defaultValue={[]}\n control={control}\n rules={isAdminPermissionsClient ? { required: t(\"requiredField\") } : {}}\n render={({ field }) => {\n const selectedValues = field.value.map((o: Scope) => o.name);\n return (\n <>\n <KeycloakSelect\n toggleId=\"scopes\"\n variant={SelectVariant.typeaheadMulti}\n chipGroupProps={{\n numChips: 3,\n expandedText: t(\"hide\"),\n collapsedText: t(\"showRemaining\"),\n }}\n onToggle={(val) => setOpen(val)}\n isOpen={open}\n selections={selectedValues}\n onFilter={(value) => {\n setSearch(value);\n return renderScopes(allScopes || []);\n }}\n onSelect={(selectedValue) => {\n const option =\n typeof selectedValue === \"string\"\n ? selectedValue\n : (selectedValue as Scope).name;\n const changedValue = field.value.find(\n (o: Scope) => o.name === option,\n )\n ? field.value.filter((item: Scope) => item.name !== option)\n : [...field.value, { name: option }];\n field.onChange(changedValue);\n }}\n onClear={() => {\n setSearch(\"\");\n field.onChange([]);\n }}\n typeAheadAriaLabel={t(\"authorizationScopes\")}\n >\n {renderScopes(allScopes || [])}\n </KeycloakSelect>\n {isAdminPermissionsClient && errors.scopes && (\n <FormErrorText message={t(\"required\")} />\n )}\n </>\n );\n }}\n />\n </FormGroup>\n );\n};\n"],"names":["ScopePicker","clientId","resourceTypeScopes","adminClient","useAdminClient","t","useTranslation","control","errors","useFormContext","open","setOpen","useState","scopes","setScopes","search","setSearch","isAdminPermissionsClient","useIsAdminPermissionsClient","useFetch","params","renderScopes","option","index","jsx","SelectOption","KeycloakSpinner","allScopes","scope","FormGroup","HelpItem","Controller","field","selectedValues","o","jsxs","Fragment","KeycloakSelect","SelectVariant","val","value","selectedValue","changedValue","item","FormErrorText"],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import { jsxs as c, Fragment as C, jsx as a } from "react/jsx-runtime";
2
+ import { u as W, a as D, q as F, aq as S, b as q, n as E, bM as m, V as I, F as N, P as V, c as j, aw as x, an as P, bN as G, a7 as H, A as R, t as T, B as p, bL as U, bO as k, e as y } from "./index-iLxEY-Jz.js";
3
+ import { useTranslation as B } from "react-i18next";
4
+ import { useNavigate as K, Link as h } from "react-router-dom";
5
+ function J() {
6
+ const { adminClient: i } = W(), { t } = B(), A = K(), { realm: n } = D(), { addAlert: d, addError: w } = F(), { mode: r, id: l } = S(), s = q({
7
+ mode: "onChange",
8
+ defaultValues: {
9
+ workflowYAML: ""
10
+ }
11
+ }), { control: b, handleSubmit: f, setValue: u } = s;
12
+ E(
13
+ async () => {
14
+ if (r !== "create")
15
+ return i.workflows.findOne({
16
+ id: l,
17
+ includeId: !1
18
+ });
19
+ },
20
+ (e) => {
21
+ if (!e)
22
+ return;
23
+ const o = { ...e };
24
+ r === "copy" && (delete o.id, o.name = `${e.name} -- ${t("copy")}`), u("workflowYAML", m.stringify(o));
25
+ },
26
+ [r, l, u, t]
27
+ );
28
+ const g = (e) => {
29
+ const o = m.parse(e);
30
+ if (!o.name)
31
+ throw new Error(t("workflowNameRequired"));
32
+ return o;
33
+ }, v = async (e) => {
34
+ try {
35
+ const o = g(e.workflowYAML);
36
+ await i.workflows.update({ id: l }, o), d(t("workflowUpdated"), y.success);
37
+ } catch (o) {
38
+ w("workflowUpdateError", o);
39
+ }
40
+ }, L = async (e) => {
41
+ try {
42
+ await i.workflows.createAsYaml({
43
+ realm: n,
44
+ yaml: e.workflowYAML
45
+ }), d(t("workflowCreated"), y.success), A(k({ realm: n }));
46
+ } catch (o) {
47
+ w("workflowCreateError", o);
48
+ }
49
+ }, M = {
50
+ copy: "copyWorkflow",
51
+ create: "createWorkflow",
52
+ update: "updateWorkflow"
53
+ }, Y = {
54
+ copy: "copyWorkflowDetails",
55
+ create: "createWorkflowDetails",
56
+ update: "updateWorkflowDetails"
57
+ };
58
+ return /* @__PURE__ */ c(C, { children: [
59
+ /* @__PURE__ */ a(I, { titleKey: M[r], subKey: Y[r] }),
60
+ /* @__PURE__ */ a(N, { ...s, children: /* @__PURE__ */ a(V, { variant: "light", children: /* @__PURE__ */ c(
61
+ j,
62
+ {
63
+ isHorizontal: !0,
64
+ onSubmit: f(r === "update" ? v : L),
65
+ role: "manage-realm",
66
+ className: "pf-v5-u-mt-lg",
67
+ fineGrainedAccess: !0,
68
+ children: [
69
+ /* @__PURE__ */ a(
70
+ x,
71
+ {
72
+ label: t("workflowYAML"),
73
+ labelIcon: /* @__PURE__ */ a(
74
+ H,
75
+ {
76
+ helpText: t("workflowYAMLHelp"),
77
+ fieldLabelId: "code"
78
+ }
79
+ ),
80
+ fieldId: "code",
81
+ isRequired: !0,
82
+ children: /* @__PURE__ */ a(
83
+ P,
84
+ {
85
+ name: "workflowYAML",
86
+ control: b,
87
+ render: ({ field: e }) => /* @__PURE__ */ a(
88
+ G,
89
+ {
90
+ id: "workflowYAML",
91
+ "data-testid": "workflowYAML",
92
+ value: e.value,
93
+ onChange: e.onChange,
94
+ language: "yaml",
95
+ height: 600
96
+ }
97
+ )
98
+ }
99
+ )
100
+ }
101
+ ),
102
+ /* @__PURE__ */ c(R, { children: [
103
+ /* @__PURE__ */ a(
104
+ T,
105
+ {
106
+ formState: s.formState,
107
+ "data-testid": "save",
108
+ allowInvalid: !0,
109
+ allowNonDirty: !0,
110
+ isDisabled: r === "create" && !s.formState.isDirty,
111
+ children: t(r === "update" ? "save" : "create")
112
+ }
113
+ ),
114
+ r === "update" && /* @__PURE__ */ a(
115
+ p,
116
+ {
117
+ "data-testid": "copy",
118
+ variant: "link",
119
+ component: (e) => /* @__PURE__ */ a(
120
+ h,
121
+ {
122
+ ...e,
123
+ to: U({ realm: n, mode: "copy", id: l })
124
+ }
125
+ ),
126
+ children: t("copy")
127
+ }
128
+ ),
129
+ /* @__PURE__ */ a(
130
+ p,
131
+ {
132
+ "data-testid": "cancel",
133
+ variant: "link",
134
+ component: (e) => /* @__PURE__ */ a(h, { ...e, to: k({ realm: n }) }),
135
+ children: t("cancel")
136
+ }
137
+ )
138
+ ] })
139
+ ]
140
+ }
141
+ ) }) })
142
+ ] });
143
+ }
144
+ export {
145
+ J as default
146
+ };
147
+ //# sourceMappingURL=WorkflowDetailForm-B-cQjnC9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowDetailForm-B-cQjnC9.js","sources":["../src/workflows/WorkflowDetailForm.tsx"],"sourcesContent":["import {\n ActionGroup,\n Button,\n FormGroup,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { AlertVariant } from \"@patternfly/react-core\";\nimport {\n Controller,\n FormProvider,\n SubmitHandler,\n useForm,\n} from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport yaml from \"yaml\";\nimport { useAdminClient } from \"../admin-client\";\nimport {\n HelpItem,\n FormSubmitButton,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport { FormAccess } from \"../components/form/FormAccess\";\nimport { toWorkflows } from \"./routes/Workflows\";\nimport CodeEditor from \"../components/form/CodeEditor\";\nimport { useParams } from \"../utils/useParams\";\nimport {\n WorkflowDetailParams,\n toWorkflowDetail,\n} from \"./routes/WorkflowDetail\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport WorkflowRepresentation from \"libs/keycloak-admin-client/lib/defs/workflowRepresentation\";\n\ntype AttributeForm = {\n workflowYAML: string;\n};\n\nexport default function WorkflowDetailForm() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { realm } = useRealm();\n const { addAlert, addError } = useAlerts();\n const { mode, id } = useParams<WorkflowDetailParams>();\n const form = useForm<AttributeForm>({\n mode: \"onChange\",\n defaultValues: {\n workflowYAML: \"\",\n },\n });\n const { control, handleSubmit, setValue } = form;\n\n useFetch(\n async () => {\n if (mode === \"create\") {\n return undefined;\n }\n return adminClient.workflows.findOne({\n id: id!,\n includeId: false,\n });\n },\n (workflow) => {\n if (!workflow) {\n return;\n }\n\n const workflowToSet = { ...workflow };\n if (mode === \"copy\") {\n delete workflowToSet.id;\n workflowToSet.name = `${workflow.name} -- ${t(\"copy\")}`;\n }\n\n setValue(\"workflowYAML\", yaml.stringify(workflowToSet));\n },\n [mode, id, setValue, t],\n );\n\n const validateworkflowYAML = (yamlStr: string): WorkflowRepresentation => {\n const json: WorkflowRepresentation = yaml.parse(yamlStr);\n if (!json.name) {\n throw new Error(t(\"workflowNameRequired\"));\n }\n return json;\n };\n\n const onUpdate: SubmitHandler<AttributeForm> = async (data) => {\n try {\n const json = validateworkflowYAML(data.workflowYAML);\n await adminClient.workflows.update({ id }, json);\n addAlert(t(\"workflowUpdated\"), AlertVariant.success);\n } catch (error) {\n addError(\"workflowUpdateError\", error);\n }\n };\n\n const onCreate: SubmitHandler<AttributeForm> = async (data) => {\n try {\n await adminClient.workflows.createAsYaml({\n realm,\n yaml: data.workflowYAML,\n });\n addAlert(t(\"workflowCreated\"), AlertVariant.success);\n navigate(toWorkflows({ realm }));\n } catch (error) {\n addError(\"workflowCreateError\", error);\n }\n };\n\n const titlekeyMap: Record<WorkflowDetailParams[\"mode\"], string> = {\n copy: \"copyWorkflow\",\n create: \"createWorkflow\",\n update: \"updateWorkflow\",\n };\n\n const subkeyMap: Record<WorkflowDetailParams[\"mode\"], string> = {\n copy: \"copyWorkflowDetails\",\n create: \"createWorkflowDetails\",\n update: \"updateWorkflowDetails\",\n };\n\n return (\n <>\n <ViewHeader titleKey={titlekeyMap[mode]} subKey={subkeyMap[mode]} />\n\n <FormProvider {...form}>\n <PageSection variant=\"light\">\n <FormAccess\n isHorizontal\n onSubmit={\n mode === \"update\"\n ? handleSubmit(onUpdate)\n : handleSubmit(onCreate)\n }\n role={\"manage-realm\"}\n className=\"pf-v5-u-mt-lg\"\n fineGrainedAccess={true}\n >\n <FormGroup\n label={t(\"workflowYAML\")}\n labelIcon={\n <HelpItem\n helpText={t(\"workflowYAMLHelp\")}\n fieldLabelId=\"code\"\n />\n }\n fieldId=\"code\"\n isRequired\n >\n <Controller\n name=\"workflowYAML\"\n control={control}\n render={({ field }) => (\n <CodeEditor\n id=\"workflowYAML\"\n data-testid=\"workflowYAML\"\n value={field.value}\n onChange={field.onChange}\n language=\"yaml\"\n height={600}\n />\n )}\n />\n </FormGroup>\n <ActionGroup>\n <FormSubmitButton\n formState={form.formState}\n data-testid=\"save\"\n allowInvalid\n allowNonDirty\n isDisabled={mode === \"create\" && !form.formState.isDirty}\n >\n {mode === \"update\" ? t(\"save\") : t(\"create\")}\n </FormSubmitButton>\n {mode === \"update\" && (\n <Button\n data-testid=\"copy\"\n variant=\"link\"\n component={(props) => (\n <Link\n {...props}\n to={toWorkflowDetail({ realm, mode: \"copy\", id: id! })}\n />\n )}\n >\n {t(\"copy\")}\n </Button>\n )}\n <Button\n data-testid=\"cancel\"\n variant=\"link\"\n component={(props) => (\n <Link {...props} to={toWorkflows({ realm })} />\n )}\n >\n {t(\"cancel\")}\n </Button>\n </ActionGroup>\n </FormAccess>\n </PageSection>\n </FormProvider>\n </>\n );\n}\n"],"names":["WorkflowDetailForm","adminClient","useAdminClient","useTranslation","navigate","useNavigate","realm","useRealm","addAlert","addError","useAlerts","mode","id","useParams","form","useForm","control","handleSubmit","setValue","useFetch","workflow","workflowToSet","yaml","validateworkflowYAML","yamlStr","json","onUpdate","data","AlertVariant","error","onCreate","toWorkflows","titlekeyMap","subkeyMap","jsxs","Fragment","jsx","ViewHeader","FormProvider","PageSection","FormAccess","FormGroup","HelpItem","Controller","field","CodeEditor","ActionGroup","FormSubmitButton","Button","props","Link","toWorkflowDetail"],"mappings":";;;;AAuCA,SAAwBA,IAAqB;AAC3C,QAAM,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAElB,EAAE,EAAA,IAAMC,EAAA,GACRC,IAAWC,EAAA,GACX,EAAE,OAAAC,EAAA,IAAUC,EAAA,GACZ,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaC,EAAA,GACzB,EAAE,MAAAC,GAAM,IAAAC,EAAA,IAAOC,EAAA,GACfC,IAAOC,EAAuB;AAAA,IAClC,MAAM;AAAA,IACN,eAAe;AAAA,MACb,cAAc;AAAA,IAAA;AAAA,EAChB,CACD,GACK,EAAE,SAAAC,GAAS,cAAAC,GAAc,UAAAC,EAAA,IAAaJ;AAE5CK,EAAAA;AAAAA,IACE,YAAY;AACV,UAAIR,MAAS;AAGb,eAAOV,EAAY,UAAU,QAAQ;AAAA,UACnC,IAAAW;AAAA,UACA,WAAW;AAAA,QAAA,CACZ;AAAA,IACH;AAAA,IACA,CAACQ,MAAa;AACZ,UAAI,CAACA;AACH;AAGF,YAAMC,IAAgB,EAAE,GAAGD,EAAA;AAC3B,MAAIT,MAAS,WACX,OAAOU,EAAc,IACrBA,EAAc,OAAO,GAAGD,EAAS,IAAI,OAAO,EAAE,MAAM,CAAC,KAGvDF,EAAS,gBAAgBI,EAAK,UAAUD,CAAa,CAAC;AAAA,IACxD;AAAA,IACA,CAACV,GAAMC,GAAIM,GAAU,CAAC;AAAA,EAAA;AAGxB,QAAMK,IAAuB,CAACC,MAA4C;AACxE,UAAMC,IAA+BH,EAAK,MAAME,CAAO;AACvD,QAAI,CAACC,EAAK;AACR,YAAM,IAAI,MAAM,EAAE,sBAAsB,CAAC;AAE3C,WAAOA;AAAA,EACT,GAEMC,IAAyC,OAAOC,MAAS;AAC7D,QAAI;AACF,YAAMF,IAAOF,EAAqBI,EAAK,YAAY;AACnD,YAAM1B,EAAY,UAAU,OAAO,EAAE,IAAAW,EAAA,GAAMa,CAAI,GAC/CjB,EAAS,EAAE,iBAAiB,GAAGoB,EAAa,OAAO;AAAA,IACrD,SAASC,GAAO;AACd,MAAApB,EAAS,uBAAuBoB,CAAK;AAAA,IACvC;AAAA,EACF,GAEMC,IAAyC,OAAOH,MAAS;AAC7D,QAAI;AACF,YAAM1B,EAAY,UAAU,aAAa;AAAA,QACvC,OAAAK;AAAA,QACA,MAAMqB,EAAK;AAAA,MAAA,CACZ,GACDnB,EAAS,EAAE,iBAAiB,GAAGoB,EAAa,OAAO,GACnDxB,EAAS2B,EAAY,EAAE,OAAAzB,EAAA,CAAO,CAAC;AAAA,IACjC,SAASuB,GAAO;AACd,MAAApB,EAAS,uBAAuBoB,CAAK;AAAA,IACvC;AAAA,EACF,GAEMG,IAA4D;AAAA,IAChE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAGJC,IAA0D;AAAA,IAC9D,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA;AAGV,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAW,UAAUL,EAAYrB,CAAI,GAAG,QAAQsB,EAAUtB,CAAI,GAAG;AAAA,sBAEjE2B,GAAA,EAAc,GAAGxB,GAChB,UAAA,gBAAAsB,EAACG,GAAA,EAAY,SAAQ,SACnB,UAAA,gBAAAL;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,cAAY;AAAA,QACZ,UAEMvB,EADJN,MAAS,WACQe,IACAI,CADQ;AAAA,QAG3B,MAAM;AAAA,QACN,WAAU;AAAA,QACV,mBAAmB;AAAA,QAEnB,UAAA;AAAA,UAAA,gBAAAM;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,cAAc;AAAA,cACvB,WACE,gBAAAL;AAAA,gBAACM;AAAAA,gBAAA;AAAA,kBACC,UAAU,EAAE,kBAAkB;AAAA,kBAC9B,cAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGjB,SAAQ;AAAA,cACR,YAAU;AAAA,cAEV,UAAA,gBAAAN;AAAA,gBAACO;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAA3B;AAAA,kBACA,QAAQ,CAAC,EAAE,OAAA4B,EAAA,MACT,gBAAAR;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,IAAG;AAAA,sBACH,eAAY;AAAA,sBACZ,OAAOD,EAAM;AAAA,sBACb,UAAUA,EAAM;AAAA,sBAChB,UAAS;AAAA,sBACT,QAAQ;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACV;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,4BAEDE,GAAA,EACC,UAAA;AAAA,YAAA,gBAAAV;AAAA,cAACW;AAAAA,cAAA;AAAA,gBACC,WAAWjC,EAAK;AAAA,gBAChB,eAAY;AAAA,gBACZ,cAAY;AAAA,gBACZ,eAAa;AAAA,gBACb,YAAYH,MAAS,YAAY,CAACG,EAAK,UAAU;AAAA,gBAEhD,UAAoB,QAAX,WAAa,SAAY,QAAN;AAAA,cAAc;AAAA,YAAA;AAAA,YAE5CH,MAAS,YACR,gBAAAyB;AAAA,cAACY;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,SAAQ;AAAA,gBACR,WAAW,CAACC,MACV,gBAAAb;AAAA,kBAACc;AAAA,kBAAA;AAAA,oBACE,GAAGD;AAAA,oBACJ,IAAIE,EAAiB,EAAE,OAAA7C,GAAO,MAAM,QAAQ,IAAAM,GAAS;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIxD,YAAE,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAGb,gBAAAwB;AAAA,cAACY;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,SAAQ;AAAA,gBACR,WAAW,CAACC,MACV,gBAAAb,EAACc,GAAA,EAAM,GAAGD,GAAO,IAAIlB,EAAY,EAAE,OAAAzB,EAAA,CAAO,EAAA,CAAG;AAAA,gBAG9C,YAAE,QAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,UACb,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEJ,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,13 +1,13 @@
1
- import { jsxs as y, Fragment as B, jsx as o } from "react/jsx-runtime";
2
- import { u as S, a as x, _ as A, aa as E, m as R, d as p, V as U, bH as V, P as I, a_ as P, v as L, bI as r, av as T, B as _ } from "./index-D3mEQ9NL.js";
1
+ import { jsxs as p, Fragment as B, jsx as o } from "react/jsx-runtime";
2
+ import { u as S, a as A, q as E, aa as R, l as U, e as y, V, bK as v, P as L, b1 as P, p as I, bL as r, ax as T, B as j } from "./index-iLxEY-Jz.js";
3
3
  import { useState as g } from "react";
4
- import { useTranslation as j } from "react-i18next";
5
- import { useNavigate as H, Link as b } from "react-router-dom";
6
- function z() {
7
- const { adminClient: l } = S(), { realm: a } = x(), { t } = j(), m = H(), { addAlert: w, addError: f } = A(), [u, h] = g(0), k = () => h(u + 1), [s, i] = g(), C = async () => (await l.workflows.find()).sort(
4
+ import { useTranslation as q } from "react-i18next";
5
+ import { useNavigate as N, Link as b } from "react-router-dom";
6
+ function G() {
7
+ const { adminClient: l } = S(), { realm: a } = A(), { t } = q(), m = N(), { addAlert: w, addError: f } = E(), [u, h] = g(0), k = () => h(u + 1), [s, i] = g(), C = async () => (await l.workflows.find()).sort(
8
8
  (d, n) => {
9
- const c = d.name ?? "", v = n.name ?? "";
10
- return c.localeCompare(v);
9
+ const c = d.name ?? "", x = n.name ?? "";
10
+ return c.localeCompare(x);
11
11
  }
12
12
  ), D = async (e) => {
13
13
  const d = !(e.enabled ?? !0), n = { ...e, enabled: d };
@@ -17,42 +17,42 @@ function z() {
17
17
  n
18
18
  ), w(
19
19
  n.enabled ? t("workflowEnabled") : t("workflowDisabled"),
20
- p.success
20
+ y.success
21
21
  ), k();
22
22
  } catch (c) {
23
23
  f("workflowUpdateError", c);
24
24
  }
25
- }, [K, W] = E({
25
+ }, [K, W] = R({
26
26
  titleKey: "workflowDeleteConfirm",
27
27
  messageKey: t("workflowDeleteConfirmDialog", {
28
28
  selectedRoleName: s ? s.name : ""
29
29
  }),
30
30
  continueButtonLabel: "delete",
31
- continueButtonVariant: R.danger,
31
+ continueButtonVariant: U.danger,
32
32
  onConfirm: async () => {
33
33
  try {
34
- await l.workflows.delById({ id: s.id }), i(void 0), w(t("workflowDeletedSuccess"), p.success), k();
34
+ await l.workflows.delById({ id: s.id }), i(void 0), w(t("workflowDeletedSuccess"), y.success), k();
35
35
  } catch (e) {
36
36
  f("workflowDeleteError", e);
37
37
  }
38
38
  }
39
39
  });
40
- return /* @__PURE__ */ y(B, { children: [
40
+ return /* @__PURE__ */ p(B, { children: [
41
41
  /* @__PURE__ */ o(
42
- U,
42
+ V,
43
43
  {
44
44
  titleKey: "titleWorkflows",
45
45
  subKey: "workflowsExplain",
46
- helpUrl: V.workflowsUrl
46
+ helpUrl: v.workflowsUrl
47
47
  }
48
48
  ),
49
- /* @__PURE__ */ y(I, { variant: "light", padding: { default: "noPadding" }, children: [
49
+ /* @__PURE__ */ p(L, { variant: "light", padding: { default: "noPadding" }, children: [
50
50
  /* @__PURE__ */ o(W, {}),
51
51
  /* @__PURE__ */ o(
52
52
  P,
53
53
  {
54
54
  toolbarItem: /* @__PURE__ */ o(
55
- _,
55
+ j,
56
56
  {
57
57
  "data-testid": "create-workflow",
58
58
  component: (e) => /* @__PURE__ */ o(
@@ -115,7 +115,7 @@ function z() {
115
115
  loader: C,
116
116
  ariaLabelKey: "workflows",
117
117
  emptyState: /* @__PURE__ */ o(
118
- L,
118
+ I,
119
119
  {
120
120
  message: t("emptyWorkflows"),
121
121
  instructions: t("emptyWorkflowsInstructions"),
@@ -130,6 +130,6 @@ function z() {
130
130
  ] });
131
131
  }
132
132
  export {
133
- z as default
133
+ G as default
134
134
  };
135
- //# sourceMappingURL=WorkflowsSection-C6tPZTDa.js.map
135
+ //# sourceMappingURL=WorkflowsSection-BB9dHYmO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsSection-C6tPZTDa.js","sources":["../src/workflows/WorkflowsSection.tsx"],"sourcesContent":["import {\n AlertVariant,\n Button,\n ButtonVariant,\n PageSection,\n Switch,\n} from \"@patternfly/react-core\";\nimport {\n Action,\n KeycloakDataTable,\n ListEmptyState,\n useAlerts,\n} from \"@keycloak/keycloak-ui-shared\";\nimport WorkflowRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/workflowRepresentation\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../admin-client\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport helpUrls from \"../help-urls\";\nimport { useConfirmDialog } from \"../components/confirm-dialog/ConfirmDialog\";\nimport { toWorkflowDetail } from \"./routes/WorkflowDetail\";\n\nexport default function WorkflowsSection() {\n const { adminClient } = useAdminClient();\n\n const { realm } = useRealm();\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { addAlert, addError } = useAlerts();\n\n const [key, setKey] = useState(0);\n const refresh = () => setKey(key + 1);\n\n const [selectedWorkflow, setSelectedWorkflow] =\n useState<WorkflowRepresentation>();\n\n const loader = async () => {\n const workflows = await adminClient.workflows.find();\n return workflows.sort(\n (a: WorkflowRepresentation, b: WorkflowRepresentation) => {\n const nameA = a.name ?? \"\";\n const nameB = b.name ?? \"\";\n return nameA.localeCompare(nameB);\n },\n );\n };\n\n const toggleEnabled = async (workflow: WorkflowRepresentation) => {\n const enabled = !(workflow.enabled ?? true);\n const workflowToUpdate = { ...workflow, enabled };\n try {\n await adminClient.workflows.update(\n { id: workflow.id! },\n workflowToUpdate,\n );\n\n addAlert(\n workflowToUpdate.enabled ? t(\"workflowEnabled\") : t(\"workflowDisabled\"),\n AlertVariant.success,\n );\n refresh();\n } catch (error) {\n addError(\"workflowUpdateError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"workflowDeleteConfirm\",\n messageKey: t(\"workflowDeleteConfirmDialog\", {\n selectedRoleName: selectedWorkflow ? selectedWorkflow!.name : \"\",\n }),\n continueButtonLabel: \"delete\",\n continueButtonVariant: ButtonVariant.danger,\n onConfirm: async () => {\n try {\n await adminClient.workflows.delById({ id: selectedWorkflow!.id! });\n setSelectedWorkflow(undefined);\n addAlert(t(\"workflowDeletedSuccess\"), AlertVariant.success);\n refresh();\n } catch (error) {\n addError(\"workflowDeleteError\", error);\n }\n },\n });\n\n return (\n <>\n <ViewHeader\n titleKey=\"titleWorkflows\"\n subKey=\"workflowsExplain\"\n helpUrl={helpUrls.workflowsUrl}\n />\n <PageSection variant=\"light\" padding={{ default: \"noPadding\" }}>\n <DeleteConfirm />\n <KeycloakDataTable\n key={key}\n toolbarItem={\n <Button\n data-testid=\"create-workflow\"\n component={(props) => (\n <Link\n {...props}\n to={toWorkflowDetail({ realm, mode: \"create\", id: \"new\" })}\n />\n )}\n >\n {t(\"createWorkflow\")}\n </Button>\n }\n columns={[\n {\n name: \"name\",\n displayKey: \"name\",\n cellRenderer: (row: WorkflowRepresentation) => (\n <Link\n to={toWorkflowDetail({ realm, mode: \"update\", id: row.id! })}\n >\n {row.name}\n </Link>\n ),\n },\n {\n name: \"id\",\n displayKey: \"id\",\n },\n {\n name: \"status\",\n displayKey: \"status\",\n cellRenderer: (workflow: WorkflowRepresentation) => (\n <Switch\n data-testid={`toggle-enabled-${workflow.name}`}\n label={t(\"enabled\")}\n labelOff={t(\"disabled\")}\n isChecked={workflow.enabled ?? true}\n onChange={() => toggleEnabled(workflow)}\n />\n ),\n },\n ]}\n actions={[\n {\n title: t(\"delete\"),\n onRowClick: (workflow) => {\n setSelectedWorkflow(workflow);\n toggleDeleteDialog();\n },\n } as Action<WorkflowRepresentation>,\n {\n title: t(\"copy\"),\n onRowClick: (workflow) => {\n setSelectedWorkflow(workflow);\n navigate(\n toWorkflowDetail({ realm, mode: \"copy\", id: workflow.id! }),\n );\n },\n } as Action<WorkflowRepresentation>,\n ]}\n loader={loader}\n ariaLabelKey=\"workflows\"\n emptyState={\n <ListEmptyState\n message={t(\"emptyWorkflows\")}\n instructions={t(\"emptyWorkflowsInstructions\")}\n primaryActionText={t(\"createWorkflow\")}\n onPrimaryAction={() =>\n navigate(toWorkflowDetail({ realm, mode: \"create\", id: \"new\" }))\n }\n />\n }\n />\n </PageSection>\n </>\n );\n}\n"],"names":["WorkflowsSection","adminClient","useAdminClient","realm","useRealm","useTranslation","navigate","useNavigate","addAlert","addError","useAlerts","key","setKey","useState","refresh","selectedWorkflow","setSelectedWorkflow","loader","a","b","nameA","nameB","toggleEnabled","workflow","enabled","workflowToUpdate","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","jsxs","Fragment","jsx","ViewHeader","helpUrls","PageSection","KeycloakDataTable","Button","props","Link","toWorkflowDetail","row","Switch","ListEmptyState"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowsSection-BB9dHYmO.js","sources":["../src/workflows/WorkflowsSection.tsx"],"sourcesContent":["import {\n AlertVariant,\n Button,\n ButtonVariant,\n PageSection,\n Switch,\n} from \"@patternfly/react-core\";\nimport {\n Action,\n KeycloakDataTable,\n ListEmptyState,\n useAlerts,\n} from \"@keycloak/keycloak-ui-shared\";\nimport WorkflowRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/workflowRepresentation\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../admin-client\";\nimport { ViewHeader } from \"../components/view-header/ViewHeader\";\nimport { useRealm } from \"../context/realm-context/RealmContext\";\nimport helpUrls from \"../help-urls\";\nimport { useConfirmDialog } from \"../components/confirm-dialog/ConfirmDialog\";\nimport { toWorkflowDetail } from \"./routes/WorkflowDetail\";\n\nexport default function WorkflowsSection() {\n const { adminClient } = useAdminClient();\n\n const { realm } = useRealm();\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { addAlert, addError } = useAlerts();\n\n const [key, setKey] = useState(0);\n const refresh = () => setKey(key + 1);\n\n const [selectedWorkflow, setSelectedWorkflow] =\n useState<WorkflowRepresentation>();\n\n const loader = async () => {\n const workflows = await adminClient.workflows.find();\n return workflows.sort(\n (a: WorkflowRepresentation, b: WorkflowRepresentation) => {\n const nameA = a.name ?? \"\";\n const nameB = b.name ?? \"\";\n return nameA.localeCompare(nameB);\n },\n );\n };\n\n const toggleEnabled = async (workflow: WorkflowRepresentation) => {\n const enabled = !(workflow.enabled ?? true);\n const workflowToUpdate = { ...workflow, enabled };\n try {\n await adminClient.workflows.update(\n { id: workflow.id! },\n workflowToUpdate,\n );\n\n addAlert(\n workflowToUpdate.enabled ? t(\"workflowEnabled\") : t(\"workflowDisabled\"),\n AlertVariant.success,\n );\n refresh();\n } catch (error) {\n addError(\"workflowUpdateError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"workflowDeleteConfirm\",\n messageKey: t(\"workflowDeleteConfirmDialog\", {\n selectedRoleName: selectedWorkflow ? selectedWorkflow!.name : \"\",\n }),\n continueButtonLabel: \"delete\",\n continueButtonVariant: ButtonVariant.danger,\n onConfirm: async () => {\n try {\n await adminClient.workflows.delById({ id: selectedWorkflow!.id! });\n setSelectedWorkflow(undefined);\n addAlert(t(\"workflowDeletedSuccess\"), AlertVariant.success);\n refresh();\n } catch (error) {\n addError(\"workflowDeleteError\", error);\n }\n },\n });\n\n return (\n <>\n <ViewHeader\n titleKey=\"titleWorkflows\"\n subKey=\"workflowsExplain\"\n helpUrl={helpUrls.workflowsUrl}\n />\n <PageSection variant=\"light\" padding={{ default: \"noPadding\" }}>\n <DeleteConfirm />\n <KeycloakDataTable\n key={key}\n toolbarItem={\n <Button\n data-testid=\"create-workflow\"\n component={(props) => (\n <Link\n {...props}\n to={toWorkflowDetail({ realm, mode: \"create\", id: \"new\" })}\n />\n )}\n >\n {t(\"createWorkflow\")}\n </Button>\n }\n columns={[\n {\n name: \"name\",\n displayKey: \"name\",\n cellRenderer: (row: WorkflowRepresentation) => (\n <Link\n to={toWorkflowDetail({ realm, mode: \"update\", id: row.id! })}\n >\n {row.name}\n </Link>\n ),\n },\n {\n name: \"id\",\n displayKey: \"id\",\n },\n {\n name: \"status\",\n displayKey: \"status\",\n cellRenderer: (workflow: WorkflowRepresentation) => (\n <Switch\n data-testid={`toggle-enabled-${workflow.name}`}\n label={t(\"enabled\")}\n labelOff={t(\"disabled\")}\n isChecked={workflow.enabled ?? true}\n onChange={() => toggleEnabled(workflow)}\n />\n ),\n },\n ]}\n actions={[\n {\n title: t(\"delete\"),\n onRowClick: (workflow) => {\n setSelectedWorkflow(workflow);\n toggleDeleteDialog();\n },\n } as Action<WorkflowRepresentation>,\n {\n title: t(\"copy\"),\n onRowClick: (workflow) => {\n setSelectedWorkflow(workflow);\n navigate(\n toWorkflowDetail({ realm, mode: \"copy\", id: workflow.id! }),\n );\n },\n } as Action<WorkflowRepresentation>,\n ]}\n loader={loader}\n ariaLabelKey=\"workflows\"\n emptyState={\n <ListEmptyState\n message={t(\"emptyWorkflows\")}\n instructions={t(\"emptyWorkflowsInstructions\")}\n primaryActionText={t(\"createWorkflow\")}\n onPrimaryAction={() =>\n navigate(toWorkflowDetail({ realm, mode: \"create\", id: \"new\" }))\n }\n />\n }\n />\n </PageSection>\n </>\n );\n}\n"],"names":["WorkflowsSection","adminClient","useAdminClient","realm","useRealm","useTranslation","navigate","useNavigate","addAlert","addError","useAlerts","key","setKey","useState","refresh","selectedWorkflow","setSelectedWorkflow","loader","a","b","nameA","nameB","toggleEnabled","workflow","enabled","workflowToUpdate","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","jsxs","Fragment","jsx","ViewHeader","helpUrls","PageSection","KeycloakDataTable","Button","props","Link","toWorkflowDetail","row","Switch","ListEmptyState"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ClientScopeDefaultOptionalType } from '../../components/client-scope/ClientScopeTypes';
2
+ export declare const OID4VC_ATTRIBUTE_KEYS: readonly ["vc.credential_configuration_id", "vc.credential_identifier", "vc.issuer_did", "vc.expiry_in_seconds", "vc.credential_build_config.token_jws_type", "vc.supported_credential_types", "vc.verifiable_credential_type", "vc.credential_build_config.sd_jwt.visible_claims", "vc.display", "vc.binding_required", "vc.binding_required_proof_types", "vc.cryptographic_binding_methods_supported"];
3
+ /** Prune known optional OID4VC attributes from the payload when they are empty. */
4
+ export declare const removeEmptyOid4vcAttributes: (values: ClientScopeDefaultOptionalType) => ClientScopeDefaultOptionalType;
@@ -5,7 +5,9 @@ type CertificateProps = Omit<CertificateDisplayProps, "id"> & {
5
5
  type CertificateDisplayProps = {
6
6
  id: string;
7
7
  helpTextKey?: string;
8
+ type?: "jwks" | "certificate" | "publicKey";
8
9
  keyInfo?: CertificateRepresentation;
9
10
  };
10
- export declare const Certificate: ({ helpTextKey, keyInfo, plain, }: CertificateProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const Certificate: ({ helpTextKey, type, keyInfo, plain, }: CertificateProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const KeyInfoArea: ({ type, keyInfo, ...rest }: CertificateProps) => import("react/jsx-runtime").JSX.Element;
11
13
  export {};
@@ -1,2 +1,2 @@
1
1
  import { ComponentProps } from './components';
2
- export declare const MapComponent: ({ name, label, helpText, required, isDisabled, defaultValue, convertToName, }: ComponentProps) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const MapComponent: ({ name, label, helpText, required, isDisabled, defaultValue, options, convertToName, }: ComponentProps) => import("react/jsx-runtime").JSX.Element;