@strapi/plugin-users-permissions 0.0.0-next.c58b405b44c71a93df733024d1f15c069cb6bdca → 0.0.0-next.de5394e73076ccf7aca1e28dc68894e3c43f8b91

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/contexts/UsersPermissionsContext/index.js +1 -0
  11. package/admin/src/hooks/index.js +1 -1
  12. package/admin/src/hooks/useFetchRole/index.js +6 -3
  13. package/admin/src/hooks/useForm/index.js +7 -7
  14. package/admin/src/hooks/usePlugins.js +71 -0
  15. package/admin/src/hooks/useRolesList/index.js +22 -20
  16. package/admin/src/index.js +2 -0
  17. package/admin/src/pages/AdvancedSettings/index.js +21 -18
  18. package/admin/src/pages/AdvancedSettings/utils/api.js +1 -0
  19. package/admin/src/pages/AdvancedSettings/utils/schema.js +1 -1
  20. package/admin/src/pages/EmailTemplates/components/EmailForm.js +14 -13
  21. package/admin/src/pages/EmailTemplates/components/EmailTable.js +9 -7
  22. package/admin/src/pages/EmailTemplates/index.js +12 -9
  23. package/admin/src/pages/EmailTemplates/utils/api.js +1 -0
  24. package/admin/src/pages/EmailTemplates/utils/schema.js +1 -1
  25. package/admin/src/pages/Providers/index.js +29 -26
  26. package/admin/src/pages/Providers/utils/api.js +1 -0
  27. package/admin/src/pages/Providers/utils/forms.js +1 -1
  28. package/admin/src/pages/Roles/{CreatePage/index.js → CreatePage.js} +26 -23
  29. package/admin/src/pages/Roles/{EditPage/index.js → EditPage.js} +23 -20
  30. package/admin/src/pages/Roles/ListPage/components/TableBody.js +4 -3
  31. package/admin/src/pages/Roles/ListPage/index.js +38 -19
  32. package/admin/src/pages/Roles/ListPage/utils/api.js +2 -1
  33. package/admin/src/pages/Roles/{ProtectedCreatePage/index.js → ProtectedCreatePage.js} +5 -2
  34. package/admin/src/pages/Roles/{ProtectedEditPage/index.js → ProtectedEditPage.js} +5 -2
  35. package/admin/src/pages/Roles/{ProtectedListPage/index.js → ProtectedListPage.js} +4 -2
  36. package/admin/src/pages/Roles/{CreatePage/utils/schema.js → constants.js} +2 -4
  37. package/admin/src/pages/Roles/index.js +9 -6
  38. package/admin/src/translations/ru.json +50 -26
  39. package/admin/src/utils/index.js +1 -1
  40. package/documentation/content-api.yaml +22 -14
  41. package/jest.config.front.js +2 -0
  42. package/package.json +17 -21
  43. package/server/controllers/auth.js +6 -0
  44. package/server/register.js +7 -1
  45. package/server/services/providers-registry.js +1 -1
  46. package/admin/src/hooks/usePlugins/index.js +0 -67
  47. package/admin/src/hooks/usePlugins/init.js +0 -5
  48. package/admin/src/hooks/usePlugins/reducer.js +0 -34
  49. package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
@@ -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,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,9 @@
1
1
  import { useCallback, useEffect, useReducer, useRef } from 'react';
2
- import { useRBAC, request, useNotification } from '@strapi/helper-plugin';
2
+
3
+ import { useFetchClient, useNotification, useRBAC } from '@strapi/helper-plugin';
4
+
3
5
  import { getRequestURL } from '../../utils';
6
+
4
7
  import reducer, { initialState } from './reducer';
5
8
 
