@strapi/plugin-users-permissions 4.0.0-next.9 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
  2. package/admin/src/components/BoundRoute/index.js +40 -24
  3. package/admin/src/components/FormModal/Input/index.js +121 -0
  4. package/admin/src/components/FormModal/index.js +123 -0
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
  7. package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
  8. package/admin/src/components/Permissions/index.js +36 -24
  9. package/admin/src/components/Permissions/init.js +1 -6
  10. package/admin/src/components/Policies/index.js +46 -47
  11. package/admin/src/components/UsersPermissions/index.js +29 -26
  12. package/admin/src/components/UsersPermissions/init.js +1 -2
  13. package/admin/src/hooks/useFetchRole/index.js +17 -7
  14. package/admin/src/hooks/useForm/index.js +3 -29
  15. package/admin/src/hooks/useForm/reducer.js +2 -21
  16. package/admin/src/hooks/usePlugins/index.js +12 -21
  17. package/admin/src/hooks/usePlugins/reducer.js +0 -3
  18. package/admin/src/index.js +0 -8
  19. package/admin/src/pages/AdvancedSettings/index.js +203 -193
  20. package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
  21. package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
  22. package/admin/src/pages/AdvancedSettings/utils/schema.js +22 -0
  23. package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
  24. package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
  25. package/admin/src/pages/EmailTemplates/index.js +117 -197
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +206 -221
  28. package/admin/src/pages/Providers/utils/api.js +21 -0
  29. package/admin/src/pages/Providers/utils/forms.js +168 -126
  30. package/admin/src/pages/Roles/CreatePage/index.js +155 -147
  31. package/admin/src/pages/Roles/EditPage/index.js +162 -134
  32. package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
  33. package/admin/src/pages/Roles/ListPage/index.js +176 -156
  34. package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
  35. package/admin/src/translations/ar.json +0 -8
  36. package/admin/src/translations/cs.json +0 -8
  37. package/admin/src/translations/de.json +0 -8
  38. package/admin/src/translations/dk.json +0 -8
  39. package/admin/src/translations/en.json +33 -12
  40. package/admin/src/translations/es.json +0 -8
  41. package/admin/src/translations/fr.json +0 -8
  42. package/admin/src/translations/id.json +0 -8
  43. package/admin/src/translations/it.json +0 -8
  44. package/admin/src/translations/ja.json +0 -8
  45. package/admin/src/translations/ko.json +0 -8
  46. package/admin/src/translations/ms.json +0 -8
  47. package/admin/src/translations/nl.json +0 -8
  48. package/admin/src/translations/pl.json +0 -8
  49. package/admin/src/translations/pt-BR.json +0 -8
  50. package/admin/src/translations/pt.json +0 -8
  51. package/admin/src/translations/ru.json +0 -8
  52. package/admin/src/translations/sk.json +0 -8
  53. package/admin/src/translations/sv.json +0 -8
  54. package/admin/src/translations/th.json +0 -8
  55. package/admin/src/translations/tr.json +0 -8
  56. package/admin/src/translations/uk.json +0 -8
  57. package/admin/src/translations/vi.json +0 -8
  58. package/admin/src/translations/zh-Hans.json +5 -14
  59. package/admin/src/translations/zh.json +0 -8
  60. package/admin/src/utils/axiosInstance.js +36 -0
  61. package/admin/src/utils/formatPluginName.js +26 -0
  62. package/admin/src/utils/index.js +1 -0
  63. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  64. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  65. package/package.json +30 -31
  66. package/server/bootstrap/index.js +19 -21
  67. package/server/config.js +3 -3
  68. package/server/content-types/index.js +3 -3
  69. package/server/content-types/permission/index.js +30 -3
  70. package/server/content-types/role/index.js +47 -3
  71. package/server/content-types/user/index.js +65 -4
  72. package/server/controllers/auth.js +81 -244
  73. package/server/controllers/content-manager-user.js +183 -0
  74. package/server/controllers/index.js +12 -6
  75. package/server/controllers/permissions.js +26 -0
  76. package/server/controllers/role.js +77 -0
  77. package/server/controllers/settings.js +85 -0
  78. package/server/controllers/user.js +118 -44
  79. package/server/controllers/validation/auth.js +29 -0
  80. package/server/controllers/validation/user.js +38 -0
  81. package/server/graphql/index.js +44 -0
  82. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  83. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  84. package/server/graphql/mutations/auth/login.js +38 -0
  85. package/server/graphql/mutations/auth/register.js +39 -0
  86. package/server/graphql/mutations/auth/reset-password.js +41 -0
  87. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  88. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  89. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  90. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  91. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  92. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  93. package/server/graphql/mutations/index.js +42 -0
  94. package/server/graphql/queries/index.js +13 -0
  95. package/server/graphql/queries/me.js +17 -0
  96. package/server/graphql/resolvers-configs.js +37 -0
  97. package/server/graphql/types/create-role-payload.js +11 -0
  98. package/server/graphql/types/delete-role-payload.js +11 -0
  99. package/server/graphql/types/index.js +21 -0
  100. package/server/graphql/types/login-input.js +13 -0
  101. package/server/graphql/types/login-payload.js +12 -0
  102. package/server/graphql/types/me-role.js +14 -0
  103. package/server/graphql/types/me.js +16 -0
  104. package/server/graphql/types/password-payload.js +11 -0
  105. package/server/graphql/types/register-input.js +13 -0
  106. package/server/graphql/types/update-role-payload.js +11 -0
  107. package/server/graphql/utils.js +27 -0
  108. package/server/index.js +21 -0
  109. package/server/middlewares/index.js +2 -2
  110. package/server/{policies → middlewares}/rateLimit.js +3 -7
  111. package/server/register.js +11 -0
  112. package/server/routes/admin/index.js +10 -0
  113. package/server/routes/admin/permissions.js +20 -0
  114. package/server/routes/admin/role.js +79 -0
  115. package/server/routes/admin/settings.js +95 -0
  116. package/server/routes/content-api/auth.js +73 -0
  117. package/server/routes/content-api/index.js +11 -0
  118. package/server/routes/content-api/permissions.js +9 -0
  119. package/server/routes/content-api/role.js +29 -0
  120. package/server/routes/content-api/user.js +61 -0
  121. package/server/routes/index.js +4 -428
  122. package/server/services/index.js +10 -8
  123. package/server/services/jwt.js +9 -17
  124. package/server/services/providers.js +32 -33
  125. package/server/services/role.js +177 -0
  126. package/server/services/user.js +9 -15
  127. package/server/services/users-permissions.js +140 -338
  128. package/server/strategies/users-permissions.js +123 -0
  129. package/server/utils/index.d.ts +2 -0
  130. package/strapi-admin.js +3 -0
  131. package/strapi-server.js +1 -19
  132. package/admin/src/assets/images/logo.svg +0 -1
  133. package/admin/src/components/BaselineAlignement/index.js +0 -33
  134. package/admin/src/components/Bloc/index.js +0 -10
  135. package/admin/src/components/BoundRoute/Components.js +0 -78
  136. package/admin/src/components/ContainerFluid/index.js +0 -13
  137. package/admin/src/components/FormBloc/index.js +0 -61
  138. package/admin/src/components/IntlInput/index.js +0 -38
  139. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  140. package/admin/src/components/ListRow/Components.js +0 -74
  141. package/admin/src/components/ListRow/index.js +0 -35
  142. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  143. package/admin/src/components/ModalForm/index.js +0 -59
  144. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  145. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  146. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  147. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  148. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  151. package/admin/src/components/Policies/Components.js +0 -26
  152. package/admin/src/components/PrefixedIcon/index.js +0 -27
  153. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  154. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  155. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  156. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  157. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  158. package/admin/src/components/Roles/index.js +0 -3
  159. package/admin/src/components/SizedInput/index.js +0 -24
  160. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  161. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  162. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  163. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  164. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  165. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  166. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  167. package/server/content-types/permission/schema.json +0 -48
  168. package/server/content-types/role/schema.json +0 -46
  169. package/server/content-types/user/schema.json +0 -66
  170. package/server/controllers/user/admin.js +0 -230
  171. package/server/controllers/user/api.js +0 -174
  172. package/server/controllers/users-permissions.js +0 -271
  173. package/server/middlewares/users-permissions.js +0 -44
  174. package/server/policies/index.js +0 -11
  175. package/server/policies/isAuthenticated.js +0 -9
  176. package/server/policies/permissions.js +0 -94
  177. package/server/schema.graphql.js +0 -317
