2020-10-20 18:04:16 +02:00
|
|
|
import React, { memo, useReducer, forwardRef, useMemo, useImperativeHandle } from 'react';
|
2020-06-22 01:11:03 +02:00
|
|
|
import PropTypes from 'prop-types';
|
2020-10-01 17:43:06 +02:00
|
|
|
import init from 'ee_else_ce/components/Roles/Permissions/init';
|
2020-10-20 18:04:16 +02:00
|
|
|
import reducer, { initialState } from 'ee_else_ce/components/Roles/Permissions/reducer';
|
2020-06-01 10:53:36 +02:00
|
|
|
|
|
|
|
import Tabs from '../Tabs';
|
|
|
|
import ContentTypes from './ContentTypes';
|
2020-06-28 01:35:41 +02:00
|
|
|
import PluginsAndSettingsPermissions from './PluginsAndSettingsPermissions';
|
2020-06-01 10:53:36 +02:00
|
|
|
import { roleTabsLabel } from '../../../utils';
|
2020-06-11 14:41:58 +02:00
|
|
|
import { useModels } from '../../../hooks';
|
|
|
|
import PermissionsProvider from './PermissionsProvider';
|
2020-06-28 01:35:41 +02:00
|
|
|
import { getAllAttributes, formatPermissionsLayout } from './utils';
|
2020-06-01 10:53:36 +02:00
|
|
|
|
2020-07-08 12:02:46 +02:00
|
|
|
const Permissions = forwardRef(({ role, permissionsLayout, rolePermissions }, ref) => {
|
2020-06-11 14:41:58 +02:00
|
|
|
const { singleTypes, collectionTypes, components } = useModels();
|
2020-06-22 01:11:03 +02:00
|
|
|
const [state, dispatch] = useReducer(reducer, initialState, state =>
|
2020-07-08 12:02:46 +02:00
|
|
|
init(state, permissionsLayout, rolePermissions, role)
|
2020-06-22 01:11:03 +02:00
|
|
|
);
|
|
|
|
|
2020-06-23 21:54:03 +02:00
|
|
|
useImperativeHandle(ref, () => ({
|
|
|
|
getPermissions: () => {
|
2020-06-25 14:32:36 +02:00
|
|
|
return {
|
|
|
|
contentTypesPermissions: state.contentTypesPermissions,
|
|
|
|
pluginsAndSettingsPermissions: state.pluginsAndSettingsPermissions,
|
|
|
|
};
|
2020-06-23 21:54:03 +02:00
|
|
|
},
|
2020-08-31 10:17:12 +02:00
|
|
|
resetForm: () => {
|
|
|
|
dispatch({ type: 'ON_RESET' });
|
|
|
|
},
|
|
|
|
setFormAfterSubmit: () => {
|
|
|
|
dispatch({ type: 'ON_SUBMIT_SUCCEEDED' });
|
|
|
|
},
|
2020-06-23 21:54:03 +02:00
|
|
|
}));
|
|
|
|
|
|
|
|
const allSingleTypesAttributes = useMemo(() => {
|
|
|
|
return getAllAttributes(singleTypes, components);
|
|
|
|
}, [components, singleTypes]);
|
|
|
|
|
|
|
|
const allCollectionTypesAttributes = useMemo(() => {
|
|
|
|
return getAllAttributes(collectionTypes, components);
|
|
|
|
}, [components, collectionTypes]);
|
2020-06-11 14:41:58 +02:00
|
|
|
|
2020-06-28 01:35:41 +02:00
|
|
|
const pluginsPermissionsLayout = useMemo(() => {
|
|
|
|
return formatPermissionsLayout(permissionsLayout.sections.plugins, 'plugin');
|
|
|
|
}, [permissionsLayout]);
|
|
|
|
|
|
|
|
const settingsPermissionsLayout = useMemo(() => {
|
|
|
|
return formatPermissionsLayout(permissionsLayout.sections.settings, 'category');
|
|
|
|
}, [permissionsLayout]);
|
|
|
|
|
2020-06-11 14:41:58 +02:00
|
|
|
const providerValues = {
|
|
|
|
...state,
|
2020-10-20 18:04:16 +02:00
|
|
|
dispatch,
|
2020-06-11 14:41:58 +02:00
|
|
|
components,
|
|
|
|
};
|
2020-06-01 10:53:36 +02:00
|
|
|
|
|
|
|
return (
|
2020-06-11 14:41:58 +02:00
|
|
|
<PermissionsProvider value={providerValues}>
|
|
|
|
<Tabs tabsLabel={roleTabsLabel}>
|
2020-06-23 21:54:03 +02:00
|
|
|
<ContentTypes
|
|
|
|
allContentTypesAttributes={allCollectionTypesAttributes}
|
|
|
|
contentTypes={collectionTypes}
|
|
|
|
/>
|
|
|
|
<ContentTypes
|
|
|
|
allContentTypesAttributes={allSingleTypesAttributes}
|
|
|
|
contentTypes={singleTypes}
|
|
|
|
/>
|
2020-06-28 01:35:41 +02:00
|
|
|
<PluginsAndSettingsPermissions
|
|
|
|
permissionType="plugin"
|
|
|
|
pluginsPermissionsLayout={pluginsPermissionsLayout}
|
|
|
|
/>
|
2020-12-03 11:29:48 +01:00
|
|
|
<PluginsAndSettingsPermissions
|
|
|
|
permissionType="settings"
|
|
|
|
pluginsPermissionsLayout={settingsPermissionsLayout}
|
|
|
|
/>
|
2020-06-11 14:41:58 +02:00
|
|
|
</Tabs>
|
|
|
|
</PermissionsProvider>
|
2020-06-01 10:53:36 +02:00
|
|
|
);
|
2020-06-23 21:54:03 +02:00
|
|
|
});
|
2020-06-01 10:53:36 +02:00
|
|
|
|
2020-07-08 12:02:46 +02:00
|
|
|
Permissions.defaultProps = {
|
|
|
|
role: null,
|
|
|
|
rolePermissions: {},
|
|
|
|
};
|
2020-06-22 01:11:03 +02:00
|
|
|
Permissions.propTypes = {
|
|
|
|
permissionsLayout: PropTypes.object.isRequired,
|
2020-07-08 12:02:46 +02:00
|
|
|
rolePermissions: PropTypes.object,
|
|
|
|
role: PropTypes.object,
|
2020-06-22 01:11:03 +02:00
|
|
|
};
|
2020-08-31 10:17:12 +02:00
|
|
|
|
|
|
|
export default memo(Permissions);
|