@strapi/plugin-users-permissions 5.9.0 → 5.10.0

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 (268) hide show
  1. package/.eslintignore +2 -1
  2. package/admin/src/components/BoundRoute/index.jsx +1 -1
  3. package/admin/src/components/FormModal/Input/index.jsx +1 -1
  4. package/admin/src/components/FormModal/index.jsx +1 -1
  5. package/admin/src/components/Policies/index.jsx +1 -1
  6. package/admin/src/index.js +2 -2
  7. package/admin/src/pages/AdvancedSettings/index.jsx +1 -1
  8. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +1 -1
  9. package/admin/src/pages/EmailTemplates/components/EmailTable.jsx +1 -1
  10. package/admin/src/pages/Roles/index.jsx +1 -1
  11. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +1 -1
  12. package/admin/src/pluginId.js +2 -2
  13. package/dist/admin/chunks/ar-BJwjobLp.js +45 -0
  14. package/dist/admin/chunks/ar-BJwjobLp.js.map +1 -0
  15. package/dist/admin/chunks/ar-G6bUGuUb.mjs +43 -0
  16. package/dist/admin/chunks/ar-G6bUGuUb.mjs.map +1 -0
  17. package/dist/admin/chunks/cs-Bu59JqhG.mjs +49 -0
  18. package/dist/admin/chunks/cs-Bu59JqhG.mjs.map +1 -0
  19. package/dist/admin/chunks/cs-uS_SIEo8.js +51 -0
  20. package/dist/admin/chunks/cs-uS_SIEo8.js.map +1 -0
  21. package/dist/admin/chunks/de-7MVMrqqI.js +63 -0
  22. package/dist/admin/chunks/de-7MVMrqqI.js.map +1 -0
  23. package/dist/admin/chunks/de-B81A69_5.mjs +61 -0
  24. package/dist/admin/chunks/de-B81A69_5.mjs.map +1 -0
  25. package/dist/admin/chunks/dk-BaelzvBE.mjs +85 -0
  26. package/dist/admin/chunks/dk-BaelzvBE.mjs.map +1 -0
  27. package/dist/admin/chunks/dk-DwCLGmy9.js +87 -0
  28. package/dist/admin/chunks/dk-DwCLGmy9.js.map +1 -0
  29. package/dist/admin/chunks/en-BhgCBe7M.mjs +85 -0
  30. package/dist/admin/chunks/en-BhgCBe7M.mjs.map +1 -0
  31. package/dist/admin/chunks/en-DwQjkHi_.js +87 -0
  32. package/dist/admin/chunks/en-DwQjkHi_.js.map +1 -0
  33. package/dist/admin/chunks/es-B0wXmvRj.mjs +85 -0
  34. package/dist/admin/chunks/es-B0wXmvRj.mjs.map +1 -0
  35. package/dist/admin/chunks/es-BOJOedG5.js +87 -0
  36. package/dist/admin/chunks/es-BOJOedG5.js.map +1 -0
  37. package/dist/admin/chunks/fr-BDNWCNs0.js +51 -0
  38. package/dist/admin/chunks/fr-BDNWCNs0.js.map +1 -0
  39. package/dist/admin/chunks/fr-CGYvGUXg.mjs +49 -0
  40. package/dist/admin/chunks/fr-CGYvGUXg.mjs.map +1 -0
  41. package/dist/admin/chunks/id-CNzbwFjA.mjs +61 -0
  42. package/dist/admin/chunks/id-CNzbwFjA.mjs.map +1 -0
  43. package/dist/admin/chunks/id-UqUPykHZ.js +63 -0
  44. package/dist/admin/chunks/id-UqUPykHZ.js.map +1 -0
  45. package/dist/admin/chunks/index-B-Z_z_qb.mjs +213 -0
  46. package/dist/admin/chunks/index-B-Z_z_qb.mjs.map +1 -0
  47. package/dist/admin/chunks/index-B2MJiSOD.mjs +279 -0
  48. package/dist/admin/chunks/index-B2MJiSOD.mjs.map +1 -0
  49. package/dist/admin/chunks/index-BPiDUOGt.js +471 -0
  50. package/dist/admin/chunks/index-BPiDUOGt.js.map +1 -0
  51. package/dist/admin/chunks/index-BtYUb_br.js +741 -0
  52. package/dist/admin/chunks/index-BtYUb_br.js.map +1 -0
  53. package/dist/admin/chunks/index-COXjHxFm.mjs +718 -0
  54. package/dist/admin/chunks/index-COXjHxFm.mjs.map +1 -0
  55. package/dist/admin/chunks/index-CkYplz_3.js +301 -0
  56. package/dist/admin/chunks/index-CkYplz_3.js.map +1 -0
  57. package/dist/admin/chunks/index-Cu2GvTiT.mjs +1516 -0
  58. package/dist/admin/chunks/index-Cu2GvTiT.mjs.map +1 -0
  59. package/dist/admin/chunks/index-D01zzG9y.js +1537 -0
  60. package/dist/admin/chunks/index-D01zzG9y.js.map +1 -0
  61. package/dist/admin/chunks/index-DAclA-0k.js +217 -0
  62. package/dist/admin/chunks/index-DAclA-0k.js.map +1 -0
  63. package/dist/admin/chunks/index-DVNIct2-.mjs +448 -0
  64. package/dist/admin/chunks/index-DVNIct2-.mjs.map +1 -0
  65. package/dist/admin/chunks/it-B2H2foTf.mjs +61 -0
  66. package/dist/admin/chunks/it-B2H2foTf.mjs.map +1 -0
  67. package/dist/admin/chunks/it-D5VuyoLU.js +63 -0
  68. package/dist/admin/chunks/it-D5VuyoLU.js.map +1 -0
  69. package/dist/admin/chunks/ja-C0z9d7L9.mjs +47 -0
  70. package/dist/admin/chunks/ja-C0z9d7L9.mjs.map +1 -0
  71. package/dist/admin/chunks/ja-MpqVsCgs.js +49 -0
  72. package/dist/admin/chunks/ja-MpqVsCgs.js.map +1 -0
  73. package/dist/admin/chunks/ko-Bm-grPSc.js +87 -0
  74. package/dist/admin/chunks/ko-Bm-grPSc.js.map +1 -0
  75. package/dist/admin/chunks/ko-CzUgzpeS.mjs +85 -0
  76. package/dist/admin/chunks/ko-CzUgzpeS.mjs.map +1 -0
  77. package/dist/admin/chunks/ms-CCacxjim.mjs +48 -0
  78. package/dist/admin/chunks/ms-CCacxjim.mjs.map +1 -0
  79. package/dist/admin/chunks/ms-D7eyBD5H.js +50 -0
  80. package/dist/admin/chunks/ms-D7eyBD5H.js.map +1 -0
  81. package/dist/admin/chunks/nl-BIOwAQtI.js +49 -0
  82. package/dist/admin/chunks/nl-BIOwAQtI.js.map +1 -0
  83. package/dist/admin/chunks/nl-DDC3nZW-.mjs +47 -0
  84. package/dist/admin/chunks/nl-DDC3nZW-.mjs.map +1 -0
  85. package/dist/admin/chunks/pl-D5BeNrg_.js +87 -0
  86. package/dist/admin/chunks/pl-D5BeNrg_.js.map +1 -0
  87. package/dist/admin/chunks/pl-XkS463rN.mjs +85 -0
  88. package/dist/admin/chunks/pl-XkS463rN.mjs.map +1 -0
  89. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs +43 -0
  90. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs.map +1 -0
  91. package/dist/admin/chunks/pt-BR-DxPBzQGx.js +45 -0
  92. package/dist/admin/chunks/pt-BR-DxPBzQGx.js.map +1 -0
  93. package/dist/admin/chunks/pt-DQpEvio8.mjs +47 -0
  94. package/dist/admin/chunks/pt-DQpEvio8.mjs.map +1 -0
  95. package/dist/admin/chunks/pt-kkCwzNvH.js +49 -0
  96. package/dist/admin/chunks/pt-kkCwzNvH.js.map +1 -0
  97. package/dist/admin/chunks/ru-BQ0gHmp3.js +87 -0
  98. package/dist/admin/chunks/ru-BQ0gHmp3.js.map +1 -0
  99. package/dist/admin/chunks/ru-nzL_7Mhg.mjs +85 -0
  100. package/dist/admin/chunks/ru-nzL_7Mhg.mjs.map +1 -0
  101. package/dist/admin/chunks/sk-Ddxc_tZA.mjs +49 -0
  102. package/dist/admin/chunks/sk-Ddxc_tZA.mjs.map +1 -0
  103. package/dist/admin/chunks/sk-nVwAPdYC.js +51 -0
  104. package/dist/admin/chunks/sk-nVwAPdYC.js.map +1 -0
  105. package/dist/admin/chunks/sv-BDfk2A-F.js +87 -0
  106. package/dist/admin/chunks/sv-BDfk2A-F.js.map +1 -0
  107. package/dist/admin/chunks/sv-By3RYpMG.mjs +85 -0
  108. package/dist/admin/chunks/sv-By3RYpMG.mjs.map +1 -0
  109. package/dist/admin/chunks/th-BtTtpHe2.js +61 -0
  110. package/dist/admin/chunks/th-BtTtpHe2.js.map +1 -0
  111. package/dist/admin/chunks/th-COl50vqb.mjs +59 -0
  112. package/dist/admin/chunks/th-COl50vqb.mjs.map +1 -0
  113. package/dist/admin/chunks/tr-80SJU6jg.mjs +84 -0
  114. package/dist/admin/chunks/tr-80SJU6jg.mjs.map +1 -0
  115. package/dist/admin/chunks/tr-Di-Nf7cT.js +86 -0
  116. package/dist/admin/chunks/tr-Di-Nf7cT.js.map +1 -0
  117. package/dist/admin/chunks/uk-CggQOx1l.js +50 -0
  118. package/dist/admin/chunks/uk-CggQOx1l.js.map +1 -0
  119. package/dist/admin/chunks/uk-D8JHuzch.mjs +48 -0
  120. package/dist/admin/chunks/uk-D8JHuzch.mjs.map +1 -0
  121. package/dist/admin/chunks/vi-69AF03Iv.mjs +49 -0
  122. package/dist/admin/chunks/vi-69AF03Iv.mjs.map +1 -0
  123. package/dist/admin/chunks/vi-D9cCsHsU.js +51 -0
  124. package/dist/admin/chunks/vi-D9cCsHsU.js.map +1 -0
  125. package/dist/admin/chunks/zh-BzSkqxo-.mjs +85 -0
  126. package/dist/admin/chunks/zh-BzSkqxo-.mjs.map +1 -0
  127. package/dist/admin/chunks/zh-BzWgJEzz.js +87 -0
  128. package/dist/admin/chunks/zh-BzWgJEzz.js.map +1 -0
  129. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js +87 -0
  130. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js.map +1 -0
  131. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs +85 -0
  132. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs.map +1 -0
  133. package/dist/admin/index.js +6 -2
  134. package/dist/admin/index.js.map +1 -1
  135. package/dist/admin/index.mjs +1 -4
  136. package/dist/admin/index.mjs.map +1 -1
  137. package/dist/server/index.js +4739 -0
  138. package/dist/server/index.js.map +1 -0
  139. package/dist/server/index.mjs +4737 -0
  140. package/dist/server/index.mjs.map +1 -0
  141. package/package.json +11 -10
  142. package/rollup.config.mjs +52 -0
  143. package/server/register.js +1 -1
  144. package/dist/_chunks/ar-BguGUqwK.js +0 -44
  145. package/dist/_chunks/ar-BguGUqwK.js.map +0 -1
  146. package/dist/_chunks/ar-CK8BRRXB.mjs +0 -44
  147. package/dist/_chunks/ar-CK8BRRXB.mjs.map +0 -1
  148. package/dist/_chunks/cs-BVigMk0l.mjs +0 -50
  149. package/dist/_chunks/cs-BVigMk0l.mjs.map +0 -1
  150. package/dist/_chunks/cs-BW8-K_GY.js +0 -50
  151. package/dist/_chunks/cs-BW8-K_GY.js.map +0 -1
  152. package/dist/_chunks/de-BKUdRFI4.mjs +0 -62
  153. package/dist/_chunks/de-BKUdRFI4.mjs.map +0 -1
  154. package/dist/_chunks/de-owXpVluI.js +0 -62
  155. package/dist/_chunks/de-owXpVluI.js.map +0 -1
  156. package/dist/_chunks/dk-BQiTK50l.mjs +0 -86
  157. package/dist/_chunks/dk-BQiTK50l.mjs.map +0 -1
  158. package/dist/_chunks/dk-LXAnbuBk.js +0 -86
  159. package/dist/_chunks/dk-LXAnbuBk.js.map +0 -1
  160. package/dist/_chunks/en-DOHtPf-2.mjs +0 -86
  161. package/dist/_chunks/en-DOHtPf-2.mjs.map +0 -1
  162. package/dist/_chunks/en-MHo5mcsU.js +0 -86
  163. package/dist/_chunks/en-MHo5mcsU.js.map +0 -1
  164. package/dist/_chunks/es-BwLCLXAQ.js +0 -86
  165. package/dist/_chunks/es-BwLCLXAQ.js.map +0 -1
  166. package/dist/_chunks/es-DNgOVMjD.mjs +0 -86
  167. package/dist/_chunks/es-DNgOVMjD.mjs.map +0 -1
  168. package/dist/_chunks/fr-DkgRugiU.mjs +0 -50
  169. package/dist/_chunks/fr-DkgRugiU.mjs.map +0 -1
  170. package/dist/_chunks/fr-DkhpSjjm.js +0 -50
  171. package/dist/_chunks/fr-DkhpSjjm.js.map +0 -1
  172. package/dist/_chunks/id-BTemOeTZ.js +0 -62
  173. package/dist/_chunks/id-BTemOeTZ.js.map +0 -1
  174. package/dist/_chunks/id-BdEsvnaF.mjs +0 -62
  175. package/dist/_chunks/id-BdEsvnaF.mjs.map +0 -1
  176. package/dist/_chunks/index-BCw6zVHf.mjs +0 -344
  177. package/dist/_chunks/index-BCw6zVHf.mjs.map +0 -1
  178. package/dist/_chunks/index-BSJxpmc1-C5aV1Jb8.js +0 -11116
  179. package/dist/_chunks/index-BSJxpmc1-C5aV1Jb8.js.map +0 -1
  180. package/dist/_chunks/index-BSJxpmc1-Cmh4INWh.mjs +0 -11093
  181. package/dist/_chunks/index-BSJxpmc1-Cmh4INWh.mjs.map +0 -1
  182. package/dist/_chunks/index-BdOumcDH.mjs +0 -262
  183. package/dist/_chunks/index-BdOumcDH.mjs.map +0 -1
  184. package/dist/_chunks/index-BifzOY9J.mjs +0 -1142
  185. package/dist/_chunks/index-BifzOY9J.mjs.map +0 -1
  186. package/dist/_chunks/index-Bk3q4O8M.js +0 -639
  187. package/dist/_chunks/index-Bk3q4O8M.js.map +0 -1
  188. package/dist/_chunks/index-Bl-UGfZ4.js +0 -365
  189. package/dist/_chunks/index-Bl-UGfZ4.js.map +0 -1
  190. package/dist/_chunks/index-BpBvwD7E.mjs +0 -617
  191. package/dist/_chunks/index-BpBvwD7E.mjs.map +0 -1
  192. package/dist/_chunks/index-CsepshPM.mjs +0 -253
  193. package/dist/_chunks/index-CsepshPM.mjs.map +0 -1
  194. package/dist/_chunks/index-DYLqtX6g.js +0 -1171
  195. package/dist/_chunks/index-DYLqtX6g.js.map +0 -1
  196. package/dist/_chunks/index-mrTAEHgX.js +0 -252
  197. package/dist/_chunks/index-mrTAEHgX.js.map +0 -1
  198. package/dist/_chunks/index-s_b84GLl.js +0 -280
  199. package/dist/_chunks/index-s_b84GLl.js.map +0 -1
  200. package/dist/_chunks/it-B-rv0E24.mjs +0 -62
  201. package/dist/_chunks/it-B-rv0E24.mjs.map +0 -1
  202. package/dist/_chunks/it-D1rH6V6_.js +0 -62
  203. package/dist/_chunks/it-D1rH6V6_.js.map +0 -1
  204. package/dist/_chunks/ja-C8K-VBPD.mjs +0 -48
  205. package/dist/_chunks/ja-C8K-VBPD.mjs.map +0 -1
  206. package/dist/_chunks/ja-DqShgTMf.js +0 -48
  207. package/dist/_chunks/ja-DqShgTMf.js.map +0 -1
  208. package/dist/_chunks/ko-B9DGEPWH.js +0 -86
  209. package/dist/_chunks/ko-B9DGEPWH.js.map +0 -1
  210. package/dist/_chunks/ko-Busb0wIY.mjs +0 -86
  211. package/dist/_chunks/ko-Busb0wIY.mjs.map +0 -1
  212. package/dist/_chunks/ms-ByvsQjRt.mjs +0 -49
  213. package/dist/_chunks/ms-ByvsQjRt.mjs.map +0 -1
  214. package/dist/_chunks/ms-CPBU3LWf.js +0 -49
  215. package/dist/_chunks/ms-CPBU3LWf.js.map +0 -1
  216. package/dist/_chunks/nl-5qO8Rpcy.mjs +0 -48
  217. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +0 -1
  218. package/dist/_chunks/nl-CwNB6YoO.js +0 -48
  219. package/dist/_chunks/nl-CwNB6YoO.js.map +0 -1
  220. package/dist/_chunks/pl-BdIzifBE.mjs +0 -86
  221. package/dist/_chunks/pl-BdIzifBE.mjs.map +0 -1
  222. package/dist/_chunks/pl-Do9UD69f.js +0 -86
  223. package/dist/_chunks/pl-Do9UD69f.js.map +0 -1
  224. package/dist/_chunks/pt-BIO24ioG.mjs +0 -48
  225. package/dist/_chunks/pt-BIO24ioG.mjs.map +0 -1
  226. package/dist/_chunks/pt-BR-D7dZhxuP.js +0 -44
  227. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +0 -1
  228. package/dist/_chunks/pt-BR-f0p23AQZ.mjs +0 -44
  229. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +0 -1
  230. package/dist/_chunks/pt-fdvyOnUp.js +0 -48
  231. package/dist/_chunks/pt-fdvyOnUp.js.map +0 -1
  232. package/dist/_chunks/ru-C94rjPGA.js +0 -86
  233. package/dist/_chunks/ru-C94rjPGA.js.map +0 -1
  234. package/dist/_chunks/ru-VWy-IB7K.mjs +0 -86
  235. package/dist/_chunks/ru-VWy-IB7K.mjs.map +0 -1
  236. package/dist/_chunks/sk-BABEhykl.js +0 -50
  237. package/dist/_chunks/sk-BABEhykl.js.map +0 -1
  238. package/dist/_chunks/sk-B_LIcepm.mjs +0 -50
  239. package/dist/_chunks/sk-B_LIcepm.mjs.map +0 -1
  240. package/dist/_chunks/sv-ABLKOokl.mjs +0 -86
  241. package/dist/_chunks/sv-ABLKOokl.mjs.map +0 -1
  242. package/dist/_chunks/sv-Be43LhA9.js +0 -86
  243. package/dist/_chunks/sv-Be43LhA9.js.map +0 -1
  244. package/dist/_chunks/th-DKyP7ueR.mjs +0 -60
  245. package/dist/_chunks/th-DKyP7ueR.mjs.map +0 -1
  246. package/dist/_chunks/th-DgVhVLhL.js +0 -60
  247. package/dist/_chunks/th-DgVhVLhL.js.map +0 -1
  248. package/dist/_chunks/tr-B_idhkEs.js +0 -85
  249. package/dist/_chunks/tr-B_idhkEs.js.map +0 -1
  250. package/dist/_chunks/tr-qa1Q5UjC.mjs +0 -85
  251. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +0 -1
  252. package/dist/_chunks/uk-BmRqbeQc.mjs +0 -49
  253. package/dist/_chunks/uk-BmRqbeQc.mjs.map +0 -1
  254. package/dist/_chunks/uk-LHOivnhP.js +0 -49
  255. package/dist/_chunks/uk-LHOivnhP.js.map +0 -1
  256. package/dist/_chunks/vi-CdVRdKDw.js +0 -50
  257. package/dist/_chunks/vi-CdVRdKDw.js.map +0 -1
  258. package/dist/_chunks/vi-HW-EdMea.mjs +0 -50
  259. package/dist/_chunks/vi-HW-EdMea.mjs.map +0 -1
  260. package/dist/_chunks/zh-5hKkVPA4.mjs +0 -86
  261. package/dist/_chunks/zh-5hKkVPA4.mjs.map +0 -1
  262. package/dist/_chunks/zh-Cuq8gMnF.js +0 -86
  263. package/dist/_chunks/zh-Cuq8gMnF.js.map +0 -1
  264. package/dist/_chunks/zh-Hans-BHilK-yc.mjs +0 -86
  265. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +0 -1
  266. package/dist/_chunks/zh-Hans-GQDMKtY4.js +0 -86
  267. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +0 -1
  268. package/packup.config.ts +0 -22
