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

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 (49) hide show
  1. package/admin/src/components/BoundRoute/index.js +5 -3
  2. package/admin/src/components/FormModal/Input/index.js +6 -3
  3. package/admin/src/components/FormModal/index.js +13 -10
  4. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +1 -1
  5. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +26 -5
  6. package/admin/src/components/Permissions/PermissionRow/index.js +4 -2
  7. package/admin/src/components/Permissions/index.js +5 -2
  8. package/admin/src/components/Policies/index.js +3 -2
  9. package/admin/src/components/UsersPermissions/index.js +8 -5
  10. package/admin/src/{permissions.js → constants.js} +1 -3
  11. package/admin/src/contexts/UsersPermissionsContext/index.js +1 -0
  12. package/admin/src/hooks/index.js +1 -1
  13. package/admin/src/hooks/useFetchRole/index.js +6 -3
  14. package/admin/src/hooks/useForm/index.js +4 -3
  15. package/admin/src/hooks/usePlugins.js +71 -0
  16. package/admin/src/hooks/useRolesList/index.js +4 -1
  17. package/admin/src/index.js +7 -5
  18. package/admin/src/pages/AdvancedSettings/index.js +27 -28
  19. package/admin/src/pages/AdvancedSettings/utils/api.js +2 -3
  20. package/admin/src/pages/AdvancedSettings/utils/schema.js +1 -1
  21. package/admin/src/pages/EmailTemplates/components/EmailForm.js +14 -13
  22. package/admin/src/pages/EmailTemplates/components/EmailTable.js +9 -7
  23. package/admin/src/pages/EmailTemplates/index.js +16 -17
  24. package/admin/src/pages/EmailTemplates/utils/api.js +2 -3
  25. package/admin/src/pages/EmailTemplates/utils/schema.js +1 -1
  26. package/admin/src/pages/Providers/index.js +31 -32
  27. package/admin/src/pages/Providers/utils/api.js +2 -3
  28. package/admin/src/pages/Providers/utils/forms.js +1 -1
  29. package/admin/src/pages/Roles/{CreatePage/index.js → CreatePage.js} +26 -23
  30. package/admin/src/pages/Roles/{EditPage/index.js → EditPage.js} +23 -20
  31. package/admin/src/pages/Roles/ListPage/components/TableBody.js +4 -3
  32. package/admin/src/pages/Roles/ListPage/index.js +31 -34
  33. package/admin/src/pages/Roles/ListPage/utils/api.js +3 -4
  34. package/admin/src/pages/Roles/{ProtectedCreatePage/index.js → ProtectedCreatePage.js} +6 -3
  35. package/admin/src/pages/Roles/{ProtectedEditPage/index.js → ProtectedEditPage.js} +6 -3
  36. package/admin/src/pages/Roles/{ProtectedListPage/index.js → ProtectedListPage.js} +5 -3
  37. package/admin/src/pages/Roles/{CreatePage/utils/schema.js → constants.js} +2 -4
  38. package/admin/src/pages/Roles/index.js +9 -6
  39. package/admin/src/utils/index.js +1 -2
  40. package/documentation/content-api.yaml +1 -1
  41. package/jest.config.front.js +1 -0
  42. package/package.json +21 -24
  43. package/server/middlewares/rateLimit.js +41 -21
  44. package/server/strategies/users-permissions.js +1 -8
  45. package/admin/src/hooks/usePlugins/index.js +0 -67
  46. package/admin/src/hooks/usePlugins/init.js +0 -5
  47. package/admin/src/hooks/usePlugins/reducer.js +0 -34
  48. package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
  49. package/admin/src/utils/getRequestURL.js +0 -5
@@ -1,10 +1,12 @@
1
1
  import React from 'react';
2
- import styled from 'styled-components';
3
- import { Flex, Box, Typography } from '@strapi/design-system';
2
+
3
+ import { Box, Flex, Typography } from '@strapi/design-system';
4
4
  import map from 'lodash/map';
5
5
  import tail from 'lodash/tail';
6
- import { useIntl } from 'react-intl';
7
6
  import PropTypes from 'prop-types';
7
+ import { useIntl } from 'react-intl';
8
+ import styled from 'styled-components';
9
+
8
10
  import getMethodColor from './getMethodColor';
