@strapi/plugin-users-permissions 0.0.0-next.d2c02ba7d58eb81b8c45c3d12076d6413ecde204 → 0.0.0-next.d2d15ef227d67cce89c2673764c0555c841cd29c

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 (194) hide show
  1. package/.eslintignore +1 -2
  2. package/.eslintrc +17 -0
  3. package/LICENSE +18 -3
  4. package/admin/src/components/BoundRoute/{index.js → index.jsx} +2 -2
  5. package/admin/src/components/FormModal/Input/{index.js → index.jsx} +32 -31
  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} +13 -22
  9. package/admin/src/components/Permissions/index.jsx +47 -0
  10. package/admin/src/components/Permissions/reducer.js +1 -1
  11. package/admin/src/components/Policies/{index.js → index.jsx} +7 -5
  12. package/admin/src/components/UsersPermissions/{index.js → index.jsx} +15 -7
  13. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  14. package/admin/src/index.js +16 -43
  15. package/admin/src/pages/AdvancedSettings/index.jsx +214 -0
  16. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  17. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  18. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +156 -0
  19. package/admin/src/pages/EmailTemplates/components/{EmailTable.js → EmailTable.jsx} +20 -17
  20. package/admin/src/pages/EmailTemplates/{index.js → index.jsx} +36 -62
  21. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  22. package/admin/src/pages/Providers/{index.js → index.jsx} +98 -113
  23. package/admin/src/pages/Providers/utils/forms.js +11 -11
  24. package/admin/src/pages/Roles/constants.js +3 -3
  25. package/admin/src/pages/Roles/hooks/usePlugins.js +4 -4
  26. package/admin/src/pages/Roles/index.jsx +24 -0
  27. package/admin/src/pages/Roles/pages/{CreatePage.js → CreatePage.jsx} +53 -58
  28. package/admin/src/pages/Roles/pages/{EditPage.js → EditPage.jsx} +63 -68
  29. package/admin/src/pages/Roles/pages/ListPage/components/{TableBody.js → TableBody.jsx} +27 -31
  30. package/admin/src/pages/Roles/pages/ListPage/{index.js → index.jsx} +81 -55
  31. package/admin/src/translations/en.json +1 -1
  32. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  33. package/dist/_chunks/ar-BguGUqwK.js +44 -0
  34. package/dist/_chunks/ar-BguGUqwK.js.map +1 -0
  35. package/dist/_chunks/ar-CK8BRRXB.mjs +44 -0
  36. package/dist/_chunks/ar-CK8BRRXB.mjs.map +1 -0
  37. package/dist/_chunks/cs-BVigMk0l.mjs +50 -0
  38. package/dist/_chunks/cs-BVigMk0l.mjs.map +1 -0
  39. package/dist/_chunks/cs-BW8-K_GY.js +50 -0
  40. package/dist/_chunks/cs-BW8-K_GY.js.map +1 -0
  41. package/dist/_chunks/de-BKUdRFI4.mjs +62 -0
  42. package/dist/_chunks/de-BKUdRFI4.mjs.map +1 -0
  43. package/dist/_chunks/de-owXpVluI.js +62 -0
  44. package/dist/_chunks/de-owXpVluI.js.map +1 -0
  45. package/dist/_chunks/dk-BQiTK50l.mjs +86 -0
  46. package/dist/_chunks/dk-BQiTK50l.mjs.map +1 -0
  47. package/dist/_chunks/dk-LXAnbuBk.js +86 -0
  48. package/dist/_chunks/dk-LXAnbuBk.js.map +1 -0
  49. package/dist/_chunks/en-DOHtPf-2.mjs +86 -0
  50. package/dist/_chunks/en-DOHtPf-2.mjs.map +1 -0
  51. package/dist/_chunks/en-MHo5mcsU.js +86 -0
  52. package/dist/_chunks/en-MHo5mcsU.js.map +1 -0
  53. package/dist/_chunks/es-BwLCLXAQ.js +86 -0
  54. package/dist/_chunks/es-BwLCLXAQ.js.map +1 -0
  55. package/dist/_chunks/es-DNgOVMjD.mjs +86 -0
  56. package/dist/_chunks/es-DNgOVMjD.mjs.map +1 -0
  57. package/dist/_chunks/fr-DkgRugiU.mjs +50 -0
  58. package/dist/_chunks/fr-DkgRugiU.mjs.map +1 -0
  59. package/dist/_chunks/fr-DkhpSjjm.js +50 -0
  60. package/dist/_chunks/fr-DkhpSjjm.js.map +1 -0
  61. package/dist/_chunks/id-BTemOeTZ.js +62 -0
  62. package/dist/_chunks/id-BTemOeTZ.js.map +1 -0
  63. package/dist/_chunks/id-BdEsvnaF.mjs +62 -0
  64. package/dist/_chunks/id-BdEsvnaF.mjs.map +1 -0
  65. package/dist/_chunks/index-B9cFxoCN.mjs +615 -0
  66. package/dist/_chunks/index-B9cFxoCN.mjs.map +1 -0
  67. package/dist/_chunks/index-BJTnrL31.js +281 -0
  68. package/dist/_chunks/index-BJTnrL31.js.map +1 -0
  69. package/dist/_chunks/index-CAgV-G5k.js +1173 -0
  70. package/dist/_chunks/index-CAgV-G5k.js.map +1 -0
  71. package/dist/_chunks/index-CI_b1cXd.mjs +1143 -0
  72. package/dist/_chunks/index-CI_b1cXd.mjs.map +1 -0
  73. package/dist/_chunks/index-Cb03Ke48.js +366 -0
  74. package/dist/_chunks/index-Cb03Ke48.js.map +1 -0
  75. package/dist/_chunks/index-DDglyd0X.mjs +262 -0
  76. package/dist/_chunks/index-DDglyd0X.mjs.map +1 -0
  77. package/dist/_chunks/index-DJOPnOVo.mjs +344 -0
  78. package/dist/_chunks/index-DJOPnOVo.mjs.map +1 -0
  79. package/dist/_chunks/index-QPUYgtlo-BfJxOAzF.mjs +11845 -0
  80. package/dist/_chunks/index-QPUYgtlo-BfJxOAzF.mjs.map +1 -0
  81. package/dist/_chunks/index-QPUYgtlo-QiBdpWEj.js +11869 -0
  82. package/dist/_chunks/index-QPUYgtlo-QiBdpWEj.js.map +1 -0
  83. package/dist/_chunks/index-_vrdPeYp.js +248 -0
  84. package/dist/_chunks/index-_vrdPeYp.js.map +1 -0
  85. package/dist/_chunks/index-bDCZWhLO.mjs +249 -0
  86. package/dist/_chunks/index-bDCZWhLO.mjs.map +1 -0
  87. package/dist/_chunks/index-cL_YxyjM.js +638 -0
  88. package/dist/_chunks/index-cL_YxyjM.js.map +1 -0
  89. package/dist/_chunks/it-B-rv0E24.mjs +62 -0
  90. package/dist/_chunks/it-B-rv0E24.mjs.map +1 -0
  91. package/dist/_chunks/it-D1rH6V6_.js +62 -0
  92. package/dist/_chunks/it-D1rH6V6_.js.map +1 -0
  93. package/dist/_chunks/ja-C8K-VBPD.mjs +48 -0
  94. package/dist/_chunks/ja-C8K-VBPD.mjs.map +1 -0
  95. package/dist/_chunks/ja-DqShgTMf.js +48 -0
  96. package/dist/_chunks/ja-DqShgTMf.js.map +1 -0
  97. package/dist/_chunks/ko-B9DGEPWH.js +86 -0
  98. package/dist/_chunks/ko-B9DGEPWH.js.map +1 -0
  99. package/dist/_chunks/ko-Busb0wIY.mjs +86 -0
  100. package/dist/_chunks/ko-Busb0wIY.mjs.map +1 -0
  101. package/dist/_chunks/ms-ByvsQjRt.mjs +49 -0
  102. package/dist/_chunks/ms-ByvsQjRt.mjs.map +1 -0
  103. package/dist/_chunks/ms-CPBU3LWf.js +49 -0
  104. package/dist/_chunks/ms-CPBU3LWf.js.map +1 -0
  105. package/dist/_chunks/nl-5qO8Rpcy.mjs +48 -0
  106. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +1 -0
  107. package/dist/_chunks/nl-CwNB6YoO.js +48 -0
  108. package/dist/_chunks/nl-CwNB6YoO.js.map +1 -0
  109. package/dist/_chunks/pl-BdIzifBE.mjs +86 -0
  110. package/dist/_chunks/pl-BdIzifBE.mjs.map +1 -0
  111. package/dist/_chunks/pl-Do9UD69f.js +86 -0
  112. package/dist/_chunks/pl-Do9UD69f.js.map +1 -0
  113. package/dist/_chunks/pt-BIO24ioG.mjs +48 -0
  114. package/dist/_chunks/pt-BIO24ioG.mjs.map +1 -0
  115. package/dist/_chunks/pt-BR-D7dZhxuP.js +44 -0
  116. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +1 -0
  117. package/dist/_chunks/pt-BR-f0p23AQZ.mjs +44 -0
  118. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +1 -0
  119. package/dist/_chunks/pt-fdvyOnUp.js +48 -0
  120. package/dist/_chunks/pt-fdvyOnUp.js.map +1 -0
  121. package/dist/_chunks/ru-C94rjPGA.js +86 -0
  122. package/dist/_chunks/ru-C94rjPGA.js.map +1 -0
  123. package/dist/_chunks/ru-VWy-IB7K.mjs +86 -0
  124. package/dist/_chunks/ru-VWy-IB7K.mjs.map +1 -0
  125. package/dist/_chunks/sk-BABEhykl.js +50 -0
  126. package/dist/_chunks/sk-BABEhykl.js.map +1 -0
  127. package/dist/_chunks/sk-B_LIcepm.mjs +50 -0
  128. package/dist/_chunks/sk-B_LIcepm.mjs.map +1 -0
  129. package/dist/_chunks/sv-ABLKOokl.mjs +86 -0
  130. package/dist/_chunks/sv-ABLKOokl.mjs.map +1 -0
  131. package/dist/_chunks/sv-Be43LhA9.js +86 -0
  132. package/dist/_chunks/sv-Be43LhA9.js.map +1 -0
  133. package/dist/_chunks/th-DKyP7ueR.mjs +60 -0
  134. package/dist/_chunks/th-DKyP7ueR.mjs.map +1 -0
  135. package/dist/_chunks/th-DgVhVLhL.js +60 -0
  136. package/dist/_chunks/th-DgVhVLhL.js.map +1 -0
  137. package/dist/_chunks/tr-B_idhkEs.js +85 -0
  138. package/dist/_chunks/tr-B_idhkEs.js.map +1 -0
  139. package/dist/_chunks/tr-qa1Q5UjC.mjs +85 -0
  140. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +1 -0
  141. package/dist/_chunks/uk-BmRqbeQc.mjs +49 -0
  142. package/dist/_chunks/uk-BmRqbeQc.mjs.map +1 -0
  143. package/dist/_chunks/uk-LHOivnhP.js +49 -0
  144. package/dist/_chunks/uk-LHOivnhP.js.map +1 -0
  145. package/dist/_chunks/vi-CdVRdKDw.js +50 -0
  146. package/dist/_chunks/vi-CdVRdKDw.js.map +1 -0
  147. package/dist/_chunks/vi-HW-EdMea.mjs +50 -0
  148. package/dist/_chunks/vi-HW-EdMea.mjs.map +1 -0
  149. package/dist/_chunks/zh-5hKkVPA4.mjs +86 -0
  150. package/dist/_chunks/zh-5hKkVPA4.mjs.map +1 -0
  151. package/dist/_chunks/zh-Cuq8gMnF.js +86 -0
  152. package/dist/_chunks/zh-Cuq8gMnF.js.map +1 -0
  153. package/dist/_chunks/zh-Hans-BHilK-yc.mjs +86 -0
  154. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +1 -0
  155. package/dist/_chunks/zh-Hans-GQDMKtY4.js +86 -0
  156. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +1 -0
  157. package/dist/admin/index.js +4 -0
  158. package/dist/admin/index.js.map +1 -0
  159. package/dist/admin/index.mjs +5 -0
  160. package/dist/admin/index.mjs.map +1 -0
  161. package/package.json +45 -26
  162. package/packup.config.ts +22 -0
  163. package/server/bootstrap/index.js +18 -51
  164. package/server/bootstrap/users-permissions-actions.js +6 -0
  165. package/server/config.js +29 -0
  166. package/server/content-types/user/index.js +0 -1
  167. package/server/controllers/auth.js +48 -59
  168. package/server/controllers/content-manager-user.js +28 -30
  169. package/server/controllers/role.js +1 -1
  170. package/server/controllers/user.js +8 -9
  171. package/server/middlewares/rateLimit.js +1 -1
  172. package/server/register.js +1 -1
  173. package/server/services/jwt.js +3 -3
  174. package/server/services/permission.js +3 -7
  175. package/server/services/providers-registry.js +469 -261
  176. package/server/services/providers.js +10 -5
  177. package/server/services/role.js +15 -13
  178. package/server/services/user.js +56 -19
  179. package/server/services/users-permissions.js +15 -13
  180. package/server/utils/index.d.ts +2 -1
  181. package/server/utils/sanitize/sanitizers.js +7 -3
  182. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  183. package/.eslintrc.js +0 -14
  184. package/admin/src/components/FormModal/index.js +0 -126
  185. package/admin/src/components/Permissions/index.js +0 -55
  186. package/admin/src/pages/AdvancedSettings/index.js +0 -259
  187. package/admin/src/pages/EmailTemplates/components/EmailForm.js +0 -176
  188. package/admin/src/pages/Roles/index.js +0 -33
  189. package/admin/src/pages/Roles/pages/ListPage/utils/api.js +0 -30
  190. package/server/bootstrap/grant-config.js +0 -131
  191. package/strapi-admin.js +0 -3
  192. package/strapi-server.js +0 -3
  193. /package/admin/src/components/Permissions/PermissionRow/{index.js → index.jsx} +0 -0
  194. /package/admin/src/contexts/UsersPermissionsContext/{index.js → index.jsx} +0 -0
