@strapi/plugin-users-permissions 0.0.0-next.e9bb5ccdc459f4c6b6717a2d5d86359b7a47d47d → 0.0.0-next.eb48c73c86cbc452c1ba8d727106f9ed9da0c834

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 (233) hide show
  1. package/.eslintignore +2 -2
  2. package/.eslintrc +17 -0
  3. package/LICENSE +18 -3
  4. package/admin/src/components/BoundRoute/{index.js → index.jsx} +7 -5
  5. package/admin/src/components/FormModal/Input/{index.js → index.jsx} +38 -34
  6. package/admin/src/components/FormModal/index.jsx +115 -0
  7. package/admin/src/components/Permissions/PermissionRow/{CheckboxWrapper.js → CheckboxWrapper.jsx} +4 -3
  8. package/admin/src/components/Permissions/PermissionRow/{SubCategory.js → SubCategory.jsx} +27 -15
  9. package/admin/src/components/Permissions/PermissionRow/{index.js → index.jsx} +4 -2
  10. package/admin/src/components/Permissions/index.jsx +47 -0
  11. package/admin/src/components/Permissions/reducer.js +1 -1
  12. package/admin/src/components/Policies/{index.js → index.jsx} +10 -7
  13. package/admin/src/components/UsersPermissions/{index.js → index.jsx} +22 -11
  14. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  15. package/admin/src/{permissions.js → constants.js} +1 -3
  16. package/admin/src/contexts/UsersPermissionsContext/{index.js → index.jsx} +1 -0
  17. package/admin/src/index.js +27 -53
  18. package/admin/src/pages/AdvancedSettings/index.jsx +214 -0
  19. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  20. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  21. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +156 -0
  22. package/admin/src/pages/EmailTemplates/components/{EmailTable.js → EmailTable.jsx} +28 -23
  23. package/admin/src/pages/EmailTemplates/index.jsx +148 -0
  24. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  25. package/admin/src/pages/Providers/index.jsx +262 -0
  26. package/admin/src/pages/Providers/utils/forms.js +23 -11
  27. package/admin/src/pages/Roles/constants.js +7 -0
  28. package/admin/src/pages/Roles/hooks/usePlugins.js +78 -0
  29. package/admin/src/pages/Roles/index.jsx +24 -0
  30. package/admin/src/pages/Roles/pages/CreatePage.jsx +194 -0
  31. package/admin/src/pages/Roles/pages/EditPage.jsx +215 -0
  32. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +119 -0
  33. package/admin/src/pages/Roles/{ListPage/index.js → pages/ListPage/index.jsx} +108 -83
  34. package/admin/src/pluginId.js +2 -2
  35. package/admin/src/translations/en.json +1 -1
  36. package/admin/src/translations/uk.json +41 -4
  37. package/admin/src/translations/zh-Hans.json +80 -80
  38. package/admin/src/utils/index.js +1 -2
  39. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  40. package/dist/admin/chunks/ar-BJwjobLp.js +45 -0
  41. package/dist/admin/chunks/ar-BJwjobLp.js.map +1 -0
  42. package/dist/admin/chunks/ar-G6bUGuUb.mjs +43 -0
  43. package/dist/admin/chunks/ar-G6bUGuUb.mjs.map +1 -0
  44. package/dist/admin/chunks/cs-Bu59JqhG.mjs +49 -0
  45. package/dist/admin/chunks/cs-Bu59JqhG.mjs.map +1 -0
  46. package/dist/admin/chunks/cs-uS_SIEo8.js +51 -0
  47. package/dist/admin/chunks/cs-uS_SIEo8.js.map +1 -0
  48. package/dist/admin/chunks/de-7MVMrqqI.js +63 -0
  49. package/dist/admin/chunks/de-7MVMrqqI.js.map +1 -0
  50. package/dist/admin/chunks/de-B81A69_5.mjs +61 -0
  51. package/dist/admin/chunks/de-B81A69_5.mjs.map +1 -0
  52. package/dist/admin/chunks/dk-BaelzvBE.mjs +85 -0
  53. package/dist/admin/chunks/dk-BaelzvBE.mjs.map +1 -0
  54. package/dist/admin/chunks/dk-DwCLGmy9.js +87 -0
  55. package/dist/admin/chunks/dk-DwCLGmy9.js.map +1 -0
  56. package/dist/admin/chunks/en-BhgCBe7M.mjs +85 -0
  57. package/dist/admin/chunks/en-BhgCBe7M.mjs.map +1 -0
  58. package/dist/admin/chunks/en-DwQjkHi_.js +87 -0
  59. package/dist/admin/chunks/en-DwQjkHi_.js.map +1 -0
  60. package/dist/admin/chunks/es-B0wXmvRj.mjs +85 -0
  61. package/dist/admin/chunks/es-B0wXmvRj.mjs.map +1 -0
  62. package/dist/admin/chunks/es-BOJOedG5.js +87 -0
  63. package/dist/admin/chunks/es-BOJOedG5.js.map +1 -0
  64. package/dist/admin/chunks/fr-BDNWCNs0.js +51 -0
  65. package/dist/admin/chunks/fr-BDNWCNs0.js.map +1 -0
  66. package/dist/admin/chunks/fr-CGYvGUXg.mjs +49 -0
  67. package/dist/admin/chunks/fr-CGYvGUXg.mjs.map +1 -0
  68. package/dist/admin/chunks/id-CNzbwFjA.mjs +61 -0
  69. package/dist/admin/chunks/id-CNzbwFjA.mjs.map +1 -0
  70. package/dist/admin/chunks/id-UqUPykHZ.js +63 -0
  71. package/dist/admin/chunks/id-UqUPykHZ.js.map +1 -0
  72. package/dist/admin/chunks/index--_o6btSC.js +471 -0
  73. package/dist/admin/chunks/index--_o6btSC.js.map +1 -0
  74. package/dist/admin/chunks/index-BBjNJt_G.mjs +448 -0
  75. package/dist/admin/chunks/index-BBjNJt_G.mjs.map +1 -0
  76. package/dist/admin/chunks/index-BgAfLcWs.mjs +1516 -0
  77. package/dist/admin/chunks/index-BgAfLcWs.mjs.map +1 -0
  78. package/dist/admin/chunks/index-CHTUC0LM.mjs +718 -0
  79. package/dist/admin/chunks/index-CHTUC0LM.mjs.map +1 -0
  80. package/dist/admin/chunks/index-CY5JZ38k.mjs +213 -0
  81. package/dist/admin/chunks/index-CY5JZ38k.mjs.map +1 -0
  82. package/dist/admin/chunks/index-Cu1VuLS3.js +741 -0
  83. package/dist/admin/chunks/index-Cu1VuLS3.js.map +1 -0
  84. package/dist/admin/chunks/index-Cy-tPfRk.mjs +279 -0
  85. package/dist/admin/chunks/index-Cy-tPfRk.mjs.map +1 -0
  86. package/dist/admin/chunks/index-DD-Z6c1S.js +217 -0
  87. package/dist/admin/chunks/index-DD-Z6c1S.js.map +1 -0
  88. package/dist/admin/chunks/index-DFnYIqrB.js +301 -0
  89. package/dist/admin/chunks/index-DFnYIqrB.js.map +1 -0
  90. package/dist/admin/chunks/index-DvubCYNe.js +1537 -0
  91. package/dist/admin/chunks/index-DvubCYNe.js.map +1 -0
  92. package/dist/admin/chunks/it-B2H2foTf.mjs +61 -0
  93. package/dist/admin/chunks/it-B2H2foTf.mjs.map +1 -0
  94. package/dist/admin/chunks/it-D5VuyoLU.js +63 -0
  95. package/dist/admin/chunks/it-D5VuyoLU.js.map +1 -0
  96. package/dist/admin/chunks/ja-C0z9d7L9.mjs +47 -0
  97. package/dist/admin/chunks/ja-C0z9d7L9.mjs.map +1 -0
  98. package/dist/admin/chunks/ja-MpqVsCgs.js +49 -0
  99. package/dist/admin/chunks/ja-MpqVsCgs.js.map +1 -0
  100. package/dist/admin/chunks/ko-Bm-grPSc.js +87 -0
  101. package/dist/admin/chunks/ko-Bm-grPSc.js.map +1 -0
  102. package/dist/admin/chunks/ko-CzUgzpeS.mjs +85 -0
  103. package/dist/admin/chunks/ko-CzUgzpeS.mjs.map +1 -0
  104. package/dist/admin/chunks/ms-CCacxjim.mjs +48 -0
  105. package/dist/admin/chunks/ms-CCacxjim.mjs.map +1 -0
  106. package/dist/admin/chunks/ms-D7eyBD5H.js +50 -0
  107. package/dist/admin/chunks/ms-D7eyBD5H.js.map +1 -0
  108. package/dist/admin/chunks/nl-BIOwAQtI.js +49 -0
  109. package/dist/admin/chunks/nl-BIOwAQtI.js.map +1 -0
  110. package/dist/admin/chunks/nl-DDC3nZW-.mjs +47 -0
  111. package/dist/admin/chunks/nl-DDC3nZW-.mjs.map +1 -0
  112. package/dist/admin/chunks/pl-D5BeNrg_.js +87 -0
  113. package/dist/admin/chunks/pl-D5BeNrg_.js.map +1 -0
  114. package/dist/admin/chunks/pl-XkS463rN.mjs +85 -0
  115. package/dist/admin/chunks/pl-XkS463rN.mjs.map +1 -0
  116. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs +43 -0
  117. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs.map +1 -0
  118. package/dist/admin/chunks/pt-BR-DxPBzQGx.js +45 -0
  119. package/dist/admin/chunks/pt-BR-DxPBzQGx.js.map +1 -0
  120. package/dist/admin/chunks/pt-DQpEvio8.mjs +47 -0
  121. package/dist/admin/chunks/pt-DQpEvio8.mjs.map +1 -0
  122. package/dist/admin/chunks/pt-kkCwzNvH.js +49 -0
  123. package/dist/admin/chunks/pt-kkCwzNvH.js.map +1 -0
  124. package/dist/admin/chunks/ru-BQ0gHmp3.js +87 -0
  125. package/dist/admin/chunks/ru-BQ0gHmp3.js.map +1 -0
  126. package/dist/admin/chunks/ru-nzL_7Mhg.mjs +85 -0
  127. package/dist/admin/chunks/ru-nzL_7Mhg.mjs.map +1 -0
  128. package/dist/admin/chunks/sk-Ddxc_tZA.mjs +49 -0
  129. package/dist/admin/chunks/sk-Ddxc_tZA.mjs.map +1 -0
  130. package/dist/admin/chunks/sk-nVwAPdYC.js +51 -0
  131. package/dist/admin/chunks/sk-nVwAPdYC.js.map +1 -0
  132. package/dist/admin/chunks/sv-BDfk2A-F.js +87 -0
  133. package/dist/admin/chunks/sv-BDfk2A-F.js.map +1 -0
  134. package/dist/admin/chunks/sv-By3RYpMG.mjs +85 -0
  135. package/dist/admin/chunks/sv-By3RYpMG.mjs.map +1 -0
  136. package/dist/admin/chunks/th-BtTtpHe2.js +61 -0
  137. package/dist/admin/chunks/th-BtTtpHe2.js.map +1 -0
  138. package/dist/admin/chunks/th-COl50vqb.mjs +59 -0
  139. package/dist/admin/chunks/th-COl50vqb.mjs.map +1 -0
  140. package/dist/admin/chunks/tr-80SJU6jg.mjs +84 -0
  141. package/dist/admin/chunks/tr-80SJU6jg.mjs.map +1 -0
  142. package/dist/admin/chunks/tr-Di-Nf7cT.js +86 -0
  143. package/dist/admin/chunks/tr-Di-Nf7cT.js.map +1 -0
  144. package/dist/admin/chunks/uk-DnrIlPwG.mjs +85 -0
  145. package/dist/admin/chunks/uk-DnrIlPwG.mjs.map +1 -0
  146. package/dist/admin/chunks/uk-r5zXTAS7.js +87 -0
  147. package/dist/admin/chunks/uk-r5zXTAS7.js.map +1 -0
  148. package/dist/admin/chunks/vi-69AF03Iv.mjs +49 -0
  149. package/dist/admin/chunks/vi-69AF03Iv.mjs.map +1 -0
  150. package/dist/admin/chunks/vi-D9cCsHsU.js +51 -0
  151. package/dist/admin/chunks/vi-D9cCsHsU.js.map +1 -0
  152. package/dist/admin/chunks/zh-BzSkqxo-.mjs +85 -0
  153. package/dist/admin/chunks/zh-BzSkqxo-.mjs.map +1 -0
  154. package/dist/admin/chunks/zh-BzWgJEzz.js +87 -0
  155. package/dist/admin/chunks/zh-BzWgJEzz.js.map +1 -0
  156. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js +87 -0
  157. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js.map +1 -0
  158. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs +85 -0
  159. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs.map +1 -0
  160. package/dist/admin/index.js +8 -0
  161. package/dist/admin/index.js.map +1 -0
  162. package/dist/admin/index.mjs +2 -0
  163. package/dist/admin/index.mjs.map +1 -0
  164. package/dist/server/index.js +4766 -0
  165. package/dist/server/index.js.map +1 -0
  166. package/dist/server/index.mjs +4764 -0
  167. package/dist/server/index.mjs.map +1 -0
  168. package/documentation/content-api.yaml +1 -1
  169. package/jest.config.front.js +1 -0
  170. package/package.json +53 -37
  171. package/rollup.config.mjs +52 -0
  172. package/server/bootstrap/index.js +18 -15
  173. package/server/bootstrap/users-permissions-actions.js +6 -0
  174. package/server/config.js +29 -0
  175. package/server/content-types/user/index.js +0 -1
  176. package/server/controllers/auth.js +75 -39
  177. package/server/controllers/content-manager-user.js +28 -30
  178. package/server/controllers/role.js +17 -4
  179. package/server/controllers/user.js +18 -8
  180. package/server/controllers/validation/auth.js +104 -25
  181. package/server/graphql/types/index.js +1 -0
  182. package/server/graphql/types/me.js +1 -0
  183. package/server/graphql/types/user-input.js +20 -0
  184. package/server/middlewares/rateLimit.js +41 -21
  185. package/server/register.js +2 -2
  186. package/server/services/jwt.js +3 -3
  187. package/server/services/permission.js +3 -7
  188. package/server/services/providers-registry.js +469 -261
  189. package/server/services/providers.js +10 -5
  190. package/server/services/role.js +15 -13
  191. package/server/services/user.js +56 -19
  192. package/server/services/users-permissions.js +15 -13
  193. package/server/strategies/users-permissions.js +1 -8
  194. package/server/utils/index.d.ts +2 -1
  195. package/server/utils/sanitize/sanitizers.js +7 -3
  196. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  197. package/.eslintrc.js +0 -14
  198. package/admin/src/components/FormModal/index.js +0 -123
  199. package/admin/src/components/Permissions/index.js +0 -54
  200. package/admin/src/hooks/index.js +0 -5
  201. package/admin/src/hooks/useFetchRole/index.js +0 -64
  202. package/admin/src/hooks/useFetchRole/reducer.js +0 -31
  203. package/admin/src/hooks/useForm/index.js +0 -67
  204. package/admin/src/hooks/useForm/reducer.js +0 -40
  205. package/admin/src/hooks/usePlugins/index.js +0 -67
  206. package/admin/src/hooks/usePlugins/init.js +0 -5
  207. package/admin/src/hooks/usePlugins/reducer.js +0 -34
  208. package/admin/src/hooks/useRolesList/index.js +0 -62
  209. package/admin/src/hooks/useRolesList/init.js +0 -5
  210. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  211. package/admin/src/pages/AdvancedSettings/index.js +0 -243
  212. package/admin/src/pages/AdvancedSettings/utils/api.js +0 -17
  213. package/admin/src/pages/EmailTemplates/components/EmailForm.js +0 -175
  214. package/admin/src/pages/EmailTemplates/index.js +0 -160
  215. package/admin/src/pages/EmailTemplates/utils/api.js +0 -17
  216. package/admin/src/pages/Providers/index.js +0 -272
  217. package/admin/src/pages/Providers/reducer.js +0 -54
  218. package/admin/src/pages/Providers/utils/api.js +0 -25
  219. package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
  220. package/admin/src/pages/Roles/CreatePage/index.js +0 -182
  221. package/admin/src/pages/Roles/CreatePage/utils/schema.js +0 -9
  222. package/admin/src/pages/Roles/EditPage/index.js +0 -194
  223. package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
  224. package/admin/src/pages/Roles/ListPage/components/TableBody.js +0 -92
  225. package/admin/src/pages/Roles/ListPage/utils/api.js +0 -31
  226. package/admin/src/pages/Roles/ProtectedCreatePage/index.js +0 -12
  227. package/admin/src/pages/Roles/ProtectedEditPage/index.js +0 -12
  228. package/admin/src/pages/Roles/ProtectedListPage/index.js +0 -15
  229. package/admin/src/pages/Roles/index.js +0 -27
  230. package/admin/src/utils/getRequestURL.js +0 -5
  231. package/server/bootstrap/grant-config.js +0 -131
  232. package/strapi-admin.js +0 -3
  233. package/strapi-server.js +0 -3
