@strapi/plugin-users-permissions 5.9.0 → 5.10.1

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