import LoadingButton from '@mui/lab/LoadingButton'; import Grid from '@mui/material/Grid'; import Stack from '@mui/material/Stack'; import Alert from '@mui/material/Alert'; import AlertTitle from '@mui/material/AlertTitle'; import PermissionCatalogField from 'components/PermissionCatalogField/index.ee'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { yupResolver } from '@hookform/resolvers/yup'; import * as yup from 'yup'; import Container from 'components/Container'; import Form from 'components/Form'; import PageTitle from 'components/PageTitle'; import TextField from 'components/TextField'; import * as URLS from 'config/urls'; import { getComputedPermissionsDefaultValues, getPermissions, } from 'helpers/computePermissions.ee'; import { getGeneralErrorMessage } from 'helpers/errors'; import useFormatMessage from 'hooks/useFormatMessage'; import useAdminCreateRole from 'hooks/useAdminCreateRole'; import usePermissionCatalog from 'hooks/usePermissionCatalog.ee'; const getValidationSchema = (formatMessage) => { const getMandatoryFieldMessage = (fieldTranslationId) => formatMessage('roleForm.mandatoryInput', { inputName: formatMessage(fieldTranslationId), }); return yup.object().shape({ name: yup .string() .trim() .required(getMandatoryFieldMessage('roleForm.name')), description: yup.string().trim(), }); }; const getPermissionsErrorMessage = (error) => { const errors = error?.response?.data?.errors; if (errors) { const permissionsErrors = Object.keys(errors) .filter((key) => key.startsWith('permissions')) .reduce((obj, key) => { obj[key] = errors[key]; return obj; }, {}); if (Object.keys(permissionsErrors).length > 0) { return JSON.stringify(permissionsErrors, null, 2); } } return null; }; export default function CreateRole() { const navigate = useNavigate(); const formatMessage = useFormatMessage(); const enqueueSnackbar = useEnqueueSnackbar(); const { mutateAsync: createRole, isPending: isCreateRolePending } = useAdminCreateRole(); const { data: permissionCatalogData } = usePermissionCatalog(); const defaultValues = React.useMemo( () => ({ name: '', description: '', computedPermissions: getComputedPermissionsDefaultValues( permissionCatalogData?.data, { isCreator: true, }, ), }), [permissionCatalogData], ); const handleRoleCreation = async (roleData, e, setError) => { try { const permissions = getPermissions(roleData.computedPermissions); await createRole({ name: roleData.name, description: roleData.description, permissions, }); enqueueSnackbar(formatMessage('createRole.successfullyCreated'), { variant: 'success', SnackbarProps: { 'data-test': 'snackbar-create-role-success', }, }); navigate(URLS.ROLES); } catch (error) { const errors = error?.response?.data?.errors; if (errors) { const fieldNames = ['name', 'description']; Object.entries(errors).forEach(([fieldName, fieldErrors]) => { if (fieldNames.includes(fieldName) && Array.isArray(fieldErrors)) { setError(fieldName, { type: 'fieldRequestError', message: fieldErrors.join(', '), }); } }); } const permissionError = getPermissionsErrorMessage(error); if (permissionError) { setError('root.permissions', { type: 'fieldRequestError', message: permissionError, }); } const generalError = getGeneralErrorMessage({ error, fallbackMessage: formatMessage('createRole.generalError'), }); if (generalError) { setError('root.general', { type: 'requestError', message: generalError, }); } } }; return ( {formatMessage('createRolePage.title')}
( {errors?.root?.permissions && ( {formatMessage('createRole.permissionsError')}
                      {errors?.root?.permissions?.message}
                    
)} {errors?.root?.general && ( {errors?.root?.general?.message} )} {formatMessage('createRole.submit')}
)} /> ); }