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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/LICENSE +18 -3
  2. package/admin/src/components/BoundRoute/index.jsx +2 -2
  3. package/admin/src/components/FormModal/Input/index.jsx +32 -31
  4. package/admin/src/components/FormModal/index.jsx +57 -68
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.jsx +4 -3
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.jsx +13 -22
  7. package/admin/src/components/Permissions/index.jsx +27 -35
  8. package/admin/src/components/Permissions/reducer.js +1 -1
  9. package/admin/src/components/Policies/index.jsx +7 -5
  10. package/admin/src/components/UsersPermissions/index.jsx +15 -7
  11. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  12. package/admin/src/index.js +15 -32
  13. package/admin/src/pages/AdvancedSettings/index.jsx +83 -128
  14. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  15. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  16. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +119 -139
  17. package/admin/src/pages/EmailTemplates/components/EmailTable.jsx +20 -17
  18. package/admin/src/pages/EmailTemplates/index.jsx +36 -62
  19. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  20. package/admin/src/pages/Providers/index.jsx +98 -113
  21. package/admin/src/pages/Providers/utils/forms.js +23 -11
  22. package/admin/src/pages/Roles/constants.js +3 -3
  23. package/admin/src/pages/Roles/hooks/usePlugins.js +4 -4
  24. package/admin/src/pages/Roles/index.jsx +9 -18
  25. package/admin/src/pages/Roles/pages/CreatePage.jsx +53 -58
  26. package/admin/src/pages/Roles/pages/EditPage.jsx +63 -68
  27. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +27 -31
  28. package/admin/src/pages/Roles/pages/ListPage/index.jsx +79 -55
  29. package/admin/src/translations/en.json +1 -1
  30. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  31. package/dist/_chunks/{ar-t5qTFaAD.js → ar-BguGUqwK.js} +1 -1
  32. package/dist/_chunks/ar-BguGUqwK.js.map +1 -0
  33. package/dist/_chunks/{ar-MvD8Ghac.mjs → ar-CK8BRRXB.mjs} +1 -1
  34. package/dist/_chunks/ar-CK8BRRXB.mjs.map +1 -0
  35. package/dist/_chunks/{cs-BMuXwxA1.mjs → cs-BVigMk0l.mjs} +1 -1
  36. package/dist/_chunks/cs-BVigMk0l.mjs.map +1 -0
  37. package/dist/_chunks/{cs-I8N4u-Sd.js → cs-BW8-K_GY.js} +1 -1
  38. package/dist/_chunks/cs-BW8-K_GY.js.map +1 -0
  39. package/dist/_chunks/{de-zs2qqc0W.mjs → de-BKUdRFI4.mjs} +1 -1
  40. package/dist/_chunks/de-BKUdRFI4.mjs.map +1 -0
  41. package/dist/_chunks/{de-YTjtq89K.js → de-owXpVluI.js} +1 -1
  42. package/dist/_chunks/de-owXpVluI.js.map +1 -0
  43. package/dist/_chunks/{dk-HctVBMsG.mjs → dk-BQiTK50l.mjs} +1 -1
  44. package/dist/_chunks/dk-BQiTK50l.mjs.map +1 -0
  45. package/dist/_chunks/{dk-TF-dWjzl.js → dk-LXAnbuBk.js} +1 -1
  46. package/dist/_chunks/dk-LXAnbuBk.js.map +1 -0
  47. package/dist/_chunks/{en-CE3wEy_c.mjs → en-DOHtPf-2.mjs} +2 -2
  48. package/dist/_chunks/en-DOHtPf-2.mjs.map +1 -0
  49. package/dist/_chunks/{en-m608rMZx.js → en-MHo5mcsU.js} +2 -2
  50. package/dist/_chunks/en-MHo5mcsU.js.map +1 -0
  51. package/dist/_chunks/{es-XBQsB8_9.js → es-BwLCLXAQ.js} +1 -1
  52. package/dist/_chunks/es-BwLCLXAQ.js.map +1 -0
  53. package/dist/_chunks/{es-9381tih_.mjs → es-DNgOVMjD.mjs} +1 -1
  54. package/dist/_chunks/es-DNgOVMjD.mjs.map +1 -0
  55. package/dist/_chunks/{fr-CMSc77If.mjs → fr-DkgRugiU.mjs} +1 -1
  56. package/dist/_chunks/fr-DkgRugiU.mjs.map +1 -0
  57. package/dist/_chunks/{fr-6cz3U-IF.js → fr-DkhpSjjm.js} +1 -1
  58. package/dist/_chunks/fr-DkhpSjjm.js.map +1 -0
  59. package/dist/_chunks/{id-RJ934rq-.js → id-BTemOeTZ.js} +1 -1
  60. package/dist/_chunks/id-BTemOeTZ.js.map +1 -0
  61. package/dist/_chunks/{id-SDuyIkZa.mjs → id-BdEsvnaF.mjs} +1 -1
  62. package/dist/_chunks/id-BdEsvnaF.mjs.map +1 -0
  63. package/dist/_chunks/{index-rL_BoFHz.js → index-BH6NqE8I.js} +47 -51
  64. package/dist/_chunks/index-BH6NqE8I.js.map +1 -0
  65. package/dist/_chunks/index-C3i__jX-.js +281 -0
  66. package/dist/_chunks/index-C3i__jX-.js.map +1 -0
  67. package/dist/_chunks/{index--ch5E4_K.js → index-CFzpNgIL.js} +108 -106
  68. package/dist/_chunks/index-CFzpNgIL.js.map +1 -0
  69. package/dist/_chunks/index-CJUWqtrZ.mjs +344 -0
  70. package/dist/_chunks/index-CJUWqtrZ.mjs.map +1 -0
  71. package/dist/_chunks/index-CcWTKtCY.js +366 -0
  72. package/dist/_chunks/index-CcWTKtCY.js.map +1 -0
  73. package/dist/_chunks/{index-MuQRbm-o.mjs → index-CnX2wiLY.mjs} +239 -256
  74. package/dist/_chunks/index-CnX2wiLY.mjs.map +1 -0
  75. package/dist/_chunks/index-DUWx-KG9-C1E7ADbJ.mjs +11984 -0
  76. package/dist/_chunks/index-DUWx-KG9-C1E7ADbJ.mjs.map +1 -0
  77. package/dist/_chunks/index-DUWx-KG9-fMZ4nmrb.js +12008 -0
  78. package/dist/_chunks/index-DUWx-KG9-fMZ4nmrb.js.map +1 -0
  79. package/dist/_chunks/{index-WCv8yGzw.js → index-DruWuFWL.js} +255 -274
  80. package/dist/_chunks/index-DruWuFWL.js.map +1 -0
  81. package/dist/_chunks/index-PJoz36kJ.mjs +262 -0
  82. package/dist/_chunks/index-PJoz36kJ.mjs.map +1 -0
  83. package/dist/_chunks/{index-iu-7wU8h.mjs → index-R4R0dEOv.mjs} +46 -50
  84. package/dist/_chunks/index-R4R0dEOv.mjs.map +1 -0
  85. package/dist/_chunks/{index-eE2qjbfg.mjs → index-XOcQhJMB.mjs} +105 -103
  86. package/dist/_chunks/index-XOcQhJMB.mjs.map +1 -0
  87. package/dist/_chunks/{it-bvH7DgQo.mjs → it-B-rv0E24.mjs} +1 -1
  88. package/dist/_chunks/it-B-rv0E24.mjs.map +1 -0
  89. package/dist/_chunks/{it-YhZOlM2X.js → it-D1rH6V6_.js} +1 -1
  90. package/dist/_chunks/it-D1rH6V6_.js.map +1 -0
  91. package/dist/_chunks/{ja-o_-JPvQv.mjs → ja-C8K-VBPD.mjs} +1 -1
  92. package/dist/_chunks/ja-C8K-VBPD.mjs.map +1 -0
  93. package/dist/_chunks/{ja-xssHUXFv.js → ja-DqShgTMf.js} +1 -1
  94. package/dist/_chunks/ja-DqShgTMf.js.map +1 -0
  95. package/dist/_chunks/{ko-C3mHUSJa.js → ko-B9DGEPWH.js} +1 -1
  96. package/dist/_chunks/ko-B9DGEPWH.js.map +1 -0
  97. package/dist/_chunks/{ko-XJbPSez_.mjs → ko-Busb0wIY.mjs} +1 -1
  98. package/dist/_chunks/ko-Busb0wIY.mjs.map +1 -0
  99. package/dist/_chunks/{ms-II5Ea73J.mjs → ms-ByvsQjRt.mjs} +1 -1
  100. package/dist/_chunks/ms-ByvsQjRt.mjs.map +1 -0
  101. package/dist/_chunks/{ms-d0hfg65Z.js → ms-CPBU3LWf.js} +1 -1
  102. package/dist/_chunks/ms-CPBU3LWf.js.map +1 -0
  103. package/dist/_chunks/{nl-vEy6TN0K.mjs → nl-5qO8Rpcy.mjs} +1 -1
  104. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +1 -0
  105. package/dist/_chunks/{nl-TA7TfK_5.js → nl-CwNB6YoO.js} +1 -1
  106. package/dist/_chunks/nl-CwNB6YoO.js.map +1 -0
  107. package/dist/_chunks/{pl-2VowaFGt.mjs → pl-BdIzifBE.mjs} +1 -1
  108. package/dist/_chunks/pl-BdIzifBE.mjs.map +1 -0
  109. package/dist/_chunks/{pl-0pUL9hdA.js → pl-Do9UD69f.js} +1 -1
  110. package/dist/_chunks/pl-Do9UD69f.js.map +1 -0
  111. package/dist/_chunks/{pt-Rf9W51IO.mjs → pt-BIO24ioG.mjs} +1 -1
  112. package/dist/_chunks/pt-BIO24ioG.mjs.map +1 -0
  113. package/dist/_chunks/{pt-BR-WNOhafR4.js → pt-BR-D7dZhxuP.js} +1 -1
  114. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +1 -0
  115. package/dist/_chunks/{pt-BR-sS1Xp3Jt.mjs → pt-BR-f0p23AQZ.mjs} +1 -1
  116. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +1 -0
  117. package/dist/_chunks/{pt-guNR9Gax.js → pt-fdvyOnUp.js} +1 -1
  118. package/dist/_chunks/pt-fdvyOnUp.js.map +1 -0
  119. package/dist/_chunks/{ru-X3BMXDds.js → ru-C94rjPGA.js} +1 -1
  120. package/dist/_chunks/ru-C94rjPGA.js.map +1 -0
  121. package/dist/_chunks/{ru-qKHnd5or.mjs → ru-VWy-IB7K.mjs} +1 -1
  122. package/dist/_chunks/ru-VWy-IB7K.mjs.map +1 -0
  123. package/dist/_chunks/{sk-NWPw1oTN.js → sk-BABEhykl.js} +1 -1
  124. package/dist/_chunks/sk-BABEhykl.js.map +1 -0
  125. package/dist/_chunks/{sk-_Ryr-eTT.mjs → sk-B_LIcepm.mjs} +1 -1
  126. package/dist/_chunks/sk-B_LIcepm.mjs.map +1 -0
  127. package/dist/_chunks/{sv-BqzScFXS.mjs → sv-ABLKOokl.mjs} +1 -1
  128. package/dist/_chunks/sv-ABLKOokl.mjs.map +1 -0
  129. package/dist/_chunks/{sv-76NnbB__.js → sv-Be43LhA9.js} +1 -1
  130. package/dist/_chunks/sv-Be43LhA9.js.map +1 -0
  131. package/dist/_chunks/{th-WsknMEpq.mjs → th-DKyP7ueR.mjs} +1 -1
  132. package/dist/_chunks/th-DKyP7ueR.mjs.map +1 -0
  133. package/dist/_chunks/{th-cbppX21D.js → th-DgVhVLhL.js} +1 -1
  134. package/dist/_chunks/th-DgVhVLhL.js.map +1 -0
  135. package/dist/_chunks/{tr-6mm_Fmz7.js → tr-B_idhkEs.js} +1 -1
  136. package/dist/_chunks/tr-B_idhkEs.js.map +1 -0
  137. package/dist/_chunks/{tr-_DB1F1GW.mjs → tr-qa1Q5UjC.mjs} +1 -1
  138. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +1 -0
  139. package/dist/_chunks/{uk-yxMSQAwI.mjs → uk-BmRqbeQc.mjs} +1 -1
  140. package/dist/_chunks/uk-BmRqbeQc.mjs.map +1 -0
  141. package/dist/_chunks/{uk-sI2I1ogF.js → uk-LHOivnhP.js} +1 -1
  142. package/dist/_chunks/uk-LHOivnhP.js.map +1 -0
  143. package/dist/_chunks/{vi-A3zJxaiI.js → vi-CdVRdKDw.js} +1 -1
  144. package/dist/_chunks/vi-CdVRdKDw.js.map +1 -0
  145. package/dist/_chunks/{vi-xY0zCW3d.mjs → vi-HW-EdMea.mjs} +1 -1
  146. package/dist/_chunks/vi-HW-EdMea.mjs.map +1 -0
  147. package/dist/_chunks/{zh-OFeldzbX.mjs → zh-5hKkVPA4.mjs} +1 -1
  148. package/dist/_chunks/zh-5hKkVPA4.mjs.map +1 -0
  149. package/dist/_chunks/{zh-72SpmFXa.js → zh-Cuq8gMnF.js} +1 -1
  150. package/dist/_chunks/zh-Cuq8gMnF.js.map +1 -0
  151. package/dist/_chunks/{zh-Hans-E84cu4kP.mjs → zh-Hans-BHilK-yc.mjs} +1 -1
  152. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +1 -0
  153. package/dist/_chunks/{zh-Hans-ArWWtyP4.js → zh-Hans-GQDMKtY4.js} +1 -1
  154. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +1 -0
  155. package/dist/admin/index.js +1 -2
  156. package/dist/admin/index.js.map +1 -1
  157. package/dist/admin/index.mjs +1 -2
  158. package/dist/admin/index.mjs.map +1 -1
  159. package/package.json +27 -28
  160. package/server/bootstrap/index.js +18 -51
  161. package/server/bootstrap/users-permissions-actions.js +6 -0
  162. package/server/content-types/user/index.js +0 -1
  163. package/server/controllers/auth.js +40 -59
  164. package/server/controllers/content-manager-user.js +28 -30
  165. package/server/controllers/role.js +17 -4
  166. package/server/controllers/user.js +8 -9
  167. package/server/controllers/validation/auth.js +81 -25
  168. package/server/middlewares/rateLimit.js +1 -1
  169. package/server/register.js +1 -1
  170. package/server/services/jwt.js +3 -3
  171. package/server/services/permission.js +3 -7
  172. package/server/services/providers-registry.js +468 -275
  173. package/server/services/providers.js +10 -5
  174. package/server/services/role.js +15 -13
  175. package/server/services/user.js +56 -19
  176. package/server/services/users-permissions.js +15 -13
  177. package/server/utils/index.d.ts +2 -1
  178. package/server/utils/sanitize/sanitizers.js +7 -3
  179. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  180. package/admin/src/pages/Roles/pages/ListPage/utils/api.js +0 -30
  181. package/dist/_chunks/ar-MvD8Ghac.mjs.map +0 -1
  182. package/dist/_chunks/ar-t5qTFaAD.js.map +0 -1
  183. package/dist/_chunks/cs-BMuXwxA1.mjs.map +0 -1
  184. package/dist/_chunks/cs-I8N4u-Sd.js.map +0 -1
  185. package/dist/_chunks/de-YTjtq89K.js.map +0 -1
  186. package/dist/_chunks/de-zs2qqc0W.mjs.map +0 -1
  187. package/dist/_chunks/dk-HctVBMsG.mjs.map +0 -1
  188. package/dist/_chunks/dk-TF-dWjzl.js.map +0 -1
  189. package/dist/_chunks/en-CE3wEy_c.mjs.map +0 -1
  190. package/dist/_chunks/en-m608rMZx.js.map +0 -1
  191. package/dist/_chunks/es-9381tih_.mjs.map +0 -1
  192. package/dist/_chunks/es-XBQsB8_9.js.map +0 -1
  193. package/dist/_chunks/fr-6cz3U-IF.js.map +0 -1
  194. package/dist/_chunks/fr-CMSc77If.mjs.map +0 -1
  195. package/dist/_chunks/id-RJ934rq-.js.map +0 -1
  196. package/dist/_chunks/id-SDuyIkZa.mjs.map +0 -1
  197. package/dist/_chunks/index--ch5E4_K.js.map +0 -1
  198. package/dist/_chunks/index-MuQRbm-o.mjs.map +0 -1
  199. package/dist/_chunks/index-UrkRT2rC.js +0 -320
  200. package/dist/_chunks/index-UrkRT2rC.js.map +0 -1
  201. package/dist/_chunks/index-WCv8yGzw.js.map +0 -1
  202. package/dist/_chunks/index-eE2qjbfg.mjs.map +0 -1
  203. package/dist/_chunks/index-iu-7wU8h.mjs.map +0 -1
  204. package/dist/_chunks/index-mCVPA90k.mjs +0 -385
  205. package/dist/_chunks/index-mCVPA90k.mjs.map +0 -1
  206. package/dist/_chunks/index-mNv7pSw-.js +0 -407
  207. package/dist/_chunks/index-mNv7pSw-.js.map +0 -1
  208. package/dist/_chunks/index-rL_BoFHz.js.map +0 -1
  209. package/dist/_chunks/index-xXp5S4OL.mjs +0 -301
  210. package/dist/_chunks/index-xXp5S4OL.mjs.map +0 -1
  211. package/dist/_chunks/it-YhZOlM2X.js.map +0 -1
  212. package/dist/_chunks/it-bvH7DgQo.mjs.map +0 -1
  213. package/dist/_chunks/ja-o_-JPvQv.mjs.map +0 -1
  214. package/dist/_chunks/ja-xssHUXFv.js.map +0 -1
  215. package/dist/_chunks/ko-C3mHUSJa.js.map +0 -1
  216. package/dist/_chunks/ko-XJbPSez_.mjs.map +0 -1
  217. package/dist/_chunks/ms-II5Ea73J.mjs.map +0 -1
  218. package/dist/_chunks/ms-d0hfg65Z.js.map +0 -1
  219. package/dist/_chunks/nl-TA7TfK_5.js.map +0 -1
  220. package/dist/_chunks/nl-vEy6TN0K.mjs.map +0 -1
  221. package/dist/_chunks/pl-0pUL9hdA.js.map +0 -1
  222. package/dist/_chunks/pl-2VowaFGt.mjs.map +0 -1
  223. package/dist/_chunks/pt-BR-WNOhafR4.js.map +0 -1
  224. package/dist/_chunks/pt-BR-sS1Xp3Jt.mjs.map +0 -1
  225. package/dist/_chunks/pt-Rf9W51IO.mjs.map +0 -1
  226. package/dist/_chunks/pt-guNR9Gax.js.map +0 -1
  227. package/dist/_chunks/ru-X3BMXDds.js.map +0 -1
  228. package/dist/_chunks/ru-qKHnd5or.mjs.map +0 -1
  229. package/dist/_chunks/sk-NWPw1oTN.js.map +0 -1
  230. package/dist/_chunks/sk-_Ryr-eTT.mjs.map +0 -1
  231. package/dist/_chunks/sv-76NnbB__.js.map +0 -1
  232. package/dist/_chunks/sv-BqzScFXS.mjs.map +0 -1
  233. package/dist/_chunks/th-WsknMEpq.mjs.map +0 -1
  234. package/dist/_chunks/th-cbppX21D.js.map +0 -1
  235. package/dist/_chunks/tr-6mm_Fmz7.js.map +0 -1
  236. package/dist/_chunks/tr-_DB1F1GW.mjs.map +0 -1
  237. package/dist/_chunks/uk-sI2I1ogF.js.map +0 -1
  238. package/dist/_chunks/uk-yxMSQAwI.mjs.map +0 -1
  239. package/dist/_chunks/vi-A3zJxaiI.js.map +0 -1
  240. package/dist/_chunks/vi-xY0zCW3d.mjs.map +0 -1
  241. package/dist/_chunks/zh-72SpmFXa.js.map +0 -1
  242. package/dist/_chunks/zh-Hans-ArWWtyP4.js.map +0 -1
  243. package/dist/_chunks/zh-Hans-E84cu4kP.mjs.map +0 -1
  244. package/dist/_chunks/zh-OFeldzbX.mjs.map +0 -1
  245. package/server/bootstrap/grant-config.js +0 -140
  246. package/strapi-server.js +0 -3
