@strapi/plugin-users-permissions 0.0.0-next.cb00a1799402728de4ecec6d52a815e33fcedaf3 → 0.0.0-next.ce84fada19d58a7dfbdd553035e6558f8befcba4

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 (246) hide show
  1. package/LICENSE +18 -3
  2. package/admin/src/components/BoundRoute/index.jsx +2 -2
  3. package/admin/src/components/FormModal/Input/index.jsx +32 -31
  4. package/admin/src/components/FormModal/index.jsx +57 -68
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.jsx +4 -3
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.jsx +13 -22
  7. package/admin/src/components/Permissions/index.jsx +27 -35
  8. package/admin/src/components/Permissions/reducer.js +1 -1
  9. package/admin/src/components/Policies/index.jsx +7 -5
  10. package/admin/src/components/UsersPermissions/index.jsx +15 -7
  11. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  12. package/admin/src/index.js +15 -32
  13. package/admin/src/pages/AdvancedSettings/index.jsx +83 -128
  14. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  15. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  16. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +119 -139
  17. package/admin/src/pages/EmailTemplates/components/EmailTable.jsx +20 -17
  18. package/admin/src/pages/EmailTemplates/index.jsx +36 -62
  19. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  20. package/admin/src/pages/Providers/index.jsx +98 -113
  21. package/admin/src/pages/Providers/utils/forms.js +11 -11
  22. package/admin/src/pages/Roles/constants.js +3 -3
  23. package/admin/src/pages/Roles/hooks/usePlugins.js +4 -4
  24. package/admin/src/pages/Roles/index.jsx +9 -18
  25. package/admin/src/pages/Roles/pages/CreatePage.jsx +53 -58
  26. package/admin/src/pages/Roles/pages/EditPage.jsx +63 -68
  27. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +27 -31
  28. package/admin/src/pages/Roles/pages/ListPage/index.jsx +81 -55
  29. package/admin/src/translations/en.json +1 -1
  30. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  31. package/dist/_chunks/{ar-t5qTFaAD.js → ar-BguGUqwK.js} +1 -1
  32. package/dist/_chunks/ar-BguGUqwK.js.map +1 -0
  33. package/dist/_chunks/{ar-MvD8Ghac.mjs → ar-CK8BRRXB.mjs} +1 -1
  34. package/dist/_chunks/ar-CK8BRRXB.mjs.map +1 -0
  35. package/dist/_chunks/{cs-BMuXwxA1.mjs → cs-BVigMk0l.mjs} +1 -1
  36. package/dist/_chunks/cs-BVigMk0l.mjs.map +1 -0
  37. package/dist/_chunks/{cs-I8N4u-Sd.js → cs-BW8-K_GY.js} +1 -1
  38. package/dist/_chunks/cs-BW8-K_GY.js.map +1 -0
  39. package/dist/_chunks/{de-zs2qqc0W.mjs → de-BKUdRFI4.mjs} +1 -1
  40. package/dist/_chunks/de-BKUdRFI4.mjs.map +1 -0
  41. package/dist/_chunks/{de-YTjtq89K.js → de-owXpVluI.js} +1 -1
  42. package/dist/_chunks/de-owXpVluI.js.map +1 -0
  43. package/dist/_chunks/{dk-HctVBMsG.mjs → dk-BQiTK50l.mjs} +1 -1
  44. package/dist/_chunks/dk-BQiTK50l.mjs.map +1 -0
  45. package/dist/_chunks/{dk-TF-dWjzl.js → dk-LXAnbuBk.js} +1 -1
  46. package/dist/_chunks/dk-LXAnbuBk.js.map +1 -0
  47. package/dist/_chunks/{en-CE3wEy_c.mjs → en-DOHtPf-2.mjs} +2 -2
  48. package/dist/_chunks/en-DOHtPf-2.mjs.map +1 -0
  49. package/dist/_chunks/{en-m608rMZx.js → en-MHo5mcsU.js} +2 -2
  50. package/dist/_chunks/en-MHo5mcsU.js.map +1 -0
  51. package/dist/_chunks/{es-XBQsB8_9.js → es-BwLCLXAQ.js} +1 -1
  52. package/dist/_chunks/es-BwLCLXAQ.js.map +1 -0
  53. package/dist/_chunks/{es-9381tih_.mjs → es-DNgOVMjD.mjs} +1 -1
  54. package/dist/_chunks/es-DNgOVMjD.mjs.map +1 -0
  55. package/dist/_chunks/{fr-CMSc77If.mjs → fr-DkgRugiU.mjs} +1 -1
  56. package/dist/_chunks/fr-DkgRugiU.mjs.map +1 -0
  57. package/dist/_chunks/{fr-6cz3U-IF.js → fr-DkhpSjjm.js} +1 -1
  58. package/dist/_chunks/fr-DkhpSjjm.js.map +1 -0
  59. package/dist/_chunks/{id-RJ934rq-.js → id-BTemOeTZ.js} +1 -1
  60. package/dist/_chunks/id-BTemOeTZ.js.map +1 -0
  61. package/dist/_chunks/{id-SDuyIkZa.mjs → id-BdEsvnaF.mjs} +1 -1
  62. package/dist/_chunks/id-BdEsvnaF.mjs.map +1 -0
  63. package/dist/_chunks/{index-duDzoPIj.mjs → index-BOrMKeRw.mjs} +48 -49
  64. package/dist/_chunks/index-BOrMKeRw.mjs.map +1 -0
  65. package/dist/_chunks/{index-5NjYl5zP.js → index-Belq5KbY.js} +256 -274
  66. package/dist/_chunks/index-Belq5KbY.js.map +1 -0
  67. package/dist/_chunks/{index-KON9250R.mjs → index-Bz6iwjmq.mjs} +103 -103
  68. package/dist/_chunks/index-Bz6iwjmq.mjs.map +1 -0
  69. package/dist/_chunks/{index-ocoaOzEA.js → index-CD4fcjMf.js} +106 -106
  70. package/dist/_chunks/index-CD4fcjMf.js.map +1 -0
  71. package/dist/_chunks/index-CNonxjKA.js +281 -0
  72. package/dist/_chunks/index-CNonxjKA.js.map +1 -0
  73. package/dist/_chunks/index-CuNna9c6.mjs +262 -0
  74. package/dist/_chunks/index-CuNna9c6.mjs.map +1 -0
  75. package/dist/_chunks/index-D5NoyXgv.js +366 -0
  76. package/dist/_chunks/index-D5NoyXgv.js.map +1 -0
  77. package/dist/_chunks/{index-0mLL_8vR.js → index-DGJ3FzF4.js} +49 -50
  78. package/dist/_chunks/index-DGJ3FzF4.js.map +1 -0
  79. package/dist/_chunks/{index-IkWThHpX.mjs → index-DThn8eCU.mjs} +240 -256
  80. package/dist/_chunks/index-DThn8eCU.mjs.map +1 -0
  81. package/dist/_chunks/index-Dk2iD2AC.mjs +344 -0
  82. package/dist/_chunks/index-Dk2iD2AC.mjs.map +1 -0
  83. package/dist/_chunks/index-TfyEeDrd-BfJxOAzF.mjs +11845 -0
  84. package/dist/_chunks/index-TfyEeDrd-BfJxOAzF.mjs.map +1 -0
  85. package/dist/_chunks/index-TfyEeDrd-QiBdpWEj.js +11869 -0
  86. package/dist/_chunks/index-TfyEeDrd-QiBdpWEj.js.map +1 -0
  87. package/dist/_chunks/{it-bvH7DgQo.mjs → it-B-rv0E24.mjs} +1 -1
  88. package/dist/_chunks/it-B-rv0E24.mjs.map +1 -0
  89. package/dist/_chunks/{it-YhZOlM2X.js → it-D1rH6V6_.js} +1 -1
  90. package/dist/_chunks/it-D1rH6V6_.js.map +1 -0
  91. package/dist/_chunks/{ja-o_-JPvQv.mjs → ja-C8K-VBPD.mjs} +1 -1
  92. package/dist/_chunks/ja-C8K-VBPD.mjs.map +1 -0
  93. package/dist/_chunks/{ja-xssHUXFv.js → ja-DqShgTMf.js} +1 -1
  94. package/dist/_chunks/ja-DqShgTMf.js.map +1 -0
  95. package/dist/_chunks/{ko-C3mHUSJa.js → ko-B9DGEPWH.js} +1 -1
  96. package/dist/_chunks/ko-B9DGEPWH.js.map +1 -0
  97. package/dist/_chunks/{ko-XJbPSez_.mjs → ko-Busb0wIY.mjs} +1 -1
  98. package/dist/_chunks/ko-Busb0wIY.mjs.map +1 -0
  99. package/dist/_chunks/{ms-II5Ea73J.mjs → ms-ByvsQjRt.mjs} +1 -1
  100. package/dist/_chunks/ms-ByvsQjRt.mjs.map +1 -0
  101. package/dist/_chunks/{ms-d0hfg65Z.js → ms-CPBU3LWf.js} +1 -1
  102. package/dist/_chunks/ms-CPBU3LWf.js.map +1 -0
  103. package/dist/_chunks/{nl-vEy6TN0K.mjs → nl-5qO8Rpcy.mjs} +1 -1
  104. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +1 -0
  105. package/dist/_chunks/{nl-TA7TfK_5.js → nl-CwNB6YoO.js} +1 -1
  106. package/dist/_chunks/nl-CwNB6YoO.js.map +1 -0
  107. package/dist/_chunks/{pl-2VowaFGt.mjs → pl-BdIzifBE.mjs} +1 -1
  108. package/dist/_chunks/pl-BdIzifBE.mjs.map +1 -0
  109. package/dist/_chunks/{pl-0pUL9hdA.js → pl-Do9UD69f.js} +1 -1
  110. package/dist/_chunks/pl-Do9UD69f.js.map +1 -0
  111. package/dist/_chunks/{pt-Rf9W51IO.mjs → pt-BIO24ioG.mjs} +1 -1
  112. package/dist/_chunks/pt-BIO24ioG.mjs.map +1 -0
  113. package/dist/_chunks/{pt-BR-WNOhafR4.js → pt-BR-D7dZhxuP.js} +1 -1
  114. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +1 -0
  115. package/dist/_chunks/{pt-BR-sS1Xp3Jt.mjs → pt-BR-f0p23AQZ.mjs} +1 -1
  116. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +1 -0
  117. package/dist/_chunks/{pt-guNR9Gax.js → pt-fdvyOnUp.js} +1 -1
  118. package/dist/_chunks/pt-fdvyOnUp.js.map +1 -0
  119. package/dist/_chunks/{ru-X3BMXDds.js → ru-C94rjPGA.js} +1 -1
  120. package/dist/_chunks/ru-C94rjPGA.js.map +1 -0
  121. package/dist/_chunks/{ru-qKHnd5or.mjs → ru-VWy-IB7K.mjs} +1 -1
  122. package/dist/_chunks/ru-VWy-IB7K.mjs.map +1 -0
  123. package/dist/_chunks/{sk-NWPw1oTN.js → sk-BABEhykl.js} +1 -1
  124. package/dist/_chunks/sk-BABEhykl.js.map +1 -0
  125. package/dist/_chunks/{sk-_Ryr-eTT.mjs → sk-B_LIcepm.mjs} +1 -1
  126. package/dist/_chunks/sk-B_LIcepm.mjs.map +1 -0
  127. package/dist/_chunks/{sv-BqzScFXS.mjs → sv-ABLKOokl.mjs} +1 -1
  128. package/dist/_chunks/sv-ABLKOokl.mjs.map +1 -0
  129. package/dist/_chunks/{sv-76NnbB__.js → sv-Be43LhA9.js} +1 -1
  130. package/dist/_chunks/sv-Be43LhA9.js.map +1 -0
  131. package/dist/_chunks/{th-WsknMEpq.mjs → th-DKyP7ueR.mjs} +1 -1
  132. package/dist/_chunks/th-DKyP7ueR.mjs.map +1 -0
  133. package/dist/_chunks/{th-cbppX21D.js → th-DgVhVLhL.js} +1 -1
  134. package/dist/_chunks/th-DgVhVLhL.js.map +1 -0
  135. package/dist/_chunks/{tr-6mm_Fmz7.js → tr-B_idhkEs.js} +1 -1
  136. package/dist/_chunks/tr-B_idhkEs.js.map +1 -0
  137. package/dist/_chunks/{tr-_DB1F1GW.mjs → tr-qa1Q5UjC.mjs} +1 -1
  138. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +1 -0
  139. package/dist/_chunks/{uk-yxMSQAwI.mjs → uk-BmRqbeQc.mjs} +1 -1
  140. package/dist/_chunks/uk-BmRqbeQc.mjs.map +1 -0
  141. package/dist/_chunks/{uk-sI2I1ogF.js → uk-LHOivnhP.js} +1 -1
  142. package/dist/_chunks/uk-LHOivnhP.js.map +1 -0
  143. package/dist/_chunks/{vi-A3zJxaiI.js → vi-CdVRdKDw.js} +1 -1
  144. package/dist/_chunks/vi-CdVRdKDw.js.map +1 -0
  145. package/dist/_chunks/{vi-xY0zCW3d.mjs → vi-HW-EdMea.mjs} +1 -1
  146. package/dist/_chunks/vi-HW-EdMea.mjs.map +1 -0
  147. package/dist/_chunks/{zh-OFeldzbX.mjs → zh-5hKkVPA4.mjs} +1 -1
  148. package/dist/_chunks/zh-5hKkVPA4.mjs.map +1 -0
  149. package/dist/_chunks/{zh-72SpmFXa.js → zh-Cuq8gMnF.js} +1 -1
  150. package/dist/_chunks/zh-Cuq8gMnF.js.map +1 -0
  151. package/dist/_chunks/{zh-Hans-E84cu4kP.mjs → zh-Hans-BHilK-yc.mjs} +1 -1
  152. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +1 -0
  153. package/dist/_chunks/{zh-Hans-ArWWtyP4.js → zh-Hans-GQDMKtY4.js} +1 -1
  154. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +1 -0
  155. package/dist/admin/index.js +1 -2
  156. package/dist/admin/index.js.map +1 -1
  157. package/dist/admin/index.mjs +1 -2
  158. package/dist/admin/index.mjs.map +1 -1
  159. package/package.json +26 -27
  160. package/server/bootstrap/index.js +18 -51
  161. package/server/bootstrap/users-permissions-actions.js +6 -0
  162. package/server/config.js +29 -0
  163. package/server/content-types/user/index.js +0 -1
  164. package/server/controllers/auth.js +48 -59
  165. package/server/controllers/content-manager-user.js +28 -30
  166. package/server/controllers/role.js +1 -1
  167. package/server/controllers/user.js +8 -9
  168. package/server/middlewares/rateLimit.js +1 -1
  169. package/server/register.js +1 -1
  170. package/server/services/jwt.js +3 -3
  171. package/server/services/permission.js +3 -7
  172. package/server/services/providers-registry.js +468 -275
  173. package/server/services/providers.js +10 -5
  174. package/server/services/role.js +15 -13
  175. package/server/services/user.js +56 -19
  176. package/server/services/users-permissions.js +15 -13
  177. package/server/utils/index.d.ts +2 -1
  178. package/server/utils/sanitize/sanitizers.js +7 -3
  179. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  180. package/admin/src/pages/Roles/pages/ListPage/utils/api.js +0 -30
  181. package/dist/_chunks/ar-MvD8Ghac.mjs.map +0 -1
  182. package/dist/_chunks/ar-t5qTFaAD.js.map +0 -1
  183. package/dist/_chunks/cs-BMuXwxA1.mjs.map +0 -1
  184. package/dist/_chunks/cs-I8N4u-Sd.js.map +0 -1
  185. package/dist/_chunks/de-YTjtq89K.js.map +0 -1
  186. package/dist/_chunks/de-zs2qqc0W.mjs.map +0 -1
  187. package/dist/_chunks/dk-HctVBMsG.mjs.map +0 -1
  188. package/dist/_chunks/dk-TF-dWjzl.js.map +0 -1
  189. package/dist/_chunks/en-CE3wEy_c.mjs.map +0 -1
  190. package/dist/_chunks/en-m608rMZx.js.map +0 -1
  191. package/dist/_chunks/es-9381tih_.mjs.map +0 -1
  192. package/dist/_chunks/es-XBQsB8_9.js.map +0 -1
  193. package/dist/_chunks/fr-6cz3U-IF.js.map +0 -1
  194. package/dist/_chunks/fr-CMSc77If.mjs.map +0 -1
  195. package/dist/_chunks/id-RJ934rq-.js.map +0 -1
  196. package/dist/_chunks/id-SDuyIkZa.mjs.map +0 -1
  197. package/dist/_chunks/index-0mLL_8vR.js.map +0 -1
  198. package/dist/_chunks/index-5NjYl5zP.js.map +0 -1
  199. package/dist/_chunks/index-IkWThHpX.mjs.map +0 -1
  200. package/dist/_chunks/index-KON9250R.mjs.map +0 -1
  201. package/dist/_chunks/index-Pf0THMXE.js +0 -407
  202. package/dist/_chunks/index-Pf0THMXE.js.map +0 -1
  203. package/dist/_chunks/index-cDoSHOCB.mjs +0 -385
  204. package/dist/_chunks/index-cDoSHOCB.mjs.map +0 -1
  205. package/dist/_chunks/index-duDzoPIj.mjs.map +0 -1
  206. package/dist/_chunks/index-n3_BB2IX.js +0 -320
  207. package/dist/_chunks/index-n3_BB2IX.js.map +0 -1
  208. package/dist/_chunks/index-ocoaOzEA.js.map +0 -1
  209. package/dist/_chunks/index-r2sL6daw.mjs +0 -301
  210. package/dist/_chunks/index-r2sL6daw.mjs.map +0 -1
  211. package/dist/_chunks/it-YhZOlM2X.js.map +0 -1
  212. package/dist/_chunks/it-bvH7DgQo.mjs.map +0 -1
  213. package/dist/_chunks/ja-o_-JPvQv.mjs.map +0 -1
  214. package/dist/_chunks/ja-xssHUXFv.js.map +0 -1
  215. package/dist/_chunks/ko-C3mHUSJa.js.map +0 -1
  216. package/dist/_chunks/ko-XJbPSez_.mjs.map +0 -1
  217. package/dist/_chunks/ms-II5Ea73J.mjs.map +0 -1
  218. package/dist/_chunks/ms-d0hfg65Z.js.map +0 -1
  219. package/dist/_chunks/nl-TA7TfK_5.js.map +0 -1
  220. package/dist/_chunks/nl-vEy6TN0K.mjs.map +0 -1
  221. package/dist/_chunks/pl-0pUL9hdA.js.map +0 -1
  222. package/dist/_chunks/pl-2VowaFGt.mjs.map +0 -1
  223. package/dist/_chunks/pt-BR-WNOhafR4.js.map +0 -1
  224. package/dist/_chunks/pt-BR-sS1Xp3Jt.mjs.map +0 -1
  225. package/dist/_chunks/pt-Rf9W51IO.mjs.map +0 -1
  226. package/dist/_chunks/pt-guNR9Gax.js.map +0 -1
  227. package/dist/_chunks/ru-X3BMXDds.js.map +0 -1
  228. package/dist/_chunks/ru-qKHnd5or.mjs.map +0 -1
  229. package/dist/_chunks/sk-NWPw1oTN.js.map +0 -1
  230. package/dist/_chunks/sk-_Ryr-eTT.mjs.map +0 -1
  231. package/dist/_chunks/sv-76NnbB__.js.map +0 -1
  232. package/dist/_chunks/sv-BqzScFXS.mjs.map +0 -1
  233. package/dist/_chunks/th-WsknMEpq.mjs.map +0 -1
  234. package/dist/_chunks/th-cbppX21D.js.map +0 -1
  235. package/dist/_chunks/tr-6mm_Fmz7.js.map +0 -1
  236. package/dist/_chunks/tr-_DB1F1GW.mjs.map +0 -1
  237. package/dist/_chunks/uk-sI2I1ogF.js.map +0 -1
  238. package/dist/_chunks/uk-yxMSQAwI.mjs.map +0 -1
  239. package/dist/_chunks/vi-A3zJxaiI.js.map +0 -1
  240. package/dist/_chunks/vi-xY0zCW3d.mjs.map +0 -1
  241. package/dist/_chunks/zh-72SpmFXa.js.map +0 -1
  242. package/dist/_chunks/zh-Hans-ArWWtyP4.js.map +0 -1
  243. package/dist/_chunks/zh-Hans-E84cu4kP.mjs.map +0 -1
  244. package/dist/_chunks/zh-OFeldzbX.mjs.map +0 -1
  245. package/server/bootstrap/grant-config.js +0 -140
  246. package/strapi-server.js +0 -3
