@strapi/plugin-users-permissions 4.0.0-next.7 → 4.0.1

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