@@ -1,23 +1,17 @@
1
- // NOTE TO PLUGINS DEVELOPERS:
2
- // If you modify this file by adding new options to the plugin entry point
3
- // Here's the file: strapi/docs/3.0.0-beta.x/plugin-development/frontend-field-api.md
4
- // Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md
5
- // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated
6
- // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED
7
- import { prefixPluginTranslations } from '@strapi/helper-plugin';
8
- import pluginPkg from '../../package.json';
9
- import pluginPermissions from './permissions';
10
- import pluginId from './pluginId';
1
+ import { strapi as pkgStrapi } from '../../package.json';
2
+
3
+ import { PERMISSIONS } from './constants';
11
4
  import getTrad from './utils/getTrad';
5
+ import { prefixPluginTranslations } from './utils/prefixPluginTranslations';
12
6
 
13
- const name = pluginPkg.strapi.name;
7
+ const name = pkgStrapi.name;
14
8
 
15
9
  export default {
16
10
  register(app) {
17
11
  // Create the plugin's settings section
18
12
  app.createSettingSection(
19
13
  {
20
- id: pluginId,
14
+ id: 'users-permissions',
21
15
  intlLabel: {
22
16
  id: getTrad('Settings.section-label'),
23
17
  defaultMessage: 'Users & Permissions plugin',
@@ -30,15 +24,9 @@ export default {
30
24
  defaultMessage: 'Roles',
31
25
  },
32
26
  id: 'roles',
33
- to: `/settings/${pluginId}/roles`,
34
- async Component() {
35
- const component = await import(
36
- /* webpackChunkName: "users-roles-settings-page" */ './pages/Roles'
37
- );
38
-
39
- return component;
40
- },
41
- permissions: pluginPermissions.accessRoles,
27
+ to: `users-permissions/roles`,
28
+ Component: () => import('./pages/Roles'),
29
+ permissions: PERMISSIONS.accessRoles,
42
30
  },
43
31
  {
44
32
  intlLabel: {
@@ -46,15 +34,9 @@ export default {
46
34
  defaultMessage: 'Providers',
47
35
  },
48
36
  id: 'providers',
49
- to: `/settings/${pluginId}/providers`,
50
- async Component() {
51
- const component = await import(
52
- /* webpackChunkName: "users-providers-settings-page" */ './pages/Providers'
53
- );
54
-
55
- return component;
56
- },
57
- permissions: pluginPermissions.readProviders,
37
+ to: `users-permissions/providers`,
38
+ Component: () => import('./pages/Providers'),
39
+ permissions: PERMISSIONS.readProviders,
58
40
  },
59
41
  {
60
42
  intlLabel: {
@@ -62,15 +44,12 @@ export default {
62
44
  defaultMessage: 'Email templates',
63
45
  },
64
46
  id: 'email-templates',
65
- to: `/settings/${pluginId}/email-templates`,
66
- async Component() {
67
- const component = await import(
68
- /* webpackChunkName: "users-email-settings-page" */ './pages/EmailTemplates'
69
- );
70
-
71
- return component;
72
- },
73
- permissions: pluginPermissions.readEmailTemplates,
47
+ to: `users-permissions/email-templates`,
48
+ Component: () =>
49
+ import('./pages/EmailTemplates').then((mod) => ({
50
+ default: mod.ProtectedEmailTemplatesPage,
51
+ })),
52
+ permissions: PERMISSIONS.readEmailTemplates,
74
53
  },
75
54
  {
76
55
  intlLabel: {
@@ -78,21 +57,18 @@ export default {
78
57
  defaultMessage: 'Advanced Settings',
79
58
  },
80
59
  id: 'advanced-settings',
81
- to: `/settings/${pluginId}/advanced-settings`,
82
- async Component() {
83
- const component = await import(
84
- /* webpackChunkName: "users-advanced-settings-page" */ './pages/AdvancedSettings'
85
- );
86
-
87
- return component;
88
- },
89
- permissions: pluginPermissions.readAdvancedSettings,
60
+ to: `users-permissions/advanced-settings`,
61
+ Component: () =>
62
+ import('./pages/AdvancedSettings').then((mod) => ({
63
+ default: mod.ProtectedAdvancedSettingsPage,
64
+ })),
65
+ permissions: PERMISSIONS.readAdvancedSettings,
90
66
  },
91
67
  ]
92
68
  );
93
69
 
94
70
  app.registerPlugin({
95
- id: pluginId,
71
+ id: 'users-permissions',
96
72
  name,
97
73
  });
98
74
  },
@@ -100,12 +76,10 @@ export default {
100
76
  async registerTrads({ locales }) {
101
77
  const importedTrads = await Promise.all(
102
78
  locales.map((locale) => {
103
- return import(
104
- /* webpackChunkName: "users-permissions-translation-[request]" */ `./translations/${locale}.json`
105
- )
79
+ return import(`./translations/${locale}.json`)
106
80
  .then(({ default: data }) => {
107
81
  return {
108
- data: prefixPluginTranslations(data, pluginId),
82
+ data: prefixPluginTranslations(data, 'users-permissions'),
109
83
  locale,
110
84
  };
111
85
  })
@@ -0,0 +1,214 @@
1
+ import * as React from 'react';
2
+
3
+ import { Box, Button, Flex, Grid, Typography, useNotifyAT } from '@strapi/design-system';
4
+ import { Check } from '@strapi/icons';
5
+ import {
6
+ useAPIErrorHandler,
7
+ Page,
8
+ Form,
9
+ InputRenderer,
10
+ useNotification,
11
+ useFetchClient,
12
+ useRBAC,
13
+ Layouts,
14
+ } from '@strapi/strapi/admin';
15
+ import { useIntl } from 'react-intl';
16
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
17
+
18
+ import { PERMISSIONS } from '../../constants';
19
+ import { getTrad } from '../../utils';
20
+
21
+ import layout from './utils/layout';
22
+ import schema from './utils/schema';
23
+
24
+ const ProtectedAdvancedSettingsPage = () => (
25
+ <Page.Protect permissions={PERMISSIONS.readAdvancedSettings}>
26
+ <AdvancedSettingsPage />
27
+ </Page.Protect>
28
+ );
29
+
30
+ const AdvancedSettingsPage = () => {
31
+ const { formatMessage } = useIntl();
32
+ const { toggleNotification } = useNotification();
33
+ const { notifyStatus } = useNotifyAT();
34
+ const queryClient = useQueryClient();
35
+ const { get, put } = useFetchClient();
36
+ const { formatAPIError } = useAPIErrorHandler();
37
+
38
+ const {
39
+ isLoading: isLoadingForPermissions,
40
+ allowedActions: { canUpdate },
41
+ } = useRBAC({ update: PERMISSIONS.updateAdvancedSettings });
42
+
43
+ const { isLoading: isLoadingData, data } = useQuery(
44
+ ['users-permissions', 'advanced'],
45
+ async () => {
46
+ const { data } = await get('/users-permissions/advanced');
47
+
48
+ return data;
49
+ },
50
+ {
51
+ onSuccess() {
52
+ notifyStatus(
53
+ formatMessage({
54
+ id: getTrad('Form.advancedSettings.data.loaded'),
55
+ defaultMessage: 'Advanced settings data has been loaded',
56
+ })
57
+ );
58
+ },
59
+ onError() {
60
+ toggleNotification({
61
+ type: 'danger',
62
+ message: formatMessage({
63
+ id: getTrad('notification.error'),
64
+ defaultMessage: 'An error occured',
65
+ }),
66
+ });
67
+ },
68
+ }
69
+ );
70
+
71
+ const isLoading = isLoadingForPermissions || isLoadingData;
72
+
73
+ const submitMutation = useMutation((body) => put('/users-permissions/advanced', body), {
74
+ async onSuccess() {
75
+ await queryClient.invalidateQueries(['users-permissions', 'advanced']);
76
+
77
+ toggleNotification({
78
+ type: 'success',
79
+ message: formatMessage({
80
+ id: getTrad('notification.success.saved'),
81
+ defaultMessage: 'Saved',
82
+ }),
83
+ });
84
+ },
85
+ onError(error) {
86
+ toggleNotification({
87
+ type: 'danger',
88
+ message: formatAPIError(error),
89
+ });
90
+ },
91
+ refetchActive: true,
92
+ });
93
+
94
+ const { isLoading: isSubmittingForm } = submitMutation;
95
+
96
+ const handleSubmit = async (body) => {
97
+ submitMutation.mutate({
98
+ ...body,
99
+ email_confirmation_redirection: body.email_confirmation
100
+ ? body.email_confirmation_redirection
101
+ : '',
102
+ });
103
+ };
104
+
105
+ if (isLoading) {
106
+ return <Page.Loading />;
107
+ }
108
+
109
+ return (
110
+ <Page.Main aria-busy={isSubmittingForm}>
111
+ <Page.Title>
112
+ {formatMessage(
113
+ { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },
114
+ {
115
+ name: formatMessage({
116
+ id: getTrad('HeaderNav.link.advancedSettings'),
117
+ defaultMessage: 'Advanced Settings',
118
+ }),
119
+ }
120
+ )}
121
+ </Page.Title>
122
+ <Form onSubmit={handleSubmit} initialValues={data.settings} validationSchema={schema}>
123
+ {({ values, isSubmitting, modified }) => {
124
+ return (
125
+ <>
126
+ <Layouts.Header
127
+ title={formatMessage({
128
+ id: getTrad('HeaderNav.link.advancedSettings'),
129
+ defaultMessage: 'Advanced Settings',
130
+ })}
131
+ primaryAction={
132
+ <Button
133
+ loading={isSubmitting}
134
+ type="submit"
135
+ disabled={!modified || !canUpdate}
136
+ startIcon={<Check />}
137
+ size="S"
138
+ >
139
+ {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}
140
+ </Button>
141
+ }
142
+ />
143
+ <Layouts.Content>
144
+ <Box
145
+ background="neutral0"
146
+ hasRadius
147
+ shadow="filterShadow"
148
+ paddingTop={6}
149
+ paddingBottom={6}
150
+ paddingLeft={7}
151
+ paddingRight={7}
152
+ >
153
+ <Flex direction="column" alignItems="stretch" gap={4}>
154
+ <Typography variant="delta" tag="h2">
155
+ {formatMessage({
156
+ id: 'global.settings',
157
+ defaultMessage: 'Settings',
158
+ })}
159
+ </Typography>
160
+ <Grid.Root gap={6}>
161
+ {[
162
+ {
163
+ label: {
164
+ id: getTrad('EditForm.inputSelect.label.role'),
165
+ defaultMessage: 'Default role for authenticated users',
166
+ },
167
+ hint: {
168
+ id: getTrad('EditForm.inputSelect.description.role'),
169
+ defaultMessage:
170
+ 'It will attach the new authenticated user to the selected role.',
171
+ },
172
+ options: data.roles.map((role) => ({
173
+ label: role.name,
174
+ value: role.type,
175
+ })),
176
+ name: 'default_role',
177
+ size: 6,
178
+ type: 'enumeration',
179
+ },
180
+ ...layout,
181
+ ].map(({ size, ...field }) => (
182
+ <Grid.Item
183
+ key={field.name}
184
+ col={size}
185
+ direction="column"
186
+ alignItems="stretch"
187
+ >
188
+ <InputRenderer
189
+ {...field}
190
+ disabled={
191
+ field.name === 'email_confirmation_redirection' &&
192
+ values.email_confirmation === false
193
+ }
194
+ label={formatMessage(field.label)}
195
+ hint={field.hint ? formatMessage(field.hint) : undefined}
196
+ placeholder={
197
+ field.placeholder ? formatMessage(field.placeholder) : undefined
198
+ }
199
+ />
200
+ </Grid.Item>
201
+ ))}
202
+ </Grid.Root>
203
+ </Flex>
204
+ </Box>
205
+ </Layouts.Content>
206
+ </>
207
+ );
208
+ }}
209
+ </Form>
210
+ </Page.Main>
211
+ );
212
+ };
213
+
214
+ export { ProtectedAdvancedSettingsPage, AdvancedSettingsPage };
@@ -2,45 +2,39 @@ import { getTrad } from '../../../utils';
2
2
 
3
3
  const layout = [
4
4
  {
5
- intlLabel: {
5
+ label: {
6
6
  id: getTrad('EditForm.inputToggle.label.email'),
7
7
  defaultMessage: 'One account per email address',
8
8
  },
9
- description: {
9
+ hint: {
10
10
  id: getTrad('EditForm.inputToggle.description.email'),
11
11
  defaultMessage:
12
12
  'Disallow the user to create multiple accounts using the same email address with different authentication providers.',
13
13
  },
14
14
  name: 'unique_email',
15
- type: 'bool',
16
- size: {
17
- col: 12,
18
- xs: 12,
19
- },
15
+ type: 'boolean',
16
+ size: 12,
20
17
  },
21
18
  {
22
- intlLabel: {
19
+ label: {
23
20
  id: getTrad('EditForm.inputToggle.label.sign-up'),
24
21
  defaultMessage: 'Enable sign-ups',
25
22
  },
26
- description: {
23
+ hint: {
27
24
  id: getTrad('EditForm.inputToggle.description.sign-up'),
28
25
  defaultMessage:
29
26
  'When disabled (OFF), the registration process is forbidden. No one can subscribe anymore no matter the used provider.',
30
27
  },
31
28
  name: 'allow_register',
32
- type: 'bool',
33
- size: {
34
- col: 12,
35
- xs: 12,
36
- },
29
+ type: 'boolean',
30
+ size: 12,
37
31
  },
38
32
  {
39
- intlLabel: {
33
+ label: {
40
34
  id: getTrad('EditForm.inputToggle.label.email-reset-password'),
41
35
  defaultMessage: 'Reset password page',
42
36
  },
43
- description: {
37
+ hint: {
44
38
  id: getTrad('EditForm.inputToggle.description.email-reset-password'),
45
39
  defaultMessage: "URL of your application's reset password page.",
46
40
  },
@@ -49,34 +43,28 @@ const layout = [
49
43
  defaultMessage: 'ex: https://youtfrontend.com/reset-password',
50
44
  },
51
45
  name: 'email_reset_password',
52
- type: 'text',
53
- size: {
54
- col: 6,
55
- xs: 12,
56
- },
46
+ type: 'string',
47
+ size: 12,
57
48
  },
58
49
  {
59
- intlLabel: {
50
+ label: {
60
51
  id: getTrad('EditForm.inputToggle.label.email-confirmation'),
61
52
  defaultMessage: 'Enable email confirmation',
62
53
  },
63
- description: {
54
+ hint: {
64
55
  id: getTrad('EditForm.inputToggle.description.email-confirmation'),
65
56
  defaultMessage: 'When enabled (ON), new registered users receive a confirmation email.',
66
57
  },
67
58
  name: 'email_confirmation',
68
- type: 'bool',
69
- size: {
70
- col: 12,
71
- xs: 12,
72
- },
59
+ type: 'boolean',
60
+ size: 12,
73
61
  },
74
62
  {
75
- intlLabel: {
63
+ label: {
76
64
  id: getTrad('EditForm.inputToggle.label.email-confirmation-redirection'),
77
65
  defaultMessage: 'Redirection url',
78
66
  },
79
- description: {
67
+ hint: {
80
68
  id: getTrad('EditForm.inputToggle.description.email-confirmation-redirection'),
81
69
  defaultMessage: 'After you confirmed your email, choose where you will be redirected.',
82
70
  },
@@ -85,11 +73,8 @@ const layout = [
85
73
  defaultMessage: 'ex: https://youtfrontend.com/email-confirmation',
86
74
  },
87
75
  name: 'email_confirmation_redirection',
88
- type: 'text',
89
- size: {
90
- col: 6,
91
- xs: 12,
92
- },
76
+ type: 'string',
77
+ size: 12,
93
78
  },
94
79
  ];
95
80
 
@@ -1,5 +1,5 @@
1
+ import { translatedErrors } from '@strapi/strapi/admin';
1
2
  import * as yup from 'yup';
2
- import { translatedErrors } from '@strapi/helper-plugin';
3
3
 
4
4
  // eslint-disable-next-line prefer-regex-literals
5
5
  const URL_REGEX = new RegExp('(^$)|((.+:\\/\\/.*)(d*)\\/?(.*))');
@@ -12,7 +12,10 @@ const schema = yup.object().shape({
12
12
  }),
13
13
  email_reset_password: yup
14
14
  .string(translatedErrors.string)
15
- .matches(URL_REGEX, translatedErrors.regex)
15
+ .matches(URL_REGEX, {
16
+ id: translatedErrors.regex.id,
17
+ defaultMessage: 'This is not a valid URL',
18
+ })
16
19
  .nullable(),
17
20
  });
18
21
 
@@ -0,0 +1,156 @@
1
+ import * as React from 'react';
2
+
3
+ import { Button, Grid, Modal, Breadcrumbs, Crumb, VisuallyHidden } from '@strapi/design-system';
4
+ import { Form, InputRenderer } from '@strapi/strapi/admin';
5
+ import PropTypes from 'prop-types';
6
+ import { useIntl } from 'react-intl';
7
+
8
+ import { getTrad } from '../../../utils';
9
+ import schema from '../utils/schema';
10
+
11
+ const EmailForm = ({ template = {}, onToggle, open, onSubmit }) => {
12
+ const { formatMessage } = useIntl();
13
+
14
+ return (
15
+ <Modal.Root open={open} onOpenChange={onToggle}>
16
+ <Modal.Content>
17
+ <Modal.Header>
18
+ <Breadcrumbs
19
+ label={`${formatMessage({
20
+ id: getTrad('PopUpForm.header.edit.email-templates'),
21
+ defaultMessage: 'Edit email template',
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>
120
+ <Button loading={isSubmitting} type="submit">
121
+ Finish
122
+ </Button>
123
+ </Modal.Footer>
124
+ </>
125
+ );
126
+ }}
127
+ </Form>
128
+ </Modal.Content>
129
+ </Modal.Root>
130
+ );
131
+ };
132
+
133
+ EmailForm.defaultProps = {
134
+ template: {},
135
+ };
136
+
137
+ EmailForm.propTypes = {
138
+ template: PropTypes.shape({
139
+ display: PropTypes.string,
140
+ icon: PropTypes.string,
141
+ options: PropTypes.shape({
142
+ from: PropTypes.shape({
143
+ name: PropTypes.string,
144
+ email: PropTypes.string,
145
+ }),
146
+ message: PropTypes.string,
147
+ object: PropTypes.string,
148
+ response_email: PropTypes.string,
149
+ }),
150
+ }),
151
+ open: PropTypes.bool.isRequired,
152
+ onSubmit: PropTypes.func.isRequired,
153
+ onToggle: PropTypes.func.isRequired,
154
+ };
155
+
156
+ export default EmailForm;