@@ -1,33 +1,28 @@
1
1
  import * as React from 'react';
2
2
 
3
3
  import {
4
- ContentLayout,
5
- HeaderLayout,
6
4
  Main,
7
5
  Button,
8
6
  Flex,
9
7
  TextInput,
10
8
  Textarea,
11
9
  Typography,
12
- GridItem,
13
10
  Grid,
11
+ Field,
14
12
  } from '@strapi/design-system';
13
+ import { Check } from '@strapi/icons';
15
14
  import {
16
- CheckPagePermissions,
17
- useOverlayBlocker,
18
- SettingsPageTitle,
19
- LoadingIndicatorPage,
20
- Form,
15
+ Page,
16
+ BackButton,
21
17
  useAPIErrorHandler,
22
- useFetchClient,
23
18
  useNotification,
24
- Link,
25
- } from '@strapi/helper-plugin';
26
- import { ArrowLeft, Check } from '@strapi/icons';
27
- import { Formik } from 'formik';
19
+ useFetchClient,
20
+ Layouts,
21
+ } from '@strapi/strapi/admin';
22
+ import { Formik, Form } from 'formik';
28
23
  import { useIntl } from 'react-intl';
29
24
  import { useQuery, useMutation } from 'react-query';
30
- import { useRouteMatch } from 'react-router-dom';
25
+ import { useMatch } from 'react-router-dom';
31
26
 
