diff --git a/frontend/src/__tests__/components/forms/PreviewEmailTemplate/__snapshots__/PreviewEmailTemplate.test.tsx.snap b/frontend/src/__tests__/components/forms/PreviewEmailTemplate/__snapshots__/PreviewEmailTemplate.test.tsx.snap index ff2e3aef9..3fe397d2e 100644 --- a/frontend/src/__tests__/components/forms/PreviewEmailTemplate/__snapshots__/PreviewEmailTemplate.test.tsx.snap +++ b/frontend/src/__tests__/components/forms/PreviewEmailTemplate/__snapshots__/PreviewEmailTemplate.test.tsx.snap @@ -106,7 +106,8 @@ exports[`Preview email form renders Routing feature flag - Disabled Client-side > Draft @@ -384,7 +385,8 @@ exports[`Preview email form renders Routing feature flag - Disabled matches erro > Draft @@ -642,7 +644,8 @@ exports[`Preview email form renders matches snapshot when navigating from edit s > Draft @@ -888,7 +891,8 @@ exports[`Preview email form renders matches snapshot when navigating from edit s > Draft @@ -1053,7 +1057,8 @@ exports[`Preview email form renders matches snapshot when navigating from manage > Draft @@ -1294,7 +1299,8 @@ exports[`Preview email form renders matches snapshot when navigating from manage > Draft diff --git a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/__snapshots__/PreviewNHSAppTemplate.test.tsx.snap b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/__snapshots__/PreviewNHSAppTemplate.test.tsx.snap index 407bcc058..1f3efcd50 100644 --- a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/__snapshots__/PreviewNHSAppTemplate.test.tsx.snap +++ b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/__snapshots__/PreviewNHSAppTemplate.test.tsx.snap @@ -106,7 +106,8 @@ exports[`Preview nhs app form renders Routing feature flag - Disabled Client-sid > Draft @@ -360,7 +361,8 @@ exports[`Preview nhs app form renders Routing feature flag - Disabled matches er > Draft @@ -594,7 +596,8 @@ exports[`Preview nhs app form renders matches snapshot when navigating from edit > Draft @@ -816,7 +819,8 @@ exports[`Preview nhs app form renders matches snapshot when navigating from edit > Draft @@ -957,7 +961,8 @@ exports[`Preview nhs app form renders matches snapshot when navigating from mana > Draft @@ -1174,7 +1179,8 @@ exports[`Preview nhs app form renders matches snapshot when navigating from mana > Draft diff --git a/frontend/src/__tests__/components/forms/PreviewSMSTemplate/__snapshots__/PreviewSMSTemplate.test.tsx.snap b/frontend/src/__tests__/components/forms/PreviewSMSTemplate/__snapshots__/PreviewSMSTemplate.test.tsx.snap index b6e2d74e4..7d318ad59 100644 --- a/frontend/src/__tests__/components/forms/PreviewSMSTemplate/__snapshots__/PreviewSMSTemplate.test.tsx.snap +++ b/frontend/src/__tests__/components/forms/PreviewSMSTemplate/__snapshots__/PreviewSMSTemplate.test.tsx.snap @@ -106,7 +106,8 @@ exports[`Review sms form renders Routing feature flag - Disabled Client-side val > Draft @@ -359,7 +360,8 @@ exports[`Review sms form renders Routing feature flag - Disabled matches error s > Draft @@ -592,7 +594,8 @@ exports[`Review sms form renders matches snapshot when navigating from edit scre > Draft @@ -813,7 +816,8 @@ exports[`Review sms form renders matches snapshot when navigating from edit scre > Draft @@ -953,7 +957,8 @@ exports[`Review sms form renders matches snapshot when navigating from manage te > Draft @@ -1169,7 +1174,8 @@ exports[`Review sms form renders matches snapshot when navigating from manage te > Draft diff --git a/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx b/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx index a7dd1b992..5752f42fe 100644 --- a/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx +++ b/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx @@ -2,6 +2,14 @@ import { render, screen } from '@testing-library/react'; import { MessageTemplates } from '@molecules/MessageTemplates/MessageTemplates'; import content from '@content/content'; import { TemplateDto } from 'nhs-notify-backend-client'; +import { useFeatureFlags } from '@providers/client-config-provider'; + +jest.mock('@providers/client-config-provider'); + +beforeEach(() => { + jest.resetAllMocks(); + jest.mocked(useFeatureFlags).mockReturnValue({ routing: false }); +}); const messageTemplatesContent = content.pages.messageTemplates; @@ -75,8 +83,9 @@ describe('MessageTemplates component', () => { expect(container.asFragment()).toMatchSnapshot(); }); - it('matches snapshot with submitted status', () => { - messageTemplatesProps.templateList[0].templateStatus = 'SUBMITTED'; + it('matches snapshot with routing flag enabled', () => { + jest.mocked(useFeatureFlags).mockReturnValue({ routing: true }); + const container = render(); expect(container.asFragment()).toMatchSnapshot(); diff --git a/frontend/src/__tests__/components/molecules/PreviewSubmittedTemplate.test.tsx b/frontend/src/__tests__/components/molecules/PreviewSubmittedTemplate.test.tsx index e8789b3c9..5ac02b0d5 100644 --- a/frontend/src/__tests__/components/molecules/PreviewSubmittedTemplate.test.tsx +++ b/frontend/src/__tests__/components/molecules/PreviewSubmittedTemplate.test.tsx @@ -3,181 +3,128 @@ import PreviewTemplateDetailsEmail from '@molecules/PreviewTemplateDetails/Previ import PreviewTemplateDetailsLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter'; import PreviewTemplateDetailsNhsApp from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp'; import PreviewTemplateDetailsSms from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms'; +import { useFeatureFlags } from '@providers/client-config-provider'; import { render } from '@testing-library/react'; -import { ReadonlyURLSearchParams, useSearchParams } from 'next/navigation'; -jest.mock('next/navigation', () => ({ - ...jest.requireActual('next/navigation'), - useSearchParams: jest.fn(), -})); - -const useSearchParamsMock = jest.mocked(useSearchParams); - -useSearchParamsMock.mockReturnValue(new ReadonlyURLSearchParams()); +jest.mock('@providers/client-config-provider'); describe('PreviewSubmittedTemplate component', () => { - it('should render app message', () => { - const container = render( - - ); - - expect(container.asFragment()).toMatchSnapshot(); - }); - - it('should render email', () => { - const container = render( - - ); - - expect(container.asFragment()).toMatchSnapshot(); - }); - - it('should render sms', () => { - const container = render( - - ); - - expect(container.asFragment()).toMatchSnapshot(); - }); - - it('should render letter', () => { - const container = render( - { + beforeEach(() => { + jest.resetAllMocks(); + jest.mocked(useFeatureFlags).mockReturnValue({ routing }); + }); + + it('should render app message', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); + + it('should render email', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); + + it('should render sms', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); + + it('should render letter', () => { + const container = render( + - ); - - expect(container.asFragment()).toMatchSnapshot(); - }); - - it('should provide back buttons based on source page', () => { - useSearchParamsMock.mockReturnValueOnce( - new ReadonlyURLSearchParams({ - sourcePage: '/source', - }) - ); - - const container = render( - - ); - - expect(container.asFragment()).toMatchSnapshot(); - }); - - it('should omit status when coming from message plans', () => { - useSearchParamsMock.mockReturnValueOnce( - new ReadonlyURLSearchParams({ - sourcePage: - '/message-plans/choose-nhs-app-template/93b92d43-a8e0-4d90-8e75-924c8a0c8e0d', - }) - ); - - const container = render( - - ); - - expect(container.asFragment()).toMatchSnapshot(); + createdAt: '2025-01-13T10:19:25.579Z', + updatedAt: '2025-01-13T10:19:25.579Z', + lockNumber: 1, + }} + previewComponent={PreviewTemplateDetailsLetter} + /> + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); }); }); diff --git a/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap b/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap index f58f008d7..3b98fb2f7 100644 --- a/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap +++ b/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap @@ -960,7 +960,7 @@ exports[`MessageTemplates component matches snapshot with pending proof request `; -exports[`MessageTemplates component matches snapshot with submitted status 1`] = ` +exports[`MessageTemplates component matches snapshot with routing flag enabled 1`] = `
Template 1 @@ -1086,9 +1086,9 @@ exports[`MessageTemplates component matches snapshot with submitted status 1`] = Status - Submitted + Draft

+

+ + Delete + +

@@ -1187,9 +1198,9 @@ exports[`MessageTemplates component matches snapshot with submitted status 1`] = Status - Submitted + Locked - Submitted + Locked - Draft + Submitted @@ -144,7 +145,7 @@ exports[`PreviewSubmittedTemplate component should omit status when coming from
`; -exports[`PreviewSubmittedTemplate component should provide back buttons based on source page 1`] = ` +exports[`PreviewSubmittedTemplate component routing = false should render email 1`] = ` - Example template + Example Email template
- NHS App message + Email
- Draft + Submitted
@@ -245,6 +247,31 @@ exports[`PreviewSubmittedTemplate component should provide back buttons based on >
+ Subject +
+ +
+
+ email subject +
+
+ +
+
+
+ Template file +
+
+
+ +

+ file.pdf +

+
+
+
+
+
+ Example personalisation file +
+
+
+ +

+ file.csv +

+
+
+
+ +
+ +
+ +

+ If you want to change a submitted or live template, you must create a new template to replace it. +

+

+ + Back to all templates + +

+ + + + +`; + +exports[`PreviewSubmittedTemplate component routing = false should render sms 1`] = ` + + + Back to all templates + +
+
+
+
+ + Template + +

+ SMS template +

+
+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+ Type +
+
+ Text message (SMS)
Submitted @@ -403,7 +697,7 @@ exports[`PreviewSubmittedTemplate component should render app message 1`] = ` id="preview-content-message" >

- app content + SMS content

@@ -432,7 +726,167 @@ exports[`PreviewSubmittedTemplate component should render app message 1`] = ` `; -exports[`PreviewSubmittedTemplate component should render email 1`] = ` +exports[`PreviewSubmittedTemplate component routing = true should render app message 1`] = ` + + + Back to all templates + +
+
+
+
+ + Template + +

+ Example template +

+
+
+ + Locked + +

+ You cannot edit or delete this template because it's used in a message plan that's in production. +

+

+ + Copy this template + + to create a draft with the same content. +

+
+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+ Type +
+
+ NHS App message +
+
+
+
+ Status +
+
+ + Locked + +
+
+
+
+
+
+
+ Message +
+
+
+
+

+ app content +

+ + +
+
+
+
+
+

+ + Back to all templates + +

+
+
+
+
+`; + +exports[`PreviewSubmittedTemplate component routing = true should render email 1`] = `
+
@@ -514,10 +989,11 @@ exports[`PreviewSubmittedTemplate component should render email 1`] = ` class="nhsuk-summary-list__value" > - Submitted + Locked
@@ -581,12 +1057,6 @@ exports[`PreviewSubmittedTemplate component should render email 1`] = `
-

- This template cannot be edited because it has been submitted. -

-

- If you want to change a submitted or live template, you must create a new template to replace it. -

`; -exports[`PreviewSubmittedTemplate component should render letter 1`] = ` +exports[`PreviewSubmittedTemplate component routing = true should render letter 1`] = `

+
+ + Locked + +

+ You cannot delete this template because it's used in a message plan that's in production. +

+
@@ -683,10 +1165,11 @@ exports[`PreviewSubmittedTemplate component should render letter 1`] = ` class="nhsuk-summary-list__value" > - Submitted + Locked
@@ -849,9 +1332,6 @@ exports[`PreviewSubmittedTemplate component should render letter 1`] = ` -

- If you want to change a submitted or live template, you must create a new template to replace it. -

`; -exports[`PreviewSubmittedTemplate component should render sms 1`] = ` +exports[`PreviewSubmittedTemplate component routing = true should render sms 1`] = ` +

@@ -948,10 +1449,11 @@ exports[`PreviewSubmittedTemplate component should render sms 1`] = ` class="nhsuk-summary-list__value" > - Submitted + Locked
@@ -990,12 +1492,6 @@ exports[`PreviewSubmittedTemplate component should render sms 1`] = ` -

- This template cannot be edited because it has been submitted. -

-

- If you want to change a submitted or live template, you must create a new template to replace it. -

Submitted @@ -199,7 +200,8 @@ exports[`PreviewTemplateDetailsLetter if status is NOT_YET_SUBMITTED, then Not y > Not yet submitted @@ -311,7 +313,8 @@ exports[`PreviewTemplateDetailsLetter if status is PROOF_AVAILABLE, but no proof > Proof available @@ -423,7 +426,8 @@ exports[`PreviewTemplateDetailsLetter matches snapshot when proofs are present, > Proof available @@ -656,7 +660,8 @@ exports[`PreviewTemplateDetailsLetter matches snapshot when test data CSV is abs > Checking files @@ -773,7 +778,8 @@ exports[`PreviewTemplateDetailsLetter matches snapshot without proofs 1`] = ` > Checking files @@ -926,7 +932,8 @@ exports[`PreviewTemplateDetailsNhsApp matches snapshot 1`] = ` > Draft @@ -1035,7 +1042,8 @@ exports[`PreviewTemplateDetailsSms matches snapshot 1`] = ` > Submitted diff --git a/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap b/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap index 242a60a0e..29c8bde58 100644 --- a/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap +++ b/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap @@ -81,7 +81,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template language > @@ -265,7 +266,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -412,7 +414,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -559,7 +562,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -1097,7 +1103,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -1385,7 +1392,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -1589,7 +1597,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > @@ -1725,7 +1734,8 @@ exports[`PreviewLetterTemplate component matches snapshot when template status i > diff --git a/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx b/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx index f1136e962..b1d478404 100644 --- a/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx +++ b/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx @@ -18,6 +18,7 @@ import { } from 'nhs-notify-web-template-management-utils'; import { TemplateDto } from 'nhs-notify-backend-client'; import style from './MessageTemplates.module.scss'; +import { useFeatureFlags } from '@providers/client-config-provider'; const messageTemplatesContent = content.pages.messageTemplates; @@ -43,6 +44,7 @@ export function MessageTemplates({ }: { templateList: TemplateDto[]; }) { + const features = useFeatureFlags(); return (

@@ -85,8 +87,8 @@ export function MessageTemplates({ {template.id} {typeDisplayMappings(template)} - - {statusToDisplayMapping(template)} + + {statusToDisplayMapping(template, features)} diff --git a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx index a734c95ac..9dca963fa 100644 --- a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx +++ b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx @@ -7,6 +7,7 @@ import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain'; import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink'; import { TemplateDto } from 'nhs-notify-backend-client'; import { PreviewTemplateComponent } from '@molecules/PreviewTemplateDetails/common'; +import { useFeatureFlags } from '@providers/client-config-provider'; export type PreviewSubmittedTemplateProps = PageComponentProps & { @@ -19,6 +20,8 @@ export function PreviewSubmittedTemplate({ }: Readonly>) { const content = baseContent.components.viewSubmittedTemplate; + const { routing } = useFeatureFlags(); + return ( <> @@ -32,10 +35,14 @@ export function PreviewSubmittedTemplate({ template: initialState, })} - {initialState.templateType !== 'LETTER' && ( -

{content.cannotEdit}

+ {!routing && ( + <> + {initialState.templateType !== 'LETTER' && ( +

{content.cannotEdit}

+ )} +

{content.createNewTemplate}

+ )} -

{content.createNewTemplate}

diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss index a8081d0d8..10f12b5de 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss @@ -15,3 +15,11 @@ flex-direction: column; gap: 6px; } + +.warning_callout { + padding-top: 16px !important; + + @media (min-width: 40.0625em) { + padding-top: 24px !important; + } +} diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx index 8acd66849..fa9a526be 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx @@ -8,11 +8,13 @@ import { ContentPreview, DetailSection, DetailsHeader, + LockedTemplateWarning, StandardDetailRows, } from './common'; import { Container } from 'nhsuk-react-components'; import concatClassNames from '@utils/concat-class-names'; import { renderEmailMarkdown } from '@utils/markdownit'; +import { useFeatureFlags } from '@providers/client-config-provider'; export default function PreviewTemplateDetailsEmail({ template, @@ -21,12 +23,18 @@ export default function PreviewTemplateDetailsEmail({ template: EmailTemplate; hideStatus?: boolean; }) { + const features = useFeatureFlags(); const subject = template.subject; const message = renderEmailMarkdown(template.message); return ( <> + + {features.routing && template.templateStatus === 'SUBMITTED' && ( + + )} + diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx index 236dfe20b..685f088cd 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx @@ -7,10 +7,16 @@ import { } from 'nhs-notify-web-template-management-utils'; import { Filename } from '@atoms/Filename/Filename'; import content from '@content/content'; -import { DetailSection, DetailsHeader, StandardDetailRows } from './common'; +import { + DetailSection, + DetailsHeader, + LockedTemplateWarning, + StandardDetailRows, +} from './common'; import styles from './PreviewTemplateDetails.module.scss'; import { getBasePath } from '@utils/get-base-path'; import concatClassNames from '@utils/concat-class-names'; +import { useFeatureFlags } from '@providers/client-config-provider'; const { rowHeadings } = content.components.previewTemplateDetails; @@ -21,6 +27,8 @@ export default function PreviewTemplateDetailsLetter({ template: LetterTemplate; hideStatus?: boolean; }) { + const features = useFeatureFlags(); + const proofFilenames = Object.values(template.files.proofs ?? {}) .filter(({ virusScanStatus }) => virusScanStatus === 'PASSED') .map(({ fileName }) => fileName); @@ -34,6 +42,11 @@ export default function PreviewTemplateDetailsLetter({ return ( <> + + {features.routing && template.templateStatus === 'SUBMITTED' && ( + + )} + diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx index a2bcef588..2b14f2c49 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx @@ -8,11 +8,13 @@ import { ContentPreview, DetailSection, DetailsHeader, + LockedTemplateWarning, StandardDetailRows, } from './common'; import { Container } from 'nhsuk-react-components'; import concatClassNames from '@utils/concat-class-names'; import { renderNHSAppMarkdown } from '@utils/markdownit'; +import { useFeatureFlags } from '@providers/client-config-provider'; export default function PreviewTemplateDetailsNhsApp({ template, @@ -21,11 +23,17 @@ export default function PreviewTemplateDetailsNhsApp({ template: NHSAppTemplate; hideStatus?: boolean; }) { + const features = useFeatureFlags(); const message = renderNHSAppMarkdown(template.message); return ( <> + + {features.routing && template.templateStatus === 'SUBMITTED' && ( + + )} + diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx index 115defb09..661e7e323 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx @@ -8,11 +8,13 @@ import { ContentPreview, DetailSection, DetailsHeader, + LockedTemplateWarning, StandardDetailRows, } from './common'; import { Container } from 'nhsuk-react-components'; import concatClassNames from '@utils/concat-class-names'; import { renderSMSMarkdown } from '@utils/markdownit'; +import { useFeatureFlags } from '@providers/client-config-provider'; export default function PreviewTemplateDetailsSms({ template, @@ -21,11 +23,17 @@ export default function PreviewTemplateDetailsSms({ template: SMSTemplate; hideStatus?: boolean; }) { + const features = useFeatureFlags(); const message = renderSMSMarkdown(template.message); return ( <> + + {features.routing && template.templateStatus === 'SUBMITTED' && ( + + )} + diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx index b4e4fcde3..441070b03 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx @@ -1,4 +1,4 @@ -import { Tag, SummaryList } from 'nhsuk-react-components'; +import { Tag, SummaryList, WarningCallout } from 'nhsuk-react-components'; import concatClassNames from '@utils/concat-class-names'; import { statusToColourMapping, @@ -10,6 +10,9 @@ import content from '@content/content'; import { TemplateDto } from 'nhs-notify-backend-client'; import classNames from 'classnames'; import { toKebabCase } from '@utils/kebab-case'; +import { useFeatureFlags } from '@providers/client-config-provider'; +import Link from 'next/link'; +import { interpolate } from '@utils/interpolate'; export type PreviewTemplateComponent = ({ template, @@ -75,6 +78,7 @@ export function StandardDetailRows({ campaignId?: string; hideStatus?: boolean; }>): JSX.Element { + const features = useFeatureFlags(); return ( <> @@ -101,10 +105,11 @@ export function StandardDetailRows({ {rowHeadings.templateStatus} - {statusToDisplayMapping(template)} + {statusToDisplayMapping(template, features)} {previewTemplateStatusFootnote[template.templateStatus] && ( ); } + +export function LockedTemplateWarning({ template }: { template: TemplateDto }) { + const features = useFeatureFlags(); + + const warningContent = content.components.lockedTemplateWarning; + + return ( + + + {statusToDisplayMapping(template, features)} + + +

+ {template.templateType === 'LETTER' + ? warningContent.mainLetter + : warningContent.main} +

+ + {template.templateType !== 'LETTER' && ( +

+ + {warningContent.copy.link.text} + + {warningContent.copy.link.after} +

+ )} + + ); +} diff --git a/frontend/src/content/content.ts b/frontend/src/content/content.ts index 27b6f9f2d..2a641ca6d 100644 --- a/frontend/src/content/content.ts +++ b/frontend/src/content/content.ts @@ -1440,6 +1440,19 @@ const previewTemplateFromMessagePlan = { }, }; +const lockedTemplateWarning = { + main: "You cannot edit or delete this template because it's used in a message plan that's in production.", + mainLetter: + "You cannot delete this template because it's used in a message plan that's in production.", + copy: { + link: { + href: '/copy-template/{{id}}', + text: 'Copy this template', + after: ' to create a draft with the same content.', + }, + }, +}; + const content = { global: { mainLayout }, components: { @@ -1454,6 +1467,7 @@ const content = { errorSummary, footer, header, + lockedTemplateWarning, logoutWarning, messageFormatting, messagePlanBlock, diff --git a/package-lock.json b/package-lock.json index 565250078..20295d0fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36548,7 +36548,7 @@ }, "packages/event-schemas": { "name": "@nhsdigital/nhs-notify-event-schemas-template-management", - "version": "1.2.0", + "version": "1.2.1", "license": "MIT", "dependencies": { "zod": "^4.0.17" diff --git a/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js b/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js index 79f4866be..7ec517418 100644 --- a/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js +++ b/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js @@ -4,7 +4,7 @@ const { const pageActions = [ ...goToPreviewLetterTemplateActions, - 'wait for [data-test-id=status-tag-waiting-for-proof] to be visible', + 'wait for [data-testid=status-tag][data-status=waiting-for-proof] to be visible', ]; const waitingForProofsLetterTemplatePage = (url) => ({ diff --git a/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts b/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts index 23012dcea..1c04c7fec 100644 --- a/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts +++ b/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts @@ -3,10 +3,14 @@ import { TemplateMgmtBasePage } from './template-mgmt-base-page'; export abstract class TemplateMgmtPreviewSubmittedBasePage extends TemplateMgmtBasePage { readonly campaignId: Locator; + readonly copyLink: Locator; + readonly statusTag: Locator; constructor(page: Page) { super(page); this.campaignId = page.locator('[id="campaign-id"]'); + this.copyLink = page.getByTestId('copy-link'); + this.statusTag = page.getByTestId('status-tag'); } } diff --git a/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts index 97dc86452..e4de67d66 100644 --- a/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts @@ -83,6 +83,15 @@ test.describe('Preview submitted Email message template Page', () => { await expect(previewSubmittedEmailTemplatePage.messageText).toHaveText( 'test-template-message' ); + + await expect(previewSubmittedEmailTemplatePage.statusTag).toHaveText( + 'Locked' + ); + + await expect(previewSubmittedEmailTemplatePage.copyLink).toHaveAttribute( + 'href', + `/templates/copy-template/${templates.valid.id}` + ); }); test.describe('Page functionality', () => { diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts index f0a352741..4d38d0b8e 100644 --- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts @@ -93,6 +93,12 @@ test.describe('Preview submitted Letter message template Page', () => { await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText( templates.valid.campaignId ); + + await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText( + 'Locked' + ); + + await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0); }); test.describe('Page functionality', () => { diff --git a/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts index ab57e94f7..2820b0060 100644 --- a/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts @@ -78,6 +78,15 @@ test.describe('Preview submitted NHS App message template Page', () => { await expect(previewSubmittedNHSAppTemplatePage.messageText).toHaveText( 'test-template-message' ); + + await expect(previewSubmittedNHSAppTemplatePage.statusTag).toHaveText( + 'Locked' + ); + + await expect(previewSubmittedNHSAppTemplatePage.copyLink).toHaveAttribute( + 'href', + `/templates/copy-template/${templates.valid.id}` + ); }); test.describe('Page functionality', () => { diff --git a/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts index 3b86fb027..85a3ba8da 100644 --- a/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts @@ -77,6 +77,15 @@ test.describe('Preview submitted sms message template Page', () => { await expect(previewSubmittedSMSTemplatePage.messageText).toHaveText( 'test-template-message' ); + + await expect(previewSubmittedSMSTemplatePage.statusTag).toHaveText( + 'Locked' + ); + + await expect(previewSubmittedSMSTemplatePage.copyLink).toHaveAttribute( + 'href', + `/templates/copy-template/${templates.valid.id}` + ); }); test.describe('Page functionality', () => { diff --git a/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts index 2eb7ad94e..30273ba54 100644 --- a/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts @@ -137,17 +137,17 @@ test.describe('Manage templates page', () => { const email = page.locator( 'tr:has-text("email-submitted_message-templates-page")' ); - await expect(email.getByText('Submitted', { exact: true })).toBeVisible(); + await expect(email.getByText('Locked', { exact: true })).toBeVisible(); const sms = page.locator( 'tr:has-text("sms-submitted_message-templates-page")' ); - await expect(sms.getByText('Submitted', { exact: true })).toBeVisible(); + await expect(sms.getByText('Locked', { exact: true })).toBeVisible(); const nhsapp = page.locator( 'tr:has-text("nhs-app-submitted_message-templates-page")' ); - await expect(nhsapp.getByText('Submitted', { exact: true })).toBeVisible(); + await expect(nhsapp.getByText('Locked', { exact: true })).toBeVisible(); }); test('Not Yet Submitted template items have correct status indicator', async ({ diff --git a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap new file mode 100644 index 000000000..f5b7e6165 --- /dev/null +++ b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap @@ -0,0 +1,321 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`statusToColourMapping status=DELETED type=EMAIL routing=false 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=EMAIL routing=true 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=LETTER routing=false 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=LETTER routing=true 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=NHS_APP routing=false 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=NHS_APP routing=true 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=SMS routing=false 1`] = `undefined`; + +exports[`statusToColourMapping status=DELETED type=SMS routing=true 1`] = `undefined`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"green"`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"green"`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `undefined`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `undefined`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"green"`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"green"`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"green"`; + +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"green"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"blue"`; + +exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"blue"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"orange"`; + +exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"grey"`; + +exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=false 1`] = `"grey"`; + +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"grey"`; + +exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=SUBMITTED type=SMS routing=false 1`] = `"grey"`; + +exports[`statusToColourMapping status=SUBMITTED type=SMS routing=true 1`] = `"orange"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"red"`; + +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"red"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"yellow"`; + +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"yellow"`; + +exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=false 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=true 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=false 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=true 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=false 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=true 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=SMS routing=false 1`] = `""`; + +exports[`statusToDisplayMapping status=DELETED type=SMS routing=true 1`] = `""`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `"Not yet submitted"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `"Not yet submitted"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"Draft"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"Files uploaded"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"Checking files"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=false 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=true 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=false 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=true 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"Waiting for proof"`; diff --git a/utils/utils/src/__tests__/enum.test.ts b/utils/utils/src/__tests__/enum.test.ts index 7893870b3..7106614ad 100644 --- a/utils/utils/src/__tests__/enum.test.ts +++ b/utils/utils/src/__tests__/enum.test.ts @@ -2,6 +2,8 @@ import { Language, LetterType, + TEMPLATE_TYPE_LIST, + TEMPLATE_STATUS_LIST, TemplateStatus, TemplateType, } from 'nhs-notify-backend-client'; @@ -29,7 +31,6 @@ import { templateTypeToUrlTextMappings, cascadeTemplateTypeToUrlTextMappings, } from '../enum'; -import { TEMPLATE_STATUS_LIST } from 'nhs-notify-backend-client'; describe('templateTypeDisplayMappings', () => { test('NHS_APP', () => { @@ -114,87 +115,48 @@ describe('alphabeticalLanguageList', () => { }); }); +const TEMPLATE_STATUS_CASES = TEMPLATE_STATUS_LIST.flatMap((status) => + TEMPLATE_TYPE_LIST.flatMap((type) => + [true, false].map( + (routingFlag): [TemplateStatus, TemplateType, boolean] => [ + status, + type, + routingFlag, + ] + ) + ) +); + describe('statusToDisplayMapping', () => { - test.each([ - { type: 'LETTER' as TemplateType, expected: 'Not yet submitted' }, - { type: 'NHS_APP' as TemplateType, expected: 'Draft' }, - { type: 'SMS' as TemplateType, expected: 'Draft' }, - { type: 'EMAIl' as TemplateType, expected: 'Draft' }, - ])( - 'When templateType is %type NOT_YET_SUBMITTED should be %expected', - ({ type, expected }) => { + test.each(TEMPLATE_STATUS_CASES)( + 'status=%s type=%s routing=%s', + (status, type, routing) => { expect( - statusToDisplayMapping({ - templateType: type, - templateStatus: 'NOT_YET_SUBMITTED', - }) - ).toEqual(expected); + statusToDisplayMapping( + { + templateType: type, + templateStatus: status, + }, + { routing } + ) + ).toMatchSnapshot(); } ); - - test('SUBMITTED', () => { - expect( - statusToDisplayMapping({ - templateType: 'SMS', - templateStatus: 'SUBMITTED', - }) - ).toEqual('Submitted'); - }); - - test('DELETED', () => { - expect( - statusToDisplayMapping({ - templateType: 'SMS', - templateStatus: 'DELETED', - }) - ).toEqual(''); - }); }); describe('statusToColourMapping', () => { - it.each(TEMPLATE_STATUS_LIST)( - 'should give the expected colour when templateStatus is %s for LETTERS', - (templateStatus) => { - const expectedColours: { [key in TemplateStatus]?: string } = { - SUBMITTED: 'grey', - WAITING_FOR_PROOF: 'yellow', - PENDING_PROOF_REQUEST: 'blue', - PENDING_UPLOAD: 'blue', - PENDING_VALIDATION: 'blue', - VIRUS_SCAN_FAILED: 'red', - VALIDATION_FAILED: 'red', - PROOF_AVAILABLE: 'orange', - }; - + test.each(TEMPLATE_STATUS_CASES)( + 'status=%s type=%s routing=%s', + (status, type, routing) => { expect( - statusToColourMapping({ templateStatus, templateType: 'LETTER' }) - ).toEqual(expectedColours[templateStatus]); - } - ); - - describe.each(['NHS_APP', 'SMS', 'EMAIL'] as TemplateType[])( - 'template type: %p', - (templateType) => { - it.each(TEMPLATE_STATUS_LIST)( - 'should give the expected colour when templateStatus is %p', - (templateStatus) => { - const expectedColours: { [key in TemplateStatus]?: string } = { - SUBMITTED: 'grey', - WAITING_FOR_PROOF: 'yellow', - PENDING_PROOF_REQUEST: 'blue', - PENDING_UPLOAD: 'blue', - PENDING_VALIDATION: 'blue', - VIRUS_SCAN_FAILED: 'red', - VALIDATION_FAILED: 'red', - PROOF_AVAILABLE: 'orange', - NOT_YET_SUBMITTED: 'green', - }; - - expect( - statusToColourMapping({ templateStatus, templateType }) - ).toEqual(expectedColours[templateStatus]); - } - ); + statusToColourMapping( + { + templateType: type, + templateStatus: status, + }, + { routing } + ) + ).toMatchSnapshot(); } ); }); diff --git a/utils/utils/src/enum.ts b/utils/utils/src/enum.ts index 70ccad623..4ad331eda 100644 --- a/utils/utils/src/enum.ts +++ b/utils/utils/src/enum.ts @@ -6,6 +6,7 @@ import type { TemplateDto, Channel, RoutingConfigStatus, + ClientFeatures, } from 'nhs-notify-backend-client'; /** @@ -92,34 +93,26 @@ export const templateTypeDisplayMappings = (type: TemplateType) => LETTER: 'Letter', })[type]; -const statusToDisplayMappings: Record = { - NOT_YET_SUBMITTED: 'Not yet submitted', - SUBMITTED: 'Submitted', - DELETED: '', // will not be shown in the UI - PENDING_PROOF_REQUEST: 'Files uploaded', - PENDING_UPLOAD: 'Checking files', - PENDING_VALIDATION: 'Checking files', - VALIDATION_FAILED: 'Checks failed', - VIRUS_SCAN_FAILED: 'Checks failed', - WAITING_FOR_PROOF: 'Waiting for proof', - PROOF_AVAILABLE: 'Proof available', -} as const; - -const templateStatusToDisplayMappingsLetter = (status: TemplateStatus) => - statusToDisplayMappings[status]; - -const templateStatusToDisplayMappingsDigital = (status: TemplateStatus) => - ({ - ...statusToDisplayMappings, - NOT_YET_SUBMITTED: 'Draft', - })[status]; - export const statusToDisplayMapping = ( - template: Pick -): string => - template.templateType === 'LETTER' - ? templateStatusToDisplayMappingsLetter(template.templateStatus) - : templateStatusToDisplayMappingsDigital(template.templateStatus); + template: Pick, + featureFlags: Pick +): string => { + const statusToDisplayMappings: Record = { + NOT_YET_SUBMITTED: + template.templateType === 'LETTER' ? 'Not yet submitted' : 'Draft', + SUBMITTED: featureFlags.routing ? 'Locked' : 'Submitted', + DELETED: '', // will not be shown in the UI + PENDING_PROOF_REQUEST: 'Files uploaded', + PENDING_UPLOAD: 'Checking files', + PENDING_VALIDATION: 'Checking files', + VALIDATION_FAILED: 'Checks failed', + VIRUS_SCAN_FAILED: 'Checks failed', + WAITING_FOR_PROOF: 'Waiting for proof', + PROOF_AVAILABLE: 'Proof available', + }; + + return statusToDisplayMappings[template.templateStatus]; +}; type Colour = | 'white' @@ -134,39 +127,25 @@ type Colour = | 'yellow' | undefined; -const colourMappings: Record = { - NOT_YET_SUBMITTED: undefined, - SUBMITTED: 'grey', - DELETED: undefined, - PENDING_PROOF_REQUEST: 'blue', - PENDING_UPLOAD: 'blue', - PENDING_VALIDATION: 'blue', - VIRUS_SCAN_FAILED: 'red', - VALIDATION_FAILED: 'red', - WAITING_FOR_PROOF: 'yellow', - PROOF_AVAILABLE: 'orange', -} as const; - -const templateStatusToColourMappingsLetter = ( - status: TemplateStatus -): Colour | undefined => colourMappings[status]; - -const templateStatusToColourMappingsDigital = ( - status: TemplateStatus -): Colour | undefined => - ( - ({ - ...colourMappings, - NOT_YET_SUBMITTED: 'green', - }) satisfies typeof colourMappings - )[status]; - export const statusToColourMapping = ( - template: Pick -) => - template.templateType === 'LETTER' - ? templateStatusToColourMappingsLetter(template.templateStatus) - : templateStatusToColourMappingsDigital(template.templateStatus); + template: Pick, + featureFlags: Pick +) => { + const colourMappings: Record = { + NOT_YET_SUBMITTED: template.templateType === 'LETTER' ? undefined : 'green', + SUBMITTED: featureFlags.routing ? 'orange' : 'grey', + DELETED: undefined, + PENDING_PROOF_REQUEST: 'blue', + PENDING_UPLOAD: 'blue', + PENDING_VALIDATION: 'blue', + VIRUS_SCAN_FAILED: 'red', + VALIDATION_FAILED: 'red', + WAITING_FOR_PROOF: 'yellow', + PROOF_AVAILABLE: 'orange', + }; + + return colourMappings[template.templateStatus]; +}; export const templateTypeToUrlTextMappings = (type: TemplateType) => ({