2020-08-31 12:09:39 +02:00
|
|
|
import React, {
|
|
|
|
memo,
|
|
|
|
useCallback,
|
|
|
|
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-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';
|
|
|
|
import reducer, { initialState } from './reducer';
|
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 handleCollapse = (index, value) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'COLLAPSE_PATH',
|
|
|
|
index,
|
|
|
|
value,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-06-22 01:11:03 +02:00
|
|
|
const handleAttributePermissionSelect = ({ subject, action, attribute }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ATTRIBUTE_PERMISSION_SELECT',
|
|
|
|
subject,
|
|
|
|
action,
|
|
|
|
attribute,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-06-23 21:54:03 +02:00
|
|
|
const handleSetAttributesPermissions = ({
|
|
|
|
attributes,
|
|
|
|
action,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
hasContentTypeAction,
|
2020-06-23 21:54:03 +02:00
|
|
|
}) => {
|
2020-06-22 01:11:03 +02:00
|
|
|
dispatch({
|
|
|
|
type: 'SET_ATTRIBUTES_PERMISSIONS',
|
|
|
|
attributes,
|
|
|
|
action,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
hasContentTypeAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-06-23 21:54:03 +02:00
|
|
|
const handleAttributesSelect = ({
|
2020-06-22 01:11:03 +02:00
|
|
|
subject,
|
|
|
|
action,
|
|
|
|
attributes,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
hasContentTypeAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
}) => {
|
|
|
|
dispatch({
|
2020-06-25 00:11:04 +02:00
|
|
|
type: 'ON_ATTRIBUTES_SELECT',
|
2020-06-22 01:11:03 +02:00
|
|
|
subject,
|
|
|
|
action,
|
|
|
|
attributes,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
hasContentTypeAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleContentTypeActionSelect = ({ subject, action }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'CONTENT_TYPE_ACTION_SELECT',
|
|
|
|
subject,
|
|
|
|
action,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleAllContentTypeActions = ({
|
|
|
|
subject,
|
|
|
|
attributes,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
shouldSetAllContentTypes,
|
2020-07-09 14:04:11 +02:00
|
|
|
shouldAddDeleteAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
}) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ALL_CONTENT_TYPE_PERMISSIONS_SELECT',
|
|
|
|
subject,
|
|
|
|
attributes,
|
|
|
|
shouldEnable,
|
2020-06-25 00:11:04 +02:00
|
|
|
shouldSetAllContentTypes,
|
2020-07-09 14:04:11 +02:00
|
|
|
shouldAddDeleteAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleGlobalPermissionsActionSelect = ({ contentTypes, action, shouldEnable }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'GLOBAL_PERMISSIONS_SELECT',
|
|
|
|
contentTypes,
|
|
|
|
action,
|
|
|
|
shouldEnable,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-07-09 12:16:01 +02:00
|
|
|
const handleAllAttributeActionsSelect = ({ subject, attribute, shouldAddDeleteAction }) => {
|
2020-06-22 01:11:03 +02:00
|
|
|
dispatch({
|
|
|
|
type: 'ALL_ATTRIBUTE_ACTIONS_SELECT',
|
|
|
|
subject,
|
|
|
|
attribute,
|
2020-07-09 12:16:01 +02:00
|
|
|
shouldAddDeleteAction,
|
2020-06-22 01:11:03 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-06-28 01:35:41 +02:00
|
|
|
const handlePluginSettingPermission = action => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ON_PLUGIN_SETTING_ACTION',
|
|
|
|
action,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handlePluginSettingSubCategoryPermission = ({ actions, shouldEnable }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ON_PLUGIN_SETTING_SUB_CATEGORY_ACTIONS',
|
|
|
|
actions,
|
|
|
|
shouldEnable,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-07-01 21:14:42 +02:00
|
|
|
const handleContentTypeConditionsSelect = ({ subject, conditions }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ON_CONTENT_TYPE_CONDITIONS_SELECT',
|
|
|
|
subject,
|
|
|
|
conditions,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handlePluginSettingConditionsSelect = conditions => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ON_PLUGIN_SETTING_CONDITIONS_SELECT',
|
|
|
|
conditions,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-08-31 12:09:39 +02:00
|
|
|
const handleGlobalPublishActionSelect = useCallback(({ contentTypes, value }) => {
|
|
|
|
dispatch({
|
|
|
|
type: 'ON_GLOBAL_PUBLISH_ACTION_SELECT',
|
|
|
|
contentTypes,
|
|
|
|
value,
|
|
|
|
});
|
|
|
|
}, []);
|
|
|
|
|
2020-06-11 14:41:58 +02:00
|
|
|
const providerValues = {
|
|
|
|
...state,
|
|
|
|
components,
|
|
|
|
onCollapse: handleCollapse,
|
2020-06-22 01:11:03 +02:00
|
|
|
onAttributePermissionSelect: handleAttributePermissionSelect,
|
|
|
|
onAllAttributeActionsSelect: handleAllAttributeActionsSelect,
|
|
|
|
onContentTypeActionSelect: handleContentTypeActionSelect,
|
2020-06-23 21:54:03 +02:00
|
|
|
onAttributesSelect: handleAttributesSelect,
|
2020-06-22 01:11:03 +02:00
|
|
|
onAllContentTypeActions: handleAllContentTypeActions,
|
|
|
|
onGlobalPermissionsActionSelect: handleGlobalPermissionsActionSelect,
|
|
|
|
onSetAttributesPermissions: handleSetAttributesPermissions,
|
2020-06-28 01:35:41 +02:00
|
|
|
onPluginSettingPermission: handlePluginSettingPermission,
|
2020-07-01 21:14:42 +02:00
|
|
|
onContentTypeConditionsSelect: handleContentTypeConditionsSelect,
|
2020-06-28 01:35:41 +02:00
|
|
|
onPluginSettingSubCategoryPermission: handlePluginSettingSubCategoryPermission,
|
2020-07-01 21:14:42 +02:00
|
|
|
onPluginSettingConditionsSelect: handlePluginSettingConditionsSelect,
|
2020-08-31 12:09:39 +02:00
|
|
|
onGlobalPublishActionSelect: handleGlobalPublishActionSelect,
|
2020-06-11 14:41:58 +02:00
|
|
|
};
|
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}
|
|
|
|
/>
|
|
|
|
<PluginsAndSettingsPermissions 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);
|