This commit is contained in:
mfrachet 2021-03-10 09:15:24 +01:00
parent cdcac62ee2
commit a04322d585
7 changed files with 71 additions and 17 deletions

View File

@ -9,7 +9,7 @@ import ListView from './index';
const ListViewLayout = ({ layout, ...props }) => { const ListViewLayout = ({ layout, ...props }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const initialParams = useSelector(state => state.get('content-manager_listView').initialParams); const initialParams = useSelector(state => state.get('content-manager_listView').initialParams);
const [, setQuery] = useQueryParams(initialParams); const [{ query }, setQuery] = useQueryParams(initialParams);
useEffect(() => { useEffect(() => {
dispatch(setLayout(layout.contentType)); dispatch(setLayout(layout.contentType));
@ -22,12 +22,14 @@ const ListViewLayout = ({ layout, ...props }) => {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [initialParams]); }, [initialParams]);
if (!initialParams) { if (!initialParams) {
return null; return null;
} }
return ( return (
<RBACManager {...props}> <RBACManager {...props} query={query}>
<ListView {...props} layout={layout} /> <ListView {...props} layout={layout} />
</RBACManager> </RBACManager>
); );

View File

@ -98,6 +98,7 @@ function ListView({
allowedActions: { canCreate, canRead, canUpdate, canDelete }, allowedActions: { canCreate, canRead, canUpdate, canDelete },
} = useUserPermissions(viewPermissions, permissions); } = useUserPermissions(viewPermissions, permissions);
const [{ query }, setQuery] = useQueryParams(initialParams); const [{ query }, setQuery] = useQueryParams(initialParams);
const params = buildQueryString(query); const params = buildQueryString(query);

View File

@ -1,9 +1,13 @@
import { RESET_PERMISSIONS, SET_PERMISSIONS } from './constants'; import { RESET_PERMISSIONS, SET_PERMISSIONS } from './constants';
export const setPermissions = permissions => { export const setPermissions = (permissions, pluginOptions, containerName) => {
return { return {
type: SET_PERMISSIONS, type: SET_PERMISSIONS,
permissions, permissions,
__meta__: {
pluginOptions,
containerName,
},
}; };
}; };

View File

@ -1,28 +1,33 @@
import React, { cloneElement, Children, useEffect } from 'react'; import React, { cloneElement, Children, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import get from 'lodash/get';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { LoadingIndicatorPage } from 'strapi-helper-plugin'; import { LoadingIndicatorPage } from 'strapi-helper-plugin';
import pluginId from '../../pluginId'; import pluginId from '../../pluginId';
import { resetPermissions, setPermissions } from './actions'; import { resetPermissions, setPermissions } from './actions';
const RBACManager = props => { const selectPermissions = state => state.get(`${pluginId}_rbacManager`).permissions;
const { collectionTypesRelatedPermissions } = useSelector(state =>
state.get('permissionsManager') const selectCollectionTypePermissions = state =>
); state.get('permissionsManager').collectionTypesRelatedPermissions;
const { permissions } = useSelector(state => state.get(`${pluginId}_rbacManager`));
const RBACManager = ({ query, ...props }) => {
const collectionTypesRelatedPermissions = useSelector(selectCollectionTypePermissions);
const permissions = useSelector(selectPermissions);
const dispatch = useDispatch(); const dispatch = useDispatch();
const collectionTypeUID = props.slug; const collectionTypeUID = props.slug;
const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID];
useEffect(() => { useEffect(() => {
const relatedPermissions = get(collectionTypesRelatedPermissions, [collectionTypeUID], {}); if (query.pluginOptions && relatedPermissions) {
dispatch(setPermissions(relatedPermissions, query.pluginOptions, 'listView'));
dispatch(setPermissions(relatedPermissions)); return () => {
dispatch(resetPermissions());
return () => { };
dispatch(resetPermissions()); }
}; }, [relatedPermissions, dispatch, query]);
}, [collectionTypeUID, collectionTypesRelatedPermissions, dispatch]);
if (!permissions) { if (!permissions) {
return <LoadingIndicatorPage />; return <LoadingIndicatorPage />;

View File

@ -1,5 +1,5 @@
import React, { useState } from 'react'; 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 { Picker, Padded, Text, Flex } from '@buffetjs/core';
import { Carret, useQueryParams } from 'strapi-helper-plugin'; import { Carret, useQueryParams } from 'strapi-helper-plugin';
import styled from 'styled-components'; import styled from 'styled-components';
@ -40,6 +40,7 @@ const selectContentManagerListViewPluginOptions = state =>
const selectI18NLocales = state => state.get('i18n_locales').locales; const selectI18NLocales = state => state.get('i18n_locales').locales;
const LocalePicker = () => { const LocalePicker = () => {
const dispatch = useDispatch();
const pluginOptions = useSelector(selectContentManagerListViewPluginOptions); const pluginOptions = useSelector(selectContentManagerListViewPluginOptions);
const locales = useSelector(selectI18NLocales); const locales = useSelector(selectI18NLocales);
const [selected, setSelected] = useState(locales && locales[0]); const [selected, setSelected] = useState(locales && locales[0]);
@ -68,6 +69,7 @@ const LocalePicker = () => {
)} )}
renderSectionContent={onToggle => { renderSectionContent={onToggle => {
const handleClick = locale => { const handleClick = locale => {
dispatch({ type: 'ContentManager/RBACManager/RESET_PERMISSIONS' });
setSelected(locale); setSelected(locale);
setQuery({ pluginOptions: { ...query.pluginOptions, locale: locale.code } }); setQuery({ pluginOptions: { ...query.pluginOptions, locale: locale.code } });
onToggle(); onToggle();

View File

@ -1,11 +1,13 @@
import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware'; import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware';
import extendCTBAttributeInitialDataMiddleware from './extendCTBAttributeInitialDataMiddleware'; import extendCTBAttributeInitialDataMiddleware from './extendCTBAttributeInitialDataMiddleware';
import localeQueryParamsMiddleware from './localeQueryParamsMiddleware'; import localeQueryParamsMiddleware from './localeQueryParamsMiddleware';
import localePermissionMiddleware from './localePermissionMiddleware';
const middlewares = [ const middlewares = [
extendCTBInitialDataMiddleware, extendCTBInitialDataMiddleware,
extendCTBAttributeInitialDataMiddleware, extendCTBAttributeInitialDataMiddleware,
localeQueryParamsMiddleware, localeQueryParamsMiddleware,
localePermissionMiddleware,
]; ];
export default middlewares; export default middlewares;

View File

@ -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;