@keycloakify/keycloak-admin-ui
Version:
Repackaged Keycloak Admin UI
171 lines • 8.08 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Alert, AlertVariant, Button, ButtonVariant, Form, Modal, ModalVariant, } from "@patternfly/react-core";
import { FormProvider, useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { FormSubmitButton, TextControl, useFetch, } from "../ui-shared";
import { useAdminClient } from "../admin-client";
import { useAlerts } from "../ui-shared";
import { useState } from "react";
export const GroupsModal = ({ id, rename, duplicateId, handleModalToggle, refresh, }) => {
const { adminClient } = useAdminClient();
const { t } = useTranslation();
const { addAlert, addError } = useAlerts();
const [duplicateGroupDetails, setDuplicateGroupDetails] = useState(null);
const form = useForm({
defaultValues: { name: "" },
});
const { handleSubmit, formState } = form;
useFetch(async () => {
if (duplicateId) {
return adminClient.groups.findOne({ id: duplicateId });
}
}, (group) => {
if (group) {
setDuplicateGroupDetails(group);
form.reset({ name: t("copyOf", { name: group.name }) });
}
}, [duplicateId]);
const fetchClientRoleMappings = async (groupId) => {
try {
const clientRoleMappings = [];
const clients = await adminClient.clients.find();
for (const client of clients) {
const roles = await adminClient.groups.listClientRoleMappings({
id: groupId,
clientUniqueId: client.id,
});
const clientRoles = roles
.filter((role) => role.id && role.name)
.map((role) => ({
id: role.id,
name: role.name,
}));
if (clientRoles.length > 0) {
clientRoleMappings.push({ clientId: client.id, roles: clientRoles });
}
}
return clientRoleMappings;
}
catch (error) {
addError("couldNotFetchClientRoleMappings", error);
throw error;
}
};
const duplicateGroup = async (sourceGroup, parentId, isSubGroup = false) => {
try {
const newGroup = {
...sourceGroup,
name: isSubGroup
? sourceGroup.name
: t("copyOf", { name: sourceGroup.name }),
...(parentId ? {} : { attributes: duplicateGroupDetails === null || duplicateGroupDetails === void 0 ? void 0 : duplicateGroupDetails.attributes }),
};
delete newGroup.id;
const createdGroup = parentId
? await adminClient.groups.createChildGroup({ id: parentId }, newGroup)
: await adminClient.groups.create(newGroup);
const members = await adminClient.groups.listMembers({
id: sourceGroup.id,
});
for (const member of members) {
await adminClient.users.addToGroup({
id: member.id,
groupId: createdGroup.id,
});
}
const permissions = await adminClient.groups.listPermissions({
id: sourceGroup.id,
});
if (permissions) {
await adminClient.groups.updatePermission({ id: createdGroup.id }, permissions);
}
const realmRoles = await adminClient.groups.listRealmRoleMappings({
id: sourceGroup.id,
});
const realmRolesPayload = realmRoles.map((role) => ({ id: role.id, name: role.name }));
const clientRoleMappings = await fetchClientRoleMappings(sourceGroup.id);
const clientRolesPayload = clientRoleMappings === null || clientRoleMappings === void 0 ? void 0 : clientRoleMappings.flatMap((clientRoleMapping) => clientRoleMapping.roles.map((role) => ({
id: role.id,
name: role.name,
clientUniqueId: clientRoleMapping.clientId,
})));
const rolesToAssign = [
...realmRolesPayload,
...clientRolesPayload,
];
await assignRoles(rolesToAssign, createdGroup.id);
const subGroups = await adminClient.groups.listSubGroups({
parentId: sourceGroup.id,
});
for (const childGroup of subGroups) {
const childAttributes = childGroup.attributes;
await duplicateGroup({ ...childGroup, attributes: childAttributes }, createdGroup.id, true);
}
return createdGroup;
}
catch (error) {
addError("couldNotDuplicateGroup", error);
throw error;
}
};
const assignRoles = async (roles, groupId) => {
try {
const realmRoles = roles.filter((role) => !role.clientUniqueId && role.name);
const clientRoles = roles.filter((role) => role.clientUniqueId && role.name);
await adminClient.groups.addRealmRoleMappings({
id: groupId,
roles: realmRoles.map(({ id, name }) => ({ id, name: name })),
});
await Promise.all(clientRoles.map((clientRole) => {
if (clientRole.clientUniqueId && clientRole.name) {
return adminClient.groups.addClientRoleMappings({
id: groupId,
clientUniqueId: clientRole.clientUniqueId,
roles: [{ id: clientRole.id, name: clientRole.name }],
});
}
return Promise.resolve();
}));
}
catch (error) {
addError("roleMappingUpdatedError", error);
}
};
const submitForm = async (group) => {
var _a;
group.name = (_a = group.name) === null || _a === void 0 ? void 0 : _a.trim();
try {
if (duplicateId && duplicateGroupDetails) {
await duplicateGroup(duplicateGroupDetails);
}
else if (!id) {
await adminClient.groups.create(group);
}
else if (rename) {
await adminClient.groups.update({ id }, { ...rename, name: group.name });
}
else {
await adminClient.groups.updateChildGroup({ id }, group);
}
refresh(rename ? { ...rename, name: group.name } : undefined);
handleModalToggle();
addAlert(t(rename
? "groupUpdated"
: duplicateId
? "groupDuplicated"
: "groupCreated"), AlertVariant.success);
}
catch (error) {
addError("couldNotCreateGroup", error);
}
};
return (_jsx(Modal, { variant: ModalVariant.small, title: rename
? t("renameAGroup")
: duplicateId
? t("duplicateAGroup")
: t("createAGroup"), isOpen: true, onClose: handleModalToggle, actions: [
_jsx(FormSubmitButton, { formState: formState, "data-testid": `${rename ? "rename" : duplicateId ? "duplicate" : "create"}Group`, form: "group-form", allowInvalid: true, allowNonDirty: true, children: t(rename ? "rename" : duplicateId ? "duplicate" : "create") }, "confirm"),
_jsx(Button, { id: "modal-cancel", "data-testid": "cancel", variant: ButtonVariant.link, onClick: handleModalToggle, children: t("cancel") }, "cancel"),
], children: _jsx(FormProvider, { ...form, children: _jsxs(Form, { id: "group-form", isHorizontal: true, onSubmit: handleSubmit(submitForm), children: [duplicateId && (_jsx(Alert, { variant: "warning", component: "h2", isInline: true, title: t("duplicateGroupWarning") })), _jsx(TextControl, { name: "name", label: t("name"), rules: { required: t("required") }, autoFocus: true })] }) }) }));
};
//# sourceMappingURL=GroupsModal.js.map