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 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, isLoading: isPermissionCatalogLoading } = usePermissionCatalog(); const [permissionError, setPermissionError] = React.useState(null); const defaultValues = React.useMemo( () => ({ name: '', description: '', computedPermissions: getComputedPermissionsDefaultValues( permissionCatalogData?.data, { isCreator: true, }, ), }), [permissionCatalogData], ); const handleRoleCreation = async (roleData) => { try { setPermissionError(null); 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 permissionError = getPermissionsErrorMessage(error); if (permissionError) { setPermissionError(permissionError); } const errors = error?.response?.data?.errors; throw errors || error; } }; return ( {formatMessage('createRolePage.title')}
( {permissionError && ( {formatMessage('createRole.permissionsError')}
                      {permissionError}
                    
)} {errors?.root?.general && !permissionError && ( {errors?.root?.general?.message} )} {formatMessage('createRole.submit')}
)} /> ); }