diff --git a/frontend/package.json b/frontend/package.json index 20bcbd25b..9d30ddbde 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -31,7 +31,6 @@ "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.9", "@types/markdown-it": "^13.0.9", - "@types/node": "^22.13.12", "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "constructs": "^10.4.2", diff --git a/frontend/src/__tests__/app/message-plans/choose-email-template/preview-template/__snapshots__/page.test.tsx.snap b/frontend/src/__tests__/app/message-plans/choose-email-template/preview-template/__snapshots__/page.test.tsx.snap index 20bcdec5e..f148d0121 100644 --- a/frontend/src/__tests__/app/message-plans/choose-email-template/preview-template/__snapshots__/page.test.tsx.snap +++ b/frontend/src/__tests__/app/message-plans/choose-email-template/preview-template/__snapshots__/page.test.tsx.snap @@ -62,7 +62,7 @@ exports[`PreviewEmailTemplateFromMessagePlan page renders Email template preview
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
{ jest.resetAllMocks(); }); - it('should load page', async () => { + it('should load page with PDF letter template', async () => { getTemplateMock.mockResolvedValueOnce(templateDTO); const page = await PreviewLetterTemplatePage({ @@ -79,6 +80,20 @@ describe('PreviewLetterTemplatePage', () => { expect(page).toEqual(); }); + it('should load page with authoring letter template', async () => { + getTemplateMock.mockResolvedValueOnce(AUTHORING_LETTER_TEMPLATE); + + const page = await PreviewLetterTemplatePage({ + params: Promise.resolve({ + templateId: AUTHORING_LETTER_TEMPLATE.id, + }), + }); + + expect(page).toEqual( + + ); + }); + it('should redirect to invalid-template when no template is found', async () => { await PreviewLetterTemplatePage({ params: Promise.resolve({ diff --git a/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx b/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx index 764ef511c..5237accce 100644 --- a/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx +++ b/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx @@ -9,6 +9,7 @@ import { getTemplate } from '@utils/form-actions'; import { redirect } from 'next/navigation'; import { TemplateDto } from 'nhs-notify-backend-client'; import { + AUTHORING_LETTER_TEMPLATE, EMAIL_TEMPLATE, NHS_APP_TEMPLATE, SMS_TEMPLATE, @@ -29,7 +30,7 @@ const getTemplateMock = jest.mocked(getTemplate); describe('PreviewSubmittedLetterTemplatePage', () => { beforeEach(jest.resetAllMocks); - it('should load page', async () => { + it('should load page with PDF letter template', async () => { const templateDTO = { createdAt: '2025-01-13T10:19:25.579Z', files: { @@ -74,6 +75,28 @@ describe('PreviewSubmittedLetterTemplatePage', () => { ); }); + it('should load page with authoring letter template', async () => { + const templateDTO = { + ...AUTHORING_LETTER_TEMPLATE, + templateStatus: 'SUBMITTED', + } satisfies TemplateDto; + + getTemplateMock.mockResolvedValueOnce(templateDTO); + + const page = await PreviewSubmittedLetterTemplatePage({ + params: Promise.resolve({ + templateId: AUTHORING_LETTER_TEMPLATE.id, + }), + }); + + expect(page).toEqual( + + ); + }); + it('should redirect to invalid-template when no template is found', async () => { await PreviewSubmittedLetterTemplatePage({ params: Promise.resolve({ @@ -106,6 +129,10 @@ describe('PreviewSubmittedLetterTemplatePage', () => { ...PDF_LETTER_TEMPLATE, templateStatus: 'NOT_YET_SUBMITTED' as const, }, + { + ...AUTHORING_LETTER_TEMPLATE, + templateStatus: 'NOT_YET_SUBMITTED' as const, + }, ])( 'should redirect to invalid-template when template is $templateType, name is $name, and status is $templateStatus', async (value) => { diff --git a/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.test.tsx b/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.test.tsx index 8c8609e5d..4b0281f93 100644 --- a/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.test.tsx +++ b/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.test.tsx @@ -1,6 +1,10 @@ import { ChooseLanguageLetterTemplates } from '@forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates'; import { fireEvent, render, screen, within } from '@testing-library/react'; -import { PDF_LETTER_TEMPLATE, ROUTING_CONFIG } from '@testhelpers/helpers'; +import { + AUTHORING_LETTER_TEMPLATE, + PDF_LETTER_TEMPLATE, + ROUTING_CONFIG, +} from '@testhelpers/helpers'; import { useActionState } from 'react'; import { ChooseLanguageLetterTemplatesFormState } from '@forms/ChooseLanguageLetterTemplates/server-action'; import { LetterTemplate } from 'nhs-notify-web-template-management-utils'; @@ -46,6 +50,13 @@ const SPANISH_LETTER_TEMPLATE: LetterTemplate = { language: 'es', }; +const GERMAN_AUTHORING_LETTER_TEMPLATE: LetterTemplate = { + ...AUTHORING_LETTER_TEMPLATE, + id: 'german-authoring-letter-id', + name: 'German authoring letter template', + language: 'de', +}; + const languageLetterTemplates = [ FRENCH_LETTER_TEMPLATE, POLISH_LETTER_TEMPLATE, @@ -162,6 +173,20 @@ describe('ChooseLanguageLetterTemplates', () => { }); expect(container.asFragment()).toMatchSnapshot(); }); + + it('renders authoring letter templates', () => { + const container = renderComponent({ + templateList: [GERMAN_AUTHORING_LETTER_TEMPLATE], + }); + + const table = screen.getByTestId('language-templates-table'); + + expect( + within(table).getByText(GERMAN_AUTHORING_LETTER_TEMPLATE.name) + ).toBeInTheDocument(); + + expect(container.asFragment()).toMatchSnapshot(); + }); }); describe('when there are no templates', () => { diff --git a/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/__snapshots__/ChooseLanguageLetterTemplates.test.tsx.snap b/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/__snapshots__/ChooseLanguageLetterTemplates.test.tsx.snap index d8a88958b..93136add8 100644 --- a/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/__snapshots__/ChooseLanguageLetterTemplates.test.tsx.snap +++ b/frontend/src/__tests__/components/forms/ChooseLanguageLetterTemplates/__snapshots__/ChooseLanguageLetterTemplates.test.tsx.snap @@ -974,6 +974,255 @@ exports[`ChooseLanguageLetterTemplates error handling when no template is select `; +exports[`ChooseLanguageLetterTemplates when templates are available renders authoring letter templates 1`] = ` + +
+
+
+
+ + Autumn Campaign Plan + +

+ Choose language letter templates +

+
+
+ + + +
+
+
+ Choose all the templates that you want to include in this message plan. You can only choose one template for each language. +
+
+
+ + + + + + + + + + + + + + + + + + +
+ Select + + Name + + Type + + Last edited + +
+ +
+ + +
+
+ + + + + Standard letter - German + + + 13th Jan 2025 +
+ 10:19 +
+ + + Preview + +
+
+
+
+
+
+ + + Go back + +
+
+
+
+
+
+`; + exports[`ChooseLanguageLetterTemplates when templates are available renders multiple options 1`] = `
{ beforeEach(() => { jest.clearAllMocks(); @@ -132,6 +140,50 @@ describe('chooseLanguageLetterTemplatesAction', () => { ); }); + test('should update message plan with authoring letter template selection', async () => { + await chooseLanguageLetterTemplatesAction( + { + messagePlan: { + ...ROUTING_CONFIG, + cascade: [ + { + ...ROUTING_CONFIG.cascade[0], + }, + ], + }, + cascadeIndex: 0, + templateList: [GERMAN_AUTHORING_LETTER], + pageHeading: 'Choose language templates', + }, + getMockFormData({ + [`template_${GERMAN_AUTHORING_LETTER.id}`]: `${GERMAN_AUTHORING_LETTER.id}:de`, + lockNumber: '42', + }) + ); + + expect(mockUpdateRoutingConfig).toHaveBeenCalledWith( + ROUTING_CONFIG.id, + expect.objectContaining({ + cascade: [ + expect.objectContaining({ + conditionalTemplates: [ + expect.objectContaining({ + language: 'de', + templateId: GERMAN_AUTHORING_LETTER.id, + }), + ], + }), + ], + }), + 42 + ); + + expect(mockRedirect).toHaveBeenCalledWith( + `/message-plans/choose-templates/${ROUTING_CONFIG.id}`, + RedirectType.push + ); + }); + test('should replace existing language templates with new selection', async () => { await chooseLanguageLetterTemplatesAction( { 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 3fe397d2e..48ffe055f 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 @@ -87,7 +87,7 @@ exports[`Preview email form renders Routing feature flag - Disabled Client-side
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
{ + it('renders link with label and visually hidden text', () => { + render( + + ); + + const link = screen.getByTestId('test-link'); + expect(link).toBeInTheDocument(); + expect(link).toHaveAttribute('href', '/edit/123'); + expect(link).toHaveTextContent('Edit'); + expect(link).toHaveTextContent('template name'); + }); + + it('renders aria-hidden SummaryList.Actions when hidden is true', () => { + const { container } = render( +
- NHS App message + Standard letter
- -
+ Template file +
+
- Message + +

+ file.pdf +

+
+
+
+
+ Example personalisation file
-

- app content + +

+ file.csv

- -
+
+
+
+ Template proof files +
+
+ +
+
+
-

- 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.

@@ -145,7 +266,7 @@ exports[`PreviewSubmittedTemplate component routing = false should render app me `; -exports[`PreviewSubmittedTemplate component routing = false should render email 1`] = ` +exports[`PreviewSubmittedTemplate component routing = false should render app message 1`] = ` - Example Email template + Example template
- Type + Template type
- Email + NHS App message
- Subject -
- -
-
- email subject -
-
-
-
-
-
Standard letter
+
+
+
+
+ Campaign +
+
+
- Status + Total pages
- - Submitted - + 2
+
- Template file + Sheets
-
+
+ - -

- file.pdf -

-
+ about sheets + +
- Example personalisation file + Printing and postage
-
- -

- file.csv -

-
+ first-class
+
- -
- Template proof files + Status
- + Submitted + +
+
+ + Learn more + + about status + +
@@ -581,7 +626,7 @@ exports[`PreviewSubmittedTemplate component routing = false should render letter
`; -exports[`PreviewSubmittedTemplate component routing = false should render sms 1`] = ` +exports[`PreviewSubmittedTemplate component routing = false should render email 1`] = ` - SMS template + Example Email template
- Type + Template type
- Text message (SMS) + Email
+ Subject +
+ +
+
+ email subject +
+
+
+
+
+
- Type + Template type
- NHS App message + Text message (SMS)
- Locked + Submitted
@@ -863,7 +912,7 @@ exports[`PreviewSubmittedTemplate component routing = true should render app mes id="preview-content-message" >

- app content + SMS content

@@ -872,6 +921,12 @@ exports[`PreviewSubmittedTemplate component routing = true should render app mes +

+ 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 routing = true should render email 1`] = ` +exports[`PreviewSubmittedTemplate component routing = true should render PDF letter 1`] = ` - Example Email template + Example letter

- 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. + You cannot delete this template because it's used in a message plan that's in production.

- Type + Template type
- Email + Standard letter
- -
-
- Subject -
+ Template file
- email subject + +

+ file.pdf +

@@ -1032,32 +1085,124 @@ exports[`PreviewSubmittedTemplate component routing = true should render email 1
-
- Message -
+ Example personalisation file
-

- email content + +

+ file.csv

- -
- -

+

+
+
+ Template proof files +
+
+ +
+
+
+ +

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

- You cannot delete this template because it's used in a message plan that's in production. + 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.

- Type + Template type
- Standard letter + NHS App message
+ +
- Template file +
+ Message +
- -

- file.pdf +

+ app content

+ +
+
+ +

+ + Back to all templates + +

+ + + +
+`; + +exports[`PreviewSubmittedTemplate component routing = true should render authoring letter 1`] = ` + + + Back to all templates + +
+
+
+
+ + Template + +

+ Example authoring letter +

+
+
+ + Locked + +

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

+
+
+
- Example personalisation file + Template ID
-
- -

- file.csv -

-
+ template-id
+
-
-
- Template proof files + Template type
- + Standard letter +
+
+
+
+
+ Campaign +
+
+
+
+
+ Total pages +
+
+ 2 +
+
+
+
+
+ Sheets +
+
+ 4 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ first-class +
+
+
+
+ Status +
+
+ + Locked + +
+
+ + Learn more + + about status + + +
+
+
+
+

+ + Back to all templates + +

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

+ Example Email 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 +
+
+
+
+ Template type +
+
+ Email +
+
+
+
+ Status +
+
+ + Locked + +
+
+
+
+
+
+
+ Subject +
+
+
+
+ email subject +
+
+
+
+
+
+ Message +
+
+
+
+

+ email content +

+ + +
@@ -1429,7 +1868,7 @@ exports[`PreviewSubmittedTemplate component routing = true should render sms 1`]
- Type + Template type
+
+ + Template + +

+ Authoring Letter +

+
+

+ + Edit name + + for Authoring Letter + + +

+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+ + Edit + + campaign + + +
+
+
+
+ Total pages +
+
+ 2 +
+
+
+
+
+ Sheets +
+
+ 4 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+ + Edit + + printing and postage + + +
+
+
+
+ Status +
+
+ + Approval needed + +
+
+ + Learn more + + about status + + +
+
+
+
+ +`; + +exports[`PreviewTemplateDetailsAuthoringLetter snapshots matches snapshot with hideEditActions 1`] = ` + +
+ + Template + +

+ Authoring Letter +

+
+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+ campaign-123 +
+
+
+
+ Total pages +
+
+ 2 +
+
+
+
+
+ Sheets +
+
+ 4 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+
+
+ Status +
+
+ + Approval needed + +
+
+ + Learn more + + about status + + +
+
+
+
+
+`; + +exports[`PreviewTemplateDetailsAuthoringLetter snapshots matches snapshot without letterVariantId (shows missing value styling) 1`] = ` + +
+ + Template + +

+ Authoring Letter +

+
+

+ + Edit name + + for Authoring Letter + + +

+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+ + Edit + + campaign + + +
+
+
+
+ Total pages +
+
+ 2 +
+
+
+
+
+ Sheets +
+
+ 4 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+
+ + Edit + + printing and postage + + +
+
+
+
+ Status +
+
+ + Approval needed + +
+
+ + Learn more + + about status + + +
+
+
+
+
+`; + exports[`PreviewTemplateDetailsEmail matches snapshot 1`] = `
- Type + Template type
`; -exports[`PreviewTemplateDetailsLetter if status is NOT_YET_SUBMITTED, then Not yet submitted is displayed 1`] = ` +exports[`PreviewTemplateDetailsNhsApp matches snapshot 1`] = `
- Example letter + Example template
- Type + Template type
- Standard letter + NHS App message
- Not yet submitted + Draft
+ +
- Template file +
+ Message +
- -

- file.pdf +

+ app content

+ +
@@ -248,7 +868,7 @@ exports[`PreviewTemplateDetailsLetter if status is NOT_YET_SUBMITTED, then Not y `; -exports[`PreviewTemplateDetailsLetter if status is PROOF_AVAILABLE, but no proofs are registered on the template, proof section is hidden (this is unexpected) 1`] = ` +exports[`PreviewTemplateDetailsPdfLetter matches snapshot when test data CSV is absent 1`] = `
- Example letter + PDF Letter
- Type + Template type
- Proof available + Not yet submitted
@@ -361,7 +981,7 @@ exports[`PreviewTemplateDetailsLetter if status is PROOF_AVAILABLE, but no proof
`; -exports[`PreviewTemplateDetailsLetter matches snapshot when proofs are present, proofs failing virus scan are not displayed 1`] = ` +exports[`PreviewTemplateDetailsPdfLetter matches snapshot with proofs (failed virus scan proofs excluded) 1`] = `
- Example letter + PDF Letter
- Type + Template type
`; -exports[`PreviewTemplateDetailsLetter matches snapshot when test data CSV is absent 1`] = ` - -
- - Template - -

- Example template -

-
-
-
-
-
- Template ID -
-
- template-id -
-
-
-
- Type -
-
- Standard letter - French -
-
-
-
- Status -
-
- - Checking files - - - Refresh the page to update the status - -
-
-
-
- Template file -
-
-
- -

- file.pdf -

-
-
-
-
-
-
-`; - -exports[`PreviewTemplateDetailsLetter matches snapshot without proofs 1`] = ` +exports[`PreviewTemplateDetailsPdfLetter matches snapshot without proofs 1`] = `
- Example template + PDF Letter
- Type + Template type
`; -exports[`PreviewTemplateDetailsNhsApp matches snapshot 1`] = ` - -
- - Template - -

- Example template -

-
-
-
-
-
- Template ID -
-
- template-id -
-
-
-
- Type -
-
- NHS App message -
-
-
-
- Status -
-
- - Draft - -
-
-
-
-
-
-
- Message -
-
-
-
-

- app content -

- - -
-
-
-
-
-
-`; - exports[`PreviewTemplateDetailsSms matches snapshot 1`] = `
- Type + Template type
+ + Go back + +
+
+
+
+ + Template + +

+ authoring letter template name +

+
+
+
+
+
+ Template ID +
+
+ authoring-letter-template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+
+
+ Total pages +
+
+ 1 +
+
+
+
+
+ Sheets +
+
+ 2 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+
+
+ + Go back + +
+
+
+ +`; + exports[`PreviewTemplateFromMessagePlan renders Email template preview with the correct back links 1`] = ` - Type + Template type
- Type + Template type
- Type + Template type
`; -exports[`PreviewTemplateFromMessagePlan renders Letter template preview with the correct back links 1`] = ` +exports[`PreviewTemplateFromMessagePlan renders NHS App template preview with the correct back links 1`] = ` Go back @@ -417,7 +591,7 @@ exports[`PreviewTemplateFromMessagePlan renders Letter template preview with the class="preview__heading" data-testid="preview-message__heading" > - letter template name + app template name
- letter-template-id + app-template-id
- Type + Template type
- Standard letter + NHS App message
+
+
- Template file +
+ Message +
- -

- template.pdf +

+ message

+ +
@@ -496,7 +667,7 @@ exports[`PreviewTemplateFromMessagePlan renders Letter template preview with the Go back @@ -506,12 +677,12 @@ exports[`PreviewTemplateFromMessagePlan renders Letter template preview with the `; -exports[`PreviewTemplateFromMessagePlan renders NHS App template preview with the correct back links 1`] = ` +exports[`PreviewTemplateFromMessagePlan renders PDF Letter template preview with the correct back links 1`] = ` Go back @@ -538,7 +709,7 @@ exports[`PreviewTemplateFromMessagePlan renders NHS App template preview with th class="preview__heading" data-testid="preview-message__heading" > - app template name + letter template name
- app-template-id + letter-template-id
- Type + Template type
- NHS App message + Standard letter
- -
-
- Message -
+ Template file
-

- message + +

+ template.pdf

- -
@@ -614,7 +788,7 @@ exports[`PreviewTemplateFromMessagePlan renders NHS App template preview with th Go back @@ -686,7 +860,7 @@ exports[`PreviewTemplateFromMessagePlan renders SMS template preview with the co
- Type + Template type
{ beforeEach(() => { jest.resetAllMocks(); jest.mocked(useFeatureFlags).mockReturnValue({ routing: false }); + jest.mocked(useCampaignIds).mockReturnValue(['campaign-1', 'campaign-2']); }); - it('throws error for AUTHORING letter version', () => { - expect(() => - render( - - ) - ).toThrow('AUTHORING letter version is not supported'); + it('matches snapshot for AUTHORING letter version', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); + + it('matches snapshot for AUTHORING letter with VIRUS_SCAN_FAILED status', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); + }); + + it('matches snapshot for AUTHORING letter with VALIDATION_FAILED status', () => { + const container = render( + + ); + + expect(container.asFragment()).toMatchSnapshot(); }); it('matches snapshot when template status is VIRUS_SCAN_FAILED', () => { 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 8f9317ea1..f93eec219 100644 --- a/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap +++ b/frontend/src/__tests__/components/organisms/__snapshots__/PreviewLetterTemplate.test.tsx.snap @@ -1,5 +1,813 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`PreviewLetterTemplate component matches snapshot for AUTHORING letter version 1`] = ` + + + Back to all templates + +
+
+
+
+ + Template + +

+ test-template-letter +

+
+

+ + Edit name + + for test-template-letter + + +

+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+ + Edit + + campaign + + +
+
+
+
+ Total pages +
+
+ 1 +
+
+
+
+
+ Sheets +
+
+ 2 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+ + Edit + + printing and postage + + +
+
+
+
+ Status +
+
+ + Approval needed + +
+
+ + Learn more + + about status + + +
+
+
+
+

+ + Back to all templates + +

+
+
+
+
+`; + +exports[`PreviewLetterTemplate component matches snapshot for AUTHORING letter with VALIDATION_FAILED status 1`] = ` + + + Back to all templates + +
+
+
+ +
+ + Template + +

+ test-template-letter +

+
+

+ + Edit name + + for test-template-letter + + +

+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+ + Edit + + campaign + + +
+
+
+
+ Total pages +
+
+ 1 +
+
+
+
+
+ Sheets +
+
+ 2 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+ + Edit + + printing and postage + + +
+
+
+
+ Status +
+
+ + Checks failed + +
+
+ + Learn more + + about status + + +
+
+
+
+

+ + Back to all templates + +

+
+
+
+
+`; + +exports[`PreviewLetterTemplate component matches snapshot for AUTHORING letter with VIRUS_SCAN_FAILED status 1`] = ` + + + Back to all templates + +
+
+
+ +
+ + Template + +

+ test-template-letter +

+
+

+ + Edit name + + for test-template-letter + + +

+
+
+
+
+ Template ID +
+
+ template-id +
+
+
+
+
+ Template type +
+
+ Standard letter +
+
+
+
+
+ Campaign +
+
+
+ + Edit + + campaign + + +
+
+
+
+ Total pages +
+
+ 1 +
+
+
+
+
+ Sheets +
+
+ 2 +
+
+ + Learn more + + about sheets + + +
+
+
+
+ Printing and postage +
+
+ variant-123 +
+
+ + Edit + + printing and postage + + +
+
+
+
+ Status +
+
+ + Checks failed + +
+
+ + Learn more + + about status + + +
+
+
+
+

+ + Back to all templates + +

+
+
+
+
+`; + exports[`PreviewLetterTemplate component matches snapshot when template language is Right to Left 1`] = ` - Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
- Type + Template type
(list: T[]): IterableIterator { @@ -21,7 +24,7 @@ export const getMockFormData = (formData: Record) => get: (key: string) => formData[key], }); -export const NHS_APP_TEMPLATE: TemplateDto = { +export const NHS_APP_TEMPLATE: NHSAppTemplate = { id: 'app-template-id', templateType: 'NHS_APP', templateStatus: 'NOT_YET_SUBMITTED', @@ -32,7 +35,7 @@ export const NHS_APP_TEMPLATE: TemplateDto = { lockNumber: 1, } as const; -export const EMAIL_TEMPLATE: TemplateDto = { +export const EMAIL_TEMPLATE: EmailTemplate = { id: 'email-template-id', templateType: 'EMAIL', templateStatus: 'NOT_YET_SUBMITTED', @@ -44,7 +47,7 @@ export const EMAIL_TEMPLATE: TemplateDto = { lockNumber: 1, } as const; -export const SMS_TEMPLATE: TemplateDto = { +export const SMS_TEMPLATE: SMSTemplate = { id: 'sms-template-id', templateType: 'SMS', templateStatus: 'NOT_YET_SUBMITTED', diff --git a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx index 9dca963fa..72a314d49 100644 --- a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx +++ b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx @@ -33,6 +33,7 @@ export function PreviewSubmittedTemplate({
{previewComponent({ template: initialState, + hideEditActions: true, })} {!routing && ( diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/ActionLink.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/ActionLink.tsx new file mode 100644 index 000000000..78661c5a7 --- /dev/null +++ b/frontend/src/components/molecules/PreviewTemplateDetails/ActionLink.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { SummaryList } from 'nhsuk-react-components'; +import Link from 'next/link'; + +export type ActionLinkProps = { + href: string; + label: string; + visuallyHiddenText: string; + hidden?: boolean; + testId?: string; + external?: boolean; +}; + +export function ActionLink({ + href, + label, + visuallyHiddenText, + hidden, + testId, + external, +}: ActionLinkProps) { + if (hidden) { + return - - - - )} - - + return template.letterVersion === 'PDF' ? ( + + ) : ( + ); } diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter.tsx new file mode 100644 index 000000000..3f4276aaa --- /dev/null +++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter.tsx @@ -0,0 +1,110 @@ +'use client'; + +import { Container, SummaryList } from 'nhsuk-react-components'; +import { + letterTypeDisplayMappings, + PdfLetterTemplate, +} from 'nhs-notify-web-template-management-utils'; +import { Filename } from '@atoms/Filename/Filename'; +import content from '@content/content'; +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; + +export default function PreviewTemplateDetailsPdfLetter({ + template, + hideStatus, +}: { + template: PdfLetterTemplate; + hideStatus?: boolean; +}) { + const features = useFeatureFlags(); + + const proofFilenames = Object.values(template.files.proofs ?? {}) + .filter(({ virusScanStatus }) => virusScanStatus === 'PASSED') + .map(({ fileName }) => fileName); + + const showProofs = + proofFilenames.length > 0 && + (template.templateStatus === 'PROOF_AVAILABLE' || + template.templateStatus === 'PROOF_APPROVED' || + template.templateStatus === 'SUBMITTED') && + template.clientId; + + return ( + <> + + + {features.routing && template.templateStatus === 'SUBMITTED' && ( + + )} + + + + + + {rowHeadings.templateFile} + + + + + {template.files.testDataCsv?.fileName && ( + + + {rowHeadings.examplePersonalisationFile} + + + + + + )} + + + {showProofs && ( + + + + {rowHeadings.templateProofFiles} + + +
    + {proofFilenames.map((file) => ( +
  • + + + +
  • + ))} +
+
+
+
+ )} +
+ + ); +} diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx index dbdc5e3bf..2ae311f22 100644 --- a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx +++ b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx @@ -18,9 +18,11 @@ import { NHSNotifyWarningCallout } from '@atoms/NHSNotifyWarningCallout/NHSNotif export type PreviewTemplateComponent = ({ template, hideStatus, + hideEditActions, }: { template: T; hideStatus?: boolean; + hideEditActions?: boolean; }) => JSX.Element; type ContentPreviewField = { @@ -32,11 +34,21 @@ type ContentPreviewField = { const { rowHeadings, previewTemplateStatusFootnote, headerCaption } = content.components.previewTemplateDetails; -export function DetailSection({ children }: { children: React.ReactNode }) { +export function DetailSection({ + children, + className, +}: { + children: React.ReactNode; + className?: string; +}) { return ( {children} @@ -68,6 +80,7 @@ export function ContentPreview({ )); } +// Once PDF letters are removed, this should become DigitalChannelDetailRows export function StandardDetailRows({ template, templateTypeText, @@ -80,6 +93,7 @@ export function StandardDetailRows({ hideStatus?: boolean; }>): JSX.Element { const features = useFeatureFlags(); + return ( <> diff --git a/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx b/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx index 387fa4e46..d46062dfd 100644 --- a/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx +++ b/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx @@ -58,6 +58,7 @@ export function PreviewTemplateFromMessagePlan({ {previewComponent({ template, hideStatus: true, + hideEditActions: true, })} ) { - if (template.letterVersion !== 'PDF') { - throw new Error('AUTHORING letter version is not supported'); - } + return template.letterVersion === 'PDF' ? ( + + ) : ( + + ); +} +function PreviewPdfLetterTemplate({ + template, +}: Readonly<{ template: PdfLetterTemplate }>) { const { approveProofText, backLinkText, footer, + links, preSubmissionText, requestProofText, rtlWarning, @@ -44,15 +57,27 @@ export function PreviewLetterTemplate({ const buttonMap: Record = { NOT_YET_SUBMITTED: { text: submitText, - href: `${basePath}/submit-letter-template/${template.id}?lockNumber=${template.lockNumber}`, + href: interpolate(links.submitLetterTemplate, { + basePath, + templateId: template.id, + lockNumber: template.lockNumber, + }), }, PROOF_AVAILABLE: { text: routing ? approveProofText : submitText, - href: `${basePath}/submit-letter-template/${template.id}?lockNumber=${template.lockNumber}`, + href: interpolate(links.submitLetterTemplate, { + basePath, + templateId: template.id, + lockNumber: template.lockNumber, + }), }, PENDING_PROOF_REQUEST: { text: requestProofText, - href: `${basePath}/request-proof-of-template/${template.id}?lockNumber=${template.lockNumber}`, + href: interpolate(links.requestProofOfTemplate, { + basePath, + templateId: template.id, + lockNumber: template.lockNumber, + }), }, } satisfies Partial>; @@ -71,7 +96,7 @@ export function PreviewLetterTemplate({ return ( <> - + {backLinkText} @@ -159,7 +184,54 @@ export function PreviewLetterTemplate({ )}

- {backLinkText} + {backLinkText} +

+
+
+ + + ); +} + +function PreviewAuthoringLetterTemplate({ + template, +}: Readonly<{ template: AuthoringLetterTemplate }>) { + const { + backLinkText, + links, + validationError, + validationErrorAction, + virusScanError, + virusScanErrorAction, + } = content.components.previewLetterTemplate; + + const errors: string[] = []; + if (template.templateStatus === 'VIRUS_SCAN_FAILED') { + errors.push(virusScanError, virusScanErrorAction); + } + + if (template.templateStatus === 'VALIDATION_FAILED') { + errors.push(validationError, validationErrorAction); + } + + return ( + <> + + {backLinkText} + + +
+
+ {errors.length > 0 && ( + + )} + +

+ {backLinkText}

diff --git a/frontend/src/content/content.ts b/frontend/src/content/content.ts index 0ea068e0d..9208ffafb 100644 --- a/frontend/src/content/content.ts +++ b/frontend/src/content/content.ts @@ -537,6 +537,13 @@ const previewLetterTemplate = { 'After you submit your template, our service team will send you a proof by email instead.', text3: 'This email will tell you what to do next.', }, + links: { + messageTemplates: '/message-templates', + submitLetterTemplate: + '{{basePath}}/submit-letter-template/{{templateId}}?lockNumber={{lockNumber}}', + requestProofOfTemplate: + '{{basePath}}/request-proof-of-template/{{templateId}}?lockNumber={{lockNumber}}', + }, }; const previewNHSAppTemplate = { @@ -602,8 +609,34 @@ const previewTemplateDetails = { campaignId: 'Campaign', templateProofFiles: 'Template proof files', templateStatus: 'Status', - templateType: 'Type', + templateType: 'Template type', examplePersonalisationFile: 'Example personalisation file', + letterType: 'Letter type', + sidesCount: 'Number of sides', + totalPages: 'Total pages', + sheets: 'Sheets', + printingAndPostage: 'Printing and postage', + }, + actions: { + editName: 'Edit name', + edit: 'Edit', + learnMore: 'Learn more', + }, + visuallyHidden: { + campaign: 'campaign', + sheets: 'about sheets', + printingAndPostage: 'printing and postage', + status: 'about status', + }, + externalLinks: { + lettersPricing: 'https://notify.nhs.uk/pricing-and-commercial/letters', + templateStatuses: + 'https://notify.nhs.uk/templates/what-template-statuses-mean', + }, + links: { + editTemplateName: '/edit-template-name/{{templateId}}', + editTemplateCampaign: '/edit-template-campaign/{{templateId}}', + choosePrintingAndPostage: '/choose-printing-and-postage/{{templateId}}', }, previewTemplateStatusFootnote, headerCaption: 'Template', diff --git a/frontend/src/styles/app.scss b/frontend/src/styles/app.scss index 7df9fb88e..57c31e281 100644 --- a/frontend/src/styles/app.scss +++ b/frontend/src/styles/app.scss @@ -141,3 +141,8 @@ a.nhsuk-link--no-visited-state { .fit-content { width: fit-content; } + +.missing-value { + background-color: var(--nhsuk-pale-yellow-colour); + box-shadow: inset 0 0 0 3px var(--nhsuk-yellow-colour); +} diff --git a/infrastructure/terraform/modules/backend-api/spec.tmpl.json b/infrastructure/terraform/modules/backend-api/spec.tmpl.json index e6d1c7c57..504c2b3ac 100644 --- a/infrastructure/terraform/modules/backend-api/spec.tmpl.json +++ b/infrastructure/terraform/modules/backend-api/spec.tmpl.json @@ -22,7 +22,6 @@ } }, "required": [ - "letterVariantId", "letterVersion", "sidesCount" ], diff --git a/lambdas/backend-client/src/__tests__/schemas/template.test.ts b/lambdas/backend-client/src/__tests__/schemas/template.test.ts index 0dc14499c..97d2a60a4 100644 --- a/lambdas/backend-client/src/__tests__/schemas/template.test.ts +++ b/lambdas/backend-client/src/__tests__/schemas/template.test.ts @@ -329,7 +329,6 @@ describe('Template schemas', () => { expect(result.success).toBe(false); expect(result.error?.flatten().fieldErrors).toEqual( expect.objectContaining({ - letterVariantId: expect.any(Array), sidesCount: expect.any(Array), }) ); diff --git a/lambdas/backend-client/src/schemas/template.ts b/lambdas/backend-client/src/schemas/template.ts index b16e2d49e..e58f4d378 100644 --- a/lambdas/backend-client/src/schemas/template.ts +++ b/lambdas/backend-client/src/schemas/template.ts @@ -114,7 +114,7 @@ export const $AuthoringLetterProperties = schemaFor()( z.object({ ...$BaseLetterTemplateProperties.shape, - letterVariantId: z.string(), + letterVariantId: z.string().optional(), letterVersion: z.literal('AUTHORING'), sidesCount: z.number().int(), }) diff --git a/lambdas/backend-client/src/types/generated/types.gen.ts b/lambdas/backend-client/src/types/generated/types.gen.ts index 556f91b11..1006e804e 100644 --- a/lambdas/backend-client/src/types/generated/types.gen.ts +++ b/lambdas/backend-client/src/types/generated/types.gen.ts @@ -5,7 +5,7 @@ export type ClientOptions = { }; export type AuthoringLetterProperties = BaseLetterTemplateProperties & { - letterVariantId: string; + letterVariantId?: string; letterVersion: 'AUTHORING'; sidesCount: number; }; diff --git a/package-lock.json b/package-lock.json index c707c46ef..a47557758 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/jest": "^29.5.14", + "@types/node": "^22.19.8", "@typescript-eslint/eslint-plugin": "^8.27.0", "@typescript-eslint/parser": "^8.27.0", "esbuild": "^0.25.9", @@ -108,7 +109,6 @@ "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.9", "@types/markdown-it": "^13.0.9", - "@types/node": "^22.13.12", "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "constructs": "^10.4.2", @@ -126,16 +126,6 @@ "whatwg-fetch": "^3.6.20" } }, - "frontend/node_modules/@types/node": { - "version": "22.19.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz", - "integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, "lambdas/authorizer": { "name": "nhs-notify-templates-api-authorizer", "version": "0.0.1", @@ -11901,20 +11891,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "version": "22.19.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.8.tgz", + "integrity": "sha512-ebO/Yl+EAvVe8DnMfi+iaAyIqYdK0q/q0y0rw82INWEKJOBe6b/P3YWE8NW7oOlF/nXFNrHwhARrN/hdgDkraA==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~6.21.0" } }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -26850,7 +26834,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -27645,7 +27628,7 @@ }, "packages/event-schemas": { "name": "@nhsdigital/nhs-notify-event-schemas-template-management", - "version": "1.4.2", + "version": "1.4.3", "license": "MIT", "dependencies": { "zod": "^4.0.17" diff --git a/package.json b/package.json index 54fa3adec..d7d4a590b 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/jest": "^29.5.14", + "@types/node": "^22.19.8", "@typescript-eslint/eslint-plugin": "^8.27.0", "@typescript-eslint/parser": "^8.27.0", "esbuild": "^0.25.9", diff --git a/tests/test-team/helpers/factories/template-factory.ts b/tests/test-team/helpers/factories/template-factory.ts index e98dd2c3f..23502cec7 100644 --- a/tests/test-team/helpers/factories/template-factory.ts +++ b/tests/test-team/helpers/factories/template-factory.ts @@ -107,10 +107,18 @@ export const TemplateFactory = { options?: { letterType?: LetterType; language?: Language; + sidesCount?: number; + letterVariantId?: string; + campaignId?: string | null; } ): Template => { + const campaignId = + options?.campaignId === null + ? undefined + : (options?.campaignId ?? 'campaign-id'); + return TemplateFactory.create({ - campaignId: 'campaign-id', + ...(campaignId && { campaignId }), clientId: user.clientId, id, language: options?.language || 'en', @@ -121,6 +129,8 @@ export const TemplateFactory = { templateStatus, templateType: 'LETTER', proofingEnabled: true, + sidesCount: options?.sidesCount ?? 2, + letterVariantId: options?.letterVariantId, }); }, diff --git a/tests/test-team/helpers/types.ts b/tests/test-team/helpers/types.ts index 90722c4bb..b1ef2cadf 100644 --- a/tests/test-team/helpers/types.ts +++ b/tests/test-team/helpers/types.ts @@ -58,6 +58,8 @@ type TypeSpecificProperties = { testDataCsvHeaders?: string[]; campaignId?: string; supplierReferences?: Record; + sidesCount?: number; + letterVariantId?: string; }; export type CreateTemplatePayload = TypeSpecificProperties & { diff --git a/tests/test-team/pages/letter/template-mgmt-preview-letter-page.ts b/tests/test-team/pages/letter/template-mgmt-preview-letter-page.ts index 39b685eb5..516a0de0f 100644 --- a/tests/test-team/pages/letter/template-mgmt-preview-letter-page.ts +++ b/tests/test-team/pages/letter/template-mgmt-preview-letter-page.ts @@ -10,17 +10,27 @@ export class TemplateMgmtPreviewLetterPage extends TemplateMgmtPreviewBasePage { public readonly errorSummary: Locator; public readonly continueButton: Locator; - public readonly pdfLinks: Locator; - public readonly campaignId: Locator; public readonly statusTag: Locator; + // PDF letter specific + public readonly pdfLinks: Locator; + + // AUTHORING letter specific + public readonly editNameLink: Locator; + public readonly sheetsAction: Locator; + public readonly statusAction: Locator; + public readonly campaignAction: Locator; + constructor(page: Page) { super(page); this.errorSummary = page.locator('[class="nhsuk-error-summary"]'); this.continueButton = page.locator('[id="preview-letter-template-cta"]'); + this.statusTag = page.getByTestId('status-tag'); this.pdfLinks = page.locator('[data-testid^="proof-link"]'); - this.campaignId = page.locator('[id="campaign-id"]'); - this.statusTag = page.locator('[data-testid="status-tag"]'); + this.editNameLink = page.getByTestId('edit-name-link'); + this.sheetsAction = page.getByTestId('sheets-action'); + this.statusAction = page.getByTestId('status-action'); + this.campaignAction = page.getByTestId('campaign-action'); } async clickContinueButton() { diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-letter-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-letter-page.component.spec.ts index 54b7c2e0a..45dff092f 100644 --- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-letter-page.component.spec.ts +++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-letter-page.component.spec.ts @@ -5,14 +5,14 @@ import { Template } from '../../helpers/types'; import { createAuthHelper, testUsers, + type TestUser, } from '../../helpers/auth/cognito-auth-helper'; import { TemplateMgmtPreviewLetterPage } from '../../pages/letter/template-mgmt-preview-letter-page'; import { TemplateMgmtSubmitLetterPage } from '../../pages/letter/template-mgmt-submit-letter-page'; import { TemplateMgmtRequestProofPage } from '../../pages/template-mgmt-request-proof-page'; +import { loginAsUser } from '../../helpers/auth/login-as-user'; -async function createTemplates() { - const user = await createAuthHelper().getTestUser(testUsers.User1.userId); - +async function createTemplates(user: TestUser) { const withProofsBase = TemplateFactory.uploadLetterTemplate( 'C8814A1D-1F3A-4AE4-9FE3-BDDA76EADF0C', user, @@ -105,6 +105,33 @@ async function createTemplates() { id: '321B92CF-AECC-4938-B4CA-B00E4797327A', }, withProofs, + authoringInvalid: { + id: 'preview-page-invalid-authoring-letter', + version: 1, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + templateType: 'LETTER', + templateStatus: 'NOT_YET_SUBMITTED', + owner: `CLIENT#${user.clientId}`, + letterVersion: 'AUTHORING', + lockNumber: 0, + name: 'empty-authoring-letter', + // Missing sidesCount - should be invalid + } as Template, + authoringValid: TemplateFactory.createAuthoringLetterTemplate( + 'A1B2C3D4-E5F6-7890-ABCD-EF1234567890', + user, + 'authoring-letter-valid', + 'NOT_YET_SUBMITTED', + { sidesCount: 4, letterVariantId: 'variant-123' } + ), + authoringNoCampaign: TemplateFactory.createAuthoringLetterTemplate( + 'B2C3D4E5-F6A7-8901-BCDE-F23456789012', + user, + 'authoring-letter-no-campaign', + 'NOT_YET_SUBMITTED', + { sidesCount: 4, letterVariantId: 'variant-456', campaignId: null } + ), }; } @@ -114,7 +141,8 @@ test.describe('Preview Letter template Page', () => { const templateStorageHelper = new TemplateStorageHelper(); test.beforeAll(async () => { - templates = await createTemplates(); + const user = await createAuthHelper().getTestUser(testUsers.User1.userId); + templates = await createTemplates(user); await templateStorageHelper.seedTemplateData(Object.values(templates)); }); @@ -377,4 +405,120 @@ test.describe('Preview Letter template Page', () => { ); }); }); + + test.describe('AUTHORING letter', () => { + test('when user visits page, then page is loaded with template details', async ({ + page, + baseURL, + }) => { + const previewPage = new TemplateMgmtPreviewLetterPage(page).setPathParam( + 'templateId', + templates.authoringValid.id + ); + + await previewPage.loadPage(); + + await expect(page).toHaveURL( + `${baseURL}/templates/preview-letter-template/${templates.authoringValid.id}` + ); + + await expect(previewPage.pageHeading).toContainText( + templates.authoringValid.name + ); + + await expect(previewPage.templateId).toContainText( + templates.authoringValid.id + ); + + await expect(previewPage.editNameLink).toBeVisible(); + + await expect(previewPage.statusTag).toBeVisible(); + }); + + test('when user visits page with missing data, then an invalid template error is displayed', async ({ + baseURL, + page, + }) => { + const previewPage = new TemplateMgmtPreviewLetterPage(page).setPathParam( + 'templateId', + templates.authoringInvalid.id + ); + + await previewPage.loadPage(); + + await expect(page).toHaveURL(`${baseURL}/templates/invalid-template`); + }); + + test('shows campaign Edit link when template has no campaignId', async ({ + page, + }) => { + const previewPage = new TemplateMgmtPreviewLetterPage(page).setPathParam( + 'templateId', + templates.authoringNoCampaign.id + ); + + await previewPage.loadPage(); + + await expect(previewPage.campaignAction).toBeVisible(); + await expect(previewPage.campaignAction).toHaveText(/Edit/); + }); + + test('hides campaign Edit link when template has campaignId (single-campaign client)', async ({ + page, + }) => { + const previewPage = new TemplateMgmtPreviewLetterPage(page).setPathParam( + 'templateId', + templates.authoringValid.id + ); + + await previewPage.loadPage(); + + await expect(previewPage.campaignAction).toBeHidden(); + }); + + test.describe('multi-campaign client', () => { + test.use({ storageState: { cookies: [], origins: [] } }); + + const multiCampaignTemplateStorageHelper = new TemplateStorageHelper(); + let userWithMultipleCampaigns: TestUser; + let multiCampaignTemplate: Template; + + test.beforeAll(async () => { + userWithMultipleCampaigns = await createAuthHelper().getTestUser( + testUsers.UserWithMultipleCampaigns.userId + ); + + multiCampaignTemplate = TemplateFactory.createAuthoringLetterTemplate( + 'C3D4E5F6-A7B8-9012-CDEF-345678901234', + userWithMultipleCampaigns, + 'authoring-letter-multi-campaign', + 'NOT_YET_SUBMITTED', + { sidesCount: 4, letterVariantId: 'variant-789' } + ); + + await multiCampaignTemplateStorageHelper.seedTemplateData([ + multiCampaignTemplate, + ]); + }); + + test.afterAll(async () => { + await multiCampaignTemplateStorageHelper.deleteSeededTemplates(); + }); + + test('shows campaign Edit link when template has campaignId', async ({ + page, + }) => { + await loginAsUser(userWithMultipleCampaigns, page); + + const previewPage = new TemplateMgmtPreviewLetterPage( + page + ).setPathParam('templateId', multiCampaignTemplate.id); + + await previewPage.loadPage(); + + await expect(previewPage.campaignAction).toBeVisible(); + await expect(previewPage.campaignAction).toHaveText(/Edit/); + }); + }); + }); }); 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 4d38d0b8e..1e45a00a1 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 @@ -39,8 +39,16 @@ function createTemplates(user: TestUser) { }, }; + const authoringValid = TemplateFactory.createAuthoringLetterTemplate( + 'e8b5f3a1-2c4d-4e6f-8a9b-1c2d3e4f5a6b', + user, + 'authoring-letter-template-preview-submitted', + 'SUBMITTED' + ); + return { valid, + authoringValid, invalid: { ...TemplateFactory.uploadLetterTemplate( '621456cf-ace3-49c3-941e-4df5eba11373', @@ -53,7 +61,7 @@ function createTemplates(user: TestUser) { } test.describe('Preview submitted Letter message template Page', () => { - let templates: Record; + let templates: ReturnType; const templateStorageHelper = new TemplateStorageHelper(); test.beforeAll(async () => { @@ -66,39 +74,74 @@ test.describe('Preview submitted Letter message template Page', () => { await templateStorageHelper.deleteSeededTemplates(); }); - test('when user visits page, then page is loaded', async ({ - page, - baseURL, - }) => { - const previewSubmittedLetterTemplatePage = - new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam( - 'templateId', - templates.valid.id + test.describe('PDF letter', () => { + test('when user visits page, then page is loaded', async ({ + page, + baseURL, + }) => { + const previewSubmittedLetterTemplatePage = + new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam( + 'templateId', + templates.valid.id + ); + + await previewSubmittedLetterTemplatePage.loadPage(); + + await expect(page).toHaveURL( + `${baseURL}/templates/preview-submitted-letter-template/${templates.valid.id}` ); - await previewSubmittedLetterTemplatePage.loadPage(); + await expect( + previewSubmittedLetterTemplatePage.pageHeading + ).toContainText(templates.valid.name); - await expect(page).toHaveURL( - `${baseURL}/templates/preview-submitted-letter-template/${templates.valid.id}` - ); + expect(templates.valid.campaignId).toBeTruthy(); - await expect(previewSubmittedLetterTemplatePage.pageHeading).toContainText( - templates.valid.name - ); + await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText( + templates.valid.campaignId! + ); - if (!templates.valid.campaignId) { - throw new Error('Test data misconfiguration'); - } + await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText( + 'Locked' + ); - await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText( - templates.valid.campaignId - ); + await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0); + }); + }); - await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText( - 'Locked' - ); + test.describe('AUTHORING letter', () => { + test('when user visits page, then page is loaded with template details', async ({ + page, + baseURL, + }) => { + const previewSubmittedLetterTemplatePage = + new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam( + 'templateId', + templates.authoringValid.id + ); + + await previewSubmittedLetterTemplatePage.loadPage(); - await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0); + await expect(page).toHaveURL( + `${baseURL}/templates/preview-submitted-letter-template/${templates.authoringValid.id}` + ); + + await expect( + previewSubmittedLetterTemplatePage.pageHeading + ).toContainText(templates.authoringValid.name); + + expect(templates.authoringValid.campaignId).toBeTruthy(); + + await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText( + templates.authoringValid.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-routing-component-tests/letter/preview-large-print-letter-template.routing-component.spec.ts b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-large-print-letter-template.routing-component.spec.ts index 20ad9db17..926de5e5e 100644 --- a/tests/test-team/template-mgmt-routing-component-tests/letter/preview-large-print-letter-template.routing-component.spec.ts +++ b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-large-print-letter-template.routing-component.spec.ts @@ -54,6 +54,13 @@ function createTemplates(user: TestUser) { 'PASSED', { letterType: 'x1' } ), + AUTHORING_LARGE_PRINT_LETTER: TemplateFactory.createAuthoringLetterTemplate( + randomUUID(), + user, + 'Authoring large print letter template name', + 'SUBMITTED', + { letterType: 'x1' } + ), }; } @@ -150,16 +157,10 @@ test.describe('Routing - Preview large print letter template page', () => { await expect(previewLargePrintLetterTemplatePage.summaryList).toBeVisible(); - if ( - !templates.LARGE_PRINT_LETTER.campaignId || - !templates.LARGE_PRINT_LETTER.files?.pdfTemplate?.fileName || - !templates.LARGE_PRINT_LETTER.files?.testDataCsv?.fileName - ) { - throw new Error('Test data misconfiguration'); - } + expect(templates.LARGE_PRINT_LETTER.campaignId).toBeTruthy(); await expect(previewLargePrintLetterTemplatePage.campaignId).toContainText( - templates.LARGE_PRINT_LETTER.campaignId + templates.LARGE_PRINT_LETTER.campaignId! ); await expect( @@ -171,6 +172,44 @@ test.describe('Routing - Preview large print letter template page', () => { ).toBeVisible(); }); + test('loads the AUTHORING large print letter template', async ({ + page, + baseURL, + }) => { + const previewLargePrintLetterTemplatePage = + new RoutingPreviewLargePrintLetterTemplatePage(page); + await previewLargePrintLetterTemplatePage + .setPathParam('messagePlanId', messagePlans.LETTER_ROUTING_CONFIG.id) + .setPathParam('templateId', templates.AUTHORING_LARGE_PRINT_LETTER.id) + .setSearchParam('lockNumber', '0') + .loadPage(); + + await expect(page).toHaveURL( + `${baseURL}/templates/message-plans/choose-large-print-letter-template/${messagePlans.LETTER_ROUTING_CONFIG.id}/preview-template/${templates.AUTHORING_LARGE_PRINT_LETTER.id}?lockNumber=0` + ); + + await expect( + previewLargePrintLetterTemplatePage.templateCaption + ).toContainText('Template'); + + await expect(previewLargePrintLetterTemplatePage.pageHeading).toContainText( + templates.AUTHORING_LARGE_PRINT_LETTER.name + ); + + await expect(previewLargePrintLetterTemplatePage.templateId).toBeVisible(); + await expect(previewLargePrintLetterTemplatePage.templateId).toContainText( + templates.AUTHORING_LARGE_PRINT_LETTER.id + ); + + await expect(previewLargePrintLetterTemplatePage.summaryList).toBeVisible(); + + expect(templates.AUTHORING_LARGE_PRINT_LETTER.campaignId).toBeTruthy(); + + await expect(previewLargePrintLetterTemplatePage.campaignId).toContainText( + templates.AUTHORING_LARGE_PRINT_LETTER.campaignId! + ); + }); + test.describe('redirects to invalid template page', () => { test('when template cannot be found', async ({ page, baseURL }) => { const previewLargePrintLetterTemplatePage = diff --git a/tests/test-team/template-mgmt-routing-component-tests/letter/preview-other-language-letter-template.routing-component.spec.ts b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-other-language-letter-template.routing-component.spec.ts index 24c6d9611..607482888 100644 --- a/tests/test-team/template-mgmt-routing-component-tests/letter/preview-other-language-letter-template.routing-component.spec.ts +++ b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-other-language-letter-template.routing-component.spec.ts @@ -29,6 +29,7 @@ const templateIds = { EMAIL: randomUUID(), STANDARD_LETTER: randomUUID(), FRENCH_LETTER: randomUUID(), + AUTHORING_FRENCH_LETTER: randomUUID(), }; function createMessagePlans(user: TestUser) { @@ -60,6 +61,13 @@ function createTemplates(user: TestUser) { 'PASSED', { language: 'fr' } ), + AUTHORING_FRENCH_LETTER: TemplateFactory.createAuthoringLetterTemplate( + templateIds.AUTHORING_FRENCH_LETTER, + user, + 'Authoring French letter template name', + 'SUBMITTED', + { language: 'fr' } + ), }; } @@ -168,17 +176,11 @@ test.describe('Routing - Preview foreign language letter template page', () => { previewForeignLanguageLetterTemplatePage.summaryList ).toBeVisible(); - if ( - !templates.FRENCH_LETTER.campaignId || - !templates.FRENCH_LETTER.files?.pdfTemplate?.fileName || - !templates.FRENCH_LETTER.files?.testDataCsv?.fileName - ) { - throw new Error('Test data misconfiguration'); - } + expect(templates.FRENCH_LETTER.campaignId).toBeTruthy(); await expect( previewForeignLanguageLetterTemplatePage.campaignId - ).toContainText(templates.FRENCH_LETTER.campaignId); + ).toContainText(templates.FRENCH_LETTER.campaignId!); await expect( page.getByText(templates.FRENCH_LETTER.files!.pdfTemplate!.fileName) @@ -189,6 +191,49 @@ test.describe('Routing - Preview foreign language letter template page', () => { ).toBeVisible(); }); + test('loads the AUTHORING foreign language letter template', async ({ + page, + baseURL, + }) => { + const previewForeignLanguageLetterTemplatePage = + new RoutingPreviewOtherLanguageLetterTemplatePage(page) + .setPathParam('messagePlanId', messagePlans.LETTER_ROUTING_CONFIG.id) + .setPathParam('templateId', templates.AUTHORING_FRENCH_LETTER.id) + .setSearchParam('lockNumber', '0'); + await previewForeignLanguageLetterTemplatePage.loadPage(); + await expect(page).toHaveURL( + `${baseURL}/templates/message-plans/choose-other-language-letter-template/${messagePlans.LETTER_ROUTING_CONFIG.id}/preview-template/${templates.AUTHORING_FRENCH_LETTER.id}?lockNumber=0` + ); + + await expect( + previewForeignLanguageLetterTemplatePage.templateCaption + ).toBeVisible(); + await expect( + previewForeignLanguageLetterTemplatePage.templateCaption + ).toContainText('Template'); + + await expect( + previewForeignLanguageLetterTemplatePage.pageHeading + ).toContainText(templates.AUTHORING_FRENCH_LETTER.name); + + await expect( + previewForeignLanguageLetterTemplatePage.templateId + ).toBeVisible(); + await expect( + previewForeignLanguageLetterTemplatePage.templateId + ).toContainText(templates.AUTHORING_FRENCH_LETTER.id); + + await expect( + previewForeignLanguageLetterTemplatePage.summaryList + ).toBeVisible(); + + expect(templates.AUTHORING_FRENCH_LETTER.campaignId).toBeTruthy(); + + await expect( + previewForeignLanguageLetterTemplatePage.campaignId + ).toContainText(templates.AUTHORING_FRENCH_LETTER.campaignId!); + }); + test.describe('redirects to invalid template page', () => { test('when template cannot be found', async ({ page, baseURL }) => { const previewForeignLanguageLetterTemplatePage = diff --git a/tests/test-team/template-mgmt-routing-component-tests/letter/preview-standard-letter-template.routing-component.spec.ts b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-standard-letter-template.routing-component.spec.ts index 4b2c4d3f7..7915bbd79 100644 --- a/tests/test-team/template-mgmt-routing-component-tests/letter/preview-standard-letter-template.routing-component.spec.ts +++ b/tests/test-team/template-mgmt-routing-component-tests/letter/preview-standard-letter-template.routing-component.spec.ts @@ -46,6 +46,11 @@ function createTemplates(user: TestUser) { user, 'Letter template name' ), + AUTHORING_LETTER: TemplateFactory.createAuthoringLetterTemplate( + randomUUID(), + user, + 'Authoring letter template name' + ), }; } @@ -102,16 +107,10 @@ test.describe('Routing - Preview Letter template page', () => { templates.LETTER.name ); - if ( - !templates.LETTER.campaignId || - !templates.LETTER.files?.pdfTemplate?.fileName || - !templates.LETTER.files?.testDataCsv?.fileName - ) { - throw new Error('Test data misconfiguration'); - } + expect(templates.LETTER.campaignId).toBeTruthy(); await expect(previewLetterTemplatePage.campaignId).toContainText( - templates.LETTER.campaignId + templates.LETTER.campaignId! ); await expect( @@ -123,6 +122,37 @@ test.describe('Routing - Preview Letter template page', () => { ).toBeVisible(); }); + test('loads the AUTHORING letter template', async ({ page, baseURL }) => { + const previewLetterTemplatePage = + new RoutingPreviewStandardLetterTemplatePage(page) + .setPathParam('messagePlanId', messagePlans.LETTER_ROUTING_CONFIG.id) + .setPathParam('templateId', templates.AUTHORING_LETTER.id) + .setSearchParam('lockNumber', '0'); + + await previewLetterTemplatePage.loadPage(); + + await expect(page).toHaveURL( + `${baseURL}/templates/message-plans/choose-standard-english-letter-template/${messagePlans.LETTER_ROUTING_CONFIG.id}/preview-template/${templates.AUTHORING_LETTER.id}?lockNumber=0` + ); + + await expect(previewLetterTemplatePage.pageHeading).toContainText( + templates.AUTHORING_LETTER.name + ); + + expect(templates.AUTHORING_LETTER.campaignId).toBeTruthy(); + + await expect(previewLetterTemplatePage.campaignId).toContainText( + templates.AUTHORING_LETTER.campaignId! + ); + + await expect(previewLetterTemplatePage.templateId).toBeVisible(); + await expect(previewLetterTemplatePage.templateId).toContainText( + templates.AUTHORING_LETTER.id + ); + + await expect(previewLetterTemplatePage.summaryList).toBeVisible(); + }); + test.describe('redirects to invalid template page', () => { test('when template cannot be found', async ({ page, baseURL }) => { const previewLetterTemplatePage = diff --git a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap index 41da43eee..ca7e6d761 100644 --- a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap +++ b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap @@ -1,353 +1,441 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`statusToColourMapping status=DELETED type=EMAIL routing=false 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=EMAIL routing=false letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=EMAIL routing=true 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=EMAIL routing=true letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=LETTER routing=false 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=LETTER routing=false letterVersion=AUTHORING 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=LETTER routing=true 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=LETTER routing=false letterVersion=PDF 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=NHS_APP routing=false 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=LETTER routing=true letterVersion=AUTHORING 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=NHS_APP routing=true 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=LETTER routing=true letterVersion=PDF 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=SMS routing=false 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=NHS_APP routing=false letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=DELETED type=SMS routing=true 1`] = `undefined`; +exports[`statusToColourMapping status=DELETED type=NHS_APP routing=true letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=DELETED type=SMS routing=false letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=DELETED type=SMS routing=true letterVersion=undefined 1`] = `undefined`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `undefined`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `undefined`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"yellow"`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=false letterVersion=PDF 1`] = `undefined`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"yellow"`; -exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=true letterVersion=PDF 1`] = `undefined`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=false letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=false letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=true letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=true letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"blue"`; +exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=EMAIL routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=EMAIL routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=false letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=false letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=NHS_APP routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=true letterVersion=AUTHORING 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=NHS_APP routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=true letterVersion=PDF 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=SMS routing=false 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_APPROVED type=SMS routing=true 1`] = `"green"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"orange"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=false letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"orange"`; +exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=true letterVersion=undefined 1`] = `"blue"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=EMAIL routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=EMAIL routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"green"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=PDF 1`] = `"green"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"green"`; -exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"orange"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=PDF 1`] = `"green"`; -exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"grey"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=NHS_APP routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"pink"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=NHS_APP routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=false 1`] = `"grey"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=SMS routing=false letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=true 1`] = `"pink"`; +exports[`statusToColourMapping status=PROOF_APPROVED type=SMS routing=true letterVersion=undefined 1`] = `"green"`; -exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"grey"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=false letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"pink"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=true letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=SUBMITTED type=SMS routing=false 1`] = `"grey"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=false letterVersion=AUTHORING 1`] = `"orange"`; -exports[`statusToColourMapping status=SUBMITTED type=SMS routing=true 1`] = `"pink"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=false letterVersion=PDF 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=true letterVersion=AUTHORING 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=true letterVersion=PDF 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=false letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=true letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=false letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=true letterVersion=undefined 1`] = `"orange"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=false letterVersion=undefined 1`] = `"grey"`; -exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=true letterVersion=undefined 1`] = `"pink"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"grey"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=false letterVersion=PDF 1`] = `"grey"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"pink"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=true letterVersion=PDF 1`] = `"pink"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=false letterVersion=undefined 1`] = `"grey"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=true letterVersion=undefined 1`] = `"pink"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=SMS routing=false letterVersion=undefined 1`] = `"grey"`; -exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"red"`; +exports[`statusToColourMapping status=SUBMITTED type=SMS routing=true letterVersion=undefined 1`] = `"pink"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=false letterVersion=PDF 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=true letterVersion=PDF 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"yellow"`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=false 1`] = `""`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=true 1`] = `""`; +exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=LETTER routing=false 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=LETTER routing=true 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=false 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=true 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false letterVersion=PDF 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=SMS routing=false 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"red"`; -exports[`statusToDisplayMapping status=DELETED type=SMS routing=true 1`] = `""`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true letterVersion=PDF 1`] = `"red"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"Draft"`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"Draft"`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `"Not yet submitted"`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=false letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `"Not yet submitted"`; +exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=true letterVersion=undefined 1`] = `"red"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"Draft"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=false letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"Draft"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=true letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"Draft"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=false letterVersion=AUTHORING 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"Draft"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=false letterVersion=PDF 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=true letterVersion=AUTHORING 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=true letterVersion=PDF 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=false letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"Files uploaded"`; +exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=true letterVersion=undefined 1`] = `"yellow"`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"Files uploaded"`; +exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=false letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"Files uploaded"`; +exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=true letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=false letterVersion=AUTHORING 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=false letterVersion=PDF 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=true letterVersion=AUTHORING 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=LETTER routing=true letterVersion=PDF 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=false letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=true letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=SMS routing=false letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=DELETED type=SMS routing=true letterVersion=undefined 1`] = `""`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Approval needed"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=false letterVersion=PDF 1`] = `"Not yet submitted"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Approval needed"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=true letterVersion=PDF 1`] = `"Not yet submitted"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"Checking files"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=false 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=false letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=true 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=true letterVersion=undefined 1`] = `"Draft"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=NHS_APP routing=false 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=NHS_APP routing=true 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false letterVersion=PDF 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=SMS routing=false 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_APPROVED type=SMS routing=true 1`] = `"Proof approved"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true letterVersion=PDF 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=false letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=true letterVersion=undefined 1`] = `"Files uploaded"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"Proof available"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=false letterVersion=PDF 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"Submitted"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"Locked"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=true letterVersion=PDF 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=false 1`] = `"Submitted"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=true 1`] = `"Locked"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"Submitted"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"Locked"`; +exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=false 1`] = `"Submitted"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=true 1`] = `"Locked"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=false letterVersion=PDF 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=true letterVersion=PDF 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=false letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=true letterVersion=undefined 1`] = `"Checking files"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=false letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=true letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=PDF 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=PDF 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=NHS_APP routing=false letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"Checks failed"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=NHS_APP routing=true letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=SMS routing=false letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_APPROVED type=SMS routing=true letterVersion=undefined 1`] = `"Proof approved"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=false letterVersion=undefined 1`] = `"Proof available"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=true letterVersion=undefined 1`] = `"Proof available"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Proof available"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=false letterVersion=PDF 1`] = `"Proof available"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Proof available"`; -exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"Waiting for proof"`; +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=true letterVersion=PDF 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=false letterVersion=undefined 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=true letterVersion=undefined 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=false letterVersion=undefined 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=true letterVersion=undefined 1`] = `"Proof available"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=false letterVersion=undefined 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=true letterVersion=undefined 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=false letterVersion=PDF 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=true letterVersion=PDF 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=false letterVersion=undefined 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=true letterVersion=undefined 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=false letterVersion=undefined 1`] = `"Submitted"`; + +exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=true letterVersion=undefined 1`] = `"Locked"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=false letterVersion=PDF 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=true letterVersion=PDF 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false letterVersion=PDF 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true letterVersion=PDF 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=false letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=true letterVersion=undefined 1`] = `"Checks failed"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=false letterVersion=undefined 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=true letterVersion=undefined 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=false letterVersion=PDF 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=true letterVersion=PDF 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false letterVersion=undefined 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true letterVersion=undefined 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=false letterVersion=undefined 1`] = `"Waiting for proof"`; + +exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=true letterVersion=undefined 1`] = `"Waiting for proof"`; diff --git a/utils/utils/src/__tests__/enum.test.ts b/utils/utils/src/__tests__/enum.test.ts index 27a544eb8..5f2c91842 100644 --- a/utils/utils/src/__tests__/enum.test.ts +++ b/utils/utils/src/__tests__/enum.test.ts @@ -2,10 +2,11 @@ import { Language, LetterType, - TEMPLATE_TYPE_LIST, TEMPLATE_STATUS_LIST, TemplateStatus, TemplateType, + LetterVersion, + TEMPLATE_TYPE_LIST, } from 'nhs-notify-backend-client'; import { alphabeticalLanguageList, @@ -118,27 +119,52 @@ 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, - ] +type StatusCase = [ + status: TemplateStatus, + type: TemplateType, + routing: boolean, + letterVersion: LetterVersion | undefined, +]; + +const letterVersions = ['PDF', 'AUTHORING'] as const; +const routingOptions = [true, false] as const; +const digitalChannels = TEMPLATE_TYPE_LIST.filter((t) => t !== 'LETTER'); + +const LETTER_STATUS_CASES: StatusCase[] = TEMPLATE_STATUS_LIST.flatMap( + (status) => + letterVersions.flatMap((version) => + routingOptions.map( + (routingFlag): StatusCase => [ + status, + 'LETTER' as const, + routingFlag, + version, + ] + ) ) - ) ); +const TEMPLATE_STATUS_CASES: StatusCase[] = [ + ...TEMPLATE_STATUS_LIST.flatMap((status) => + digitalChannels.flatMap((type) => + routingOptions.map( + (routingFlag): StatusCase => [status, type, routingFlag, undefined] + ) + ) + ), + ...LETTER_STATUS_CASES, +]; + describe('statusToDisplayMapping', () => { test.each(TEMPLATE_STATUS_CASES)( - 'status=%s type=%s routing=%s', - (status, type, routing) => { + 'status=%s type=%s routing=%s letterVersion=%s', + (status, type, routing, letterVersion) => { expect( statusToDisplayMapping( { templateType: type, templateStatus: status, + letterVersion, }, { routing } ) @@ -149,13 +175,14 @@ describe('statusToDisplayMapping', () => { describe('statusToColourMapping', () => { test.each(TEMPLATE_STATUS_CASES)( - 'status=%s type=%s routing=%s', - (status, type, routing) => { + 'status=%s type=%s routing=%s letterVersion=%s', + (status, type, routing, letterVersion) => { expect( statusToColourMapping( { templateType: type, templateStatus: status, + letterVersion, }, { routing } ) diff --git a/utils/utils/src/enum.ts b/utils/utils/src/enum.ts index 1562125a0..05085c7b1 100644 --- a/utils/utils/src/enum.ts +++ b/utils/utils/src/enum.ts @@ -7,6 +7,7 @@ import type { Channel, RoutingConfigStatus, ClientFeatures, + LetterVersion, } from 'nhs-notify-backend-client'; /** @@ -24,6 +25,12 @@ type LanguageMetadata = { rtl: boolean; }; +type PartialTemplate = { + templateType: TemplateType; + templateStatus: TemplateStatus; + letterVersion?: LetterVersion; +}; + const languageMap: Record = { ar: { name: 'Arabic', rtl: true }, bg: { name: 'Bulgarian', rtl: false }, @@ -123,13 +130,22 @@ export const templateTypeDisplayMappings = (type: TemplateType) => })[type]; export const statusToDisplayMapping = ( - template: Pick, + template: PartialTemplate, featureFlags: Pick ): string => { + const notYetSubmittedLetter = + template.letterVersion === 'AUTHORING' + ? 'Approval needed' + : 'Not yet submitted'; + + const notYetSubmitted = + template.templateType === 'LETTER' ? notYetSubmittedLetter : 'Draft'; + + const submitted = featureFlags.routing ? 'Locked' : 'Submitted'; + const statusToDisplayMappings: Record = { - NOT_YET_SUBMITTED: - template.templateType === 'LETTER' ? 'Not yet submitted' : 'Draft', - SUBMITTED: featureFlags.routing ? 'Locked' : 'Submitted', + NOT_YET_SUBMITTED: notYetSubmitted, + SUBMITTED: submitted, DELETED: '', // will not be shown in the UI PENDING_PROOF_REQUEST: 'Files uploaded', PENDING_UPLOAD: 'Checking files', @@ -158,12 +174,20 @@ type Colour = | undefined; export const statusToColourMapping = ( - template: Pick, + template: PartialTemplate, featureFlags: Pick ) => { + const notYetSubmittedLetter = + template.letterVersion === 'AUTHORING' ? 'yellow' : undefined; + + const notYetSubmitted = + template.templateType === 'LETTER' ? notYetSubmittedLetter : 'green'; + + const submitted = featureFlags.routing ? 'pink' : 'grey'; + const colourMappings: Record = { - NOT_YET_SUBMITTED: template.templateType === 'LETTER' ? undefined : 'green', - SUBMITTED: featureFlags.routing ? 'pink' : 'grey', + NOT_YET_SUBMITTED: notYetSubmitted, + SUBMITTED: submitted, DELETED: undefined, PENDING_PROOF_REQUEST: 'blue', PENDING_UPLOAD: 'blue',