({
template: initialState,
})}
- {initialState.templateType !== 'LETTER' && (
- {content.cannotEdit}
+ {!routing && (
+ <>
+ {initialState.templateType !== 'LETTER' && (
+ {content.cannotEdit}
+ )}
+ {content.createNewTemplate}
+ >
)}
- {content.createNewTemplate}
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss
index a8081d0d8..10f12b5de 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetails.module.scss
@@ -15,3 +15,11 @@
flex-direction: column;
gap: 6px;
}
+
+.warning_callout {
+ padding-top: 16px !important;
+
+ @media (min-width: 40.0625em) {
+ padding-top: 24px !important;
+ }
+}
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx
index 8acd66849..fa9a526be 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail.tsx
@@ -8,11 +8,13 @@ import {
ContentPreview,
DetailSection,
DetailsHeader,
+ LockedTemplateWarning,
StandardDetailRows,
} from './common';
import { Container } from 'nhsuk-react-components';
import concatClassNames from '@utils/concat-class-names';
import { renderEmailMarkdown } from '@utils/markdownit';
+import { useFeatureFlags } from '@providers/client-config-provider';
export default function PreviewTemplateDetailsEmail({
template,
@@ -21,12 +23,18 @@ export default function PreviewTemplateDetailsEmail({
template: EmailTemplate;
hideStatus?: boolean;
}) {
+ const features = useFeatureFlags();
const subject = template.subject;
const message = renderEmailMarkdown(template.message);
return (
<>
+
+ {features.routing && template.templateStatus === 'SUBMITTED' && (
+
+ )}
+
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx
index 236dfe20b..685f088cd 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx
@@ -7,10 +7,16 @@ import {
} from 'nhs-notify-web-template-management-utils';
import { Filename } from '@atoms/Filename/Filename';
import content from '@content/content';
-import { DetailSection, DetailsHeader, StandardDetailRows } from './common';
+import {
+ DetailSection,
+ DetailsHeader,
+ LockedTemplateWarning,
+ StandardDetailRows,
+} from './common';
import styles from './PreviewTemplateDetails.module.scss';
import { getBasePath } from '@utils/get-base-path';
import concatClassNames from '@utils/concat-class-names';
+import { useFeatureFlags } from '@providers/client-config-provider';
const { rowHeadings } = content.components.previewTemplateDetails;
@@ -21,6 +27,8 @@ export default function PreviewTemplateDetailsLetter({
template: LetterTemplate;
hideStatus?: boolean;
}) {
+ const features = useFeatureFlags();
+
const proofFilenames = Object.values(template.files.proofs ?? {})
.filter(({ virusScanStatus }) => virusScanStatus === 'PASSED')
.map(({ fileName }) => fileName);
@@ -34,6 +42,11 @@ export default function PreviewTemplateDetailsLetter({
return (
<>
+
+ {features.routing && template.templateStatus === 'SUBMITTED' && (
+
+ )}
+
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx
index a2bcef588..2b14f2c49 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp.tsx
@@ -8,11 +8,13 @@ import {
ContentPreview,
DetailSection,
DetailsHeader,
+ LockedTemplateWarning,
StandardDetailRows,
} from './common';
import { Container } from 'nhsuk-react-components';
import concatClassNames from '@utils/concat-class-names';
import { renderNHSAppMarkdown } from '@utils/markdownit';
+import { useFeatureFlags } from '@providers/client-config-provider';
export default function PreviewTemplateDetailsNhsApp({
template,
@@ -21,11 +23,17 @@ export default function PreviewTemplateDetailsNhsApp({
template: NHSAppTemplate;
hideStatus?: boolean;
}) {
+ const features = useFeatureFlags();
const message = renderNHSAppMarkdown(template.message);
return (
<>
+
+ {features.routing && template.templateStatus === 'SUBMITTED' && (
+
+ )}
+
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx
index 115defb09..661e7e323 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms.tsx
@@ -8,11 +8,13 @@ import {
ContentPreview,
DetailSection,
DetailsHeader,
+ LockedTemplateWarning,
StandardDetailRows,
} from './common';
import { Container } from 'nhsuk-react-components';
import concatClassNames from '@utils/concat-class-names';
import { renderSMSMarkdown } from '@utils/markdownit';
+import { useFeatureFlags } from '@providers/client-config-provider';
export default function PreviewTemplateDetailsSms({
template,
@@ -21,11 +23,17 @@ export default function PreviewTemplateDetailsSms({
template: SMSTemplate;
hideStatus?: boolean;
}) {
+ const features = useFeatureFlags();
const message = renderSMSMarkdown(template.message);
return (
<>
+
+ {features.routing && template.templateStatus === 'SUBMITTED' && (
+
+ )}
+
diff --git a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx
index b4e4fcde3..441070b03 100644
--- a/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateDetails/common.tsx
@@ -1,4 +1,4 @@
-import { Tag, SummaryList } from 'nhsuk-react-components';
+import { Tag, SummaryList, WarningCallout } from 'nhsuk-react-components';
import concatClassNames from '@utils/concat-class-names';
import {
statusToColourMapping,
@@ -10,6 +10,9 @@ import content from '@content/content';
import { TemplateDto } from 'nhs-notify-backend-client';
import classNames from 'classnames';
import { toKebabCase } from '@utils/kebab-case';
+import { useFeatureFlags } from '@providers/client-config-provider';
+import Link from 'next/link';
+import { interpolate } from '@utils/interpolate';
export type PreviewTemplateComponent = ({
template,
@@ -75,6 +78,7 @@ export function StandardDetailRows({
campaignId?: string;
hideStatus?: boolean;
}>): JSX.Element {
+ const features = useFeatureFlags();
return (
<>
@@ -101,10 +105,11 @@ export function StandardDetailRows({
{rowHeadings.templateStatus}
- {statusToDisplayMapping(template)}
+ {statusToDisplayMapping(template, features)}
{previewTemplateStatusFootnote[template.templateStatus] && (
);
}
+
+export function LockedTemplateWarning({ template }: { template: TemplateDto }) {
+ const features = useFeatureFlags();
+
+ const warningContent = content.components.lockedTemplateWarning;
+
+ return (
+
+
+ {statusToDisplayMapping(template, features)}
+
+
+
+ {template.templateType === 'LETTER'
+ ? warningContent.mainLetter
+ : warningContent.main}
+
+
+ {template.templateType !== 'LETTER' && (
+
+
+ {warningContent.copy.link.text}
+
+ {warningContent.copy.link.after}
+
+ )}
+
+ );
+}
diff --git a/frontend/src/content/content.ts b/frontend/src/content/content.ts
index 27b6f9f2d..2a641ca6d 100644
--- a/frontend/src/content/content.ts
+++ b/frontend/src/content/content.ts
@@ -1440,6 +1440,19 @@ const previewTemplateFromMessagePlan = {
},
};
+const lockedTemplateWarning = {
+ main: "You cannot edit or delete this template because it's used in a message plan that's in production.",
+ mainLetter:
+ "You cannot delete this template because it's used in a message plan that's in production.",
+ copy: {
+ link: {
+ href: '/copy-template/{{id}}',
+ text: 'Copy this template',
+ after: ' to create a draft with the same content.',
+ },
+ },
+};
+
const content = {
global: { mainLayout },
components: {
@@ -1454,6 +1467,7 @@ const content = {
errorSummary,
footer,
header,
+ lockedTemplateWarning,
logoutWarning,
messageFormatting,
messagePlanBlock,
diff --git a/package-lock.json b/package-lock.json
index 565250078..20295d0fa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36548,7 +36548,7 @@
},
"packages/event-schemas": {
"name": "@nhsdigital/nhs-notify-event-schemas-template-management",
- "version": "1.2.0",
+ "version": "1.2.1",
"license": "MIT",
"dependencies": {
"zod": "^4.0.17"
diff --git a/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js b/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js
index 79f4866be..7ec517418 100644
--- a/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js
+++ b/tests/accessibility/actions/waiting-for-proofs-letter-template.actions.js
@@ -4,7 +4,7 @@ const {
const pageActions = [
...goToPreviewLetterTemplateActions,
- 'wait for [data-test-id=status-tag-waiting-for-proof] to be visible',
+ 'wait for [data-testid=status-tag][data-status=waiting-for-proof] to be visible',
];
const waitingForProofsLetterTemplatePage = (url) => ({
diff --git a/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts b/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts
index 23012dcea..1c04c7fec 100644
--- a/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts
+++ b/tests/test-team/pages/template-mgmt-preview-submitted-base-page.ts
@@ -3,10 +3,14 @@ import { TemplateMgmtBasePage } from './template-mgmt-base-page';
export abstract class TemplateMgmtPreviewSubmittedBasePage extends TemplateMgmtBasePage {
readonly campaignId: Locator;
+ readonly copyLink: Locator;
+ readonly statusTag: Locator;
constructor(page: Page) {
super(page);
this.campaignId = page.locator('[id="campaign-id"]');
+ this.copyLink = page.getByTestId('copy-link');
+ this.statusTag = page.getByTestId('status-tag');
}
}
diff --git a/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts
index 97dc86452..e4de67d66 100644
--- a/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/email/template-mgmt-preview-submitted-email-page.component.spec.ts
@@ -83,6 +83,15 @@ test.describe('Preview submitted Email message template Page', () => {
await expect(previewSubmittedEmailTemplatePage.messageText).toHaveText(
'test-template-message'
);
+
+ await expect(previewSubmittedEmailTemplatePage.statusTag).toHaveText(
+ 'Locked'
+ );
+
+ await expect(previewSubmittedEmailTemplatePage.copyLink).toHaveAttribute(
+ 'href',
+ `/templates/copy-template/${templates.valid.id}`
+ );
});
test.describe('Page functionality', () => {
diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
index f0a352741..4d38d0b8e 100644
--- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
@@ -93,6 +93,12 @@ test.describe('Preview submitted Letter message template Page', () => {
await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText(
templates.valid.campaignId
);
+
+ await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText(
+ 'Locked'
+ );
+
+ await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0);
});
test.describe('Page functionality', () => {
diff --git a/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts
index ab57e94f7..2820b0060 100644
--- a/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/nhs-app/template-mgmt-preview-submitted-nhs-app-page.component.spec.ts
@@ -78,6 +78,15 @@ test.describe('Preview submitted NHS App message template Page', () => {
await expect(previewSubmittedNHSAppTemplatePage.messageText).toHaveText(
'test-template-message'
);
+
+ await expect(previewSubmittedNHSAppTemplatePage.statusTag).toHaveText(
+ 'Locked'
+ );
+
+ await expect(previewSubmittedNHSAppTemplatePage.copyLink).toHaveAttribute(
+ 'href',
+ `/templates/copy-template/${templates.valid.id}`
+ );
});
test.describe('Page functionality', () => {
diff --git a/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts
index 3b86fb027..85a3ba8da 100644
--- a/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/sms/template-mgmt-preview-submitted-sms-page.component.spec.ts
@@ -77,6 +77,15 @@ test.describe('Preview submitted sms message template Page', () => {
await expect(previewSubmittedSMSTemplatePage.messageText).toHaveText(
'test-template-message'
);
+
+ await expect(previewSubmittedSMSTemplatePage.statusTag).toHaveText(
+ 'Locked'
+ );
+
+ await expect(previewSubmittedSMSTemplatePage.copyLink).toHaveAttribute(
+ 'href',
+ `/templates/copy-template/${templates.valid.id}`
+ );
});
test.describe('Page functionality', () => {
diff --git a/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts
index 2eb7ad94e..30273ba54 100644
--- a/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/template-mgmt-message-templates-page.component.spec.ts
@@ -137,17 +137,17 @@ test.describe('Manage templates page', () => {
const email = page.locator(
'tr:has-text("email-submitted_message-templates-page")'
);
- await expect(email.getByText('Submitted', { exact: true })).toBeVisible();
+ await expect(email.getByText('Locked', { exact: true })).toBeVisible();
const sms = page.locator(
'tr:has-text("sms-submitted_message-templates-page")'
);
- await expect(sms.getByText('Submitted', { exact: true })).toBeVisible();
+ await expect(sms.getByText('Locked', { exact: true })).toBeVisible();
const nhsapp = page.locator(
'tr:has-text("nhs-app-submitted_message-templates-page")'
);
- await expect(nhsapp.getByText('Submitted', { exact: true })).toBeVisible();
+ await expect(nhsapp.getByText('Locked', { exact: true })).toBeVisible();
});
test('Not Yet Submitted template items have correct status indicator', async ({
diff --git a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap
new file mode 100644
index 000000000..f5b7e6165
--- /dev/null
+++ b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap
@@ -0,0 +1,321 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`statusToColourMapping status=DELETED type=EMAIL routing=false 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=EMAIL routing=true 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=LETTER routing=false 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=LETTER routing=true 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=NHS_APP routing=false 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=NHS_APP routing=true 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=SMS routing=false 1`] = `undefined`;
+
+exports[`statusToColourMapping status=DELETED type=SMS routing=true 1`] = `undefined`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"green"`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"green"`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `undefined`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `undefined`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"green"`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"green"`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"green"`;
+
+exports[`statusToColourMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"green"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"blue"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"grey"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=false 1`] = `"grey"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=LETTER routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"grey"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=SMS routing=false 1`] = `"grey"`;
+
+exports[`statusToColourMapping status=SUBMITTED type=SMS routing=true 1`] = `"orange"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"red"`;
+
+exports[`statusToColourMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"red"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"yellow"`;
+
+exports[`statusToColourMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"yellow"`;
+
+exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=false 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=EMAIL routing=true 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=LETTER routing=false 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=LETTER routing=true 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=false 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=NHS_APP routing=true 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=SMS routing=false 1`] = `""`;
+
+exports[`statusToDisplayMapping status=DELETED type=SMS routing=true 1`] = `""`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=false 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=EMAIL routing=true 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=false 1`] = `"Not yet submitted"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=LETTER routing=true 1`] = `"Not yet submitted"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=false 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=NHS_APP routing=true 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=false 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=NOT_YET_SUBMITTED type=SMS routing=true 1`] = `"Draft"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=false 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=EMAIL routing=true 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=false 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=LETTER routing=true 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=false 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=NHS_APP routing=true 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=false 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_PROOF_REQUEST type=SMS routing=true 1`] = `"Files uploaded"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=EMAIL routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=LETTER routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=NHS_APP routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_UPLOAD type=SMS routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=EMAIL routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=LETTER routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=NHS_APP routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=false 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PENDING_VALIDATION type=SMS routing=true 1`] = `"Checking files"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=false 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=EMAIL routing=true 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=false 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=LETTER routing=true 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=false 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=NHS_APP routing=true 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=false 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=PROOF_AVAILABLE type=SMS routing=true 1`] = `"Proof available"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=false 1`] = `"Submitted"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=EMAIL routing=true 1`] = `"Locked"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=false 1`] = `"Submitted"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=LETTER routing=true 1`] = `"Locked"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=false 1`] = `"Submitted"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=NHS_APP routing=true 1`] = `"Locked"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=false 1`] = `"Submitted"`;
+
+exports[`statusToDisplayMapping status=SUBMITTED type=SMS routing=true 1`] = `"Locked"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=LETTER routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VALIDATION_FAILED type=SMS routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=EMAIL routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=LETTER routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=NHS_APP routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=false 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=VIRUS_SCAN_FAILED type=SMS routing=true 1`] = `"Checks failed"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=false 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=EMAIL routing=true 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=false 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=LETTER routing=true 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=false 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=NHS_APP routing=true 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=false 1`] = `"Waiting for proof"`;
+
+exports[`statusToDisplayMapping status=WAITING_FOR_PROOF type=SMS routing=true 1`] = `"Waiting for proof"`;
diff --git a/utils/utils/src/__tests__/enum.test.ts b/utils/utils/src/__tests__/enum.test.ts
index 7893870b3..7106614ad 100644
--- a/utils/utils/src/__tests__/enum.test.ts
+++ b/utils/utils/src/__tests__/enum.test.ts
@@ -2,6 +2,8 @@
import {
Language,
LetterType,
+ TEMPLATE_TYPE_LIST,
+ TEMPLATE_STATUS_LIST,
TemplateStatus,
TemplateType,
} from 'nhs-notify-backend-client';
@@ -29,7 +31,6 @@ import {
templateTypeToUrlTextMappings,
cascadeTemplateTypeToUrlTextMappings,
} from '../enum';
-import { TEMPLATE_STATUS_LIST } from 'nhs-notify-backend-client';
describe('templateTypeDisplayMappings', () => {
test('NHS_APP', () => {
@@ -114,87 +115,48 @@ describe('alphabeticalLanguageList', () => {
});
});
+const TEMPLATE_STATUS_CASES = TEMPLATE_STATUS_LIST.flatMap((status) =>
+ TEMPLATE_TYPE_LIST.flatMap((type) =>
+ [true, false].map(
+ (routingFlag): [TemplateStatus, TemplateType, boolean] => [
+ status,
+ type,
+ routingFlag,
+ ]
+ )
+ )
+);
+
describe('statusToDisplayMapping', () => {
- test.each([
- { type: 'LETTER' as TemplateType, expected: 'Not yet submitted' },
- { type: 'NHS_APP' as TemplateType, expected: 'Draft' },
- { type: 'SMS' as TemplateType, expected: 'Draft' },
- { type: 'EMAIl' as TemplateType, expected: 'Draft' },
- ])(
- 'When templateType is %type NOT_YET_SUBMITTED should be %expected',
- ({ type, expected }) => {
+ test.each(TEMPLATE_STATUS_CASES)(
+ 'status=%s type=%s routing=%s',
+ (status, type, routing) => {
expect(
- statusToDisplayMapping({
- templateType: type,
- templateStatus: 'NOT_YET_SUBMITTED',
- })
- ).toEqual(expected);
+ statusToDisplayMapping(
+ {
+ templateType: type,
+ templateStatus: status,
+ },
+ { routing }
+ )
+ ).toMatchSnapshot();
}
);
-
- test('SUBMITTED', () => {
- expect(
- statusToDisplayMapping({
- templateType: 'SMS',
- templateStatus: 'SUBMITTED',
- })
- ).toEqual('Submitted');
- });
-
- test('DELETED', () => {
- expect(
- statusToDisplayMapping({
- templateType: 'SMS',
- templateStatus: 'DELETED',
- })
- ).toEqual('');
- });
});
describe('statusToColourMapping', () => {
- it.each(TEMPLATE_STATUS_LIST)(
- 'should give the expected colour when templateStatus is %s for LETTERS',
- (templateStatus) => {
- const expectedColours: { [key in TemplateStatus]?: string } = {
- SUBMITTED: 'grey',
- WAITING_FOR_PROOF: 'yellow',
- PENDING_PROOF_REQUEST: 'blue',
- PENDING_UPLOAD: 'blue',
- PENDING_VALIDATION: 'blue',
- VIRUS_SCAN_FAILED: 'red',
- VALIDATION_FAILED: 'red',
- PROOF_AVAILABLE: 'orange',
- };
-
+ test.each(TEMPLATE_STATUS_CASES)(
+ 'status=%s type=%s routing=%s',
+ (status, type, routing) => {
expect(
- statusToColourMapping({ templateStatus, templateType: 'LETTER' })
- ).toEqual(expectedColours[templateStatus]);
- }
- );
-
- describe.each(['NHS_APP', 'SMS', 'EMAIL'] as TemplateType[])(
- 'template type: %p',
- (templateType) => {
- it.each(TEMPLATE_STATUS_LIST)(
- 'should give the expected colour when templateStatus is %p',
- (templateStatus) => {
- const expectedColours: { [key in TemplateStatus]?: string } = {
- SUBMITTED: 'grey',
- WAITING_FOR_PROOF: 'yellow',
- PENDING_PROOF_REQUEST: 'blue',
- PENDING_UPLOAD: 'blue',
- PENDING_VALIDATION: 'blue',
- VIRUS_SCAN_FAILED: 'red',
- VALIDATION_FAILED: 'red',
- PROOF_AVAILABLE: 'orange',
- NOT_YET_SUBMITTED: 'green',
- };
-
- expect(
- statusToColourMapping({ templateStatus, templateType })
- ).toEqual(expectedColours[templateStatus]);
- }
- );
+ statusToColourMapping(
+ {
+ templateType: type,
+ templateStatus: status,
+ },
+ { routing }
+ )
+ ).toMatchSnapshot();
}
);
});
diff --git a/utils/utils/src/enum.ts b/utils/utils/src/enum.ts
index 70ccad623..4ad331eda 100644
--- a/utils/utils/src/enum.ts
+++ b/utils/utils/src/enum.ts
@@ -6,6 +6,7 @@ import type {
TemplateDto,
Channel,
RoutingConfigStatus,
+ ClientFeatures,
} from 'nhs-notify-backend-client';
/**
@@ -92,34 +93,26 @@ export const templateTypeDisplayMappings = (type: TemplateType) =>
LETTER: 'Letter',
})[type];
-const statusToDisplayMappings: Record = {
- NOT_YET_SUBMITTED: 'Not yet submitted',
- SUBMITTED: 'Submitted',
- DELETED: '', // will not be shown in the UI
- PENDING_PROOF_REQUEST: 'Files uploaded',
- PENDING_UPLOAD: 'Checking files',
- PENDING_VALIDATION: 'Checking files',
- VALIDATION_FAILED: 'Checks failed',
- VIRUS_SCAN_FAILED: 'Checks failed',
- WAITING_FOR_PROOF: 'Waiting for proof',
- PROOF_AVAILABLE: 'Proof available',
-} as const;
-
-const templateStatusToDisplayMappingsLetter = (status: TemplateStatus) =>
- statusToDisplayMappings[status];
-
-const templateStatusToDisplayMappingsDigital = (status: TemplateStatus) =>
- ({
- ...statusToDisplayMappings,
- NOT_YET_SUBMITTED: 'Draft',
- })[status];
-
export const statusToDisplayMapping = (
- template: Pick
-): string =>
- template.templateType === 'LETTER'
- ? templateStatusToDisplayMappingsLetter(template.templateStatus)
- : templateStatusToDisplayMappingsDigital(template.templateStatus);
+ template: Pick,
+ featureFlags: Pick
+): string => {
+ const statusToDisplayMappings: Record = {
+ NOT_YET_SUBMITTED:
+ template.templateType === 'LETTER' ? 'Not yet submitted' : 'Draft',
+ SUBMITTED: featureFlags.routing ? 'Locked' : 'Submitted',
+ DELETED: '', // will not be shown in the UI
+ PENDING_PROOF_REQUEST: 'Files uploaded',
+ PENDING_UPLOAD: 'Checking files',
+ PENDING_VALIDATION: 'Checking files',
+ VALIDATION_FAILED: 'Checks failed',
+ VIRUS_SCAN_FAILED: 'Checks failed',
+ WAITING_FOR_PROOF: 'Waiting for proof',
+ PROOF_AVAILABLE: 'Proof available',
+ };
+
+ return statusToDisplayMappings[template.templateStatus];
+};
type Colour =
| 'white'
@@ -134,39 +127,25 @@ type Colour =
| 'yellow'
| undefined;
-const colourMappings: Record = {
- NOT_YET_SUBMITTED: undefined,
- SUBMITTED: 'grey',
- DELETED: undefined,
- PENDING_PROOF_REQUEST: 'blue',
- PENDING_UPLOAD: 'blue',
- PENDING_VALIDATION: 'blue',
- VIRUS_SCAN_FAILED: 'red',
- VALIDATION_FAILED: 'red',
- WAITING_FOR_PROOF: 'yellow',
- PROOF_AVAILABLE: 'orange',
-} as const;
-
-const templateStatusToColourMappingsLetter = (
- status: TemplateStatus
-): Colour | undefined => colourMappings[status];
-
-const templateStatusToColourMappingsDigital = (
- status: TemplateStatus
-): Colour | undefined =>
- (
- ({
- ...colourMappings,
- NOT_YET_SUBMITTED: 'green',
- }) satisfies typeof colourMappings
- )[status];
-
export const statusToColourMapping = (
- template: Pick
-) =>
- template.templateType === 'LETTER'
- ? templateStatusToColourMappingsLetter(template.templateStatus)
- : templateStatusToColourMappingsDigital(template.templateStatus);
+ template: Pick,
+ featureFlags: Pick
+) => {
+ const colourMappings: Record = {
+ NOT_YET_SUBMITTED: template.templateType === 'LETTER' ? undefined : 'green',
+ SUBMITTED: featureFlags.routing ? 'orange' : 'grey',
+ DELETED: undefined,
+ PENDING_PROOF_REQUEST: 'blue',
+ PENDING_UPLOAD: 'blue',
+ PENDING_VALIDATION: 'blue',
+ VIRUS_SCAN_FAILED: 'red',
+ VALIDATION_FAILED: 'red',
+ WAITING_FOR_PROOF: 'yellow',
+ PROOF_AVAILABLE: 'orange',
+ };
+
+ return colourMappings[template.templateStatus];
+};
export const templateTypeToUrlTextMappings = (type: TemplateType) =>
({