diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/ListBaselineAlignment/index.js b/packages/strapi-plugin-users-permissions/admin/src/components/ListBaselineAlignment/index.js new file mode 100644 index 0000000000..403e0a8ab6 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/components/ListBaselineAlignment/index.js @@ -0,0 +1,8 @@ +import styled from 'styled-components'; + +// TODO : Temporary baseline alignment +const ListBaselineAlignment = styled.div` + padding-top: 3px; +`; + +export default ListBaselineAlignment; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/ListRow/index.js b/packages/strapi-plugin-users-permissions/admin/src/components/ListRow/index.js new file mode 100644 index 0000000000..6bf7599926 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/components/ListRow/index.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { CustomRow } from '@buffetjs/styles'; +import { IconLinks, Text } from '@buffetjs/core'; +import PropTypes from 'prop-types'; +import PrefixedIcon from '../PrefixedIcon'; + +const ListRow = ({ icon, name, onClick, links, children }) => { + return ( + + + + + {children} + + + + + ); +}; + +ListRow.defaultProps = { + children: null, + onClick: () => {}, + links: [], +}; + +ListRow.propTypes = { + children: PropTypes.node, + icon: PropTypes.array.isRequired, + links: PropTypes.array, + name: PropTypes.string.isRequired, + onClick: PropTypes.func, +}; + +export default ListRow; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/PrefixedIcon/index.js b/packages/strapi-plugin-users-permissions/admin/src/components/PrefixedIcon/index.js new file mode 100644 index 0000000000..96c6ffe242 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/components/PrefixedIcon/index.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Flex, Padded, Text } from '@buffetjs/core'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { upperFirst } from 'lodash'; +import PropTypes from 'prop-types'; + +const PrefixedIcon = ({ icon, name }) => { + return ( + +
+ +
+ + + {upperFirst(name)} + + +
+ ); +}; + +PrefixedIcon.propTypes = { + icon: PropTypes.array.isRequired, + name: PropTypes.string.isRequired, +}; + +export default PrefixedIcon; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AdvancedSettings/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/AdvancedSettings/index.js index 9d2bb90b7c..807ff631df 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AdvancedSettings/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AdvancedSettings/index.js @@ -1,5 +1,6 @@ import React from 'react'; import { useIntl } from 'react-intl'; +import { Header } from '@buffetjs/custom'; import { SettingsPageTitle } from 'strapi-helper-plugin'; import getTrad from '../../utils/getTrad'; @@ -10,7 +11,9 @@ const AdvancedSettingsPage = () => { return ( <> -
Advanced settings
+
+
+
); }; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EmailTemplates/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EmailTemplates/index.js index e0f5c5cc2b..b16d2373c2 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EmailTemplates/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EmailTemplates/index.js @@ -1,5 +1,6 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { useIntl } from 'react-intl'; +import { Header } from '@buffetjs/custom'; import { SettingsPageTitle } from 'strapi-helper-plugin'; import getTrad from '../../utils/getTrad'; @@ -10,7 +11,9 @@ const EmailTemplatesPage = () => { return ( <> -
Email
+
+
+
); }; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/index.js index 4d38d62ad4..c055baa22d 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/index.js @@ -1,16 +1,122 @@ -import React from 'react'; +import React, { useEffect, useMemo, useReducer } from 'react'; import { useIntl } from 'react-intl'; -import { SettingsPageTitle } from 'strapi-helper-plugin'; -import getTrad from '../../utils/getTrad'; +import { Header, List } from '@buffetjs/custom'; +import { Text } from '@buffetjs/core'; +import { Pencil } from '@buffetjs/icons'; +import { SettingsPageTitle, useUserPermissions, request } from 'strapi-helper-plugin'; +import pluginPermissions from '../../permissions'; +import { getRequestURL, getTrad } from '../../utils'; +import ListBaselineAlignment from '../../components/ListBaselineAlignment'; +import ListRow from '../../components/ListRow'; +import reducer, { initialState } from './reducer'; const ProvidersPage = () => { const { formatMessage } = useIntl(); const pageTitle = formatMessage({ id: getTrad('HeaderNav.link.providers') }); + const updatePermissions = useMemo(() => { + return { update: pluginPermissions.updateProviders }; + }, [pluginPermissions]); + const { + isLoading: isLoadingForPermissions, + allowedActions: { canUpdate }, + } = useUserPermissions(updatePermissions); + const [{ isLoading, providers }, dispatch] = useReducer(reducer, initialState); + const enabledProvidersCount = useMemo( + () => providers.filter(provider => provider.enabled).length, + [providers] + ); + const disabledProvidersCount = useMemo(() => { + return providers.length - enabledProvidersCount; + }, [providers, enabledProvidersCount]); + + const listTitle = useMemo(() => { + const enabledMessage = formatMessage( + { + id: getTrad( + `List.title.providers.enabled.${enabledProvidersCount > 1 ? 'plural' : 'singular'}` + ), + }, + { number: enabledProvidersCount } + ); + const disabledMessage = formatMessage( + { + id: getTrad( + `List.title.providers.disabled.${disabledProvidersCount > 1 ? 'plural' : 'singular'}` + ), + }, + { number: disabledProvidersCount } + ); + + return `${enabledMessage} ${disabledMessage}`; + }, [formatMessage, enabledProvidersCount]); + + useEffect(() => { + const getData = async () => { + try { + dispatch({ + type: 'GET_DATA', + }); + + const data = await request(getRequestURL('providers'), { method: 'GET' }); + + console.log({ data }); + + dispatch({ + type: 'GET_DATA_SUCCEEDED', + data, + }); + } catch (err) { + dispatch({ + type: 'GET_DATA_ERROR', + }); + console.error(err); + strapi.notification.error('notification.error'); + } + }; + + if (!isLoadingForPermissions) { + getData(); + } + }, [isLoadingForPermissions]); return ( <> -
Providers
+
+
+ + ( + { + console.log(`Will edit ${provider.name}`); + }} + links={[ + { + icon: canUpdate ? : null, + onClick: () => { + console.log(`Will edit ${provider.name}`); + }, + }, + ]} + > + + + {provider.enabled ? 'Enabled' : 'Disabled'} + + + + )} + /> +
); }; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/reducer.js b/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/reducer.js new file mode 100644 index 0000000000..b3ab611516 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/Providers/reducer.js @@ -0,0 +1,49 @@ +import produce from 'immer'; +import { sortBy } from 'lodash'; + +const initialState = { + isLoading: true, + data: {}, + providers: [], +}; + +const reducer = (state, action) => + // eslint-disable-next-line consistent-return + produce(state, draftState => { + switch (action.type) { + case 'GET_DATA': { + draftState.isLoading = true; + break; + } + + case 'GET_DATA_SUCCEEDED': { + draftState.isLoading = false; + draftState.data = action.data; + draftState.providers = sortBy( + Object.keys(action.data).reduce((acc, current) => { + const { icon: iconName, enabled } = action.data[current]; + const icon = iconName === 'envelope' ? ['fas', 'envelope'] : ['fab', iconName]; + + acc.push({ name: current, icon, enabled }); + + return acc; + }, []), + 'name' + ); + + break; + } + case 'GET_DATA_ERROR': { + drafState.isLoading = true; + break; + } + case 'RESET_PROPS': + return initialState; + default: { + return draftState; + } + } + }); + +export default reducer; +export { initialState }; diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json index 02e9befcac..e55493f19d 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json @@ -44,10 +44,7 @@ "List.button.roles": "Add New Role", "List.title.emailTemplates.plural": "{number} email templates are available", "List.title.emailTemplates.singular": "{number} email template is available", - "List.title.providers.disabled.plural": "{number} are disabled", - "List.title.providers.disabled.singular": "{number} is disabled", - "List.title.providers.enabled.plural": "{number} providers are enabled and", - "List.title.providers.enabled.singular": "{number} provider is enabled and", + "List.title.roles.plural": "{number} roles are available", "List.title.roles.singular": "{number} role is available", "ListRow.disabled": "Disabled", @@ -113,6 +110,10 @@ "HeaderNav.link.emailTemplates": "Email templates", "HeaderNav.link.providers": "Providers", "HeaderNav.link.roles": "Roles", + "List.title.providers.disabled.plural": "{number} are disabled", + "List.title.providers.disabled.singular": "{number} is disabled", + "List.title.providers.enabled.plural": "{number} providers are enabled and", + "List.title.providers.enabled.singular": "{number} provider is enabled and", "plugin.description.long": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.", "plugin.description.short": "Protect your API with a full authentication process based on JWT", "plugin.name": "Users & Permissions Plugin" diff --git a/packages/strapi-plugin-users-permissions/admin/src/utils/getRequestURL.js b/packages/strapi-plugin-users-permissions/admin/src/utils/getRequestURL.js new file mode 100644 index 0000000000..0afbc8b9f9 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/utils/getRequestURL.js @@ -0,0 +1,5 @@ +import pluginId from '../pluginId'; + +const getRequestURL = endPoint => `/${pluginId}/${endPoint}`; + +export default getRequestURL; diff --git a/packages/strapi-plugin-users-permissions/admin/src/utils/index.js b/packages/strapi-plugin-users-permissions/admin/src/utils/index.js new file mode 100644 index 0000000000..8e632dc2c6 --- /dev/null +++ b/packages/strapi-plugin-users-permissions/admin/src/utils/index.js @@ -0,0 +1,2 @@ +export { default as getRequestURL } from './getRequestURL'; +export { default as getTrad } from './getTrad';