@@ -1,160 +1,139 @@
1
1
  import React from 'react';
2
2
 
3
- import {
4
- Button,
5
- Grid,
6
- GridItem,
7
- ModalBody,
8
- ModalFooter,
9
- ModalHeader,
10
- ModalLayout,
11
- Textarea,
12
- } from '@strapi/design-system';
13
- import { Breadcrumbs, Crumb } from '@strapi/design-system/v2';
14
- import { Form, GenericInput } from '@strapi/helper-plugin';
15
- import { Formik } from 'formik';
3
+ import { Button, Grid, Modal, Breadcrumbs, Crumb, VisuallyHidden } from '@strapi/design-system';
4
+ import { Form, InputRenderer } from '@strapi/strapi/admin';
16
5
  import PropTypes from 'prop-types';
17
6
  import { useIntl } from 'react-intl';
18
7
 
19
8
  import { getTrad } from '../../../utils';
20
9
  import schema from '../utils/schema';
21
10
 
22
- const EmailForm = ({ template, onToggle, onSubmit }) => {
11
+ const EmailForm = ({ template = {}, onToggle, open, onSubmit }) => {
23
12
  const { formatMessage } = useIntl();
24
13
 
25
14
  return (
26
- <ModalLayout
27
- onClose={onToggle}
28
- labelledBy={`${formatMessage({
29
- id: getTrad('PopUpForm.header.edit.email-templates'),
30
- defaultMessage: 'Edit email template',
31
- })}, ${formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}`}
32
- >
33
- <ModalHeader>
34
- <Breadcrumbs
35
- label={`${formatMessage({
36
- id: getTrad('PopUpForm.header.edit.email-templates'),
37
- defaultMessage: 'Edit email template',
38
- })}, ${formatMessage({
39
- id: getTrad(template.display),
40
- defaultMessage: template.display,
41
- })}`}
42
- >
43
- <Crumb>
44
- {formatMessage({
15
+ <Modal.Root open={open} onOpenChange={onToggle}>
16
+ <Modal.Content>
17
+ <Modal.Header>
18
+ <Breadcrumbs
19
+ label={`${formatMessage({
45
20
  id: getTrad('PopUpForm.header.edit.email-templates'),
46
21
  defaultMessage: 'Edit email template',
47
- })}
48
- </Crumb>
49
- <Crumb isCurrent>
50
- {formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}
51
- </Crumb>
52
- </Breadcrumbs>
53
- </ModalHeader>
54
- <Formik
55
- onSubmit={onSubmit}
56
- initialValues={template}
57
- validateOnChange={false}
58
- validationSchema={schema}
59
- enableReinitialize
60
- >
61
- {({ errors, values, handleChange, isSubmitting }) => {
62
- return (
63
- <Form>
64
- <ModalBody>
65
- <Grid gap={5}>
66
- <GridItem col={6} s={12}>
67
- <GenericInput
68
- intlLabel={{
69
- id: getTrad('PopUpForm.Email.options.from.name.label'),
70
- defaultMessage: 'Shipper name',
71
- }}
72
- name="options.from.name"
73
- onChange={handleChange}
74
- value={values.options.from.name}
75
- error={errors?.options?.from?.name}
76
- type="text"
77
- />
78
- </GridItem>
79
- <GridItem col={6} s={12}>
80
- <GenericInput
81
- intlLabel={{
82
- id: getTrad('PopUpForm.Email.options.from.email.label'),
83
- defaultMessage: 'Shipper email',
84
- }}
85
- name="options.from.email"
86
- onChange={handleChange}
87
- value={values.options.from.email}
88
- error={errors?.options?.from?.email}
89
- type="text"
90
- />
91
- </GridItem>
92
- <GridItem col={6} s={12}>
93
- <GenericInput
94
- intlLabel={{
95
- id: getTrad('PopUpForm.Email.options.response_email.label'),
96
- defaultMessage: 'Response email',
97
- }}
98
- name="options.response_email"
99
- onChange={handleChange}
100
- value={values.options.response_email}
101
- error={errors?.options?.response_email}
102
- type="text"
103
- />
104
- </GridItem>
105
- <GridItem col={6} s={12}>
106
- <GenericInput
107
- intlLabel={{
108
- id: getTrad('PopUpForm.Email.options.object.label'),
109
- defaultMessage: 'Subject',
110
- }}
111
- name="options.object"
112
- onChange={handleChange}
113
- value={values.options.object}
114
- error={errors?.options?.object}
115
- type="text"
116
- />
117
- </GridItem>
118
- <GridItem col={12} s={12}>
119
- <Textarea
120
- label={formatMessage({
121
- id: getTrad('PopUpForm.Email.options.message.label'),
122
- defaultMessage: 'Message',
123
- })}
124
- id="options.message"
125
- onChange={handleChange}
126
- value={values.options.message}
127
- error={
128
- errors?.options?.message &&
129
- formatMessage({
130
- id: errors.options.message,
131
- defaultMessage: errors.options.message,
132
- })
133
- }
134
- />
135
- </GridItem>
136
- </Grid>
137
- </ModalBody>
138
- <ModalFooter
139
- startActions={
140
- <Button onClick={onToggle} variant="tertiary">
141
- Cancel
142
- </Button>
143
- }
144
- endActions={
22
+ })}, ${
23
+ template.display
24
+ ? formatMessage({
25
+ id: getTrad(template.display),
26
+ defaultMessage: template.display,
27
+ })
28
+ : ''
29
+ }`}
30
+ >
31
+ <Crumb>
32
+ {formatMessage({
33
+ id: getTrad('PopUpForm.header.edit.email-templates'),
34
+ defaultMessage: 'Edit email template',
35
+ })}
36
+ </Crumb>
37
+ <Crumb isCurrent>
38
+ {template.display
39
+ ? formatMessage({ id: getTrad(template.display), defaultMessage: template.display })
40
+ : ''}
41
+ </Crumb>
42
+ </Breadcrumbs>
43
+ <VisuallyHidden>
44
+ <Modal.Title>
45
+ {`${formatMessage({
46
+ id: getTrad('PopUpForm.header.edit.email-templates'),
47
+ defaultMessage: 'Edit email template',
48
+ })}, ${template.display ? formatMessage({ id: getTrad(template.display), defaultMessage: template.display }) : ''}`}
49
+ </Modal.Title>
50
+ </VisuallyHidden>
51
+ </Modal.Header>
52
+ <Form onSubmit={onSubmit} initialValues={template} validationSchema={schema}>
53
+ {({ isSubmitting }) => {
54
+ return (
55
+ <>
56
+ <Modal.Body>
57
+ <Grid.Root gap={5}>
58
+ {[
59
+ {
60
+ label: formatMessage({
61
+ id: getTrad('PopUpForm.Email.options.from.name.label'),
62
+ defaultMessage: 'Shipper name',
63
+ }),
64
+ name: 'options.from.name',
65
+ size: 6,
66
+ type: 'string',
67
+ },
68
+ {
69
+ label: formatMessage({
70
+ id: getTrad('PopUpForm.Email.options.from.email.label'),
71
+ defaultMessage: 'Shipper email',
72
+ }),
73
+ name: 'options.from.email',
74
+ size: 6,
75
+ type: 'string',
76
+ },
77
+ {
78
+ label: formatMessage({
79
+ id: getTrad('PopUpForm.Email.options.response_email.label'),
80
+ defaultMessage: 'Response email',
81
+ }),
82
+ name: 'options.response_email',
83
+ size: 6,
84
+ type: 'string',
85
+ },
86
+ {
87
+ label: formatMessage({
88
+ id: getTrad('PopUpForm.Email.options.object.label'),
89
+ defaultMessage: 'Subject',
90
+ }),
91
+ name: 'options.object',
92
+ size: 6,
93
+ type: 'string',
94
+ },
95
+ {
96
+ label: formatMessage({
97
+ id: getTrad('PopUpForm.Email.options.message.label'),
98
+ defaultMessage: 'Message',
99
+ }),
100
+ name: 'options.message',
101
+ size: 12,
102
+ type: 'text',
103
+ },
104
+ ].map(({ size, ...field }) => (
105
+ <Grid.Item
106
+ key={field.name}
107
+ col={size}
108
+ direction="column"
109
+ alignItems="stretch"
110
+ >
111
+ <InputRenderer {...field} />
112
+ </Grid.Item>
113
+ ))}
114
+ </Grid.Root>
115
+ </Modal.Body>
116
+ <Modal.Footer>
117
+ <Modal.Close>
118
+ <Button variant="tertiary">Cancel</Button>
119
+ </Modal.Close>
145
120
  <Button loading={isSubmitting} type="submit">
146
121
  Finish
147
122
  </Button>
148
- }
149
- />
150
- </Form>
151
- );
152
- }}
153
- </Formik>
154
- </ModalLayout>
123
+ </Modal.Footer>
124
+ </>
125
+ );
126
+ }}
127
+ </Form>
128
+ </Modal.Content>
129
+ </Modal.Root>
155
130
  );
156
131
  };
