Chore: Move admin permissions into redux

This commit is contained in:
Gustav Hansen 2023-06-20 14:18:07 +02:00
parent a6a86c30b9
commit c44cf5c5fd
41 changed files with 479 additions and 237 deletions

View File

@ -0,0 +1,90 @@
export const ADMIN_PERMISSIONS_CE = {
contentManager: {
main: [],
collectionTypesConfigurations: [
{
action: 'plugin::content-manager.collection-types.configure-view',
subject: null,
},
],
componentsConfigurations: [
{
action: 'plugin::content-manager.components.configure-layout',
subject: null,
},
],
singleTypesConfigurations: [
{
action: 'plugin::content-manager.single-types.configure-view',
subject: null,
},
],
},
marketplace: {
main: [{ action: 'admin::marketplace.read', subject: null }],
read: [{ action: 'admin::marketplace.read', subject: null }],
},
settings: {
roles: {
main: [
{ action: 'admin::roles.create', subject: null },
{ action: 'admin::roles.update', subject: null },
{ action: 'admin::roles.read', subject: null },
{ action: 'admin::roles.delete', subject: null },
],
create: [{ action: 'admin::roles.create', subject: null }],
delete: [{ action: 'admin::roles.delete', subject: null }],
read: [{ action: 'admin::roles.read', subject: null }],
update: [{ action: 'admin::roles.update', subject: null }],
},
users: {
main: [
{ action: 'admin::users.create', subject: null },
{ action: 'admin::users.read', subject: null },
{ action: 'admin::users.update', subject: null },
{ action: 'admin::users.delete', subject: null },
],
create: [{ action: 'admin::users.create', subject: null }],
delete: [{ action: 'admin::users.delete', subject: null }],
read: [{ action: 'admin::users.read', subject: null }],
update: [{ action: 'admin::users.update', subject: null }],
},
webhooks: {
main: [
{ action: 'admin::webhooks.create', subject: null },
{ action: 'admin::webhooks.read', subject: null },
{ action: 'admin::webhooks.update', subject: null },
{ action: 'admin::webhooks.delete', subject: null },
],
create: [{ action: 'admin::webhooks.create', subject: null }],
delete: [{ action: 'admin::webhooks.delete', subject: null }],
read: [
{ action: 'admin::webhooks.read', subject: null },
// NOTE: We need to check with the API
{ action: 'admin::webhooks.update', subject: null },
{ action: 'admin::webhooks.delete', subject: null },
],
update: [{ action: 'admin::webhooks.update', subject: null }],
},
'api-tokens': {
main: [{ action: 'admin::api-tokens.access', subject: null }],
create: [{ action: 'admin::api-tokens.create', subject: null }],
delete: [{ action: 'admin::api-tokens.delete', subject: null }],
read: [{ action: 'admin::api-tokens.read', subject: null }],
update: [{ action: 'admin::api-tokens.update', subject: null }],
regenerate: [{ action: 'admin::api-tokens.regenerate', subject: null }],
},
'transfer-tokens': {
main: [{ action: 'admin::transfer.tokens.access', subject: null }],
create: [{ action: 'admin::transfer.tokens.create', subject: null }],
delete: [{ action: 'admin::transfer.tokens.delete', subject: null }],
read: [{ action: 'admin::transfer.tokens.read', subject: null }],
update: [{ action: 'admin::transfer.tokens.update', subject: null }],
regenerate: [{ action: 'admin::transfer.tokens.regenerate', subject: null }],
},
'project-settings': {
read: [{ action: 'admin::project-settings.read', subject: null }],
update: [{ action: 'admin::project-settings.update', subject: null }],
},
},
};

View File