9
11
 
10
12
  const MethodBox = styled(Box)`
@@ -5,9 +5,10 @@
5
5
  */
6
6
 
7
7
  import React from 'react';
8
- import { useIntl } from 'react-intl';
9
- import { ToggleInput, TextInput } from '@strapi/design-system';
8
+
9
+ import { TextInput, ToggleInput } from '@strapi/design-system';
10
10
  import PropTypes from 'prop-types';
11
+ import { useIntl } from 'react-intl';
11
12
 
12
13
  const Input = ({
13
14
  description,
@@ -23,7 +24,9 @@ const Input = ({
23
24
  }) => {
24
25
  const { formatMessage } = useIntl();
25
26
  const inputValue =
26
- name === 'noName' ? `${strapi.backendURL}/api/connect/${providerToEditName}/callback` : value;
27
+ name === 'noName'
28
+ ? `${window.strapi.backendURL}/api/connect/${providerToEditName}/callback`
29
+ : value;
27
30
 
28
31
  const label = formatMessage(
29
32
  { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
@@ -5,22 +5,23 @@
5
5
  */
6
6
 
7
7
  import React from 'react';
8
- import { useIntl } from 'react-intl';
8
+
9
9
  import {
10
10
  Button,
11
11
  Flex,
12
- Breadcrumbs,
13
- Crumb,
14
12
  Grid,
15
13
  GridItem,
16
- ModalLayout,
17
- ModalHeader,
18
- ModalFooter,
19
14
  ModalBody,
15
+ ModalFooter,
16
+ ModalHeader,
17
+ ModalLayout,
20
18
  } from '@strapi/design-system';
21
- import PropTypes from 'prop-types';
22
- import { Formik } from 'formik';
19
+ import { Breadcrumbs, Crumb } from '@strapi/design-system/v2';
23
20
  import { Form } from '@strapi/helper-plugin';
21
+ import { Formik } from 'formik';
22
+ import PropTypes from 'prop-types';
23
+ import { useIntl } from 'react-intl';
24
+
24
25
  import Input from './Input';
25
26
 
26
27
  const FormModal = ({
@@ -43,8 +44,10 @@ const FormModal = ({
43
44
  <ModalLayout onClose={onToggle} labelledBy="title">
44
45
  <ModalHeader>
45
46
  <Breadcrumbs label={headerBreadcrumbs.join(', ')}>
46
- {headerBreadcrumbs.map((crumb) => (
47
- <Crumb key={crumb}>{crumb}</Crumb>
47
+ {headerBreadcrumbs.map((crumb, index, arr) => (
48
+ <Crumb isCurrent={index === arr.length - 1} key={crumb}>
49
+ {crumb}
50
+ </Crumb>
48
51
  ))}
49
52
  </Breadcrumbs>
50
53
  </ModalHeader>
@@ -1,5 +1,5 @@
1
- import styled, { css } from 'styled-components';
2
1
  import { Box } from '@strapi/design-system';
2
+ import styled, { css } from 'styled-components';
3
3
 
4
4
  const activeCheckboxWrapperStyles = css`
5
5
  background: ${(props) => props.theme.colors.primary100};
@@ -1,13 +1,24 @@
1
1
  import React, { useCallback, useMemo } from 'react';
2
+
3
+ import {
4
+ Box,
5
+ Checkbox,
6
+ Flex,
7
+ Typography,
8
+ Grid,
9
+ GridItem,
10
+ VisuallyHidden,
11
+ } from '@strapi/design-system';
12
+ import { Cog as CogIcon } from '@strapi/icons';
2
13
  import get from 'lodash/get';
3
- import styled from 'styled-components';
4
14
  import PropTypes from 'prop-types';
5
- import { Box, Checkbox, Flex, Typography, Grid, GridItem } from '@strapi/design-system';
6
- import { Cog as CogIcon } from '@strapi/icons';
7
15
  import { useIntl } from 'react-intl';
8
- import CheckboxWrapper from './CheckboxWrapper';
16
+ import styled from 'styled-components';
17
+
9
18
  import { useUsersPermissions } from '../../../contexts/UsersPermissionsContext';
10
19
 
