diff --git a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js index 56cf76bad4..f23812991d 100644 --- a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js @@ -1,7 +1,7 @@ import React from 'react'; -import { CustomContentLayout, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import { useFocusWhenNavigate, NoPermissions as NoPermissionsCompo } from '@strapi/helper-plugin'; import { Main } from '@strapi/parts/Main'; -import { HeaderLayout } from '@strapi/parts/Layout'; +import { ContentLayout, HeaderLayout } from '@strapi/parts/Layout'; import { useIntl } from 'react-intl'; import { getTrad } from '../../utils'; @@ -18,9 +18,9 @@ const NoPermissions = () => { defaultMessage: 'Content', })} /> - -
- + + + ); }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js index bb2a1d5a08..d9c3b4def4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js @@ -6,7 +6,6 @@ import pick from 'lodash/pick'; import get from 'lodash/get'; import omit from 'lodash/omit'; import { - CustomContentLayout, Form, GenericInput, SettingsPageTitle, @@ -15,13 +14,14 @@ import { useFocusWhenNavigate, useNotification, useOverlayBlocker, + LoadingIndicatorPage, } from '@strapi/helper-plugin'; import { useQuery } from 'react-query'; import { Formik } from 'formik'; import { Box } from '@strapi/parts/Box'; import { Button } from '@strapi/parts/Button'; import { Grid, GridItem } from '@strapi/parts/Grid'; -import { HeaderLayout } from '@strapi/parts/Layout'; +import { HeaderLayout, ContentLayout } from '@strapi/parts/Layout'; import { H3 } from '@strapi/parts/Text'; import { Main } from '@strapi/parts/Main'; import { Stack } from '@strapi/parts/Stack'; @@ -130,7 +130,7 @@ const EditPage = ({ canUpdate }) => { if (isLoading) { return ( -
+
{ } title={title} /> - + + +
); } @@ -172,7 +174,7 @@ const EditPage = ({ canUpdate }) => { } title={title} /> - + {data?.registrationToken && ( @@ -243,7 +245,7 @@ const EditPage = ({ canUpdate }) => { - + ); }} diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js index 84f8bcce65..30e083e61a 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js @@ -1,13 +1,13 @@ import React, { useState } from 'react'; import { - CustomContentLayout, Search, SettingsPageTitle, useRBAC, useNotification, useFocusWhenNavigate, + NoPermissions, } from '@strapi/helper-plugin'; -import { Button, Box, HeaderLayout, Main, Row } from '@strapi/parts'; +import { Button, Box, HeaderLayout, Main, Row, ContentLayout } from '@strapi/parts'; import { Mail } from '@strapi/icons'; import { useLocation } from 'react-router-dom'; import { useIntl } from 'react-intl'; @@ -85,7 +85,7 @@ const ListPage = () => { ); return ( -
+
{ { number: total } )} /> - + + {!canRead && } {status === 'error' &&
TODO: An error occurred
} {canRead && ( <> @@ -129,7 +130,7 @@ const ListPage = () => { )} -
+ {isModalOpened && }
); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js index 344ea63564..de38667337 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js @@ -121,6 +121,11 @@ describe('ADMIN | Pages | USERS | ListPage', () => { padding-right: 8px; } + .c13 { + padding-right: 56px; + padding-left: 56px; + } + .c14 { padding-bottom: 16px; } @@ -748,11 +753,6 @@ describe('ADMIN | Pages | USERS | ListPage', () => { fill: #666687; } - .c13 { - padding-right: 56px; - padding-left: 56px; - } - .c36 tr:last-of-type { border-bottom: none; } @@ -789,6 +789,7 @@ describe('ADMIN | Pages | USERS | ListPage', () => { }
{
{ + useEffect(() => { + console.error( + 'This component will soon be removed, please check out the PageTemplate in the storybook' + ); + }, []); + if (!canRead) { return ( diff --git a/packages/core/helper-plugin/lib/src/components/NoContent/NoContent.stories.mdx b/packages/core/helper-plugin/lib/src/components/NoContent/NoContent.stories.mdx new file mode 100644 index 0000000000..a1da2d5546 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoContent/NoContent.stories.mdx @@ -0,0 +1,31 @@ + + +import { Meta, ArgsTable, Canvas, Story } from '@storybook/addon-docs'; +import { Main, Row, Button } from '@strapi/parts'; +import NoContent from './index'; + + + +# NoContent + +This component is used to display an empty state. + +## Usage + + + +
+ Add content} + /> +
+
+
+ +### Props + + diff --git a/packages/core/helper-plugin/lib/src/components/NoContent/index.js b/packages/core/helper-plugin/lib/src/components/NoContent/index.js new file mode 100644 index 0000000000..0e50062207 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoContent/index.js @@ -0,0 +1,38 @@ +import React from 'react'; +import EmptyStateDocument from '@strapi/icons/EmptyStateDocument'; +import { EmptyStateLayout } from '@strapi/parts/EmptyStateLayout'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +const NoContent = ({ content, ...rest }) => { + const { formatMessage } = useIntl(); + + return ( + } + {...rest} + content={formatMessage( + { id: content.id, defaultMessage: content.defaultMessage }, + content.values + )} + /> + ); +}; + +NoContent.defaultProps = { + content: { + id: 'app.components.EmptyStateLayout.content-document', + defaultMessage: "You don't have any content yet...", + values: {}, + }, +}; + +NoContent.propTypes = { + content: PropTypes.shape({ + id: PropTypes.string, + defaultMessage: PropTypes.string, + values: PropTypes.object, + }), +}; + +export default NoContent; diff --git a/packages/core/helper-plugin/lib/src/components/NoMedia/NoMedia.stories.mdx b/packages/core/helper-plugin/lib/src/components/NoMedia/NoMedia.stories.mdx new file mode 100644 index 0000000000..ea22ed2712 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoMedia/NoMedia.stories.mdx @@ -0,0 +1,25 @@ + + +import { Meta, ArgsTable, Canvas, Story } from '@storybook/addon-docs'; +import { Main, Row, Button } from '@strapi/parts'; +import NoMedia from './index'; + + + +# NoMedia + +This component is used to display an empty state. + +## Usage + + + +
+ Add a media} /> +
+
+
+ +### Props + + diff --git a/packages/core/helper-plugin/lib/src/components/NoMedia/index.js b/packages/core/helper-plugin/lib/src/components/NoMedia/index.js new file mode 100644 index 0000000000..7ec1d4d8d7 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoMedia/index.js @@ -0,0 +1,9 @@ +import React from 'react'; +import EmptyStatePicture from '@strapi/icons/EmptyStatePicture'; +import { EmptyStateLayout } from '@strapi/parts/EmptyStateLayout'; + +const NoMedia = props => { + return } {...props} />; +}; + +export default NoMedia; diff --git a/packages/core/helper-plugin/lib/src/components/NoPermissions/NoPermissions.stories.mdx b/packages/core/helper-plugin/lib/src/components/NoPermissions/NoPermissions.stories.mdx new file mode 100644 index 0000000000..6790965b82 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoPermissions/NoPermissions.stories.mdx @@ -0,0 +1,25 @@ + + +import { Meta, ArgsTable, Canvas, Story } from '@storybook/addon-docs'; +import { Main, Row } from '@strapi/parts'; +import NoPermissions from './index'; + + + +# NoPermissions + +This component is used to display an empty state. + +## Usage + + + +
+ +
+
+
+ +### Props + + diff --git a/packages/core/helper-plugin/lib/src/components/NoPermissions/index.js b/packages/core/helper-plugin/lib/src/components/NoPermissions/index.js new file mode 100644 index 0000000000..b517fef5c5 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/components/NoPermissions/index.js @@ -0,0 +1,30 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import EmptyStatePermissions from '@strapi/icons/EmptyStatePermissions'; +import { EmptyStateLayout } from '@strapi/parts/EmptyStateLayout'; + +const NoPermissions = ({ action }) => { + const { formatMessage } = useIntl(); + + return ( + } + content={formatMessage({ + id: 'app.components.EmptyStateLayout.content-permissions', + defaultMessage: "You don't have the permissions to access that content", + })} + action={action} + /> + ); +}; + +NoPermissions.defaultProps = { + action: undefined, +}; + +NoPermissions.propTypes = { + action: PropTypes.node, +}; + +export default NoPermissions; diff --git a/packages/core/helper-plugin/lib/src/index.js b/packages/core/helper-plugin/lib/src/index.js index fc13c5d939..9deea2cbcd 100644 --- a/packages/core/helper-plugin/lib/src/index.js +++ b/packages/core/helper-plugin/lib/src/index.js @@ -183,6 +183,9 @@ export { default as ConfirmDialog } from './components/ConfirmDialog'; export { default as ContentBox } from './components/ContentBox'; export { default as CustomContentLayout } from './components/CustomContentLayout'; export { default as EmptyStateLayout } from './components/EmptyStateLayout'; +export { default as NoContent } from './components/NoContent'; +export { default as NoMedia } from './components/NoMedia'; +export { default as NoPermissions } from './components/NoPermissions'; export { default as EmptyBodyTable } from './components/EmptyBodyTable'; export { default as GenericInput } from './components/GenericInput'; export * from './components/InjectionZone'; diff --git a/packages/core/helper-plugin/lib/src/templates/PageTemplate/PageTemplate.stories.mdx b/packages/core/helper-plugin/lib/src/templates/PageTemplate/PageTemplate.stories.mdx new file mode 100644 index 0000000000..317955e096 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/templates/PageTemplate/PageTemplate.stories.mdx @@ -0,0 +1,74 @@ + + +import { Meta, ArgsTable, Canvas, Story } from '@storybook/addon-docs'; +import { Main, Layout, HeaderLayout, Button, ActionLayout, ContentLayout,Box } from '@strapi/parts'; +import AddIcon from '@strapi/icons/AddIcon' +import EditIcon from '@strapi/icons/EditIcon' +import LoadingIndicatorPage from '../../components/LoadingIndicatorPage'; +import NoContent from '../../components/NoContent' +import NoPermissions from '../../components/NoPermissions' + + + +# PageTemplate + +This component is used to display an empty state. + +## Imports + +```js +import { Main } from '@strapi/parts/Main'; +import { ActionLayout, ContentLayout, HeaderLayout, Layout } from '@strapi/parts/Layout'; +import { Button } from '@strapi/parts/Button'; +import { Box } from '@strapi/parts/Box'; +import { LoadingIndicatorPage, NoContent, NoPermissions } from '@strapi/helper-plugin'; +``` + +## Usage + + + + {() => { + const canRead = false; + const isLoading = true; + const data = []; + return ( + + +
+ }>Add an entry} + secondaryAction={ + + } + title="Other CT" + subtitle="36 entries found" + /> + + + + + } + endActions={ + <> + + + } + /> + + {!canRead && } + {(canRead && data && data.length === 0) && Add content}/>} + {isLoading && } + +
+
+
+ ); + }} +
+
diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js index 2267957e65..3f9873c1b6 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js @@ -14,6 +14,7 @@ import { Th, TableLabel, useNotifyAT, + ContentLayout, } from '@strapi/parts'; import { AddIcon, EditIcon } from '@strapi/icons'; @@ -23,8 +24,9 @@ import { SettingsPageTitle, CheckPermissions, useNotification, - CustomContentLayout, useRBAC, + NoPermissions, + LoadingIndicatorPage, } from '@strapi/helper-plugin'; import { useHistory } from 'react-router-dom'; import { useQuery } from 'react-query'; @@ -59,7 +61,10 @@ const RoleListPage = () => { isLoading: isLoadingForData, data: { roles }, isFetching, - } = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), { initialData: {} }); + } = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), { + initialData: {}, + enabled: canRead, + }); const isLoading = isLoadingForData || isFetching; @@ -73,7 +78,7 @@ const RoleListPage = () => { defaultMessage: 'Roles', }); - const handleClickEdit = (id) => { + const handleClickEdit = id => { push(`/settings/${pluginId}/roles/${id}`); }; @@ -104,70 +109,74 @@ const RoleListPage = () => { } /> - - - - - - - - - - - {roles && - roles.map((role) => ( - - - - - - - ))} - -
- - {formatMessage({ id: getTrad('Roles.name'), defaultMessage: 'Name' })} - - - - {formatMessage({ - id: getTrad('Roles.description'), - defaultMessage: 'Description', - })} - - - - {formatMessage({ - id: getTrad('Roles.users'), - defaultMessage: 'Users', - })} - -
- {role.name} - - {role.description} - - - {`${role.nb_users} ${formatMessage({ - id: getTrad('Roles.users'), - defaultMessage: 'users', - }).toLowerCase()}`} - - - - handleClickEdit(role.id)} - noBorder - icon={} - label="Edit" - /> - -
-
+ {!canRead && } + {(isLoading || isLoadingForPermissions) && } + {canRead && roles && roles.length && ( + + + + + + + + + + {roles && + roles.map(role => ( + + + + + + + ))} + +
+ + {formatMessage({ id: getTrad('Roles.name'), defaultMessage: 'Name' })} + + + + {formatMessage({ + id: getTrad('Roles.description'), + defaultMessage: 'Description', + })} + + + + {formatMessage({ + id: getTrad('Roles.users'), + defaultMessage: 'Users', + })} + +
+ {role.name} + + {role.description} + + + {`${role.nb_users} ${formatMessage({ + id: getTrad('Roles.users'), + defaultMessage: 'users', + }).toLowerCase()}`} + + + + handleClickEdit(role.id)} + noBorder + icon={} + label="Edit" + /> + +
+ )} +
); diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js index 7f320f9848..35b49f9e9f 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js @@ -91,6 +91,11 @@ describe('Admin | containers | RoleListPage', () => { padding-left: 56px; } + .c10 { + padding-right: 56px; + padding-left: 56px; + } + .c5 { display: -webkit-box; display: -webkit-flex; @@ -136,11 +141,6 @@ describe('Admin | containers | RoleListPage', () => { outline: none; } - .c10 { - padding-right: 56px; - padding-left: 56px; - } - .c13 { border: 0; -webkit-clip: rect(0 0 0 0);