32
27
  import UsersPermissions from '../../../components/UsersPermissions';
33
28
  import { PERMISSIONS } from '../../../constants';
@@ -37,11 +32,10 @@ import { usePlugins } from '../hooks/usePlugins';
37
32
 
38
33
  export const EditPage = () => {
39
34
  const { formatMessage } = useIntl();
40
- const toggleNotification = useNotification();
41
- const { lockApp, unlockApp } = useOverlayBlocker();
35
+ const { toggleNotification } = useNotification();
42
36
  const {
43
37
  params: { id },
44
- } = useRouteMatch(`/settings/users-permissions/roles/:id`);
38
+ } = useMatch(`/settings/users-permissions/roles/:id`);
45
39
  const { get } = useFetchClient();
46
40
  const { isLoading: isLoadingPlugins, routes } = usePlugins();
47
41
  const {
@@ -63,7 +57,7 @@ export const EditPage = () => {
63
57
  const mutation = useMutation((body) => put(`/users-permissions/roles/${id}`, body), {
64
58
  onError(error) {
65
59
  toggleNotification({
66
- type: 'warning',
60
+ type: 'danger',
67
61
  message: formatAPIError(error),
68
62
  });
69
63
  },
@@ -71,10 +65,10 @@ export const EditPage = () => {
71
65
  async onSuccess() {
72
66
  toggleNotification({
73
67
  type: 'success',
74
- message: {
68
+ message: formatMessage({
75
69
  id: getTrad('Settings.roles.created'),
76
70
  defaultMessage: 'Role edited',
77
- },
71
+ }),
78
72
  });
79
73
 
80
74
  await refetchRole();
@@ -82,24 +76,23 @@ export const EditPage = () => {
82
76
  });
83
77
 
84
78
  const handleEditRoleSubmit = async (data) => {
85
- // Set loading state
86
- lockApp();
87
-
88
79
  const permissions = permissionsRef.current.getPermissions();
89
80
 
90
81
  await mutation.mutate({ ...data, ...permissions, users: [] });
91
-
92
- unlockApp();
93
82
  };
94
83
 
95
84
  if (isLoadingRole) {
96
- return <LoadingIndicatorPage />;
85
+ return <Page.Loading />;
97
86
  }
98
87
 
99
88
  return (
100
89
  <Main>
101
- {/* TODO: this needs to be translated */}
102
- <SettingsPageTitle name="Roles" />
90
+ <Page.Title>
91
+ {formatMessage(
92
+ { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },
93
+ { name: 'Roles' }
94
+ )}
95
+ </Page.Title>
103
96
  <Formik
104
97
  enableReinitialize
105
98
  initialValues={{ name: role.name, description: role.description }}
@@ -108,9 +101,9 @@ export const EditPage = () => {
108
101
  >
109
102
  {({ handleSubmit, values, handleChange, errors }) => (
110
103
  <Form noValidate onSubmit={handleSubmit}>
111
- <HeaderLayout
104
+ <Layouts.Header
112
105
  primaryAction={
113
- !isLoadingPlugins && (
106
+ !isLoadingPlugins ? (
114
107
  <Button
115
108
  disabled={role.code === 'strapi-super-admin'}
116
109
  type="submit"
@@ -122,20 +115,13 @@ export const EditPage = () => {
122
115
  defaultMessage: 'Save',
123
116
  })}
124
117
  </Button>
125
- )
118
+ ) : null
126
119
  }
127
120
  title={role.name}
128
121
  subtitle={role.description}
129
- navigationAction={
130
- <Link startIcon={<ArrowLeft />} to="/settings/users-permissions/roles">
131
- {formatMessage({
132
- id: 'global.back',
133
- defaultMessage: 'Back',
134
- })}
135
- </Link>
136
- }
122
+ navigationAction={<BackButton />}
137
123
  />
138
- <ContentLayout>
124
+ <Layouts.Content>
139
125
  <Flex
140
126
  background="neutral0"
141
127
  direction="column"
@@ -149,40 +135,40 @@ export const EditPage = () => {
149
135
  shadow="filterShadow"
150
136
  >
151
137
  <Flex direction="column" alignItems="stretch" gap={4}>
152
- <Typography variant="delta" as="h2">
138
+ <Typography variant="delta" tag="h2">
153
139
  {formatMessage({
154
140
  id: getTrad('EditPage.form.roles'),
155
141
  defaultMessage: 'Role details',
156
142
  })}
157
143
  </Typography>
158
144
 
159
- <Grid gap={4}>
160
- <GridItem col={6}>
161
- <TextInput
145
+ <Grid.Root gap={4}>
146
+ <Grid.Item col={6} direction="column" alignItems="stretch">
147
+ <Field.Root
162
148
  name="name"
163
- value={values.name || ''}
164
- onChange={handleChange}
165
- label={formatMessage({
166
- id: 'global.name',
167
- defaultMessage: 'Name',
168
- })}
169
149
  error={
170
150
  errors?.name
171
- ? formatMessage({ id: errors.name, defaultMessage: 'Name is required' })
151
+ ? formatMessage({
152
+ id: errors.name,
153
+ defaultMessage: 'Name is required',
154
+ })
172
155
  : false
173
156
  }
174
157
  required
175
- />
176
- </GridItem>
177
- <GridItem col={6}>
178
- <Textarea
179
- id="description"
180
- value={values.description || ''}
181
- onChange={handleChange}
182
- label={formatMessage({
183
- id: 'global.description',
184
- defaultMessage: 'Description',
185
- })}
158
+ >
159
+ <Field.Label>
160
+ {formatMessage({
161
+ id: 'global.name',
162
+ defaultMessage: 'Name',
163
+ })}
164
+ </Field.Label>
165
+ <TextInput value={values.name || ''} onChange={handleChange} />
166
+ <Field.Error />
167
+ </Field.Root>
168
+ </Grid.Item>
169
+ <Grid.Item col={6} direction="column" alignItems="stretch">
170
+ <Field.Root
171
+ name="description"
186
172
  error={
187
173
  errors?.description
188
174
  ? formatMessage({
@@ -192,9 +178,18 @@ export const EditPage = () => {
192
178
  : false
193
179
  }
194
180
  required
195
- />
196
- </GridItem>
197
- </Grid>
181
+ >
182
+ <Field.Label>
183
+ {formatMessage({
184
+ id: 'global.description',
185
+ defaultMessage: 'Description',
186
+ })}
187
+ </Field.Label>
188
+ <Textarea value={values.description || ''} onChange={handleChange} />
189
+ <Field.Error />
190
+ </Field.Root>
191
+ </Grid.Item>
192
+ </Grid.Root>
198
193
  </Flex>
199
194
 
200
195
  {!isLoadingPlugins && (
@@ -205,7 +200,7 @@ export const EditPage = () => {
205
200
  />
206
201
  )}
207
202
  </Flex>
208
- </ContentLayout>
203
+ </Layouts.Content>
209
204
  </Form>
210
205
  )}
211
206
  </Formik>
@@ -214,7 +209,7 @@ export const EditPage = () => {
214
209
  };
215
210
 
216
211
  export const ProtectedRolesEditPage = () => (
217
- <CheckPagePermissions permissions={PERMISSIONS.updateRole}>
212
+ <Page.Protect permissions={PERMISSIONS.updateRole}>
218
213
  <EditPage />
219
- </CheckPagePermissions>
214
+ </Page.Protect>
220
215
  );
@@ -1,24 +1,23 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { Flex, IconButton, Link, Tbody, Td, Tr, Typography } from '@strapi/design-system';
4
- import { CheckPermissions, onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin';
5
4
  import { Pencil, Trash } from '@strapi/icons';
6
5
  import PropTypes from 'prop-types';
7
6
  import { useIntl } from 'react-intl';
8
- import { useHistory } from 'react-router-dom';
9
- import styled from 'styled-components';
7
+ import { useNavigate, NavLink } from 'react-router-dom';
8
+ import { styled } from 'styled-components';
10
9
 
11
10
  const EditLink = styled(Link)`
12
11
  align-items: center;
13
- height: ${pxToRem(32)};
12
+ height: 3.2rem;
13
+ width: 3.2rem;
14
14
  display: flex;
15
15
  justify-content: center;
16
- padding: ${({ theme }) => `${theme.spaces[2]}}`};
17
- width: ${pxToRem(32)};
16
+ padding: ${({ theme }) => `${theme.spaces[2]}`};
18
17
 
19
18
  svg {
20
- height: ${pxToRem(12)};
21
- width: ${pxToRem(12)};
19
+ height: 1.6rem;
20
+ width: 1.6rem;
22
21
 
23
22
  path {
24
23
  fill: ${({ theme }) => theme.colors.neutral500};
@@ -35,9 +34,9 @@ const EditLink = styled(Link)`
35
34
  }
36
35
  `;
37
36
 
38
- const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {
37
+ const TableBody = ({ sortedRoles, canDelete, canUpdate, setRoleToDelete, onDelete }) => {
39
38
  const { formatMessage } = useIntl();
40
- const { push } = useHistory();
39
+ const navigate = useNavigate();
41
40
  const [showConfirmDelete, setShowConfirmDelete] = onDelete;
42
41
 
43
42
  const checkCanDeleteRole = (role) =>
@@ -48,14 +47,10 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
48
47
  setShowConfirmDelete(!showConfirmDelete);
49
48
  };
50
49
 
51
- const handleClickEdit = (id) => {
52
- push(`/settings/users-permissions/roles/${id}`);
53
- };
54
-
55
50
  return (
56
51
  <Tbody>
57
52
  {sortedRoles?.map((role) => (
58
- <Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>
53
+ <Tr key={role.name} onClick={() => navigate(role.id.toString())}>
59
54
  <Td width="20%">
60
55
  <Typography>{role.name}</Typography>
61
56
  </Td>
@@ -74,10 +69,11 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
74
69
  </Typography>
75
70
  </Td>
76
71
  <Td>
77
- <Flex justifyContent="end" {...stopPropagation}>
78
- <CheckPermissions permissions={permissions.updateRole}>
72
+ <Flex justifyContent="end" onClick={(e) => e.stopPropagation()}>
73
+ {canUpdate ? (
79
74
  <EditLink
80
- to={`/settings/users-permissions/roles/${role.id}`}
75
+ tag={NavLink}
76
+ to={role.id.toString()}
81
77
  aria-label={formatMessage(
82
78
  { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },
83
79
  { target: `${role.name}` }
@@ -85,20 +81,19 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
85
81
  >
86
82
  <Pencil />
87
83
  </EditLink>
88
- </CheckPermissions>
84
+ ) : null}
89
85
 
90
86
  {checkCanDeleteRole(role) && (
91
- <CheckPermissions permissions={permissions.deleteRole}>
92
- <IconButton
93
- onClick={() => handleClickDelete(role.id)}
94
- noBorder
95
- icon={<Trash />}
96
- label={formatMessage(
97
- { id: 'global.delete-target', defaultMessage: 'Delete {target}' },
98
- { target: `${role.name}` }
99
- )}
100
- />
101
- </CheckPermissions>
87
+ <IconButton
88
+ onClick={() => handleClickDelete(role.id.toString())}
89
+ variant="ghost"
90
+ label={formatMessage(
91
+ { id: 'global.delete-target', defaultMessage: 'Delete {target}' },
92
+ { target: `${role.name}` }
93
+ )}
94
+ >
95
+ <Trash />
96
+ </IconButton>
102
97
  )}
103
98
  </Flex>
104
99
  </Td>
@@ -112,12 +107,13 @@ export default TableBody;
112
107
 
113
108
  TableBody.defaultProps = {
114
109
  canDelete: false,
110
+ canUpdate: false,
115
111
  };
116
112
 
117
113
  TableBody.propTypes = {
118
114
  onDelete: PropTypes.array.isRequired,
119
- permissions: PropTypes.object.isRequired,
120
115
  setRoleToDelete: PropTypes.func.isRequired,
121
116
  sortedRoles: PropTypes.array.isRequired,
122
117
  canDelete: PropTypes.bool,
118
+ canUpdate: PropTypes.bool,
123
119
  };
@@ -1,11 +1,6 @@
1
1
  import React, { useState } from 'react';
2
2
 
3
3
  import {
4
- ActionLayout,
5
- ContentLayout,
6
- HeaderLayout,
7
- Layout,
8
- Main,
9
4
  Table,
10
5
  Th,
11
6
  Thead,
@@ -13,50 +8,48 @@ import {
13
8
  Typography,
14
9
  useNotifyAT,
15
10
  VisuallyHidden,
16
- } from '@strapi/design-system';
17
- import {
18
- CheckPagePermissions,
19
- CheckPermissions,
20
- ConfirmDialog,
21
11
  EmptyStateLayout,
22
- LinkButton,
23
- LoadingIndicatorPage,
24
- NoPermissions,
25
- SearchURLQuery,
26
- SettingsPageTitle,
27
12
  useCollator,
28
13
  useFilter,
29
- useFocusWhenNavigate,
14
+ LinkButton,
15
+ Dialog,
16
+ } from '@strapi/design-system';
17
+ import { Plus } from '@strapi/icons';
18
+ import {
19
+ ConfirmDialog,
20
+ useTracking,
21
+ Page,
22
+ SearchInput,
23
+ BackButton,
30
24
  useNotification,
31
25
  useQueryParams,
26
+ useFetchClient,
32
27
  useRBAC,
33
- useTracking,
34
- } from '@strapi/helper-plugin';
35
- import { Plus } from '@strapi/icons';
28
+ Layouts,
29
+ } from '@strapi/strapi/admin';
36
30
  import { useIntl } from 'react-intl';
37
31
  import { useMutation, useQuery } from 'react-query';
32
+ import { NavLink } from 'react-router-dom';
38
33
 
39
34
  import { PERMISSIONS } from '../../../../constants';
40
35
  import { getTrad } from '../../../../utils';
41
36
 
42
37
  import TableBody from './components/TableBody';
43
- import { deleteData, fetchData } from './utils/api';
44
38
 
45
39
  export const RolesListPage = () => {
46
40
  const { trackUsage } = useTracking();
47
41
  const { formatMessage, locale } = useIntl();
48
- const toggleNotification = useNotification();
42
+ const { toggleNotification } = useNotification();
49
43
  const { notifyStatus } = useNotifyAT();
50
44
  const [{ query }] = useQueryParams();
51
45
  const _q = query?._q || '';
52
46
  const [showConfirmDelete, setShowConfirmDelete] = useState(false);
53
- const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
54
47
  const [roleToDelete, setRoleToDelete] = useState();
55
- useFocusWhenNavigate();
48
+ const { del, get } = useFetchClient();
56
49
 
57
50
  const {
58
51
  isLoading: isLoadingForPermissions,
59
- allowedActions: { canRead, canDelete },
52
+ allowedActions: { canRead, canDelete, canCreate, canUpdate },
60
53
  } = useRBAC({
61
54
  create: PERMISSIONS.createRole,
62
55
  read: PERMISSIONS.readRoles,
@@ -69,12 +62,12 @@ export const RolesListPage = () => {
69
62
  data: { roles },
70
63
  isFetching,
71
64
  refetch,
72
- } = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), {
65
+ } = useQuery('get-roles', () => fetchData(toggleNotification, formatMessage, notifyStatus), {
73
66
  initialData: {},
74
67
  enabled: canRead,
75
68
  });
76
69
 
77
- const { includes } = useFilter(locale, {
70
+ const { contains } = useFilter(locale, {
78
71
  sensitivity: 'base',
79
72
  });
80
73
 
@@ -85,12 +78,39 @@ export const RolesListPage = () => {
85
78
  sensitivity: 'base',
86
79
  });
87
80
 
88
- const isLoading = isLoadingForData || isFetching;
81
+ const isLoading = isLoadingForData || isFetching || isLoadingForPermissions;
89
82
 
90
83
  const handleShowConfirmDelete = () => {
91
84
  setShowConfirmDelete(!showConfirmDelete);
92
85
  };
93
86
 
87
+ const deleteData = async (id, formatMessage, toggleNotification) => {
88
+ try {
89
+ await del(`/users-permissions/roles/${id}`);
90
+ } catch (error) {
91
+ toggleNotification({
92
+ type: 'danger',
93
+ message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occured' }),
94
+ });
95
+ }
96
+ };
97
+
98
+ const fetchData = async (toggleNotification, formatMessage, notifyStatus) => {
99
+ try {
100
+ const { data } = await get('/users-permissions/roles');
101
+ notifyStatus('The roles have loaded successfully');
102
+
103
+ return data;
104
+ } catch (err) {
105
+ toggleNotification({
106
+ type: 'danger',
107
+ message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),
108
+ });
109
+
110
+ throw new Error(err);
111
+ }
112
+ };
113
+
94
114
  const emptyLayout = {
95
115
  roles: {
96
116
  id: getTrad('Roles.empty'),
@@ -107,21 +127,19 @@ export const RolesListPage = () => {
107
127
  defaultMessage: 'Roles',
108
128
  });
109
129
 
110
- const deleteMutation = useMutation((id) => deleteData(id, toggleNotification), {
130
+ const deleteMutation = useMutation((id) => deleteData(id, formatMessage, toggleNotification), {
111
131
  async onSuccess() {
112
132
  await refetch();
113
133
  },
114
134
  });
115
135
 
116
136
  const handleConfirmDelete = async () => {
117
- setIsConfirmButtonLoading(true);
118
137
  await deleteMutation.mutateAsync(roleToDelete);
119
138
  setShowConfirmDelete(!showConfirmDelete);
120
- setIsConfirmButtonLoading(false);
121
139
  };
122
140
 
123
141
  const sortedRoles = (roles || [])
124
- .filter((role) => includes(role.name, _q) || includes(role.description, _q))
142
+ .filter((role) => contains(role.name, _q) || contains(role.description, _q))
125
143
  .sort(
126
144
  (a, b) => formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description)
127
145
  );
@@ -131,11 +149,20 @@ export const RolesListPage = () => {
131
149
  const colCount = 4;
132
150
  const rowCount = (roles?.length || 0) + 1;
133
151
 
152
+ if (isLoading) {
153
+ return <Page.Loading />;
154
+ }
155
+
134
156
  return (
135
- <Layout>
136
- <SettingsPageTitle name={pageTitle} />
137
- <Main aria-busy={isLoading}>
138
- <HeaderLayout
157
+ <Layouts.Root>
158
+ <Page.Title>
159
+ {formatMessage(
160
+ { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },
161
+ { name: pageTitle }
162
+ )}
163
+ </Page.Title>
164
+ <Page.Main>
165
+ <Layouts.Header
139
166
  title={formatMessage({
140
167
  id: 'global.roles',
141
168
  defaultMessage: 'Roles',
@@ -145,9 +172,10 @@ export const RolesListPage = () => {
145
172
  defaultMessage: 'List of roles',
146
173
  })}
147
174
  primaryAction={
148
- <CheckPermissions permissions={PERMISSIONS.createRole}>
175
+ canCreate ? (
149
176
  <LinkButton
150
- to="/settings/users-permissions/roles/new"
177
+ to="new"
178
+ tag={NavLink}
151
179
  onClick={() => trackUsage('willCreateRole')}
152
180
  startIcon={<Plus />}
153
181
  size="S"
@@ -157,13 +185,14 @@ export const RolesListPage = () => {
157
185
  defaultMessage: 'Add new role',
158
186
  })}
159
187
  </LinkButton>
160
- </CheckPermissions>
188
+ ) : null
161
189
  }
190
+ navigationAction={<BackButton />}
162
191
  />
163
192
 
164
- <ActionLayout
193
+ <Layouts.Action
165
194
  startActions={
166
- <SearchURLQuery
195
+ <SearchInput
167
196
  label={formatMessage({
168
197
  id: 'app.component.search.label',
169
198
  defaultMessage: 'Search',
@@ -172,9 +201,8 @@ export const RolesListPage = () => {
172
201
  }
173
202
  />
174
203
 
175
- <ContentLayout>
176
- {!canRead && <NoPermissions />}
177
- {(isLoading || isLoadingForPermissions) && <LoadingIndicatorPage />}
204
+ <Layouts.Content>
205
+ {!canRead && <Page.NoPermissions />}
178
206
  {canRead && sortedRoles && sortedRoles?.length ? (
179
207
  <Table colCount={colCount} rowCount={rowCount}>
180
208
  <Thead>
@@ -213,30 +241,28 @@ export const RolesListPage = () => {
213
241
  <TableBody
214
242
  sortedRoles={sortedRoles}
215
243
  canDelete={canDelete}
244
+ canUpdate={canUpdate}
216
245
  permissions={PERMISSIONS}
217
246
  setRoleToDelete={setRoleToDelete}
218
247
  onDelete={[showConfirmDelete, setShowConfirmDelete]}
219
248
  />
220
249
  </Table>
221
250
  ) : (
222
- <EmptyStateLayout content={emptyLayout[emptyContent]} />
251
+ <EmptyStateLayout content={formatMessage(emptyLayout[emptyContent])} />
223
252
  )}
224
- </ContentLayout>
225
- <ConfirmDialog
226
- isConfirmButtonLoading={isConfirmButtonLoading}
227
- onConfirm={handleConfirmDelete}
228
- onToggleDialog={handleShowConfirmDelete}
229
- isOpen={showConfirmDelete}
230
- />
231
- </Main>
232
- </Layout>
253
+ </Layouts.Content>
254
+ <Dialog.Root open={showConfirmDelete} onOpenChange={handleShowConfirmDelete}>
255
+ <ConfirmDialog onConfirm={handleConfirmDelete} />
256
+ </Dialog.Root>
257
+ </Page.Main>
258
+ </Layouts.Root>
233
259
  );
234
260
  };
235
261
 
236
262
  export const ProtectedRolesListPage = () => {
237
263
  return (
238
- <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>
264
+ <Page.Protect permissions={PERMISSIONS.accessRoles}>
239
265
  <RolesListPage />
240
- </CheckPagePermissions>
266
+ </Page.Protect>
241
267
  );
242
268
  };
@@ -60,7 +60,7 @@
60
60
  "Settings.roles.deleted": "Role deleted",
61
61
  "Settings.roles.edited": "Role edited",
62
62
  "Settings.section-label": "Users & Permissions plugin",
63
- "components.Input.error.validation.email": "This is an invalid email",
63
+ "components.Input.error.validation.email": "This is not a valid email",
64
64
  "components.Input.error.validation.json": "This doesn't match the JSON format",
65
65
  "components.Input.error.validation.max": "The value is too high.",
66
66
  "components.Input.error.validation.maxLength": "The value is too long.",
@@ -0,0 +1,13 @@
1
+ const prefixPluginTranslations = (trad, pluginId) => {
2
+ if (!pluginId) {
3
+ throw new TypeError("pluginId can't be empty");
4
+ }
5
+
6
+ return Object.keys(trad).reduce((acc, current) => {
7
+ acc[`${pluginId}.${current}`] = trad[current];
8
+
9
+ return acc;
10
+ }, {});
11
+ };
12
+
13
+ export { prefixPluginTranslations };
@@ -41,4 +41,4 @@ const ar = {
41
41
  "plugin.name": "الأدوار والصلاحية"
42
42
  };
43
43
  exports.default = ar;
44
- //# sourceMappingURL=ar-t5qTFaAD.js.map
44
+ //# sourceMappingURL=ar-BguGUqwK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-BguGUqwK.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -41,4 +41,4 @@ const ar = {
41
41
  export {
42
42
  ar as default
43
43
  };
44
- //# sourceMappingURL=ar-MvD8Ghac.mjs.map
44
+ //# sourceMappingURL=ar-CK8BRRXB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-CK8BRRXB.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}