20
+ import CheckboxWrapper from './CheckboxWrapper';
21
+
11
22
  const Border = styled.div`
12
23
  flex: 1;
13
24
  align-self: center;
@@ -87,10 +98,20 @@ const SubCategory = ({ subCategory }) => {
87
98
  </Checkbox>
88
99
  <button
89
100
  type="button"
90
- data-testid="action-cog"
91
101
  onClick={() => onSelectedAction(action.name)}
92
102
  style={{ display: 'inline-flex', alignItems: 'center' }}
93
103
  >
104
+ <VisuallyHidden as="span">
105
+ {formatMessage(
106
+ {
107
+ id: 'app.utils.show-bound-route',
108
+ defaultMessage: 'Show bound route for {route}',
109
+ },
110
+ {
111
+ route: action.name,
112
+ }
113
+ )}
114
+ </VisuallyHidden>
94
115
  <CogIcon />
95
116
  </button>
96
117
  </CheckboxWrapper>
@@ -1,7 +1,9 @@
1
1
  import React, { useMemo } from 'react';
2
- import PropTypes from 'prop-types';
3
- import sortBy from 'lodash/sortBy';
2
+
4
3
  import { Box } from '@strapi/design-system';
4
+ import sortBy from 'lodash/sortBy';
5
+ import PropTypes from 'prop-types';
6
+
5
7
  import SubCategory from './SubCategory';
6
8
 
7
9
  const PermissionRow = ({ name, permissions }) => {
@@ -1,10 +1,13 @@
1
1
  import React, { useReducer } from 'react';
2
- import { Accordion, AccordionToggle, AccordionContent, Box, Flex } from '@strapi/design-system';
2
+
3
+ import { Accordion, AccordionContent, AccordionToggle, Box, Flex } from '@strapi/design-system';
3
4
  import { useIntl } from 'react-intl';
5
+
4
6
  import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
5
7
  import formatPluginName from '../../utils/formatPluginName';
6
- import PermissionRow from './PermissionRow';
8
+
7
9
  import init from './init';
10
+ import PermissionRow from './PermissionRow';
8
11
  import { initialState, reducer } from './reducer';
9
12
 
10
13
  const Permissions = () => {
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
- import { useIntl } from 'react-intl';
3
- import { Typography, Flex, GridItem } from '@strapi/design-system';
2
+
3
+ import { Flex, GridItem, Typography } from '@strapi/design-system';
4
4
  import get from 'lodash/get';
5
5
  import isEmpty from 'lodash/isEmpty';
6
6
  import without from 'lodash/without';
7
+ import { useIntl } from 'react-intl';
7
8
 
8
9
  import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
9
10
  import BoundRoute from '../BoundRoute';
@@ -1,13 +1,16 @@
1
- import React, { memo, useReducer, forwardRef, useImperativeHandle } from 'react';
1
+ import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react';
2
+
3
+ import { Flex, Grid, GridItem, Typography } from '@strapi/design-system';
2
4
  import PropTypes from 'prop-types';
3
- import { Typography, Flex, Grid, GridItem } from '@strapi/design-system';
4
5
  import { useIntl } from 'react-intl';
6
+
7
+ import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';
5
8
  import getTrad from '../../utils/getTrad';
6
- import Policies from '../Policies';
7
9
  import Permissions from '../Permissions';
8
- import reducer, { initialState } from './reducer';
9
- import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';
10
+ import Policies from '../Policies';
11
+
10
12
  import init from './init';
13
+ import reducer, { initialState } from './reducer';
11
14
 
12
15
  const UsersPermissions = forwardRef(({ permissions, routes }, ref) => {
13
16
  const { formatMessage } = useIntl();
@@ -1,4 +1,4 @@
1
- const pluginPermissions = {
1
+ export const PERMISSIONS = {
2
2
  // Roles
3
3
  accessRoles: [
4
4
  { action: 'plugin::users-permissions.roles.create', subject: null },
@@ -27,5 +27,3 @@ const pluginPermissions = {
27
27
  readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],
28
28
  updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],
29
29
  };
30
-
31
- export default pluginPermissions;
@@ -1,4 +1,5 @@
1
1
  import React, { createContext, useContext } from 'react';
2
+
2
3
  import PropTypes from 'prop-types';
3
4
 
4
5
  const UsersPermissions = createContext({});
@@ -1,5 +1,5 @@
1
1
  // eslint-disable-next-line import/prefer-default-export
2
2
  export { default as useForm } from './useForm';
3
3
  export { default as useRolesList } from './useRolesList';
4
- export { default as usePlugins } from './usePlugins';
4
+ export * from './usePlugins';
5
5
  export { default as useFetchRole } from './useFetchRole';
@@ -1,8 +1,11 @@
1
- import { useCallback, useReducer, useEffect, useRef } from 'react';
2
- import { useNotification, useFetchClient } from '@strapi/helper-plugin';
3
- import reducer, { initialState } from './reducer';
1
+ import { useCallback, useEffect, useReducer, useRef } from 'react';
2
+
3
+ import { useFetchClient, useNotification } from '@strapi/helper-plugin';
4
+
4
5
  import pluginId from '../../pluginId';
5
6
 
7
+ import reducer, { initialState } from './reducer';
8
+
6
9
  const useFetchRole = (id) => {
7
10
  const [state, dispatch] = useReducer(reducer, initialState);
8
11
  const toggleNotification = useNotification();
@@ -1,6 +1,7 @@
1
1
  import { useCallback, useEffect, useReducer, useRef } from 'react';
2
- import { useRBAC, useFetchClient, useNotification } from '@strapi/helper-plugin';
3
- import { getRequestURL } from '../../utils';
2
+
3
+ import { useFetchClient, useNotification, useRBAC } from '@strapi/helper-plugin';
4
+
4
5
  import reducer, { initialState } from './reducer';
5
6
 
6
7
  const useUserForm = (endPoint, permissions) => {
@@ -18,7 +19,7 @@ const useUserForm = (endPoint, permissions) => {
18
19
  type: 'GET_DATA',
19
20
  });
20
21
 
21
- const { data } = await get(getRequestURL(endPoint));
22
+ const { data } = await get(`/users-permissions/${endPoint}`);
22
23
 
23
24
  dispatch({
24
25
  type: 'GET_DATA_SUCCEEDED',
@@ -0,0 +1,71 @@
1
+ import { useEffect } from 'react';
2
+
3
+ import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';
4
+ import { useQueries } from 'react-query';
5
+
6
+ import pluginId from '../pluginId';
7
+ import { cleanPermissions, getTrad } from '../utils';
8
+
9
+ export const usePlugins = () => {
10
+ const toggleNotification = useNotification();
11
+ const { get } = useFetchClient();
12
+ const { formatAPIError } = useAPIErrorHandler(getTrad);
13
+
14
+ const [
15
+ {
16
+ data: permissions,
17
+ isLoading: isLoadingPermissions,
18
+ error: permissionsError,
19
+ refetch: refetchPermissions,
20
+ },
21
+ { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },
22
+ ] = useQueries([
23
+ {
24
+ queryKey: [pluginId, 'permissions'],
25
+ async queryFn() {
26
+ const res = await get(`/${pluginId}/permissions`);
27
+
28
+ return res.data.permissions;
29
+ },
30
+ },
31
+ {
32
+ queryKey: [pluginId, 'routes'],
33
+ async queryFn() {
34
+ const res = await get(`/${pluginId}/routes`);
35
+
36
+ return res.data.routes;
37
+ },
38
+ },
39
+ ]);
40
+
41
+ const refetchQueries = async () => {
42
+ await Promise.all([refetchPermissions(), refetchRoutes()]);
43
+ };
44
+
45
+ useEffect(() => {
46
+ if (permissionsError) {
47
+ toggleNotification({
48
+ type: 'warning',
49
+ message: formatAPIError(permissionsError),
50
+ });
51
+ }
52
+ }, [toggleNotification, permissionsError, formatAPIError]);
53
+
54
+ useEffect(() => {
55
+ if (routesError) {
56
+ toggleNotification({
57
+ type: 'warning',
58
+ message: formatAPIError(routesError),
59
+ });
60
+ }
61
+ }, [toggleNotification, routesError, formatAPIError]);
62
+
63
+ const isLoading = isLoadingPermissions || isLoadingRoutes;
64
+
65
+ return {
66
+ permissions: permissions ? cleanPermissions(permissions) : {},
67
+ routes: routes ?? {},
68
+ getData: refetchQueries,
69
+ isLoading,
70
+ };
71
+ };
@@ -1,8 +1,11 @@
1
1
  import { useCallback, useEffect, useReducer, useRef } from 'react';
2
+
2
3
  import { useFetchClient, useNotification } from '@strapi/helper-plugin';
3
4
  import get from 'lodash/get';
4
- import init from './init';
5
+
5
6
  import pluginId from '../../pluginId';
7
+
8
+ import init from './init';
6
9
  import reducer, { initialState } from './reducer';
7
10
 
8
11
  const useRolesList = (shouldFetchData = true) => {
@@ -5,8 +5,10 @@
5
5
  // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated
6
6
  // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED
7
7
  import { prefixPluginTranslations } from '@strapi/helper-plugin';
8
+
8
9
  import pluginPkg from '../../package.json';
9
- import pluginPermissions from './permissions';
10
+
11
+ import { PERMISSIONS } from './constants';
10
12
  import pluginId from './pluginId';
11
13
  import getTrad from './utils/getTrad';
12
14
 
@@ -38,7 +40,7 @@ export default {
38
40
 
39
41
  return component;
40
42
  },
41
- permissions: pluginPermissions.accessRoles,
43
+ permissions: PERMISSIONS.accessRoles,
42
44
  },
43
45
  {
44
46
  intlLabel: {
@@ -54,7 +56,7 @@ export default {
54
56
 
55
57
  return component;
56
58
  },
57
- permissions: pluginPermissions.readProviders,
59
+ permissions: PERMISSIONS.readProviders,
58
60
  },
59
61
  {
60
62
  intlLabel: {
@@ -70,7 +72,7 @@ export default {
70
72
 
71
73
  return component;
72
74
  },
73
- permissions: pluginPermissions.readEmailTemplates,
75
+ permissions: PERMISSIONS.readEmailTemplates,
74
76
  },
75
77
  {
76
78
  intlLabel: {
@@ -86,7 +88,7 @@ export default {
86
88
 
87
89
  return component;
88
90
  },
89
- permissions: pluginPermissions.readAdvancedSettings,
91
+ permissions: PERMISSIONS.readAdvancedSettings,
90
92
  },
91
93
  ]
92
94
  );
@@ -1,7 +1,19 @@
1
- import React, { useMemo } from 'react';
2
- import { useQuery, useMutation, useQueryClient } from 'react-query';
3
- import { useIntl } from 'react-intl';
4
- import { Formik } from 'formik';
1
+ import React from 'react';
2
+
3
+ import {
4
+ Box,
5
+ Button,
6
+ ContentLayout,
7
+ Flex,
8
+ Grid,
9
+ GridItem,
10
+ HeaderLayout,
11
+ Main,
12
+ Option,
13
+ Select,
14
+ Typography,
15
+ useNotifyAT,
16
+ } from '@strapi/design-system';
5
17
  import {
6
18
  CheckPagePermissions,
7
19
  Form,
@@ -13,29 +25,20 @@ import {
13
25
  useOverlayBlocker,
14
26
  useRBAC,
15
27
  } from '@strapi/helper-plugin';
16
- import {
17
- useNotifyAT,
18
- Main,
19
- HeaderLayout,
20
- ContentLayout,
21
- Button,
22
- Box,
23
- Flex,
24
- Select,
25
- Option,
26
- Typography,
27
- Grid,
28
- GridItem,
29
- } from '@strapi/design-system';
30
28
  import { Check } from '@strapi/icons';
31
- import pluginPermissions from '../../permissions';
29
+ import { Formik } from 'formik';
30
+ import { useIntl } from 'react-intl';
31
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
32
+
33
+ import { PERMISSIONS } from '../../constants';
32
34
  import { getTrad } from '../../utils';
35
+
36
+ import { fetchData, putAdvancedSettings } from './utils/api';
33
37
  import layout from './utils/layout';
34
38
  import schema from './utils/schema';
35
- import { fetchData, putAdvancedSettings } from './utils/api';
36
39
 
37
40
  const ProtectedAdvancedSettingsPage = () => (
38
- <CheckPagePermissions permissions={pluginPermissions.readAdvancedSettings}>
41
+ <CheckPagePermissions permissions={PERMISSIONS.readAdvancedSettings}>
39
42
  <AdvancedSettingsPage />
40
43
  </CheckPagePermissions>
41
44
  );
@@ -48,14 +51,10 @@ const AdvancedSettingsPage = () => {
48
51
  const queryClient = useQueryClient();
49
52
  useFocusWhenNavigate();
50
53
 
51
- const updatePermissions = useMemo(
52
- () => ({ update: pluginPermissions.updateAdvancedSettings }),
53
- []
54
- );
55
54
  const {
56
55
  isLoading: isLoadingForPermissions,
57
56
  allowedActions: { canUpdate },
58
- } = useRBAC(updatePermissions);
57
+ } = useRBAC({ update: PERMISSIONS.updateAdvancedSettings });
59
58
 
60
59
  const { status: isLoadingData, data } = useQuery('advanced', () => fetchData(), {
61
60
  onSuccess() {
@@ -143,7 +142,7 @@ const AdvancedSettingsPage = () => {
143
142
  validationSchema={schema}
144
143
  enableReinitialize
145
144
  >
146
- {({ errors, values, handleChange, isSubmitting }) => {
145
+ {({ errors, values, handleChange, isSubmitting, dirty }) => {
147
146
  return (
148
147
  <Form>
149
148
  <HeaderLayout
@@ -155,7 +154,7 @@ const AdvancedSettingsPage = () => {
155
154
  <Button
156
155
  loading={isSubmitting}
157
156
  type="submit"
158
- disabled={!canUpdate}
157
+ disabled={canUpdate ? !dirty : !canUpdate}
159
158
  startIcon={<Check />}
160
159
  size="S"
161
160
  >
@@ -1,9 +1,8 @@
1
1
  import { getFetchClient } from '@strapi/helper-plugin';
2
- import { getRequestURL } from '../../../utils';
3
2
 
4
3
  const fetchData = async () => {
5
4
  const { get } = getFetchClient();
6
- const { data } = await get(getRequestURL('advanced'));
5
+ const { data } = await get('/users-permissions/advanced');
7
6
 
8
7
  return data;
9
8
  };
@@ -11,7 +10,7 @@ const fetchData = async () => {
11
10
  const putAdvancedSettings = (body) => {
12
11
  const { put } = getFetchClient();
13
12
 
14
- return put(getRequestURL('advanced'), body);
13
+ return put('/users-permissions/advanced', body);
15
14
  };
16
15
 
17
16
  export { fetchData, putAdvancedSettings };
@@ -1,5 +1,5 @@
1
- import * as yup from 'yup';
2
1
  import { translatedErrors } from '@strapi/helper-plugin';
2
+ import * as yup from 'yup';
3
3
 
4
4
  // eslint-disable-next-line prefer-regex-literals
5
5
  const URL_REGEX = new RegExp('(^$)|((.+:\\/\\/.*)(d*)\\/?(.*))');
@@ -1,20 +1,21 @@
1
1
  import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { useIntl } from 'react-intl';
4
- import { Form, GenericInput } from '@strapi/helper-plugin';
5
- import { Formik } from 'formik';
2
+
6
3
  import {
7
- ModalLayout,
8
- ModalHeader,
9
- ModalFooter,
10
- ModalBody,
4
+ Button,
11
5
  Grid,
12
6
  GridItem,
13
- Button,
14
- Breadcrumbs,
15
- Crumb,
7
+ ModalBody,
8
+ ModalFooter,
9
+ ModalHeader,
10
+ ModalLayout,
16
11
  Textarea,
17
12
  } from '@strapi/design-system';
13
+ import { Breadcrumbs, Crumb } from '@strapi/design-system/v2';
14
+ import { Form, GenericInput } from '@strapi/helper-plugin';
15
+ import { Formik } from 'formik';
16
+ import PropTypes from 'prop-types';
17
+ import { useIntl } from 'react-intl';
18
+
18
19
  import { getTrad } from '../../../utils';
19
20
  import schema from '../utils/schema';
20
21
 
@@ -45,7 +46,7 @@ const EmailForm = ({ template, onToggle, onSubmit }) => {
45
46
  defaultMessage: 'Edit email template',
46
47
  })}
47
48
  </Crumb>
48
- <Crumb>
49
+ <Crumb isCurrent>
49
50
  {formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}
50
51
  </Crumb>
51
52
  </Breadcrumbs>
@@ -120,7 +121,7 @@ const EmailForm = ({ template, onToggle, onSubmit }) => {
120
121
  id: getTrad('PopUpForm.Email.options.message.label'),
121
122
  defaultMessage: 'Message',
122
123
  })}
123
- name="options.message"
124
+ id="options.message"
124
125
  onChange={handleChange}
125
126
  value={values.options.message}
126
127
  error={
@@ -1,20 +1,22 @@
1
1
  import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { useIntl } from 'react-intl';
2
+
4
3
  import {
4
+ Icon,
5
+ IconButton,
5
6
  Table,
6
- Thead,
7
7
  Tbody,
8
- Tr,
9
8
  Td,
10
9
  Th,
10
+ Thead,
11
+ Tr,
11
12
  Typography,
12
- IconButton,
13
- Icon,
14
13
  VisuallyHidden,
15
14
  } from '@strapi/design-system';
16
- import { Pencil, Refresh, Check } from '@strapi/icons';
17
15
  import { onRowClick, stopPropagation } from '@strapi/helper-plugin';
16
+ import { Check, Pencil, Refresh } from '@strapi/icons';
17
+ import PropTypes from 'prop-types';
18
+ import { useIntl } from 'react-intl';
19
+
18
20
  import { getTrad } from '../../../utils';
19
21
 
20
22
  const EmailTable = ({ canUpdate, onEditClick }) => {
@@ -1,25 +1,28 @@
1
- import React, { useMemo, useRef, useState } from 'react';
2
- import { useQuery, useMutation, useQueryClient } from 'react-query';
3
- import { useIntl } from 'react-intl';
1
+ import React, { useRef, useState } from 'react';
2
+
3
+ import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';
4
4
  import {
5
+ CheckPagePermissions,
6
+ LoadingIndicatorPage,
5
7
  SettingsPageTitle,
6
- useTracking,
8
+ useFocusWhenNavigate,
7
9
  useNotification,
8
10
  useOverlayBlocker,
9
- CheckPagePermissions,
10
11
  useRBAC,
11
- useFocusWhenNavigate,
12
- LoadingIndicatorPage,
12
+ useTracking,
13
13
  } from '@strapi/helper-plugin';
14
- import { useNotifyAT, Main, ContentLayout, HeaderLayout } from '@strapi/design-system';
15
- import pluginPermissions from '../../permissions';
14
+ import { useIntl } from 'react-intl';
15
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
16
+
17
+ import { PERMISSIONS } from '../../constants';
16
18
  import { getTrad } from '../../utils';
17
- import { fetchData, putEmailTemplate } from './utils/api';
18
- import EmailTable from './components/EmailTable';
19
+
19
20
  import EmailForm from './components/EmailForm';
21
+ import EmailTable from './components/EmailTable';
22
+ import { fetchData, putEmailTemplate } from './utils/api';
20
23
 
21
24
  const ProtectedEmailTemplatesPage = () => (
22
- <CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
25
+ <CheckPagePermissions permissions={PERMISSIONS.readEmailTemplates}>
23
26
  <EmailTemplatesPage />
24
27
  </CheckPagePermissions>
25
28
  );
@@ -37,14 +40,10 @@ const EmailTemplatesPage = () => {
37
40
  const [isModalOpen, setIsModalOpen] = useState(false);
38
41
  const [templateToEdit, setTemplateToEdit] = useState(null);
39
42
 
40
- const updatePermissions = useMemo(() => {
41
- return { update: pluginPermissions.updateEmailTemplates };
42
- }, []);
43
-
44
43
  const {
45
44
  isLoading: isLoadingForPermissions,
46
45
  allowedActions: { canUpdate },
47
- } = useRBAC(updatePermissions);
46
+ } = useRBAC({ update: PERMISSIONS.updateEmailTemplates });
48
47
 
49
48
  const { status: isLoadingData, data } = useQuery('email-templates', () => fetchData(), {
50
49
  onSuccess() {