diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/ListView/ListViewLayout.js b/packages/strapi-plugin-content-manager/admin/src/containers/ListView/ListViewLayout.js index 78ab19796a..2d1cb7d1b4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/ListView/ListViewLayout.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/ListView/ListViewLayout.js @@ -9,7 +9,7 @@ import ListView from './index'; const ListViewLayout = ({ layout, ...props }) => { const dispatch = useDispatch(); const initialParams = useSelector(state => state.get('content-manager_listView').initialParams); - const [, setQuery] = useQueryParams(initialParams); + const [{ query }, setQuery] = useQueryParams(initialParams); useEffect(() => { dispatch(setLayout(layout.contentType)); @@ -22,12 +22,14 @@ const ListViewLayout = ({ layout, ...props }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [initialParams]); + + if (!initialParams) { return null; } return ( - + ); diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/ListView/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/ListView/index.js index f9addfd632..e47a1c06b7 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/ListView/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/ListView/index.js @@ -98,6 +98,7 @@ function ListView({ allowedActions: { canCreate, canRead, canUpdate, canDelete }, } = useUserPermissions(viewPermissions, permissions); + const [{ query }, setQuery] = useQueryParams(initialParams); const params = buildQueryString(query); diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/actions.js b/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/actions.js index 5190d806c9..ab6df0d6cc 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/actions.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/actions.js @@ -1,9 +1,13 @@ import { RESET_PERMISSIONS, SET_PERMISSIONS } from './constants'; -export const setPermissions = permissions => { +export const setPermissions = (permissions, pluginOptions, containerName) => { return { type: SET_PERMISSIONS, permissions, + __meta__: { + pluginOptions, + containerName, + }, }; }; diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/index.js index 8719b114bf..1285a14356 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/RBACManager/index.js @@ -1,28 +1,33 @@ import React, { cloneElement, Children, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import get from 'lodash/get'; + import PropTypes from 'prop-types'; import { LoadingIndicatorPage } from 'strapi-helper-plugin'; import pluginId from '../../pluginId'; import { resetPermissions, setPermissions } from './actions'; -const RBACManager = props => { - const { collectionTypesRelatedPermissions } = useSelector(state => - state.get('permissionsManager') - ); - const { permissions } = useSelector(state => state.get(`${pluginId}_rbacManager`)); +const selectPermissions = state => state.get(`${pluginId}_rbacManager`).permissions; + +const selectCollectionTypePermissions = state => + state.get('permissionsManager').collectionTypesRelatedPermissions; + +const RBACManager = ({ query, ...props }) => { + const collectionTypesRelatedPermissions = useSelector(selectCollectionTypePermissions); + const permissions = useSelector(selectPermissions); const dispatch = useDispatch(); const collectionTypeUID = props.slug; + const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID]; + useEffect(() => { - const relatedPermissions = get(collectionTypesRelatedPermissions, [collectionTypeUID], {}); + if (query.pluginOptions && relatedPermissions) { + dispatch(setPermissions(relatedPermissions, query.pluginOptions, 'listView')); - dispatch(setPermissions(relatedPermissions)); - - return () => { - dispatch(resetPermissions()); - }; - }, [collectionTypeUID, collectionTypesRelatedPermissions, dispatch]); + return () => { + dispatch(resetPermissions()); + }; + } + }, [relatedPermissions, dispatch, query]); if (!permissions) { return ; diff --git a/packages/strapi-plugin-i18n/admin/src/components/LocalePicker/index.js b/packages/strapi-plugin-i18n/admin/src/components/LocalePicker/index.js index 6cc29ec132..4a2d10481b 100644 --- a/packages/strapi-plugin-i18n/admin/src/components/LocalePicker/index.js +++ b/packages/strapi-plugin-i18n/admin/src/components/LocalePicker/index.js @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { useSelector } from 'react-redux'; +import { useSelector, useDispatch } from 'react-redux'; import { Picker, Padded, Text, Flex } from '@buffetjs/core'; import { Carret, useQueryParams } from 'strapi-helper-plugin'; import styled from 'styled-components'; @@ -40,6 +40,7 @@ const selectContentManagerListViewPluginOptions = state => const selectI18NLocales = state => state.get('i18n_locales').locales; const LocalePicker = () => { + const dispatch = useDispatch(); const pluginOptions = useSelector(selectContentManagerListViewPluginOptions); const locales = useSelector(selectI18NLocales); const [selected, setSelected] = useState(locales && locales[0]); @@ -68,6 +69,7 @@ const LocalePicker = () => { )} renderSectionContent={onToggle => { const handleClick = locale => { + dispatch({ type: 'ContentManager/RBACManager/RESET_PERMISSIONS' }); setSelected(locale); setQuery({ pluginOptions: { ...query.pluginOptions, locale: locale.code } }); onToggle(); diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/index.js b/packages/strapi-plugin-i18n/admin/src/middlewares/index.js index 72c4aef4f1..8c892cb465 100644 --- a/packages/strapi-plugin-i18n/admin/src/middlewares/index.js +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/index.js @@ -1,11 +1,13 @@ import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware'; import extendCTBAttributeInitialDataMiddleware from './extendCTBAttributeInitialDataMiddleware'; import localeQueryParamsMiddleware from './localeQueryParamsMiddleware'; +import localePermissionMiddleware from './localePermissionMiddleware'; const middlewares = [ extendCTBInitialDataMiddleware, extendCTBAttributeInitialDataMiddleware, localeQueryParamsMiddleware, + localePermissionMiddleware, ]; export default middlewares; diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/localePermissionMiddleware.js b/packages/strapi-plugin-i18n/admin/src/middlewares/localePermissionMiddleware.js new file mode 100644 index 0000000000..a44c33fd7b --- /dev/null +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/localePermissionMiddleware.js @@ -0,0 +1,38 @@ +import get from 'lodash/get'; + +const filterPermissionWithLocale = locale => permission => + permission.properties.locales.indexOf(locale) !== -1; + +const localePermissionMiddleware = () => () => next => action => { + if (action.type !== 'ContentManager/RBACManager/SET_PERMISSIONS') { + return next(action); + } + + if (action.__meta__.containerName !== 'listView') { + return next(action); + } + + if (!get(action, '__meta__.pluginOptions.locale', false)) { + return next(action); + } + + const locale = action.__meta__.pluginOptions.locale; + const permissions = action.permissions; + + const nextPermissions = Object.keys(permissions).reduce((acc, key) => { + const currentPermission = permissions[key]; + const filteredPermissions = currentPermission.filter(filterPermissionWithLocale(locale)); + + if (filteredPermissions.length) { + acc[key] = filteredPermissions; + } + + return acc; + }, {}); + + + + return next({ ...action, permissions: nextPermissions }); +}; + +export default localePermissionMiddleware;