@ -10,10 +10,11 @@ import {
import sortBy from 'lodash/sortBy'; import sortBy from 'lodash/sortBy';
import { Helmet } from 'react-helmet'; import { Helmet } from 'react-helmet';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import { Redirect, Route, Switch, useLocation, useRouteMatch } from 'react-router-dom'; import { Redirect, Route, Switch, useLocation, useRouteMatch } from 'react-router-dom';
import { DragLayer } from '../../../components/DragLayer'; import { DragLayer } from '../../../components/DragLayer';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import ModelsContext from '../../contexts/ModelsContext'; import ModelsContext from '../../contexts/ModelsContext';
import getTrad from '../../utils/getTrad'; import getTrad from '../../utils/getTrad';
import ItemTypes from '../../utils/ItemTypes'; import ItemTypes from '../../utils/ItemTypes';
@ -29,8 +30,6 @@ import { RelationDragPreview } from './components/RelationDragPreview';
import LeftMenu from './LeftMenu'; import LeftMenu from './LeftMenu';
import useContentManagerInitData from './useContentManagerInitData'; import useContentManagerInitData from './useContentManagerInitData';
const cmPermissions = permissions.contentManager;
function renderDraglayerItem({ type, item }) { function renderDraglayerItem({ type, item }) {
if ([ItemTypes.EDIT_FIELD, ItemTypes.FIELD].includes(type)) { if ([ItemTypes.EDIT_FIELD, ItemTypes.FIELD].includes(type)) {
return <CardDragPreview labelField={item.labelField} />; return <CardDragPreview labelField={item.labelField} />;
@ -73,6 +72,7 @@ const App = () => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { startSection } = useGuidedTour(); const { startSection } = useGuidedTour();
const startSectionRef = useRef(startSection); const startSectionRef = useRef(startSection);
const permissions = useSelector(selectAdminPermissions);
useEffect(() => { useEffect(() => {
if (startSectionRef.current) { if (startSectionRef.current) {
@ -127,7 +127,7 @@ const App = () => {
<ModelsContext.Provider value={{ refetchData }}> <ModelsContext.Provider value={{ refetchData }}>
<Switch> <Switch>
<Route path="/content-manager/components/:uid/configurations/edit"> <Route path="/content-manager/components/:uid/configurations/edit">
<CheckPagePermissions permissions={cmPermissions.componentsConfigurations}> <CheckPagePermissions permissions={permissions.contentManager.componentsConfigurations}>
<ComponentSettingsView /> <ComponentSettingsView />
</CheckPagePermissions> </CheckPagePermissions>
</Route> </Route>

View File

@ -3,9 +3,10 @@ import React, { memo, useMemo } from 'react';
import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin'; import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ErrorBoundary } from 'react-error-boundary'; import { ErrorBoundary } from 'react-error-boundary';
import { useSelector } from 'react-redux';
import { Route, Switch } from 'react-router-dom'; import { Route, Switch } from 'react-router-dom';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import { ContentTypeLayoutContext } from '../../contexts'; import { ContentTypeLayoutContext } from '../../contexts';
import { useFetchContentTypeLayout } from '../../hooks'; import { useFetchContentTypeLayout } from '../../hooks';
import { formatLayoutToApi } from '../../utils'; import { formatLayoutToApi } from '../../utils';
@ -16,14 +17,13 @@ import ListViewLayout from '../ListViewLayoutManager';
import ErrorFallback from './components/ErrorFallback'; import ErrorFallback from './components/ErrorFallback';
const cmPermissions = permissions.contentManager;
const CollectionTypeRecursivePath = ({ const CollectionTypeRecursivePath = ({
match: { match: {
params: { slug }, params: { slug },
url, url,
}, },
}) => { }) => {
const permissions = useSelector(selectAdminPermissions);
const { isLoading, layout, updateLayout } = useFetchContentTypeLayout(slug); const { isLoading, layout, updateLayout } = useFetchContentTypeLayout(slug);
const { rawContentTypeLayout, rawComponentsLayouts } = useMemo(() => { const { rawContentTypeLayout, rawComponentsLayouts } = useMemo(() => {
@ -92,7 +92,9 @@ const CollectionTypeRecursivePath = ({
<ContentTypeLayoutContext.Provider value={layout}> <ContentTypeLayoutContext.Provider value={layout}>
<Switch> <Switch>
<Route path={`${url}/configurations/list`}> <Route path={`${url}/configurations/list`}>
<CheckPagePermissions permissions={cmPermissions.collectionTypesConfigurations}> <CheckPagePermissions
permissions={permissions.contentManager.collectionTypesConfigurations}
>
<ListSettingsView <ListSettingsView
layout={rawContentTypeLayout} layout={rawContentTypeLayout}
slug={slug} slug={slug}
@ -101,7 +103,9 @@ const CollectionTypeRecursivePath = ({
</CheckPagePermissions> </CheckPagePermissions>
</Route> </Route>
<Route path={`${url}/configurations/edit`}> <Route path={`${url}/configurations/edit`}>
<CheckPagePermissions permissions={cmPermissions.collectionTypesConfigurations}> <CheckPagePermissions
permissions={permissions.contentManager.collectionTypesConfigurations}
>
<EditSettingsView <EditSettingsView
components={rawComponentsLayouts} components={rawComponentsLayouts}
isContentTypeView isContentTypeView

View File

@ -5,19 +5,18 @@ import axios from 'axios';
import { shallowEqual, useSelector } from 'react-redux'; import { shallowEqual, useSelector } from 'react-redux';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import { getData, getDataSucceeded } from '../../sharedReducers/crudReducer/actions'; import { getData, getDataSucceeded } from '../../sharedReducers/crudReducer/actions';
import crudReducer, { crudInitialState } from '../../sharedReducers/crudReducer/reducer'; import crudReducer, { crudInitialState } from '../../sharedReducers/crudReducer/reducer';
import { mergeMetasWithSchema } from '../../utils'; import { mergeMetasWithSchema } from '../../utils';
import { makeSelectModelAndComponentSchemas } from '../App/selectors'; import { makeSelectModelAndComponentSchemas } from '../App/selectors';
import EditSettingsView from '../EditSettingsView'; import EditSettingsView from '../EditSettingsView';
const cmPermissions = permissions.contentManager;
const ComponentSettingsView = () => { const ComponentSettingsView = () => {
const [{ isLoading, data: layout }, dispatch] = useReducer(crudReducer, crudInitialState); const [{ isLoading, data: layout }, dispatch] = useReducer(crudReducer, crudInitialState);
const schemasSelector = useMemo(makeSelectModelAndComponentSchemas, []); const schemasSelector = useMemo(makeSelectModelAndComponentSchemas, []);
const { schemas } = useSelector((state) => schemasSelector(state), shallowEqual); const { schemas } = useSelector((state) => schemasSelector(state), shallowEqual);
const permissions = useSelector(selectAdminPermissions);
const { uid } = useParams(); const { uid } = useParams();
const { get } = useFetchClient(); const { get } = useFetchClient();
@ -54,7 +53,7 @@ const ComponentSettingsView = () => {
} }
return ( return (
<CheckPagePermissions permissions={cmPermissions.componentsConfigurations}> <CheckPagePermissions permissions={permissions.contentManager.componentsConfigurations}>
<EditSettingsView components={layout.components} mainLayout={layout.component} slug={uid} /> <EditSettingsView components={layout.components} mainLayout={layout.component} slug={uid} />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -13,7 +13,7 @@ import PropTypes from 'prop-types';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import { InjectionZone } from '../../../shared/components'; import { InjectionZone } from '../../../shared/components';
import CollectionTypeFormWrapper from '../../components/CollectionTypeFormWrapper'; import CollectionTypeFormWrapper from '../../components/CollectionTypeFormWrapper';
import { DynamicZone } from '../../components/DynamicZone'; import { DynamicZone } from '../../components/DynamicZone';
@ -29,14 +29,14 @@ import Header from './Header';
import { selectAttributesLayout, selectCurrentLayout, selectCustomFieldUids } from './selectors'; import { selectAttributesLayout, selectCurrentLayout, selectCustomFieldUids } from './selectors';
import { getFieldsActionMatchingPermissions } from './utils'; import { getFieldsActionMatchingPermissions } from './utils';
const cmPermissions = permissions.contentManager; // TODO: this seems suspicious
const ctbPermissions = [{ action: 'plugin::content-type-builder.read', subject: null }]; const CTB_PERMISSIONS = [{ action: 'plugin::content-type-builder.read', subject: null }];
/* eslint-disable react/no-array-index-key */ /* eslint-disable react/no-array-index-key */
const EditView = ({ allowedActions, isSingleType, goBack, slug, id, origin, userPermissions }) => { const EditView = ({ allowedActions, isSingleType, goBack, slug, id, origin, userPermissions }) => {
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const permissions = useSelector(selectAdminPermissions);
const { layout, formattedContentTypeLayout, customFieldUids } = useSelector((state) => ({ const { layout, formattedContentTypeLayout, customFieldUids } = useSelector((state) => ({
layout: selectCurrentLayout(state), layout: selectCurrentLayout(state),
formattedContentTypeLayout: selectAttributesLayout(state), formattedContentTypeLayout: selectAttributesLayout(state),
@ -49,8 +49,8 @@ const EditView = ({ allowedActions, isSingleType, goBack, slug, id, origin, user
getFieldsActionMatchingPermissions(userPermissions, slug); getFieldsActionMatchingPermissions(userPermissions, slug);
const configurationPermissions = isSingleType const configurationPermissions = isSingleType
? cmPermissions.singleTypesConfigurations ? permissions.contentManager.singleTypesConfigurations
: cmPermissions.collectionTypesConfigurations; : permissions.contentManager.collectionTypesConfigurations;
// // FIXME when changing the routing // // FIXME when changing the routing
const configurationsURL = `/content-manager/${ const configurationsURL = `/content-manager/${
@ -188,7 +188,7 @@ const EditView = ({ allowedActions, isSingleType, goBack, slug, id, origin, user
<Flex direction="column" alignItems="stretch" gap={2}> <Flex direction="column" alignItems="stretch" gap={2}>
<InjectionZone area="contentManager.editView.right-links" slug={slug} /> <InjectionZone area="contentManager.editView.right-links" slug={slug} />
{slug !== 'strapi::administrator' && ( {slug !== 'strapi::administrator' && (
<CheckPermissions permissions={ctbPermissions}> <CheckPermissions permissions={CTB_PERMISSIONS}>
<LinkButton <LinkButton
onClick={() => { onClick={() => {
trackUsage('willEditEditLayout'); trackUsage('willEditEditLayout');

View File

@ -31,12 +31,12 @@ import PropTypes from 'prop-types';
import { stringify } from 'qs'; import { stringify } from 'qs';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation } from 'react-query'; import { useMutation } from 'react-query';
import { connect } from 'react-redux'; import { connect, useSelector } from 'react-redux';
import { Link as ReactRouterLink, useHistory, useLocation } from 'react-router-dom'; import { Link as ReactRouterLink, useHistory, useLocation } from 'react-router-dom';
import { bindActionCreators, compose } from 'redux'; import { bindActionCreators, compose } from 'redux';
import styled from 'styled-components'; import styled from 'styled-components';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import { InjectionZone } from '../../../shared/components'; import { InjectionZone } from '../../../shared/components';
import AttributeFilter from '../../components/AttributeFilter'; import AttributeFilter from '../../components/AttributeFilter';
import DynamicTable from '../../components/DynamicTable'; import DynamicTable from '../../components/DynamicTable';
@ -48,8 +48,6 @@ import PaginationFooter from './PaginationFooter';
import makeSelectListView from './selectors'; import makeSelectListView from './selectors';
import { buildQueryString } from './utils'; import { buildQueryString } from './utils';
const cmPermissions = permissions.contentManager;
const ConfigureLayoutBox = styled(Box)` const ConfigureLayoutBox = styled(Box)`
svg { svg {
path { path {
@ -85,6 +83,7 @@ function ListView({
const fetchPermissionsRef = useRef(refetchPermissions); const fetchPermissionsRef = useRef(refetchPermissions);
const { notifyStatus } = useNotifyAT(); const { notifyStatus } = useNotifyAT();
const { formatAPIError } = useAPIErrorHandler(getTrad); const { formatAPIError } = useAPIErrorHandler(getTrad);
const permissions = useSelector(selectAdminPermissions);
useFocusWhenNavigate(); useFocusWhenNavigate();
@ -391,7 +390,9 @@ function ListView({
<> <>
<InjectionZone area="contentManager.listView.actions" /> <InjectionZone area="contentManager.listView.actions" />
<FieldPicker layout={layout} /> <FieldPicker layout={layout} />
<CheckPermissions permissions={cmPermissions.collectionTypesConfigurations}> <CheckPermissions
permissions={permissions.contentManager.collectionTypesConfigurations}
>
<ConfigureLayoutBox paddingTop={1} paddingBottom={1}> <ConfigureLayoutBox paddingTop={1} paddingBottom={1}>
<IconButton <IconButton
onClick={() => { onClick={() => {

View File

@ -2,23 +2,23 @@ import React, { memo, useMemo } from 'react';
import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin'; import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useSelector } from 'react-redux';
import { Route, Switch } from 'react-router-dom'; import { Route, Switch } from 'react-router-dom';
import permissions from '../../../permissions'; import { selectAdminPermissions } from '../../../pages/App/selectors';
import { ContentTypeLayoutContext } from '../../contexts'; import { ContentTypeLayoutContext } from '../../contexts';
import { useFetchContentTypeLayout } from '../../hooks'; import { useFetchContentTypeLayout } from '../../hooks';
import { formatLayoutToApi } from '../../utils'; import { formatLayoutToApi } from '../../utils';
import EditSettingsView from '../EditSettingsView'; import EditSettingsView from '../EditSettingsView';
import EditViewLayoutManager from '../EditViewLayoutManager'; import EditViewLayoutManager from '../EditViewLayoutManager';
const cmPermissions = permissions.contentManager;
const SingleTypeRecursivePath = ({ const SingleTypeRecursivePath = ({
match: { match: {
params: { slug }, params: { slug },
url, url,
}, },
}) => { }) => {
const permissions = useSelector(selectAdminPermissions);
const { isLoading, layout, updateLayout } = useFetchContentTypeLayout(slug); const { isLoading, layout, updateLayout } = useFetchContentTypeLayout(slug);
const { rawContentTypeLayout, rawComponentsLayouts } = useMemo(() => { const { rawContentTypeLayout, rawComponentsLayouts } = useMemo(() => {
@ -48,7 +48,7 @@ const SingleTypeRecursivePath = ({
<ContentTypeLayoutContext.Provider value={layout}> <ContentTypeLayoutContext.Provider value={layout}>
<Switch> <Switch>
<Route path={`${url}/configurations/edit`}> <Route path={`${url}/configurations/edit`}>
<CheckPagePermissions permissions={cmPermissions.singleTypesConfigurations}> <CheckPagePermissions permissions={permissions.contentManager.singleTypesConfigurations}>
<EditSettingsView <EditSettingsView
components={rawComponentsLayouts} components={rawComponentsLayouts}
isContentTypeView isContentTypeView

View File

@ -1,3 +1,4 @@
export const SET_APP_RUNTIME_STATUS = 'StrapiAdmin/APP/SET_APP_RUNTIME_STATUS'; export const SET_APP_RUNTIME_STATUS = 'StrapiAdmin/APP/SET_APP_RUNTIME_STATUS';
export const SET_ADMIN_PERMISSIONS = 'StrapiAdmin/App/SET_ADMIN_PERMISSIONS';
export const ROUTES_CE = []; export const ROUTES_CE = [];

View File

@ -16,10 +16,13 @@ import {
useFetchClient, useFetchClient,
useNotification, useNotification,
} from '@strapi/helper-plugin'; } from '@strapi/helper-plugin';
import merge from 'lodash/merge';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useDispatch } from 'react-redux';
import { Route, Switch } from 'react-router-dom'; import { Route, Switch } from 'react-router-dom';
import PrivateRoute from '../../components/PrivateRoute'; import PrivateRoute from '../../components/PrivateRoute';
import { ADMIN_PERMISSIONS_CE } from '../../constants';
import { useConfigurations } from '../../hooks'; import { useConfigurations } from '../../hooks';
import { useEnterprise } from '../../hooks/useEnterprise'; import { useEnterprise } from '../../hooks/useEnterprise';
import { createRoute, makeUniqueRoutes } from '../../utils'; import { createRoute, makeUniqueRoutes } from '../../utils';
@ -27,7 +30,7 @@ import AuthPage from '../AuthPage';
import NotFoundPage from '../NotFoundPage'; import NotFoundPage from '../NotFoundPage';
import UseCasePage from '../UseCasePage'; import UseCasePage from '../UseCasePage';
import { ROUTES_CE } from './constants'; import { ROUTES_CE, SET_ADMIN_PERMISSIONS } from './constants';
import { getUID } from './utils'; import { getUID } from './utils';
const AuthenticatedApp = lazy(() => const AuthenticatedApp = lazy(() =>
@ -35,6 +38,14 @@ const AuthenticatedApp = lazy(() =>
); );
function App() { function App() {
const adminPermissions = useEnterprise(ADMIN_PERMISSIONS_CE, async () => (await import('../../../../ee/admin/constants')).ADMIN_PERMISSIONS_EE, {
combine(cePermissions, eePermissions) {
// the `settings` NS e.g. are deep nested objects, that need a deep merge
return merge({}, cePermissions, eePermissions);
},
defaultValue: ADMIN_PERMISSIONS_CE,
})
const routes = useEnterprise( const routes = useEnterprise(
ROUTES_CE, ROUTES_CE,
async () => (await import('../../../../ee/admin/pages/App/constants')).ROUTES_EE, async () => (await import('../../../../ee/admin/pages/App/constants')).ROUTES_EE,
@ -49,6 +60,7 @@ function App() {
isLoading: true, isLoading: true,
hasAdmin: false, hasAdmin: false,
}); });
const dispatch = useDispatch();
const appInfo = useAppInfo(); const appInfo = useAppInfo();
const { get, post } = useFetchClient(); const { get, post } = useFetchClient();
@ -60,6 +72,10 @@ function App() {
const [telemetryProperties, setTelemetryProperties] = useState(null); const [telemetryProperties, setTelemetryProperties] = useState(null);
useEffect(() => {
dispatch({ type: SET_ADMIN_PERMISSIONS, payload: adminPermissions });
}, [adminPermissions, dispatch]);
useEffect(() => { useEffect(() => {
const currentToken = auth.getToken(); const currentToken = auth.getToken();

View File

@ -1,8 +1,9 @@
import produce from 'immer'; import produce from 'immer';
import { SET_APP_RUNTIME_STATUS } from './constants'; import { SET_APP_RUNTIME_STATUS, SET_ADMIN_PERMISSIONS } from './constants';
const initialState = { const initialState = {
permissions: {},
status: 'init', status: 'init',
}; };
@ -14,6 +15,12 @@ const reducer = (state = initialState, action) =>
draftState.status = 'runtime'; draftState.status = 'runtime';
break; break;
} }
case SET_ADMIN_PERMISSIONS: {
draftState.permissions = action.payload;
break;
}
default: default:
return draftState; return draftState;
} }

View File

@ -0,0 +1,12 @@
import { createSelector } from 'reselect';
import { initialState } from './reducer';
const selectAppDomain = () => (state) => {
return state.admin_app || initialState;
};
export const selectAdminPermissions = createSelector(
selectAppDomain(),
(state) => state.permissions
);

View File

@ -3,21 +3,24 @@ import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { Helmet } from 'react-helmet'; import { Helmet } from 'react-helmet';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import adminPermissions from '../../permissions'; import { selectAdminPermissions } from '../App/selectors';
import Plugins from './Plugins'; import Plugins from './Plugins';
const InstalledPluginsPage = () => { const InstalledPluginsPage = () => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const title = formatMessage({ const permissions = useSelector(selectAdminPermissions);
id: 'global.plugins',
defaultMessage: 'Plugins',
});
return ( return (
<CheckPagePermissions permissions={adminPermissions.marketplace.main}> <CheckPagePermissions permissions={permissions.marketplace.main}>
<Helmet title={title} /> <Helmet
title={formatMessage({
id: 'global.plugins',
defaultMessage: 'Plugins',
})}
/>
<Plugins /> <Plugins />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -23,10 +23,11 @@ import {
} from '@strapi/helper-plugin'; } from '@strapi/helper-plugin';
import { Helmet } from 'react-helmet'; import { Helmet } from 'react-helmet';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import useDebounce from '../../hooks/useDebounce'; import useDebounce from '../../hooks/useDebounce';
import useNavigatorOnLine from '../../hooks/useNavigatorOnLine'; import useNavigatorOnLine from '../../hooks/useNavigatorOnLine';
import adminPermissions from '../../permissions'; import { selectAdminPermissions } from '../App/selectors';
import MissingPluginBanner from './components/MissingPluginBanner'; import MissingPluginBanner from './components/MissingPluginBanner';
import NpmPackagesFilters from './components/NpmPackagesFilters'; import NpmPackagesFilters from './components/NpmPackagesFilters';
@ -249,11 +250,15 @@ const MarketPlacePage = () => {
); );
}; };
const ProtectedMarketPlace = () => ( const ProtectedMarketPlace = () => {
<CheckPagePermissions permissions={adminPermissions.marketplace.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.marketplace.main}>
<MarketPlacePage /> <MarketPlacePage />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export { MarketPlacePage }; export { MarketPlacePage };
export default ProtectedMarketPlace; export default ProtectedMarketPlace;

View File

@ -15,11 +15,12 @@ import {
import { Formik } from 'formik'; import { Formik } from 'formik';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useQuery } from 'react-query'; import { useQuery } from 'react-query';
import { useSelector } from 'react-redux';
import { useHistory, useRouteMatch } from 'react-router-dom'; import { useHistory, useRouteMatch } from 'react-router-dom';
import { ApiTokenPermissionsContextProvider } from '../../../../../contexts/ApiTokenPermissions'; import { ApiTokenPermissionsContextProvider } from '../../../../../contexts/ApiTokenPermissions';
import adminPermissions from '../../../../../permissions';
import { formatAPIErrors } from '../../../../../utils'; import { formatAPIErrors } from '../../../../../utils';
import { selectAdminPermissions } from '../../../../App/selectors';
import { API_TOKEN_TYPE } from '../../../components/Tokens/constants'; import { API_TOKEN_TYPE } from '../../../components/Tokens/constants';
import FormHead from '../../../components/Tokens/FormHead'; import FormHead from '../../../components/Tokens/FormHead';
import TokenBox from '../../../components/Tokens/TokenBox'; import TokenBox from '../../../components/Tokens/TokenBox';
@ -39,6 +40,7 @@ const ApiTokenCreateView = () => {
const { lockApp, unlockApp } = useOverlayBlocker(); const { lockApp, unlockApp } = useOverlayBlocker();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const history = useHistory(); const history = useHistory();
const permissions = useSelector(selectAdminPermissions);
const [apiToken, setApiToken] = useState( const [apiToken, setApiToken] = useState(
history.location.state?.apiToken.accessKey history.location.state?.apiToken.accessKey
? { ? {
@ -51,7 +53,7 @@ const ApiTokenCreateView = () => {
const { setCurrentStep } = useGuidedTour(); const { setCurrentStep } = useGuidedTour();
const { const {
allowedActions: { canCreate, canUpdate, canRegenerate }, allowedActions: { canCreate, canUpdate, canRegenerate },
} = useRBAC(adminPermissions.settings['api-tokens']); } = useRBAC(permissions.settings['api-tokens']);
const [state, dispatch] = useReducer(reducer, initialState, (state) => init(state, {})); const [state, dispatch] = useReducer(reducer, initialState, (state) => init(state, {}));
const { const {
params: { id }, params: { id },

View File

@ -17,9 +17,10 @@ import { Plus } from '@strapi/icons';
import qs from 'qs'; import qs from 'qs';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import { API_TOKEN_TYPE } from '../../../components/Tokens/constants'; import { API_TOKEN_TYPE } from '../../../components/Tokens/constants';
import Table from '../../../components/Tokens/Table'; import Table from '../../../components/Tokens/Table';
@ -30,9 +31,10 @@ const ApiTokenListView = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canCreate, canDelete, canUpdate, canRead }, allowedActions: { canCreate, canDelete, canUpdate, canRead },
} = useRBAC(adminPermissions.settings['api-tokens']); } = useRBAC(permissions.settings['api-tokens']);
const { push } = useHistory(); const { push } = useHistory();
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();
const { startSection } = useGuidedTour(); const { startSection } = useGuidedTour();

View File

@ -1,13 +1,16 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedApiTokenCreateView = () => { const ProtectedApiTokenCreateView = () => {
const permissions = useSelector(selectAdminPermissions);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings['api-tokens'].create}> <CheckPagePermissions permissions={permissions.settings['api-tokens'].create}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -1,13 +1,16 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedApiTokenCreateView = () => { const ProtectedApiTokenCreateView = () => {
const permissions = useSelector(selectAdminPermissions);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings['api-tokens'].read}> <CheckPagePermissions permissions={permissions.settings['api-tokens'].read}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import ListView from '../ListView'; import ListView from '../ListView';
const ProtectedApiTokenListView = () => ( const ProtectedApiTokenListView = () => {
<CheckPagePermissions permissions={adminPermissions.settings['api-tokens'].main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings['api-tokens'].main}>
<ListView /> <ListView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedApiTokenListView; export default ProtectedApiTokenListView;

View File

@ -24,9 +24,10 @@ import { Check, ExternalLink } from '@strapi/icons';
import AdminSeatInfo from 'ee_else_ce/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo'; import AdminSeatInfo from 'ee_else_ce/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { useSelector } from 'react-redux';
import { useConfigurations } from '../../../../hooks'; import { useConfigurations } from '../../../../hooks';
import adminPermissions from '../../../../permissions'; import { selectAdminPermissions } from '../../../App/selectors';
import CustomizationInfos from './components/CustomizationInfos'; import CustomizationInfos from './components/CustomizationInfos';
import { fetchProjectSettings, postProjectSettings } from './utils/api'; import { fetchProjectSettings, postProjectSettings } from './utils/api';
@ -39,13 +40,19 @@ const ApplicationInfosPage = () => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
useFocusWhenNavigate(); useFocusWhenNavigate();
const appInfos = useAppInfo(); const {
const { latestStrapiReleaseTag, shouldUpdateStrapi, strapiVersion } = appInfos; communityEdition,
latestStrapiReleaseTag,
nodeVersion,
shouldUpdateStrapi,
strapiVersion,
} = useAppInfo();
const { updateProjectSettings } = useConfigurations(); const { updateProjectSettings } = useConfigurations();
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canRead, canUpdate }, allowedActions: { canRead, canUpdate },
} = useRBAC(adminPermissions.settings['project-settings']); } = useRBAC(permissions.settings['project-settings']);
const canSubmit = canRead && canUpdate; const canSubmit = canRead && canUpdate;
const { data } = useQuery('project-settings', fetchProjectSettings, { enabled: canRead }); const { data } = useQuery('project-settings', fetchProjectSettings, { enabled: canRead });
@ -174,7 +181,7 @@ const ApplicationInfosPage = () => {
defaultMessage: defaultMessage:
'{communityEdition, select, true {Community Edition} other {Enterprise Edition}}', '{communityEdition, select, true {Community Edition} other {Enterprise Edition}}',
}, },
{ communityEdition: appInfos.communityEdition } { communityEdition }
)} )}
</Typography> </Typography>
<Link <Link
@ -197,7 +204,7 @@ const ApplicationInfosPage = () => {
defaultMessage: 'node version', defaultMessage: 'node version',
})} })}
</Typography> </Typography>
<Typography as="dd">{appInfos.nodeVersion}</Typography> <Typography as="dd">{nodeVersion}</Typography>
</GridItem> </GridItem>
<AdminSeatInfo /> <AdminSeatInfo />
</Grid> </Grid>

View File

@ -30,11 +30,12 @@ import { Formik } from 'formik';
import get from 'lodash/get'; import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty'; import isEmpty from 'lodash/isEmpty';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import { useHistory, useRouteMatch } from 'react-router-dom'; import { useHistory, useRouteMatch } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks'; import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import Permissions from '../EditPage/components/Permissions'; import Permissions from '../EditPage/components/Permissions';
import schema from './utils/schema'; import schema from './utils/schema';
@ -61,7 +62,6 @@ const CreatePage = () => {
const id = get(params, 'params.id', null); const id = get(params, 'params.id', null);
const { isLoading: isLayoutLoading, data: permissionsLayout } = useFetchPermissionsLayout(); const { isLoading: isLayoutLoading, data: permissionsLayout } = useFetchPermissionsLayout();
const { permissions: rolePermissions, isLoading: isRoleLoading } = useFetchRole(id); const { permissions: rolePermissions, isLoading: isRoleLoading } = useFetchRole(id);
const { post, put } = useFetchClient(); const { post, put } = useFetchClient();
const handleCreateRoleSubmit = (data) => { const handleCreateRoleSubmit = (data) => {
@ -257,8 +257,10 @@ const CreatePage = () => {
}; };
export default function () { export default function () {
const permissions = useSelector(selectAdminPermissions);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings.roles.create}> <CheckPagePermissions permissions={permissions.settings.roles.create}>
<CreatePage /> <CreatePage />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -31,10 +31,11 @@ import {
import { Duplicate, Pencil, Plus, Trash } from '@strapi/icons'; import { Duplicate, Pencil, Plus, Trash } from '@strapi/icons';
import get from 'lodash/get'; import get from 'lodash/get';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import { useRolesList } from '../../../../../hooks'; import { useRolesList } from '../../../../../hooks';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EmptyRole from './components/EmptyRole'; import EmptyRole from './components/EmptyRole';
import BaseRoleRow from './components/RoleRow'; import BaseRoleRow from './components/RoleRow';
@ -43,10 +44,11 @@ import reducer, { initialState } from './reducer';
const useSortedRoles = () => { const useSortedRoles = () => {
useFocusWhenNavigate(); useFocusWhenNavigate();
const { locale } = useIntl(); const { locale } = useIntl();
const permissions = useSelector(selectAdminPermissions);
const { const {
isLoading: isLoadingForPermissions, isLoading: isLoadingForPermissions,
allowedActions: { canCreate, canDelete, canRead, canUpdate }, allowedActions: { canCreate, canDelete, canRead, canUpdate },
} = useRBAC(adminPermissions.settings.roles); } = useRBAC(permissions.settings.roles);
const { getData, roles, isLoading } = useRolesList(false); const { getData, roles, isLoading } = useRolesList(false);
const [{ query }] = useQueryParams(); const [{ query }] = useQueryParams();

View File

@ -1,23 +1,21 @@
import React, { useMemo } from 'react'; import React from 'react';
import { LoadingIndicatorPage, useRBAC } from '@strapi/helper-plugin'; import { LoadingIndicatorPage, useRBAC } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import { Redirect } from 'react-router-dom'; import { Redirect } from 'react-router-dom';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditPage from '../EditPage'; import EditPage from '../EditPage';
const ProtectedEditPage = () => { const ProtectedEditPage = () => {
const permissions = useMemo(() => { const permissions = useSelector(selectAdminPermissions);
return {
read: adminPermissions.settings.roles.read,
update: adminPermissions.settings.roles.update,
};
}, []);
const { const {
isLoading, isLoading,
allowedActions: { canRead, canUpdate }, allowedActions: { canRead, canUpdate },
} = useRBAC(permissions); } = useRBAC({
read: permissions.settings.roles.read,
update: permissions.settings.roles.update,
});
if (isLoading) { if (isLoading) {
return <LoadingIndicatorPage />; return <LoadingIndicatorPage />;

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import ListPage from '../ListPage'; import ListPage from '../ListPage';
const ProtectedListPage = () => ( const ProtectedListPage = () => {
<CheckPagePermissions permissions={adminPermissions.settings.roles.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.roles.main}>
<ListPage /> <ListPage />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedListPage; export default ProtectedListPage;

View File

@ -16,10 +16,11 @@ import {
import { Formik } from 'formik'; import { Formik } from 'formik';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useQuery } from 'react-query'; import { useQuery } from 'react-query';
import { useSelector } from 'react-redux';
import { useHistory, useRouteMatch } from 'react-router-dom'; import { useHistory, useRouteMatch } from 'react-router-dom';
import adminPermissions from '../../../../../permissions';
import { formatAPIErrors } from '../../../../../utils'; import { formatAPIErrors } from '../../../../../utils';
import { selectAdminPermissions } from '../../../../App/selectors';
import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants'; import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants';
import FormHead from '../../../components/Tokens/FormHead'; import FormHead from '../../../components/Tokens/FormHead';
import TokenBox from '../../../components/Tokens/TokenBox'; import TokenBox from '../../../components/Tokens/TokenBox';
@ -46,9 +47,10 @@ const TransferTokenCreateView = () => {
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();
const trackUsageRef = useRef(trackUsage); const trackUsageRef = useRef(trackUsage);
const { setCurrentStep } = useGuidedTour(); const { setCurrentStep } = useGuidedTour();
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canCreate, canUpdate, canRegenerate }, allowedActions: { canCreate, canUpdate, canRegenerate },
} = useRBAC(adminPermissions.settings['transfer-tokens']); } = useRBAC(permissions.settings['transfer-tokens']);
const { const {
params: { id }, params: { id },
} = useRouteMatch('/settings/transfer-tokens/:id'); } = useRouteMatch('/settings/transfer-tokens/:id');

View File

@ -17,9 +17,10 @@ import { Plus } from '@strapi/icons';
import qs from 'qs'; import qs from 'qs';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants'; import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants';
import Table from '../../../components/Tokens/Table'; import Table from '../../../components/Tokens/Table';
@ -30,9 +31,10 @@ const TransferTokenListView = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canCreate, canDelete, canUpdate, canRead }, allowedActions: { canCreate, canDelete, canUpdate, canRead },
} = useRBAC(adminPermissions.settings['transfer-tokens']); } = useRBAC(permissions.settings['transfer-tokens']);
const { push } = useHistory(); const { push } = useHistory();
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();

View File

@ -1,13 +1,16 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedTransferTokenCreateView = () => { const ProtectedTransferTokenCreateView = () => {
const permissions = useSelector(selectAdminPermissions);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].create}> <CheckPagePermissions permissions={permissions.settings['transfer-tokens'].create}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -1,13 +1,16 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedTransferTokenCreateView = () => { const ProtectedTransferTokenCreateView = () => {
const permissions = useSelector(selectAdminPermissions);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].read}> <CheckPagePermissions permissions={permissions.settings['transfer-tokens'].read}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import ListView from '../ListView'; import ListView from '../ListView';
const ProtectedTransferTokenListView = () => ( const ProtectedTransferTokenListView = () => {
<CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings['transfer-tokens'].main}>
<ListView /> <ListView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedTransferTokenListView; export default ProtectedTransferTokenListView;

View File

@ -17,10 +17,11 @@ import CreateAction from 'ee_else_ce/pages/SettingsPage/pages/Users/ListPage/Cre
import qs from 'qs'; import qs from 'qs';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation, useQueryClient } from 'react-query'; import { useMutation, useQueryClient } from 'react-query';
import { useSelector } from 'react-redux';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { useAdminUsers } from '../../../../../hooks/useAdminUsers'; import { useAdminUsers } from '../../../../../hooks/useAdminUsers';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import Filters from '../../../components/Filters'; import Filters from '../../../components/Filters';
import TableRows from './DynamicTable/TableRows'; import TableRows from './DynamicTable/TableRows';
@ -35,9 +36,10 @@ const ListPage = () => {
const { post } = useFetchClient(); const { post } = useFetchClient();
const { formatAPIError } = useAPIErrorHandler(); const { formatAPIError } = useAPIErrorHandler();
const [isModalOpened, setIsModalOpen] = useState(false); const [isModalOpened, setIsModalOpen] = useState(false);
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canCreate, canDelete, canRead }, allowedActions: { canCreate, canDelete, canRead },
} = useRBAC(adminPermissions.settings.users); } = useRBAC(permissions.settings.users);
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();

View File

@ -1,24 +1,22 @@
import React, { useEffect, useMemo } from 'react'; import React, { useEffect } from 'react';
import { LoadingIndicatorPage, useNotification, useRBAC } from '@strapi/helper-plugin'; import { LoadingIndicatorPage, useNotification, useRBAC } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import { Redirect, useLocation } from 'react-router-dom'; import { Redirect, useLocation } from 'react-router-dom';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditPage from '../EditPage'; import EditPage from '../EditPage';
const ProtectedEditPage = () => { const ProtectedEditPage = () => {
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const permissions = useMemo(() => { const permissions = useSelector(selectAdminPermissions);
return {
read: adminPermissions.settings.users.read,
update: adminPermissions.settings.users.update,
};
}, []);
const { const {
isLoading, isLoading,
allowedActions: { canRead, canUpdate }, allowedActions: { canRead, canUpdate },
} = useRBAC(permissions); } = useRBAC({
read: permissions.settings.users.read,
update: permissions.settings.users.update,
});
const { state } = useLocation(); const { state } = useLocation();
const from = state?.from ?? '/'; const from = state?.from ?? '/';

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import ListPage from '../ListPage'; import ListPage from '../ListPage';
const ProtectedListPage = () => ( const ProtectedListPage = () => {
<CheckPagePermissions permissions={adminPermissions.settings.users.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.users.main}>
<ListPage /> <ListPage />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedListPage; export default ProtectedListPage;

View File

@ -41,14 +41,15 @@ import {
import { EmptyDocuments, Pencil, Plus, Trash } from '@strapi/icons'; import { EmptyDocuments, Pencil, Plus, Trash } from '@strapi/icons';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useMutation, useQuery } from 'react-query'; import { useMutation, useQuery } from 'react-query';
import { useSelector } from 'react-redux';
import { useHistory, useLocation } from 'react-router-dom'; import { useHistory, useLocation } from 'react-router-dom';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
const ListView = () => { const ListView = () => {
const [showModal, setShowModal] = useState(false); const [showModal, setShowModal] = useState(false);
const [webhooksToDelete, setWebhooksToDelete] = useState([]); const [webhooksToDelete, setWebhooksToDelete] = useState([]);
const permissions = useSelector(selectAdminPermissions);
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { formatAPIError } = useAPIErrorHandler(); const { formatAPIError } = useAPIErrorHandler();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
@ -59,7 +60,7 @@ const ListView = () => {
const { const {
isLoading: isRBACLoading, isLoading: isRBACLoading,
allowedActions: { canCreate, canUpdate, canDelete }, allowedActions: { canCreate, canUpdate, canDelete },
} = useRBAC(adminPermissions.settings.webhooks); } = useRBAC(permissions.settings.webhooks);
const { get, post, put } = useFetchClient(); const { get, post, put } = useFetchClient();
const { notifyStatus } = useNotifyAT(); const { notifyStatus } = useNotifyAT();

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedCreateView = () => ( const ProtectedCreateView = () => {
<CheckPagePermissions permissions={adminPermissions.settings.webhooks.create}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.webhooks.create}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedCreateView; export default ProtectedCreateView;

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import EditView from '../EditView'; import EditView from '../EditView';
const ProtectedEditView = () => ( const ProtectedEditView = () => {
<CheckPagePermissions permissions={adminPermissions.settings.webhooks.update}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.webhooks.update}>
<EditView /> <EditView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedEditView; export default ProtectedEditView;

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../permissions'; import { selectAdminPermissions } from '../../../../App/selectors';
import ListView from '../ListView'; import ListView from '../ListView';
const ProtectedListView = () => ( const ProtectedListView = () => {
<CheckPagePermissions permissions={adminPermissions.settings.webhooks.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.webhooks.main}>
<ListView /> <ListView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedListView; export default ProtectedListView;

View File

@ -0,0 +1,16 @@
export const ADMIN_PERMISSIONS_EE = {
settings: {
auditLogs: {
main: [{ action: 'admin::audit-logs.read', subject: null }],
read: [{ action: 'admin::audit-logs.read', subject: null }],
},
'review-workflows': {
main: [{ action: 'admin::review-workflows.read', subject: null }],
},
sso: {
main: [{ action: 'admin::provider-login.read', subject: null }],
read: [{ action: 'admin::provider-login.read', subject: null }],
update: [{ action: 'admin::provider-login.update', subject: null }],
},
},
};

View File

@ -17,9 +17,10 @@ import {
useRBAC, useRBAC,
} from '@strapi/helper-plugin'; } from '@strapi/helper-plugin';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import { selectAdminPermissions } from '../../../../../../../admin/src/pages/App/selectors';
import Filters from '../../../../../../../admin/src/pages/SettingsPage/components/Filters'; import Filters from '../../../../../../../admin/src/pages/SettingsPage/components/Filters';
import adminPermissions from '../../../../../../../admin/src/permissions';
import useAuditLogsData from './hooks/useAuditLogsData'; import useAuditLogsData from './hooks/useAuditLogsData';
import Modal from './Modal'; import Modal from './Modal';
@ -28,17 +29,15 @@ import TableRows from './TableRows';
import getDisplayedFilters from './utils/getDisplayedFilters'; import getDisplayedFilters from './utils/getDisplayedFilters';
import tableHeaders from './utils/tableHeaders'; import tableHeaders from './utils/tableHeaders';
const auditLogsPermissions = {
...adminPermissions.settings.auditLogs,
readUsers: adminPermissions.settings.users.read,
};
const ListView = () => { const ListView = () => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const permissions = useSelector(selectAdminPermissions);
const { const {
allowedActions: { canRead: canReadAuditLogs, canReadUsers }, allowedActions: { canRead: canReadAuditLogs, canReadUsers },
} = useRBAC(auditLogsPermissions); } = useRBAC({
...permissions.settings.auditLogs,
readUsers: permissions.settings.users.read,
});
const [{ query }, setQuery] = useQueryParams(); const [{ query }, setQuery] = useQueryParams();
const { auditLogs, users, isLoading, hasError } = useAuditLogsData({ const { auditLogs, users, isLoading, hasError } = useAuditLogsData({

View File

@ -1,14 +1,19 @@
import React from 'react'; import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin'; import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import adminPermissions from '../../../../../../../admin/src/permissions'; import { selectAdminPermissions } from '../../../../../../../admin/src/pages/App/selectors';
import ListView from '../ListView'; import ListView from '../ListView';
const ProtectedListPage = () => ( const ProtectedListPage = () => {
<CheckPagePermissions permissions={adminPermissions.settings.auditLogs.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings.auditLogs.main}>
<ListView /> <ListView />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedListPage; export default ProtectedListPage;

View File

@ -0,0 +1,20 @@
import React from 'react';
import { CheckPagePermissions } from '@strapi/helper-plugin';
import { useSelector } from 'react-redux';
import { selectAdminPermissions } from '../../../../../../admin/src/pages/App/selectors';
import { ReviewWorkflowsPage } from './ReviewWorkflows';
const ProtectedListPage = () => {
const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.settings['review-workflows'].main}>
<ReviewWorkflowsPage />
</CheckPagePermissions>
);
};
export default ProtectedListPage;

View File

@ -2,7 +2,6 @@ import React, { useEffect, useState } from 'react';
import { Button, ContentLayout, HeaderLayout, Layout, Loader, Main } from '@strapi/design-system'; import { Button, ContentLayout, HeaderLayout, Layout, Loader, Main } from '@strapi/design-system';
import { import {
CheckPagePermissions,
ConfirmDialog, ConfirmDialog,
SettingsPageTitle, SettingsPageTitle,
useAPIErrorHandler, useAPIErrorHandler,
@ -18,7 +17,6 @@ import { useDispatch, useSelector } from 'react-redux';
import { DragLayer } from '../../../../../../admin/src/components/DragLayer'; import { DragLayer } from '../../../../../../admin/src/components/DragLayer';
import { useInjectReducer } from '../../../../../../admin/src/hooks/useInjectReducer'; import { useInjectReducer } from '../../../../../../admin/src/hooks/useInjectReducer';
import adminPermissions from '../../../../../../admin/src/permissions';
import { setWorkflows } from './actions'; import { setWorkflows } from './actions';
import { StageDragPreview } from './components/StageDragPreview'; import { StageDragPreview } from './components/StageDragPreview';
@ -57,7 +55,6 @@ export function ReviewWorkflowsPage() {
}, },
} = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState); } = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState);
const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false); const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);
const { mutateAsync, isLoading } = useMutation( const { mutateAsync, isLoading } = useMutation(
async ({ workflowId, stages }) => { async ({ workflowId, stages }) => {
const { const {
@ -134,7 +131,6 @@ export function ReviewWorkflowsPage() {
}, []); }, []);
return ( return (
<CheckPagePermissions permissions={adminPermissions.settings['review-workflows'].main}>
<Layout> <Layout>
<SettingsPageTitle <SettingsPageTitle
name={formatMessage({ name={formatMessage({
@ -204,6 +200,5 @@ export function ReviewWorkflowsPage() {
/> />
</Main> </Main>
</Layout> </Layout>
</CheckPagePermissions>
); );
} }

View File

@ -26,25 +26,25 @@ import {
import { Check } from '@strapi/icons'; import { Check } from '@strapi/icons';
import isEqual from 'lodash/isEqual'; import isEqual from 'lodash/isEqual';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import { useRolesList, useSettingsForm } from '../../../../../../admin/src/hooks'; import { useRolesList, useSettingsForm } from '../../../../../../admin/src/hooks';
import adminPermissions from '../../../../../../admin/src/permissions'; import { selectAdminPermissions } from '../../../../../../admin/src/pages/App/selectors';
import { getRequestUrl } from '../../../../../../admin/src/utils'; import { getRequestUrl } from '../../../../../../admin/src/utils';
import schema from './utils/schema'; import schema from './utils/schema';
const ssoPermissions = {
...adminPermissions.settings.sso,
readRoles: adminPermissions.settings.roles.read,
};
export const SingleSignOn = () => { export const SingleSignOn = () => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const permissions = useSelector(selectAdminPermissions);
const { const {
isLoading: isLoadingForPermissions, isLoading: isLoadingForPermissions,
allowedActions: { canUpdate, canReadRoles }, allowedActions: { canUpdate, canReadRoles },
} = useRBAC(ssoPermissions); } = useRBAC({
...permissions.settings.sso,
readRoles: permissions.settings.roles.read,
});
const [ const [
{ formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader }, { formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader },
@ -247,10 +247,14 @@ export const SingleSignOn = () => {
); );
}; };
const ProtectedSSO = () => ( const ProtectedSSO = () => {
<CheckPagePermissions permissions={ssoPermissions.main}> const permissions = useSelector(selectAdminPermissions);
return (
<CheckPagePermissions permissions={permissions.sso.main}>
<SingleSignOn /> <SingleSignOn />
</CheckPagePermissions> </CheckPagePermissions>
); );
};
export default ProtectedSSO; export default ProtectedSSO;