@keycloak/keycloak-admin-ui 26.7.4 → 26.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/lib/.vite/manifest.json +52 -42
- package/lib/{AddDefaultTrust-DbbiiG4i.js → AddDefaultTrust-0TzkSSVz.js} +8 -8
- package/lib/{AddDefaultTrust-DbbiiG4i.js.map → AddDefaultTrust-0TzkSSVz.js.map} +1 -1
- package/lib/{AddJWTAuthorizationGrant-C-dtbDTh.js → AddJWTAuthorizationGrant-BBVNGscZ.js} +12 -12
- package/lib/{AddJWTAuthorizationGrant-C-dtbDTh.js.map → AddJWTAuthorizationGrant-BBVNGscZ.js.map} +1 -1
- package/lib/{AddKubernetesConnect-DcdkNZw-.js → AddKubernetesConnect-D_HJWqhs.js} +14 -11
- package/lib/AddKubernetesConnect-D_HJWqhs.js.map +1 -0
- package/lib/{AddOAuth2-D5paCYlN.js → AddOAuth2-BiNgjhyO.js} +13 -13
- package/lib/{AddOAuth2-D5paCYlN.js.map → AddOAuth2-BiNgjhyO.js.map} +1 -1
- package/lib/AddOid4Vp-gKawBcrP.js +73 -0
- package/lib/AddOid4Vp-gKawBcrP.js.map +1 -0
- package/lib/{AddSpiffeConnect-BA5o5iWQ.js → AddSpiffeConnect-BmHbvLbU.js} +8 -8
- package/lib/{AddSpiffeConnect-BA5o5iWQ.js.map → AddSpiffeConnect-BmHbvLbU.js.map} +1 -1
- package/lib/{CreateFlow-CsrOkWJK.js → CreateFlow-9Jjjw5b9.js} +2 -2
- package/lib/{CreateFlow-CsrOkWJK.js.map → CreateFlow-9Jjjw5b9.js.map} +1 -1
- package/lib/DetailOrganization-DZcO3bbq.js +420 -0
- package/lib/DetailOrganization-DZcO3bbq.js.map +1 -0
- package/lib/{ExecutorForm-Dhf61xr_.js → ExecutorForm-BrHBEQVA.js} +23 -23
- package/lib/{ExecutorForm-Dhf61xr_.js.map → ExecutorForm-BrHBEQVA.js.map} +1 -1
- package/lib/{FlowDetails-D66-ow3L.js → FlowDetails-FqkRF9Fk.js} +243 -226
- package/lib/{FlowDetails-D66-ow3L.js.map → FlowDetails-FqkRF9Fk.js.map} +1 -1
- package/lib/{NewOrganization-CstM2Q0Y.js → NewOrganization-mwmhTgBv.js} +13 -13
- package/lib/NewOrganization-mwmhTgBv.js.map +1 -0
- package/lib/{PermissionConfigurationDetails-DH5b34p8.js → PermissionConfigurationDetails-BWUvLMh4.js} +92 -91
- package/lib/PermissionConfigurationDetails-BWUvLMh4.js.map +1 -0
- package/lib/PermissionDetails-BkVFczt9.js +437 -0
- package/lib/PermissionDetails-BkVFczt9.js.map +1 -0
- package/lib/{RealmSection-DcQUYY0v.js → RealmSection-DJ8T80Z6.js} +26 -26
- package/lib/{RealmSection-DcQUYY0v.js.map → RealmSection-DJ8T80Z6.js.map} +1 -1
- package/lib/{ResourceDetails-DpRkk4_g.js → ResourceDetails-Cyb5CmVt.js} +24 -24
- package/lib/{ResourceDetails-DpRkk4_g.js.map → ResourceDetails-Cyb5CmVt.js.map} +1 -1
- package/lib/{ScopeDetails-BbT6mJGv.js → ScopeDetails-BV7h3hMw.js} +17 -17
- package/lib/{ScopeDetails-BbT6mJGv.js.map → ScopeDetails-BV7h3hMw.js.map} +1 -1
- package/lib/{ScopePicker-CPAN5Qis.js → ScopePicker-USX1qW3k.js} +18 -18
- package/lib/{ScopePicker-CPAN5Qis.js.map → ScopePicker-USX1qW3k.js.map} +1 -1
- package/lib/{WorkflowDetailForm-Cr5DYK4G.js → WorkflowDetailForm-BDIXzgoJ.js} +31 -31
- package/lib/{WorkflowDetailForm-Cr5DYK4G.js.map → WorkflowDetailForm-BDIXzgoJ.js.map} +1 -1
- package/lib/{WorkflowsSection-CyUnAYVa.js → WorkflowsSection-Htg3cqfo.js} +16 -16
- package/lib/{WorkflowsSection-CyUnAYVa.js.map → WorkflowsSection-Htg3cqfo.js.map} +1 -1
- package/lib/apps/admin-ui/src/authentication/constants.d.ts +3 -1
- package/lib/apps/admin-ui/src/client-scopes/details/oid4vciAttributes.d.ts +8 -3
- package/lib/apps/admin-ui/src/clients/ssf/tabs/CreateStreamForm.d.ts +18 -0
- package/lib/apps/admin-ui/src/clients/ssf/utils.d.ts +13 -0
- package/lib/apps/admin-ui/src/components/client/ClientSelect.d.ts +3 -4
- package/lib/apps/admin-ui/src/components/client/ClientSelectModal.d.ts +8 -0
- package/lib/apps/admin-ui/src/components/group/GroupPickerDialog.d.ts +8 -2
- package/lib/apps/admin-ui/src/components/role-mapping/RoleMapping.d.ts +1 -32
- package/lib/apps/admin-ui/src/components/role-mapping/resource.d.ts +9 -1
- package/lib/apps/admin-ui/src/context/identity-provider/IdentityProviderContext.d.ts +12 -0
- package/lib/apps/admin-ui/src/identity-providers/add/AddOid4Vp.d.ts +1 -0
- package/lib/apps/admin-ui/src/identity-providers/add/IdpDomainsTab.d.ts +5 -0
- package/lib/apps/admin-ui/src/identity-providers/add/IdpOrganizationsTab.d.ts +6 -0
- package/lib/apps/admin-ui/src/identity-providers/add/Oid4VpSettings.d.ts +1 -0
- package/lib/apps/admin-ui/src/identity-providers/routes/IdentityProvider.d.ts +1 -1
- package/lib/apps/admin-ui/src/identity-providers/routes/IdentityProviderOid4Vp.d.ts +7 -0
- package/lib/apps/admin-ui/src/organizations/DomainsTab.d.ts +1 -0
- package/lib/apps/admin-ui/src/organizations/IdentityProviderSelect.d.ts +4 -1
- package/lib/apps/admin-ui/src/organizations/MembershipTypeToggle.d.ts +9 -0
- package/lib/apps/admin-ui/src/organizations/OrganizationForm.d.ts +4 -1
- package/lib/apps/admin-ui/src/organizations/routes/EditOrganization.d.ts +1 -1
- package/lib/apps/admin-ui/src/realm-settings/ssf/SsfTransmitterDisableConfirmDialog.d.ts +1 -1
- package/lib/apps/admin-ui/src/utils/useIsFeatureEnabled.d.ts +3 -1
- package/lib/{index-BEI4c3WS.js → index-DsIT2BLV.js} +23964 -23052
- package/lib/{index-BEI4c3WS.js.map → index-DsIT2BLV.js.map} +1 -1
- package/lib/keycloak-admin-ui.js +75 -75
- package/package.json +4 -4
- package/lib/AddKubernetesConnect-DcdkNZw-.js.map +0 -1
- package/lib/DetailOrganization-DzPHda7g.js +0 -204
- package/lib/DetailOrganization-DzPHda7g.js.map +0 -1
- package/lib/NewOrganization-CstM2Q0Y.js.map +0 -1
- package/lib/PermissionConfigurationDetails-DH5b34p8.js.map +0 -1
- package/lib/PermissionDetails-DltsWJl5.js +0 -413
- package/lib/PermissionDetails-DltsWJl5.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs as h, Fragment as g, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { b1 as F, a as L, b2 as V, u as W, K as j, aa as H, e as M, b3 as U, b4 as $, V as Q, P as q, aI as z, b5 as S, b6 as G, b7 as J, b8 as v, b9 as X, af as f, B as Y, ba as Z, bb as _, bc as ee, Q as k, S as K, U as O, W as A, bd as ae } from "./index-DsIT2BLV.js";
|
|
3
3
|
import { useState as m } from "react";
|
|
4
4
|
import { useTranslation as p } from "react-i18next";
|
|
5
|
-
import { useNavigate as te, Link as
|
|
5
|
+
import { useNavigate as te, Link as I } from "react-router-dom";
|
|
6
6
|
const ne = () => {
|
|
7
7
|
const { t: n } = p(), [o, i] = m(!1), r = ee();
|
|
8
8
|
return r.length < 3 ? null : /* @__PURE__ */ e(
|
|
@@ -21,10 +21,10 @@ const ne = () => {
|
|
|
21
21
|
}
|
|
22
22
|
),
|
|
23
23
|
isOpen: o,
|
|
24
|
-
children: /* @__PURE__ */ e(
|
|
25
|
-
|
|
24
|
+
children: /* @__PURE__ */ e(K, { children: r.map(({ name: t }) => /* @__PURE__ */ e(
|
|
25
|
+
O,
|
|
26
26
|
{
|
|
27
|
-
component: (s) => /* @__PURE__ */ e(
|
|
27
|
+
component: (s) => /* @__PURE__ */ e(I, { ...s, to: S({ realm: t }) }),
|
|
28
28
|
children: t
|
|
29
29
|
},
|
|
30
30
|
"server info"
|
|
@@ -51,8 +51,8 @@ const ne = () => {
|
|
|
51
51
|
}
|
|
52
52
|
),
|
|
53
53
|
isOpen: r,
|
|
54
|
-
children: /* @__PURE__ */ e(
|
|
55
|
-
|
|
54
|
+
children: /* @__PURE__ */ e(K, { children: /* @__PURE__ */ e(
|
|
55
|
+
O,
|
|
56
56
|
{
|
|
57
57
|
"data-testid": "delete",
|
|
58
58
|
onClick: () => {
|
|
@@ -65,19 +65,19 @@ const ne = () => {
|
|
|
65
65
|
);
|
|
66
66
|
};
|
|
67
67
|
function me() {
|
|
68
|
-
const { t: n } = p(), o = te(), { whoAmI: i } = F(), { realm: r } = L(), { environment: t } = V(), { adminClient: s } =
|
|
68
|
+
const { t: n } = p(), o = te(), { whoAmI: i } = F(), { realm: r } = L(), { environment: t } = V(), { adminClient: s } = W(), { addAlert: b, addError: N } = j(), [c, u] = m([]), [x, R] = m(!1), [C, E] = m(0), w = () => E(C + 1), P = async (a, l, B) => {
|
|
69
69
|
try {
|
|
70
|
-
return (await
|
|
70
|
+
return (await Z(
|
|
71
71
|
s,
|
|
72
72
|
"ui-ext/realms/names",
|
|
73
73
|
{ first: `${a}`, max: `${l}`, search: B || "" }
|
|
74
74
|
)).map((D) => ({ ...D, id: D.name }));
|
|
75
75
|
} catch (d) {
|
|
76
|
-
if (d instanceof
|
|
76
|
+
if (d instanceof _ && d.response.status < 500)
|
|
77
77
|
return [];
|
|
78
78
|
throw d;
|
|
79
79
|
}
|
|
80
|
-
}, [y,
|
|
80
|
+
}, [y, T] = H({
|
|
81
81
|
titleKey: n("deleteConfirmRealm", {
|
|
82
82
|
count: c.length,
|
|
83
83
|
name: c[0]?.name
|
|
@@ -86,7 +86,7 @@ function me() {
|
|
|
86
86
|
continueButtonLabel: "delete",
|
|
87
87
|
onConfirm: async () => {
|
|
88
88
|
try {
|
|
89
|
-
c.some(({ name: l }) => l === t.masterRealm) && b(n("cantDeleteMasterRealm"),
|
|
89
|
+
c.some(({ name: l }) => l === t.masterRealm) && b(n("cantDeleteMasterRealm"), M.warning);
|
|
90
90
|
const a = c.filter(
|
|
91
91
|
({ name: l }) => l !== t.masterRealm
|
|
92
92
|
);
|
|
@@ -95,27 +95,27 @@ function me() {
|
|
|
95
95
|
a.map(
|
|
96
96
|
({ name: l }) => s.realms.del({ realm: l })
|
|
97
97
|
)
|
|
98
|
-
), b(n("deletedSuccessRealmSetting")), c.some(({ name: l }) => l === r) && o(
|
|
98
|
+
), b(n("deletedSuccessRealmSetting")), c.some(({ name: l }) => l === r) && o(U({ realm: t.masterRealm })), w(), u([]);
|
|
99
99
|
} catch (a) {
|
|
100
|
-
|
|
100
|
+
N("deleteError", a);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
});
|
|
104
104
|
return /* @__PURE__ */ h(g, { children: [
|
|
105
|
-
/* @__PURE__ */ e(
|
|
105
|
+
/* @__PURE__ */ e(T, {}),
|
|
106
106
|
x && /* @__PURE__ */ e(
|
|
107
|
-
|
|
107
|
+
$,
|
|
108
108
|
{
|
|
109
109
|
onClose: () => {
|
|
110
110
|
R(!1), w();
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
),
|
|
114
|
-
/* @__PURE__ */ e(
|
|
115
|
-
/* @__PURE__ */ e(
|
|
116
|
-
|
|
114
|
+
/* @__PURE__ */ e(Q, { titleKey: "manageRealms", divider: !1 }),
|
|
115
|
+
/* @__PURE__ */ e(q, { variant: "light", className: "pf-v5-u-p-0", children: /* @__PURE__ */ e(
|
|
116
|
+
z,
|
|
117
117
|
{
|
|
118
|
-
loader:
|
|
118
|
+
loader: P,
|
|
119
119
|
isPaginated: !0,
|
|
120
120
|
onSelect: u,
|
|
121
121
|
canSelectAll: !0,
|
|
@@ -131,7 +131,7 @@ function me() {
|
|
|
131
131
|
],
|
|
132
132
|
toolbarItem: /* @__PURE__ */ h(g, { children: [
|
|
133
133
|
/* @__PURE__ */ e(f, { children: i.createRealm && /* @__PURE__ */ e(
|
|
134
|
-
|
|
134
|
+
Y,
|
|
135
135
|
{
|
|
136
136
|
onClick: () => R(!0),
|
|
137
137
|
"data-testid": "add-realm",
|
|
@@ -151,15 +151,15 @@ function me() {
|
|
|
151
151
|
{
|
|
152
152
|
name: "name",
|
|
153
153
|
transforms: [v(20)],
|
|
154
|
-
cellRenderer: ({ name: a }) => a !== r ? /* @__PURE__ */ e(
|
|
155
|
-
|
|
154
|
+
cellRenderer: ({ name: a }) => a !== r ? /* @__PURE__ */ e(I, { to: S({ realm: a }), children: a }) : /* @__PURE__ */ e(
|
|
155
|
+
G,
|
|
156
156
|
{
|
|
157
157
|
bodyContent: n("currentRealmExplain"),
|
|
158
158
|
triggerAction: "hover",
|
|
159
159
|
children: /* @__PURE__ */ h(g, { children: [
|
|
160
160
|
a,
|
|
161
161
|
" ",
|
|
162
|
-
/* @__PURE__ */ e(
|
|
162
|
+
/* @__PURE__ */ e(J, { isRead: !0, children: n("currentRealm") })
|
|
163
163
|
] })
|
|
164
164
|
}
|
|
165
165
|
)
|
|
@@ -167,7 +167,7 @@ function me() {
|
|
|
167
167
|
{
|
|
168
168
|
name: "displayName",
|
|
169
169
|
transforms: [v(80)],
|
|
170
|
-
cellRenderer: ({ displayName: a }) =>
|
|
170
|
+
cellRenderer: ({ displayName: a }) => X(n, a, "—")
|
|
171
171
|
}
|
|
172
172
|
]
|
|
173
173
|
},
|
|
@@ -178,4 +178,4 @@ function me() {
|
|
|
178
178
|
export {
|
|
179
179
|
me as default
|
|
180
180
|
};
|
|
181
|
-
//# sourceMappingURL=RealmSection-
|
|
181
|
+
//# sourceMappingURL=RealmSection-DJ8T80Z6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealmSection-DcQUYY0v.js","sources":["../src/realm/RealmSection.tsx"],"sourcesContent":["import { NetworkError } from \"@keycloak/keycloak-admin-client\";\nimport {\n KeycloakDataTable,\n useAlerts,\n useEnvironment,\n} 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 type { Environment } from \"../environment-types\";\nimport { resolveDisplayName } from \"../util\";\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 { environment } = useEnvironment<Environment>();\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.some(({ name }) => name === environment.masterRealm)) {\n addAlert(t(\"cantDeleteMasterRealm\"), AlertVariant.warning);\n }\n const filtered = selected.filter(\n ({ name }) => name !== environment.masterRealm,\n );\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.some(({ name }) => name === realm)) {\n void navigate(toRealm({ realm: environment.masterRealm }));\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.createRealm && (\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 cellRenderer: ({ displayName }) =>\n resolveDisplayName(t, displayName, \"—\"),\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","environment","useEnvironment","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","displayName","resolveDisplayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RealmSection-DJ8T80Z6.js","sources":["../src/realm/RealmSection.tsx"],"sourcesContent":["import { NetworkError } from \"@keycloak/keycloak-admin-client\";\nimport {\n KeycloakDataTable,\n useAlerts,\n useEnvironment,\n} 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 type { Environment } from \"../environment-types\";\nimport { resolveDisplayName } from \"../util\";\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 { environment } = useEnvironment<Environment>();\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.some(({ name }) => name === environment.masterRealm)) {\n addAlert(t(\"cantDeleteMasterRealm\"), AlertVariant.warning);\n }\n const filtered = selected.filter(\n ({ name }) => name !== environment.masterRealm,\n );\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.some(({ name }) => name === realm)) {\n void navigate(toRealm({ realm: environment.masterRealm }));\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.createRealm && (\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 cellRenderer: ({ displayName }) =>\n resolveDisplayName(t, displayName, \"—\"),\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","environment","useEnvironment","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","displayName","resolveDisplayName"],"mappings":";;;;;AAyCA,MAAMA,KAAuB,MAAM;AACjC,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChCC,IAAeC,GAAA;AAErB,SAAID,EAAa,SAAS,IAAU,OAElC,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,2BAAyB;AAAA,MACzB,cAAc,CAACC,MAAWN,EAAQM,CAAM;AAAA,MACxC,QAAQ,CAACC,MACP,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,cAAW;AAAA,UACX,KAAAD;AAAA,UACA,SAAS,MAAMP,EAAQ,CAACD,CAAI;AAAA,UAE3B,YAAE,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAGrB,QAAQA;AAAA,MAER,4BAACU,GAAA,EACE,UAAAP,EAAa,IAAI,CAAC,EAAE,MAAAQ,QACnB,gBAAAN;AAAA,QAACO;AAAA,QAAA;AAAA,UAEC,WAAW,CAACC,MACV,gBAAAR,EAACS,GAAA,EAAM,GAAGD,GAAO,IAAIE,EAAY,EAAE,OAAOJ,EAAA,CAAM,EAAA,CAAG;AAAA,UAGpD,UAAAA;AAAA,QAAA;AAAA,QALG;AAAA,MAAA,CAOP,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN,GAOMK,KAAgB,CAAC,EAAE,SAAAC,GAAS,YAAAC,QAAqC;AACrE,QAAM,EAAE,GAAApB,EAAA,IAAMC,EAAA,GACR,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK;AACtC,SACE,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,2BAAyB;AAAA,MACzB,cAAc,CAACC,MAAWN,EAAQM,CAAM;AAAA,MACxC,QAAQ,CAACC,MACP,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,cAAW;AAAA,UACX,KAAAD;AAAA,UACA,SAAS,MAAMP,EAAQ,CAACD,CAAI;AAAA,UAC5B,SAAQ;AAAA,UACR,YAAAkB;AAAA,UAEA,4BAACC,IAAA,CAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAGnB,QAAQnB;AAAA,MAER,4BAACU,GAAA,EACC,UAAA,gBAAAL;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,SAAS,MAAM;AACb,YAAAX,EAAQ,EAAK,GACbgB,EAAA;AAAA,UACF;AAAA,UAEC,YAAE,QAAQ;AAAA,QAAA;AAAA,MAAA,EACb,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAIA,SAAwBG,KAAe;AACrC,QAAM,EAAE,GAAAtB,EAAA,IAAMC,EAAA,GACRsB,IAAWC,GAAA,GACX,EAAE,QAAAC,EAAA,IAAWC,EAAA,GACb,EAAE,OAAAC,EAAA,IAAUC,EAAA,GACZ,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAClB,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAClB,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaC,EAAA,GAEzB,CAACC,GAAUC,CAAW,IAAIjC,EAAqB,CAAA,CAAE,GACjD,CAACkC,GAAcC,CAAe,IAAInC,EAAS,EAAK,GAChD,CAACoC,GAAKC,CAAM,IAAIrC,EAAS,CAAC,GAC1BsC,IAAU,MAAMD,EAAOD,IAAM,CAAC,GAE9BG,IAAS,OAAOC,GAAgBC,GAAcC,MAAoB;AACtE,QAAI;AAMF,cALe,MAAMC;AAAA,QACnBhB;AAAA,QACA;AAAA,QACA,EAAE,OAAO,GAAGa,CAAK,IAAI,KAAK,GAAGC,CAAG,IAAI,QAAQC,KAAU,GAAA;AAAA,MAAG,GAE7C,IAAI,CAACE,OAAO,EAAE,GAAGA,GAAG,IAAIA,EAAE,KAAA,EAAO;AAAA,IACjD,SAASC,GAAO;AACd,UAAIA,aAAiBC,KAAgBD,EAAM,SAAS,SAAS;AAC3D,eAAO,CAAA;AAGT,YAAMA;AAAA,IACR;AAAA,EACF,GAEM,CAACE,GAAoBC,CAAa,IAAIC,EAAiB;AAAA,IAC3D,UAAUrD,EAAE,sBAAsB;AAAA,MAChC,OAAOoC,EAAS;AAAA,MAChB,MAAMA,EAAS,CAAC,GAAG;AAAA,IAAA,CACpB;AAAA,IACD,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,WAAW,YAAY;AACrB,UAAI;AACF,QAAIA,EAAS,KAAK,CAAC,EAAE,MAAAvB,QAAWA,MAASgB,EAAY,WAAW,KAC9DI,EAASjC,EAAE,uBAAuB,GAAGsD,EAAa,OAAO;AAE3D,cAAMC,IAAWnB,EAAS;AAAA,UACxB,CAAC,EAAE,MAAAvB,EAAA,MAAWA,MAASgB,EAAY;AAAA,QAAA;AAErC,YAAI0B,EAAS,WAAW,EAAG;AAC3B,cAAM,QAAQ;AAAA,UACZA,EAAS;AAAA,YAAI,CAAC,EAAE,MAAMC,QACpBzB,EAAY,OAAO,IAAI,EAAE,OAAOyB,EAAA,CAAW;AAAA,UAAA;AAAA,QAC7C,GAEFvB,EAASjC,EAAE,4BAA4B,CAAC,GACpCoC,EAAS,KAAK,CAAC,EAAE,MAAAvB,QAAWA,MAASc,CAAK,KACvCJ,EAASkC,EAAQ,EAAE,OAAO5B,EAAY,YAAA,CAAa,CAAC,GAE3Da,EAAA,GACAL,EAAY,CAAA,CAAE;AAAA,MAChB,SAASY,GAAO;AACd,QAAAf,EAAS,eAAee,CAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EAAA,CACD;AAED,SACE,gBAAAS,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAApD,EAAC6C,GAAA,EAAc;AAAA,IACdd,KACC,gBAAA/B;AAAA,MAACqD;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAArB,EAAgB,EAAK,GACrBG,EAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,gBAAAnC,EAACsD,GAAA,EAAW,UAAS,gBAAe,SAAS,IAAO;AAAA,IACpD,gBAAAtD,EAACuD,GAAA,EAAY,SAAQ,SAAQ,WAAU,eACrC,UAAA,gBAAAvD;AAAA,MAACwD;AAAAA,MAAA;AAAA,QAEC,QAAApB;AAAA,QACA,aAAW;AAAA,QACX,UAAUN;AAAA,QACV,cAAY;AAAA,QACZ,cAAa;AAAA,QACb,sBAAqB;AAAA,QACrB,SAAS;AAAA,UACP;AAAA,YACE,OAAOrC,EAAE,QAAQ;AAAA,YACjB,YAAY,CAACoC,MAAa;AACxB,cAAAC,EAAY,CAACD,CAAQ,CAAC,GACtBe,EAAA;AAAA,YACF;AAAA,UAAA;AAAA,QACF;AAAA,QAEF,aACE,gBAAAO,EAAAC,GAAA,EACE,UAAA;AAAA,UAAA,gBAAApD,EAACyD,GAAA,EACE,YAAO,eACN,gBAAAzD;AAAA,YAAC0D;AAAA,YAAA;AAAA,cACC,SAAS,MAAM1B,EAAgB,EAAI;AAAA,cACnC,eAAY;AAAA,cAEX,YAAE,aAAa;AAAA,YAAA;AAAA,UAAA,GAGtB;AAAA,UACA,gBAAAhC,EAACyD,GAAA,EACC,UAAA,gBAAAzD,EAACR,IAAA,CAAA,CAAqB,GACxB;AAAA,4BACCiE,GAAA,EACC,UAAA,gBAAAzD;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,SAASiC;AAAA,cACT,YAAYf,EAAS,WAAW;AAAA,YAAA;AAAA,UAAA,EAClC,CACF;AAAA,QAAA,GACF;AAAA,QAEF,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,YAAY,CAAC8B,EAAU,EAAE,CAAC;AAAA,YAC1B,cAAc,CAAC,EAAE,MAAArD,EAAA,MACfA,MAASc,IACP,gBAAApB,EAACS,GAAA,EAAK,IAAIC,EAAY,EAAE,OAAOJ,GAAM,GAAI,aAAK,IAE9C,gBAAAN;AAAA,cAAC4D;AAAA,cAAA;AAAA,gBACC,aAAanE,EAAE,qBAAqB;AAAA,gBACpC,eAAc;AAAA,gBAEd,UAAA,gBAAA0D,EAAAC,GAAA,EACG,UAAA;AAAA,kBAAA9C;AAAA,kBAAK;AAAA,oCAAEuD,GAAA,EAAM,QAAM,IAAE,UAAApE,EAAE,cAAc,EAAA,CAAE;AAAA,gBAAA,EAAA,CAC1C;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,UAGN;AAAA,YACE,MAAM;AAAA,YACN,YAAY,CAACkE,EAAU,EAAE,CAAC;AAAA,YAC1B,cAAc,CAAC,EAAE,aAAAG,EAAA,MACfC,EAAmBtE,GAAGqE,GAAa,GAAG;AAAA,UAAA;AAAA,QAC1C;AAAA,MACF;AAAA,MA/DK7B;AAAA,IAAA,EAgEP,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { jsxs as c, Fragment as y, jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { u as
|
|
2
|
+
import { u as L, K as _, b as q, ar as E, as as K, n as z, aa as M, e as w, at as A, aC as U, au as j, V as G, U as O, P as W, F as J, c as Q, q as l, aw as D, aD as X, a7 as R, aE as Y, aF as Z, A as $, B as N, l as ee, a2 as ae, a3 as re, aG as se } from "./index-DsIT2BLV.js";
|
|
3
3
|
import { useState as d } from "react";
|
|
4
4
|
import { useTranslation as te } from "react-i18next";
|
|
5
5
|
import { useNavigate as oe, Link as ne } from "react-router-dom";
|
|
6
|
-
import { S as ie } from "./ScopePicker-
|
|
6
|
+
import { S as ie } from "./ScopePicker-USX1qW3k.js";
|
|
7
7
|
function be() {
|
|
8
|
-
const { adminClient: o } =
|
|
8
|
+
const { adminClient: o } = L(), { t: e } = te(), [m, P] = d(), [C, p] = d(), [b, F] = d(), { addAlert: h, addError: f } = _(), v = q({
|
|
9
9
|
mode: "onChange"
|
|
10
|
-
}), { setValue:
|
|
11
|
-
ae(r,
|
|
12
|
-
}, { hasAccess: T } =
|
|
13
|
-
|
|
10
|
+
}), { setValue: H, handleSubmit: S } = v, { id: t, resourceId: s, realm: u } = E(), I = oe(), V = (r = {}) => {
|
|
11
|
+
ae(r, H);
|
|
12
|
+
}, { hasAccess: T } = K(), g = !T("manage-authorization");
|
|
13
|
+
z(
|
|
14
14
|
() => Promise.all([
|
|
15
15
|
o.clients.findOne({ id: t }),
|
|
16
16
|
s ? o.clients.getResource({ id: t, resourceId: s }) : Promise.resolve(void 0),
|
|
@@ -19,11 +19,11 @@ function be() {
|
|
|
19
19
|
([r, n, i]) => {
|
|
20
20
|
if (!r)
|
|
21
21
|
throw new Error(e("notFound"));
|
|
22
|
-
|
|
22
|
+
P(r), F(i), p(n), V(n);
|
|
23
23
|
},
|
|
24
24
|
[]
|
|
25
25
|
);
|
|
26
|
-
const
|
|
26
|
+
const k = async (r) => {
|
|
27
27
|
const n = re(r);
|
|
28
28
|
try {
|
|
29
29
|
if (s)
|
|
@@ -44,12 +44,12 @@ function be() {
|
|
|
44
44
|
} catch (i) {
|
|
45
45
|
f("resourceSaveError", i);
|
|
46
46
|
}
|
|
47
|
-
}, [
|
|
47
|
+
}, [x, B] = M({
|
|
48
48
|
titleKey: "deleteResource",
|
|
49
49
|
children: /* @__PURE__ */ c(y, { children: [
|
|
50
50
|
e("deleteResourceConfirm"),
|
|
51
51
|
b?.length !== 0 && /* @__PURE__ */ a(
|
|
52
|
-
|
|
52
|
+
U,
|
|
53
53
|
{
|
|
54
54
|
variant: "warning",
|
|
55
55
|
isInline: !0,
|
|
@@ -75,18 +75,18 @@ function be() {
|
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
return m ? /* @__PURE__ */ c(y, { children: [
|
|
78
|
-
/* @__PURE__ */ a(
|
|
78
|
+
/* @__PURE__ */ a(B, {}),
|
|
79
79
|
/* @__PURE__ */ a(
|
|
80
|
-
|
|
80
|
+
G,
|
|
81
81
|
{
|
|
82
|
-
titleKey: s ?
|
|
82
|
+
titleKey: s ? C?.name : "createResource",
|
|
83
83
|
dropdownItems: s ? [
|
|
84
84
|
/* @__PURE__ */ a(
|
|
85
|
-
|
|
85
|
+
O,
|
|
86
86
|
{
|
|
87
87
|
"data-testid": "delete-resource",
|
|
88
88
|
isDisabled: g,
|
|
89
|
-
onClick: () =>
|
|
89
|
+
onClick: () => x(),
|
|
90
90
|
children: e("delete")
|
|
91
91
|
},
|
|
92
92
|
"delete"
|
|
@@ -94,13 +94,13 @@ function be() {
|
|
|
94
94
|
] : void 0
|
|
95
95
|
}
|
|
96
96
|
),
|
|
97
|
-
/* @__PURE__ */ a(
|
|
98
|
-
|
|
97
|
+
/* @__PURE__ */ a(W, { variant: "light", children: /* @__PURE__ */ a(J, { ...v, children: /* @__PURE__ */ c(
|
|
98
|
+
Q,
|
|
99
99
|
{
|
|
100
100
|
isHorizontal: !0,
|
|
101
101
|
role: "manage-authorization",
|
|
102
102
|
className: "keycloak__resource-details__form",
|
|
103
|
-
onSubmit:
|
|
103
|
+
onSubmit: S(k),
|
|
104
104
|
children: [
|
|
105
105
|
/* @__PURE__ */ a(
|
|
106
106
|
l,
|
|
@@ -145,7 +145,7 @@ function be() {
|
|
|
145
145
|
fieldId: "uris",
|
|
146
146
|
labelIcon: /* @__PURE__ */ a(R, { helpText: e("urisHelp"), fieldLabelId: "uris" }),
|
|
147
147
|
children: /* @__PURE__ */ a(
|
|
148
|
-
|
|
148
|
+
X,
|
|
149
149
|
{
|
|
150
150
|
name: "uris",
|
|
151
151
|
type: "url",
|
|
@@ -191,7 +191,7 @@ function be() {
|
|
|
191
191
|
),
|
|
192
192
|
/* @__PURE__ */ a($, { children: /* @__PURE__ */ c("div", { className: "pf-v5-u-mt-md", children: [
|
|
193
193
|
/* @__PURE__ */ a(
|
|
194
|
-
|
|
194
|
+
N,
|
|
195
195
|
{
|
|
196
196
|
variant: ee.primary,
|
|
197
197
|
type: "submit",
|
|
@@ -200,7 +200,7 @@ function be() {
|
|
|
200
200
|
}
|
|
201
201
|
),
|
|
202
202
|
/* @__PURE__ */ a(
|
|
203
|
-
|
|
203
|
+
N,
|
|
204
204
|
{
|
|
205
205
|
variant: "link",
|
|
206
206
|
"data-testid": "cancel",
|
|
@@ -222,9 +222,9 @@ function be() {
|
|
|
222
222
|
]
|
|
223
223
|
}
|
|
224
224
|
) }) })
|
|
225
|
-
] }) : /* @__PURE__ */ a(
|
|
225
|
+
] }) : /* @__PURE__ */ a(j, {});
|
|
226
226
|
}
|
|
227
227
|
export {
|
|
228
228
|
be as default
|
|
229
229
|
};
|
|
230
|
-
//# sourceMappingURL=ResourceDetails-
|
|
230
|
+
//# sourceMappingURL=ResourceDetails-Cyb5CmVt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceDetails-DpRkk4_g.js","sources":["../src/clients/authorization/ResourceDetails.tsx"],"sourcesContent":["import type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport type ResourceRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceRepresentation\";\nimport {\n HelpItem,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { DefaultSwitchControl } from \"../../components/SwitchControl\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeyValueInput } from \"../../components/key-value-form/KeyValueInput\";\nimport type { KeyValueType } from \"../../components/key-value-form/key-value-convert\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { MultiLineInput } from \"../../components/multi-line-input/MultiLineInput\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { convertFormValuesToObject, convertToFormValues } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport { ResourceDetailsParams, toResourceDetails } from \"../routes/Resource\";\nimport { ScopePicker } from \"./ScopePicker\";\nimport \"./resource-details.css\";\n\ntype SubmittedResource = Omit<\n ResourceRepresentation,\n \"attributes\" | \"scopes\"\n> & {\n attributes: KeyValueType[];\n};\n\nexport default function ResourceDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const [client, setClient] = useState<ClientRepresentation>();\n const [resource, setResource] = useState<ResourceRepresentation>();\n\n const [permissions, setPermission] = useState<PolicyRepresentation[]>();\n\n const { addAlert, addError } = useAlerts();\n const form = useForm<SubmittedResource>({\n mode: \"onChange\",\n });\n const { setValue, handleSubmit } = form;\n\n const { id, resourceId, realm } = useParams<ResourceDetailsParams>();\n const navigate = useNavigate();\n\n const setupForm = (resource: ResourceRepresentation = {}) => {\n convertToFormValues(resource, setValue);\n };\n\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n () =>\n Promise.all([\n adminClient.clients.findOne({ id }),\n resourceId\n ? adminClient.clients.getResource({ id, resourceId })\n : Promise.resolve(undefined),\n resourceId\n ? adminClient.clients.listPermissionsByResource({ id, resourceId })\n : Promise.resolve(undefined),\n ]),\n ([client, resource, permissions]) => {\n if (!client) {\n throw new Error(t(\"notFound\"));\n }\n setClient(client);\n setPermission(permissions);\n setResource(resource);\n setupForm(resource);\n },\n [],\n );\n\n const submit = async (submitted: SubmittedResource) => {\n const resource = convertFormValuesToObject<\n SubmittedResource,\n ResourceRepresentation\n >(submitted);\n\n try {\n if (resourceId) {\n await adminClient.clients.updateResource({ id, resourceId }, resource);\n } else {\n const result = await adminClient.clients.createResource(\n { id },\n resource,\n );\n setResource(resource);\n void navigate(\n toResourceDetails({ realm, id, resourceId: result._id! }),\n );\n }\n addAlert(\n t((resourceId ? \"update\" : \"create\") + \"ResourceSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"resourceSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deleteResource\",\n children: (\n <>\n {t(\"deleteResourceConfirm\")}\n {permissions?.length !== 0 && (\n <Alert\n variant=\"warning\"\n isInline\n isPlain\n title={t(\"deleteResourceWarning\")}\n className=\"pf-v5-u-pt-lg\"\n >\n <p className=\"pf-v5-u-pt-xs\">\n {permissions?.map((permission) => (\n <strong key={permission.id} className=\"pf-v5-u-pr-md\">\n {permission.name}\n </strong>\n ))}\n </p>\n </Alert>\n )}\n </>\n ),\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delResource({\n id,\n resourceId: resourceId!,\n });\n addAlert(t(\"resourceDeletedSuccess\"), AlertVariant.success);\n void navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"resources\" }),\n );\n } catch (error) {\n addError(\"resourceDeletedError\", error);\n }\n },\n });\n\n if (!client) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={resourceId ? resource?.name! : \"createResource\"}\n dropdownItems={\n resourceId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n className=\"keycloak__resource-details__form\"\n onSubmit={handleSubmit(submit)}\n >\n <TextControl\n name={resourceId ? \"owner.name\" : \"\"}\n label={t(\"owner\")}\n labelIcon={t(\"ownerHelp\")}\n defaultValue={client.clientId}\n readOnly\n />\n <TextControl\n name={\"name\"}\n label={t(\"name\")}\n labelIcon={t(\"resourceNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"displayNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"type\"\n label={t(\"type\")}\n labelIcon={t(\"resourceDetailsTypeHelp\")}\n />\n <FormGroup\n label={t(\"uris\")}\n fieldId=\"uris\"\n labelIcon={\n <HelpItem helpText={t(\"urisHelp\")} fieldLabelId=\"uris\" />\n }\n >\n <MultiLineInput\n name=\"uris\"\n type=\"url\"\n aria-label={t(\"uris\")}\n addButtonLabel=\"addUri\"\n />\n </FormGroup>\n <ScopePicker clientId={id} />\n <TextControl\n name=\"icon_uri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n type=\"url\"\n />\n <DefaultSwitchControl\n name=\"ownerManagedAccess\"\n label={t(\"ownerManagedAccess\")}\n labelIcon={t(\"ownerManagedAccessHelp\")}\n />\n <FormGroup\n hasNoPaddingTop\n label={t(\"resourceAttribute\")}\n labelIcon={\n <HelpItem\n helpText={t(\"resourceAttributeHelp\")}\n fieldLabelId=\"resourceAttribute\"\n />\n }\n fieldId=\"resourceAttribute\"\n >\n <KeyValueInput name=\"attributes\" isDisabled={isDisabled} />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"resources\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ResourceDetails","adminClient","useAdminClient","t","useTranslation","client","setClient","useState","resource","setResource","permissions","setPermission","addAlert","addError","useAlerts","form","useForm","setValue","handleSubmit","id","resourceId","realm","useParams","navigate","useNavigate","setupForm","convertToFormValues","hasAccess","useAccess","isDisabled","useFetch","submit","submitted","convertFormValuesToObject","result","toResourceDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","jsxs","Fragment","jsx","Alert","permission","toAuthorizationTab","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","FormGroup","HelpItem","MultiLineInput","ScopePicker","DefaultSwitchControl","KeyValueInput","ActionGroup","Button","ButtonVariant","props","Link","KeycloakSpinner"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResourceDetails-Cyb5CmVt.js","sources":["../src/clients/authorization/ResourceDetails.tsx"],"sourcesContent":["import type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type PolicyRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/policyRepresentation\";\nimport type ResourceRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/resourceRepresentation\";\nimport {\n HelpItem,\n TextControl,\n useAlerts,\n useFetch,\n} from \"@keycloak/keycloak-ui-shared\";\nimport {\n ActionGroup,\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n DropdownItem,\n FormGroup,\n PageSection,\n} from \"@patternfly/react-core\";\nimport { useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { DefaultSwitchControl } from \"../../components/SwitchControl\";\nimport { useConfirmDialog } from \"../../components/confirm-dialog/ConfirmDialog\";\nimport { FormAccess } from \"../../components/form/FormAccess\";\nimport { KeyValueInput } from \"../../components/key-value-form/KeyValueInput\";\nimport type { KeyValueType } from \"../../components/key-value-form/key-value-convert\";\nimport { KeycloakSpinner } from \"@keycloak/keycloak-ui-shared\";\nimport { MultiLineInput } from \"../../components/multi-line-input/MultiLineInput\";\nimport { ViewHeader } from \"../../components/view-header/ViewHeader\";\nimport { useAccess } from \"../../context/access/Access\";\nimport { convertFormValuesToObject, convertToFormValues } from \"../../util\";\nimport { useParams } from \"../../utils/useParams\";\nimport { toAuthorizationTab } from \"../routes/AuthenticationTab\";\nimport { ResourceDetailsParams, toResourceDetails } from \"../routes/Resource\";\nimport { ScopePicker } from \"./ScopePicker\";\nimport \"./resource-details.css\";\n\ntype SubmittedResource = Omit<\n ResourceRepresentation,\n \"attributes\" | \"scopes\"\n> & {\n attributes: KeyValueType[];\n};\n\nexport default function ResourceDetails() {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const [client, setClient] = useState<ClientRepresentation>();\n const [resource, setResource] = useState<ResourceRepresentation>();\n\n const [permissions, setPermission] = useState<PolicyRepresentation[]>();\n\n const { addAlert, addError } = useAlerts();\n const form = useForm<SubmittedResource>({\n mode: \"onChange\",\n });\n const { setValue, handleSubmit } = form;\n\n const { id, resourceId, realm } = useParams<ResourceDetailsParams>();\n const navigate = useNavigate();\n\n const setupForm = (resource: ResourceRepresentation = {}) => {\n convertToFormValues(resource, setValue);\n };\n\n const { hasAccess } = useAccess();\n\n const isDisabled = !hasAccess(\"manage-authorization\");\n\n useFetch(\n () =>\n Promise.all([\n adminClient.clients.findOne({ id }),\n resourceId\n ? adminClient.clients.getResource({ id, resourceId })\n : Promise.resolve(undefined),\n resourceId\n ? adminClient.clients.listPermissionsByResource({ id, resourceId })\n : Promise.resolve(undefined),\n ]),\n ([client, resource, permissions]) => {\n if (!client) {\n throw new Error(t(\"notFound\"));\n }\n setClient(client);\n setPermission(permissions);\n setResource(resource);\n setupForm(resource);\n },\n [],\n );\n\n const submit = async (submitted: SubmittedResource) => {\n const resource = convertFormValuesToObject<\n SubmittedResource,\n ResourceRepresentation\n >(submitted);\n\n try {\n if (resourceId) {\n await adminClient.clients.updateResource({ id, resourceId }, resource);\n } else {\n const result = await adminClient.clients.createResource(\n { id },\n resource,\n );\n setResource(resource);\n void navigate(\n toResourceDetails({ realm, id, resourceId: result._id! }),\n );\n }\n addAlert(\n t((resourceId ? \"update\" : \"create\") + \"ResourceSuccess\"),\n AlertVariant.success,\n );\n } catch (error) {\n addError(\"resourceSaveError\", error);\n }\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"deleteResource\",\n children: (\n <>\n {t(\"deleteResourceConfirm\")}\n {permissions?.length !== 0 && (\n <Alert\n variant=\"warning\"\n isInline\n isPlain\n title={t(\"deleteResourceWarning\")}\n className=\"pf-v5-u-pt-lg\"\n >\n <p className=\"pf-v5-u-pt-xs\">\n {permissions?.map((permission) => (\n <strong key={permission.id} className=\"pf-v5-u-pr-md\">\n {permission.name}\n </strong>\n ))}\n </p>\n </Alert>\n )}\n </>\n ),\n continueButtonLabel: \"confirm\",\n onConfirm: async () => {\n try {\n await adminClient.clients.delResource({\n id,\n resourceId: resourceId!,\n });\n addAlert(t(\"resourceDeletedSuccess\"), AlertVariant.success);\n void navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"resources\" }),\n );\n } catch (error) {\n addError(\"resourceDeletedError\", error);\n }\n },\n });\n\n if (!client) {\n return <KeycloakSpinner />;\n }\n\n return (\n <>\n <DeleteConfirm />\n <ViewHeader\n titleKey={resourceId ? resource?.name! : \"createResource\"}\n dropdownItems={\n resourceId\n ? [\n <DropdownItem\n key=\"delete\"\n data-testid=\"delete-resource\"\n isDisabled={isDisabled}\n onClick={() => toggleDeleteDialog()}\n >\n {t(\"delete\")}\n </DropdownItem>,\n ]\n : undefined\n }\n />\n <PageSection variant=\"light\">\n <FormProvider {...form}>\n <FormAccess\n isHorizontal\n role=\"manage-authorization\"\n className=\"keycloak__resource-details__form\"\n onSubmit={handleSubmit(submit)}\n >\n <TextControl\n name={resourceId ? \"owner.name\" : \"\"}\n label={t(\"owner\")}\n labelIcon={t(\"ownerHelp\")}\n defaultValue={client.clientId}\n readOnly\n />\n <TextControl\n name={\"name\"}\n label={t(\"name\")}\n labelIcon={t(\"resourceNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"displayName\"\n label={t(\"displayName\")}\n labelIcon={t(\"displayNameHelp\")}\n rules={{ required: t(\"required\") }}\n />\n <TextControl\n name=\"type\"\n label={t(\"type\")}\n labelIcon={t(\"resourceDetailsTypeHelp\")}\n />\n <FormGroup\n label={t(\"uris\")}\n fieldId=\"uris\"\n labelIcon={\n <HelpItem helpText={t(\"urisHelp\")} fieldLabelId=\"uris\" />\n }\n >\n <MultiLineInput\n name=\"uris\"\n type=\"url\"\n aria-label={t(\"uris\")}\n addButtonLabel=\"addUri\"\n />\n </FormGroup>\n <ScopePicker clientId={id} />\n <TextControl\n name=\"icon_uri\"\n label={t(\"iconUri\")}\n labelIcon={t(\"iconUriHelp\")}\n type=\"url\"\n />\n <DefaultSwitchControl\n name=\"ownerManagedAccess\"\n label={t(\"ownerManagedAccess\")}\n labelIcon={t(\"ownerManagedAccessHelp\")}\n />\n <FormGroup\n hasNoPaddingTop\n label={t(\"resourceAttribute\")}\n labelIcon={\n <HelpItem\n helpText={t(\"resourceAttributeHelp\")}\n fieldLabelId=\"resourceAttribute\"\n />\n }\n fieldId=\"resourceAttribute\"\n >\n <KeyValueInput name=\"attributes\" isDisabled={isDisabled} />\n </FormGroup>\n <ActionGroup>\n <div className=\"pf-v5-u-mt-md\">\n <Button\n variant={ButtonVariant.primary}\n type=\"submit\"\n data-testid=\"save\"\n >\n {t(\"save\")}\n </Button>\n\n <Button\n variant=\"link\"\n data-testid=\"cancel\"\n component={(props) => (\n <Link\n {...props}\n to={toAuthorizationTab({\n realm,\n clientId: id,\n tab: \"resources\",\n })}\n ></Link>\n )}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n </ActionGroup>\n </FormAccess>\n </FormProvider>\n </PageSection>\n </>\n );\n}\n"],"names":["ResourceDetails","adminClient","useAdminClient","t","useTranslation","client","setClient","useState","resource","setResource","permissions","setPermission","addAlert","addError","useAlerts","form","useForm","setValue","handleSubmit","id","resourceId","realm","useParams","navigate","useNavigate","setupForm","convertToFormValues","hasAccess","useAccess","isDisabled","useFetch","submit","submitted","convertFormValuesToObject","result","toResourceDetails","AlertVariant","error","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","jsxs","Fragment","jsx","Alert","permission","toAuthorizationTab","ViewHeader","DropdownItem","PageSection","FormProvider","FormAccess","TextControl","FormGroup","HelpItem","MultiLineInput","ScopePicker","DefaultSwitchControl","KeyValueInput","ActionGroup","Button","ButtonVariant","props","Link","KeycloakSpinner"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsxs as c, Fragment as D, jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { u as N,
|
|
3
|
-
import { useState as
|
|
4
|
-
import { useTranslation as
|
|
5
|
-
import { useNavigate as G, Link as
|
|
6
|
-
function
|
|
7
|
-
const { adminClient: r } = N(), { t: e } =
|
|
2
|
+
import { u as N, ar as z, K as k, X as w, b as H, n as U, aH as C, at as l, V as F, U as P, P as V, F as q, c as x, q as d, A as B, B as m, l as K, e as T } from "./index-DsIT2BLV.js";
|
|
3
|
+
import { useState as j } from "react";
|
|
4
|
+
import { useTranslation as E } from "react-i18next";
|
|
5
|
+
import { useNavigate as G, Link as L } from "react-router-dom";
|
|
6
|
+
function R() {
|
|
7
|
+
const { adminClient: r } = N(), { t: e } = E(), { id: i, scopeId: o, realm: s } = z(), p = G(), { addAlert: S, addError: b } = k(), [f, u] = w(), [n, h] = j(), g = H({
|
|
8
8
|
mode: "onChange"
|
|
9
|
-
}), { reset:
|
|
10
|
-
|
|
9
|
+
}), { reset: v, handleSubmit: y } = g;
|
|
10
|
+
U(
|
|
11
11
|
async () => {
|
|
12
12
|
if (o)
|
|
13
13
|
return await r.clients.getAuthorizationScope({
|
|
@@ -16,7 +16,7 @@ function Q() {
|
|
|
16
16
|
});
|
|
17
17
|
},
|
|
18
18
|
(t) => {
|
|
19
|
-
h(t),
|
|
19
|
+
h(t), v({ ...t });
|
|
20
20
|
},
|
|
21
21
|
[]
|
|
22
22
|
);
|
|
@@ -36,7 +36,7 @@ function Q() {
|
|
|
36
36
|
l({ realm: s, clientId: i, tab: "scopes" })
|
|
37
37
|
)), S(
|
|
38
38
|
e((o ? "update" : "create") + "ScopeSuccess"),
|
|
39
|
-
|
|
39
|
+
T.success
|
|
40
40
|
);
|
|
41
41
|
} catch (I) {
|
|
42
42
|
b("scopeSaveError", I);
|
|
@@ -63,7 +63,7 @@ function Q() {
|
|
|
63
63
|
titleKey: o ? n?.name : e("createAuthorizationScope"),
|
|
64
64
|
dropdownItems: o ? [
|
|
65
65
|
/* @__PURE__ */ a(
|
|
66
|
-
|
|
66
|
+
P,
|
|
67
67
|
{
|
|
68
68
|
"data-testid": "delete-resource",
|
|
69
69
|
onClick: () => u(),
|
|
@@ -74,7 +74,7 @@ function Q() {
|
|
|
74
74
|
] : void 0
|
|
75
75
|
}
|
|
76
76
|
),
|
|
77
|
-
/* @__PURE__ */ a(
|
|
77
|
+
/* @__PURE__ */ a(V, { variant: "light", children: /* @__PURE__ */ a(q, { ...g, children: /* @__PURE__ */ c(
|
|
78
78
|
x,
|
|
79
79
|
{
|
|
80
80
|
isHorizontal: !0,
|
|
@@ -110,7 +110,7 @@ function Q() {
|
|
|
110
110
|
/* @__PURE__ */ a(
|
|
111
111
|
m,
|
|
112
112
|
{
|
|
113
|
-
variant:
|
|
113
|
+
variant: K.primary,
|
|
114
114
|
type: "submit",
|
|
115
115
|
"data-testid": "save",
|
|
116
116
|
children: e("save")
|
|
@@ -121,7 +121,7 @@ function Q() {
|
|
|
121
121
|
{
|
|
122
122
|
variant: "link",
|
|
123
123
|
"data-testid": "revert",
|
|
124
|
-
onClick: () =>
|
|
124
|
+
onClick: () => v({ ...n }),
|
|
125
125
|
children: e("revert")
|
|
126
126
|
}
|
|
127
127
|
) : /* @__PURE__ */ a(
|
|
@@ -130,7 +130,7 @@ function Q() {
|
|
|
130
130
|
variant: "link",
|
|
131
131
|
"data-testid": "cancel",
|
|
132
132
|
component: (t) => /* @__PURE__ */ a(
|
|
133
|
-
|
|
133
|
+
L,
|
|
134
134
|
{
|
|
135
135
|
...t,
|
|
136
136
|
to: l({
|
|
@@ -150,6 +150,6 @@ function Q() {
|
|
|
150
150
|
] });
|
|
151
151
|
}
|
|
152
152
|
export {
|
|
153
|
-
|
|
153
|
+
R as default
|
|
154
154
|
};
|
|
155
|
-
//# sourceMappingURL=ScopeDetails-
|
|
155
|
+
//# sourceMappingURL=ScopeDetails-BV7h3hMw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScopeDetails-
|
|
1
|
+
{"version":3,"file":"ScopeDetails-BV7h3hMw.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 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 void navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }),\n );\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 void navigate(\n toAuthorizationTab({ realm, clientId: id, tab: \"scopes\" }),\n )\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;AAKF,eAJc,MAAML,EAAY,QAAQ,sBAAsB;AAAA,UAC5D,IAAAI;AAAA,UACA,SAAAC;AAAA,QAAA,CACD;AAAA,IAGL;AAAA,IACA,CAACW,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,GAEGR;AAAA,QACHiB,EAAmB,EAAE,OAAAnB,GAAO,UAAUF,GAAI,KAAK,UAAU;AAAA,MAAA,IAG7DM;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,MAAA;AACP,UAAKR;AAAA,YACHiB,EAAmB,EAAE,OAAAnB,GAAO,UAAUF,GAAI,KAAK,UAAU;AAAA,UAAA;AAAA;AAAA,MAC3D;AAAA,IAAA;AAAA,IAGJ,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;"}
|