157
132
 
133
+ EmailForm.defaultProps = {
134
+ template: {},
135
+ };
136
+
158
137
  EmailForm.propTypes = {
159
138
  template: PropTypes.shape({
160
139
  display: PropTypes.string,
@@ -168,7 +147,8 @@ EmailForm.propTypes = {
168
147
  object: PropTypes.string,
169
148
  response_email: PropTypes.string,
170
149
  }),
171
- }).isRequired,
150
+ }),
151
+ open: PropTypes.bool.isRequired,
172
152
  onSubmit: PropTypes.func.isRequired,
173
153
  onToggle: PropTypes.func.isRequired,
174
154
  };
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
3
  import {
4
- Icon,
5
4
  IconButton,
6
5
  Table,
7
6
  Tbody,
@@ -11,9 +10,9 @@ import {
11
10
  Tr,
12
11
  Typography,
13
12
  VisuallyHidden,
13
+ Box,
14
14
  } from '@strapi/design-system';
15
- import { onRowClick, stopPropagation } from '@strapi/helper-plugin';
16
- import { Check, Pencil, Refresh } from '@strapi/icons';
15
+ import { Check, Pencil, ArrowClockwise as Refresh } from '@strapi/icons';
17
16
  import PropTypes from 'prop-types';
18
17
  import { useIntl } from 'react-intl';
19
18
 
@@ -53,16 +52,16 @@ const EmailTable = ({ canUpdate, onEditClick }) => {
53
52
  </Tr>
54
53
  </Thead>
55
54
  <Tbody>
56
- <Tr {...onRowClick({ fn: () => onEditClick('reset_password') })}>
55
+ <Tr onClick={() => onEditClick('reset_password')}>
57
56
  <Td>
58
- <Icon>
57
+ <Box width="3.2rem" height="3.2rem" padding="0.8rem">
59
58
  <Refresh
60
59
  aria-label={formatMessage({
61
60
  id: 'global.reset-password',
62
61
  defaultMessage: 'Reset password',
63
62
  })}
64
63
  />
65
- </Icon>
64
+ </Box>
66
65
  </Td>
67
66
  <Td>
68
67
  <Typography>
@@ -72,28 +71,30 @@ const EmailTable = ({ canUpdate, onEditClick }) => {
72
71
  })}
