diff --git a/src/containers/Preferences/Users/Roles/RolesForm/RolesForm.js b/src/containers/Preferences/Users/Roles/RolesForm/RolesForm.js index 5062bb2e4..a1af99e4d 100644 --- a/src/containers/Preferences/Users/Roles/RolesForm/RolesForm.js +++ b/src/containers/Preferences/Users/Roles/RolesForm/RolesForm.js @@ -2,6 +2,7 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import intl from 'react-intl-universal'; import { Formik } from 'formik'; +import { isEmpty } from 'lodash'; import 'style/pages/Preferences/Roles/Form.scss'; @@ -12,7 +13,11 @@ import { AppToaster, FormattedMessage as T } from 'components'; import { CreateRolesFormSchema, EditRolesFormSchema } from './RolesForm.schema'; import { useRolesFormContext } from './RolesFormProvider'; -import { transformToArray } from './utils'; +import { + getNewRoleInitialValues, + transformToArray, + transformToObject, +} from './utils'; import RolesFormContent from './RolesFormContent'; import withDashboardActions from 'containers/Dashboard/withDashboardActions'; @@ -35,24 +40,28 @@ function RolesForm({ // History context. const history = useHistory(); + // Role form context. const { isNewMode, createRolePermissionMutate, editRolePermissionMutate, - permissionSchema, + permissionsSchema, + role, roleId, } = useRolesFormContext(); // Initial values. const initialValues = { ...defaultValues, - ...transformToForm(permissionSchema, defaultValues), + ...(!isEmpty(role) + ? transformToForm(transformToObject(role), defaultValues) + : getNewRoleInitialValues(permissionsSchema)), }; - React.useEffect(() => { changePreferencesPageTitle(); }, [changePreferencesPageTitle]); + // Handle the form submit. const handleFormSubmit = (values, { setSubmitting }) => { const permission = transformToArray(values); const form = { diff --git a/src/containers/Preferences/Users/Roles/RolesForm/RolesFormProvider.js b/src/containers/Preferences/Users/Roles/RolesForm/RolesFormProvider.js index 2484f0c62..06fb0d076 100644 --- a/src/containers/Preferences/Users/Roles/RolesForm/RolesFormProvider.js +++ b/src/containers/Preferences/Users/Roles/RolesForm/RolesFormProvider.js @@ -25,27 +25,27 @@ function RolesFormProvider({ roleId, ...props }) { const { mutateAsync: editRolePermissionMutate } = useEditRolePermissionSchema(); + // Retrieve permissions schema. const { data: permissionsSchema, isLoading: isPermissionsSchemaLoading, isFetching: isPermissionsSchemaFetching, } = usePermissionsSchema(); - const { data: permission, isLoading: isPermissionLoading } = + const { data: role, isLoading: isPermissionLoading } = useRolePermission(roleId, { enabled: !!roleId, }); + // Detarmines whether the new or edit mode. const isNewMode = !roleId; - const permissionSchema = transformToObject(permission); - // Provider state. const provider = { isNewMode, roleId, + role, permissionsSchema, - permissionSchema, isPermissionsSchemaLoading, isPermissionsSchemaFetching, createRolePermissionMutate, diff --git a/src/containers/Preferences/Users/Roles/RolesForm/utils.js b/src/containers/Preferences/Users/Roles/RolesForm/utils.js index bdb6ef36a..3d73bb7bf 100644 --- a/src/containers/Preferences/Users/Roles/RolesForm/utils.js +++ b/src/containers/Preferences/Users/Roles/RolesForm/utils.js @@ -1,5 +1,3 @@ -import { isEmpty } from 'lodash'; - export const transformToArray = ({ permissions }) => { return Object.keys(permissions).map((index) => { const [value, key] = index.split('/'); @@ -12,16 +10,44 @@ export const transformToArray = ({ permissions }) => { }); }; -export const transformToObject = ({ name, description, permissions }) => { - if (!isEmpty(permissions)) { - const output = {}; - permissions.forEach((item) => { - output[`${item.subject}/${item.ability}`] = !!item.value; - }); - return { - role_name: name, - role_description: description, - permissions: { ...output }, - }; - } +export const transformPermissionsToObject = (permissions) => { + const output = {}; + permissions.forEach((item) => { + output[`${item.subject}/${item.ability}`] = !!item.value; + }); + return output; +}; + +export const transformToObject = (role) => { + return { + role_name: role.name, + role_description: role.description, + permissions: transformPermissionsToObject(role.permissions), + }; +}; + +export const getDefaultValuesFromSchema = (schema) => { + return schema + .map((item) => { + const abilities = [ + ...(item.abilities || []), + ...(item.extra_abilities || []), + ]; + return abilities + .filter((ability) => ability.default) + .map((ability) => ({ + subject: item.subject, + ability: ability.key, + value: ability.default, + })); + }) + .flat(); +}; + +export const getNewRoleInitialValues = (schema) => { + return { + permissions: transformPermissionsToObject( + getDefaultValuesFromSchema(schema), + ), + }; }; diff --git a/src/containers/Preferences/Users/Roles/RolesLanding/RolesDataTable.js b/src/containers/Preferences/Users/Roles/RolesLanding/RolesDataTable.js index f4857cbc1..8337ffde7 100644 --- a/src/containers/Preferences/Users/Roles/RolesLanding/RolesDataTable.js +++ b/src/containers/Preferences/Users/Roles/RolesLanding/RolesDataTable.js @@ -1,10 +1,10 @@ import React from 'react'; -import { Intent, Tag } from '@blueprintjs/core'; +import { Intent } from '@blueprintjs/core'; import { useHistory } from 'react-router-dom'; - import intl from 'react-intl-universal'; +import styled from 'styled-components'; -import { DataTable, Choose, AppToaster } from 'components'; +import { DataTable, AppToaster } from 'components'; import TableSkeletonRows from 'components/Datatable/TableSkeletonRows'; import { useRolesTableColumns, ActionsMenu } from './components'; @@ -23,10 +23,13 @@ function RolesDataTable({ // History context. const history = useHistory(); + // Retrieve roles table columns const columns = useRolesTableColumns(); + // Roles table context. const { roles, isRolesFetching, isRolesLoading } = useRolesContext(); + // handles delete the given role. const handleDeleteRole = ({ id, predefined }) => { if (predefined) { AppToaster.show({ @@ -37,24 +40,20 @@ function RolesDataTable({ openAlert('role-delete', { roleId: id }); } }; - + // Handles the edit of the given role. const handleEditRole = ({ id, predefined }) => { if (predefined) { - { - AppToaster.show({ - message: intl.get('roles.error.you_cannot_edit_predefined_roles'), - intent: Intent.DANGER, - }); - } + AppToaster.show({ + message: intl.get('roles.error.you_cannot_edit_predefined_roles'), + intent: Intent.DANGER, + }); } else { - { - history.push(`/preferences/roles/${id}`); - } + history.push(`/preferences/roles/${id}`); } }; return ( - res.data.role, - defaultData: { - permission: [], - }, + defaultData: {}, ...props, }, );