import React, { useCallback, useState } from "react"; import * as Yup from "yup"; import { EntityCollection, FieldCaption, Role, toSnakeCase, useAuthController, User, useTranslation } from "@firecms/core"; import { Button, Checkbox, CheckIcon, Dialog, DialogActions, DialogContent, DialogTitle, LoadingButton, Paper, Select, SelectItem, Table, TableBody, TableCell, TableHeader, TableRow, TextField, Tooltip, Typography } from "@firecms/ui"; import { useUserManagement } from "../../hooks"; import { Formex, getIn, useCreateFormex } from "@firecms/formex"; export const getRoleYupSchema = (t: any) => Yup.object().shape({ id: Yup.string().required(t("required")), name: Yup.string().required(t("required")) }); function canRoleBeEdited(loggedUser: User, t: any) { const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes("admin"); if (!loggedUserIsAdmin) { throw new Error(t("only_admins_edit_roles")); } return true; } export function RolesDetailsForm({ open, role, editable, handleClose, collections }: { open: boolean, editable?: boolean, role?: Role, handleClose: () => void, collections?: EntityCollection[] }) { const { t } = useTranslation(); const { saveRole } = useUserManagement(); const isNewRole = !role; const { user: loggedInUser } = useAuthController(); const [savingError, setSavingError] = useState(); const onRoleUpdated = useCallback((role: Role) => { setSavingError(undefined); if (!loggedInUser) throw new Error(t("error_user_not_found")); canRoleBeEdited(loggedInUser, t); return saveRole(role); }, [saveRole, loggedInUser, t]); const formex = useCreateFormex({ initialValues: role ?? { name: "" } as Role, onSubmit: (role: Role, formexController) => { try { return onRoleUpdated(role) .then(() => { formexController.resetForm({ values: role }); handleClose(); }) .catch(e => { setSavingError(e); }); } catch (e: any) { setSavingError(e); return Promise.resolve(); } }, validation: (values) => { return getRoleYupSchema(t).validate(values, { abortEarly: false }) .then(() => ({})) .catch((e) => { const errors: Record = {}; e.inner.forEach((error: any) => { errors[error.path] = error.message; }); return errors; }); } }); const { isSubmitting, touched, values, errors, handleChange, setFieldValue, dirty, setFieldTouched } = formex; const isAdmin = values.isAdmin ?? false; const defaultCreate = values.defaultPermissions?.create ?? false; const defaultRead = values.defaultPermissions?.read ?? false; const defaultEdit = values.defaultPermissions?.edit ?? false; const defaultDelete = values.defaultPermissions?.delete ?? false; React.useEffect(() => { const idTouched = getIn(touched, "id"); if (!idTouched && values.name) { setFieldValue("id", toSnakeCase(values.name)) } }, [touched, values.name]); return (
{t("role")}
{touched.name && Boolean(errors.name) ? errors.name : t("name_of_this_role")}
{ handleChange(e); setFieldTouched("id", true) }} aria-describedby="id-helper-text" label={t("id")} /> {touched.id && Boolean(errors.id) ? errors.id : t("id_of_this_role")}
{t("create_entities")} {t("read_entities")} {t("update_entities")} {t("delete_entities")} {t("all_collections")} setFieldValue("defaultPermissions.create", checked)} /> setFieldValue("defaultPermissions.read", checked)} /> setFieldValue("defaultPermissions.edit", checked)} /> setFieldValue("defaultPermissions.delete", checked)} /> {collections && collections.map((col) => ( {col.name} setFieldValue(`collectionPermissions.${col.id}.create`, checked)}/> setFieldValue(`collectionPermissions.${col.id}.read`, checked)}/> setFieldValue(`collectionPermissions.${col.id}.edit`, checked)}/> setFieldValue(`collectionPermissions.${col.id}.delete`, checked)}/> ))}
{t("customise_permissions_description")}
{touched.config && Boolean(errors.config) ? errors.config : t("can_user_create_collections")}
{touched.config && Boolean(errors.config) ? errors.config : t("can_user_edit_collections")}
{touched.config && Boolean(errors.config) ? errors.config : t("can_user_delete_collections")}
{savingError && {savingError.message ?? t("error_saving_role")} } {isNewRole ? t("create_role") : t("update")}
); }