@@ -1,43 +1,45 @@
1
- import React, { useCallback, useMemo, useRef, useState } from 'react';
1
+ import React, { useMemo, useRef, useState } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
- import { Header, List } from '@buffetjs/custom';
4
- import { Text } from '@buffetjs/core';
5
- import { Pencil } from '@buffetjs/icons';
6
3
  import {
7
4
  SettingsPageTitle,
8
- SizedInput,
5
+ LoadingIndicatorPage,
9
6
  useTracking,
10
- getYupInnerErrors,
11
- request,
12
7
  useNotification,
13
8
  useOverlayBlocker,
14
9
  CheckPagePermissions,
10
+ useRBAC,
11
+ useFocusWhenNavigate,
12
+ onRowClick,
13
+ stopPropagation,
15
14
  } from '@strapi/helper-plugin';
16
- import { get, upperFirst, has } from 'lodash';
17
- import { Row } from 'reactstrap';
18
- import pluginPermissions from '../../permissions';
19
- import { useForm } from '../../hooks';
20
- import { getRequestURL, getTrad } from '../../utils';
21
- import ListBaselineAlignment from '../../components/ListBaselineAlignment';
22
- import ListRow from '../../components/ListRow';
23
- import ModalForm from '../../components/ModalForm';
24
- import createProvidersArray from './utils/createProvidersArray';
15
+ import has from 'lodash/has';
16
+ import upperFirst from 'lodash/upperFirst';
17
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
18
+ import { HeaderLayout, Layout, ContentLayout } from '@strapi/design-system/Layout';
19
+ import { Main } from '@strapi/design-system/Main';
20
+ import { useNotifyAT } from '@strapi/design-system/LiveRegions';
21
+ import { Table, Thead, Tr, Th, Tbody, Td } from '@strapi/design-system/Table';
22
+ import { Typography } from '@strapi/design-system/Typography';
23
+ import { VisuallyHidden } from '@strapi/design-system/VisuallyHidden';
24
+ import { IconButton } from '@strapi/design-system/IconButton';
25
+ import Pencil from '@strapi/icons/Pencil';
26
+ import { useQuery, useMutation, useQueryClient } from 'react-query';
25
27
  import forms from './utils/forms';
