@strapi/plugin-users-permissions 0.0.0-next.f45143c5e2a8a9d85691d0abf79a3f42024a0c71 → 0.0.0-next.f5b09a8e61e059f02784478e27c310c6290be088
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/.eslintignore +1 -2
- package/.eslintrc +14 -0
- 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 +6 -5
- 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/index.js +19 -28
- package/admin/src/pages/AdvancedSettings/index.js +68 -52
- 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 +77 -63
- package/admin/src/pages/EmailTemplates/utils/schema.js +1 -1
- package/admin/src/pages/Providers/index.js +91 -86
- package/admin/src/pages/Providers/utils/forms.js +1 -1
- package/admin/src/pages/Roles/{CreatePage/utils/schema.js → constants.js} +2 -4
- package/admin/src/pages/Roles/hooks/usePlugins.js +78 -0
- package/admin/src/pages/Roles/index.js +17 -11
- package/admin/src/pages/Roles/pages/CreatePage.js +199 -0
- package/admin/src/pages/Roles/pages/EditPage.js +220 -0
- package/admin/src/pages/Roles/{ListPage → pages/ListPage}/components/TableBody.js +46 -15
- package/admin/src/pages/Roles/{ListPage → pages/ListPage}/index.js +48 -47
- package/admin/src/pages/Roles/{ListPage → pages/ListPage}/utils/api.js +3 -4
- package/admin/src/translations/ru.json +50 -26
- package/admin/src/translations/zh-Hans.json +80 -80
- 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 +47 -30
- package/packup.config.ts +42 -0
- package/server/bootstrap/index.js +36 -0
- package/server/controllers/auth.js +51 -14
- package/server/controllers/user.js +12 -1
- 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/.eslintrc.js +0 -14
- package/admin/src/hooks/index.js +0 -5
- package/admin/src/hooks/useFetchRole/index.js +0 -64
- package/admin/src/hooks/useFetchRole/reducer.js +0 -31
- package/admin/src/hooks/useForm/index.js +0 -70
- package/admin/src/hooks/useForm/reducer.js +0 -40
- 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/hooks/useRolesList/index.js +0 -63
- package/admin/src/hooks/useRolesList/init.js +0 -5
- package/admin/src/hooks/useRolesList/reducer.js +0 -31
- package/admin/src/pages/AdvancedSettings/utils/api.js +0 -17
- package/admin/src/pages/EmailTemplates/utils/api.js +0 -17
- package/admin/src/pages/Providers/reducer.js +0 -54
- package/admin/src/pages/Providers/utils/api.js +0 -25
- package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
- package/admin/src/pages/Roles/CreatePage/index.js +0 -182
- package/admin/src/pages/Roles/EditPage/index.js +0 -194
- package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
- package/admin/src/pages/Roles/ProtectedCreatePage/index.js +0 -12
- package/admin/src/pages/Roles/ProtectedEditPage/index.js +0 -12
- package/admin/src/pages/Roles/ProtectedListPage/index.js +0 -15
- package/admin/src/utils/getRequestURL.js +0 -5
- package/strapi-admin.js +0 -3
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import {
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';
|
|
4
4
|
import {
|
|
5
|
+
CheckPagePermissions,
|
|
6
|
+
LoadingIndicatorPage,
|
|
5
7
|
SettingsPageTitle,
|
|
6
|
-
|
|
8
|
+
useAPIErrorHandler,
|
|
9
|
+
useFetchClient,
|
|
10
|
+
useFocusWhenNavigate,
|
|
7
11
|
useNotification,
|
|
8
12
|
useOverlayBlocker,
|
|
9
|
-
CheckPagePermissions,
|
|
10
13
|
useRBAC,
|
|
11
|
-
|
|
12
|
-
LoadingIndicatorPage,
|
|
14
|
+
useTracking,
|
|
13
15
|
} from '@strapi/helper-plugin';
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
16
|
+
import { useIntl } from 'react-intl';
|
|
17
|
+
import { useMutation, useQuery, useQueryClient } from 'react-query';
|
|
18
|
+
|
|
19
|
+
import { PERMISSIONS } from '../../constants';
|
|
16
20
|
import { getTrad } from '../../utils';
|
|
17
|
-
|
|
18
|
-
import EmailTable from './components/EmailTable';
|
|
21
|
+
|
|
19
22
|
import EmailForm from './components/EmailForm';
|
|
23
|
+
import EmailTable from './components/EmailTable';
|
|
20
24
|
|
|
21
25
|
const ProtectedEmailTemplatesPage = () => (
|
|
22
|
-
<CheckPagePermissions permissions={
|
|
26
|
+
<CheckPagePermissions permissions={PERMISSIONS.readEmailTemplates}>
|
|
23
27
|
<EmailTemplatesPage />
|
|
24
28
|
</CheckPagePermissions>
|
|
25
29
|
);
|
|
@@ -30,40 +34,46 @@ const EmailTemplatesPage = () => {
|
|
|
30
34
|
const { notifyStatus } = useNotifyAT();
|
|
31
35
|
const toggleNotification = useNotification();
|
|
32
36
|
const { lockApp, unlockApp } = useOverlayBlocker();
|
|
33
|
-
const trackUsageRef = useRef(trackUsage);
|
|
34
37
|
const queryClient = useQueryClient();
|
|
35
|
-
|
|
38
|
+
const { get, put } = useFetchClient();
|
|
39
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
const [templateToEdit, setTemplateToEdit] = useState(null);
|
|
41
|
+
useFocusWhenNavigate();
|
|
39
42
|
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
}, []);
|
|
43
|
+
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
44
|
+
const [templateToEdit, setTemplateToEdit] = React.useState(null);
|
|
43
45
|
|
|
44
46
|
const {
|
|
45
47
|
isLoading: isLoadingForPermissions,
|
|
46
48
|
allowedActions: { canUpdate },
|
|
47
|
-
} = useRBAC(
|
|
48
|
-
|
|
49
|
-
const {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
})
|
|
56
|
-
);
|
|
57
|
-
},
|
|
58
|
-
onError() {
|
|
59
|
-
toggleNotification({
|
|
60
|
-
type: 'warning',
|
|
61
|
-
message: { id: 'notification.error', defaultMessage: 'An error occured' },
|
|
62
|
-
});
|
|
49
|
+
} = useRBAC({ update: PERMISSIONS.updateEmailTemplates });
|
|
50
|
+
|
|
51
|
+
const { isLoading: isLoadingData, data } = useQuery(
|
|
52
|
+
['users-permissions', 'email-templates'],
|
|
53
|
+
async () => {
|
|
54
|
+
const { data } = await get('/users-permissions/email-templates');
|
|
55
|
+
|
|
56
|
+
return data;
|
|
63
57
|
},
|
|
64
|
-
|
|
58
|
+
{
|
|
59
|
+
onSuccess() {
|
|
60
|
+
notifyStatus(
|
|
61
|
+
formatMessage({
|
|
62
|
+
id: getTrad('Email.template.data.loaded'),
|
|
63
|
+
defaultMessage: 'Email templates has been loaded',
|
|
64
|
+
})
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
onError(error) {
|
|
68
|
+
toggleNotification({
|
|
69
|
+
type: 'warning',
|
|
70
|
+
message: formatAPIError(error),
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
);
|
|
65
75
|
|
|
66
|
-
const isLoading = isLoadingForPermissions || isLoadingData
|
|
76
|
+
const isLoading = isLoadingForPermissions || isLoadingData;
|
|
67
77
|
|
|
68
78
|
const handleToggle = () => {
|
|
69
79
|
setIsModalOpen((prev) => !prev);
|
|
@@ -74,34 +84,38 @@ const EmailTemplatesPage = () => {
|
|
|
74
84
|
handleToggle();
|
|
75
85
|
};
|
|
76
86
|
|
|
77
|
-
const submitMutation = useMutation(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
87
|
+
const submitMutation = useMutation(
|
|
88
|
+
(body) => put('/users-permissions/email-templates', { 'email-templates': body }),
|
|
89
|
+
{
|
|
90
|
+
async onSuccess() {
|
|
91
|
+
await queryClient.invalidateQueries(['users-permissions', 'email-templates']);
|
|
92
|
+
|
|
93
|
+
toggleNotification({
|
|
94
|
+
type: 'success',
|
|
95
|
+
message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
trackUsage('didEditEmailTemplates');
|
|
99
|
+
|
|
100
|
+
unlockApp();
|
|
101
|
+
handleToggle();
|
|
102
|
+
},
|
|
103
|
+
onError(error) {
|
|
104
|
+
toggleNotification({
|
|
105
|
+
type: 'warning',
|
|
106
|
+
message: formatAPIError(error),
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
unlockApp();
|
|
110
|
+
},
|
|
111
|
+
refetchActive: true,
|
|
112
|
+
}
|
|
113
|
+
);
|
|
101
114
|
|
|
102
115
|
const handleSubmit = (body) => {
|
|
103
116
|
lockApp();
|
|
104
|
-
|
|
117
|
+
|
|
118
|
+
trackUsage('willEditEmailTemplates');
|
|
105
119
|
|
|
106
120
|
const editedTemplates = { ...data, [templateToEdit]: body };
|
|
107
121
|
submitMutation.mutate(editedTemplates);
|
|
@@ -130,7 +144,7 @@ const EmailTemplatesPage = () => {
|
|
|
130
144
|
}
|
|
131
145
|
|
|
132
146
|
return (
|
|
133
|
-
<Main aria-busy={
|
|
147
|
+
<Main aria-busy={submitMutation.isLoading}>
|
|
134
148
|
<SettingsPageTitle
|
|
135
149
|
name={formatMessage({
|
|
136
150
|
id: getTrad('HeaderNav.link.emailTemplates'),
|
|
@@ -1,128 +1,132 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
SettingsPageTitle,
|
|
5
|
-
LoadingIndicatorPage,
|
|
6
|
-
useTracking,
|
|
7
|
-
useNotification,
|
|
8
|
-
useOverlayBlocker,
|
|
9
|
-
CheckPagePermissions,
|
|
10
|
-
useRBAC,
|
|
11
|
-
useFocusWhenNavigate,
|
|
12
|
-
onRowClick,
|
|
13
|
-
stopPropagation,
|
|
14
|
-
} from '@strapi/helper-plugin';
|
|
15
|
-
import has from 'lodash/has';
|
|
16
|
-
import upperFirst from 'lodash/upperFirst';
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
17
3
|
import {
|
|
4
|
+
ContentLayout,
|
|
18
5
|
HeaderLayout,
|
|
6
|
+
IconButton,
|
|
19
7
|
Layout,
|
|
20
|
-
ContentLayout,
|
|
21
8
|
Main,
|
|
22
|
-
useNotifyAT,
|
|
23
9
|
Table,
|
|
24
|
-
Thead,
|
|
25
|
-
Tr,
|
|
26
|
-
Th,
|
|
27
10
|
Tbody,
|
|
28
11
|
Td,
|
|
12
|
+
Th,
|
|
13
|
+
Thead,
|
|
14
|
+
Tr,
|
|
29
15
|
Typography,
|
|
30
|
-
IconButton,
|
|
31
16
|
VisuallyHidden,
|
|
32
17
|
} from '@strapi/design-system';
|
|
18
|
+
import {
|
|
19
|
+
CheckPagePermissions,
|
|
20
|
+
LoadingIndicatorPage,
|
|
21
|
+
onRowClick,
|
|
22
|
+
SettingsPageTitle,
|
|
23
|
+
stopPropagation,
|
|
24
|
+
useAPIErrorHandler,
|
|
25
|
+
useCollator,
|
|
26
|
+
useFetchClient,
|
|
27
|
+
useFocusWhenNavigate,
|
|
28
|
+
useNotification,
|
|
29
|
+
useOverlayBlocker,
|
|
30
|
+
useRBAC,
|
|
31
|
+
useTracking,
|
|
32
|
+
} from '@strapi/helper-plugin';
|
|
33
33
|
import { Pencil } from '@strapi/icons';
|
|
34
|
-
import
|
|
35
|
-
import
|
|
36
|
-
import {
|
|
37
|
-
|
|
38
|
-
import { getTrad } from '../../utils';
|
|
39
|
-
import pluginPermissions from '../../permissions';
|
|
34
|
+
import upperFirst from 'lodash/upperFirst';
|
|
35
|
+
import { useIntl } from 'react-intl';
|
|
36
|
+
import { useMutation, useQuery, useQueryClient } from 'react-query';
|
|
37
|
+
|
|
40
38
|
import FormModal from '../../components/FormModal';
|
|
39
|
+
import { PERMISSIONS } from '../../constants';
|
|
40
|
+
import { getTrad } from '../../utils';
|
|
41
|
+
|
|
42
|
+
import forms from './utils/forms';
|
|
41
43
|
|
|
42
44
|
export const ProvidersPage = () => {
|
|
43
|
-
const { formatMessage } = useIntl();
|
|
44
|
-
useFocusWhenNavigate();
|
|
45
|
-
const { notifyStatus } = useNotifyAT();
|
|
45
|
+
const { formatMessage, locale } = useIntl();
|
|
46
46
|
const queryClient = useQueryClient();
|
|
47
47
|
const { trackUsage } = useTracking();
|
|
48
|
-
const
|
|
49
|
-
const [
|
|
50
|
-
const [isSubmiting, setIsSubmiting] = useState(false);
|
|
51
|
-
const [providerToEditName, setProviderToEditName] = useState(null);
|
|
48
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
49
|
+
const [providerToEditName, setProviderToEditName] = React.useState(null);
|
|
52
50
|
const toggleNotification = useNotification();
|
|
53
51
|
const { lockApp, unlockApp } = useOverlayBlocker();
|
|
52
|
+
const { get, put } = useFetchClient();
|
|
53
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
54
|
+
const formatter = useCollator(locale, {
|
|
55
|
+
sensitivity: 'base',
|
|
56
|
+
});
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
return { update: pluginPermissions.updateProviders };
|
|
57
|
-
}, []);
|
|
58
|
+
useFocusWhenNavigate();
|
|
58
59
|
|
|
59
60
|
const {
|
|
60
|
-
isLoading:
|
|
61
|
+
isLoading: isLoadingPermissions,
|
|
61
62
|
allowedActions: { canUpdate },
|
|
62
|
-
} = useRBAC(
|
|
63
|
+
} = useRBAC({ update: PERMISSIONS.updateProviders });
|
|
63
64
|
|
|
64
|
-
const {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
} = useQuery('get-providers', () => fetchData(toggleNotification), {
|
|
69
|
-
onSuccess() {
|
|
70
|
-
notifyStatus(
|
|
71
|
-
formatMessage({
|
|
72
|
-
id: getTrad('Providers.data.loaded'),
|
|
73
|
-
defaultMessage: 'Providers have been loaded',
|
|
74
|
-
})
|
|
75
|
-
);
|
|
76
|
-
},
|
|
77
|
-
initialData: {},
|
|
78
|
-
});
|
|
65
|
+
const { isLoading: isLoadingData, data } = useQuery(
|
|
66
|
+
['users-permissions', 'get-providers'],
|
|
67
|
+
async () => {
|
|
68
|
+
const { data } = await get('/users-permissions/providers');
|
|
79
69
|
|
|
80
|
-
|
|
70
|
+
return data;
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
initialData: {},
|
|
74
|
+
}
|
|
75
|
+
);
|
|
81
76
|
|
|
82
|
-
const submitMutation = useMutation(
|
|
77
|
+
const submitMutation = useMutation((body) => put('/users-permissions/providers', body), {
|
|
83
78
|
async onSuccess() {
|
|
84
|
-
await queryClient.invalidateQueries('
|
|
79
|
+
await queryClient.invalidateQueries(['users-permissions', 'providers']);
|
|
80
|
+
|
|
85
81
|
toggleNotification({
|
|
86
|
-
type: '
|
|
82
|
+
type: 'success',
|
|
87
83
|
message: { id: getTrad('notification.success.submit') },
|
|
88
84
|
});
|
|
89
85
|
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
trackUsage('didEditAuthenticationProvider');
|
|
87
|
+
|
|
92
88
|
handleToggleModal();
|
|
93
89
|
unlockApp();
|
|
94
90
|
},
|
|
95
|
-
onError() {
|
|
91
|
+
onError(error) {
|
|
96
92
|
toggleNotification({
|
|
97
93
|
type: 'warning',
|
|
98
|
-
message:
|
|
94
|
+
message: formatAPIError(error),
|
|
99
95
|
});
|
|
96
|
+
|
|
100
97
|
unlockApp();
|
|
101
|
-
setIsSubmiting(false);
|
|
102
98
|
},
|
|
103
99
|
refetchActive: false,
|
|
104
100
|
});
|
|
105
101
|
|
|
106
|
-
const providers =
|
|
102
|
+
const providers = Object.entries(data)
|
|
103
|
+
.reduce((acc, [name, provider]) => {
|
|
104
|
+
const { icon, enabled, subdomain } = provider;
|
|
107
105
|
|
|
108
|
-
|
|
106
|
+
acc.push({
|
|
107
|
+
name,
|
|
108
|
+
icon: icon === 'envelope' ? ['fas', 'envelope'] : ['fab', icon],
|
|
109
|
+
enabled,
|
|
110
|
+
subdomain,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return acc;
|
|
114
|
+
}, [])
|
|
115
|
+
.sort((a, b) => formatter.compare(a.name, b.name));
|
|
109
116
|
|
|
110
|
-
const
|
|
117
|
+
const isLoading = isLoadingData || isLoadingPermissions;
|
|
118
|
+
|
|
119
|
+
const isProviderWithSubdomain = React.useMemo(() => {
|
|
111
120
|
if (!providerToEditName) {
|
|
112
121
|
return false;
|
|
113
122
|
}
|
|
114
123
|
|
|
115
124
|
const providerToEdit = providers.find((obj) => obj.name === providerToEditName);
|
|
116
125
|
|
|
117
|
-
return
|
|
126
|
+
return !!providerToEdit?.subdomain;
|
|
118
127
|
}, [providers, providerToEditName]);
|
|
119
128
|
|
|
120
|
-
const
|
|
121
|
-
id: getTrad('HeaderNav.link.providers'),
|
|
122
|
-
defaultMessage: 'Providers',
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const layoutToRender = useMemo(() => {
|
|
129
|
+
const layoutToRender = React.useMemo(() => {
|
|
126
130
|
if (providerToEditName === 'email') {
|
|
127
131
|
return forms.email;
|
|
128
132
|
}
|
|
@@ -146,20 +150,21 @@ export const ProvidersPage = () => {
|
|
|
146
150
|
};
|
|
147
151
|
|
|
148
152
|
const handleSubmit = async (values) => {
|
|
149
|
-
setIsSubmiting(true);
|
|
150
|
-
|
|
151
153
|
lockApp();
|
|
152
154
|
|
|
153
|
-
|
|
155
|
+
trackUsage('willEditAuthenticationProvider');
|
|
154
156
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
submitMutation.mutate({ providers: body });
|
|
157
|
+
submitMutation.mutate({ providers: { ...data, [providerToEditName]: values } });
|
|
158
158
|
};
|
|
159
159
|
|
|
160
160
|
return (
|
|
161
161
|
<Layout>
|
|
162
|
-
<SettingsPageTitle
|
|
162
|
+
<SettingsPageTitle
|
|
163
|
+
name={formatMessage({
|
|
164
|
+
id: getTrad('HeaderNav.link.providers'),
|
|
165
|
+
defaultMessage: 'Providers',
|
|
166
|
+
})}
|
|
167
|
+
/>
|
|
163
168
|
<Main>
|
|
164
169
|
<HeaderLayout
|
|
165
170
|
title={formatMessage({
|
|
@@ -167,11 +172,11 @@ export const ProvidersPage = () => {
|
|
|
167
172
|
defaultMessage: 'Providers',
|
|
168
173
|
})}
|
|
169
174
|
/>
|
|
170
|
-
{isLoading
|
|
175
|
+
{isLoading ? (
|
|
171
176
|
<LoadingIndicatorPage />
|
|
172
177
|
) : (
|
|
173
178
|
<ContentLayout>
|
|
174
|
-
<Table colCount={3} rowCount={
|
|
179
|
+
<Table colCount={3} rowCount={providers.length + 1}>
|
|
175
180
|
<Thead>
|
|
176
181
|
<Tr>
|
|
177
182
|
<Th>
|
|
@@ -244,9 +249,9 @@ export const ProvidersPage = () => {
|
|
|
244
249
|
)}
|
|
245
250
|
</Main>
|
|
246
251
|
<FormModal
|
|
247
|
-
initialData={
|
|
252
|
+
initialData={data[providerToEditName]}
|
|
248
253
|
isOpen={isOpen}
|
|
249
|
-
isSubmiting={
|
|
254
|
+
isSubmiting={submitMutation.isLoading}
|
|
250
255
|
layout={layoutToRender}
|
|
251
256
|
headerBreadcrumbs={[
|
|
252
257
|
formatMessage({
|
|
@@ -264,7 +269,7 @@ export const ProvidersPage = () => {
|
|
|
264
269
|
};
|
|
265
270
|
|
|
266
271
|
const ProtectedProvidersPage = () => (
|
|
267
|
-
<CheckPagePermissions permissions={
|
|
272
|
+
<CheckPagePermissions permissions={PERMISSIONS.readProviders}>
|
|
268
273
|
<ProvidersPage />
|
|
269
274
|
</CheckPagePermissions>
|
|
270
275
|
);
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import * as yup from 'yup';
|
|
2
1
|
import { translatedErrors } from '@strapi/helper-plugin';
|
|
2
|
+
import * as yup from 'yup';
|
|
3
3
|
|
|
4
|
-
const
|
|
4
|
+
export const createRoleSchema = yup.object().shape({
|
|
5
5
|
name: yup.string().required(translatedErrors.required),
|
|
6
6
|
description: yup.string().required(translatedErrors.required),
|
|
7
7
|
});
|
|
8
|
-
|
|
9
|
-
export default schema;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';
|
|
4
|
+
import { useQueries } from 'react-query';
|
|
5
|
+
|
|
6
|
+
import { cleanPermissions, getTrad } from '../../../utils';
|
|
7
|
+
|
|
8
|
+
export const usePlugins = () => {
|
|
9
|
+
const toggleNotification = useNotification();
|
|
10
|
+
const { get } = useFetchClient();
|
|
11
|
+
const { formatAPIError } = useAPIErrorHandler(getTrad);
|
|
12
|
+
|
|
13
|
+
const [
|
|
14
|
+
{
|
|
15
|
+
data: permissions,
|
|
16
|
+
isLoading: isLoadingPermissions,
|
|
17
|
+
error: permissionsError,
|
|
18
|
+
refetch: refetchPermissions,
|
|
19
|
+
},
|
|
20
|
+
{ data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },
|
|
21
|
+
] = useQueries([
|
|
22
|
+
{
|
|
23
|
+
queryKey: ['users-permissions', 'permissions'],
|
|
24
|
+
async queryFn() {
|
|
25
|
+
const {
|
|
26
|
+
data: { permissions },
|
|
27
|
+
} = await get(`/users-permissions/permissions`);
|
|
28
|
+
|
|
29
|
+
return permissions;
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
queryKey: ['users-permissions', 'routes'],
|
|
34
|
+
async queryFn() {
|
|
35
|
+
const {
|
|
36
|
+
data: { routes },
|
|
37
|
+
} = await get(`/users-permissions/routes`);
|
|
38
|
+
|
|
39
|
+
return routes;
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
const refetchQueries = async () => {
|
|
45
|
+
await Promise.all([refetchPermissions(), refetchRoutes()]);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (permissionsError) {
|
|
50
|
+
toggleNotification({
|
|
51
|
+
type: 'warning',
|
|
52
|
+
message: formatAPIError(permissionsError),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}, [toggleNotification, permissionsError, formatAPIError]);
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (routesError) {
|
|
59
|
+
toggleNotification({
|
|
60
|
+
type: 'warning',
|
|
61
|
+
message: formatAPIError(routesError),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}, [toggleNotification, routesError, formatAPIError]);
|
|
65
|
+
|
|
66
|
+
const isLoading = isLoadingPermissions || isLoadingRoutes;
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
// TODO: these return values need to be memoized, otherwise
|
|
70
|
+
// they will create infinite rendering loops when used as
|
|
71
|
+
// effect dependencies
|
|
72
|
+
permissions: permissions ? cleanPermissions(permissions) : {},
|
|
73
|
+
routes: routes ?? {},
|
|
74
|
+
|
|
75
|
+
getData: refetchQueries,
|
|
76
|
+
isLoading,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
import ProtectedRolesCreatePage from './
|
|
2
|
+
|
|
3
|
+
import { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin';
|
|
4
|
+
import { Route, Switch } from 'react-router-dom';
|
|
5
|
+
|
|
6
|
+
import { PERMISSIONS } from '../../constants';
|
|
7
|
+
|
|
8
|
+
import { ProtectedRolesCreatePage } from './pages/CreatePage';
|
|
9
|
+
import { ProtectedRolesEditPage } from './pages/EditPage';
|
|
10
|
+
import { ProtectedRolesListPage } from './pages/ListPage';
|
|
9
11
|
|
|
10
12
|
const Roles = () => {
|
|
11
13
|
return (
|
|
12
|
-
<CheckPagePermissions permissions={
|
|
14
|
+
<CheckPagePermissions permissions={PERMISSIONS.accessRoles}>
|
|
13
15
|
<Switch>
|
|
14
16
|
<Route
|
|
15
|
-
path=
|
|
17
|
+
path="/settings/users-permissions/roles/new"
|
|
16
18
|
component={ProtectedRolesCreatePage}
|
|
17
19
|
exact
|
|
18
20
|
/>
|
|
19
|
-
<Route
|
|
20
|
-
|
|
21
|
+
<Route
|
|
22
|
+
path="/settings/users-permissions/roles/:id"
|
|
23
|
+
component={ProtectedRolesEditPage}
|
|
24
|
+
exact
|
|
25
|
+
/>
|
|
26
|
+
<Route path="/settings/users-permissions/roles" component={ProtectedRolesListPage} exact />
|
|
21
27
|
<Route path="" component={AnErrorOccurred} />
|
|
22
28
|
</Switch>
|
|
23
29
|
</CheckPagePermissions>
|