73
72
  </Typography>
74
73
  </Td>
75
- <Td {...stopPropagation}>
74
+ <Td onClick={(e) => e.stopPropagation()}>
76
75
  <IconButton
77
76
  onClick={() => onEditClick('reset_password')}
78
77
  label={formatMessage({
79
78
  id: getTrad('Email.template.form.edit.label'),
80
79
  defaultMessage: 'Edit a template',
81
80
  })}
82
- noBorder
83
- icon={canUpdate && <Pencil />}
84
- />
81
+ variant="ghost"
82
+ disabled={!canUpdate}
83
+ >
84
+ <Pencil />
85
+ </IconButton>
85
86
  </Td>
86
87
  </Tr>
87
- <Tr {...onRowClick({ fn: () => onEditClick('email_confirmation') })}>
88
+ <Tr onClick={() => onEditClick('email_confirmation')}>
88
89
  <Td>
89
- <Icon>
90
+ <Box width="3.2rem" height="3.2rem" padding="0.8rem">
90
91
  <Check
91
92
  aria-label={formatMessage({
92
93
  id: getTrad('Email.template.email_confirmation'),
93
94
  defaultMessage: 'Email address confirmation',
94
95
  })}
95
96
  />
96
- </Icon>
97
+ </Box>
97
98
  </Td>
