@strapi/plugin-users-permissions 0.0.0-next.f4ff842a3cb7b83db540bee67554b704e042b042 → 0.0.0-next.f5312617ca16b870c2bf1adcea2c69b676979e29

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 +23 -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 +79 -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-rL_BoFHz.js → index-BH6NqE8I.js} +47 -51
  64. package/dist/_chunks/index-BH6NqE8I.js.map +1 -0
  65. package/dist/_chunks/index-C3i__jX-.js +281 -0
  66. package/dist/_chunks/index-C3i__jX-.js.map +1 -0
  67. package/dist/_chunks/{index--ch5E4_K.js → index-CFzpNgIL.js} +108 -106
  68. package/dist/_chunks/index-CFzpNgIL.js.map +1 -0
  69. package/dist/_chunks/index-CJUWqtrZ.mjs +344 -0
  70. package/dist/_chunks/index-CJUWqtrZ.mjs.map +1 -0
  71. package/dist/_chunks/index-CcWTKtCY.js +366 -0
  72. package/dist/_chunks/index-CcWTKtCY.js.map +1 -0
  73. package/dist/_chunks/{index-MuQRbm-o.mjs → index-CnX2wiLY.mjs} +239 -256
  74. package/dist/_chunks/index-CnX2wiLY.mjs.map +1 -0
  75. package/dist/_chunks/index-DUWx-KG9-C1E7ADbJ.mjs +11984 -0
  76. package/dist/_chunks/index-DUWx-KG9-C1E7ADbJ.mjs.map +1 -0
  77. package/dist/_chunks/index-DUWx-KG9-fMZ4nmrb.js +12008 -0
  78. package/dist/_chunks/index-DUWx-KG9-fMZ4nmrb.js.map +1 -0
  79. package/dist/_chunks/{index-WCv8yGzw.js → index-DruWuFWL.js} +255 -274
  80. package/dist/_chunks/index-DruWuFWL.js.map +1 -0
  81. package/dist/_chunks/index-PJoz36kJ.mjs +262 -0
  82. package/dist/_chunks/index-PJoz36kJ.mjs.map +1 -0
  83. package/dist/_chunks/{index-iu-7wU8h.mjs → index-R4R0dEOv.mjs} +46 -50
  84. package/dist/_chunks/index-R4R0dEOv.mjs.map +1 -0
  85. package/dist/_chunks/{index-eE2qjbfg.mjs → index-XOcQhJMB.mjs} +105 -103
  86. package/dist/_chunks/index-XOcQhJMB.mjs.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 +27 -28
  160. package/server/bootstrap/index.js +18 -51
  161. package/server/bootstrap/users-permissions-actions.js +6 -0
  162. package/server/content-types/user/index.js +0 -1
  163. package/server/controllers/auth.js +40 -59
  164. package/server/controllers/content-manager-user.js +28 -30
  165. package/server/controllers/role.js +17 -4
  166. package/server/controllers/user.js +8 -9
  167. package/server/controllers/validation/auth.js +81 -25
  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--ch5E4_K.js.map +0 -1
  198. package/dist/_chunks/index-MuQRbm-o.mjs.map +0 -1
  199. package/dist/_chunks/index-UrkRT2rC.js +0 -320
  200. package/dist/_chunks/index-UrkRT2rC.js.map +0 -1
  201. package/dist/_chunks/index-WCv8yGzw.js.map +0 -1
  202. package/dist/_chunks/index-eE2qjbfg.mjs.map +0 -1
  203. package/dist/_chunks/index-iu-7wU8h.mjs.map +0 -1
  204. package/dist/_chunks/index-mCVPA90k.mjs +0 -385
  205. package/dist/_chunks/index-mCVPA90k.mjs.map +0 -1
  206. package/dist/_chunks/index-mNv7pSw-.js +0 -407
  207. package/dist/_chunks/index-mNv7pSw-.js.map +0 -1
  208. package/dist/_chunks/index-rL_BoFHz.js.map +0 -1
  209. package/dist/_chunks/index-xXp5S4OL.mjs +0 -301
  210. package/dist/_chunks/index-xXp5S4OL.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,20 +1,20 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { createContext, useContext, useMemo, useCallback, useReducer, forwardRef, useImperativeHandle, memo, useEffect, useState } from "react";
4
- import { translatedErrors, useNotification, useFetchClient, useAPIErrorHandler, CheckPagePermissions, useOverlayBlocker, useTracking, SettingsPageTitle, Form, LoadingIndicatorPage, Link, pxToRem, onRowClick, stopPropagation, CheckPermissions, getFetchClient, useQueryParams, useFocusWhenNavigate, useRBAC, useFilter, useCollator, LinkButton, SearchURLQuery, NoPermissions, EmptyStateLayout, ConfirmDialog, AnErrorOccurred } from "@strapi/helper-plugin";
5
- import { useHistory, useRouteMatch, Switch, Route } from "react-router-dom";
6
- import { g as getTrad, P as PERMISSIONS } from "./index-iu-7wU8h.mjs";
7
- import { Box, Flex, Typography, Checkbox, Grid, GridItem, VisuallyHidden, Accordion, AccordionToggle, AccordionContent, Main, HeaderLayout, Button, ContentLayout, TextInput, Textarea, Link as Link$1, Tbody, Tr, Td, IconButton, useNotifyAT, Layout, ActionLayout, Table, Thead, Th } from "@strapi/design-system";
8
- import { Cog, Check, ArrowLeft, Pencil, Trash, Plus } from "@strapi/icons";
9
- import { Formik } from "formik";
4
+ import { translatedErrors, useNotification, useFetchClient, useAPIErrorHandler, Page, useTracking, Layouts, BackButton, useQueryParams, useRBAC, SearchInput, ConfirmDialog } from "@strapi/strapi/admin";
5
+ import { useNavigate, useMatch, NavLink, Routes, Route } from "react-router-dom";
6
+ import { g as getTrad, P as PERMISSIONS } from "./index-R4R0dEOv.mjs";
7
+ import { Box, Flex, Typography, Checkbox, Grid, VisuallyHidden, Accordion, Main, Button, Field, TextInput, Textarea, Link, Tbody, Tr, Td, IconButton, useNotifyAT, useFilter, useCollator, LinkButton, Table, Thead, Th, EmptyStateLayout, Dialog } from "@strapi/design-system";
8
+ import { Cog, Check, Pencil, Trash, Plus } from "@strapi/icons";
9
+ import { Formik, Form } from "formik";
10
10
  import { useIntl } from "react-intl";