@@ -0,0 +1,1537 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var admin = require('@strapi/strapi/admin');
6
+ var reactRouterDom = require('react-router-dom');
7
+ var index = require('./index-DAclA-0k.js');
8
+ var designSystem = require('@strapi/design-system');
9
+ var icons = require('@strapi/icons');
10
+ var formik = require('formik');
11
+ var reactIntl = require('react-intl');
12
+ var reactQuery = require('react-query');
13
+ var PropTypes = require('prop-types');
14
+ var upperFirst = require('lodash/upperFirst');
15
+ var sortBy = require('lodash/sortBy');
16
+ var get = require('lodash/get');
17
+ var styledComponents = require('styled-components');
18
+ var immer = require('immer');
19
+ var isEmpty = require('lodash/isEmpty');
20
+ var without = require('lodash/without');
21
+ var map = require('lodash/map');
22
+ var tail = require('lodash/tail');
23
+ var set = require('lodash/set');
24
+ var take = require('lodash/take');
25
+ var yup = require('yup');
26
+
27
+ function _interopNamespaceDefault(e) {
28
+ var n = Object.create(null);
29
+ if (e) {
30
+ Object.keys(e).forEach(function (k) {
31
+ if (k !== 'default') {
32
+ var d = Object.getOwnPropertyDescriptor(e, k);
33
+ Object.defineProperty(n, k, d.get ? d : {
34
+ enumerable: true,
35
+ get: function () { return e[k]; }
36
+ });
37
+ }
38
+ });
39
+ }
40
+ n.default = e;
41
+ return Object.freeze(n);
42
+ }
43
+
44
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
45
+ var yup__namespace = /*#__PURE__*/_interopNamespaceDefault(yup);
46
+
47
+ const UsersPermissions$2 = /*#__PURE__*/ React.createContext({});
48
+ const UsersPermissionsProvider = ({ children, value })=>{
49
+ return /*#__PURE__*/ jsxRuntime.jsx(UsersPermissions$2.Provider, {
50
+ value: value,
51
+ children: children
52
+ });
53
+ };
54
+ const useUsersPermissions = ()=>React.useContext(UsersPermissions$2);
55
+ UsersPermissionsProvider.propTypes = {
56
+ children: PropTypes.node.isRequired,
57
+ value: PropTypes.object.isRequired
58
+ };
59
+
60
+ function formatPluginName(pluginSlug) {
61
+ switch(pluginSlug){
62
+ case 'application':
63
+ return 'Application';
64
+ case 'plugin::content-manager':
65
+ return 'Content manager';
66
+ case 'plugin::content-type-builder':
67
+ return 'Content types builder';
68
+ case 'plugin::documentation':
69
+ return 'Documentation';
70
+ case 'plugin::email':
71
+ return 'Email';
72
+ case 'plugin::i18n':
73
+ return 'i18n';
74
+ case 'plugin::upload':
75
+ return 'Upload';
76
+ case 'plugin::users-permissions':
77
+ return 'Users-permissions';
78
+ default:
79
+ return upperFirst(pluginSlug.replace('api::', '').replace('plugin::', ''));
80
+ }
81
+ }
82
+
83
+ const init$1 = (initialState, permissions)=>{
84
+ const collapses = Object.keys(permissions).sort().map((name)=>({
85
+ name,
86
+ isOpen: false
87
+ }));
88
+ return {
89
+ ...initialState,
90
+ collapses
91
+ };
92
+ };
93
+
94
+ const activeCheckboxWrapperStyles = styledComponents.css`
95
+ background: ${(props)=>props.theme.colors.primary100};
96
+
97
+ #cog {
98
+ opacity: 1;
99
+ }
100
+ `;
101
+ const CheckboxWrapper = styledComponents.styled(designSystem.Box)`
102
+ display: flex;
103
+ justify-content: space-between;
104
+ align-items: center;
105
+
106
+ #cog {
107
+ opacity: 0;
108
+ path {
109
+ fill: ${(props)=>props.theme.colors.primary600};
110
+ }
111
+ }
112
+
113
+ /* Show active style both on hover and when the action is selected */
114
+ ${(props)=>props.isActive && activeCheckboxWrapperStyles}
115
+ &:hover {
116
+ ${activeCheckboxWrapperStyles}
117
+ }
118
+ `;
119
+
120
+ const Border = styledComponents.styled.div`
121
+ flex: 1;
122
+ align-self: center;
123
+ border-top: 1px solid ${({ theme })=>theme.colors.neutral150};
124
+ `;
125
+ const SubCategory = ({ subCategory })=>{
126
+ const { formatMessage } = reactIntl.useIntl();
127
+ const { onChange, onChangeSelectAll, onSelectedAction, selectedAction, modifiedData } = useUsersPermissions();
128
+ const currentScopedModifiedData = React.useMemo(()=>{
129
+ return get(modifiedData, subCategory.name, {});
130
+ }, [
131
+ modifiedData,
132
+ subCategory
133
+ ]);
134
+ const hasAllActionsSelected = React.useMemo(()=>{
135
+ return Object.values(currentScopedModifiedData).every((action)=>action.enabled === true);
136
+ }, [
137
+ currentScopedModifiedData
138
+ ]);
139
+ const hasSomeActionsSelected = React.useMemo(()=>{
140
+ return Object.values(currentScopedModifiedData).some((action)=>action.enabled === true) && !hasAllActionsSelected;
141
+ }, [
142
+ currentScopedModifiedData,
143
+ hasAllActionsSelected
144
+ ]);
145
+ const handleChangeSelectAll = React.useCallback(({ target: { name } })=>{
146
+ onChangeSelectAll({
147
+ target: {
148
+ name,
149
+ value: !hasAllActionsSelected
150
+ }
151
+ });
152
+ }, [
153
+ hasAllActionsSelected,
154
+ onChangeSelectAll
155
+ ]);
156
+ const isActionSelected = React.useCallback((actionName)=>{
157
+ return selectedAction === actionName;
158
+ }, [
159
+ selectedAction
160
+ ]);
161
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
162
+ children: [
163
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
164
+ justifyContent: "space-between",
165
+ alignItems: "center",
166
+ children: [
167
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
168
+ paddingRight: 4,
169
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
170
+ variant: "sigma",
171
+ textColor: "neutral600",
172
+ children: subCategory.label
173
+ })
174
+ }),
175
+ /*#__PURE__*/ jsxRuntime.jsx(Border, {}),
176
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
177
+ paddingLeft: 4,
178
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
179
+ name: subCategory.name,
180
+ checked: hasSomeActionsSelected ? 'indeterminate' : hasAllActionsSelected,
181
+ onCheckedChange: (value)=>handleChangeSelectAll({
182
+ target: {
183
+ name: subCategory.name,
184
+ value
185
+ }
186
+ }),
187
+ children: formatMessage({
188
+ id: 'app.utils.select-all',
189
+ defaultMessage: 'Select all'
190
+ })
191
+ })
192
+ })
193
+ ]
194
+ }),
195
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
196
+ paddingTop: 6,
197
+ paddingBottom: 6,
198
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
199
+ gap: 2,
200
+ style: {
201
+ flex: 1
202
+ },
203
+ children: subCategory.actions.map((action)=>{
204
+ const name = `${action.name}.enabled`;
205
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
206
+ col: 6,
207
+ direction: "column",
208
+ alignItems: "stretch",
209
+ children: /*#__PURE__*/ jsxRuntime.jsxs(CheckboxWrapper, {
210
+ isActive: isActionSelected(action.name),
211
+ padding: 2,
212
+ hasRadius: true,
213
+ children: [
214
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
215
+ checked: get(modifiedData, name, false),
216
+ name: name,
217
+ onCheckedChange: (value)=>onChange({
218
+ target: {
219
+ name,
220
+ value
221
+ }
222
+ }),
223
+ children: action.label
224
+ }),
225
+ /*#__PURE__*/ jsxRuntime.jsxs("button", {
226
+ type: "button",
227
+ onClick: ()=>onSelectedAction(action.name),
228
+ style: {
229
+ display: 'inline-flex',
230
+ alignItems: 'center'
231
+ },
232
+ children: [
233
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
234
+ tag: "span",
235
+ children: formatMessage({
236
+ id: 'app.utils.show-bound-route',
237
+ defaultMessage: 'Show bound route for {route}'
238
+ }, {
239
+ route: action.name
240
+ })
241
+ }),
242
+ /*#__PURE__*/ jsxRuntime.jsx(icons.Cog, {
243
+ id: "cog",
244
+ cursor: "pointer"
245
+ })
246
+ ]
247
+ })
248
+ ]
249
+ })
250
+ }, action.name);
251
+ })
252
+ })
253
+ })
254
+ ]
255
+ });
256
+ };
257
+ SubCategory.propTypes = {
258
+ subCategory: PropTypes.object.isRequired
259
+ };
260
+
261
+ const PermissionRow = ({ name, permissions })=>{
262
+ const subCategories = React.useMemo(()=>{
263
+ return sortBy(Object.values(permissions.controllers).reduce((acc, curr, index)=>{
264
+ const currentName = `${name}.controllers.${Object.keys(permissions.controllers)[index]}`;
265
+ const actions = sortBy(Object.keys(curr).reduce((acc, current)=>{
266
+ return [
267
+ ...acc,
268
+ {
269
+ ...curr[current],
270
+ label: current,
271
+ name: `${currentName}.${current}`
272
+ }
273
+ ];
274
+ }, []), 'label');
275
+ return [
276
+ ...acc,
277
+ {
278
+ actions,
279
+ label: Object.keys(permissions.controllers)[index],
280
+ name: currentName
281
+ }
282
+ ];
283
+ }, []), 'label');
284
+ }, [
285
+ name,
286
+ permissions
287
+ ]);
288
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
289
+ padding: 6,
290
+ children: subCategories.map((subCategory)=>/*#__PURE__*/ jsxRuntime.jsx(SubCategory, {
291
+ subCategory: subCategory
292
+ }, subCategory.name))
293
+ });
294
+ };
295
+ PermissionRow.propTypes = {
296
+ name: PropTypes.string.isRequired,
297
+ permissions: PropTypes.object.isRequired
298
+ };
299
+
300
+ const initialState$1 = {
301
+ collapses: []
302
+ };
303
+ const reducer$1 = (state, action)=>// eslint-disable-next-line consistent-return
304
+ immer.produce(state, (draftState)=>{
305
+ switch(action.type){
306
+ case 'TOGGLE_COLLAPSE':
307
+ {
308
+ draftState.collapses = state.collapses.map((collapse, index)=>{
309
+ if (index === action.index) {
310
+ return {
311
+ ...collapse,
312
+ isOpen: !collapse.isOpen
313
+ };
314
+ }
315
+ return {
316
+ ...collapse,
317
+ isOpen: false
318
+ };
319
+ });
320
+ break;
321
+ }
322
+ default:
323
+ return draftState;
324
+ }
325
+ });
326
+
327
+ const Permissions = ()=>{
328
+ const { modifiedData } = useUsersPermissions();
329
+ const { formatMessage } = reactIntl.useIntl();
330
+ const [{ collapses }] = React.useReducer(reducer$1, initialState$1, (state)=>init$1(state, modifiedData));
331
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Accordion.Root, {
332
+ size: "M",
333
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
334
+ direction: "column",
335
+ alignItems: "stretch",
336
+ gap: 1,
337
+ children: collapses.map((collapse, index)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Accordion.Item, {
338
+ value: collapse.name,
339
+ children: [
340
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Accordion.Header, {
341
+ variant: index % 2 === 0 ? 'secondary' : undefined,
342
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Accordion.Trigger, {
343
+ caretPosition: "right",
344
+ description: formatMessage({
345
+ id: 'users-permissions.Plugin.permissions.plugins.description',
346
+ defaultMessage: 'Define all allowed actions for the {name} plugin.'
347
+ }, {
348
+ name: collapse.name
349
+ }),
350
+ children: formatPluginName(collapse.name)
351
+ })
352
+ }),
353
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Accordion.Content, {
354
+ children: /*#__PURE__*/ jsxRuntime.jsx(PermissionRow, {
355
+ permissions: modifiedData[collapse.name],
356
+ name: collapse.name
357
+ })
358
+ })
359
+ ]
360
+ }, collapse.name))
361
+ })
362
+ });
363
+ };
364
+
365
+ const getMethodColor = (verb)=>{
366
+ switch(verb){
367
+ case 'POST':
368
+ {
369
+ return {
370
+ text: 'success600',
371
+ border: 'success200',
372
+ background: 'success100'
373
+ };
374
+ }
375
+ case 'GET':
376
+ {
377
+ return {
378
+ text: 'secondary600',
379
+ border: 'secondary200',
380
+ background: 'secondary100'
381
+ };
382
+ }
383
+ case 'PUT':
384
+ {
385
+ return {
386
+ text: 'warning600',
387
+ border: 'warning200',
388
+ background: 'warning100'
389
+ };
390
+ }
391
+ case 'DELETE':
392
+ {
393
+ return {
394
+ text: 'danger600',
395
+ border: 'danger200',
396
+ background: 'danger100'
397
+ };
398
+ }
399
+ default:
400
+ {
401
+ return {
402
+ text: 'neutral600',
403
+ border: 'neutral200',
404
+ background: 'neutral100'
405
+ };
406
+ }
407
+ }
408
+ };
409
+
410
+ const MethodBox = styledComponents.styled(designSystem.Box)`
411
+ margin: -1px;
412
+ border-radius: ${({ theme })=>theme.spaces[1]} 0 0 ${({ theme })=>theme.spaces[1]};
413
+ `;
414
+ function BoundRoute({ route }) {
415
+ const { formatMessage } = reactIntl.useIntl();
416
+ const { method, handler: title, path } = route;
417
+ const formattedRoute = path ? tail(path.split('/')) : [];
418
+ const [controller = '', action = ''] = title ? title.split('.') : [];
419
+ const colors = getMethodColor(route.method);
420
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
421
+ direction: "column",
422
+ alignItems: "stretch",
423
+ gap: 2,
424
+ children: [
425
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
426
+ variant: "delta",
427
+ tag: "h3",
428
+ children: [
429
+ formatMessage({
430
+ id: 'users-permissions.BoundRoute.title',
431
+ defaultMessage: 'Bound route to'
432
+ }),
433
+ " ",
434
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
435
+ children: controller
436
+ }),
437
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
438
+ variant: "delta",
439
+ textColor: "primary600",
440
+ children: [
441
+ ".",
442
+ action
443
+ ]
444
+ })
445
+ ]
446
+ }),
447
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
448
+ hasRadius: true,
449
+ background: "neutral0",
450
+ borderColor: "neutral200",
451
+ gap: 0,
452
+ children: [
453
+ /*#__PURE__*/ jsxRuntime.jsx(MethodBox, {
454
+ background: colors.background,
455
+ borderColor: colors.border,
456
+ padding: 2,
457
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
458
+ fontWeight: "bold",
459
+ textColor: colors.text,
460
+ children: method
461
+ })
462
+ }),
463
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
464
+ paddingLeft: 2,
465
+ paddingRight: 2,
466
+ children: map(formattedRoute, (value)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
467
+ textColor: value.includes(':') ? 'neutral600' : 'neutral900',
468
+ children: [
469
+ "/",
470
+ value
471
+ ]
472
+ }, value))
473
+ })
474
+ ]
475
+ })
476
+ ]
477
+ });
478
+ }
479
+ BoundRoute.defaultProps = {
480
+ route: {
481
+ handler: 'Nocontroller.error',
482
+ method: 'GET',
483
+ path: '/there-is-no-path'
484
+ }
485
+ };
486
+ BoundRoute.propTypes = {
487
+ route: PropTypes.shape({
488
+ handler: PropTypes.string,
489
+ method: PropTypes.string,
490
+ path: PropTypes.string
491
+ })
492
+ };
493
+
494
+ const Policies = ()=>{
495
+ const { formatMessage } = reactIntl.useIntl();
496
+ const { selectedAction, routes } = useUsersPermissions();
497
+ const path = without(selectedAction.split('.'), 'controllers');
498
+ const controllerRoutes = get(routes, path[0]);
499
+ const pathResolved = path.slice(1).join('.');
500
+ const displayedRoutes = isEmpty(controllerRoutes) ? [] : controllerRoutes.filter((o)=>o.handler.endsWith(pathResolved));
501
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
502
+ col: 5,
503
+ background: "neutral150",
504
+ paddingTop: 6,
505
+ paddingBottom: 6,
506
+ paddingLeft: 7,
507
+ paddingRight: 7,
508
+ style: {
509
+ minHeight: '100%'
510
+ },
511
+ direction: "column",
512
+ alignItems: "stretch",
513
+ children: selectedAction ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
514
+ direction: "column",
515
+ alignItems: "stretch",
516
+ gap: 2,
517
+ children: displayedRoutes.map((route, key)=>// eslint-disable-next-line react/no-array-index-key
518
+ /*#__PURE__*/ jsxRuntime.jsx(BoundRoute, {
519
+ route: route
520
+ }, key))
521
+ }) : /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
522
+ direction: "column",
523
+ alignItems: "stretch",
524
+ gap: 2,
525
+ children: [
526
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
527
+ variant: "delta",
528
+ tag: "h3",
529
+ children: formatMessage({
530
+ id: 'users-permissions.Policies.header.title',
531
+ defaultMessage: 'Advanced settings'
532
+ })
533
+ }),
534
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
535
+ tag: "p",
536
+ textColor: "neutral600",
537
+ children: formatMessage({
538
+ id: 'users-permissions.Policies.header.hint',
539
+ defaultMessage: "Select the application's actions or the plugin's actions and click on the cog icon to display the bound route"
540
+ })
541
+ })
542
+ ]
543
+ })
544
+ });
545
+ };
546
+
547
+ const init = (state, permissions, routes)=>{
548
+ return {
549
+ ...state,
550
+ initialData: permissions,
551
+ modifiedData: permissions,
552
+ routes
553
+ };
554
+ };
555
+
556
+ const initialState = {
557
+ initialData: {},
558
+ modifiedData: {},
559
+ routes: {},
560
+ selectedAction: '',
561
+ policies: []
562
+ };
563
+ const reducer = (state, action)=>immer.produce(state, (draftState)=>{
564
+ switch(action.type){
565
+ case 'ON_CHANGE':
566
+ {
567
+ const keysLength = action.keys.length;
568
+ const isChangingCheckbox = action.keys[keysLength - 1] === 'enabled';
569
+ if (action.value && isChangingCheckbox) {
570
+ const selectedAction = take(action.keys, keysLength - 1).join('.');
571
+ draftState.selectedAction = selectedAction;
572
+ }
573
+ set(draftState, [
574
+ 'modifiedData',
575
+ ...action.keys
576
+ ], action.value);
577
+ break;
578
+ }
579
+ case 'ON_CHANGE_SELECT_ALL':
580
+ {
581
+ const pathToValue = [
582
+ 'modifiedData',
583
+ ...action.keys
584
+ ];
585
+ const oldValues = get(state, pathToValue, {});
586
+ const updatedValues = Object.keys(oldValues).reduce((acc, current)=>{
587
+ acc[current] = {
588
+ ...oldValues[current],
589
+ enabled: action.value
590
+ };
591
+ return acc;
592
+ }, {});
593
+ set(draftState, pathToValue, updatedValues);
594
+ break;
595
+ }
596
+ case 'ON_RESET':
597
+ {
598
+ draftState.modifiedData = state.initialData;
599
+ break;
600
+ }
601
+ case 'ON_SUBMIT_SUCCEEDED':
602
+ {
603
+ draftState.initialData = state.modifiedData;
604
+ break;
605
+ }
606
+ case 'SELECT_ACTION':
607
+ {
608
+ const { actionToSelect } = action;
609
+ draftState.selectedAction = actionToSelect === state.selectedAction ? '' : actionToSelect;
610
+ break;
611
+ }
612
+ default:
613
+ return draftState;
614
+ }
615
+ });
616
+
617
+ const UsersPermissions = /*#__PURE__*/ React.forwardRef(({ permissions, routes }, ref)=>{
618
+ const { formatMessage } = reactIntl.useIntl();
619
+ const [state, dispatch] = React.useReducer(reducer, initialState, (state)=>init(state, permissions, routes));
620
+ React.useImperativeHandle(ref, ()=>({
621
+ getPermissions () {
622
+ return {
623
+ permissions: state.modifiedData
624
+ };
625
+ },
626
+ resetForm () {
627
+ dispatch({
628
+ type: 'ON_RESET'
629
+ });
630
+ },
631
+ setFormAfterSubmit () {
632
+ dispatch({
633
+ type: 'ON_SUBMIT_SUCCEEDED'
634
+ });
635
+ }
636
+ }));
637
+ const handleChange = ({ target: { name, value } })=>dispatch({
638
+ type: 'ON_CHANGE',
639
+ keys: name.split('.'),
640
+ value: value === 'empty__string_value' ? '' : value
641
+ });
642
+ const handleChangeSelectAll = ({ target: { name, value } })=>dispatch({
643
+ type: 'ON_CHANGE_SELECT_ALL',
644
+ keys: name.split('.'),
645
+ value
646
+ });
647
+ const handleSelectedAction = (actionToSelect)=>dispatch({
648
+ type: 'SELECT_ACTION',
649
+ actionToSelect
650
+ });
651
+ const providerValue = {
652
+ ...state,
653
+ onChange: handleChange,
654
+ onChangeSelectAll: handleChangeSelectAll,
655
+ onSelectedAction: handleSelectedAction
656
+ };
657
+ return /*#__PURE__*/ jsxRuntime.jsx(UsersPermissionsProvider, {
658
+ value: providerValue,
659
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Root, {
660
+ gap: 0,
661
+ shadow: "filterShadow",
662
+ hasRadius: true,
663
+ background: "neutral0",
664
+ children: [
665
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
666
+ col: 7,
667
+ paddingTop: 6,
668
+ paddingBottom: 6,
669
+ paddingLeft: 7,
670
+ paddingRight: 7,
671
+ direction: "column",
672
+ alignItems: "stretch",
673
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
674
+ direction: "column",
675
+ alignItems: "stretch",
676
+ gap: 6,
677
+ children: [
678
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
679
+ direction: "column",
680
+ alignItems: "stretch",
681
+ gap: 2,
682
+ children: [
683
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
684
+ variant: "delta",
685
+ tag: "h2",
686
+ children: formatMessage({
687
+ id: index.getTrad('Plugins.header.title'),
688
+ defaultMessage: 'Permissions'
689
+ })
690
+ }),
691
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
692
+ tag: "p",
693
+ textColor: "neutral600",
694
+ children: formatMessage({
695
+ id: index.getTrad('Plugins.header.description'),
696
+ defaultMessage: 'Only actions bound by a route are listed below.'
697
+ })
698
+ })
699
+ ]
700
+ }),
701
+ /*#__PURE__*/ jsxRuntime.jsx(Permissions, {})
702
+ ]
703
+ })
704
+ }),
705
+ /*#__PURE__*/ jsxRuntime.jsx(Policies, {})
706
+ ]
707
+ })
708
+ });
709
+ });
710
+ UsersPermissions.propTypes = {
711
+ permissions: PropTypes.object.isRequired,
712
+ routes: PropTypes.object.isRequired
713
+ };
714
+ var UsersPermissions$1 = /*#__PURE__*/ React.memo(UsersPermissions);
715
+
716
+ const createRoleSchema = yup__namespace.object().shape({
717
+ name: yup__namespace.string().required(admin.translatedErrors.required.id),
718
+ description: yup__namespace.string().required(admin.translatedErrors.required.id)
719
+ });
720
+
721
+ const cleanPermissions = (permissions)=>Object.keys(permissions).reduce((acc, current)=>{
722
+ const currentPermission = permissions[current].controllers;
723
+ const cleanedControllers = Object.keys(currentPermission).reduce((acc2, curr)=>{
724
+ if (isEmpty(currentPermission[curr])) {
725
+ return acc2;
726
+ }
727
+ acc2[curr] = currentPermission[curr];
728
+ return acc2;
729
+ }, {});
730
+ if (isEmpty(cleanedControllers)) {
731
+ return acc;
732
+ }
733
+ acc[current] = {
734
+ controllers: cleanedControllers
735
+ };
736
+ return acc;
737
+ }, {});
738
+
739
+ const usePlugins = ()=>{
740
+ const { toggleNotification } = admin.useNotification();
741
+ const { get } = admin.useFetchClient();
742
+ const { formatAPIError } = admin.useAPIErrorHandler(index.getTrad);
743
+ const [{ data: permissions, isLoading: isLoadingPermissions, error: permissionsError, refetch: refetchPermissions }, { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes }] = reactQuery.useQueries([
744
+ {
745
+ queryKey: [
746
+ 'users-permissions',
747
+ 'permissions'
748
+ ],
749
+ async queryFn () {
750
+ const { data: { permissions } } = await get(`/users-permissions/permissions`);
751
+ return permissions;
752
+ }
753
+ },
754
+ {
755
+ queryKey: [
756
+ 'users-permissions',
757
+ 'routes'
758
+ ],
759
+ async queryFn () {
760
+ const { data: { routes } } = await get(`/users-permissions/routes`);
761
+ return routes;
762
+ }
763
+ }
764
+ ]);
765
+ const refetchQueries = async ()=>{
766
+ await Promise.all([
767
+ refetchPermissions(),
768
+ refetchRoutes()
769
+ ]);
770
+ };
771
+ React.useEffect(()=>{
772
+ if (permissionsError) {
773
+ toggleNotification({
774
+ type: 'danger',
775
+ message: formatAPIError(permissionsError)
776
+ });
777
+ }
778
+ }, [
779
+ toggleNotification,
780
+ permissionsError,
781
+ formatAPIError
782
+ ]);
783
+ React.useEffect(()=>{
784
+ if (routesError) {
785
+ toggleNotification({
786
+ type: 'danger',
787
+ message: formatAPIError(routesError)
788
+ });
789
+ }
790
+ }, [
791
+ toggleNotification,
792
+ routesError,
793
+ formatAPIError
794
+ ]);
795
+ const isLoading = isLoadingPermissions || isLoadingRoutes;
796
+ return {
797
+ // TODO: these return values need to be memoized, otherwise
798
+ // they will create infinite rendering loops when used as
799
+ // effect dependencies
800
+ permissions: permissions ? cleanPermissions(permissions) : {},
801
+ routes: routes ?? {},
802
+ getData: refetchQueries,
803
+ isLoading
804
+ };
805
+ };
806
+
807
+ const CreatePage = ()=>{
808
+ const { formatMessage } = reactIntl.useIntl();
809
+ const { toggleNotification } = admin.useNotification();
810
+ const navigate = reactRouterDom.useNavigate();
811
+ const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();
812
+ const { trackUsage } = admin.useTracking();
813
+ const permissionsRef = React__namespace.useRef();
814
+ const { post } = admin.useFetchClient();
815
+ const mutation = reactQuery.useMutation((body)=>post(`/users-permissions/roles`, body), {
816
+ onError () {
817
+ toggleNotification({
818
+ type: 'danger',
819
+ message: formatMessage({
820
+ id: 'notification.error',
821
+ defaultMessage: 'An error occurred'
822
+ })
823
+ });
824
+ },
825
+ onSuccess () {
826
+ trackUsage('didCreateRole');
827
+ toggleNotification({
828
+ type: 'success',
829
+ message: formatMessage({
830
+ id: index.getTrad('Settings.roles.created'),
831
+ defaultMessage: 'Role created'
832
+ })
833
+ });
834
+ // Forcing redirecting since we don't have the id in the response
835
+ navigate(-1);
836
+ }
837
+ });
838
+ const handleCreateRoleSubmit = async (data)=>{
839
+ // TODO: refactor. Child -> parent component communication is evil;
840
+ // We should either move the provider one level up or move the state
841
+ // straight into redux.
842
+ const permissions = permissionsRef.current.getPermissions();
843
+ await mutation.mutate({
844
+ ...data,
845
+ ...permissions,
846
+ users: []
847
+ });
848
+ };
849
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Main, {
850
+ children: [
851
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Title, {
852
+ children: formatMessage({
853
+ id: 'Settings.PageTitle',
854
+ defaultMessage: 'Settings - {name}'
855
+ }, {
856
+ name: 'Roles'
857
+ })
858
+ }),
859
+ /*#__PURE__*/ jsxRuntime.jsx(formik.Formik, {
860
+ enableReinitialize: true,
861
+ initialValues: {
862
+ name: '',
863
+ description: ''
864
+ },
865
+ onSubmit: handleCreateRoleSubmit,
866
+ validationSchema: createRoleSchema,
867
+ children: ({ handleSubmit, values, handleChange, errors })=>/*#__PURE__*/ jsxRuntime.jsxs(formik.Form, {
868
+ noValidate: true,
869
+ onSubmit: handleSubmit,
870
+ children: [
871
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Header, {
872
+ primaryAction: !isLoadingPlugins && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
873
+ type: "submit",
874
+ loading: mutation.isLoading,
875
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {}),
876
+ children: formatMessage({
877
+ id: 'global.save',
878
+ defaultMessage: 'Save'
879
+ })
880
+ }),
881
+ title: formatMessage({
882
+ id: 'Settings.roles.create.title',
883
+ defaultMessage: 'Create a role'
884
+ }),
885
+ subtitle: formatMessage({
886
+ id: 'Settings.roles.create.description',
887
+ defaultMessage: 'Define the rights given to the role'
888
+ })
889
+ }),
890
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Content, {
891
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
892
+ background: "neutral0",
893
+ direction: "column",
894
+ alignItems: "stretch",
895
+ gap: 7,
896
+ hasRadius: true,
897
+ paddingTop: 6,
898
+ paddingBottom: 6,
899
+ paddingLeft: 7,
900
+ paddingRight: 7,
901
+ shadow: "filterShadow",
902
+ children: [
903
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
904
+ direction: "column",
905
+ alignItems: "stretch",
906
+ children: [
907
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
908
+ variant: "delta",
909
+ tag: "h2",
910
+ children: formatMessage({
911
+ id: index.getTrad('EditPage.form.roles'),
912
+ defaultMessage: 'Role details'
913
+ })
914
+ }),
915
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Root, {
916
+ gap: 4,
917
+ children: [
918
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
919
+ col: 6,
920
+ direction: "column",
921
+ alignItems: "stretch",
922
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
923
+ name: "name",
924
+ error: errors?.name ? formatMessage({
925
+ id: errors.name,
926
+ defaultMessage: 'Name is required'
927
+ }) : false,
928
+ required: true,
929
+ children: [
930
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
931
+ children: formatMessage({
932
+ id: 'global.name',
933
+ defaultMessage: 'Name'
934
+ })
935
+ }),
936
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextInput, {
937
+ value: values.name || '',
938
+ onChange: handleChange
939
+ }),
940
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {})
941
+ ]
942
+ })
943
+ }),
944
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
945
+ col: 6,
946
+ direction: "column",
947
+ alignItems: "stretch",
948
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
949
+ name: "description",
950
+ error: errors?.description ? formatMessage({
951
+ id: errors.description,
952
+ defaultMessage: 'Description is required'
953
+ }) : false,
954
+ required: true,
955
+ children: [
956
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
957
+ children: formatMessage({
958
+ id: 'global.description',
959
+ defaultMessage: 'Description'
960
+ })
961
+ }),
962
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Textarea, {
963
+ value: values.description || '',
964
+ onChange: handleChange
965
+ }),
966
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {})
967
+ ]
968
+ })
969
+ })
970
+ ]
971
+ })
972
+ ]
973
+ }),
974
+ !isLoadingPlugins && /*#__PURE__*/ jsxRuntime.jsx(UsersPermissions$1, {
975
+ ref: permissionsRef,
976
+ permissions: permissions,
977
+ routes: routes
978
+ })
979
+ ]
980
+ })
981
+ })
982
+ ]
983
+ })
984
+ })
985
+ ]
986
+ });
987
+ };
988
+ const ProtectedRolesCreatePage = ()=>/*#__PURE__*/ jsxRuntime.jsx(admin.Page.Protect, {
989
+ permissions: index.PERMISSIONS.createRole,
990
+ children: /*#__PURE__*/ jsxRuntime.jsx(CreatePage, {})
991
+ });
992
+
993
+ const EditPage = ()=>{
994
+ const { formatMessage } = reactIntl.useIntl();
995
+ const { toggleNotification } = admin.useNotification();
996
+ const { params: { id } } = reactRouterDom.useMatch(`/settings/users-permissions/roles/:id`);
997
+ const { get } = admin.useFetchClient();
998
+ const { isLoading: isLoadingPlugins, routes } = usePlugins();
999
+ const { data: role, isLoading: isLoadingRole, refetch: refetchRole } = reactQuery.useQuery([
1000
+ 'users-permissions',
1001
+ 'role',
1002
+ id
1003
+ ], async ()=>{
1004
+ // TODO: why doesn't this endpoint follow the admin API conventions?
1005
+ const { data: { role } } = await get(`/users-permissions/roles/${id}`);
1006
+ return role;
1007
+ });
1008
+ const permissionsRef = React__namespace.useRef();
1009
+ const { put } = admin.useFetchClient();
1010
+ const { formatAPIError } = admin.useAPIErrorHandler();
1011
+ const mutation = reactQuery.useMutation((body)=>put(`/users-permissions/roles/${id}`, body), {
1012
+ onError (error) {
1013
+ toggleNotification({
1014
+ type: 'danger',
1015
+ message: formatAPIError(error)
1016
+ });
1017
+ },
1018
+ async onSuccess () {
1019
+ toggleNotification({
1020
+ type: 'success',
1021
+ message: formatMessage({
1022
+ id: index.getTrad('Settings.roles.created'),
1023
+ defaultMessage: 'Role edited'
1024
+ })
1025
+ });
1026
+ await refetchRole();
1027
+ }
1028
+ });
1029
+ const handleEditRoleSubmit = async (data)=>{
1030
+ const permissions = permissionsRef.current.getPermissions();
1031
+ await mutation.mutate({
1032
+ ...data,
1033
+ ...permissions,
1034
+ users: []
1035
+ });
1036
+ };
1037
+ if (isLoadingRole) {
1038
+ return /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Loading, {});
1039
+ }
1040
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Main, {
1041
+ children: [
1042
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Title, {
1043
+ children: formatMessage({
1044
+ id: 'Settings.PageTitle',
1045
+ defaultMessage: 'Settings - {name}'
1046
+ }, {
1047
+ name: 'Roles'
1048
+ })
1049
+ }),
1050
+ /*#__PURE__*/ jsxRuntime.jsx(formik.Formik, {
1051
+ enableReinitialize: true,
1052
+ initialValues: {
1053
+ name: role.name,
1054
+ description: role.description
1055
+ },
1056
+ onSubmit: handleEditRoleSubmit,
1057
+ validationSchema: createRoleSchema,
1058
+ children: ({ handleSubmit, values, handleChange, errors })=>/*#__PURE__*/ jsxRuntime.jsxs(formik.Form, {
1059
+ noValidate: true,
1060
+ onSubmit: handleSubmit,
1061
+ children: [
1062
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Header, {
1063
+ primaryAction: !isLoadingPlugins ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
1064
+ disabled: role.code === 'strapi-super-admin',
1065
+ type: "submit",
1066
+ loading: mutation.isLoading,
1067
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {}),
1068
+ children: formatMessage({
1069
+ id: 'global.save',
1070
+ defaultMessage: 'Save'
1071
+ })
1072
+ }) : null,
1073
+ title: role.name,
1074
+ subtitle: role.description,
1075
+ navigationAction: /*#__PURE__*/ jsxRuntime.jsx(admin.BackButton, {
1076
+ fallback: ".."
1077
+ })
1078
+ }),
1079
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Content, {
1080
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
1081
+ background: "neutral0",
1082
+ direction: "column",
1083
+ alignItems: "stretch",
1084
+ gap: 7,
1085
+ hasRadius: true,
1086
+ paddingTop: 6,
1087
+ paddingBottom: 6,
1088
+ paddingLeft: 7,
1089
+ paddingRight: 7,
1090
+ shadow: "filterShadow",
1091
+ children: [
1092
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
1093
+ direction: "column",
1094
+ alignItems: "stretch",
1095
+ gap: 4,
1096
+ children: [
1097
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1098
+ variant: "delta",
1099
+ tag: "h2",
1100
+ children: formatMessage({
1101
+ id: index.getTrad('EditPage.form.roles'),
1102
+ defaultMessage: 'Role details'
1103
+ })
1104
+ }),
1105
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Root, {
1106
+ gap: 4,
1107
+ children: [
1108
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
1109
+ col: 6,
1110
+ direction: "column",
1111
+ alignItems: "stretch",
1112
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
1113
+ name: "name",
1114
+ error: errors?.name ? formatMessage({
1115
+ id: errors.name,
1116
+ defaultMessage: 'Name is required'
1117
+ }) : false,
1118
+ required: true,
1119
+ children: [
1120
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
1121
+ children: formatMessage({
1122
+ id: 'global.name',
1123
+ defaultMessage: 'Name'
1124
+ })
1125
+ }),
1126
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextInput, {
1127
+ value: values.name || '',
1128
+ onChange: handleChange
1129
+ }),
1130
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {})
1131
+ ]
1132
+ })
1133
+ }),
1134
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
1135
+ col: 6,
1136
+ direction: "column",
1137
+ alignItems: "stretch",
1138
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
1139
+ name: "description",
1140
+ error: errors?.description ? formatMessage({
1141
+ id: errors.description,
1142
+ defaultMessage: 'Description is required'
1143
+ }) : false,
1144
+ required: true,
1145
+ children: [
1146
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
1147
+ children: formatMessage({
1148
+ id: 'global.description',
1149
+ defaultMessage: 'Description'
1150
+ })
1151
+ }),
1152
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Textarea, {
1153
+ value: values.description || '',
1154
+ onChange: handleChange
1155
+ }),
1156
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {})
1157
+ ]
1158
+ })
1159
+ })
1160
+ ]
1161
+ })
1162
+ ]
1163
+ }),
1164
+ !isLoadingPlugins && /*#__PURE__*/ jsxRuntime.jsx(UsersPermissions$1, {
1165
+ ref: permissionsRef,
1166
+ permissions: role.permissions,
1167
+ routes: routes
1168
+ })
1169
+ ]
1170
+ })
1171
+ })
1172
+ ]
1173
+ })
1174
+ })
1175
+ ]
1176
+ });
1177
+ };
1178
+ const ProtectedRolesEditPage = ()=>/*#__PURE__*/ jsxRuntime.jsx(admin.Page.Protect, {
1179
+ permissions: index.PERMISSIONS.updateRole,
1180
+ children: /*#__PURE__*/ jsxRuntime.jsx(EditPage, {})
1181
+ });
1182
+
1183
+ const EditLink = styledComponents.styled(designSystem.Link)`
1184
+ align-items: center;
1185
+ height: 3.2rem;
1186
+ width: 3.2rem;
1187
+ display: flex;
1188
+ justify-content: center;
1189
+ padding: ${({ theme })=>`${theme.spaces[2]}`};
1190
+
1191
+ svg {
1192
+ height: 1.6rem;
1193
+ width: 1.6rem;
1194
+
1195
+ path {
1196
+ fill: ${({ theme })=>theme.colors.neutral500};
1197
+ }
1198
+ }
1199
+
1200
+ &:hover,
1201
+ &:focus {
1202
+ svg {
1203
+ path {
1204
+ fill: ${({ theme })=>theme.colors.neutral800};
1205
+ }
1206
+ }
1207
+ }
1208
+ `;
1209
+ const TableBody = ({ sortedRoles, canDelete, canUpdate, setRoleToDelete, onDelete })=>{
1210
+ const { formatMessage } = reactIntl.useIntl();
1211
+ const navigate = reactRouterDom.useNavigate();
1212
+ const [showConfirmDelete, setShowConfirmDelete] = onDelete;
1213
+ const checkCanDeleteRole = (role)=>canDelete && ![
1214
+ 'public',
1215
+ 'authenticated'
1216
+ ].includes(role.type);
1217
+ const handleClickDelete = (id)=>{
1218
+ setRoleToDelete(id);
1219
+ setShowConfirmDelete(!showConfirmDelete);
1220
+ };
1221
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tbody, {
1222
+ children: sortedRoles?.map((role)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Tr, {
1223
+ cursor: "pointer",
1224
+ onClick: ()=>navigate(role.id.toString()),
1225
+ children: [
1226
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
1227
+ width: "20%",
1228
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1229
+ children: role.name
1230
+ })
1231
+ }),
1232
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
1233
+ width: "50%",
1234
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1235
+ children: role.description
1236
+ })
1237
+ }),
1238
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
1239
+ width: "30%",
1240
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1241
+ children: formatMessage({
1242
+ id: 'Roles.RoleRow.user-count',
1243
+ defaultMessage: '{number, plural, =0 {# user} one {# user} other {# users}}'
1244
+ }, {
1245
+ number: role.nb_users
1246
+ })
1247
+ })
1248
+ }),
1249
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
1250
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
1251
+ justifyContent: "end",
1252
+ onClick: (e)=>e.stopPropagation(),
1253
+ children: [
1254
+ canUpdate ? /*#__PURE__*/ jsxRuntime.jsx(EditLink, {
1255
+ tag: reactRouterDom.NavLink,
1256
+ to: role.id.toString(),
1257
+ "aria-label": formatMessage({
1258
+ id: 'app.component.table.edit',
1259
+ defaultMessage: 'Edit {target}'
1260
+ }, {
1261
+ target: `${role.name}`
1262
+ }),
1263
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Pencil, {})
1264
+ }) : null,
1265
+ checkCanDeleteRole(role) && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
1266
+ onClick: ()=>handleClickDelete(role.id.toString()),
1267
+ variant: "ghost",
1268
+ label: formatMessage({
1269
+ id: 'global.delete-target',
1270
+ defaultMessage: 'Delete {target}'
1271
+ }, {
1272
+ target: `${role.name}`
1273
+ }),
1274
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {})
1275
+ })
1276
+ ]
1277
+ })
1278
+ })
1279
+ ]
1280
+ }, role.name))
1281
+ });
1282
+ };
1283
+ TableBody.defaultProps = {
1284
+ canDelete: false,
1285
+ canUpdate: false
1286
+ };
1287
+ TableBody.propTypes = {
1288
+ onDelete: PropTypes.array.isRequired,
1289
+ setRoleToDelete: PropTypes.func.isRequired,
1290
+ sortedRoles: PropTypes.array.isRequired,
1291
+ canDelete: PropTypes.bool,
1292
+ canUpdate: PropTypes.bool
1293
+ };
1294
+
1295
+ const RolesListPage = ()=>{
1296
+ const { trackUsage } = admin.useTracking();
1297
+ const { formatMessage, locale } = reactIntl.useIntl();
1298
+ const { toggleNotification } = admin.useNotification();
1299
+ const { notifyStatus } = designSystem.useNotifyAT();
1300
+ const [{ query }] = admin.useQueryParams();
1301
+ const _q = query?._q || '';
1302
+ const [showConfirmDelete, setShowConfirmDelete] = React.useState(false);
1303
+ const [roleToDelete, setRoleToDelete] = React.useState();
1304
+ const { del, get } = admin.useFetchClient();
1305
+ const { isLoading: isLoadingForPermissions, allowedActions: { canRead, canDelete, canCreate, canUpdate } } = admin.useRBAC({
1306
+ create: index.PERMISSIONS.createRole,
1307
+ read: index.PERMISSIONS.readRoles,
1308
+ update: index.PERMISSIONS.updateRole,
1309
+ delete: index.PERMISSIONS.deleteRole
1310
+ });
1311
+ const { isLoading: isLoadingForData, data: { roles }, isFetching, refetch } = reactQuery.useQuery('get-roles', ()=>fetchData(toggleNotification, formatMessage, notifyStatus), {
1312
+ initialData: {},
1313
+ enabled: canRead
1314
+ });
1315
+ const { contains } = designSystem.useFilter(locale, {
1316
+ sensitivity: 'base'
1317
+ });
1318
+ /**
1319
+ * @type {Intl.Collator}
1320
+ */ const formatter = designSystem.useCollator(locale, {
1321
+ sensitivity: 'base'
1322
+ });
1323
+ const isLoading = isLoadingForData || isFetching || isLoadingForPermissions;
1324
+ const handleShowConfirmDelete = ()=>{
1325
+ setShowConfirmDelete(!showConfirmDelete);
1326
+ };
1327
+ const deleteData = async (id, formatMessage, toggleNotification)=>{
1328
+ try {
1329
+ await del(`/users-permissions/roles/${id}`);
1330
+ } catch (error) {
1331
+ toggleNotification({
1332
+ type: 'danger',
1333
+ message: formatMessage({
1334
+ id: 'notification.error',
1335
+ defaultMessage: 'An error occured'
1336
+ })
1337
+ });
1338
+ }
1339
+ };
1340
+ const fetchData = async (toggleNotification, formatMessage, notifyStatus)=>{
1341
+ try {
1342
+ const { data } = await get('/users-permissions/roles');
1343
+ notifyStatus('The roles have loaded successfully');
1344
+ return data;
1345
+ } catch (err) {
1346
+ toggleNotification({
1347
+ type: 'danger',
1348
+ message: formatMessage({
1349
+ id: 'notification.error',
1350
+ defaultMessage: 'An error occurred'
1351
+ })
1352
+ });
1353
+ throw new Error(err);
1354
+ }
1355
+ };
1356
+ const emptyLayout = {
1357
+ roles: {
1358
+ id: index.getTrad('Roles.empty'),
1359
+ defaultMessage: "You don't have any roles yet."
1360
+ },
1361
+ search: {
1362
+ id: index.getTrad('Roles.empty.search'),
1363
+ defaultMessage: 'No roles match the search.'
1364
+ }
1365
+ };
1366
+ const pageTitle = formatMessage({
1367
+ id: 'global.roles',
1368
+ defaultMessage: 'Roles'
1369
+ });
1370
+ const deleteMutation = reactQuery.useMutation((id)=>deleteData(id, formatMessage, toggleNotification), {
1371
+ async onSuccess () {
1372
+ await refetch();
1373
+ }
1374
+ });
1375
+ const handleConfirmDelete = async ()=>{
1376
+ await deleteMutation.mutateAsync(roleToDelete);
1377
+ setShowConfirmDelete(!showConfirmDelete);
1378
+ };
1379
+ const sortedRoles = (roles || []).filter((role)=>contains(role.name, _q) || contains(role.description, _q)).sort((a, b)=>formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description));
1380
+ const emptyContent = _q && !sortedRoles.length ? 'search' : 'roles';
1381
+ const colCount = 4;
1382
+ const rowCount = (roles?.length || 0) + 1;
1383
+ if (isLoading) {
1384
+ return /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Loading, {});
1385
+ }
1386
+ return /*#__PURE__*/ jsxRuntime.jsxs(admin.Layouts.Root, {
1387
+ children: [
1388
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Title, {
1389
+ children: formatMessage({
1390
+ id: 'Settings.PageTitle',
1391
+ defaultMessage: 'Settings - {name}'
1392
+ }, {
1393
+ name: pageTitle
1394
+ })
1395
+ }),
1396
+ /*#__PURE__*/ jsxRuntime.jsxs(admin.Page.Main, {
1397
+ children: [
1398
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Header, {
1399
+ title: formatMessage({
1400
+ id: 'global.roles',
1401
+ defaultMessage: 'Roles'
1402
+ }),
1403
+ subtitle: formatMessage({
1404
+ id: 'Settings.roles.list.description',
1405
+ defaultMessage: 'List of roles'
1406
+ }),
1407
+ primaryAction: canCreate ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
1408
+ to: "new",
1409
+ tag: reactRouterDom.NavLink,
1410
+ onClick: ()=>trackUsage('willCreateRole'),
1411
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Plus, {}),
1412
+ size: "S",
1413
+ children: formatMessage({
1414
+ id: index.getTrad('List.button.roles'),
1415
+ defaultMessage: 'Add new role'
1416
+ })
1417
+ }) : null
1418
+ }),
1419
+ /*#__PURE__*/ jsxRuntime.jsx(admin.Layouts.Action, {
1420
+ startActions: /*#__PURE__*/ jsxRuntime.jsx(admin.SearchInput, {
1421
+ label: formatMessage({
1422
+ id: 'app.component.search.label',
1423
+ defaultMessage: 'Search'
1424
+ })
1425
+ })
1426
+ }),
1427
+ /*#__PURE__*/ jsxRuntime.jsxs(admin.Layouts.Content, {
1428
+ children: [
1429
+ !canRead && /*#__PURE__*/ jsxRuntime.jsx(admin.Page.NoPermissions, {}),
1430
+ canRead && sortedRoles && sortedRoles?.length ? /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Table, {
1431
+ colCount: colCount,
1432
+ rowCount: rowCount,
1433
+ children: [
1434
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Thead, {
1435
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Tr, {
1436
+ children: [
1437
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
1438
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1439
+ variant: "sigma",
1440
+ textColor: "neutral600",
1441
+ children: formatMessage({
1442
+ id: 'global.name',
1443
+ defaultMessage: 'Name'
1444
+ })
1445
+ })
1446
+ }),
1447
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
1448
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1449
+ variant: "sigma",
1450
+ textColor: "neutral600",
1451
+ children: formatMessage({
1452
+ id: 'global.description',
1453
+ defaultMessage: 'Description'
1454
+ })
1455
+ })
1456
+ }),
1457
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
1458
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1459
+ variant: "sigma",
1460
+ textColor: "neutral600",
1461
+ children: formatMessage({
1462
+ id: 'global.users',
1463
+ defaultMessage: 'Users'
1464
+ })
1465
+ })
1466
+ }),
1467
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
1468
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
1469
+ children: formatMessage({
1470
+ id: 'global.actions',
1471
+ defaultMessage: 'Actions'
1472
+ })
1473
+ })
1474
+ })
1475
+ ]
1476
+ })
1477
+ }),
1478
+ /*#__PURE__*/ jsxRuntime.jsx(TableBody, {
1479
+ sortedRoles: sortedRoles,
1480
+ canDelete: canDelete,
1481
+ canUpdate: canUpdate,
1482
+ permissions: index.PERMISSIONS,
1483
+ setRoleToDelete: setRoleToDelete,
1484
+ onDelete: [
1485
+ showConfirmDelete,
1486
+ setShowConfirmDelete
1487
+ ]
1488
+ })
1489
+ ]
1490
+ }) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.EmptyStateLayout, {
1491
+ content: formatMessage(emptyLayout[emptyContent])
1492
+ })
1493
+ ]
1494
+ }),
1495
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Root, {
1496
+ open: showConfirmDelete,
1497
+ onOpenChange: handleShowConfirmDelete,
1498
+ children: /*#__PURE__*/ jsxRuntime.jsx(admin.ConfirmDialog, {
1499
+ onConfirm: handleConfirmDelete
1500
+ })
1501
+ })
1502
+ ]
1503
+ })
1504
+ ]
1505
+ });
1506
+ };
1507
+ const ProtectedRolesListPage = ()=>{
1508
+ return /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Protect, {
1509
+ permissions: index.PERMISSIONS.accessRoles,
1510
+ children: /*#__PURE__*/ jsxRuntime.jsx(RolesListPage, {})
1511
+ });
1512
+ };
1513
+
1514
+ const Roles = ()=>{
1515
+ return /*#__PURE__*/ jsxRuntime.jsx(admin.Page.Protect, {
1516
+ permissions: index.PERMISSIONS.accessRoles,
1517
+ children: /*#__PURE__*/ jsxRuntime.jsxs(reactRouterDom.Routes, {
1518
+ children: [
1519
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
1520
+ index: true,
1521
+ element: /*#__PURE__*/ jsxRuntime.jsx(ProtectedRolesListPage, {})
1522
+ }),
1523
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
1524
+ path: "new",
1525
+ element: /*#__PURE__*/ jsxRuntime.jsx(ProtectedRolesCreatePage, {})
1526
+ }),
1527
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
1528
+ path: ":id",
1529
+ element: /*#__PURE__*/ jsxRuntime.jsx(ProtectedRolesEditPage, {})
1530
+ })
1531
+ ]
1532
+ })
1533
+ });
1534
+ };
1535
+
1536
+ exports.default = Roles;
1537
+ //# sourceMappingURL=index-D01zzG9y.js.map