98
99
  <Td>
99
100
  <Typography>
@@ -103,16 +104,18 @@ const EmailTable = ({ canUpdate, onEditClick }) => {
103
104
  })}
104
105
  </Typography>
105
106
  </Td>
106
- <Td {...stopPropagation}>
107
+ <Td onClick={(e) => e.stopPropagation()}>
107
108
  <IconButton
108
109
  onClick={() => onEditClick('email_confirmation')}
109
110
  label={formatMessage({
110
111
  id: getTrad('Email.template.form.edit.label'),
111
112
  defaultMessage: 'Edit a template',
112
113
  })}
113
- noBorder
114
- icon={canUpdate && <Pencil />}
115
- />
114
+ variant="ghost"
115
+ disabled={!canUpdate}
116
+ >
117
+ <Pencil />
118
+ </IconButton>
116
119
  </Td>
117
120
  </Tr>
118
121
  </Tbody>
@@ -1,18 +1,15 @@
1
1
  import * as React from 'react';
2
2
 
3
- import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';
3
+ import { useTracking } from '@strapi/admin/strapi-admin';
4
+ import { useNotifyAT } from '@strapi/design-system';
4
5
  import {
5
- CheckPagePermissions,
6
- LoadingIndicatorPage,
7
- SettingsPageTitle,
6
+ Page,
8
7
  useAPIErrorHandler,
9
- useFetchClient,
10
- useFocusWhenNavigate,
11
8
  useNotification,
12
- useOverlayBlocker,
9
+ useFetchClient,
13
10
  useRBAC,
14
- useTracking,
15
- } from '@strapi/helper-plugin';
11
+ Layouts,
12
+ } from '@strapi/strapi/admin';
16
13
  import { useIntl } from 'react-intl';
