@strapi/plugin-users-permissions 4.0.0-next.7 → 4.0.1

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 (180) hide show
  1. package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
  2. package/admin/src/components/BoundRoute/index.js +40 -24
  3. package/admin/src/components/FormModal/Input/index.js +121 -0
  4. package/admin/src/components/FormModal/index.js +123 -0
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
  7. package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
  8. package/admin/src/components/Permissions/index.js +36 -24
  9. package/admin/src/components/Permissions/init.js +1 -6
  10. package/admin/src/components/Policies/index.js +46 -47
  11. package/admin/src/components/UsersPermissions/index.js +29 -26
  12. package/admin/src/components/UsersPermissions/init.js +1 -2
  13. package/admin/src/hooks/useFetchRole/index.js +17 -7
  14. package/admin/src/hooks/useForm/index.js +3 -29
  15. package/admin/src/hooks/useForm/reducer.js +2 -21
  16. package/admin/src/hooks/usePlugins/index.js +12 -21
  17. package/admin/src/hooks/usePlugins/reducer.js +0 -3
  18. package/admin/src/index.js +29 -34
  19. package/admin/src/pages/AdvancedSettings/index.js +210 -193
  20. package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
  21. package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
  22. package/admin/src/pages/AdvancedSettings/utils/schema.js +21 -0
  23. package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
  24. package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
  25. package/admin/src/pages/EmailTemplates/index.js +125 -198
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +208 -216
  28. package/admin/src/pages/Providers/utils/api.js +21 -0
  29. package/admin/src/pages/Providers/utils/forms.js +168 -126
  30. package/admin/src/pages/Roles/CreatePage/index.js +155 -147
  31. package/admin/src/pages/Roles/EditPage/index.js +162 -134
  32. package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
  33. package/admin/src/pages/Roles/ListPage/index.js +176 -156
  34. package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
  35. package/admin/src/pages/Roles/index.js +14 -8
  36. package/admin/src/translations/ar.json +0 -8
  37. package/admin/src/translations/cs.json +0 -8
  38. package/admin/src/translations/de.json +0 -8
  39. package/admin/src/translations/dk.json +0 -8
  40. package/admin/src/translations/en.json +33 -12
  41. package/admin/src/translations/es.json +0 -8
  42. package/admin/src/translations/fr.json +0 -8
  43. package/admin/src/translations/id.json +0 -8
  44. package/admin/src/translations/it.json +0 -8
  45. package/admin/src/translations/ja.json +0 -8
  46. package/admin/src/translations/ko.json +93 -54
  47. package/admin/src/translations/ms.json +0 -8
  48. package/admin/src/translations/nl.json +0 -8
  49. package/admin/src/translations/pl.json +0 -8
  50. package/admin/src/translations/pt-BR.json +0 -8
  51. package/admin/src/translations/pt.json +0 -8
  52. package/admin/src/translations/ru.json +0 -8
  53. package/admin/src/translations/sk.json +0 -8
  54. package/admin/src/translations/sv.json +0 -8
  55. package/admin/src/translations/th.json +0 -8
  56. package/admin/src/translations/tr.json +0 -8
  57. package/admin/src/translations/uk.json +0 -8
  58. package/admin/src/translations/vi.json +0 -8
  59. package/admin/src/translations/zh-Hans.json +5 -14
  60. package/admin/src/translations/zh.json +0 -8
  61. package/admin/src/utils/axiosInstance.js +36 -0
  62. package/admin/src/utils/formatPluginName.js +26 -0
  63. package/admin/src/utils/index.js +1 -0
  64. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  65. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  66. package/jest.config.front.js +10 -0
  67. package/package.json +35 -32
  68. package/server/bootstrap/index.js +20 -25
  69. package/server/config.js +3 -3
  70. package/server/content-types/index.js +3 -3
  71. package/server/content-types/permission/index.js +30 -3
  72. package/server/content-types/role/index.js +47 -3
  73. package/server/content-types/user/index.js +65 -4
  74. package/server/controllers/auth.js +85 -237
  75. package/server/controllers/content-manager-user.js +183 -0
  76. package/server/controllers/index.js +12 -6
  77. package/server/controllers/permissions.js +26 -0
  78. package/server/controllers/role.js +77 -0
  79. package/server/controllers/settings.js +85 -0
  80. package/server/controllers/user.js +119 -45
  81. package/server/controllers/validation/auth.js +29 -0
  82. package/server/controllers/validation/user.js +38 -0
  83. package/server/graphql/index.js +44 -0
  84. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  85. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  86. package/server/graphql/mutations/auth/login.js +38 -0
  87. package/server/graphql/mutations/auth/register.js +39 -0
  88. package/server/graphql/mutations/auth/reset-password.js +41 -0
  89. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  90. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  91. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  92. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  93. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  94. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  95. package/server/graphql/mutations/index.js +42 -0
  96. package/server/graphql/queries/index.js +13 -0
  97. package/server/graphql/queries/me.js +17 -0
  98. package/server/graphql/resolvers-configs.js +37 -0
  99. package/server/graphql/types/create-role-payload.js +11 -0
  100. package/server/graphql/types/delete-role-payload.js +11 -0
  101. package/server/graphql/types/index.js +21 -0
  102. package/server/graphql/types/login-input.js +13 -0
  103. package/server/graphql/types/login-payload.js +12 -0
  104. package/server/graphql/types/me-role.js +14 -0
  105. package/server/graphql/types/me.js +16 -0
  106. package/server/graphql/types/password-payload.js +11 -0
  107. package/server/graphql/types/register-input.js +13 -0
  108. package/server/graphql/types/update-role-payload.js +11 -0
  109. package/server/graphql/utils.js +27 -0
  110. package/server/index.js +21 -0
  111. package/server/middlewares/index.js +2 -2
  112. package/server/{policies → middlewares}/rateLimit.js +3 -7
  113. package/server/register.js +11 -0
  114. package/server/routes/admin/index.js +10 -0
  115. package/server/routes/admin/permissions.js +20 -0
  116. package/server/routes/admin/role.js +79 -0
  117. package/server/routes/admin/settings.js +95 -0
  118. package/server/routes/content-api/auth.js +73 -0
  119. package/server/routes/content-api/index.js +11 -0
  120. package/server/routes/content-api/permissions.js +9 -0
  121. package/server/routes/content-api/role.js +29 -0
  122. package/server/routes/content-api/user.js +61 -0
  123. package/server/routes/index.js +4 -3
  124. package/server/services/index.js +10 -8
  125. package/server/services/jwt.js +9 -17
  126. package/server/services/providers.js +32 -33
  127. package/server/services/role.js +177 -0
  128. package/server/services/user.js +9 -15
  129. package/server/services/users-permissions.js +140 -338
  130. package/server/strategies/users-permissions.js +123 -0
  131. package/server/utils/index.d.ts +2 -0
  132. package/strapi-admin.js +3 -0
  133. package/strapi-server.js +1 -19
  134. package/admin/src/assets/images/logo.svg +0 -1
  135. package/admin/src/components/BaselineAlignement/index.js +0 -33
  136. package/admin/src/components/Bloc/index.js +0 -10
  137. package/admin/src/components/BoundRoute/Components.js +0 -78
  138. package/admin/src/components/ContainerFluid/index.js +0 -13
  139. package/admin/src/components/FormBloc/index.js +0 -61
  140. package/admin/src/components/IntlInput/index.js +0 -38
  141. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  142. package/admin/src/components/ListRow/Components.js +0 -74
  143. package/admin/src/components/ListRow/index.js +0 -35
  144. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  145. package/admin/src/components/ModalForm/index.js +0 -59
  146. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  147. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  148. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  151. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  152. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  153. package/admin/src/components/Policies/Components.js +0 -26
  154. package/admin/src/components/PrefixedIcon/index.js +0 -27
  155. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  156. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  157. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  158. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  159. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  160. package/admin/src/components/Roles/index.js +0 -3
  161. package/admin/src/components/SizedInput/index.js +0 -24
  162. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  163. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  164. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  165. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  166. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  167. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  168. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  169. package/server/content-types/permission/schema.json +0 -48
  170. package/server/content-types/role/schema.json +0 -46
  171. package/server/content-types/user/schema.json +0 -66
  172. package/server/controllers/user/admin.js +0 -230
  173. package/server/controllers/user/api.js +0 -174
  174. package/server/controllers/users-permissions.js +0 -271
  175. package/server/middlewares/users-permissions.js +0 -36
  176. package/server/policies/index.js +0 -11
  177. package/server/policies/isAuthenticated.js +0 -9
  178. package/server/policies/permissions.js +0 -94
  179. package/server/routes/routes.json +0 -381
  180. package/server/schema.graphql.js +0 -317