11
11
  import { useQueries, useMutation, useQuery } from "react-query";
12
12
  import PropTypes from "prop-types";
13
13
  import upperFirst from "lodash/upperFirst";
14
14
  import sortBy from "lodash/sortBy";
15
15
  import get from "lodash/get";
16
- import styled, { css } from "styled-components";
17
- import produce from "immer";
16
+ import { css, styled } from "styled-components";
17
+ import { produce } from "immer";
18
18
  import isEmpty from "lodash/isEmpty";
19
19
  import without from "lodash/without";
20
20
  import map from "lodash/map";
@@ -59,7 +59,8 @@ const init$1 = (initialState2, permissions) => {
59
59
  };
60
60
  const activeCheckboxWrapperStyles = css`
61
61
  background: ${(props) => props.theme.colors.primary100};
62
- svg {
62
+
63
+ #cog {
63
64
  opacity: 1;
64
65
  }
65
66
  `;
@@ -68,7 +69,7 @@ const CheckboxWrapper = styled(Box)`
68
69
  justify-content: space-between;
69
70
  align-items: center;
70
71
 
71
- svg {
72
+ #cog {
72
73
  opacity: 0;
73
74
  path {
74
75
  fill: ${(props) => props.theme.colors.primary600};
@@ -118,22 +119,21 @@ const SubCategory = ({ subCategory }) => {
118
119
  Checkbox,
119
120
  {
120
121
  name: subCategory.name,
121
- value: hasAllActionsSelected,
122
- onValueChange: (value) => handleChangeSelectAll({ target: { name: subCategory.name, value } }),
123
- indeterminate: hasSomeActionsSelected,
122
+ checked: hasSomeActionsSelected ? "indeterminate" : hasAllActionsSelected,
123
+ onCheckedChange: (value) => handleChangeSelectAll({ target: { name: subCategory.name, value } }),
124
124
  children: formatMessage({ id: "app.utils.select-all", defaultMessage: "Select all" })
125
125
  }
126
126
  ) })
127
127
  ] }),
128
- /* @__PURE__ */ jsx(Flex, { paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsx(Grid, { gap: 2, style: { flex: 1 }, children: subCategory.actions.map((action) => {
128
+ /* @__PURE__ */ jsx(Flex, { paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsx(Grid.Root, { gap: 2, style: { flex: 1 }, children: subCategory.actions.map((action) => {
129
129
  const name = `${action.name}.enabled`;
130
- return /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsxs(CheckboxWrapper, { isActive: isActionSelected(action.name), padding: 2, hasRadius: true, children: [
130
+ return /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxs(CheckboxWrapper, { isActive: isActionSelected(action.name), padding: 2, hasRadius: true, children: [
131
131
  /* @__PURE__ */ jsx(
132
132
  Checkbox,
133
133
  {
134
- value: get(modifiedData, name, false),
134
+ checked: get(modifiedData, name, false),
135
135
  name,
136
- onValueChange: (value) => onChange({ target: { name, value } }),
136
+ onCheckedChange: (value) => onChange({ target: { name, value } }),
137
137
  children: action.label
138
138
  }
139
139
  ),
@@ -144,7 +144,7 @@ const SubCategory = ({ subCategory }) => {
144
144
  onClick: () => onSelectedAction(action.name),
145
145
  style: { display: "inline-flex", alignItems: "center" },
146
146
  children: [
147
- /* @__PURE__ */ jsx(VisuallyHidden, { as: "span", children: formatMessage(
147
+ /* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: formatMessage(
148
148
  {
149
149
  id: "app.utils.show-bound-route",
150
150
  defaultMessage: "Show bound route for {route}"
@@ -153,7 +153,7 @@ const SubCategory = ({ subCategory }) => {
153
153
  route: action.name
154
154
  }
155
155
  ) }),
156
- /* @__PURE__ */ jsx(Cog, {})
156
+ /* @__PURE__ */ jsx(Cog, { id: "cog" })
157
157
  ]
158
158
  }
159
159
  )
@@ -224,41 +224,24 @@ const reducer$1 = (state, action) => (
224
224
  const Permissions = () => {
225
225
  const { modifiedData } = useUsersPermissions();
226
226
  const { formatMessage } = useIntl();
227
- const [{ collapses }, dispatch] = useReducer(
228
- reducer$1,
229
- initialState$1,
230
- (state) => init$1(state, modifiedData)
231
- );
232
- const handleToggle = (index) => dispatch({
233
- type: "TOGGLE_COLLAPSE",
234
- index
235
- });
236
- return /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 1, children: collapses.map((collapse, index) => /* @__PURE__ */ jsxs(
237
- Accordion,
238
- {
239
- expanded: collapse.isOpen,
240
- onToggle: () => handleToggle(index),
241
- variant: index % 2 === 0 ? "secondary" : void 0,
242
- children: [
243
- /* @__PURE__ */ jsx(
244
- AccordionToggle,
227
+ const [{ collapses }] = useReducer(reducer$1, initialState$1, (state) => init$1(state, modifiedData));
228
+ return /* @__PURE__ */ jsx(Accordion.Root, { size: "M", children: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 1, children: collapses.map((collapse, index) => /* @__PURE__ */ jsxs(Accordion.Item, { value: collapse.name, children: [
229
+ /* @__PURE__ */ jsx(Accordion.Header, { variant: index % 2 === 0 ? "secondary" : void 0, children: /* @__PURE__ */ jsx(
230
+ Accordion.Trigger,
231
+ {
232
+ caretPosition: "right",
233
+ description: formatMessage(
245
234
  {
246
- title: formatPluginName(collapse.name),
247
- description: formatMessage(
248
- {
249
- id: "users-permissions.Plugin.permissions.plugins.description",
250
- defaultMessage: "Define all allowed actions for the {name} plugin."
251
- },
252
- { name: collapse.name }
253
- ),
254
- variant: index % 2 ? "primary" : "secondary"
255
- }
235
+ id: "users-permissions.Plugin.permissions.plugins.description",
236
+ defaultMessage: "Define all allowed actions for the {name} plugin."
237
+ },
238
+ { name: collapse.name }
256
239
  ),
257
- /* @__PURE__ */ jsx(AccordionContent, { children: /* @__PURE__ */ jsx(PermissionRow, { permissions: modifiedData[collapse.name], name: collapse.name }) })
258
- ]
259
- },
260
- collapse.name
261
- )) });
240
+ children: formatPluginName(collapse.name)
241
+ }
242
+ ) }),
243
+ /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(PermissionRow, { permissions: modifiedData[collapse.name], name: collapse.name }) })
244
+ ] }, collapse.name)) }) });
262
245
  };
263
246
  const getMethodColor = (verb) => {
264
247
  switch (verb) {
@@ -310,7 +293,7 @@ function BoundRoute({ route }) {
310
293
  const [controller = "", action = ""] = title ? title.split(".") : [];
311
294
  const colors = getMethodColor(route.method);
312
295
  return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
313
- /* @__PURE__ */ jsxs(Typography, { variant: "delta", as: "h3", children: [
296
+ /* @__PURE__ */ jsxs(Typography, { variant: "delta", tag: "h3", children: [
314
297
  formatMessage({
315
298
  id: "users-permissions.BoundRoute.title",
316
299
  defaultMessage: "Bound route to"
@@ -353,7 +336,7 @@ const Policies = () => {
353
336
  const pathResolved = path.slice(1).join(".");
354
337
  const displayedRoutes = isEmpty(controllerRoutes) ? [] : controllerRoutes.filter((o) => o.handler.endsWith(pathResolved));
355
338
  return /* @__PURE__ */ jsx(
356
- GridItem,
339
+ Grid.Item,
357
340
  {
358
341
  col: 5,
359
342
  background: "neutral150",
@@ -362,15 +345,17 @@ const Policies = () => {
362
345
  paddingLeft: 7,
363
346
  paddingRight: 7,
364
347
  style: { minHeight: "100%" },
348
+ direction: "column",
349
+ alignItems: "stretch",
365
350
  children: selectedAction ? /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: displayedRoutes.map((route, key) => (
366
351
  // eslint-disable-next-line react/no-array-index-key
367
352
  /* @__PURE__ */ jsx(BoundRoute, { route }, key)
368
353
  )) }) : /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
369
- /* @__PURE__ */ jsx(Typography, { variant: "delta", as: "h3", children: formatMessage({
354
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h3", children: formatMessage({
370
355
  id: "users-permissions.Policies.header.title",
371
356
  defaultMessage: "Advanced settings"
372
357
  }) }),
373
- /* @__PURE__ */ jsx(Typography, { as: "p", textColor: "neutral600", children: formatMessage({
358
+ /* @__PURE__ */ jsx(Typography, { tag: "p", textColor: "neutral600", children: formatMessage({
374
359
  id: "users-permissions.Policies.header.hint",
375
360
  defaultMessage: "Select the application's actions or the plugin's actions and click on the cog icon to display the bound route"
376
361
  }) })
@@ -472,20 +457,32 @@ const UsersPermissions = forwardRef(({ permissions, routes }, ref) => {
472
457
  onChangeSelectAll: handleChangeSelectAll,
473
458
  onSelectedAction: handleSelectedAction
474
459
  };
475
- return /* @__PURE__ */ jsx(UsersPermissionsProvider, { value: providerValue, children: /* @__PURE__ */ jsxs(Grid, { gap: 0, shadow: "filterShadow", hasRadius: true, background: "neutral0", children: [
476
- /* @__PURE__ */ jsx(GridItem, { col: 7, paddingTop: 6, paddingBottom: 6, paddingLeft: 7, paddingRight: 7, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
477
- /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
478
- /* @__PURE__ */ jsx(Typography, { variant: "delta", as: "h2", children: formatMessage({
479
- id: getTrad("Plugins.header.title"),
480
- defaultMessage: "Permissions"
481
- }) }),
482
- /* @__PURE__ */ jsx(Typography, { as: "p", textColor: "neutral600", children: formatMessage({
483
- id: getTrad("Plugins.header.description"),
484
- defaultMessage: "Only actions bound by a route are listed below."
485
- }) })
486
- ] }),
487
- /* @__PURE__ */ jsx(Permissions, {})
488
- ] }) }),
460
+ return /* @__PURE__ */ jsx(UsersPermissionsProvider, { value: providerValue, children: /* @__PURE__ */ jsxs(Grid.Root, { gap: 0, shadow: "filterShadow", hasRadius: true, background: "neutral0", children: [
461
+ /* @__PURE__ */ jsx(
462
+ Grid.Item,
463
+ {
464
+ col: 7,
465
+ paddingTop: 6,
466
+ paddingBottom: 6,
467
+ paddingLeft: 7,
468
+ paddingRight: 7,
469
+ direction: "column",
470
+ alignItems: "stretch",
471
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
472
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
473
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h2", children: formatMessage({
474
+ id: getTrad("Plugins.header.title"),
475
+ defaultMessage: "Permissions"
476
+ }) }),
477
+ /* @__PURE__ */ jsx(Typography, { tag: "p", textColor: "neutral600", children: formatMessage({
478
+ id: getTrad("Plugins.header.description"),
479
+ defaultMessage: "Only actions bound by a route are listed below."
480
+ }) })
481
+ ] }),
482
+ /* @__PURE__ */ jsx(Permissions, {})
483
+ ] })
484
+ }
485
+ ),
489
486
  /* @__PURE__ */ jsx(Policies, {})
490
487
  ] }) });
491
488
  });
@@ -495,8 +492,8 @@ UsersPermissions.propTypes = {
495
492
  };
496
493
  const UsersPermissions$1 = memo(UsersPermissions);
497
494
  const createRoleSchema = yup.object().shape({
498
- name: yup.string().required(translatedErrors.required),
499
- description: yup.string().required(translatedErrors.required)
495
+ name: yup.string().required(translatedErrors.required.id),
496
+ description: yup.string().required(translatedErrors.required.id)
500
497
  });
501
498
  const cleanPermissions = (permissions) => Object.keys(permissions).reduce((acc, current) => {
502
499
  const currentPermission = permissions[current].controllers;
@@ -514,7 +511,7 @@ const cleanPermissions = (permissions) => Object.keys(permissions).reduce((acc,
514
511
  return acc;
515
512
  }, {});
516
513
  const usePlugins = () => {
517
- const toggleNotification = useNotification();
514
+ const { toggleNotification } = useNotification();
518
515
  const { get: get2 } = useFetchClient();
519
516
  const { formatAPIError } = useAPIErrorHandler(getTrad);
520
517
  const [
@@ -551,7 +548,7 @@ const usePlugins = () => {
551
548
  useEffect(() => {
552
549
  if (permissionsError) {
553
550
  toggleNotification({
554
- type: "warning",
551
+ type: "danger",
555
552
  message: formatAPIError(permissionsError)
556
553
  });
557
554
  }
@@ -559,7 +556,7 @@ const usePlugins = () => {
559
556
  useEffect(() => {
560
557
  if (routesError) {
561
558
  toggleNotification({
562
- type: "warning",
559
+ type: "danger",
563
560
  message: formatAPIError(routesError)
564
561
  });
565
562
  }
@@ -577,9 +574,8 @@ const usePlugins = () => {
577
574
  };
578
575
  const CreatePage = () => {
579
576
  const { formatMessage } = useIntl();
580
- const toggleNotification = useNotification();
581
- const { goBack } = useHistory();
582
- const { lockApp, unlockApp } = useOverlayBlocker();
577
+ const { toggleNotification } = useNotification();
578
+ const navigate = useNavigate();
583
579
  const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();
584
580
  const { trackUsage } = useTracking();
585
581
  const permissionsRef = React.useRef();
@@ -587,33 +583,34 @@ const CreatePage = () => {
587
583
  const mutation = useMutation((body) => post(`/users-permissions/roles`, body), {
588
584
  onError() {
589
585
  toggleNotification({
590
- type: "warning",
591
- message: {
586
+ type: "danger",
587
+ message: formatMessage({
592
588
  id: "notification.error",
593
589
  defaultMessage: "An error occurred"
594
- }
590
+ })
595
591
  });
596
592
  },
597
593
  onSuccess() {
598
594
  trackUsage("didCreateRole");
599
595
  toggleNotification({
600
596
  type: "success",
601
- message: {
597
+ message: formatMessage({
602
598
  id: getTrad("Settings.roles.created"),
603
599
  defaultMessage: "Role created"
604
- }
600
+ })
605
601
  });
606
- goBack();
602
+ navigate(-1);
607
603
  }
608
604
  });
609
605
  const handleCreateRoleSubmit = async (data) => {
610
- lockApp();
611
606
  const permissions2 = permissionsRef.current.getPermissions();
612
607
  await mutation.mutate({ ...data, ...permissions2, users: [] });
613
- unlockApp();
614
608
  };
615
609
  return /* @__PURE__ */ jsxs(Main, { children: [
616
- /* @__PURE__ */ jsx(SettingsPageTitle, { name: "Roles" }),
610
+ /* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
611
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
612
+ { name: "Roles" }
613
+ ) }),
617
614
  /* @__PURE__ */ jsx(
618
615
  Formik,
619
616
  {
@@ -623,7 +620,7 @@ const CreatePage = () => {
623
620
  validationSchema: createRoleSchema,
624
621
  children: ({ handleSubmit, values, handleChange, errors }) => /* @__PURE__ */ jsxs(Form, { noValidate: true, onSubmit: handleSubmit, children: [
625
622
  /* @__PURE__ */ jsx(
626
- HeaderLayout,
623
+ Layouts.Header,
627
624
  {
628
625
  primaryAction: !isLoadingPlugins && /* @__PURE__ */ jsx(Button, { type: "submit", loading: mutation.isLoading, startIcon: /* @__PURE__ */ jsx(Check, {}), children: formatMessage({
629
626
  id: "global.save",
@@ -639,7 +636,7 @@ const CreatePage = () => {
639
636
  })
640
637
  }
641
638
  ),
642
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(
639
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(
643
640
  Flex,
644
641
  {
645
642
  background: "neutral0",
@@ -654,40 +651,44 @@ const CreatePage = () => {
654
651
  shadow: "filterShadow",
655
652
  children: [
656
653
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", children: [
657
- /* @__PURE__ */ jsx(Typography, { variant: "delta", as: "h2", children: formatMessage({
654
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h2", children: formatMessage({
658
655
  id: getTrad("EditPage.form.roles"),
659
656
  defaultMessage: "Role details"
660
657
  }) }),
661
- /* @__PURE__ */ jsxs(Grid, { gap: 4, children: [
662
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
663
- TextInput,
658
+ /* @__PURE__ */ jsxs(Grid.Root, { gap: 4, children: [
659
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxs(
660
+ Field.Root,
664
661
  {
665
662
  name: "name",
666
- value: values.name || "",
667
- onChange: handleChange,
668
- label: formatMessage({
669
- id: "global.name",
670
- defaultMessage: "Name"
671
- }),
672
663
  error: errors?.name ? formatMessage({ id: errors.name, defaultMessage: "Name is required" }) : false,
673
- required: true
664
+ required: true,
665
+ children: [
666
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
667
+ id: "global.name",
668
+ defaultMessage: "Name"
669
+ }) }),
670
+ /* @__PURE__ */ jsx(TextInput, { value: values.name || "", onChange: handleChange }),
671
+ /* @__PURE__ */ jsx(Field.Error, {})
672
+ ]
674
673
  }
675
674
  ) }),
676
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
677
- Textarea,
675
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxs(
676
+ Field.Root,
678
677
  {
679
- id: "description",
680
- value: values.description || "",
681
- onChange: handleChange,
682
- label: formatMessage({
683
- id: "global.description",
684
- defaultMessage: "Description"
685
- }),
678
+ name: "description",
686
679
  error: errors?.description ? formatMessage({
687
680
  id: errors.description,
688
681
  defaultMessage: "Description is required"
689
682
  }) : false,
690
- required: true
683
+ required: true,
684
+ children: [
685
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
686
+ id: "global.description",
687
+ defaultMessage: "Description"
688
+ }) }),
689
+ /* @__PURE__ */ jsx(Textarea, { value: values.description || "", onChange: handleChange }),
690
+ /* @__PURE__ */ jsx(Field.Error, {})
691
+ ]
691
692
  }
692
693
  ) })
693
694
  ] })
@@ -708,14 +709,13 @@ const CreatePage = () => {
708
709
  )
709
710
  ] });
710
711
  };
711
- const ProtectedRolesCreatePage = () => /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.createRole, children: /* @__PURE__ */ jsx(CreatePage, {}) });
712
+ const ProtectedRolesCreatePage = () => /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.createRole, children: /* @__PURE__ */ jsx(CreatePage, {}) });
712
713
  const EditPage = () => {
713
714
  const { formatMessage } = useIntl();
714
- const toggleNotification = useNotification();
715
- const { lockApp, unlockApp } = useOverlayBlocker();
715
+ const { toggleNotification } = useNotification();
716
716
  const {
717
717
  params: { id }
718
- } = useRouteMatch(`/settings/users-permissions/roles/:id`);
718
+ } = useMatch(`/settings/users-permissions/roles/:id`);
719
719
  const { get: get2 } = useFetchClient();
720
720
  const { isLoading: isLoadingPlugins, routes } = usePlugins();
721
721
  const {
@@ -734,32 +734,33 @@ const EditPage = () => {
734
734
  const mutation = useMutation((body) => put(`/users-permissions/roles/${id}`, body), {
735
735
  onError(error) {
736
736
  toggleNotification({
737
- type: "warning",
737
+ type: "danger",
738
738
  message: formatAPIError(error)
739
739
  });
740
740
  },
741
741
  async onSuccess() {
742
742
  toggleNotification({
743
743
  type: "success",
744
- message: {
744
+ message: formatMessage({
745
745
  id: getTrad("Settings.roles.created"),
746
746
  defaultMessage: "Role edited"
747
- }
747
+ })
748
748
  });
749
749
  await refetchRole();
750
750
  }
751
751
  });
752
752
  const handleEditRoleSubmit = async (data) => {
753
- lockApp();
754
753
  const permissions = permissionsRef.current.getPermissions();
755
754
  await mutation.mutate({ ...data, ...permissions, users: [] });
756
- unlockApp();
757
755
  };
758
756
  if (isLoadingRole) {
759
- return /* @__PURE__ */ jsx(LoadingIndicatorPage, {});
757
+ return /* @__PURE__ */ jsx(Page.Loading, {});
760
758
  }
761
759
  return /* @__PURE__ */ jsxs(Main, { children: [
762
- /* @__PURE__ */ jsx(SettingsPageTitle, { name: "Roles" }),
760
+ /* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
761
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
762
+ { name: "Roles" }
763
+ ) }),
763
764
  /* @__PURE__ */ jsx(
764
765
  Formik,
765
766
  {
@@ -769,9 +770,9 @@ const EditPage = () => {
769
770
  validationSchema: createRoleSchema,
770
771
  children: ({ handleSubmit, values, handleChange, errors }) => /* @__PURE__ */ jsxs(Form, { noValidate: true, onSubmit: handleSubmit, children: [
771
772
  /* @__PURE__ */ jsx(
772
- HeaderLayout,
773
+ Layouts.Header,
773
774
  {
774
- primaryAction: !isLoadingPlugins && /* @__PURE__ */ jsx(
775
+ primaryAction: !isLoadingPlugins ? /* @__PURE__ */ jsx(
775
776
  Button,
776
777
  {
777
778
  disabled: role.code === "strapi-super-admin",
@@ -783,16 +784,13 @@ const EditPage = () => {
783
784
  defaultMessage: "Save"
784
785
  })
785
786
  }
786
- ),
787
+ ) : null,
787
788
  title: role.name,
788
789
  subtitle: role.description,
789
- navigationAction: /* @__PURE__ */ jsx(Link, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/settings/users-permissions/roles", children: formatMessage({
790
- id: "global.back",
791
- defaultMessage: "Back"
792
- }) })
790
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {})
793
791
  }
794
792
  ),
795
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(
793
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(
796
794
  Flex,
797
795
  {
798
796
  background: "neutral0",
@@ -807,40 +805,47 @@ const EditPage = () => {
807
805
  shadow: "filterShadow",
808
806
  children: [
809
807
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 4, children: [
810
- /* @__PURE__ */ jsx(Typography, { variant: "delta", as: "h2", children: formatMessage({
808
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h2", children: formatMessage({
811
809
  id: getTrad("EditPage.form.roles"),
812
810
  defaultMessage: "Role details"
813
811
  }) }),
814
- /* @__PURE__ */ jsxs(Grid, { gap: 4, children: [
815
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
816
- TextInput,
812
+ /* @__PURE__ */ jsxs(Grid.Root, { gap: 4, children: [
813
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxs(
814
+ Field.Root,
817
815
  {
818
816
  name: "name",
819
- value: values.name || "",
820
- onChange: handleChange,
821
- label: formatMessage({
822
- id: "global.name",
823
- defaultMessage: "Name"
824
- }),
825
- error: errors?.name ? formatMessage({ id: errors.name, defaultMessage: "Name is required" }) : false,
826
- required: true
817
+ error: errors?.name ? formatMessage({
818
+ id: errors.name,
819
+ defaultMessage: "Name is required"
820
+ }) : false,
821
+ required: true,
822
+ children: [
823
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
824
+ id: "global.name",
825
+ defaultMessage: "Name"
826
+ }) }),
827
+ /* @__PURE__ */ jsx(TextInput, { value: values.name || "", onChange: handleChange }),
828
+ /* @__PURE__ */ jsx(Field.Error, {})
829
+ ]
827
830
  }
828
831
  ) }),
829
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
830
- Textarea,
832
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxs(
833
+ Field.Root,
831
834
  {
832
- id: "description",
833
- value: values.description || "",
834
- onChange: handleChange,
835
- label: formatMessage({
836
- id: "global.description",
837
- defaultMessage: "Description"
838
- }),
835
+ name: "description",
839
836
  error: errors?.description ? formatMessage({
840
837
  id: errors.description,
841
838
  defaultMessage: "Description is required"
842
839
  }) : false,
843
- required: true
840
+ required: true,
841
+ children: [
842
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
843
+ id: "global.description",
844
+ defaultMessage: "Description"
845
+ }) }),
846
+ /* @__PURE__ */ jsx(Textarea, { value: values.description || "", onChange: handleChange }),
847
+ /* @__PURE__ */ jsx(Field.Error, {})
848
+ ]
844
849
  }
845
850
  ) })
846
851
  ] })
@@ -861,18 +866,18 @@ const EditPage = () => {
861
866
  )
862
867
  ] });
863
868
  };
864
- const ProtectedRolesEditPage = () => /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.updateRole, children: /* @__PURE__ */ jsx(EditPage, {}) });
865
- const EditLink = styled(Link$1)`
869
+ const ProtectedRolesEditPage = () => /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.updateRole, children: /* @__PURE__ */ jsx(EditPage, {}) });
870
+ const EditLink = styled(Link)`
866
871
  align-items: center;
867
- height: ${pxToRem(32)};
872
+ height: 3.2rem;
873
+ width: 3.2rem;
868
874
  display: flex;
869
875
  justify-content: center;
870
- padding: ${({ theme }) => `${theme.spaces[2]}}`};
871
- width: ${pxToRem(32)};
876
+ padding: ${({ theme }) => `${theme.spaces[2]}`};
872
877
 
873
878
  svg {
874
- height: ${pxToRem(12)};
875
- width: ${pxToRem(12)};
879
+ height: 1.6rem;
880
+ width: 1.6rem;
876
881
 
877
882
  path {
878
883
  fill: ${({ theme }) => theme.colors.neutral500};
@@ -888,19 +893,16 @@ const EditLink = styled(Link$1)`
888
893
  }