17
14
  import { useMutation, useQuery, useQueryClient } from 'react-query';
18
15
 
@@ -23,23 +20,19 @@ import EmailForm from './components/EmailForm';
23
20
  import EmailTable from './components/EmailTable';
24
21
 
25
22
  const ProtectedEmailTemplatesPage = () => (
26
- <CheckPagePermissions permissions={PERMISSIONS.readEmailTemplates}>
23
+ <Page.Protect permissions={PERMISSIONS.readEmailTemplates}>
27
24
  <EmailTemplatesPage />
28
- </CheckPagePermissions>
25
+ </Page.Protect>
29
26
  );
30
-
31
27
  const EmailTemplatesPage = () => {
32
28
  const { formatMessage } = useIntl();
33
29
  const { trackUsage } = useTracking();
34
30
  const { notifyStatus } = useNotifyAT();
35
- const toggleNotification = useNotification();
36
- const { lockApp, unlockApp } = useOverlayBlocker();
31
+ const { toggleNotification } = useNotification();
37
32
  const queryClient = useQueryClient();
38
33
  const { get, put } = useFetchClient();
39
34
  const { formatAPIError } = useAPIErrorHandler();
40
35
 
41
- useFocusWhenNavigate();
42
-
43
36
  const [isModalOpen, setIsModalOpen] = React.useState(false);
44
37
  const [templateToEdit, setTemplateToEdit] = React.useState(null);
45
38
 
@@ -66,7 +59,7 @@ const EmailTemplatesPage = () => {
66
59
  },
67
60
  onError(error) {
68
61
  toggleNotification({
69
- type: 'warning',
62
+ type: 'danger',
70
63
  message: formatAPIError(error),
71
64
  });
72
65
  },
@@ -92,29 +85,24 @@ const EmailTemplatesPage = () => {
92
85
 
93
86
  toggleNotification({
94
87
  type: 'success',
95
- message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
88
+ message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),
96
89
  });
97
90
 
98
91
  trackUsage('didEditEmailTemplates');
99
92
 
100
- unlockApp();
101
93
  handleToggle();
102
94
  },
