@strapi/plugin-users-permissions 0.0.0-next.f426350b859ddae6592e9bfa99e6be94ae22e117 → 0.0.0-next.f4ec69568d980c6fee91ce2ee0f41c138347aa81

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.
Files changed (218) hide show
  1. package/.eslintignore +1 -2
  2. package/.eslintrc +17 -0
  3. package/LICENSE +18 -3
  4. package/admin/src/components/BoundRoute/{index.js → index.jsx} +2 -2
  5. package/admin/src/components/FormModal/Input/{index.js → index.jsx} +32 -31
  6. package/admin/src/components/FormModal/index.jsx +115 -0
  7. package/admin/src/components/Permissions/PermissionRow/{CheckboxWrapper.js → CheckboxWrapper.jsx} +4 -3
  8. package/admin/src/components/Permissions/PermissionRow/{SubCategory.js → SubCategory.jsx} +13 -22
  9. package/admin/src/components/Permissions/index.jsx +47 -0
  10. package/admin/src/components/Permissions/reducer.js +1 -1
  11. package/admin/src/components/Policies/{index.js → index.jsx} +7 -5
  12. package/admin/src/components/UsersPermissions/{index.js → index.jsx} +15 -7
  13. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  14. package/admin/src/index.js +19 -47
  15. package/admin/src/pages/AdvancedSettings/index.jsx +214 -0
  16. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  17. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  18. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +156 -0
  19. package/admin/src/pages/EmailTemplates/components/{EmailTable.js → EmailTable.jsx} +20 -17
  20. package/admin/src/pages/EmailTemplates/index.jsx +148 -0
  21. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  22. package/admin/src/pages/Providers/index.jsx +262 -0
  23. package/admin/src/pages/Providers/utils/forms.js +23 -11
  24. package/admin/src/pages/Roles/constants.js +3 -3
  25. package/admin/src/{hooks → pages/Roles/hooks}/usePlugins.js +19 -12
  26. package/admin/src/pages/Roles/index.jsx +24 -0
  27. package/admin/src/pages/Roles/pages/CreatePage.jsx +194 -0
  28. package/admin/src/pages/Roles/pages/EditPage.jsx +215 -0
  29. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +119 -0
  30. package/admin/src/pages/Roles/{ListPage/index.js → pages/ListPage/index.jsx} +93 -65
  31. package/admin/src/translations/en.json +1 -1
  32. package/admin/src/translations/zh-Hans.json +80 -80
  33. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  34. package/dist/_chunks/ar-BguGUqwK.js +44 -0
  35. package/dist/_chunks/ar-BguGUqwK.js.map +1 -0
  36. package/dist/_chunks/ar-CK8BRRXB.mjs +44 -0
  37. package/dist/_chunks/ar-CK8BRRXB.mjs.map +1 -0
  38. package/dist/_chunks/cs-BVigMk0l.mjs +50 -0
  39. package/dist/_chunks/cs-BVigMk0l.mjs.map +1 -0
  40. package/dist/_chunks/cs-BW8-K_GY.js +50 -0
  41. package/dist/_chunks/cs-BW8-K_GY.js.map +1 -0
  42. package/dist/_chunks/de-BKUdRFI4.mjs +62 -0
  43. package/dist/_chunks/de-BKUdRFI4.mjs.map +1 -0
  44. package/dist/_chunks/de-owXpVluI.js +62 -0
  45. package/dist/_chunks/de-owXpVluI.js.map +1 -0
  46. package/dist/_chunks/dk-BQiTK50l.mjs +86 -0
  47. package/dist/_chunks/dk-BQiTK50l.mjs.map +1 -0
  48. package/dist/_chunks/dk-LXAnbuBk.js +86 -0
  49. package/dist/_chunks/dk-LXAnbuBk.js.map +1 -0
  50. package/dist/_chunks/en-DOHtPf-2.mjs +86 -0
  51. package/dist/_chunks/en-DOHtPf-2.mjs.map +1 -0
  52. package/dist/_chunks/en-MHo5mcsU.js +86 -0
  53. package/dist/_chunks/en-MHo5mcsU.js.map +1 -0
  54. package/dist/_chunks/es-BwLCLXAQ.js +86 -0
  55. package/dist/_chunks/es-BwLCLXAQ.js.map +1 -0
  56. package/dist/_chunks/es-DNgOVMjD.mjs +86 -0
  57. package/dist/_chunks/es-DNgOVMjD.mjs.map +1 -0
  58. package/dist/_chunks/fr-DkgRugiU.mjs +50 -0
  59. package/dist/_chunks/fr-DkgRugiU.mjs.map +1 -0
  60. package/dist/_chunks/fr-DkhpSjjm.js +50 -0
  61. package/dist/_chunks/fr-DkhpSjjm.js.map +1 -0
  62. package/dist/_chunks/id-BTemOeTZ.js +62 -0
  63. package/dist/_chunks/id-BTemOeTZ.js.map +1 -0
  64. package/dist/_chunks/id-BdEsvnaF.mjs +62 -0
  65. package/dist/_chunks/id-BdEsvnaF.mjs.map +1 -0
  66. package/dist/_chunks/index-2awRBazk.js +281 -0
  67. package/dist/_chunks/index-2awRBazk.js.map +1 -0
  68. package/dist/_chunks/index-BAHBK68t.js +1172 -0
  69. package/dist/_chunks/index-BAHBK68t.js.map +1 -0
  70. package/dist/_chunks/index-BHbzbu1p.mjs +246 -0
  71. package/dist/_chunks/index-BHbzbu1p.mjs.map +1 -0
  72. package/dist/_chunks/index-Be4qNiZI.js +640 -0
  73. package/dist/_chunks/index-Be4qNiZI.js.map +1 -0
  74. package/dist/_chunks/index-C88EQQJQ-C4oUQUND.js +12026 -0
  75. package/dist/_chunks/index-C88EQQJQ-C4oUQUND.js.map +1 -0
  76. package/dist/_chunks/index-C88EQQJQ-DAZ1lfuF.mjs +12002 -0
  77. package/dist/_chunks/index-C88EQQJQ-DAZ1lfuF.mjs.map +1 -0
  78. package/dist/_chunks/index-CbKOY95_.mjs +344 -0
  79. package/dist/_chunks/index-CbKOY95_.mjs.map +1 -0
  80. package/dist/_chunks/index-CeweK3q9.mjs +617 -0
  81. package/dist/_chunks/index-CeweK3q9.mjs.map +1 -0
  82. package/dist/_chunks/index-QcDREbPt.mjs +262 -0
  83. package/dist/_chunks/index-QcDREbPt.mjs.map +1 -0
  84. package/dist/_chunks/index-YTFP-hNZ.js +245 -0
  85. package/dist/_chunks/index-YTFP-hNZ.js.map +1 -0
  86. package/dist/_chunks/index-YZkqoYZN.js +366 -0
  87. package/dist/_chunks/index-YZkqoYZN.js.map +1 -0
  88. package/dist/_chunks/index-mKh-etKG.mjs +1142 -0
  89. package/dist/_chunks/index-mKh-etKG.mjs.map +1 -0
  90. package/dist/_chunks/it-B-rv0E24.mjs +62 -0
  91. package/dist/_chunks/it-B-rv0E24.mjs.map +1 -0
  92. package/dist/_chunks/it-D1rH6V6_.js +62 -0
  93. package/dist/_chunks/it-D1rH6V6_.js.map +1 -0
  94. package/dist/_chunks/ja-C8K-VBPD.mjs +48 -0
  95. package/dist/_chunks/ja-C8K-VBPD.mjs.map +1 -0
  96. package/dist/_chunks/ja-DqShgTMf.js +48 -0
  97. package/dist/_chunks/ja-DqShgTMf.js.map +1 -0
  98. package/dist/_chunks/ko-B9DGEPWH.js +86 -0
  99. package/dist/_chunks/ko-B9DGEPWH.js.map +1 -0
  100. package/dist/_chunks/ko-Busb0wIY.mjs +86 -0
  101. package/dist/_chunks/ko-Busb0wIY.mjs.map +1 -0
  102. package/dist/_chunks/ms-ByvsQjRt.mjs +49 -0
  103. package/dist/_chunks/ms-ByvsQjRt.mjs.map +1 -0
  104. package/dist/_chunks/ms-CPBU3LWf.js +49 -0
  105. package/dist/_chunks/ms-CPBU3LWf.js.map +1 -0
  106. package/dist/_chunks/nl-5qO8Rpcy.mjs +48 -0
  107. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +1 -0
  108. package/dist/_chunks/nl-CwNB6YoO.js +48 -0
  109. package/dist/_chunks/nl-CwNB6YoO.js.map +1 -0
  110. package/dist/_chunks/pl-BdIzifBE.mjs +86 -0
  111. package/dist/_chunks/pl-BdIzifBE.mjs.map +1 -0
  112. package/dist/_chunks/pl-Do9UD69f.js +86 -0
  113. package/dist/_chunks/pl-Do9UD69f.js.map +1 -0
  114. package/dist/_chunks/pt-BIO24ioG.mjs +48 -0
  115. package/dist/_chunks/pt-BIO24ioG.mjs.map +1 -0
  116. package/dist/_chunks/pt-BR-D7dZhxuP.js +44 -0
  117. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +1 -0
  118. package/dist/_chunks/pt-BR-f0p23AQZ.mjs +44 -0
  119. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +1 -0
  120. package/dist/_chunks/pt-fdvyOnUp.js +48 -0
  121. package/dist/_chunks/pt-fdvyOnUp.js.map +1 -0
  122. package/dist/_chunks/ru-C94rjPGA.js +86 -0
  123. package/dist/_chunks/ru-C94rjPGA.js.map +1 -0
  124. package/dist/_chunks/ru-VWy-IB7K.mjs +86 -0
  125. package/dist/_chunks/ru-VWy-IB7K.mjs.map +1 -0
  126. package/dist/_chunks/sk-BABEhykl.js +50 -0
  127. package/dist/_chunks/sk-BABEhykl.js.map +1 -0
  128. package/dist/_chunks/sk-B_LIcepm.mjs +50 -0
  129. package/dist/_chunks/sk-B_LIcepm.mjs.map +1 -0
  130. package/dist/_chunks/sv-ABLKOokl.mjs +86 -0
  131. package/dist/_chunks/sv-ABLKOokl.mjs.map +1 -0
  132. package/dist/_chunks/sv-Be43LhA9.js +86 -0
  133. package/dist/_chunks/sv-Be43LhA9.js.map +1 -0
  134. package/dist/_chunks/th-DKyP7ueR.mjs +60 -0
  135. package/dist/_chunks/th-DKyP7ueR.mjs.map +1 -0
  136. package/dist/_chunks/th-DgVhVLhL.js +60 -0
  137. package/dist/_chunks/th-DgVhVLhL.js.map +1 -0
  138. package/dist/_chunks/tr-B_idhkEs.js +85 -0
  139. package/dist/_chunks/tr-B_idhkEs.js.map +1 -0
  140. package/dist/_chunks/tr-qa1Q5UjC.mjs +85 -0
  141. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +1 -0
  142. package/dist/_chunks/uk-BmRqbeQc.mjs +49 -0
  143. package/dist/_chunks/uk-BmRqbeQc.mjs.map +1 -0
  144. package/dist/_chunks/uk-LHOivnhP.js +49 -0
  145. package/dist/_chunks/uk-LHOivnhP.js.map +1 -0
  146. package/dist/_chunks/vi-CdVRdKDw.js +50 -0
  147. package/dist/_chunks/vi-CdVRdKDw.js.map +1 -0
  148. package/dist/_chunks/vi-HW-EdMea.mjs +50 -0
  149. package/dist/_chunks/vi-HW-EdMea.mjs.map +1 -0
  150. package/dist/_chunks/zh-5hKkVPA4.mjs +86 -0
  151. package/dist/_chunks/zh-5hKkVPA4.mjs.map +1 -0
  152. package/dist/_chunks/zh-Cuq8gMnF.js +86 -0
  153. package/dist/_chunks/zh-Cuq8gMnF.js.map +1 -0
  154. package/dist/_chunks/zh-Hans-BHilK-yc.mjs +86 -0
  155. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +1 -0
  156. package/dist/_chunks/zh-Hans-GQDMKtY4.js +86 -0
  157. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +1 -0
  158. package/dist/admin/index.js +4 -0
  159. package/dist/admin/index.js.map +1 -0
  160. package/dist/admin/index.mjs +5 -0
  161. package/dist/admin/index.mjs.map +1 -0
  162. package/jest.config.front.js +1 -1
  163. package/package.json +46 -27
  164. package/packup.config.ts +22 -0
  165. package/server/bootstrap/index.js +18 -15
  166. package/server/bootstrap/users-permissions-actions.js +6 -0
  167. package/server/config.js +29 -0
  168. package/server/content-types/user/index.js +0 -1
  169. package/server/controllers/auth.js +74 -38
  170. package/server/controllers/content-manager-user.js +28 -30
  171. package/server/controllers/role.js +17 -4
  172. package/server/controllers/user.js +18 -8
  173. package/server/controllers/validation/auth.js +81 -25
  174. package/server/middlewares/rateLimit.js +1 -1
  175. package/server/register.js +1 -1
  176. package/server/services/jwt.js +3 -3
  177. package/server/services/permission.js +3 -7
  178. package/server/services/providers-registry.js +469 -261
  179. package/server/services/providers.js +10 -5
  180. package/server/services/role.js +15 -13
  181. package/server/services/user.js +56 -19
  182. package/server/services/users-permissions.js +15 -13
  183. package/server/utils/index.d.ts +2 -1
  184. package/server/utils/sanitize/sanitizers.js +7 -3
  185. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  186. package/.eslintrc.js +0 -14
  187. package/admin/src/components/FormModal/index.js +0 -126
  188. package/admin/src/components/Permissions/index.js +0 -57
  189. package/admin/src/hooks/index.js +0 -5
  190. package/admin/src/hooks/useFetchRole/index.js +0 -67
  191. package/admin/src/hooks/useFetchRole/reducer.js +0 -31
  192. package/admin/src/hooks/useForm/index.js +0 -68
  193. package/admin/src/hooks/useForm/reducer.js +0 -40
  194. package/admin/src/hooks/useRolesList/index.js +0 -65
  195. package/admin/src/hooks/useRolesList/init.js +0 -5
  196. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  197. package/admin/src/pages/AdvancedSettings/index.js +0 -242
  198. package/admin/src/pages/AdvancedSettings/utils/api.js +0 -16
  199. package/admin/src/pages/EmailTemplates/components/EmailForm.js +0 -176
  200. package/admin/src/pages/EmailTemplates/index.js +0 -159
  201. package/admin/src/pages/EmailTemplates/utils/api.js +0 -16
  202. package/admin/src/pages/Providers/index.js +0 -271
  203. package/admin/src/pages/Providers/reducer.js +0 -54
  204. package/admin/src/pages/Providers/utils/api.js +0 -24
  205. package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
  206. package/admin/src/pages/Roles/CreatePage.js +0 -185
  207. package/admin/src/pages/Roles/EditPage.js +0 -197
  208. package/admin/src/pages/Roles/ListPage/components/TableBody.js +0 -93
  209. package/admin/src/pages/Roles/ListPage/utils/api.js +0 -30
  210. package/admin/src/pages/Roles/ProtectedCreatePage.js +0 -15
  211. package/admin/src/pages/Roles/ProtectedEditPage.js +0 -15
  212. package/admin/src/pages/Roles/ProtectedListPage.js +0 -17
  213. package/admin/src/pages/Roles/index.js +0 -30
  214. package/server/bootstrap/grant-config.js +0 -131
  215. package/strapi-admin.js +0 -3
  216. package/strapi-server.js +0 -3
  217. /package/admin/src/components/Permissions/PermissionRow/{index.js → index.jsx} +0 -0
  218. /package/admin/src/contexts/UsersPermissionsContext/{index.js → index.jsx} +0 -0