28
+ import { fetchData, putProvider } from './utils/api';
29
+ import createProvidersArray from './utils/createProvidersArray';
30
+ import { getTrad } from '../../utils';
31
+ import pluginPermissions from '../../permissions';
32
+ import FormModal from '../../components/FormModal';
26
33
 
27
- const ProtectedProvidersPage = () => (
28
- <CheckPagePermissions permissions={pluginPermissions.readProviders}>
29
- <ProvidersPage />
30
- </CheckPagePermissions>
31
- );
32
-
33
- const ProvidersPage = () => {
34
+ export const ProvidersPage = () => {
34
35
  const { formatMessage } = useIntl();
36
+ useFocusWhenNavigate();
37
+ const { notifyStatus } = useNotifyAT();
38
+ const queryClient = useQueryClient();
35
39
  const { trackUsage } = useTracking();
36
40
  const trackUsageRef = useRef(trackUsage);
37
41
  const [isOpen, setIsOpen] = useState(false);
38
42
  const [isSubmiting, setIsSubmiting] = useState(false);
39
- const buttonSubmitRef = useRef(null);
40
- const [showForm, setShowForm] = useState(false);
41
43
  const [providerToEditName, setProviderToEditName] = useState(null);
42
44
  const toggleNotification = useNotification();
43
45
  const { lockApp, unlockApp } = useOverlayBlocker();
@@ -47,22 +49,56 @@ const ProvidersPage = () => {
47
49
  }, []);
48
50
 
49
51
  const {
52
+ isLoading: isLoadingForPermissions,
50
53
  allowedActions: { canUpdate },
51
- dispatchResetForm,
52
- dispatchSetFormErrors,
53
- dispatchSubmitSucceeded,
54
- formErrors,
55
- handleChange,
56
- isLoading,
57
- isLoadingForPermissions,
58
- modifiedData,
59
- } = useForm('providers', updatePermissions);
54
+ } = useRBAC(updatePermissions);
55
+
56
+ const { isLoading: isLoadingForData, data: modifiedData, isFetching } = useQuery(
57
+ 'get-providers',
58
+ () => fetchData(toggleNotification),
59
+ {
60
+ onSuccess: () => {
61
+ notifyStatus(
62
+ formatMessage({
63
+ id: getTrad('Providers.data.loaded'),
64
+ defaultMessage: 'Providers have been loaded',
65
+ })
66
+ );
67
+ },
68
+ initialData: {},
69
+ }
70
+ );
71
+
72
+ const isLoading = isLoadingForData || isFetching;
73
+
74
+ const submitMutation = useMutation(putProvider, {
75
+ onSuccess: async () => {
76
+ await queryClient.invalidateQueries('get-providers');
77
+ toggleNotification({
78
+ type: 'info',
79
+ message: { id: getTrad('notification.success.submit') },
80
+ });
81
+
82
+ trackUsageRef.current('didEditAuthenticationProvider');
83
+ setIsSubmiting(false);
84
+ handleToggleModal();
85
+ unlockApp();
86
+ },
87
+ onError: () => {
88
+ toggleNotification({
89
+ type: 'warning',
90
+ message: { id: 'notification.error' },
91
+ });
92
+ unlockApp();
93
+ setIsSubmiting(false);
94
+ },
95
+ refetchActive: false,
96
+ });
60
97
 
