UNPKG

@keycloakify/keycloak-admin-ui

Version:
171 lines 8.08 kB
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