@@ -0,0 +1,615 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { u as useTracking, L as Layouts } from "./index-QPUYgtlo-BfJxOAzF.mjs";
4
+ import { Field, Toggle, TextInput, Modal, Breadcrumbs, Crumb, Flex, Grid, Button, useCollator, Table, Thead, Tr, Th, Typography, VisuallyHidden, Tbody, Td, IconButton } from "@strapi/design-system";
5
+ import { Pencil } from "@strapi/icons";
6
+ import { translatedErrors, useNotification, useFetchClient, useAPIErrorHandler, useRBAC, Page } from "@strapi/strapi/admin";
7
+ import upperFirst from "lodash/upperFirst";
8
+ import { useIntl } from "react-intl";
9
+ import { useQueryClient, useQuery, useMutation } from "react-query";
10
+ import { Formik, Form } from "formik";
11
+ import PropTypes from "prop-types";
12
+ import { g as getTrad, P as PERMISSIONS } from "./index-bDCZWhLO.mjs";
13
+ import "lodash/isEmpty";
14
+ import * as yup from "yup";
15
+ const Input = ({
16
+ description,
17
+ disabled,
18
+ intlLabel,
19
+ error,
20
+ name,
21
+ onChange,
22
+ placeholder,
23
+ providerToEditName,
24
+ type,
25
+ value
26
+ }) => {
27
+ const { formatMessage } = useIntl();
28
+ const inputValue = name === "noName" ? `${window.strapi.backendURL}/api/connect/${providerToEditName}/callback` : value;
29
+ const label = formatMessage(
30
+ { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
31
+ { provider: providerToEditName, ...intlLabel.values }
32
+ );
33
+ const hint = description ? formatMessage(
34
+ { id: description.id, defaultMessage: description.defaultMessage },
35
+ { provider: providerToEditName, ...description.values }
36
+ ) : "";
37
+ if (type === "bool") {
38
+ return /* @__PURE__ */ jsxs(Field.Root, { hint, name, children: [
39
+ /* @__PURE__ */ jsx(Field.Label, { children: label }),
40
+ /* @__PURE__ */ jsx(
41
+ Toggle,
42
+ {
43
+ "aria-label": name,
44
+ checked: value,
45
+ disabled,
46
+ offLabel: formatMessage({
47
+ id: "app.components.ToggleCheckbox.off-label",
48
+ defaultMessage: "Off"
49
+ }),
50
+ onLabel: formatMessage({
51
+ id: "app.components.ToggleCheckbox.on-label",
52
+ defaultMessage: "On"
53
+ }),
54
+ onChange: (e) => {
55
+ onChange({ target: { name, value: e.target.checked } });
56
+ }
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx(Field.Hint, {})
60
+ ] });
61
+ }
62
+ const formattedPlaceholder = placeholder ? formatMessage(
63
+ { id: placeholder.id, defaultMessage: placeholder.defaultMessage },
64
+ { ...placeholder.values }
65
+ ) : "";
66
+ const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : "";
67
+ return /* @__PURE__ */ jsxs(Field.Root, { error: errorMessage, name, children: [
68
+ /* @__PURE__ */ jsx(Field.Label, { children: label }),
69
+ /* @__PURE__ */ jsx(
70
+ TextInput,
71
+ {
72
+ disabled,
73
+ onChange,
74
+ placeholder: formattedPlaceholder,
75
+ type,
76
+ value: inputValue
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsx(Field.Error, {})
80
+ ] });
81
+ };
82
+ Input.defaultProps = {
83
+ description: null,
84
+ disabled: false,
85
+ error: "",
86
+ placeholder: null,
87
+ value: ""
88
+ };
89
+ Input.propTypes = {
90
+ description: PropTypes.shape({
91
+ id: PropTypes.string.isRequired,
92
+ defaultMessage: PropTypes.string.isRequired,
93
+ values: PropTypes.object
94
+ }),
95
+ disabled: PropTypes.bool,
96
+ error: PropTypes.string,
97
+ intlLabel: PropTypes.shape({
98
+ id: PropTypes.string.isRequired,
99
+ defaultMessage: PropTypes.string.isRequired,
100
+ values: PropTypes.object
101
+ }).isRequired,
102
+ name: PropTypes.string.isRequired,
103
+ onChange: PropTypes.func.isRequired,
104
+ placeholder: PropTypes.shape({
105
+ id: PropTypes.string.isRequired,
106
+ defaultMessage: PropTypes.string.isRequired,
107
+ values: PropTypes.object
108
+ }),
109
+ providerToEditName: PropTypes.string.isRequired,
110
+ type: PropTypes.string.isRequired,
111
+ value: PropTypes.oneOfType([PropTypes.bool, PropTypes.string])
112
+ };
113
+ const FormModal = ({
114
+ headerBreadcrumbs,
115
+ initialData,
116
+ isSubmiting,
117
+ layout,
118
+ isOpen,
119
+ onSubmit,
120
+ onToggle,
121
+ providerToEditName
122
+ }) => {
123
+ const { formatMessage } = useIntl();
124
+ return /* @__PURE__ */ jsx(Modal.Root, { open: isOpen, onOpenChange: onToggle, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
125
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Breadcrumbs, { label: headerBreadcrumbs.join(", "), children: headerBreadcrumbs.map((crumb, index, arr) => /* @__PURE__ */ jsx(Crumb, { isCurrent: index === arr.length - 1, children: crumb }, crumb)) }) }),
126
+ /* @__PURE__ */ jsx(
127
+ Formik,
128
+ {
129
+ onSubmit: (values) => onSubmit(values),
130
+ initialValues: initialData,
131
+ validationSchema: layout.schema,
132
+ validateOnChange: false,
133
+ children: ({ errors, handleChange, values }) => {
134
+ return /* @__PURE__ */ jsxs(Form, { children: [
135
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 1, children: /* @__PURE__ */ jsx(Grid.Root, { gap: 5, children: layout.form.map((row) => {
136
+ return row.map((input) => {
137
+ return /* @__PURE__ */ jsx(
138
+ Grid.Item,
139
+ {
140
+ col: input.size,
141
+ xs: 12,
142
+ direction: "column",
143
+ alignItems: "stretch",
144
+ children: /* @__PURE__ */ jsx(
145
+ Input,
146
+ {
147
+ ...input,
148
+ error: errors[input.name],
149
+ onChange: handleChange,
150
+ value: values[input.name],
151
+ providerToEditName
152
+ }
153
+ )
154
+ },
155
+ input.name
156
+ );
157
+ });
158
+ }) }) }) }),
159
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
160
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onToggle, type: "button", children: formatMessage({
161
+ id: "app.components.Button.cancel",
162
+ defaultMessage: "Cancel"
163
+ }) }),
164
+ /* @__PURE__ */ jsx(Button, { type: "submit", loading: isSubmiting, children: formatMessage({ id: "global.save", defaultMessage: "Save" }) })
165
+ ] })
166
+ ] });
167
+ }
168
+ }
169
+ )
170
+ ] }) });
171
+ };
172
+ FormModal.defaultProps = {
173
+ initialData: null,
174
+ providerToEditName: null
175
+ };
176
+ FormModal.propTypes = {
177
+ headerBreadcrumbs: PropTypes.arrayOf(PropTypes.string).isRequired,
178
+ initialData: PropTypes.object,
179
+ layout: PropTypes.shape({
180
+ form: PropTypes.arrayOf(PropTypes.array),
181
+ schema: PropTypes.object
182
+ }).isRequired,
183
+ isOpen: PropTypes.bool.isRequired,
184
+ isSubmiting: PropTypes.bool.isRequired,
185
+ onSubmit: PropTypes.func.isRequired,
186
+ onToggle: PropTypes.func.isRequired,
187
+ providerToEditName: PropTypes.string
188
+ };
189
+ const callbackLabel = {
190
+ id: getTrad("PopUpForm.Providers.redirectURL.front-end.label"),
191
+ defaultMessage: "The redirect URL to your front-end app"
192
+ };
193
+ const callbackPlaceholder = {
194
+ id: "http://www.client-app.com",
195
+ defaultMessage: "http://www.client-app.com"
196
+ };
197
+ const enabledDescription = {
198
+ id: getTrad("PopUpForm.Providers.enabled.description"),
199
+ defaultMessage: "If disabled, users won't be able to use this provider."
200
+ };
201
+ const enabledLabel = {
202
+ id: getTrad("PopUpForm.Providers.enabled.label"),
203
+ defaultMessage: "Enable"
204
+ };
205
+ const keyLabel = { id: getTrad("PopUpForm.Providers.key.label"), defaultMessage: "Client ID" };
206
+ const hintLabel = {
207
+ id: getTrad("PopUpForm.Providers.redirectURL.label"),
208
+ defaultMessage: "The redirect URL to add in your {provider} application configurations"
209
+ };
210
+ const textPlaceholder = {
211
+ id: getTrad("PopUpForm.Providers.key.placeholder"),
212
+ defaultMessage: "TEXT"
213
+ };
214
+ const secretLabel = {
215
+ id: getTrad("PopUpForm.Providers.secret.label"),
216
+ defaultMessage: "Client Secret"
217
+ };
218
+ const forms = {
219
+ email: {
220
+ form: [
221
+ [
222
+ {
223
+ intlLabel: enabledLabel,
224
+ name: "enabled",
225
+ type: "bool",
226
+ description: enabledDescription,
227
+ size: 6
228
+ // TODO check if still needed
229
+ // validations: {
230
+ // required: true,
231
+ // },
232
+ }
233
+ ]
234
+ ],
235
+ schema: yup.object().shape({
236
+ enabled: yup.bool().required(translatedErrors.required.id)
237
+ })
238
+ },
239
+ providers: {
240
+ form: [
241
+ [
242
+ {
243
+ intlLabel: enabledLabel,
244
+ name: "enabled",
245
+ type: "bool",
246
+ description: enabledDescription,
247
+ size: 6,
248
+ validations: {
249
+ required: true
250
+ }
251
+ }
252
+ ],
253
+ [
254
+ {
255
+ intlLabel: keyLabel,
256
+ name: "key",
257
+ type: "text",
258
+ placeholder: textPlaceholder,
259
+ size: 12,
260
+ validations: {
261
+ required: true
262
+ }
263
+ }
264
+ ],
265
+ [
266
+ {
267
+ intlLabel: secretLabel,
268
+ name: "secret",
269
+ type: "text",
270
+ placeholder: textPlaceholder,
271
+ size: 12,
272
+ validations: {
273
+ required: true
274
+ }
275
+ }
276
+ ],
277
+ [
278
+ {
279
+ intlLabel: callbackLabel,
280
+ placeholder: callbackPlaceholder,
281
+ name: "callback",
282
+ type: "text",
283
+ size: 12,
284
+ validations: {
285
+ required: true
286
+ }
287
+ }
288
+ ],
289
+ [
290
+ {
291
+ intlLabel: hintLabel,
292
+ name: "noName",
293
+ type: "text",
294
+ validations: {},
295
+ size: 12,
296
+ disabled: true
297
+ }
298
+ ]
299
+ ],
300
+ schema: yup.object().shape({
301
+ enabled: yup.bool().required(translatedErrors.required.id),
302
+ key: yup.string().when("enabled", {
303
+ is: true,
304
+ then: yup.string().required(translatedErrors.required.id),
305
+ otherwise: yup.string()
306
+ }),
307
+ secret: yup.string().when("enabled", {
308
+ is: true,
309
+ then: yup.string().required(translatedErrors.required.id),
310
+ otherwise: yup.string()
311
+ }),
312
+ callback: yup.string().when("enabled", {
313
+ is: true,
314
+ then: yup.string().required(translatedErrors.required.id),
315
+ otherwise: yup.string()
316
+ })
317
+ })
318
+ },
319
+ providersWithSubdomain: {
320
+ form: [
321
+ [
322
+ {
323
+ intlLabel: enabledLabel,
324
+ name: "enabled",
325
+ type: "bool",
326
+ description: enabledDescription,
327
+ size: 6,
328
+ validations: {
329
+ required: true
330
+ }
331
+ }
332
+ ],
333
+ [
334
+ {
335
+ intlLabel: keyLabel,
336
+ name: "key",
337
+ type: "text",
338
+ placeholder: textPlaceholder,
339
+ size: 12,
340
+ validations: {
341
+ required: true
342
+ }
343
+ }
344
+ ],
345
+ [
346
+ {
347
+ intlLabel: secretLabel,
348
+ name: "secret",
349
+ type: "text",
350
+ placeholder: textPlaceholder,
351
+ size: 12,
352
+ validations: {
353
+ required: true
354
+ }
355
+ }
356
+ ],
357
+ [
358
+ {
359
+ intlLabel: {
360
+ id: getTrad({ id: "PopUpForm.Providers.jwksurl.label" }),
361
+ defaultMessage: "JWKS URL"
362
+ },
363
+ name: "jwksurl",
364
+ type: "text",
365
+ placeholder: textPlaceholder,
366
+ size: 12,
367
+ validations: {
368
+ required: false
369
+ }
370
+ }
371
+ ],
372
+ [
373
+ {
374
+ intlLabel: {
375
+ id: getTrad("PopUpForm.Providers.subdomain.label"),
376
+ defaultMessage: "Host URI (Subdomain)"
377
+ },
378
+ name: "subdomain",
379
+ type: "text",
380
+ placeholder: {
381
+ id: getTrad("PopUpForm.Providers.subdomain.placeholder"),
382
+ defaultMessage: "my.subdomain.com"
383
+ },
384
+ size: 12,
385
+ validations: {
386
+ required: true
387
+ }
388
+ }
389
+ ],
390
+ [
391
+ {
392
+ intlLabel: callbackLabel,
393
+ placeholder: callbackPlaceholder,
394
+ name: "callback",
395
+ type: "text",
396
+ size: 12,
397
+ validations: {
398
+ required: true
399
+ }
400
+ }
401
+ ],
402
+ [
403
+ {
404
+ intlLabel: hintLabel,
405
+ name: "noName",
406
+ type: "text",
407
+ validations: {},
408
+ size: 12,
409
+ disabled: true
410
+ }
411
+ ]
412
+ ],
413
+ schema: yup.object().shape({
414
+ enabled: yup.bool().required(translatedErrors.required.id),
415
+ key: yup.string().when("enabled", {
416
+ is: true,
417
+ then: yup.string().required(translatedErrors.required.id),
418
+ otherwise: yup.string()
419
+ }),
420
+ secret: yup.string().when("enabled", {
421
+ is: true,
422
+ then: yup.string().required(translatedErrors.required.id),
423
+ otherwise: yup.string()
424
+ }),
425
+ subdomain: yup.string().when("enabled", {
426
+ is: true,
427
+ then: yup.string().required(translatedErrors.required.id),
428
+ otherwise: yup.string()
429
+ }),
430
+ callback: yup.string().when("enabled", {
431
+ is: true,
432
+ then: yup.string().required(translatedErrors.required.id),
433
+ otherwise: yup.string()
434
+ })
435
+ })
436
+ }
437
+ };
438
+ const ProvidersPage = () => {
439
+ const { formatMessage, locale } = useIntl();
440
+ const queryClient = useQueryClient();
441
+ const { trackUsage } = useTracking();
442
+ const [isOpen, setIsOpen] = React.useState(false);
443
+ const [providerToEditName, setProviderToEditName] = React.useState(null);
444
+ const { toggleNotification } = useNotification();
445
+ const { get, put } = useFetchClient();
446
+ const { formatAPIError } = useAPIErrorHandler();
447
+ const formatter = useCollator(locale, {
448
+ sensitivity: "base"
449
+ });
450
+ const {
451
+ isLoading: isLoadingPermissions,
452
+ allowedActions: { canUpdate }
453
+ } = useRBAC({ update: PERMISSIONS.updateProviders });
454
+ const { isLoading: isLoadingData, data } = useQuery(
455
+ ["users-permissions", "get-providers"],
456
+ async () => {
457
+ const { data: data2 } = await get("/users-permissions/providers");
458
+ return data2;
459
+ },
460
+ {
461
+ initialData: {}
462
+ }
463
+ );
464
+ const submitMutation = useMutation((body) => put("/users-permissions/providers", body), {
465
+ async onSuccess() {
466
+ await queryClient.invalidateQueries(["users-permissions", "get-providers"]);
467
+ toggleNotification({
468
+ type: "success",
469
+ message: formatMessage({ id: getTrad("notification.success.submit") })
470
+ });
471
+ trackUsage("didEditAuthenticationProvider");
472
+ handleToggleModal();
473
+ },
474
+ onError(error) {
475
+ toggleNotification({
476
+ type: "danger",
477
+ message: formatAPIError(error)
478
+ });
479
+ },
480
+ refetchActive: false
481
+ });
482
+ const providers = Object.entries(data).reduce((acc, [name, provider]) => {
483
+ const { icon, enabled, subdomain } = provider;
484
+ acc.push({
485
+ name,
486
+ icon: icon === "envelope" ? ["fas", "envelope"] : ["fab", icon],
487
+ enabled,
488
+ subdomain
489
+ });
490
+ return acc;
491
+ }, []).sort((a, b) => formatter.compare(a.name, b.name));
492
+ const isLoading = isLoadingData || isLoadingPermissions;
493
+ const isProviderWithSubdomain = React.useMemo(() => {
494
+ if (!providerToEditName) {
495
+ return false;
496
+ }
497
+ const providerToEdit = providers.find((obj) => obj.name === providerToEditName);
498
+ return !!providerToEdit?.subdomain;
499
+ }, [providers, providerToEditName]);
500
+ const layoutToRender = React.useMemo(() => {
501
+ if (providerToEditName === "email") {
502
+ return forms.email;
503
+ }
504
+ if (isProviderWithSubdomain) {
505
+ return forms.providersWithSubdomain;
506
+ }
507
+ return forms.providers;
508
+ }, [providerToEditName, isProviderWithSubdomain]);
509
+ const handleToggleModal = () => {
510
+ setIsOpen((prev) => !prev);
511
+ };
512
+ const handleClickEdit = (provider) => {
513
+ if (canUpdate) {
514
+ setProviderToEditName(provider.name);
515
+ handleToggleModal();
516
+ }
517
+ };
518
+ const handleSubmit = async (values) => {
519
+ trackUsage("willEditAuthenticationProvider");
520
+ submitMutation.mutate({ providers: { ...data, [providerToEditName]: values } });
521
+ };
522
+ if (isLoading) {
523
+ return /* @__PURE__ */ jsx(Page.Loading, {});
524
+ }
525
+ return /* @__PURE__ */ jsxs(Layouts.Root, { children: [
526
+ /* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
527
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
528
+ {
529
+ name: formatMessage({
530
+ id: getTrad("HeaderNav.link.providers"),
531
+ defaultMessage: "Providers"
532
+ })
533
+ }
534
+ ) }),
535
+ /* @__PURE__ */ jsxs(Page.Main, { children: [
536
+ /* @__PURE__ */ jsx(
537
+ Layouts.Header,
538
+ {
539
+ title: formatMessage({
540
+ id: getTrad("HeaderNav.link.providers"),
541
+ defaultMessage: "Providers"
542
+ })
543
+ }
544
+ ),
545
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Table, { colCount: 3, rowCount: providers.length + 1, children: [
546
+ /* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
547
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: formatMessage({ id: "global.name", defaultMessage: "Name" }) }) }),
548
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: formatMessage({ id: getTrad("Providers.status"), defaultMessage: "Status" }) }) }),
549
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: formatMessage({
550
+ id: "global.settings",
551
+ defaultMessage: "Settings"
552
+ }) }) }) })
553
+ ] }) }),
554
+ /* @__PURE__ */ jsx(Tbody, { children: providers.map((provider) => /* @__PURE__ */ jsxs(
555
+ Tr,
556
+ {
557
+ onClick: () => canUpdate ? handleClickEdit(provider) : void 0,
558
+ children: [
559
+ /* @__PURE__ */ jsx(Td, { width: "45%", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", textColor: "neutral800", children: provider.name }) }),
560
+ /* @__PURE__ */ jsx(Td, { width: "65%", children: /* @__PURE__ */ jsx(
561
+ Typography,
562
+ {
563
+ textColor: provider.enabled ? "success600" : "danger600",
564
+ "data-testid": `enable-${provider.name}`,
565
+ children: provider.enabled ? formatMessage({
566
+ id: "global.enabled",
567
+ defaultMessage: "Enabled"
568
+ }) : formatMessage({
569
+ id: "global.disabled",
570
+ defaultMessage: "Disabled"
571
+ })
572
+ }
573
+ ) }),
574
+ /* @__PURE__ */ jsx(Td, { onClick: (e) => e.stopPropagation(), children: canUpdate && /* @__PURE__ */ jsx(
575
+ IconButton,
576
+ {
577
+ onClick: () => handleClickEdit(provider),
578
+ variant: "ghost",
579
+ label: "Edit",
580
+ children: /* @__PURE__ */ jsx(Pencil, {})
581
+ }
582
+ ) })
583
+ ]
584
+ },
585
+ provider.name
586
+ )) })
587
+ ] }) })
588
+ ] }),
589
+ /* @__PURE__ */ jsx(
590
+ FormModal,
591
+ {
592
+ initialData: data[providerToEditName],
593
+ isOpen,
594
+ isSubmiting: submitMutation.isLoading,
595
+ layout: layoutToRender,
596
+ headerBreadcrumbs: [
597
+ formatMessage({
598
+ id: getTrad("PopUpForm.header.edit.providers"),
599
+ defaultMessage: "Edit Provider"
600
+ }),
601
+ upperFirst(providerToEditName)
602
+ ],
603
+ onToggle: handleToggleModal,
604
+ onSubmit: handleSubmit,
605
+ providerToEditName
606
+ }
607
+ )
608
+ ] });
609
+ };
610
+ const ProtectedProvidersPage = () => /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.readProviders, children: /* @__PURE__ */ jsx(ProvidersPage, {}) });
611
+ export {
612
+ ProvidersPage,
613
+ ProtectedProvidersPage as default
614
+ };
615
+ //# sourceMappingURL=index-B9cFxoCN.mjs.map