mirror of
https://github.com/strapi/strapi.git
synced 2025-11-08 14:19:40 +00:00
Chore: Move admin permissions into redux
This commit is contained in:
parent
a6a86c30b9
commit
c44cf5c5fd
90
packages/core/admin/admin/src/constants.js
Normal file
90
packages/core/admin/admin/src/constants.js
Normal 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 }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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={() => {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 = [];
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
12
packages/core/admin/admin/src/pages/App/selectors.js
Normal file
12
packages/core/admin/admin/src/pages/App/selectors.js
Normal 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
|
||||||
|
);
|
||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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 },
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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 />;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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 ?? '/';
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
16
packages/core/admin/ee/admin/constants.js
Normal file
16
packages/core/admin/ee/admin/constants.js
Normal 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 }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@ -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({
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
@ -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>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user