@strapi/plugin-users-permissions 0.0.0-next.f45143c5e2a8a9d85691d0abf79a3f42024a0c71 → 0.0.0-next.f5107c72369ee86a8ec1b6782f2e890925033ca3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/src/components/BoundRoute/index.js +5 -3
- package/admin/src/components/FormModal/Input/index.js +6 -3
- package/admin/src/components/FormModal/index.js +13 -10
- package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +1 -1
- package/admin/src/components/Permissions/PermissionRow/SubCategory.js +26 -5
- package/admin/src/components/Permissions/PermissionRow/index.js +4 -2
- package/admin/src/components/Permissions/index.js +5 -2
- package/admin/src/components/Policies/index.js +3 -2
- package/admin/src/components/UsersPermissions/index.js +8 -5
- package/admin/src/{permissions.js → constants.js} +1 -3
- package/admin/src/contexts/UsersPermissionsContext/index.js +1 -0
- package/admin/src/hooks/index.js +1 -1
- package/admin/src/hooks/useFetchRole/index.js +6 -3
- package/admin/src/hooks/useForm/index.js +6 -8
- package/admin/src/hooks/usePlugins.js +71 -0
- package/admin/src/hooks/useRolesList/index.js +22 -20
- package/admin/src/index.js +7 -5
- package/admin/src/pages/AdvancedSettings/index.js +27 -28
- package/admin/src/pages/AdvancedSettings/utils/api.js +2 -3
- package/admin/src/pages/AdvancedSettings/utils/schema.js +1 -1
- package/admin/src/pages/EmailTemplates/components/EmailForm.js +14 -13
- package/admin/src/pages/EmailTemplates/components/EmailTable.js +9 -7
- package/admin/src/pages/EmailTemplates/index.js +16 -17
- package/admin/src/pages/EmailTemplates/utils/api.js +2 -3
- package/admin/src/pages/EmailTemplates/utils/schema.js +1 -1
- package/admin/src/pages/Providers/index.js +31 -32
- package/admin/src/pages/Providers/utils/api.js +2 -3
- package/admin/src/pages/Providers/utils/forms.js +1 -1
- package/admin/src/pages/Roles/{CreatePage/index.js → CreatePage.js} +26 -23
- package/admin/src/pages/Roles/{EditPage/index.js → EditPage.js} +23 -20
- package/admin/src/pages/Roles/ListPage/components/TableBody.js +4 -3
- package/admin/src/pages/Roles/ListPage/index.js +31 -34
- package/admin/src/pages/Roles/ListPage/utils/api.js +3 -4
- package/admin/src/pages/Roles/{ProtectedCreatePage/index.js → ProtectedCreatePage.js} +6 -3
- package/admin/src/pages/Roles/{ProtectedEditPage/index.js → ProtectedEditPage.js} +6 -3
- package/admin/src/pages/Roles/{ProtectedListPage/index.js → ProtectedListPage.js} +5 -3
- package/admin/src/pages/Roles/{CreatePage/utils/schema.js → constants.js} +2 -4
- package/admin/src/pages/Roles/index.js +9 -6
- package/admin/src/translations/ru.json +50 -26
- package/admin/src/utils/index.js +1 -2
- package/documentation/content-api.yaml +23 -15
- package/jest.config.front.js +2 -0
- package/package.json +23 -26
- package/server/middlewares/rateLimit.js +41 -21
- package/server/register.js +7 -1
- package/server/services/providers-registry.js +1 -1
- package/server/strategies/users-permissions.js +1 -8
- package/admin/src/hooks/usePlugins/index.js +0 -67
- package/admin/src/hooks/usePlugins/init.js +0 -5
- package/admin/src/hooks/usePlugins/reducer.js +0 -34
- package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
- package/admin/src/utils/getRequestURL.js +0 -5
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import {
|
|
2
|
+
|
|
3
|
+
import { Box, Flex, Typography } from '@strapi/design-system';
|
|
4
4
|
import map from 'lodash/map';
|
|
5
5
|
import tail from 'lodash/tail';
|
|
6
|
-
import { useIntl } from 'react-intl';
|
|
7
6
|
import PropTypes from 'prop-types';
|
|
7
|
+
import { useIntl } from 'react-intl';
|
|
8
|
+
import styled from 'styled-components';
|
|
9
|
+
|
|
8
10
|
import getMethodColor from './getMethodColor';
|
|
9
11
|
|
|
10
12
|
const MethodBox = styled(Box)`
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import React from 'react';
|
|
8
|
-
|
|
9
|
-
import {
|
|
8
|
+
|
|
9
|
+
import { TextInput, ToggleInput } from '@strapi/design-system';
|
|
10
10
|
import PropTypes from 'prop-types';
|
|
11
|
+
import { useIntl } from 'react-intl';
|
|
11
12
|
|
|
12
13
|
const Input = ({
|
|
13
14
|
description,
|
|
@@ -23,7 +24,9 @@ const Input = ({
|
|
|
23
24
|
}) => {
|
|
24
25
|
const { formatMessage } = useIntl();
|
|
25
26
|
const inputValue =
|
|
26
|
-
name === 'noName'
|
|
27
|
+
name === 'noName'
|
|
28
|
+
? `${window.strapi.backendURL}/api/connect/${providerToEditName}/callback`
|
|
29
|
+
: value;
|
|
27
30
|
|
|
28
31
|
const label = formatMessage(
|
|
29
32
|
{ id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
|
|
@@ -5,22 +5,23 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import React from 'react';
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
import {
|
|
10
10
|
Button,
|
|
11
11
|
Flex,
|
|
12
|
-
Breadcrumbs,
|
|
13
|
-
Crumb,
|
|
14
12
|
Grid,
|
|
15
13
|
GridItem,
|
|
16
|
-
ModalLayout,
|
|
17
|
-
ModalHeader,
|
|
18
|
-
ModalFooter,
|
|
19
14
|
ModalBody,
|
|
15
|
+
ModalFooter,
|
|
16
|
+
ModalHeader,
|
|
17
|
+
ModalLayout,
|
|
20
18
|
} from '@strapi/design-system';
|
|
21
|
-
import
|
|
22
|
-
import { Formik } from 'formik';
|
|
19
|
+
import { Breadcrumbs, Crumb } from '@strapi/design-system/v2';
|
|
23
20
|
import { Form } from '@strapi/helper-plugin';
|
|
21
|
+
import { Formik } from 'formik';
|
|
22
|
+
import PropTypes from 'prop-types';
|
|
23
|
+
import { useIntl } from 'react-intl';
|
|
24
|
+
|
|
24
25
|
import Input from './Input';
|
|
25
26
|
|
|
26
27
|
const FormModal = ({
|
|
@@ -43,8 +44,10 @@ const FormModal = ({
|
|
|
43
44
|
<ModalLayout onClose={onToggle} labelledBy="title">
|
|
44
45
|
<ModalHeader>
|
|
45
46
|
<Breadcrumbs label={headerBreadcrumbs.join(', ')}>
|
|
46
|
-
{headerBreadcrumbs.map((crumb) => (
|
|
47
|
-
<Crumb
|
|
47
|
+
{headerBreadcrumbs.map((crumb, index, arr) => (
|
|
48
|
+
<Crumb isCurrent={index === arr.length - 1} key={crumb}>
|
|
49
|
+
{crumb}
|
|
50
|
+
</Crumb>
|
|
48
51
|
))}
|
|
49
52
|
</Breadcrumbs>
|
|
50
53
|
</ModalHeader>
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
import React, { useCallback, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Box,
|
|
5
|
+
Checkbox,
|
|
6
|
+
Flex,
|
|
7
|
+
Typography,
|
|
8
|
+
Grid,
|
|
9
|
+
GridItem,
|
|
10
|
+
VisuallyHidden,
|
|
11
|
+
} from '@strapi/design-system';
|
|
12
|
+
import { Cog as CogIcon } from '@strapi/icons';
|
|
2
13
|
import get from 'lodash/get';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
14
|
import PropTypes from 'prop-types';
|
|
5
|
-
import { Box, Checkbox, Flex, Typography, Grid, GridItem } from '@strapi/design-system';
|
|
6
|
-
import { Cog as CogIcon } from '@strapi/icons';
|
|
7
15
|
import { useIntl } from 'react-intl';
|
|
8
|
-
import
|
|
16
|
+
import styled from 'styled-components';
|
|
17
|
+
|
|
9
18
|
import { useUsersPermissions } from '../../../contexts/UsersPermissionsContext';
|
|
10
19
|
|
|
20
|
+
import CheckboxWrapper from './CheckboxWrapper';
|
|
21
|
+
|
|
11
22
|
const Border = styled.div`
|
|
12
23
|
flex: 1;
|
|
13
24
|
align-self: center;
|
|
@@ -87,10 +98,20 @@ const SubCategory = ({ subCategory }) => {
|
|
|
87
98
|
</Checkbox>
|
|
88
99
|
<button
|
|
89
100
|
type="button"
|
|
90
|
-
data-testid="action-cog"
|
|
91
101
|
onClick={() => onSelectedAction(action.name)}
|
|
92
102
|
style={{ display: 'inline-flex', alignItems: 'center' }}
|
|
93
103
|
>
|
|
104
|
+
<VisuallyHidden as="span">
|
|
105
|
+
{formatMessage(
|
|
106
|
+
{
|
|
107
|
+
id: 'app.utils.show-bound-route',
|
|
108
|
+
defaultMessage: 'Show bound route for {route}',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
route: action.name,
|
|
112
|
+
}
|
|
113
|
+
)}
|
|
114
|
+
</VisuallyHidden>
|
|
94
115
|
<CogIcon />
|
|
95
116
|
</button>
|
|
96
117
|
</CheckboxWrapper>
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React, { useMemo } from 'react';
|
|
2
|
-
|
|
3
|
-
import sortBy from 'lodash/sortBy';
|
|
2
|
+
|
|
4
3
|
import { Box } from '@strapi/design-system';
|
|
4
|
+
import sortBy from 'lodash/sortBy';
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
|
|
5
7
|
import SubCategory from './SubCategory';
|
|
6
8
|
|
|
7
9
|
const PermissionRow = ({ name, permissions }) => {
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import React, { useReducer } from 'react';
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { Accordion, AccordionContent, AccordionToggle, Box, Flex } from '@strapi/design-system';
|
|
3
4
|
import { useIntl } from 'react-intl';
|
|
5
|
+
|
|
4
6
|
import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
|
|
5
7
|
import formatPluginName from '../../utils/formatPluginName';
|
|
6
|
-
|
|
8
|
+
|
|
7
9
|
import init from './init';
|
|
10
|
+
import PermissionRow from './PermissionRow';
|
|
8
11
|
import { initialState, reducer } from './reducer';
|
|
9
12
|
|
|
10
13
|
const Permissions = () => {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import {
|
|
2
|
+
|
|
3
|
+
import { Flex, GridItem, Typography } from '@strapi/design-system';
|
|
4
4
|
import get from 'lodash/get';
|
|
5
5
|
import isEmpty from 'lodash/isEmpty';
|
|
6
6
|
import without from 'lodash/without';
|
|
7
|
+
import { useIntl } from 'react-intl';
|
|
7
8
|
|
|
8
9
|
import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
|
|
9
10
|
import BoundRoute from '../BoundRoute';
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Flex, Grid, GridItem, Typography } from '@strapi/design-system';
|
|
2
4
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { Typography, Flex, Grid, GridItem } from '@strapi/design-system';
|
|
4
5
|
import { useIntl } from 'react-intl';
|
|
6
|
+
|
|
7
|
+
import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';
|
|
5
8
|
import getTrad from '../../utils/getTrad';
|
|
6
|
-
import Policies from '../Policies';
|
|
7
9
|
import Permissions from '../Permissions';
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
+
import Policies from '../Policies';
|
|
11
|
+
|
|
10
12
|
import init from './init';
|
|
13
|
+
import reducer, { initialState } from './reducer';
|
|
11
14
|
|
|
12
15
|
const UsersPermissions = forwardRef(({ permissions, routes }, ref) => {
|
|
13
16
|
const { formatMessage } = useIntl();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
export const PERMISSIONS = {
|
|
2
2
|
// Roles
|
|
3
3
|
accessRoles: [
|
|
4
4
|
{ action: 'plugin::users-permissions.roles.create', subject: null },
|
|
@@ -27,5 +27,3 @@ const pluginPermissions = {
|
|
|
27
27
|
readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],
|
|
28
28
|
updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],
|
|
29
29
|
};
|
|
30
|
-
|
|
31
|
-
export default pluginPermissions;
|
package/admin/src/hooks/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// eslint-disable-next-line import/prefer-default-export
|
|
2
2
|
export { default as useForm } from './useForm';
|
|
3
3
|
export { default as useRolesList } from './useRolesList';
|
|
4
|
-
export
|
|
4
|
+
export * from './usePlugins';
|
|
5
5
|
export { default as useFetchRole } from './useFetchRole';
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { useCallback,
|
|
2
|
-
|
|
3
|
-
import
|
|
1
|
+
import { useCallback, useEffect, useReducer, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useFetchClient, useNotification } from '@strapi/helper-plugin';
|
|
4
|
+
|
|
4
5
|
import pluginId from '../../pluginId';
|
|
5
6
|
|
|
7
|
+
import reducer, { initialState } from './reducer';
|
|
8
|
+
|
|
6
9
|
const useFetchRole = (id) => {
|
|
7
10
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
8
11
|
const toggleNotification = useNotification();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useCallback, useEffect, useReducer, useRef } from 'react';
|
|
2
|
-
|
|
3
|
-
import {
|
|
2
|
+
|
|
3
|
+
import { useFetchClient, useNotification, useRBAC } from '@strapi/helper-plugin';
|
|
4
|
+
|
|
4
5
|
import reducer, { initialState } from './reducer';
|
|
5
6
|
|
|
6
7
|
const useUserForm = (endPoint, permissions) => {
|
|
@@ -9,8 +10,7 @@ const useUserForm = (endPoint, permissions) => {
|
|
|
9
10
|
const toggleNotification = useNotification();
|
|
10
11
|
const isMounted = useRef(true);
|
|
11
12
|
|
|
12
|
-
const
|
|
13
|
-
const { signal } = abortController;
|
|
13
|
+
const { get } = useFetchClient();
|
|
14
14
|
|
|
15
15
|
useEffect(() => {
|
|
16
16
|
const getData = async () => {
|
|
@@ -19,7 +19,7 @@ const useUserForm = (endPoint, permissions) => {
|
|
|
19
19
|
type: 'GET_DATA',
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
const data = await
|
|
22
|
+
const { data } = await get(`/users-permissions/${endPoint}`);
|
|
23
23
|
|
|
24
24
|
dispatch({
|
|
25
25
|
type: 'GET_DATA_SUCCEEDED',
|
|
@@ -45,11 +45,9 @@ const useUserForm = (endPoint, permissions) => {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
return () => {
|
|
48
|
-
abortController.abort();
|
|
49
48
|
isMounted.current = false;
|
|
50
49
|
};
|
|
51
|
-
|
|
52
|
-
}, [isLoadingForPermissions, endPoint]);
|
|
50
|
+
}, [isLoadingForPermissions, endPoint, get, toggleNotification]);
|
|
53
51
|
|
|
54
52
|
const dispatchSubmitSucceeded = useCallback((data) => {
|
|
55
53
|
dispatch({
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';
|
|
4
|
+
import { useQueries } from 'react-query';
|
|
5
|
+
|
|
6
|
+
import pluginId from '../pluginId';
|
|
7
|
+
import { cleanPermissions, getTrad } from '../utils';
|
|
8
|
+
|
|
9
|
+
export const usePlugins = () => {
|
|
10
|
+
const toggleNotification = useNotification();
|
|
11
|
+
const { get } = useFetchClient();
|
|
12
|
+
const { formatAPIError } = useAPIErrorHandler(getTrad);
|
|
13
|
+
|
|
14
|
+
const [
|
|
15
|
+
{
|
|
16
|
+
data: permissions,
|
|
17
|
+
isLoading: isLoadingPermissions,
|
|
18
|
+
error: permissionsError,
|
|
19
|
+
refetch: refetchPermissions,
|
|
20
|
+
},
|
|
21
|
+
{ data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },
|
|
22
|
+
] = useQueries([
|
|
23
|
+
{
|
|
24
|
+
queryKey: [pluginId, 'permissions'],
|
|
25
|
+
async queryFn() {
|
|
26
|
+
const res = await get(`/${pluginId}/permissions`);
|
|
27
|
+
|
|
28
|
+
return res.data.permissions;
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
queryKey: [pluginId, 'routes'],
|
|
33
|
+
async queryFn() {
|
|
34
|
+
const res = await get(`/${pluginId}/routes`);
|
|
35
|
+
|
|
36
|
+
return res.data.routes;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
const refetchQueries = async () => {
|
|
42
|
+
await Promise.all([refetchPermissions(), refetchRoutes()]);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (permissionsError) {
|
|
47
|
+
toggleNotification({
|
|
48
|
+
type: 'warning',
|
|
49
|
+
message: formatAPIError(permissionsError),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}, [toggleNotification, permissionsError, formatAPIError]);
|
|
53
|
+
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (routesError) {
|
|
56
|
+
toggleNotification({
|
|
57
|
+
type: 'warning',
|
|
58
|
+
message: formatAPIError(routesError),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}, [toggleNotification, routesError, formatAPIError]);
|
|
62
|
+
|
|
63
|
+
const isLoading = isLoadingPermissions || isLoadingRoutes;
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
permissions: permissions ? cleanPermissions(permissions) : {},
|
|
67
|
+
routes: routes ?? {},
|
|
68
|
+
getData: refetchQueries,
|
|
69
|
+
isLoading,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { useEffect, useReducer, useRef } from 'react';
|
|
2
|
-
|
|
1
|
+
import { useCallback, useEffect, useReducer, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useFetchClient, useNotification } from '@strapi/helper-plugin';
|
|
3
4
|
import get from 'lodash/get';
|
|
4
|
-
|
|
5
|
+
|
|
5
6
|
import pluginId from '../../pluginId';
|
|
7
|
+
|
|
8
|
+
import init from './init';
|
|
6
9
|
import reducer, { initialState } from './reducer';
|
|
7
10
|
|
|
8
11
|
const useRolesList = (shouldFetchData = true) => {
|
|
@@ -12,28 +15,17 @@ const useRolesList = (shouldFetchData = true) => {
|
|
|
12
15
|
const toggleNotification = useNotification();
|
|
13
16
|
|
|
14
17
|
const isMounted = useRef(true);
|
|
15
|
-
const
|
|
16
|
-
const { signal } = abortController;
|
|
17
|
-
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
if (shouldFetchData) {
|
|
20
|
-
fetchRolesList();
|
|
21
|
-
}
|
|
18
|
+
const fetchClient = useFetchClient();
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
abortController.abort();
|
|
25
|
-
isMounted.current = false;
|
|
26
|
-
};
|
|
27
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
-
}, [shouldFetchData]);
|
|
29
|
-
|
|
30
|
-
const fetchRolesList = async () => {
|
|
20
|
+
const fetchRolesList = useCallback(async () => {
|
|
31
21
|
try {
|
|
32
22
|
dispatch({
|
|
33
23
|
type: 'GET_DATA',
|
|
34
24
|
});
|
|
35
25
|
|
|
36
|
-
const {
|
|
26
|
+
const {
|
|
27
|
+
data: { roles },
|
|
28
|
+
} = await fetchClient.get(`/${pluginId}/roles`);
|
|
37
29
|
|
|
38
30
|
dispatch({
|
|
39
31
|
type: 'GET_DATA_SUCCEEDED',
|
|
@@ -55,7 +47,17 @@ const useRolesList = (shouldFetchData = true) => {
|
|
|
55
47
|
}
|
|
56
48
|
}
|
|
57
49
|
}
|
|
58
|
-
};
|
|
50
|
+
}, [fetchClient, toggleNotification]);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (shouldFetchData) {
|
|
54
|
+
fetchRolesList();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return () => {
|
|
58
|
+
isMounted.current = false;
|
|
59
|
+
};
|
|
60
|
+
}, [shouldFetchData, fetchRolesList]);
|
|
59
61
|
|
|
60
62
|
return { roles, isLoading, getData: fetchRolesList };
|
|
61
63
|
};
|
package/admin/src/index.js
CHANGED
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
// Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated
|
|
6
6
|
// IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED
|
|
7
7
|
import { prefixPluginTranslations } from '@strapi/helper-plugin';
|
|
8
|
+
|
|
8
9
|
import pluginPkg from '../../package.json';
|
|
9
|
-
|
|
10
|
+
|
|
11
|
+
import { PERMISSIONS } from './constants';
|
|
10
12
|
import pluginId from './pluginId';
|
|
11
13
|
import getTrad from './utils/getTrad';
|
|
12
14
|
|
|
@@ -38,7 +40,7 @@ export default {
|
|
|
38
40
|
|
|
39
41
|
return component;
|
|
40
42
|
},
|
|
41
|
-
permissions:
|
|
43
|
+
permissions: PERMISSIONS.accessRoles,
|
|
42
44
|
},
|
|
43
45
|
{
|
|
44
46
|
intlLabel: {
|
|
@@ -54,7 +56,7 @@ export default {
|
|
|
54
56
|
|
|
55
57
|
return component;
|
|
56
58
|
},
|
|
57
|
-
permissions:
|
|
59
|
+
permissions: PERMISSIONS.readProviders,
|
|
58
60
|
},
|
|
59
61
|
{
|
|
60
62
|
intlLabel: {
|
|
@@ -70,7 +72,7 @@ export default {
|
|
|
70
72
|
|
|
71
73
|
return component;
|
|
72
74
|
},
|
|
73
|
-
permissions:
|
|
75
|
+
permissions: PERMISSIONS.readEmailTemplates,
|
|
74
76
|
},
|
|
75
77
|
{
|
|
76
78
|
intlLabel: {
|
|
@@ -86,7 +88,7 @@ export default {
|
|
|
86
88
|
|
|
87
89
|
return component;
|
|
88
90
|
},
|
|
89
|
-
permissions:
|
|
91
|
+
permissions: PERMISSIONS.readAdvancedSettings,
|
|
90
92
|
},
|
|
91
93
|
]
|
|
92
94
|
);
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import React
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Box,
|
|
5
|
+
Button,
|
|
6
|
+
ContentLayout,
|
|
7
|
+
Flex,
|
|
8
|
+
Grid,
|
|
9
|
+
GridItem,
|
|
10
|
+
HeaderLayout,
|
|
11
|
+
Main,
|
|
12
|
+
Option,
|
|
13
|
+
Select,
|
|
14
|
+
Typography,
|
|
15
|
+
useNotifyAT,
|
|
16
|
+
} from '@strapi/design-system';
|
|
5
17
|
import {
|
|
6
18
|
CheckPagePermissions,
|
|
7
19
|
Form,
|
|
@@ -13,29 +25,20 @@ import {
|
|
|
13
25
|
useOverlayBlocker,
|
|
14
26
|
useRBAC,
|
|
15
27
|
} from '@strapi/helper-plugin';
|
|
16
|
-
import {
|
|
17
|
-
useNotifyAT,
|
|
18
|
-
Main,
|
|
19
|
-
HeaderLayout,
|
|
20
|
-
ContentLayout,
|
|
21
|
-
Button,
|
|
22
|
-
Box,
|
|
23
|
-
Flex,
|
|
24
|
-
Select,
|
|
25
|
-
Option,
|
|
26
|
-
Typography,
|
|
27
|
-
Grid,
|
|
28
|
-
GridItem,
|
|
29
|
-
} from '@strapi/design-system';
|
|
30
28
|
import { Check } from '@strapi/icons';
|
|
31
|
-
import
|
|
29
|
+
import { Formik } from 'formik';
|
|
30
|
+
import { useIntl } from 'react-intl';
|
|
31
|
+
import { useMutation, useQuery, useQueryClient } from 'react-query';
|
|
32
|
+
|
|
33
|
+
import { PERMISSIONS } from '../../constants';
|
|
32
34
|
import { getTrad } from '../../utils';
|
|
35
|
+
|
|
36
|
+
import { fetchData, putAdvancedSettings } from './utils/api';
|
|
33
37
|
import layout from './utils/layout';
|
|
34
38
|
import schema from './utils/schema';
|
|
35
|
-
import { fetchData, putAdvancedSettings } from './utils/api';
|
|
36
39
|
|
|
37
40
|
const ProtectedAdvancedSettingsPage = () => (
|
|
38
|
-
<CheckPagePermissions permissions={
|
|
41
|
+
<CheckPagePermissions permissions={PERMISSIONS.readAdvancedSettings}>
|
|
39
42
|
<AdvancedSettingsPage />
|
|
40
43
|
</CheckPagePermissions>
|
|
41
44
|
);
|
|
@@ -48,14 +51,10 @@ const AdvancedSettingsPage = () => {
|
|
|
48
51
|
const queryClient = useQueryClient();
|
|
49
52
|
useFocusWhenNavigate();
|
|
50
53
|
|
|
51
|
-
const updatePermissions = useMemo(
|
|
52
|
-
() => ({ update: pluginPermissions.updateAdvancedSettings }),
|
|
53
|
-
[]
|
|
54
|
-
);
|
|
55
54
|
const {
|
|
56
55
|
isLoading: isLoadingForPermissions,
|
|
57
56
|
allowedActions: { canUpdate },
|
|
58
|
-
} = useRBAC(
|
|
57
|
+
} = useRBAC({ update: PERMISSIONS.updateAdvancedSettings });
|
|
59
58
|
|
|
60
59
|
const { status: isLoadingData, data } = useQuery('advanced', () => fetchData(), {
|
|
61
60
|
onSuccess() {
|
|
@@ -143,7 +142,7 @@ const AdvancedSettingsPage = () => {
|
|
|
143
142
|
validationSchema={schema}
|
|
144
143
|
enableReinitialize
|
|
145
144
|
>
|
|
146
|
-
{({ errors, values, handleChange, isSubmitting }) => {
|
|
145
|
+
{({ errors, values, handleChange, isSubmitting, dirty }) => {
|
|
147
146
|
return (
|
|
148
147
|
<Form>
|
|
149
148
|
<HeaderLayout
|
|
@@ -155,7 +154,7 @@ const AdvancedSettingsPage = () => {
|
|
|
155
154
|
<Button
|
|
156
155
|
loading={isSubmitting}
|
|
157
156
|
type="submit"
|
|
158
|
-
disabled={!canUpdate}
|
|
157
|
+
disabled={canUpdate ? !dirty : !canUpdate}
|
|
159
158
|
startIcon={<Check />}
|
|
160
159
|
size="S"
|
|
161
160
|
>
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { getFetchClient } from '@strapi/helper-plugin';
|
|
2
|
-
import { getRequestURL } from '../../../utils';
|
|
3
2
|
|
|
4
3
|
const fetchData = async () => {
|
|
5
4
|
const { get } = getFetchClient();
|
|
6
|
-
const { data } = await get(
|
|
5
|
+
const { data } = await get('/users-permissions/advanced');
|
|
7
6
|
|
|
8
7
|
return data;
|
|
9
8
|
};
|
|
@@ -11,7 +10,7 @@ const fetchData = async () => {
|
|
|
11
10
|
const putAdvancedSettings = (body) => {
|
|
12
11
|
const { put } = getFetchClient();
|
|
13
12
|
|
|
14
|
-
return put(
|
|
13
|
+
return put('/users-permissions/advanced', body);
|
|
15
14
|
};
|
|
16
15
|
|
|
17
16
|
export { fetchData, putAdvancedSettings };
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import { useIntl } from 'react-intl';
|
|
4
|
-
import { Form, GenericInput } from '@strapi/helper-plugin';
|
|
5
|
-
import { Formik } from 'formik';
|
|
2
|
+
|
|
6
3
|
import {
|
|
7
|
-
|
|
8
|
-
ModalHeader,
|
|
9
|
-
ModalFooter,
|
|
10
|
-
ModalBody,
|
|
4
|
+
Button,
|
|
11
5
|
Grid,
|
|
12
6
|
GridItem,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
ModalBody,
|
|
8
|
+
ModalFooter,
|
|
9
|
+
ModalHeader,
|
|
10
|
+
ModalLayout,
|
|
16
11
|
Textarea,
|
|
17
12
|
} from '@strapi/design-system';
|
|
13
|
+
import { Breadcrumbs, Crumb } from '@strapi/design-system/v2';
|
|
14
|
+
import { Form, GenericInput } from '@strapi/helper-plugin';
|
|
15
|
+
import { Formik } from 'formik';
|
|
16
|
+
import PropTypes from 'prop-types';
|
|
17
|
+
import { useIntl } from 'react-intl';
|
|
18
|
+
|
|
18
19
|
import { getTrad } from '../../../utils';
|
|
19
20
|
import schema from '../utils/schema';
|
|
20
21
|
|
|
@@ -45,7 +46,7 @@ const EmailForm = ({ template, onToggle, onSubmit }) => {
|
|
|
45
46
|
defaultMessage: 'Edit email template',
|
|
46
47
|
})}
|
|
47
48
|
</Crumb>
|
|
48
|
-
<Crumb>
|
|
49
|
+
<Crumb isCurrent>
|
|
49
50
|
{formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}
|
|
50
51
|
</Crumb>
|
|
51
52
|
</Breadcrumbs>
|
|
@@ -120,7 +121,7 @@ const EmailForm = ({ template, onToggle, onSubmit }) => {
|
|
|
120
121
|
id: getTrad('PopUpForm.Email.options.message.label'),
|
|
121
122
|
defaultMessage: 'Message',
|
|
122
123
|
})}
|
|
123
|
-
|
|
124
|
+
id="options.message"
|
|
124
125
|
onChange={handleChange}
|
|
125
126
|
value={values.options.message}
|
|
126
127
|
error={
|