889
894
  }
890
895
  `;
891
- const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {
896
+ const TableBody = ({ sortedRoles, canDelete, canUpdate, setRoleToDelete, onDelete }) => {
892
897
  const { formatMessage } = useIntl();
893
- const { push } = useHistory();
898
+ const navigate = useNavigate();
894
899
  const [showConfirmDelete, setShowConfirmDelete] = onDelete;
895
900
  const checkCanDeleteRole = (role) => canDelete && !["public", "authenticated"].includes(role.type);
896
901
  const handleClickDelete = (id) => {
897
902
  setRoleToDelete(id);
898
903
  setShowConfirmDelete(!showConfirmDelete);
899
904
  };
900
- const handleClickEdit = (id) => {
901
- push(`/settings/users-permissions/roles/${id}`);
902
- };
903
- return /* @__PURE__ */ jsx(Tbody, { children: sortedRoles?.map((role) => /* @__PURE__ */ jsxs(Tr, { ...onRowClick({ fn: () => handleClickEdit(role.id) }), children: [
905
+ return /* @__PURE__ */ jsx(Tbody, { children: sortedRoles?.map((role) => /* @__PURE__ */ jsxs(Tr, { onClick: () => navigate(role.id.toString()), children: [
904
906
  /* @__PURE__ */ jsx(Td, { width: "20%", children: /* @__PURE__ */ jsx(Typography, { children: role.name }) }),
905
907
  /* @__PURE__ */ jsx(Td, { width: "50%", children: /* @__PURE__ */ jsx(Typography, { children: role.description }) }),
906
908
  /* @__PURE__ */ jsx(Td, { width: "30%", children: /* @__PURE__ */ jsx(Typography, { children: formatMessage(
@@ -910,82 +912,58 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
910
912
  },
911
913
  { number: role.nb_users }
912
914
  ) }) }),
913
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "end", ...stopPropagation, children: [
914
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: permissions.updateRole, children: /* @__PURE__ */ jsx(
915
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "end", onClick: (e) => e.stopPropagation(), children: [
916
+ canUpdate ? /* @__PURE__ */ jsx(
915
917
  EditLink,
916
918
  {
917
- to: `/settings/users-permissions/roles/${role.id}`,
919
+ tag: NavLink,
920
+ to: role.id.toString(),
918
921
  "aria-label": formatMessage(
919
922
  { id: "app.component.table.edit", defaultMessage: "Edit {target}" },
920
923
  { target: `${role.name}` }
921
924
  ),
922
925
  children: /* @__PURE__ */ jsx(Pencil, {})
923
926
  }
924
- ) }),
925
- checkCanDeleteRole(role) && /* @__PURE__ */ jsx(CheckPermissions, { permissions: permissions.deleteRole, children: /* @__PURE__ */ jsx(
927
+ ) : null,
928
+ checkCanDeleteRole(role) && /* @__PURE__ */ jsx(
926
929
  IconButton,
927
930
  {
928
- onClick: () => handleClickDelete(role.id),
929
- noBorder: true,
930
- icon: /* @__PURE__ */ jsx(Trash, {}),
931
+ onClick: () => handleClickDelete(role.id.toString()),
932
+ variant: "ghost",
931
933
  label: formatMessage(
932
934
  { id: "global.delete-target", defaultMessage: "Delete {target}" },
933
935
  { target: `${role.name}` }
934
- )
936
+ ),
937
+ children: /* @__PURE__ */ jsx(Trash, {})
935
938
  }
936
- ) })
939
+ )
937
940
  ] }) })
938
941
  ] }, role.name)) });
939
942
  };
940
943
  TableBody.defaultProps = {
941
- canDelete: false
944
+ canDelete: false,
945
+ canUpdate: false
942
946
  };
943
947
  TableBody.propTypes = {
944
948
  onDelete: PropTypes.array.isRequired,
945
- permissions: PropTypes.object.isRequired,
946
949
  setRoleToDelete: PropTypes.func.isRequired,
947
950
  sortedRoles: PropTypes.array.isRequired,
948
- canDelete: PropTypes.bool
949
- };
950
- const fetchData = async (toggleNotification, notifyStatus) => {
951
- try {
952
- const { get: get2 } = getFetchClient();
953
- const { data } = await get2("/users-permissions/roles");
954
- notifyStatus("The roles have loaded successfully");
955
- return data;
956
- } catch (err) {
957
- toggleNotification({
958
- type: "warning",
959
- message: { id: "notification.error" }
960
- });
961
- throw new Error(err);
962
- }
963
- };
964
- const deleteData = async (id, toggleNotification) => {
965
- try {
966
- const { del } = getFetchClient();
967
- await del(`/users-permissions/roles/${id}`);
968
- } catch (error) {
969
- toggleNotification({
970
- type: "warning",
971
- message: { id: "notification.error", defaultMessage: "An error occured" }
972
- });
973
- }
951
+ canDelete: PropTypes.bool,
952
+ canUpdate: PropTypes.bool
974
953
  };
975
954
  const RolesListPage = () => {
976
955
  const { trackUsage } = useTracking();
977
956
  const { formatMessage, locale } = useIntl();
978
- const toggleNotification = useNotification();
957
+ const { toggleNotification } = useNotification();
979
958
  const { notifyStatus } = useNotifyAT();
980
959
  const [{ query }] = useQueryParams();
981
960
  const _q = query?._q || "";
982
961
  const [showConfirmDelete, setShowConfirmDelete] = useState(false);
983
- const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
984
962
  const [roleToDelete, setRoleToDelete] = useState();
985
- useFocusWhenNavigate();
963
+ const { del, get: get2 } = useFetchClient();
986
964
  const {
987
965
  isLoading: isLoadingForPermissions,
988
- allowedActions: { canRead, canDelete }
966
+ allowedActions: { canRead, canDelete, canCreate, canUpdate }
989
967
  } = useRBAC({
990
968
  create: PERMISSIONS.createRole,
991
969
  read: PERMISSIONS.readRoles,
@@ -997,20 +975,43 @@ const RolesListPage = () => {
997
975
  data: { roles },
998
976
  isFetching,
999
977
  refetch
1000
- } = useQuery("get-roles", () => fetchData(toggleNotification, notifyStatus), {
978
+ } = useQuery("get-roles", () => fetchData(toggleNotification, formatMessage, notifyStatus), {
1001
979
  initialData: {},
1002
980
  enabled: canRead
1003
981
  });
1004
- const { includes } = useFilter(locale, {
982
+ const { contains } = useFilter(locale, {
1005
983
  sensitivity: "base"
1006
984
  });
1007
985
  const formatter = useCollator(locale, {
1008
986
  sensitivity: "base"
1009
987
  });
1010
- const isLoading = isLoadingForData || isFetching;
988
+ const isLoading = isLoadingForData || isFetching || isLoadingForPermissions;
1011
989
  const handleShowConfirmDelete = () => {
1012
990
  setShowConfirmDelete(!showConfirmDelete);
1013
991
  };
992
+ const deleteData = async (id, formatMessage2, toggleNotification2) => {
993
+ try {
994
+ await del(`/users-permissions/roles/${id}`);
995
+ } catch (error) {
996
+ toggleNotification2({
997
+ type: "danger",
998
+ message: formatMessage2({ id: "notification.error", defaultMessage: "An error occured" })
999
+ });
1000
+ }
1001
+ };
1002
+ const fetchData = async (toggleNotification2, formatMessage2, notifyStatus2) => {
1003
+ try {
1004
+ const { data } = await get2("/users-permissions/roles");
1005
+ notifyStatus2("The roles have loaded successfully");
1006
+ return data;
1007
+ } catch (err) {
1008
+ toggleNotification2({
1009
+ type: "danger",
1010
+ message: formatMessage2({ id: "notification.error", defaultMessage: "An error occurred" })
1011
+ });
1012
+ throw new Error(err);
1013
+ }
1014
+ };
1014
1015
  const emptyLayout = {
1015
1016
  roles: {
1016
1017
  id: getTrad("Roles.empty"),
@@ -1025,28 +1026,32 @@ const RolesListPage = () => {
1025
1026
  id: "global.roles",
1026
1027
  defaultMessage: "Roles"
1027
1028
  });
1028
- const deleteMutation = useMutation((id) => deleteData(id, toggleNotification), {
1029
+ const deleteMutation = useMutation((id) => deleteData(id, formatMessage, toggleNotification), {
1029
1030
  async onSuccess() {
1030
1031
  await refetch();
1031
1032
  }
1032
1033
  });
1033
1034
  const handleConfirmDelete = async () => {
1034
- setIsConfirmButtonLoading(true);
1035
1035
  await deleteMutation.mutateAsync(roleToDelete);
1036
1036
  setShowConfirmDelete(!showConfirmDelete);
1037
- setIsConfirmButtonLoading(false);
1038
1037
  };
1039
- const sortedRoles = (roles || []).filter((role) => includes(role.name, _q) || includes(role.description, _q)).sort(
1038
+ const sortedRoles = (roles || []).filter((role) => contains(role.name, _q) || contains(role.description, _q)).sort(
1040
1039
  (a, b) => formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description)
1041
1040
  );
1042
1041
  const emptyContent = _q && !sortedRoles.length ? "search" : "roles";
1043
1042
  const colCount = 4;
1044
1043
  const rowCount = (roles?.length || 0) + 1;
1045
- return /* @__PURE__ */ jsxs(Layout, { children: [
1046
- /* @__PURE__ */ jsx(SettingsPageTitle, { name: pageTitle }),
1047
- /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
1044
+ if (isLoading) {
1045
+ return /* @__PURE__ */ jsx(Page.Loading, {});
1046
+ }
1047
+ return /* @__PURE__ */ jsxs(Layouts.Root, { children: [
1048
+ /* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
1049
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
1050
+ { name: pageTitle }
1051
+ ) }),
1052
+ /* @__PURE__ */ jsxs(Page.Main, { children: [
1048
1053
  /* @__PURE__ */ jsx(
1049
- HeaderLayout,
1054
+ Layouts.Header,
1050
1055
  {
1051
1056
  title: formatMessage({
1052
1057
  id: "global.roles",
@@ -1056,10 +1061,11 @@ const RolesListPage = () => {
1056
1061
  id: "Settings.roles.list.description",
1057
1062
  defaultMessage: "List of roles"
1058
1063
  }),
1059
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createRole, children: /* @__PURE__ */ jsx(
1064
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
1060
1065
  LinkButton,
1061
1066
  {
1062
- to: "/settings/users-permissions/roles/new",
1067
+ to: "new",
1068
+ tag: NavLink,
1063
1069
  onClick: () => trackUsage("willCreateRole"),
1064
1070
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
1065
1071
  size: "S",
@@ -1068,14 +1074,14 @@ const RolesListPage = () => {
1068
1074
  defaultMessage: "Add new role"
1069
1075
  })
1070
1076
  }
1071
- ) })
1077
+ ) : null
1072
1078
  }
1073
1079
  ),
1074
1080
  /* @__PURE__ */ jsx(
1075
- ActionLayout,
1081
+ Layouts.Action,
1076
1082
  {
1077
1083
  startActions: /* @__PURE__ */ jsx(
1078
- SearchURLQuery,
1084
+ SearchInput,
1079
1085
  {
1080
1086
  label: formatMessage({
1081
1087
  id: "app.component.search.label",
@@ -1085,9 +1091,8 @@ const RolesListPage = () => {
1085
1091
  )
1086
1092
  }
1087
1093
  ),
1088
- /* @__PURE__ */ jsxs(ContentLayout, { children: [
1089
- !canRead && /* @__PURE__ */ jsx(NoPermissions, {}),
1090
- (isLoading || isLoadingForPermissions) && /* @__PURE__ */ jsx(LoadingIndicatorPage, {}),
1094
+ /* @__PURE__ */ jsxs(Layouts.Content, { children: [
1095
+ !canRead && /* @__PURE__ */ jsx(Page.NoPermissions, {}),
1091
1096
  canRead && sortedRoles && sortedRoles?.length ? /* @__PURE__ */ jsxs(Table, { colCount, rowCount, children: [
1092
1097
  /* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
1093
1098
  /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: formatMessage({ id: "global.name", defaultMessage: "Name" }) }) }),
@@ -1109,51 +1114,29 @@ const RolesListPage = () => {
1109
1114
  {
1110
1115
  sortedRoles,
1111
1116
  canDelete,
1117
+ canUpdate,
1112
1118
  permissions: PERMISSIONS,
1113
1119
  setRoleToDelete,
1114
1120
  onDelete: [showConfirmDelete, setShowConfirmDelete]
1115
1121
  }
1116
1122
  )
1117
- ] }) : /* @__PURE__ */ jsx(EmptyStateLayout, { content: emptyLayout[emptyContent] })
1123
+ ] }) : /* @__PURE__ */ jsx(EmptyStateLayout, { content: formatMessage(emptyLayout[emptyContent]) })
1118
1124
  ] }),
1119
- /* @__PURE__ */ jsx(
1120
- ConfirmDialog,
1121
- {
1122
- isConfirmButtonLoading,
1123
- onConfirm: handleConfirmDelete,
1124
- onToggleDialog: handleShowConfirmDelete,
1125
- isOpen: showConfirmDelete
1126
- }
1127
- )
1125
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showConfirmDelete, onOpenChange: handleShowConfirmDelete, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDelete }) })
1128
1126
  ] })
1129
1127
  ] });
1130
1128
  };
1131
1129
  const ProtectedRolesListPage = () => {
1132
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.accessRoles, children: /* @__PURE__ */ jsx(RolesListPage, {}) });
1130
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.accessRoles, children: /* @__PURE__ */ jsx(RolesListPage, {}) });
1133
1131
  };
1134
1132
  const Roles = () => {
1135
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.accessRoles, children: /* @__PURE__ */ jsxs(Switch, { children: [
1136
- /* @__PURE__ */ jsx(
1137
- Route,
1138
- {
1139
- path: "/settings/users-permissions/roles/new",
1140
- component: ProtectedRolesCreatePage,
1141
- exact: true
1142
- }
1143
- ),
1144
- /* @__PURE__ */ jsx(
1145
- Route,
1146
- {
1147
- path: "/settings/users-permissions/roles/:id",
1148
- component: ProtectedRolesEditPage,
1149
- exact: true
1150
- }
1151
- ),
1152
- /* @__PURE__ */ jsx(Route, { path: "/settings/users-permissions/roles", component: ProtectedRolesListPage, exact: true }),
1153
- /* @__PURE__ */ jsx(Route, { path: "", component: AnErrorOccurred })
1133
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.accessRoles, children: /* @__PURE__ */ jsxs(Routes, { children: [
1134
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ProtectedRolesListPage, {}) }),
1135
+ /* @__PURE__ */ jsx(Route, { path: "new", element: /* @__PURE__ */ jsx(ProtectedRolesCreatePage, {}) }),
1136
+ /* @__PURE__ */ jsx(Route, { path: ":id", element: /* @__PURE__ */ jsx(ProtectedRolesEditPage, {}) })
1154
1137
  ] }) });
1155
1138
  };
1156
1139
  export {
1157
1140
  Roles as default
1158
1141
  };
1159
- //# sourceMappingURL=index-MuQRbm-o.mjs.map
1142
+ //# sourceMappingURL=index-CnX2wiLY.mjs.map