@@ -3,20 +3,56 @@ import { translatedErrors } from '@strapi/helper-plugin';
3
3
 
4
4
  import { getTrad } from '../../../utils';
5
5
 
6
+ const callbackLabel = {
7
+ id: getTrad('PopUpForm.Providers.redirectURL.front-end.label'),
8
+ defaultMessage: 'The redirect URL to your front-end app',
9
+ };
10
+ const callbackPlaceholder = {
11
+ id: 'http://www.client-app.com',
12
+ defaultMessage: 'http://www.client-app.com',
13
+ };
14
+ const enabledDescription = {
15
+ id: getTrad('PopUpForm.Providers.enabled.description'),
16
+ defaultMessage: "If disabled, users won't be able to use this provider.",
17
+ };
18
+ const enabledLabel = {
19
+ id: getTrad('PopUpForm.Providers.enabled.label'),
20
+ defaultMessage: 'Enable',
21
+ };
22
+ const keyLabel = { id: getTrad('PopUpForm.Providers.key.label'), defaultMessage: 'Client ID' };
23
+ const hintLabel = {
24
+ id: getTrad('PopUpForm.Providers.redirectURL.label'),
25
+ defaultMessage: 'The redirect URL to add in your {provider} application configurations',
26
+ values: {
27
+ provider: 'VK',
28
+ },
29
+ };
30
+ const textPlaceholder = {
31
+ id: getTrad('PopUpForm.Providers.key.placeholder'),
32
+ defaultMessage: 'TEXT',
33
+ };
34
+
35
+ const secretLabel = {
36
+ id: getTrad('PopUpForm.Providers.secret.label'),
37
+ defaultMessage: 'Client Secret',
38
+ };
39
+
6
40
  const forms = {
7
41
  email: {
8
42
  form: [
9
- {
10
- autoFocus: true,
11
- label: getTrad('PopUpForm.Providers.enabled.label'),
12
- name: 'enabled',
13
- type: 'bool',
14
- description: getTrad('PopUpForm.Providers.enabled.description'),
15
- size: { xs: 6 },
16
- validations: {
17
- required: true,
43
+ [
44
+ {
45
+ intlLabel: enabledLabel,
46
+ name: 'enabled',
47
+ type: 'bool',
48
+ description: enabledDescription,
49
+ size: 6,
50
+ // TODO check if still needed
51
+ // validations: {
52
+ // required: true,
53
+ // },
18
54
  },
19
- },
55
+ ],
20
56
  ],
21
57
  schema: yup.object().shape({
22
58
  enabled: yup.bool().required(translatedErrors.required),
@@ -24,65 +60,64 @@ const forms = {
24
60
  },
25
61
  providers: {
26
62
  form: [
27
- {
28
- autoFocus: true,
29
- label: getTrad('PopUpForm.Providers.enabled.label'),
30
- name: 'enabled',
31
- type: 'bool',
32
- description: getTrad('PopUpForm.Providers.enabled.description'),
33
- size: { xs: 6 },
34
- validations: {
35
- required: true,
36
- },
37
- },
38
- {
39
- autoFocus: false,
40
- label: getTrad('PopUpForm.Providers.key.label'),
41
- name: 'key',
42
- type: 'text',
43
- placeholder: getTrad('PopUpForm.Providers.key.placeholder'),
44
- size: { xs: 12 },
45
- validations: {
46
- required: true,
63
+ [
64
+ {
65
+ intlLabel: enabledLabel,
66
+ name: 'enabled',
67
+ type: 'bool',
68
+ description: enabledDescription,
69
+ size: 6,
70
+ validations: {
71
+ required: true,
72
+ },
47
73
  },
48
- },
49
- {
50
- autoFocus: false,
51
- label: getTrad('PopUpForm.Providers.secret.label'),
52
- name: 'secret',
53
- type: 'text',
54
- placeholder: getTrad('PopUpForm.Providers.secret.placeholder'),
55
- size: { xs: 12 },
56
- validations: {
57
- required: true,
74
+ ],
75
+ [
76
+ {
77
+ intlLabel: keyLabel,
78
+ name: 'key',
79
+ type: 'text',
80
+ placeholder: textPlaceholder,
81
+ size: 12,
82
+ validations: {
83
+ required: true,
84
+ },
58
85
  },
59
- },
60
- {
61
- autoFocus: false,
62
- label: getTrad('PopUpForm.Providers.redirectURL.front-end.label'),
63
- placeholder: 'http://www.client-app.com',
64
- name: 'callback',
65
- type: 'text',
66
- size: { xs: 12 },
67
- validations: {
68
- required: true,
86
+ ],
87
+ [
88
+ {
89
+ intlLabel: secretLabel,
90
+ name: 'secret',
91
+ type: 'text',
92
+ placeholder: textPlaceholder,
93
+ size: 12,
94
+ validations: {
95
+ required: true,
96
+ },
69
97
  },
70
- },
71
- {
72
- label: {
73
- id: getTrad('PopUpForm.Providers.redirectURL.label'),
74
- params: {
75
- provider: 'VK',
98
+ ],
99
+ [
100
+ {
101
+ intlLabel: callbackLabel,
102
+ placeholder: callbackPlaceholder,
103
+ name: 'callback',
104
+ type: 'text',
105
+ size: 12,
106
+ validations: {
107
+ required: true,
76
108
  },
77
109
  },
78
- name: 'noName',
79
- type: 'text',
80
- validations: {},
81
- size: {
82
- xs: 12,
110
+ ],
111
+ [
112
+ {
113
+ intlLabel: hintLabel,
114
+ name: 'noName',
115
+ type: 'text',
116
+ validations: {},
117
+ size: 12,
118
+ disabled: true,
83
119
  },
84
- disabled: true,
85
- },
120
+ ],
86
121
  ],
87
122
  schema: yup.object().shape({
88
123
  enabled: yup.bool().required(translatedErrors.required),
@@ -105,76 +140,83 @@ const forms = {
105
140
  },
106
141
  providersWithSubdomain: {
107
142
  form: [
108
- {
109
- autoFocus: true,
110
- label: getTrad('PopUpForm.Providers.enabled.label'),
111
- name: 'enabled',
112
- type: 'bool',
113
- description: getTrad('PopUpForm.Providers.enabled.description'),
114
- size: { xs: 6 },
115
- validations: {
116
- required: true,
117
- },
118
- },
119
- {
120
- autoFocus: false,
121
- label: getTrad('PopUpForm.Providers.key.label'),
122
- name: 'key',
123
- type: 'text',
124
- placeholder: getTrad('PopUpForm.Providers.key.placeholder'),
125
- size: { xs: 12 },
126
- validations: {
127
- required: true,
143
+ [
144
+ {
145
+ intlLabel: enabledLabel,
146
+ name: 'enabled',
147
+ type: 'bool',
148
+ description: enabledDescription,
149
+ size: 6,
150
+ validations: {
151
+ required: true,
152
+ },
128
153
  },
129
- },
130
- {
131
- autoFocus: false,
132
- label: getTrad('PopUpForm.Providers.secret.label'),
133
- name: 'secret',
134
- type: 'text',
135
- placeholder: getTrad('PopUpForm.Providers.secret.placeholder'),
136
- size: { xs: 12 },
137
- validations: {
138
- required: true,
154
+ ],
155
+ [
156
+ {
157
+ intlLabel: keyLabel,
158
+ name: 'key',
159
+ type: 'text',
160
+ placeholder: textPlaceholder,
161
+ size: 12,
162
+ validations: {
163
+ required: true,
164
+ },
139
165
  },
140
- },
141
- {
142
- autoFocus: false,
143
- label: getTrad('PopUpForm.Providers.subdomain.label'),
144
- name: 'subdomain',
145
- type: 'text',
146
- placeholder: getTrad('PopUpForm.Providers.subdomain.placeholder'),
147
- size: { xs: 12 },
148
- validations: {
149
- required: true,
166
+ ],
167
+ [
168
+ {
169
+ intlLabel: secretLabel,
170
+ name: 'secret',
171
+ type: 'text',
172
+ placeholder: textPlaceholder,
173
+ size: 12,
174
+ validations: {
175
+ required: true,
176
+ },
150
177
  },
151
- },
152
- {
153
- autoFocus: false,
154
- label: getTrad('PopUpForm.Providers.redirectURL.front-end.label'),
155
- placeholder: 'http://www.client-app.com',
156
- name: 'callback',
157
- type: 'text',
158
- size: { xs: 12 },
159
- validations: {
160
- required: true,
178
+ ],
179
+
180
+ [
181
+ {
182
+ intlLabel: {
183
+ id: getTrad('PopUpForm.Providers.subdomain.label'),
184
+ defaultMessage: 'Host URI (Subdomain)',
185
+ },
186
+ name: 'subdomain',
187
+ type: 'text',
188
+ placeholder: {
189
+ id: getTrad('PopUpForm.Providers.subdomain.placeholder'),
190
+ defaultMessage: 'my.subdomain.com',
191
+ },
192
+ size: 12,
193
+ validations: {
194
+ required: true,
195
+ },
161
196
  },
162
- },
163
- {
164
- label: {
165
- id: getTrad('PopUpForm.Providers.redirectURL.label'),
166
- params: {
167
- provider: 'VK',
197
+ ],
198
+ [
199
+ {
200
+ intlLabel: callbackLabel,
201
+ placeholder: callbackPlaceholder,
202
+ name: 'callback',
203
+ type: 'text',
204
+ size: 12,
205
+ validations: {
206
+ required: true,
168
207
  },
169
208
  },
170
- name: 'noName',
171
- type: 'text',
172
- validations: {},
173
- size: {
174
- xs: 12,
209
+ ],
210
+ [
211
+ {
212
+ intlLabel: hintLabel,
213
+ name: 'noName',
214
+ type: 'text',
215
+ validations: {},
216
+ size: 12,
217
+ disabled: true,
175
218
  },
176
- disabled: true,
177
- },
219
+ ],
178
220
  ],
179
221
  schema: yup.object().shape({
180
222
  enabled: yup.bool().required(translatedErrors.required),
@@ -1,169 +1,177 @@
1
1
  import React, { useState, useRef } from 'react';
2
2
  import { useHistory } from 'react-router-dom';
3
- import { Header } from '@buffetjs/custom';
4
- import { Padded } from '@buffetjs/core';
3
+ import { ContentLayout, HeaderLayout } from '@strapi/design-system/Layout';
4
+ import { Main } from '@strapi/design-system/Main';
5
+ import { Button } from '@strapi/design-system/Button';
6
+ import { Stack } from '@strapi/design-system/Stack';
7
+ import { Box } from '@strapi/design-system/Box';
8
+ import { TextInput } from '@strapi/design-system/TextInput';
9
+ import { Textarea } from '@strapi/design-system/Textarea';
10
+ import { Typography } from '@strapi/design-system/Typography';
11
+ import Check from '@strapi/icons/Check';
12
+ import { GridItem, Grid } from '@strapi/design-system/Grid';
5
13
  import { Formik } from 'formik';
6
14
  import { useIntl } from 'react-intl';
7
- import { request, useTracking, useNotification, useOverlayBlocker } from '@strapi/helper-plugin';
8
- import BaselineAlignement from '../../../components/BaselineAlignement';
9
- import ContainerFluid from '../../../components/ContainerFluid';
10
- import FormCard from '../../../components/FormBloc';
11
- import SizedInput from '../../../components/SizedInput';
15
+ import {
16
+ useOverlayBlocker,
17
+ SettingsPageTitle,
18
+ useTracking,
19
+ Form,
20
+ useNotification,
21
+ } from '@strapi/helper-plugin';
22
+ import UsersPermissions from '../../../components/UsersPermissions';
12
23
  import getTrad from '../../../utils/getTrad';
13
24
  import pluginId from '../../../pluginId';
14
- import UsersPermissions from '../../../components/UsersPermissions';
15
25
  import { usePlugins } from '../../../hooks';
16
26
  import schema from './utils/schema';
27
+ import axiosInstance from '../../../utils/axiosInstance';
17
28
 
18
- const CreatePage = () => {
29
+ const EditPage = () => {
19
30
  const { formatMessage } = useIntl();
20
- const { trackUsage } = useTracking();
31
+ const [isSubmitting, setIsSubmitting] = useState(false);
21
32
  const toggleNotification = useNotification();
22
- const { lockApp, unlockApp } = useOverlayBlocker();
23
33
  const { goBack } = useHistory();
24
- const [isSubmiting, setIsSubmiting] = useState(false);
25
- const { permissions, routes, policies, isLoading } = usePlugins();
34
+ const { lockApp, unlockApp } = useOverlayBlocker();
35
+ const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();
36
+ const { trackUsage } = useTracking();
26
37
  const permissionsRef = useRef();
27
38
 
28
- const headerActions = (handleSubmit, handleReset) => {
29
- if (isLoading) {
30
- return [];
31
- }
32
-
33
- return [
34
- {
35
- label: formatMessage({
36
- id: 'app.components.Button.reset',
37
- defaultMessage: 'Reset',
38
- }),
39
- onClick: () => {
40
- handleReset();
41
- permissionsRef.current.resetForm();
42
- },
43
- color: 'cancel',
44
- type: 'button',
45
- },
46
- {
47
- label: formatMessage({
48
- id: getTrad('app.components.Button.save'),
49
- defaultMessage: 'Save',
50
- }),
51
- onClick: handleSubmit,
52
- color: 'success',
53
- type: 'submit',
54
- isLoading: isSubmiting,
55
- },
56
- ];
57
- };
58
-
59
- const handleCreateRoleSubmit = data => {
39
+ const handleCreateRoleSubmit = async data => {
40
+ // Set loading state
60
41
  lockApp();
61
- setIsSubmiting(true);
62
-
63
- const permissions = permissionsRef.current.getPermissions();
64
-
65
- Promise.resolve(
66
- request(`/${pluginId}/roles`, {
67
- method: 'POST',
68
- body: { ...data, ...permissions, users: [] },
69
- })
70
- )
71
- .then(() => {
72
- trackUsage('didCreateRole');
73
- toggleNotification({
74
- type: 'success',
75
- message: { id: 'Settings.roles.created' },
76
- });
77
- // Forcing redirecting since we don't have the id in the response
78
- // TODO
79
- goBack();
80
- })
81
- .catch(err => {
82
- console.error(err);
83
- toggleNotification({
84
- type: 'warning',
85
- message: { id: 'notification.error' },
86
- });
87
- })
88
- .finally(() => {
89
- setIsSubmiting(false);
90
- unlockApp();
42
+ setIsSubmitting(true);
43
+ try {
44
+ const permissions = permissionsRef.current.getPermissions();
45
+ // Update role in Strapi
46
+ await axiosInstance.post(`/${pluginId}/roles`, { ...data, ...permissions, users: [] });
47
+ // Notify success
48
+ trackUsage('didCreateRole');
49
+ toggleNotification({
50
+ type: 'success',
51
+ message: {
52
+ id: getTrad('Settings.roles.created'),
53
+ defaultMessage: 'Role created',
54
+ },
55
+ });
56
+ // Forcing redirecting since we don't have the id in the response
57
+ goBack();
58
+ } catch (err) {
59
+ console.error(err);
60
+ toggleNotification({
61
+ type: 'warning',
62
+ message: {
63
+ id: 'notification.error',
64
+ defaultMessage: 'An error occurred',
65
+ },
91
66
  });
67
+ }
68
+ // Unset loading state
69
+ setIsSubmitting(false);
70
+ unlockApp();
92
71
  };
93
72
 
94
73
  return (
95
- <Formik
96
- initialValues={{ name: '', description: '' }}
97
- onSubmit={handleCreateRoleSubmit}
98
- validationSchema={schema}
99
- >
100
- {({ handleSubmit, values, errors, handleReset, handleChange, handleBlur, touched }) => {
101
- return (
102
- <form onSubmit={handleSubmit}>
103
- <ContainerFluid padding="0">
104
- <Header
105
- title={{
106
- label: formatMessage({
107
- id: getTrad('Settings.roles.create.title'),
108
- defaultMessage: 'Create a role',
109
- }),
110
- }}
111
- content={formatMessage({
112
- id: getTrad('Settings.roles.create.description'),
113
- defaultMessage: 'Define the rights given to the role',
114
- })}
115
- actions={headerActions(handleSubmit, handleReset)}
116
- isLoading={isLoading}
117
- />
118
- <BaselineAlignement top size="3px" />
119
- <FormCard
120
- isLoading={isLoading}
121
- title={formatMessage({
122
- id: getTrad('EditPage.form.roles'),
123
- defaultMessage: 'Role details',
124
- })}
125
- >
126
- <SizedInput
127
- label="Settings.roles.form.input.name"
128
- defaultMessage="Name"
129
- name="name"
130
- type="text"
131
- error={errors.name && touched.name ? { id: errors.name } : null}
132
- onBlur={handleBlur}
133
- value={values.name}
134
- onChange={handleChange}
135
- />
136
- <SizedInput
137
- label="Settings.roles.form.input.description"
138
- defaultMessage="Description"
139
- name="description"
140
- type="textarea"
141
- error={
142
- errors.description && touched.description ? { id: errors.description } : null
143
- }
144
- onBlur={handleBlur}
145
- value={values.description}
146
- onChange={handleChange}
147
- // Override the default height of the textarea
148
- style={{ height: 115 }}
149
- />
150
- </FormCard>
151
- </ContainerFluid>
152
- <div style={{ paddingTop: '1.8rem' }} />
153
- {!isLoading && (
154
- <UsersPermissions
155
- ref={permissionsRef}
156
- permissions={permissions}
157
- routes={routes}
158
- policies={policies}
159
- />
160
- )}
161
- <Padded top size="md" />
162
- </form>
163
- );
164
- }}
165
- </Formik>
74
+ <Main>
75
+ <SettingsPageTitle name="Roles" />
76
+ <Formik
77
+ enableReinitialize
78
+ initialValues={{ name: '', description: '' }}
79
+ onSubmit={handleCreateRoleSubmit}
80
+ validationSchema={schema}
81
+ >
82
+ {({ handleSubmit, values, handleChange, errors }) => (
83
+ <Form noValidate onSubmit={handleSubmit}>
84
+ <HeaderLayout
85
+ primaryAction={
86
+ !isLoadingPlugins && (
87
+ <Button type="submit" loading={isSubmitting} startIcon={<Check />}>
88
+ {formatMessage({
89
+ id: 'app.components.Button.save',
90
+ defaultMessage: 'Save',
91
+ })}
92
+ </Button>
93
+ )
94
+ }
95
+ title={formatMessage({
96
+ id: 'Settings.roles.create.title',
97
+ defaultMessage: 'Create a role',
98
+ })}
99
+ subtitle={formatMessage({
100
+ id: 'Settings.roles.create.description',
101
+ defaultMessage: 'Define the rights given to the role',
102
+ })}
103
+ />
104
+ <ContentLayout>
105
+ <Stack size={7}>
106
+ <Box
107
+ background="neutral0"
108
+ hasRadius
109
+ shadow="filterShadow"
110
+ paddingTop={6}
111
+ paddingBottom={6}
112
+ paddingLeft={7}
113
+ paddingRight={7}
114
+ >
115
+ <Stack size={4}>
116
+ <Typography variant="delta" as="h2">
117
+ {formatMessage({
118
+ id: getTrad('EditPage.form.roles'),
119
+ defaultMessage: 'Role details',
120
+ })}
121
+ </Typography>
122
+ <Grid gap={4}>
123
+ <GridItem col={6}>
124
+ <TextInput
125
+ name="name"
126
+ value={values.name || ''}
127
+ onChange={handleChange}
128
+ label={formatMessage({
129
+ id: 'Settings.roles.form.input.name',
130
+ defaultMessage: 'Name',
131
+ })}
132
+ error={
133
+ errors.name
134
+ ? formatMessage({ id: errors.name, defaultMessage: 'Invalid value' })
135
+ : null
136
+ }
137
+ />
138
+ </GridItem>
139
+ <GridItem col={6}>
140
+ <Textarea
141
+ name="description"
142
+ value={values.description || ''}
143
+ onChange={handleChange}
144
+ label={formatMessage({
145
+ id: 'Settings.roles.form.input.description',
146
+ defaultMessage: 'Description',
147
+ })}
148
+ error={
149
+ errors.description
150
+ ? formatMessage({
151
+ id: errors.description,
152
+ defaultMessage: 'Invalid value',
153
+ })
154
+ : null
155
+ }
156
+ />
157
+ </GridItem>
158
+ </Grid>
159
+ </Stack>
160
+ </Box>
161
+ {!isLoadingPlugins && (
162
+ <UsersPermissions
163
+ ref={permissionsRef}
164
+ permissions={permissions}
165
+ routes={routes}
166
+ />
167
+ )}
168
+ </Stack>
169
+ </ContentLayout>
170
+ </Form>
171
+ )}
172
+ </Formik>
173
+ </Main>
166
174
  );
167
175
  };
168
176
 
169
- export default CreatePage;
177
+ export default EditPage;