61
98
  const providers = useMemo(() => createProvidersArray(modifiedData), [modifiedData]);
62
- const enabledProvidersCount = useMemo(
63
- () => providers.filter(provider => provider.enabled).length,
64
- [providers]
65
- );
99
+
100
+ const rowCount = providers.length;
101
+
66
102
  const isProviderWithSubdomain = useMemo(() => {
67
103
  if (!providerToEditName) {
68
104
  return false;
@@ -72,34 +108,13 @@ const ProvidersPage = () => {
72
108
 
73
109
  return has(providerToEdit, 'subdomain');
74
110
  }, [providers, providerToEditName]);
75
- const disabledProvidersCount = useMemo(() => {
76
- return providers.length - enabledProvidersCount;
77
- }, [providers, enabledProvidersCount]);
78
-
79
- const listTitle = useMemo(() => {
80
- const enabledMessage = formatMessage(
81
- {
82
- id: getTrad(
83
- `List.title.providers.enabled.${enabledProvidersCount > 1 ? 'plural' : 'singular'}`
84
- ),
85
- },
86
- { number: enabledProvidersCount }
87
- );
88
- const disabledMessage = formatMessage(
89
- {
90
- id: getTrad(
91
- `List.title.providers.disabled.${disabledProvidersCount > 1 ? 'plural' : 'singular'}`
92
- ),
93
- },
94
- { number: disabledProvidersCount }
95
- );
96
-
97
- return `${enabledMessage} ${disabledMessage}`;
98
- }, [formatMessage, enabledProvidersCount, disabledProvidersCount]);
99
111
 
100
- const pageTitle = formatMessage({ id: getTrad('HeaderNav.link.providers') });
112
+ const pageTitle = formatMessage({
113
+ id: getTrad('HeaderNav.link.providers'),
114
+ defaultMessage: 'Providers',
115
+ });
101
116
 
102
- const formToRender = useMemo(() => {
117
+ const layoutToRender = useMemo(() => {
103
118
  if (providerToEditName === 'email') {
104
119
  return forms.email;
105
120
  }
@@ -111,179 +126,149 @@ const ProvidersPage = () => {
111
126
  return forms.providers;
112
127
  }, [providerToEditName, isProviderWithSubdomain]);
113
128
 
114
- const handleClick = useCallback(() => {
115
- buttonSubmitRef.current.click();
116
- }, []);
117
-
118
- const handleToggle = useCallback(() => {
129
+ const handleToggleModal = () => {
119
130
  setIsOpen(prev => !prev);
120
- }, []);
121
-
122
- const handleClickEdit = useCallback(
123
- provider => {
124
- if (canUpdate) {
125
- setProviderToEditName(provider.name);
126
- handleToggle();
127
- }
128
- },
129
- [canUpdate, handleToggle]
130
- );
131
+ };
131
132
 
132
- const handleClosed = useCallback(() => {
133
- setProviderToEditName(null);
134
- setShowForm(false);
135
- dispatchResetForm();
136
- }, [dispatchResetForm]);
137
-
138
- const handleOpened = useCallback(() => {
139
- setShowForm(true);
140
- }, []);
141
-
142
- const handleSubmit = useCallback(
143
- async e => {
144
- e.preventDefault();
145
- const { schema } = formToRender;
146
- let errors = {};
147
-
148
- setIsSubmiting(true);
149
-
150
- try {
151
- await schema.validate(modifiedData[providerToEditName], { abortEarly: false });
152
- lockApp();
153
-
154
- try {
155
- trackUsageRef.current('willEditAuthenticationProvider');
156
-
157
- await request(getRequestURL('providers'), {
158
- method: 'PUT',
159
- body: { providers: modifiedData },
160
- });
133
+ const handleClickEdit = provider => {
134
+ if (canUpdate) {
135
+ setProviderToEditName(provider.name);
136
+ handleToggleModal();
137
+ }
138
+ };
161
139
 
162
- trackUsageRef.current('didEditAuthenticationProvider');
140
+ const handleSubmit = async values => {
141
+ setIsSubmiting(true);
163
142
 
164
- toggleNotification({
165
- type: 'success',
166
- message: { id: getTrad('notification.success.submit') },
167
- });
143
+ lockApp();
168
144
 
169
- dispatchSubmitSucceeded();
145
+ trackUsageRef.current('willEditAuthenticationProvider');
170
146
 
171
- handleToggle();
172
- } catch (err) {
173
- console.error(err);
174
- toggleNotification({
175
- type: 'warning',
176
- message: { id: 'notification.error' },
177
- });
178
- }
179
- } catch (err) {
180
- console.error(err);
181
- errors = getYupInnerErrors(err);
182
- console.log(errors);
183
- }
147
+ const body = { ...modifiedData, [providerToEditName]: values };
184
148
 
185
- dispatchSetFormErrors(errors);
186
-
187
- setIsSubmiting(false);
188
- unlockApp();
189
- },
190
- [
191
- dispatchSetFormErrors,
192
- dispatchSubmitSucceeded,
193
- formToRender,
194
- handleToggle,
195
- modifiedData,
196
- providerToEditName,
197
- toggleNotification,
198
- lockApp,
199
- unlockApp,
200
- ]
201
- );
149
+ submitMutation.mutate({ providers: body });
150
+ };
202
151
 
203
152
  return (
204
- <>
153
+ <Layout>
205
154
  <SettingsPageTitle name={pageTitle} />
206
- <div>
207
- <Header title={{ label: pageTitle }} isLoading={isLoadingForPermissions || isLoading} />
208
- <ListBaselineAlignment />
209
- <List
210
- title={listTitle}
211
- items={providers}
212
- isLoading={isLoadingForPermissions || isLoading}
213
- customRowComponent={provider => (
214
- <ListRow
215
- {...provider}
216
- onClick={() => handleClickEdit(provider)}
217
- links={[
218
- {
219
- icon: canUpdate ? <Pencil fill="#0e1622" /> : null,
220
- onClick: e => {
221
- e.stopPropagation();
222
- handleClickEdit(provider);
223
- },
224
- },
225
- ]}
226
- >
227
- <td key="enabled">
228
- <Text
229
- fontWeight="semiBold"
230
- lineHeight="18px"
231
- color={provider.enabled ? 'green' : 'lightOrange'}
232
- >
233
- {provider.enabled ? 'Enabled' : 'Disabled'}
234
- </Text>
235
- </td>
236
- </ListRow>
237
- )}
155
+ <Main>
156
+ <HeaderLayout
157
+ title={formatMessage({
158
+ id: getTrad('HeaderNav.link.providers'),
159
+ defaultMessage: 'Providers',
160
+ })}
238
161
  />
239
- </div>
240
- <ModalForm
162
+ {isLoading || isLoadingForPermissions ? (
163
+ <LoadingIndicatorPage />
164
+ ) : (
165
+ <ContentLayout>
166
+ <Table colCount={4} rowCount={rowCount + 1}>
167
+ <Thead>
168
+ <Tr>
169
+ <Th>
170
+ <Typography variant="sigma" textColor="neutral600">
171
+ <VisuallyHidden>
172
+ {formatMessage({ id: getTrad('Providers.image'), defaultMessage: 'Image' })}
173
+ </VisuallyHidden>
174
+ </Typography>
175
+ </Th>
176
+ <Th>
177
+ <Typography variant="sigma" textColor="neutral600">
178
+ {formatMessage({ id: getTrad('Providers.name'), defaultMessage: 'Name' })}
179
+ </Typography>
180
+ </Th>
181
+ <Th>
182
+ <Typography variant="sigma" textColor="neutral600">
183
+ {formatMessage({ id: getTrad('Providers.status'), defaultMessage: 'Status' })}
184
+ </Typography>
185
+ </Th>
186
+ <Th>
187
+ <Typography variant="sigma">
188
+ <VisuallyHidden>
189
+ {formatMessage({
190
+ id: getTrad('Providers.settings'),
191
+ defaultMessage: 'Settings',
192
+ })}
193
+ </VisuallyHidden>
194
+ </Typography>
195
+ </Th>
196
+ </Tr>
197
+ </Thead>
198
+ <Tbody>
199
+ {providers.map(provider => (
200
+ <Tr
201
+ key={provider.name}
202
+ {...onRowClick({
203
+ fn: () => handleClickEdit(provider),
204
+ condition: canUpdate,
205
+ })}
206
+ >
207
+ <Td width="">
208
+ <FontAwesomeIcon icon={provider.icon} />
209
+ </Td>
210
+ <Td width="45%">
211
+ <Typography fontWeight="semiBold" textColor="neutral800">
212
+ {provider.name}
213
+ </Typography>
214
+ </Td>
215
+ <Td width="65%">
216
+ <Typography
217
+ textColor={provider.enabled ? 'success600' : 'danger600'}
218
+ data-testid={`enable-${provider.name}`}
219
+ >
220
+ {provider.enabled
221
+ ? formatMessage({
222
+ id: getTrad('Providers.enabled'),
223
+ defaultMessage: 'Enabled',
224
+ })
225
+ : formatMessage({
226
+ id: getTrad('Providers.disabled'),
227
+ defaultMessage: 'Disabled',
228
+ })}
229
+ </Typography>
230
+ </Td>
231
+ <Td {...stopPropagation}>
232
+ {canUpdate && (
233
+ <IconButton
234
+ onClick={() => handleClickEdit(provider)}
235
+ noBorder
236
+ icon={<Pencil />}
237
+ label="Edit"
238
+ />
239
+ )}
240
+ </Td>
241
+ </Tr>
242
+ ))}
243
+ </Tbody>
244
+ </Table>
245
+ </ContentLayout>
246
+ )}
247
+ </Main>
248
+ <FormModal
249
+ initialData={modifiedData[providerToEditName]}
241
250
  isOpen={isOpen}
242
- onClick={handleClick}
243
- onCancel={handleToggle}
244
- isLoading={isSubmiting}
245
- onOpened={handleOpened}
246
- onClosed={handleClosed}
247
- onToggle={handleToggle}
251
+ isSubmiting={isSubmiting}
252
+ layout={layoutToRender}
248
253
  headerBreadcrumbs={[
249
- getTrad('PopUpForm.header.edit.providers'),
254
+ formatMessage({
255
+ id: getTrad('PopUpForm.header.edit.providers'),
256
+ defaultMessage: 'Edit Provider',
257
+ }),
250
258
  upperFirst(providerToEditName),
251
259
  ]}
252
- >
253
- {showForm && (
254
- <form onSubmit={handleSubmit}>
255
- <Row>
256
- {formToRender.form.map(input => {
257
- const label = input.label.params
258
- ? { ...input.label, params: { provider: upperFirst(providerToEditName) } }
259
- : input.label;
260
-
261
- const value =
262
- input.name === 'noName'
263
- ? `${strapi.backendURL}/connect/${providerToEditName}/callback`
264
- : get(modifiedData, [providerToEditName, ...input.name.split('.')], '');
265
-
266
- return (
267
- <SizedInput
268
- key={input.name}
269
- {...input}
270
- label={label}
271
- error={formErrors[input.name]}
272
- name={`${providerToEditName}.${input.name}`}
273
- onChange={handleChange}
274
- value={value}
275
- />
276
- );
277
- })}
278
- </Row>
279
- <button type="submit" style={{ display: 'none' }} ref={buttonSubmitRef}>
280
- hidden button to use the native form event
281
- </button>
282
- </form>
283
- )}
284
- </ModalForm>
285
- </>
260
+ onToggle={handleToggleModal}
261
+ onSubmit={handleSubmit}
262
+ providerToEditName={providerToEditName}
263
+ />
264
+ </Layout>
286
265
  );
287
266
  };
288
267
 
268
+ const ProtectedProvidersPage = () => (
269
+ <CheckPagePermissions permissions={pluginPermissions.readProviders}>
270
+ <ProvidersPage />
271
+ </CheckPagePermissions>
272
+ );
273
+
289
274
  export default ProtectedProvidersPage;
@@ -0,0 +1,21 @@
1
+ import { getRequestURL, axiosInstance } from '../../../utils';
2
+
3
+ // eslint-disable-next-line import/prefer-default-export
4
+ export const fetchData = async toggleNotification => {
5
+ try {
6
+ const { data } = await axiosInstance.get(getRequestURL('providers'));
7
+
8
+ return data;
9
+ } catch (err) {
10
+ toggleNotification({
11
+ type: 'warning',
12
+ message: { id: 'notification.error' },
13
+ });
14
+
15
+ throw new Error('error');
16
+ }
17
+ };
18
+
19
+ export const putProvider = body => {
20
+ return axiosInstance.put(getRequestURL('providers'), body);
21
+ };