6
9
  const useUserForm = (endPoint, permissions) => {
@@ -9,8 +12,7 @@ const useUserForm = (endPoint, permissions) => {
9
12
  const toggleNotification = useNotification();
10
13
  const isMounted = useRef(true);
11
14
 
12
- const abortController = new AbortController();
13
- const { signal } = abortController;
15
+ const { get } = useFetchClient();
14
16
 
15
17
  useEffect(() => {
16
18
  const getData = async () => {
@@ -19,7 +21,7 @@ const useUserForm = (endPoint, permissions) => {
19
21
  type: 'GET_DATA',
20
22
  });
21
23
 
22
- const data = await request(getRequestURL(endPoint), { method: 'GET', signal });
24
+ const { data } = await get(getRequestURL(endPoint));
23
25
 
24
26
  dispatch({
25
27
  type: 'GET_DATA_SUCCEEDED',
@@ -45,11 +47,9 @@ const useUserForm = (endPoint, permissions) => {
45
47
  }
46
48
 
47
49
  return () => {
48
- abortController.abort();
49
50
  isMounted.current = false;
50
51
  };
51
- // eslint-disable-next-line react-hooks/exhaustive-deps
52
- }, [isLoadingForPermissions, endPoint]);
52
+ }, [isLoadingForPermissions, endPoint, get, toggleNotification]);
53
53
 
54
54
  const dispatchSubmitSucceeded = useCallback((data) => {
55
55
  dispatch({
@@ -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
- import { useEffect, useReducer, useRef } from 'react';
2
- import { request, useNotification } from '@strapi/helper-plugin';
1
+ import { useCallback, useEffect, useReducer, useRef } from 'react';
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) => {
@@ -12,28 +15,17 @@ const useRolesList = (shouldFetchData = true) => {
12
15
  const toggleNotification = useNotification();
13
16
 
14
17
  const isMounted = useRef(true);
15
- const abortController = new AbortController();
16
- const { signal } = abortController;
17
-
18
- useEffect(() => {
19
- if (shouldFetchData) {
20
- fetchRolesList();
21
- }
18
+ const fetchClient = useFetchClient();
22
19
 
23
- return () => {
24
- abortController.abort();
25
- isMounted.current = false;
26
- };
27
- // eslint-disable-next-line react-hooks/exhaustive-deps
28
- }, [shouldFetchData]);
29
-
30
- const fetchRolesList = async () => {
20
+ const fetchRolesList = useCallback(async () => {
31
21
  try {
32
22
  dispatch({
33
23
  type: 'GET_DATA',
34
24
  });
35
25
 
36
- const { roles } = await request(`/${pluginId}/roles`, { method: 'GET', signal });
26
+ const {
27
+ data: { roles },
28
+ } = await fetchClient.get(`/${pluginId}/roles`);
37
29
 
38
30
  dispatch({
39
31
  type: 'GET_DATA_SUCCEEDED',
@@ -55,7 +47,17 @@ const useRolesList = (shouldFetchData = true) => {
55
47
  }
56
48
  }
57
49
  }
58
- };
50
+ }, [fetchClient, toggleNotification]);
51
+
52
+ useEffect(() => {
53
+ if (shouldFetchData) {
54
+ fetchRolesList();
55
+ }
56
+
57
+ return () => {
58
+ isMounted.current = false;
59
+ };
60
+ }, [shouldFetchData, fetchRolesList]);
59
61
 
60
62
  return { roles, isLoading, getData: fetchRolesList };
61
63
  };
@@ -5,7 +5,9 @@
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';
10
+
9
11
  import pluginPermissions from './permissions';
10
12
  import pluginId from './pluginId';
11
13
  import getTrad from './utils/getTrad';
@@ -1,7 +1,19 @@
1
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';
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,26 +25,17 @@ 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';
29
+ import { Formik } from 'formik';
30
+ import { useIntl } from 'react-intl';
31
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
32
+
31
33
  import pluginPermissions from '../../permissions';
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
41
  <CheckPagePermissions permissions={pluginPermissions.readAdvancedSettings}>
@@ -1,4 +1,5 @@
1
1
  import { getFetchClient } from '@strapi/helper-plugin';
2
+
2
3
  import { getRequestURL } from '../../../utils';
3
4
 
4
5
  const fetchData = async () => {
@@ -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,22 +1,25 @@
1
1
  import React, { useMemo, useRef, useState } from 'react';
2
- import { useQuery, useMutation, useQueryClient } from 'react-query';
3
- import { useIntl } from 'react-intl';
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';
14
+ import { useIntl } from 'react-intl';
15
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
16
+
15
17
  import pluginPermissions from '../../permissions';
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
25
  <CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
@@ -1,4 +1,5 @@
1
1
  import { getFetchClient } from '@strapi/helper-plugin';
2
+
2
3
  import { getRequestURL } from '../../../utils';
3
4
 
4
5
  const fetchData = async () => {
@@ -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
  const schema = yup.object().shape({
5
5
  options: yup