103
95
  onError(error) {
104
96
  toggleNotification({
105
- type: 'warning',
97
+ type: 'danger',
106
98
  message: formatAPIError(error),
107
99
  });
108
-
109
- unlockApp();
110
100
  },
111
101
  refetchActive: true,
112
102
  }
113
103
  );
114
104
 
115
105
  const handleSubmit = (body) => {
116
- lockApp();
117
-
118
106
  trackUsage('willEditEmailTemplates');
119
107
 
120
108
  const editedTemplates = { ...data, [templateToEdit]: body };
@@ -122,53 +110,39 @@ const EmailTemplatesPage = () => {
122
110
  };
123
111
 
124
112
  if (isLoading) {
125
- return (
126
- <Main aria-busy="true">
127
- <SettingsPageTitle
128
- name={formatMessage({
129
- id: getTrad('HeaderNav.link.emailTemplates'),
130
- defaultMessage: 'Email templates',
131
- })}
132
- />
133
- <HeaderLayout
134
- title={formatMessage({
135
- id: getTrad('HeaderNav.link.emailTemplates'),
136
- defaultMessage: 'Email templates',
137
- })}
138
- />
139
- <ContentLayout>
140
- <LoadingIndicatorPage />
141
- </ContentLayout>
142
- </Main>
143
- );
113
+ return <Page.Loading />;
144
114
  }
145
115
 
146
116
  return (
147
- <Main aria-busy={submitMutation.isLoading}>
148
- <SettingsPageTitle
149
- name={formatMessage({
150
- id: getTrad('HeaderNav.link.emailTemplates'),
151
- defaultMessage: 'Email templates',
152
- })}
153
- />
154
- <HeaderLayout
117
+ <Page.Main aria-busy={submitMutation.isLoading}>
118
+ <Page.Title>
119
+ {formatMessage(
120
+ { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },
121
+ {
122
+ name: formatMessage({
123
+ id: getTrad('HeaderNav.link.emailTemplates'),
124
+ defaultMessage: 'Email templates',
125
+ }),
126
+ }
127
+ )}
128
+ </Page.Title>
129
+ <Layouts.Header
155
130
  title={formatMessage({
156
131
  id: getTrad('HeaderNav.link.emailTemplates'),
157
132
  defaultMessage: 'Email templates',
158
133
  })}
159
134
  />
160
- <ContentLayout>
135
+ <Layouts.Content>
161
136
  <EmailTable onEditClick={handleEditClick} canUpdate={canUpdate} />
162
- {isModalOpen && (
163
- <EmailForm
164
- template={data[templateToEdit]}
165
- onToggle={handleToggle}
166
- onSubmit={handleSubmit}
167
- />
168
- )}
169
- </ContentLayout>
170
- </Main>
137
+ <EmailForm
138
+ template={data[templateToEdit]}
139
+ onToggle={handleToggle}
140
+ open={isModalOpen}
141
+ onSubmit={handleSubmit}
142
+ />
143
+ </Layouts.Content>
144
+ </Page.Main>
171
145
  );
172
146
  };