@@ -1,21 +0,0 @@
1
- import sortBy from 'lodash/sortBy';
2
-
3
- const createProvidersArray = (data) => {
4
- return sortBy(
5
- Object.keys(data).reduce((acc, current) => {
6
- const { icon: iconName, enabled, subdomain } = data[current];
7
- const icon = iconName === 'envelope' ? ['fas', 'envelope'] : ['fab', iconName];
8
-
9
- if (subdomain !== undefined) {
10
- acc.push({ name: current, icon, enabled, subdomain });
11
- } else {
12
- acc.push({ name: current, icon, enabled });
13
- }
14
-
15
- return acc;
16
- }, []),
17
- 'name'
18
- );
19
- };
20
-
21
- export default createProvidersArray;
@@ -1,185 +0,0 @@
1
- import React, { useRef, useState } from 'react';
2
-
3
- import {
4
- Box,
5
- Button,
6
- ContentLayout,
7
- Flex,
8
- Grid,
9
- GridItem,
10
- HeaderLayout,
11
- Main,
12
- Textarea,
13
- TextInput,
14
- Typography,
15
- } from '@strapi/design-system';
16
- import {
17
- Form,
18
- SettingsPageTitle,
19
- useFetchClient,
20
- useNotification,
21
- useOverlayBlocker,
22
- useTracking,
23
- } from '@strapi/helper-plugin';
24
- import { Check } from '@strapi/icons';
25
- import { Formik } from 'formik';
26
- import { useIntl } from 'react-intl';
27
- import { useHistory } from 'react-router-dom';
28
-
29
- import UsersPermissions from '../../components/UsersPermissions';
30
- import { usePlugins } from '../../hooks';
31
- import pluginId from '../../pluginId';
32
- import getTrad from '../../utils/getTrad';
33
-
34
- import { createRoleSchema } from './constants';
35
-
36
- const CreatePage = () => {
37
- const { formatMessage } = useIntl();
38
- const [isSubmitting, setIsSubmitting] = useState(false);
39
- const toggleNotification = useNotification();
40
- const { goBack } = useHistory();
41
- const { lockApp, unlockApp } = useOverlayBlocker();
42
- const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();
43
- const { trackUsage } = useTracking();
44
- const permissionsRef = useRef();
45
- const { post } = useFetchClient();
46
-
47
- const handleCreateRoleSubmit = async (data) => {
48
- // Set loading state
49
- lockApp();
50
- setIsSubmitting(true);
51
- try {
52
- const permissions = permissionsRef.current.getPermissions();
53
- // Update role in Strapi
54
- await post(`/${pluginId}/roles`, { ...data, ...permissions, users: [] });
55
- // Notify success
56
- trackUsage('didCreateRole');
57
- toggleNotification({
58
- type: 'success',
59
- message: {
60
- id: getTrad('Settings.roles.created'),
61
- defaultMessage: 'Role created',
62
- },
63
- });
64
- // Forcing redirecting since we don't have the id in the response
65
- goBack();
66
- } catch (err) {
67
- console.error(err);
68
- toggleNotification({
69
- type: 'warning',
70
- message: {
71
- id: 'notification.error',
72
- defaultMessage: 'An error occurred',
73
- },
74
- });
75
- }
76
- // Unset loading state
77
- setIsSubmitting(false);
78
- unlockApp();
79
- };
80
-
81
- return (
82
- <Main>
83
- <SettingsPageTitle name="Roles" />
84
- <Formik
85
- enableReinitialize
86
- initialValues={{ name: '', description: '' }}
87
- onSubmit={handleCreateRoleSubmit}
88
- validationSchema={createRoleSchema}
89
- >
90
- {({ handleSubmit, values, handleChange, errors }) => (
91
- <Form noValidate onSubmit={handleSubmit}>
92
- <HeaderLayout
93
- primaryAction={
94
- !isLoadingPlugins && (
95
- <Button type="submit" loading={isSubmitting} startIcon={<Check />}>
96
- {formatMessage({
97
- id: 'global.save',
98
- defaultMessage: 'Save',
99
- })}
100
- </Button>
101
- )
102
- }
103
- title={formatMessage({
104
- id: 'Settings.roles.create.title',
105
- defaultMessage: 'Create a role',
106
- })}
107
- subtitle={formatMessage({
108
- id: 'Settings.roles.create.description',
109
- defaultMessage: 'Define the rights given to the role',
110
- })}
111
- />
112
- <ContentLayout>
113
- <Flex direction="column" alignItems="stretch" gap={7}>
114
- <Box
115
- background="neutral0"
116
- hasRadius
117
- shadow="filterShadow"
118
- paddingTop={6}
119
- paddingBottom={6}
120
- paddingLeft={7}
121
- paddingRight={7}
122
- >
123
- <Flex direction="column" alignItems="stretch" gap={4}>
124
- <Typography variant="delta" as="h2">
125
- {formatMessage({
126
- id: getTrad('EditPage.form.roles'),
127
- defaultMessage: 'Role details',
128
- })}
129
- </Typography>
130
- <Grid gap={4}>
131
- <GridItem col={6}>
132
- <TextInput
133
- name="name"
134
- value={values.name || ''}
135
- onChange={handleChange}
136
- label={formatMessage({
137
- id: 'global.name',
138
- defaultMessage: 'Name',
139
- })}
140
- error={
141
- errors.name
142
- ? formatMessage({ id: errors.name, defaultMessage: 'Invalid value' })
143
- : null
144
- }
145
- />
146
- </GridItem>
147
- <GridItem col={6}>
148
- <Textarea
149
- id="description"
150
- value={values.description || ''}
151
- onChange={handleChange}
152
- label={formatMessage({
153
- id: 'global.description',
154
- defaultMessage: 'Description',
155
- })}
156
- error={
157
- errors.description
158
- ? formatMessage({
159
- id: errors.description,
160
- defaultMessage: 'Invalid value',
161
- })
162
- : null
163
- }
164
- />
165
- </GridItem>
166
- </Grid>
167
- </Flex>
168
- </Box>
169
- {!isLoadingPlugins && (
170
- <UsersPermissions
171
- ref={permissionsRef}
172
- permissions={permissions}
173
- routes={routes}
174
- />
175
- )}
176
- </Flex>
177
- </ContentLayout>
178
- </Form>
179
- )}
180
- </Formik>
181
- </Main>
182
- );
183
- };
184
-
185
- export default CreatePage;
@@ -1,197 +0,0 @@
1
- import React, { useRef, useState } from 'react';
2
-
3
- import {
4
- ContentLayout,
5
- HeaderLayout,
6
- Main,
7
- Button,
8
- Flex,
9
- Box,
10
- TextInput,
11
- Textarea,
12
- Typography,
13
- GridItem,
14
- Grid,
15
- } from '@strapi/design-system';
16
- import {
17
- useFetchClient,
18
- useOverlayBlocker,
19
- SettingsPageTitle,
20
- LoadingIndicatorPage,
21
- Form,
22
- useNotification,
23
- Link,
24
- } from '@strapi/helper-plugin';
25
- import { ArrowLeft, Check } from '@strapi/icons';
26
- import { Formik } from 'formik';
27
- import { useIntl } from 'react-intl';
28
- import { useRouteMatch } from 'react-router-dom';
29
-
30
- import UsersPermissions from '../../components/UsersPermissions';
31
- import { usePlugins, useFetchRole } from '../../hooks';
32
- import pluginId from '../../pluginId';
33
- import getTrad from '../../utils/getTrad';
34
-
35
- import { createRoleSchema } from './constants';
36
-
37
- const EditPage = () => {
38
- const { formatMessage } = useIntl();
39
- const [isSubmitting, setIsSubmitting] = useState(false);
40
- const toggleNotification = useNotification();
41
- const { lockApp, unlockApp } = useOverlayBlocker();
42
- const {
43
- params: { id },
44
- } = useRouteMatch(`/settings/${pluginId}/roles/:id`);
45
- const { isLoading: isLoadingPlugins, routes } = usePlugins();
46
- const { role, onSubmitSucceeded, isLoading: isLoadingRole } = useFetchRole(id);
47
- const permissionsRef = useRef();
48
- const { put } = useFetchClient();
49
-
50
- const handleEditRoleSubmit = async (data) => {
51
- // Set loading state
52
- lockApp();
53
- setIsSubmitting(true);
54
- try {
55
- const permissions = permissionsRef.current.getPermissions();
56
- // Update role in Strapi
57
- await put(`/${pluginId}/roles/${id}`, { ...data, ...permissions, users: [] });
58
- // Notify success
59
- onSubmitSucceeded({ name: data.name, description: data.description });
60
- toggleNotification({
61
- type: 'success',
62
- message: {
63
- id: getTrad('Settings.roles.edited'),
64
- defaultMessage: 'Role edited',
65
- },
66
- });
67
- } catch (err) {
68
- console.error(err);
69
- toggleNotification({
70
- type: 'warning',
71
- message: {
72
- id: 'notification.error',
73
- defaultMessage: 'An error occurred',
74
- },
75
- });
76
- }
77
- // Unset loading state
78
- setIsSubmitting(false);
79
- unlockApp();
80
- };
81
-
82
- if (isLoadingRole) {
83
- return <LoadingIndicatorPage />;
84
- }
85
-
86
- return (
87
- <Main>
88
- <SettingsPageTitle name="Roles" />
89
- <Formik
90
- enableReinitialize
91
- initialValues={{ name: role.name, description: role.description }}
92
- onSubmit={handleEditRoleSubmit}
93
- validationSchema={createRoleSchema}
94
- >
95
- {({ handleSubmit, values, handleChange, errors }) => (
96
- <Form noValidate onSubmit={handleSubmit}>
97
- <HeaderLayout
98
- primaryAction={
99
- !isLoadingPlugins && (
100
- <Button
101
- disabled={role.code === 'strapi-super-admin'}
102
- type="submit"
103
- loading={isSubmitting}
104
- startIcon={<Check />}
105
- >
106
- {formatMessage({
107
- id: 'global.save',
108
- defaultMessage: 'Save',
109
- })}
110
- </Button>
111
- )
112
- }
113
- title={role.name}
114
- subtitle={role.description}
115
- navigationAction={
116
- <Link startIcon={<ArrowLeft />} to="/settings/users-permissions/roles">
117
- {formatMessage({
118
- id: 'global.back',
119
- defaultMessage: 'Back',
120
- })}
121
- </Link>
122
- }
123
- />
124
- <ContentLayout>
125
- <Flex direction="column" alignItems="stretch" gap={7}>
126
- <Box
127
- background="neutral0"
128
- hasRadius
129
- shadow="filterShadow"
130
- paddingTop={6}
131
- paddingBottom={6}
132
- paddingLeft={7}
133
- paddingRight={7}
134
- >
135
- <Flex direction="column" alignItems="stretch" gap={4}>
136
- <Typography variant="delta" as="h2">
137
- {formatMessage({
138
- id: getTrad('EditPage.form.roles'),
139
- defaultMessage: 'Role details',
140
- })}
141
- </Typography>
142
- <Grid gap={4}>
143
- <GridItem col={6}>
144
- <TextInput
145
- name="name"
146
- value={values.name || ''}
147
- onChange={handleChange}
148
- label={formatMessage({
149
- id: 'global.name',
150
- defaultMessage: 'Name',
151
- })}
152
- error={
153
- errors.name
154
- ? formatMessage({ id: errors.name, defaultMessage: 'Invalid value' })
155
- : null
156
- }
157
- />
158
- </GridItem>
159
- <GridItem col={6}>
160
- <Textarea
161
- id="description"
162
- value={values.description || ''}
163
- onChange={handleChange}
164
- label={formatMessage({
165
- id: 'global.description',
166
- defaultMessage: 'Description',
167
- })}
168
- error={
169
- errors.description
170
- ? formatMessage({
171
- id: errors.description,
172
- defaultMessage: 'Invalid value',
173
- })
174
- : null
175
- }
176
- />
177
- </GridItem>
178
- </Grid>
179
- </Flex>
180
- </Box>
181
- {!isLoadingPlugins && (
182
- <UsersPermissions
183
- ref={permissionsRef}
184
- permissions={role.permissions}
185
- routes={routes}
186
- />
187
- )}
188
- </Flex>
189
- </ContentLayout>
190
- </Form>
191
- )}
192
- </Formik>
193
- </Main>
194
- );
195
- };
196
-
197
- export default EditPage;
@@ -1,93 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Flex, IconButton, Tbody, Td, Tr, Typography } from '@strapi/design-system';
4
- import { CheckPermissions, onRowClick, stopPropagation } from '@strapi/helper-plugin';
5
- import { Pencil, Trash } from '@strapi/icons';
6
- import PropTypes from 'prop-types';
7
- import { useIntl } from 'react-intl';
8
- import { useHistory } from 'react-router-dom';
9
-
10
- import pluginId from '../../../../pluginId';
11
-
12
- const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {
13
- const { formatMessage } = useIntl();
14
- const { push } = useHistory();
15
- const [showConfirmDelete, setShowConfirmDelete] = onDelete;
16
-
17
- const checkCanDeleteRole = (role) =>
18
- canDelete && !['public', 'authenticated'].includes(role.type);
19
-
20
- const handleClickDelete = (id) => {
21
- setRoleToDelete(id);
22
- setShowConfirmDelete(!showConfirmDelete);
23
- };
24
-
25
- const handleClickEdit = (id) => {
26
- push(`/settings/${pluginId}/roles/${id}`);
27
- };
28
-
29
- return (
30
- <Tbody>
31
- {sortedRoles?.map((role) => (
32
- <Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>
33
- <Td width="20%">
34
- <Typography>{role.name}</Typography>
35
- </Td>
36
- <Td width="50%">
37
- <Typography>{role.description}</Typography>
38
- </Td>
39
- <Td width="30%">
40
- <Typography>
41
- {`${role.nb_users} ${formatMessage({
42
- id: 'global.users',
43
- defaultMessage: 'users',
44
- }).toLowerCase()}`}
45
- </Typography>
46
- </Td>
47
- <Td>
48
- <Flex justifyContent="end" {...stopPropagation}>
49
- <CheckPermissions permissions={permissions.updateRole}>
50
- <IconButton
51
- onClick={() => handleClickEdit(role.id)}
52
- noBorder
53
- icon={<Pencil />}
54
- label={formatMessage(
55
- { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },
56
- { target: `${role.name}` }
57
- )}
58
- />
59
- </CheckPermissions>
60
- {checkCanDeleteRole(role) && (
61
- <CheckPermissions permissions={permissions.deleteRole}>
62
- <IconButton
63
- onClick={() => handleClickDelete(role.id)}
64
- noBorder
65
- icon={<Trash />}
66
- label={formatMessage(
67
- { id: 'global.delete-target', defaultMessage: 'Delete {target}' },
68
- { target: `${role.name}` }
69
- )}
70
- />
71
- </CheckPermissions>
72
- )}
73
- </Flex>
74
- </Td>
75
- </Tr>
76
- ))}
77
- </Tbody>
78
- );
79
- };
80
-
81
- export default TableBody;
82
-
83
- TableBody.defaultProps = {
84
- canDelete: false,
85
- };
86
-
87
- TableBody.propTypes = {
88
- onDelete: PropTypes.array.isRequired,
89
- permissions: PropTypes.object.isRequired,
90
- setRoleToDelete: PropTypes.func.isRequired,
91
- sortedRoles: PropTypes.array.isRequired,
92
- canDelete: PropTypes.bool,
93
- };
@@ -1,30 +0,0 @@
1
- import { getFetchClient } from '@strapi/helper-plugin';
2
-
3
- export const fetchData = async (toggleNotification, notifyStatus) => {
4
- try {
5
- const { get } = getFetchClient();
6
- const { data } = await get('/users-permissions/roles');
7
- notifyStatus('The roles have loaded successfully');
8
-
9
- return data;
10
- } catch (err) {
11
- toggleNotification({
12
- type: 'warning',
13
- message: { id: 'notification.error' },
14
- });
15
-
16
- throw new Error(err);
17
- }
18
- };
19
-
20
- export const deleteData = async (id, toggleNotification) => {
21
- try {
22
- const { del } = getFetchClient();
23
- await del(`/users-permissions/roles/${id}`);
24
- } catch (error) {
25
- toggleNotification({
26
- type: 'warning',
27
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
28
- });
29
- }
30
- };
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
-
3
- import { CheckPagePermissions } from '@strapi/helper-plugin';
4
-
5
- import { PERMISSIONS } from '../../constants';
6
-
7
- import RolesCreatePage from './CreatePage';
8
-
9
- const ProtectedRolesCreatePage = () => (
10
- <CheckPagePermissions permissions={PERMISSIONS.createRole}>
11
- <RolesCreatePage />
12
- </CheckPagePermissions>
13
- );
14
-
15
- export default ProtectedRolesCreatePage;
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
-
3
- import { CheckPagePermissions } from '@strapi/helper-plugin';
4
-
5
- import { PERMISSIONS } from '../../constants';
6
-
7
- import RolesEditPage from './EditPage';
8
-
9
- const ProtectedRolesEditPage = () => (
10
- <CheckPagePermissions permissions={PERMISSIONS.updateRole}>
11
- <RolesEditPage />
12
- </CheckPagePermissions>
13
- );
14
-
15
- export default ProtectedRolesEditPage;
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
-
3
- import { CheckPagePermissions } from '@strapi/helper-plugin';
4
-
5
- import { PERMISSIONS } from '../../constants';
6
-
7
- import RolesListPage from './ListPage';
8
-
9
- const ProtectedRolesListPage = () => {
10
- return (
11
- <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>
12
- <RolesListPage />
13
- </CheckPagePermissions>
14
- );
15
- };
16
-
17
- export default ProtectedRolesListPage;
@@ -1,30 +0,0 @@
1
- import React from 'react';
2
-
3
- import { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin';
4
- import { Route, Switch } from 'react-router-dom';
5
-
6
- import { PERMISSIONS } from '../../constants';
7
- import pluginId from '../../pluginId';
8
-
9
- import ProtectedRolesCreatePage from './ProtectedCreatePage';
10
- import ProtectedRolesEditPage from './ProtectedEditPage';
11
- import ProtectedRolesListPage from './ProtectedListPage';
12
-
13
- const Roles = () => {
14
- return (
15
- <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>
16
- <Switch>
17
- <Route
18
- path={`/settings/${pluginId}/roles/new`}
19
- component={ProtectedRolesCreatePage}
20
- exact
21
- />
22
- <Route path={`/settings/${pluginId}/roles/:id`} component={ProtectedRolesEditPage} exact />
23
- <Route path={`/settings/${pluginId}/roles`} component={ProtectedRolesListPage} exact />
24
- <Route path="" component={AnErrorOccurred} />
25
- </Switch>
26
- </CheckPagePermissions>
27
- );
28
- };
29
-
30
- export default Roles;