From f469fbc6c304d4acd7065012f01a7fb00a1cb614 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 26 Jun 2023 12:57:16 +0200 Subject: [PATCH 1/5] Enhancement: Display workflow limits on list, edit and create pages --- .../components/LimitsModal/LimitsModal.js | 111 ++++++++++++++++++ .../components/LimitsModal/assets/balloon.png | Bin 0 -> 108323 bytes .../components/LimitsModal/index.js | 3 + .../LimitsModal/tests/LimitsModal.test.js | 62 ++++++++++ .../hooks/tests/useReviewWorkflows.test.js | 16 +++ .../hooks/useReviewWorkflows.js | 13 +- .../pages/CreateView/CreateView.js | 28 +++++ .../pages/EditView/EditView.js | 27 +++++ .../pages/ListView/ListView.js | 47 +++++++- 9 files changed, 296 insertions(+), 11 deletions(-) create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/LimitsModal.js create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/assets/balloon.png create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/index.js create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/tests/LimitsModal.test.js diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/LimitsModal.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/LimitsModal.js new file mode 100644 index 0000000000..7b14f93944 --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/LimitsModal.js @@ -0,0 +1,111 @@ +import * as React from 'react'; + +import { Box, Flex, IconButton, ModalLayout, ModalBody, Typography } from '@strapi/design-system'; +import { LinkButton } from '@strapi/design-system/v2'; +import { Cross } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import balloonImageSrc from './assets/balloon.png'; + +const TITLE_ID = 'limits-title'; + +const CTA_LEARN_MORE_HREF = 'https://strapi.io/pricing-cloud'; +const CTA_SALES_HREF = 'https://strapi.io/contact-sales'; + +export function Title({ children }) { + return ( + + {children} + + ); +} + +Title.propTypes = { + children: PropTypes.node.isRequired, +}; + +export function Body({ children }) { + return {children}; +} + +Body.propTypes = { + children: PropTypes.node.isRequired, +}; + +function CallToActions() { + const { formatMessage } = useIntl(); + + return ( + + + {formatMessage({ + id: 'Settings.review-workflows.limit.cta.learn', + defaultMessage: 'Learn more', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.limit.cta.sales', + defaultMessage: 'Contact Sales', + })} + + + ); +} + +const BalloonImage = styled.img` + // Margin top|right reverse the padding of ModalBody + margin-right: ${({ theme }) => `-${theme.spaces[7]}`}; + margin-top: ${({ theme }) => `-${theme.spaces[7]}`}; + width: 360px; +`; + +export function LimitsModal({ children, isOpen, onClose }) { + const { formatMessage } = useIntl(); + + if (!isOpen) { + return null; + } + + return ( + + + + + {children} + + + + + + + + + } + aria-label={formatMessage({ + id: 'global.close', + defaultMessage: 'Close', + })} + onClick={onClose} + /> + + + + + + ); +} + +LimitsModal.defaultProps = { + isOpen: false, +}; + +LimitsModal.propTypes = { + children: PropTypes.node.isRequired, + isOpen: PropTypes.bool, + onClose: PropTypes.func.isRequired, +}; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/assets/balloon.png b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/assets/balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..8a779c89938e06104e491385b1572c6de011ccb8 GIT binary patch literal 108323 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�}C5*zAO4mMJ8;X;b$F4Dp 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 literal 0 HcmV?d00001 diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/index.js new file mode 100644 index 0000000000..ef4508bceb --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/index.js @@ -0,0 +1,3 @@ +import { Title, Body, LimitsModal as Root } from './LimitsModal'; + +export { Title, Body, Root }; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/tests/LimitsModal.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/tests/LimitsModal.test.js new file mode 100644 index 0000000000..315a5c6332 --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal/tests/LimitsModal.test.js @@ -0,0 +1,62 @@ +import React from 'react'; + +import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { IntlProvider } from 'react-intl'; + +import * as LimitsModal from '..'; + +const setup = (props) => ({ + ...render( + {}} {...props}> + Title + Body + , + { + wrapper({ children }) { + return ( + + + {children} + + + ); + }, + } + ), + + user: userEvent.setup(), +}); + +describe('Admin | Settings | Review Workflow | LimitsModal', () => { + it('should not render the modal if isOpen=false', () => { + const { queryByText } = setup({ isOpen: false }); + + expect(queryByText('Title')).not.toBeInTheDocument(); + expect(queryByText('Body')).not.toBeInTheDocument(); + }); + + it('should render the modal if isOpen=true', () => { + const { getByText } = setup(); + + expect(getByText('Title')).toBeInTheDocument(); + expect(getByText('Body')).toBeInTheDocument(); + }); + + it('should render call to action links', () => { + const { getByText } = setup(); + + expect(getByText('Learn more')).toBeInTheDocument(); + expect(getByText('Contact Sales')).toBeInTheDocument(); + }); + + it('should call onClose callback when closing the modal', async () => { + const onCloseSpy = jest.fn(); + const { getByRole, user } = setup({ onClose: onCloseSpy }); + + await user.click(getByRole('button', { name: /close/i })); + + expect(onCloseSpy).toBeCalledTimes(1); + }); +}); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js index 530f2b381d..c6979f9d14 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js @@ -25,6 +25,13 @@ const server = setupServer( stages: populate === 'stages' ? [STAGE_FIXTURE] : [], }, ], + + pagination: { + page: 1, + pageSize: 100, + pageCount: 1, + total: 1, + }, }) ); }), @@ -38,6 +45,13 @@ const server = setupServer( id: 1, stages: populate === 'stages' ? [STAGE_FIXTURE] : [], }, + + pagination: { + page: 1, + pageSize: 100, + pageCount: 1, + total: 1, + }, }) ); }) @@ -80,6 +94,7 @@ describe('useReviewWorkflows', () => { expect(result.current).toStrictEqual( expect.objectContaining({ status: 'success', + pagination: expect.objectContaining({ total: 1 }), workflows: [{ id: expect.any(Number), stages: expect.any(Array) }], }) ); @@ -92,6 +107,7 @@ describe('useReviewWorkflows', () => { expect(result.current).toStrictEqual( expect.objectContaining({ + pagination: expect.objectContaining({ total: 1 }), workflows: [expect.objectContaining({ id: 1, stages: expect.any(Array) })], }) ); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js index 9d186bdc55..eb2b64a010 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js @@ -15,9 +15,7 @@ export function useReviewWorkflows(params = {}) { ['review-workflows', 'workflows', id], async () => { try { - const { - data: { data }, - } = await get( + const { data } = await get( `/admin/review-workflows/workflows/${id}${queryString ? `?${queryString}` : ''}` ); @@ -31,13 +29,14 @@ export function useReviewWorkflows(params = {}) { let workflows = []; - if (id && data) { - workflows = [data]; - } else if (Array.isArray(data)) { - workflows = data; + if (id && data?.data) { + workflows = [data.data]; + } else if (Array.isArray(data?.data)) { + workflows = data.data; } return { + pagination: data?.pagination ?? {}, workflows, isLoading, status, diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js index a8a895a1cb..b38a51172b 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js @@ -11,11 +11,14 @@ import { useHistory } from 'react-router-dom'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; import { useInjectReducer } from '../../../../../../../../admin/src/hooks/useInjectReducer'; +import { useLicenseLimits } from '../../../../../../hooks'; import { resetWorkflow } from '../../actions'; import * as Layout from '../../components/Layout'; +import * as LimitsModal from '../../components/LimitsModal'; import { Stages } from '../../components/Stages'; import { WorkflowAttributes } from '../../components/WorkflowAttributes'; import { REDUX_NAMESPACE } from '../../constants'; +import { useReviewWorkflows } from '../../hooks/useReviewWorkflows'; import { reducer, initialState } from '../../reducer'; import { getWorkflowValidationSchema } from '../../utils/getWorkflowValidationSchema'; @@ -32,6 +35,9 @@ export function ReviewWorkflowsCreateView() { currentWorkflow: { data: currentWorkflow, isDirty: currentWorkflowIsDirty }, }, } = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState); + const [showLimitModal, setShowLimitModal] = React.useState(false); + const { license, isLoading: isLicenseLoading } = useLicenseLimits(); + const { pagination, isLoading: isWorkflowLoading } = useReviewWorkflows(); const { mutateAsync, isLoading } = useMutation( async ({ workflow }) => { @@ -88,6 +94,12 @@ export function ReviewWorkflowsCreateView() { dispatch(resetWorkflow()); }, [dispatch]); + React.useEffect(() => { + if (!isLicenseLoading && !isWorkflowLoading && pagination?.total >= license?.data?.workflows) { + setShowLimitModal(true); + } + }, [isLicenseLoading, isWorkflowLoading, license?.data?.workflows, pagination?.total]); + return ( <> @@ -141,6 +153,22 @@ export function ReviewWorkflowsCreateView() { + + setShowLimitModal(false)}> + + {formatMessage({ + id: 'Settings.review-workflows.create.page.workflows.limit.title', + defaultMessage: 'You’ve reached the limit of workflows in your plan', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.create.page.workflows.limit.body', + defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.', + })} + + ); } diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js index 664ceac188..6ce20e64ce 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js @@ -17,8 +17,10 @@ import { useParams } from 'react-router-dom'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; import { useInjectReducer } from '../../../../../../../../admin/src/hooks/useInjectReducer'; +import { useLicenseLimits } from '../../../../../../hooks'; import { setWorkflow } from '../../actions'; import * as Layout from '../../components/Layout'; +import * as LimitsModal from '../../components/LimitsModal'; import { Stages } from '../../components/Stages'; import { WorkflowAttributes } from '../../components/WorkflowAttributes'; import { REDUX_NAMESPACE } from '../../constants'; @@ -35,6 +37,7 @@ export function ReviewWorkflowsEditView() { const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); const { + pagination, workflows: [workflow], status: workflowStatus, refetch, @@ -51,6 +54,8 @@ export function ReviewWorkflowsEditView() { }, } = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState); const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = React.useState(false); + const { license, isLoading: isLicenseLoading } = useLicenseLimits(); + const [showLimitModal, setShowLimitModal] = React.useState(false); const { mutateAsync, isLoading } = useMutation( async ({ workflow }) => { @@ -126,6 +131,12 @@ export function ReviewWorkflowsEditView() { dispatch(setWorkflow({ status: workflowStatus, data: workflow })); }, [workflowStatus, workflow, dispatch]); + React.useEffect(() => { + if (!isLicenseLoading && pagination?.total >= license?.data?.workflows) { + setShowLimitModal(true); + } + }, [isLicenseLoading, license?.data?.workflows, pagination?.total]); + // TODO redirect back to list-view if workflow is not found? return ( @@ -191,6 +202,22 @@ export function ReviewWorkflowsEditView() { onToggleDialog={toggleConfirmDeleteDialog} onConfirm={handleConfirmDeleteDialog} /> + + setShowLimitModal(false)}> + + {formatMessage({ + id: 'Settings.review-workflows.edit.page.workflows.limit.title', + defaultMessage: 'You’ve reached the limit of workflows in your plan', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.edit.page.workflows.limit.body', + defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.', + })} + + ); } diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js index 10e200a33c..74a657f48d 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js @@ -31,7 +31,9 @@ import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; +import { useLicenseLimits } from '../../../../../../hooks'; import * as Layout from '../../components/Layout'; +import * as LimitsModal from '../../components/LimitsModal'; import { useReviewWorkflows } from '../../hooks/useReviewWorkflows'; const ActionLink = styled(Link)` @@ -65,11 +67,13 @@ export function ReviewWorkflowsListView() { const { formatMessage } = useIntl(); const { push } = useHistory(); const { collectionTypes, singleTypes, isLoading: isLoadingModels } = useContentTypes(); - const { workflows, isLoading, refetch } = useReviewWorkflows(); + const { pagination, workflows, isLoading, refetch } = useReviewWorkflows(); const [workflowToDelete, setWorkflowToDelete] = React.useState(null); + const [showLimitModal, setShowLimitModal] = React.useState(false); const { del } = useFetchClient(); const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); + const { license } = useLicenseLimits(); const { mutateAsync, isLoading: isLoadingMutation } = useMutation( async ({ workflowId, stages }) => { @@ -129,7 +133,17 @@ export function ReviewWorkflowsListView() { <> } size="S" to="/settings/review-workflows/create"> + } + size="S" + to="/settings/review-workflows/create" + onClick={(event) => { + if (pagination?.total >= license.data.workflows) { + event.preventDefault(); + setShowLimitModal(true); + } + }} + > {formatMessage({ id: 'Settings.review-workflows.list.page.create', defaultMessage: 'Create new workflow', @@ -158,9 +172,18 @@ export function ReviewWorkflowsListView() { ) : ( } onClick={() => push('/settings/review-workflows/create')}> + // TODO: we should be able to use a link here instead of an (inaccessible onClick) handler + } + onClick={() => { + if (pagination?.total >= license?.data?.workflows) { + setShowLimitModal(true); + } else { + push('/settings/review-workflows/create'); + } + }} + > {formatMessage({ id: 'Settings.review-workflows.list.page.create', defaultMessage: 'Create new workflow', @@ -283,6 +306,22 @@ export function ReviewWorkflowsListView() { onToggleDialog={toggleConfirmDeleteDialog} onConfirm={handleConfirmDeleteDialog} /> + + setShowLimitModal(false)}> + + {formatMessage({ + id: 'Settings.review-workflows.list.page.workflows.limit.title', + defaultMessage: 'You’ve reached the limit of workflows in your plan', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.list.page.workflows.limit.body', + defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.', + })} + + ); From 02391694e368053f7b7162da4986ae61fee8af94 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 26 Jun 2023 13:43:47 +0200 Subject: [PATCH 2/5] Enhancement: Display stage limits on create and edit pages --- .../pages/CreateView/CreateView.js | 41 ++++++++++++++++-- .../pages/EditView/EditView.js | 42 +++++++++++++++++-- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js index b38a51172b..58442f8784 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js @@ -95,10 +95,21 @@ export function ReviewWorkflowsCreateView() { }, [dispatch]); React.useEffect(() => { - if (!isLicenseLoading && !isWorkflowLoading && pagination?.total >= license?.data?.workflows) { - setShowLimitModal(true); + if (!isWorkflowLoading && !isLicenseLoading) { + if (pagination?.total >= license?.data?.workflows) { + setShowLimitModal('workflow'); + } else if (currentWorkflow.stages.length >= license?.data.stagesPerWorkflow) { + setShowLimitModal('stage'); + } } - }, [isLicenseLoading, isWorkflowLoading, license?.data?.workflows, pagination?.total]); + }, [ + currentWorkflow.stages.length, + isLicenseLoading, + isWorkflowLoading, + license?.data.stagesPerWorkflow, + license?.data?.workflows, + pagination?.total, + ]); return ( <> @@ -154,7 +165,10 @@ export function ReviewWorkflowsCreateView() { - setShowLimitModal(false)}> + setShowLimitModal(false)} + > {formatMessage({ id: 'Settings.review-workflows.create.page.workflows.limit.title', @@ -169,6 +183,25 @@ export function ReviewWorkflowsCreateView() { })} + + setShowLimitModal(false)} + > + + {formatMessage({ + id: 'Settings.review-workflows.create.page.stages.limit.title', + defaultMessage: 'You have reached the limit of stages for this workflow in your plan', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.create.page.stages.limit.body', + defaultMessage: 'Try deleting some stages or contact Sales to enable more stages.', + })} + + ); } diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js index 6ce20e64ce..0cd4d405b2 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js @@ -37,6 +37,7 @@ export function ReviewWorkflowsEditView() { const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); const { + isLoading: isWorkflowLoading, pagination, workflows: [workflow], status: workflowStatus, @@ -132,10 +133,21 @@ export function ReviewWorkflowsEditView() { }, [workflowStatus, workflow, dispatch]); React.useEffect(() => { - if (!isLicenseLoading && pagination?.total >= license?.data?.workflows) { - setShowLimitModal(true); + if (!isWorkflowLoading && !isLicenseLoading) { + if (pagination?.total >= license?.data?.workflows) { + setShowLimitModal('workflow'); + } else if (currentWorkflow.stages.length >= license?.data?.stagesPerWorkflow) { + setShowLimitModal('stage'); + } } - }, [isLicenseLoading, license?.data?.workflows, pagination?.total]); + }, [ + currentWorkflow.stages.length, + isLicenseLoading, + isWorkflowLoading, + license?.data?.stagesPerWorkflow, + license?.data?.workflows, + pagination?.total, + ]); // TODO redirect back to list-view if workflow is not found? @@ -203,7 +215,10 @@ export function ReviewWorkflowsEditView() { onConfirm={handleConfirmDeleteDialog} /> - setShowLimitModal(false)}> + setShowLimitModal(false)} + > {formatMessage({ id: 'Settings.review-workflows.edit.page.workflows.limit.title', @@ -218,6 +233,25 @@ export function ReviewWorkflowsEditView() { })} + + setShowLimitModal(false)} + > + + {formatMessage({ + id: 'Settings.review-workflows.edit.page.stages.limit.title', + defaultMessage: 'You have reached the limit of stages for this workflow in your plan', + })} + + + + {formatMessage({ + id: 'Settings.review-workflows.edit.page.stages.limit.body', + defaultMessage: 'Try deleting some stages or contact Sales to enable more stages.', + })} + + ); } From b4e158c3d1d608e36f5cd8344eca40770dfd7af8 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 26 Jun 2023 13:56:00 +0200 Subject: [PATCH 3/5] Enhancement: Render workflow/ stage limits in CM edit view --- .../InformationBox/InformationBoxEE.js | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js index 4326a729c2..cb92d69b52 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js +++ b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js @@ -11,6 +11,8 @@ import { useIntl } from 'react-intl'; import { useMutation } from 'react-query'; import Information from '../../../../../../admin/src/content-manager/pages/EditView/Information'; +import { useLicenseLimits } from '../../../../hooks'; +import * as LimitsModal from '../../../../pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal'; import { useReviewWorkflows } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows'; import { getStageColorByHex } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/utils/colors'; @@ -33,8 +35,11 @@ export function InformationBoxEE() { const { formatMessage } = useIntl(); const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); + const { license } = useLicenseLimits(); + const [showLimitModal, setShowLimitModal] = React.useState(false); const { + pagination, workflows: [workflow], isLoading: isWorkflowLoading, } = useReviewWorkflows({ filters: { contentTypes: uid } }); @@ -72,6 +77,17 @@ export function InformationBoxEE() { const handleStageChange = async ({ value: stageId }) => { try { + if (license?.data?.workflows > pagination.total) { + setShowLimitModal('workflow'); + + return; + } + if (license?.data?.stagesPerWorkflow > workflow.stages.length) { + setShowLimitModal('stage'); + + return; + } + await mutateAsync({ entityId: initialData.id, stageId, @@ -152,6 +168,44 @@ export function InformationBoxEE() { )} + + setShowLimitModal(false)} + > + + {formatMessage({ + id: 'content-manager.reviewWorkflows.workflows.limit.title', + defaultMessage: 'You’ve reached the limit of workflows in your plan', + })} + + + + {formatMessage({ + id: 'content-manager.reviewWorkflows.workflows.limit.body', + defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.', + })} + + + + setShowLimitModal(false)} + > + + {formatMessage({ + id: 'content-manager.reviewWorkflows.stages.limit.title', + defaultMessage: 'You have reached the limit of stages for this workflow in your plan', + })} + + + + {formatMessage({ + id: 'content-manager.reviewWorkflows.stages.limit.body', + defaultMessage: 'Try deleting some stages or contact Sales to enable more stages.', + })} + + ); } From 5d73a914bcc58271bdeb777f91725c3bb66a4fcf Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 26 Jun 2023 14:43:08 +0200 Subject: [PATCH 4/5] Chore: Wrap all useLicenseLimits calls in a custom hook --- .../InformationBox/InformationBoxEE.js | 8 ++-- .../ee/admin/hooks/useLicenseLimits/index.js | 28 ++++++------ .../useReviewWorkflowLicenseLimits.test.js | 44 +++++++++++++++++++ .../hooks/useReviewWorkflowLicenseLimits.js | 12 +++++ .../pages/CreateView/CreateView.js | 12 ++--- .../pages/EditView/EditView.js | 12 ++--- .../pages/ListView/ListView.js | 8 ++-- 7 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflowLicenseLimits.test.js create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowLicenseLimits.js diff --git a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js index cb92d69b52..3a215aaa10 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js +++ b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js @@ -11,8 +11,8 @@ import { useIntl } from 'react-intl'; import { useMutation } from 'react-query'; import Information from '../../../../../../admin/src/content-manager/pages/EditView/Information'; -import { useLicenseLimits } from '../../../../hooks'; import * as LimitsModal from '../../../../pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal'; +import { useReviewWorkflowLicenseLimits } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowLicenseLimits'; import { useReviewWorkflows } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows'; import { getStageColorByHex } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/utils/colors'; @@ -35,7 +35,7 @@ export function InformationBoxEE() { const { formatMessage } = useIntl(); const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); - const { license } = useLicenseLimits(); + const { limits } = useReviewWorkflowLicenseLimits(); const [showLimitModal, setShowLimitModal] = React.useState(false); const { @@ -77,12 +77,12 @@ export function InformationBoxEE() { const handleStageChange = async ({ value: stageId }) => { try { - if (license?.data?.workflows > pagination.total) { + if (limits?.workflows > pagination.total) { setShowLimitModal('workflow'); return; } - if (license?.data?.stagesPerWorkflow > workflow.stages.length) { + if (limits?.stagesPerWorkflow > workflow.stages.length) { setShowLimitModal('stage'); return; diff --git a/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js b/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js index 9d2a0ff734..aa4c8f79e1 100644 --- a/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js +++ b/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js @@ -6,27 +6,27 @@ import { selectAdminPermissions } from '../../../../admin/src/pages/App/selector const useLicenseLimits = () => { const permissions = useSelector(selectAdminPermissions); - const rbac = useRBAC(permissions.settings.users); - + const { get } = useFetchClient(); const { isLoading: isRBACLoading, allowedActions: { canRead, canCreate, canUpdate, canDelete }, - } = rbac; + } = useRBAC(permissions.settings.users); const isRBACAllowed = canRead && canCreate && canUpdate && canDelete; - const { get } = useFetchClient(); - const fetchLicenseLimitInfo = async () => { - const { - data: { data }, - } = await get('/admin/license-limit-information'); + const license = useQuery( + ['ee', 'license-limit-info'], + async () => { + const { + data: { data }, + } = await get('/admin/license-limit-information'); - return data; - }; - - const license = useQuery(['ee', 'license-limit-info'], fetchLicenseLimitInfo, { - enabled: !isRBACLoading && isRBACAllowed, - }); + return data; + }, + { + enabled: !isRBACLoading && isRBACAllowed, + } + ); return { license }; }; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflowLicenseLimits.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflowLicenseLimits.test.js new file mode 100644 index 0000000000..6fec4f9881 --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflowLicenseLimits.test.js @@ -0,0 +1,44 @@ +import { renderHook } from '@testing-library/react'; + +import { useReviewWorkflowLicenseLimits } from '../useReviewWorkflowLicenseLimits'; + +// TODO: use msw instead. I wish I could have done it already, but in its current +// state, useLicenseLimits requires to be wrapped in a redux provider and RBAC +// context provider and at the time of writing there wasn't any time to create +// that setup. + +jest.mock('../../../../../../hooks', () => ({ + ...jest.requireActual('../../../../../../hooks'), + useLicenseLimits: jest.fn(() => ({ + isLoading: false, + license: { + data: { + something: true, + features: [ + { + name: 'review-workflows', + options: { + workflows: 10, + stagesPerWorkflow: 10, + }, + }, + ], + }, + }, + })), +})); + +function setup(...args) { + return renderHook(() => useReviewWorkflowLicenseLimits(...args)); +} + +describe('useReviewWorkflowLicenseLimits', () => { + it('returns options for the feature only', async () => { + const { result } = setup(); + + expect(result.current.limits).toStrictEqual({ + workflows: 10, + stagesPerWorkflow: 10, + }); + }); +}); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowLicenseLimits.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowLicenseLimits.js new file mode 100644 index 0000000000..51b38e8ee1 --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowLicenseLimits.js @@ -0,0 +1,12 @@ +import { useLicenseLimits } from '../../../../../hooks'; + +export function useReviewWorkflowLicenseLimits() { + const { license, isLoading } = useLicenseLimits(); + const limits = + license?.data?.features?.filter(({ name }) => name === 'review-workflows')?.[0]?.options ?? {}; + + return { + limits, + isLoading, + }; +} diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js index 58442f8784..0a41179ba5 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js @@ -11,13 +11,13 @@ import { useHistory } from 'react-router-dom'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; import { useInjectReducer } from '../../../../../../../../admin/src/hooks/useInjectReducer'; -import { useLicenseLimits } from '../../../../../../hooks'; import { resetWorkflow } from '../../actions'; import * as Layout from '../../components/Layout'; import * as LimitsModal from '../../components/LimitsModal'; import { Stages } from '../../components/Stages'; import { WorkflowAttributes } from '../../components/WorkflowAttributes'; import { REDUX_NAMESPACE } from '../../constants'; +import { useReviewWorkflowLicenseLimits } from '../../hooks/useReviewWorkflowLicenseLimits'; import { useReviewWorkflows } from '../../hooks/useReviewWorkflows'; import { reducer, initialState } from '../../reducer'; import { getWorkflowValidationSchema } from '../../utils/getWorkflowValidationSchema'; @@ -36,7 +36,7 @@ export function ReviewWorkflowsCreateView() { }, } = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState); const [showLimitModal, setShowLimitModal] = React.useState(false); - const { license, isLoading: isLicenseLoading } = useLicenseLimits(); + const { limits, isLoading: isLicenseLoading } = useReviewWorkflowLicenseLimits(); const { pagination, isLoading: isWorkflowLoading } = useReviewWorkflows(); const { mutateAsync, isLoading } = useMutation( @@ -96,9 +96,9 @@ export function ReviewWorkflowsCreateView() { React.useEffect(() => { if (!isWorkflowLoading && !isLicenseLoading) { - if (pagination?.total >= license?.data?.workflows) { + if (pagination?.total >= limits?.workflows) { setShowLimitModal('workflow'); - } else if (currentWorkflow.stages.length >= license?.data.stagesPerWorkflow) { + } else if (currentWorkflow.stages.length >= limits.stagesPerWorkflow) { setShowLimitModal('stage'); } } @@ -106,8 +106,8 @@ export function ReviewWorkflowsCreateView() { currentWorkflow.stages.length, isLicenseLoading, isWorkflowLoading, - license?.data.stagesPerWorkflow, - license?.data?.workflows, + limits.stagesPerWorkflow, + limits?.workflows, pagination?.total, ]); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js index 0cd4d405b2..7e015b8ca2 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js @@ -17,13 +17,13 @@ import { useParams } from 'react-router-dom'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; import { useInjectReducer } from '../../../../../../../../admin/src/hooks/useInjectReducer'; -import { useLicenseLimits } from '../../../../../../hooks'; import { setWorkflow } from '../../actions'; import * as Layout from '../../components/Layout'; import * as LimitsModal from '../../components/LimitsModal'; import { Stages } from '../../components/Stages'; import { WorkflowAttributes } from '../../components/WorkflowAttributes'; import { REDUX_NAMESPACE } from '../../constants'; +import { useReviewWorkflowLicenseLimits } from '../../hooks/useReviewWorkflowLicenseLimits'; import { useReviewWorkflows } from '../../hooks/useReviewWorkflows'; import { reducer, initialState } from '../../reducer'; import { getWorkflowValidationSchema } from '../../utils/getWorkflowValidationSchema'; @@ -55,7 +55,7 @@ export function ReviewWorkflowsEditView() { }, } = useSelector((state) => state?.[REDUX_NAMESPACE] ?? initialState); const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = React.useState(false); - const { license, isLoading: isLicenseLoading } = useLicenseLimits(); + const { limits, isLoading: isLicenseLoading } = useReviewWorkflowLicenseLimits(); const [showLimitModal, setShowLimitModal] = React.useState(false); const { mutateAsync, isLoading } = useMutation( @@ -134,9 +134,9 @@ export function ReviewWorkflowsEditView() { React.useEffect(() => { if (!isWorkflowLoading && !isLicenseLoading) { - if (pagination?.total >= license?.data?.workflows) { + if (pagination?.total >= limits?.workflows) { setShowLimitModal('workflow'); - } else if (currentWorkflow.stages.length >= license?.data?.stagesPerWorkflow) { + } else if (currentWorkflow.stages.length >= limits?.stagesPerWorkflow) { setShowLimitModal('stage'); } } @@ -144,8 +144,8 @@ export function ReviewWorkflowsEditView() { currentWorkflow.stages.length, isLicenseLoading, isWorkflowLoading, - license?.data?.stagesPerWorkflow, - license?.data?.workflows, + limits?.stagesPerWorkflow, + limits?.workflows, pagination?.total, ]); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js index 74a657f48d..4291e54876 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js @@ -31,9 +31,9 @@ import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { useContentTypes } from '../../../../../../../../admin/src/hooks/useContentTypes'; -import { useLicenseLimits } from '../../../../../../hooks'; import * as Layout from '../../components/Layout'; import * as LimitsModal from '../../components/LimitsModal'; +import { useReviewWorkflowLicenseLimits } from '../../hooks/useReviewWorkflowLicenseLimits'; import { useReviewWorkflows } from '../../hooks/useReviewWorkflows'; const ActionLink = styled(Link)` @@ -73,7 +73,7 @@ export function ReviewWorkflowsListView() { const { del } = useFetchClient(); const { formatAPIError } = useAPIErrorHandler(); const toggleNotification = useNotification(); - const { license } = useLicenseLimits(); + const { limits } = useReviewWorkflowLicenseLimits(); const { mutateAsync, isLoading: isLoadingMutation } = useMutation( async ({ workflowId, stages }) => { @@ -138,7 +138,7 @@ export function ReviewWorkflowsListView() { size="S" to="/settings/review-workflows/create" onClick={(event) => { - if (pagination?.total >= license.data.workflows) { + if (pagination?.total >= limits.workflows) { event.preventDefault(); setShowLimitModal(true); } @@ -177,7 +177,7 @@ export function ReviewWorkflowsListView() { } onClick={() => { - if (pagination?.total >= license?.data?.workflows) { + if (pagination?.total >= limits?.workflows) { setShowLimitModal(true); } else { push('/settings/review-workflows/create'); From 3346e5e767a338a4f1db9e7893fe9c5ea1e9ec0b Mon Sep 17 00:00:00 2001 From: Josh <37798644+joshuaellis@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:26:07 +0100 Subject: [PATCH 5/5] test: fix InformationBoxEE suite --- .../tests/InformationBoxEE.test.js | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js index b73afa1082..8aa3941b0a 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js +++ b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js @@ -1,7 +1,8 @@ -import React from 'react'; +import * as React from 'react'; +import { fixtures } from '@strapi/admin-test-utils'; import { lightTheme, ThemeProvider } from '@strapi/design-system'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import { useCMEditViewDataManager, RBACContext } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; @@ -66,13 +67,27 @@ const ComponentFixture = (props) => ; const setup = (props) => ({ ...render(, { wrapper({ children }) { - const store = createStore((state = {}) => state, {}); + const store = createStore((state = {}) => state, { + admin_app: { + permissions: fixtures.permissions.app, + }, + }); + + // eslint-disable-next-line react-hooks/rules-of-hooks + const rbacContextValue = React.useMemo( + () => ({ + allPermissions: fixtures.permissions.allPermissions, + }), + [] + ); return ( - {children} + + {children} +