173
147
 
174
- export default ProtectedEmailTemplatesPage;
148
+ export { ProtectedEmailTemplatesPage, EmailTemplatesPage };
@@ -1,4 +1,4 @@
1
- import { translatedErrors } from '@strapi/helper-plugin';
1
+ import { translatedErrors } from '@strapi/strapi/admin';
2
2
  import * as yup from 'yup';
3
3
 
4
4
  const schema = yup.object().shape({
@@ -8,15 +8,27 @@ const schema = yup.object().shape({
8
8
  from: yup
9
9
  .object()
10
10
  .shape({
11
- name: yup.string().required(translatedErrors.required),
12
- email: yup.string().email(translatedErrors.email).required(translatedErrors.required),
11
+ name: yup.string().required({
12
+ id: translatedErrors.required.id,
13
+ defaultMessage: 'This field is required',
14
+ }),
15
+ email: yup.string().email(translatedErrors.email).required({
16
+ id: translatedErrors.required.id,
17
+ defaultMessage: 'This field is required',
18
+ }),
13
19
  })
14
20
  .required(),
15
21
  response_email: yup.string().email(translatedErrors.email),
16
- object: yup.string().required(translatedErrors.required),
17
- message: yup.string().required(translatedErrors.required),
22
+ object: yup.string().required({
23
+ id: translatedErrors.required.id,
24
+ defaultMessage: 'This field is required',
25
+ }),
26
+ message: yup.string().required({
27
+ id: translatedErrors.required.id,
28
+ defaultMessage: 'This field is required',
29
+ }),
18
30
  })
19
- .required(translatedErrors.required),
31
+ .required(translatedErrors.required.id),
20
32
  });
21
33
 
22
34
  export default schema;