+
+
+ There is a problem
+
+
- Add the address fields to the template file and upload it.
+
+ Your file may contain a virus and we could not open it
+
+
+ Upload a different letter template file
+
@@ -577,10 +2374,13 @@ exports[`authoring letter template with VALIDATION_FAILED status matches snapsho
>
- Back to all templates
+ Upload a different letter template file
diff --git a/frontend/src/__tests__/app/preview-letter-template/page.test.tsx b/frontend/src/__tests__/app/preview-letter-template/page.test.tsx
index 3dc57571c4..976c3edac7 100644
--- a/frontend/src/__tests__/app/preview-letter-template/page.test.tsx
+++ b/frontend/src/__tests__/app/preview-letter-template/page.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@testing-library/react';
+import { render, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { redirect, RedirectType } from 'next/navigation';
import { getTemplate, getLetterVariantById } from '@utils/form-actions';
@@ -17,6 +17,7 @@ import Page, {
import { submitAuthoringLetterAction } from '@app/preview-letter-template/[templateId]/server-action';
import content from '@content/content';
import { RENDER_TIMEOUT_MS } from '@molecules/PollLetterRender/PollLetterRender';
+import { ValidationErrorDetail } from 'nhs-notify-web-template-management-types';
jest.mock('@utils/form-actions');
jest.mock('next/navigation');
@@ -487,52 +488,122 @@ describe('when authoring letter template status is submitted', () => {
});
describe('authoring letter template with VALIDATION_FAILED status', () => {
- it('displays error summary with correct error messages when validationErrors are present', async () => {
- jest.mocked(getTemplate).mockResolvedValue({
- ...AUTHORING_LETTER_TEMPLATE,
- templateStatus: 'VALIDATION_FAILED',
- validationErrors: [{ name: 'VIRUS_SCAN_FAILED' }],
- });
-
- render(
- await Page({
- params: Promise.resolve({ templateId: AUTHORING_LETTER_TEMPLATE.id }),
- })
- );
-
- expect(redirect).not.toHaveBeenCalled();
- expect(
- screen.getByRole('alert', { name: 'There is a problem' })
- ).toBeInTheDocument();
-
- expect(
- screen.getByText('The file(s) you uploaded may contain a virus.')
- ).toBeInTheDocument();
-
- expect(
- screen.getByText(
- 'Create a new letter template to upload your file(s) again or upload different file(s).'
- )
- ).toBeInTheDocument();
- });
-
- it('does not display submit button when validation has failed', async () => {
- jest.mocked(getTemplate).mockResolvedValue({
- ...AUTHORING_LETTER_TEMPLATE,
- templateStatus: 'VALIDATION_FAILED',
- validationErrors: [{ name: 'VIRUS_SCAN_FAILED' }],
- });
-
- render(
- await Page({
- params: Promise.resolve({ templateId: AUTHORING_LETTER_TEMPLATE.id }),
- })
- );
-
- expect(
- screen.queryByRole('button', { name: 'Submit template' })
- ).not.toBeInTheDocument();
- });
+ const cases: {
+ validationError: ValidationErrorDetail;
+ expectedErrorMessageLines: string[];
+ }[] = [
+ {
+ validationError: { name: 'VIRUS_SCAN_FAILED' },
+ expectedErrorMessageLines: [
+ 'Your file may contain a virus and we could not open it',
+ 'Upload a different letter template file',
+ ],
+ },
+ {
+ validationError: { name: 'MISSING_ADDRESS_LINES' },
+ expectedErrorMessageLines: [
+ 'Your template is missing address personalisation fields',
+ 'You must include all fields from {d.address_line_1} to {d.address_line_7}. Use the blank letter template file to set up your template as it includes the correct fields. Upload it as a different letter template file',
+ ],
+ },
+ {
+ validationError: { name: 'UNEXPECTED_ADDRESS_LINES' },
+ expectedErrorMessageLines: [
+ 'Your template has address personalisation fields we do not recognise',
+ 'You must only use {d.address_line_1} to {d.address_line_7}. Use the blank letter template file to set up your template as it has the correct fields. Upload this as a different letter template file',
+ ],
+ },
+ {
+ validationError: {
+ name: 'INVALID_MARKERS',
+ issues: [
+ '{c.compliment}',
+ '{no.d}',
+ '{d.underscores_to_test_markdown_escapes}',
+ ],
+ },
+ expectedErrorMessageLines: [
+ 'You used the following personalisation fields with incorrect formatting:',
+ '{c.compliment}',
+ '{no.d}',
+ '{d.underscores_to_test_markdown_escapes}',
+ 'Personalisation fields must start with d. and be inside single curly brackets. For example: {d.fullName}',
+ 'They can only contain',
+ 'letters (a to z, A to Z)',
+ 'numbers (1 to 9)',
+ 'dashes',
+ 'underscores',
+ 'Update your letter template file and upload it again',
+ ],
+ },
+ ];
+
+ describe.each(cases)(
+ '$validationError.name',
+ ({ validationError, expectedErrorMessageLines }) => {
+ beforeEach(() => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...AUTHORING_LETTER_TEMPLATE,
+ templateStatus: 'VALIDATION_FAILED',
+ validationErrors: [validationError],
+ });
+ });
+
+ it('displays error summary with correct error messages when validationErrors are present', async () => {
+ render(
+ await Page({
+ params: Promise.resolve({
+ templateId: AUTHORING_LETTER_TEMPLATE.id,
+ }),
+ })
+ );
+
+ expect(redirect).not.toHaveBeenCalled();
+
+ const errorSummary = screen.getByRole('alert', {
+ name: 'There is a problem',
+ });
+
+ for (const errorMessage of expectedErrorMessageLines) {
+ expect(
+ within(errorSummary).getByText(errorMessage)
+ ).toBeInTheDocument();
+ }
+ });
+
+ it('display "upload different template" button instead of submit button when validation has failed', async () => {
+ render(
+ await Page({
+ params: Promise.resolve({
+ templateId: AUTHORING_LETTER_TEMPLATE.id,
+ }),
+ })
+ );
+
+ expect(
+ screen.queryByRole('button', { name: 'Submit template' })
+ ).not.toBeInTheDocument();
+
+ expect(
+ screen.getByRole('button', {
+ name: 'Upload a different letter template file',
+ })
+ ).toHaveAttribute('href', '/templates/choose-a-template-type');
+ });
+
+ it('matches snapshot', async () => {
+ const { asFragment } = render(
+ await Page({
+ params: Promise.resolve({
+ templateId: AUTHORING_LETTER_TEMPLATE.id,
+ }),
+ })
+ );
+
+ expect(asFragment()).toMatchSnapshot();
+ });
+ }
+ );
it('does not display error summary when validationErrors is undefined', async () => {
jest.mocked(getTemplate).mockResolvedValue({
@@ -554,22 +625,6 @@ describe('authoring letter template with VALIDATION_FAILED status', () => {
).toBeInTheDocument();
});
- it('matches snapshot when validationErrors are present', async () => {
- jest.mocked(getTemplate).mockResolvedValue({
- ...AUTHORING_LETTER_TEMPLATE,
- templateStatus: 'VALIDATION_FAILED',
- validationErrors: [{ name: 'MISSING_ADDRESS_LINES' }],
- });
-
- const { asFragment } = render(
- await Page({
- params: Promise.resolve({ templateId: AUTHORING_LETTER_TEMPLATE.id }),
- })
- );
-
- expect(asFragment()).toMatchSnapshot();
- });
-
it('matches snapshot when validationErrors is undefined', async () => {
jest.mocked(getTemplate).mockResolvedValue({
...AUTHORING_LETTER_TEMPLATE,
diff --git a/frontend/src/__tests__/components/atoms/NHSNotifyForm/NHSNotifyForm.test.tsx b/frontend/src/__tests__/components/atoms/NHSNotifyForm/NHSNotifyForm.test.tsx
index e44440477d..3cccf4b847 100644
--- a/frontend/src/__tests__/components/atoms/NHSNotifyForm/NHSNotifyForm.test.tsx
+++ b/frontend/src/__tests__/components/atoms/NHSNotifyForm/NHSNotifyForm.test.tsx
@@ -1,14 +1,11 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import type {
- ErrorState,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
import { Label } from '@atoms/nhsuk-components';
import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
import { NHSNotifyFormProvider } from '@providers/form-provider';
import * as NHSNotifyForm from '@atoms/NHSNotifyForm';
+import type { ErrorState, FormState } from '@utils/types';
jest.mock('@utils/csrf-utils');
diff --git a/frontend/src/__tests__/components/forms/ChooseMessageOrder/ChooseMessageOrder.test.tsx b/frontend/src/__tests__/components/forms/ChooseMessageOrder/ChooseMessageOrder.test.tsx
index 29c6eb8668..3602b8cfed 100644
--- a/frontend/src/__tests__/components/forms/ChooseMessageOrder/ChooseMessageOrder.test.tsx
+++ b/frontend/src/__tests__/components/forms/ChooseMessageOrder/ChooseMessageOrder.test.tsx
@@ -1,7 +1,7 @@
import { useActionState } from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { ChooseMessageOrder } from '@forms/ChooseMessageOrder/ChooseMessageOrder';
-import { TemplateFormState } from 'nhs-notify-web-template-management-utils';
+import type { TemplateFormState } from '@utils/types';
import { useFeatureFlags } from '@providers/client-config-provider';
import { initialFeatureFlags } from '@utils/client-config';
diff --git a/frontend/src/__tests__/components/forms/ChooseTemplateType/ChooseTemplateType.test.tsx b/frontend/src/__tests__/components/forms/ChooseTemplateType/ChooseTemplateType.test.tsx
index e4d8a09f26..ac0c173a93 100644
--- a/frontend/src/__tests__/components/forms/ChooseTemplateType/ChooseTemplateType.test.tsx
+++ b/frontend/src/__tests__/components/forms/ChooseTemplateType/ChooseTemplateType.test.tsx
@@ -1,7 +1,7 @@
import { useActionState } from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { ChooseTemplateType } from '@forms/ChooseTemplateType/ChooseTemplateType';
-import { TemplateFormState } from 'nhs-notify-web-template-management-utils';
+import type { TemplateFormState } from '@utils/types';
import { TEMPLATE_TYPE_LIST } from 'nhs-notify-backend-client/schemas';
import { useFeatureFlags } from '@providers/client-config-provider';
diff --git a/frontend/src/__tests__/components/forms/CopyTemplate/CopyTemplate.test.tsx b/frontend/src/__tests__/components/forms/CopyTemplate/CopyTemplate.test.tsx
index a90438d011..5dc3fd3eb4 100644
--- a/frontend/src/__tests__/components/forms/CopyTemplate/CopyTemplate.test.tsx
+++ b/frontend/src/__tests__/components/forms/CopyTemplate/CopyTemplate.test.tsx
@@ -4,7 +4,7 @@ import { useActionState } from 'react';
import { mockDeep } from 'jest-mock-extended';
import { render, screen, fireEvent } from '@testing-library/react';
import { CopyTemplate, ValidCopyType } from '@forms/CopyTemplate/CopyTemplate';
-import { TemplateFormState } from 'nhs-notify-web-template-management-utils';
+import type { TemplateFormState } from '@utils/types';
import { TemplateDto } from 'nhs-notify-web-template-management-types';
jest.mock('@utils/amplify-utils');
diff --git a/frontend/src/__tests__/components/forms/EmailTemplateForm/EmailTemplateForm.test.tsx b/frontend/src/__tests__/components/forms/EmailTemplateForm/EmailTemplateForm.test.tsx
index d4a0eedfa0..df09c7d489 100644
--- a/frontend/src/__tests__/components/forms/EmailTemplateForm/EmailTemplateForm.test.tsx
+++ b/frontend/src/__tests__/components/forms/EmailTemplateForm/EmailTemplateForm.test.tsx
@@ -1,11 +1,9 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { mockDeep } from 'jest-mock-extended';
-import {
- TemplateFormState,
- EmailTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import { EmailTemplate } from 'nhs-notify-web-template-management-utils';
import { EmailTemplateForm } from '@forms/EmailTemplateForm/EmailTemplateForm';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
jest.mock('@utils/amplify-utils');
diff --git a/frontend/src/__tests__/components/forms/LetterTemplateForm/LetterTemplateForm.test.tsx b/frontend/src/__tests__/components/forms/LetterTemplateForm/LetterTemplateForm.test.tsx
index 5b245124a1..921bb8224c 100644
--- a/frontend/src/__tests__/components/forms/LetterTemplateForm/LetterTemplateForm.test.tsx
+++ b/frontend/src/__tests__/components/forms/LetterTemplateForm/LetterTemplateForm.test.tsx
@@ -1,13 +1,10 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { mockDeep } from 'jest-mock-extended';
-import {
- ErrorState,
- TemplateFormState,
- UploadLetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import { LetterTemplateForm } from '@forms/LetterTemplateForm/LetterTemplateForm';
import userEvent from '@testing-library/user-event';
import { validate } from '@utils/client-validate-form';
+import type { ErrorState, TemplateFormState } from '@utils/types';
jest.mock('@utils/amplify-utils');
diff --git a/frontend/src/__tests__/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.test.tsx b/frontend/src/__tests__/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.test.tsx
index a358080f6a..e628188132 100644
--- a/frontend/src/__tests__/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.test.tsx
+++ b/frontend/src/__tests__/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.test.tsx
@@ -1,12 +1,10 @@
import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { mockDeep } from 'jest-mock-extended';
-import {
- NHSAppTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
import { NhsAppTemplateForm } from '@forms/NhsAppTemplateForm/NhsAppTemplateForm';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
jest.mock('@utils/amplify-utils');
diff --git a/frontend/src/__tests__/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.test.tsx b/frontend/src/__tests__/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.test.tsx
index a0f5984b7f..2c5a7074b9 100644
--- a/frontend/src/__tests__/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.test.tsx
+++ b/frontend/src/__tests__/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.test.tsx
@@ -2,14 +2,12 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { PreviewEmailTemplate } from '@forms/PreviewEmailTemplate';
-import {
- EmailTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { EmailTemplate } from 'nhs-notify-web-template-management-utils';
import { renderEmailMarkdown } from '@utils/markdownit';
import { mockDeep } from 'jest-mock-extended';
import { useSearchParams } from 'next/navigation';
import { useFeatureFlags } from '@providers/client-config-provider';
+import { TemplateFormState } from '@utils/types';
jest.mock('@utils/markdownit');
diff --git a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.test.tsx b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.test.tsx
index 81e0cb0997..41f502d3c7 100644
--- a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.test.tsx
+++ b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.test.tsx
@@ -2,14 +2,12 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { PreviewNHSAppTemplate } from '@forms/PreviewNHSAppTemplate';
-import {
- NHSAppTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
import { renderNHSAppMarkdown } from '@utils/markdownit';
import { mockDeep } from 'jest-mock-extended';
import { useSearchParams } from 'next/navigation';
import { useFeatureFlags } from '@providers/client-config-provider';
+import { TemplateFormState } from '@utils/types';
jest.mock('@utils/markdownit');
diff --git a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/server-action.test.ts b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/server-action.test.ts
index d9d2aa8a9b..d7e0c9a3c4 100644
--- a/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/server-action.test.ts
+++ b/frontend/src/__tests__/components/forms/PreviewNHSAppTemplate/server-action.test.ts
@@ -1,10 +1,8 @@
import { redirect } from 'next/navigation';
import { previewNhsAppTemplateAction } from '@forms/PreviewNHSAppTemplate';
import { getMockFormData } from '@testhelpers/helpers';
-import {
- NHSAppTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
+import { TemplateFormState } from '@utils/types';
jest.mock('next/navigation');
diff --git a/frontend/src/__tests__/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.test.tsx b/frontend/src/__tests__/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.test.tsx
index b738769d50..95093807c3 100644
--- a/frontend/src/__tests__/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.test.tsx
+++ b/frontend/src/__tests__/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.test.tsx
@@ -2,14 +2,12 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { PreviewSMSTemplate } from '@forms/PreviewSMSTemplate';
-import {
- SMSTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { SMSTemplate } from 'nhs-notify-web-template-management-utils';
import { renderSMSMarkdown } from '@utils/markdownit';
import { mockDeep } from 'jest-mock-extended';
import { useSearchParams } from 'next/navigation';
import { useFeatureFlags } from '@providers/client-config-provider';
+import { TemplateFormState } from '@utils/types';
jest.mock('@utils/markdownit');
diff --git a/frontend/src/__tests__/components/forms/SmsTemplateForm/SmsTemplateForm.test.tsx b/frontend/src/__tests__/components/forms/SmsTemplateForm/SmsTemplateForm.test.tsx
index 700eab4487..9548a82d8d 100644
--- a/frontend/src/__tests__/components/forms/SmsTemplateForm/SmsTemplateForm.test.tsx
+++ b/frontend/src/__tests__/components/forms/SmsTemplateForm/SmsTemplateForm.test.tsx
@@ -2,12 +2,12 @@ import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { mockDeep } from 'jest-mock-extended';
import {
- TemplateFormState,
SMSTemplate,
CreateUpdateSMSTemplate,
} from 'nhs-notify-web-template-management-utils';
import { SmsTemplateForm } from '@forms/SmsTemplateForm/SmsTemplateForm';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
jest.mock('react', () => {
const originalModule = jest.requireActual('react');
diff --git a/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderForm.test.tsx b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderForm.test.tsx
index 9f63287ccc..6c2f56a151 100644
--- a/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderForm.test.tsx
+++ b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderForm.test.tsx
@@ -5,10 +5,8 @@ import {
LetterRenderPollingProvider,
useLetterRenderPolling,
} from '@providers/letter-render-polling-provider';
-import type {
- AuthoringLetterTemplate,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
+import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
jest.mock('@providers/letter-render-polling-provider', () => {
const actual = jest.requireActual(
diff --git a/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderTab.test.tsx b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderTab.test.tsx
index 857fdee2a4..3b0534c453 100644
--- a/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderTab.test.tsx
+++ b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderTab.test.tsx
@@ -2,12 +2,10 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { LetterRenderTab } from '@molecules/LetterRender/LetterRenderTab';
import { updateLetterPreview } from '@molecules/LetterRender/server-action';
import { LetterRenderPollingProvider } from '@providers/letter-render-polling-provider';
-import type {
- AuthoringLetterTemplate,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
+import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
import type { PropsWithChildren } from 'react';
+import { FormState } from '@utils/types';
jest.mock('@utils/csrf-utils');
jest.mocked(verifyFormCsrfToken).mockResolvedValue(true);
diff --git a/frontend/src/__tests__/components/molecules/LetterRender/server-action.test.ts b/frontend/src/__tests__/components/molecules/LetterRender/server-action.test.ts
index 72498490c0..924f5f4df4 100644
--- a/frontend/src/__tests__/components/molecules/LetterRender/server-action.test.ts
+++ b/frontend/src/__tests__/components/molecules/LetterRender/server-action.test.ts
@@ -1,5 +1,5 @@
import { updateLetterPreview } from '@molecules/LetterRender/server-action';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { generateLetterProof } from '@utils/form-actions';
import { AUTHORING_LETTER_TEMPLATE } from '@testhelpers/helpers';
diff --git a/frontend/src/__tests__/components/organisms/PreviewDigitalTemplate.test.tsx b/frontend/src/__tests__/components/organisms/PreviewDigitalTemplate.test.tsx
index b0f5fb6c45..7c4f5ad7f2 100644
--- a/frontend/src/__tests__/components/organisms/PreviewDigitalTemplate.test.tsx
+++ b/frontend/src/__tests__/components/organisms/PreviewDigitalTemplate.test.tsx
@@ -1,15 +1,13 @@
import { render, screen } from '@testing-library/react';
import { PreviewDigitalTemplate } from '@organisms/PreviewDigitalTemplate';
-import {
- DigitalTemplate,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
+import { DigitalTemplate } from 'nhs-notify-web-template-management-utils';
import { useFeatureFlags } from '@providers/client-config-provider';
import {
NHS_APP_TEMPLATE,
EMAIL_TEMPLATE,
SMS_TEMPLATE,
} from '@testhelpers/helpers';
+import { FormState } from '@utils/types';
jest.mock('@providers/client-config-provider');
diff --git a/frontend/src/__tests__/components/organisms/PreviewPdfLetterTemplate.test.tsx b/frontend/src/__tests__/components/organisms/PreviewPdfLetterTemplate.test.tsx
index b7bb4c15ca..6fd1191998 100644
--- a/frontend/src/__tests__/components/organisms/PreviewPdfLetterTemplate.test.tsx
+++ b/frontend/src/__tests__/components/organisms/PreviewPdfLetterTemplate.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@testing-library/react';
+import { render, screen, within } from '@testing-library/react';
import { PreviewPdfLetterTemplate } from '@organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate';
import type { PdfLetterTemplate } from 'nhs-notify-web-template-management-utils';
@@ -100,7 +100,23 @@ describe('PreviewPdfLetterTemplate', () => {
render(
);
- expect(screen.getByRole('alert')).toBeInTheDocument();
+ const errorSummary = screen.getByRole('alert');
+
+ expect(
+ within(errorSummary).getByText(
+ 'Your file may contain a virus and we could not open it'
+ )
+ ).toBeInTheDocument();
+
+ expect(
+ within(errorSummary).getByText('Upload a different letter template file')
+ ).toBeInTheDocument();
+
+ expect(
+ screen.getByRole('button', {
+ name: 'Upload a different letter template file',
+ })
+ ).toHaveAttribute('href', '/templates/choose-a-template-type');
});
it('shows error summary for VALIDATION_FAILED status', () => {
diff --git a/frontend/src/__tests__/components/providers/form-provider.test.tsx b/frontend/src/__tests__/components/providers/form-provider.test.tsx
index 2967811ec5..0177798f4a 100644
--- a/frontend/src/__tests__/components/providers/form-provider.test.tsx
+++ b/frontend/src/__tests__/components/providers/form-provider.test.tsx
@@ -6,10 +6,7 @@ import {
waitFor,
} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import type {
- ErrorState,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
+import type { ErrorState, FormState } from '@utils/types';
import {
NHSNotifyFormProvider,
useNHSNotifyForm,
diff --git a/frontend/src/app/choose-printing-and-postage/[templateId]/server-action.ts b/frontend/src/app/choose-printing-and-postage/[templateId]/server-action.ts
index 03e37ea003..837c0cbfe7 100644
--- a/frontend/src/app/choose-printing-and-postage/[templateId]/server-action.ts
+++ b/frontend/src/app/choose-printing-and-postage/[templateId]/server-action.ts
@@ -2,7 +2,7 @@
import { z } from 'zod/v4';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { redirect } from 'next/navigation';
diff --git a/frontend/src/app/edit-template-campaign/[templateId]/server-action.ts b/frontend/src/app/edit-template-campaign/[templateId]/server-action.ts
index 2161e120dd..ab80319b84 100644
--- a/frontend/src/app/edit-template-campaign/[templateId]/server-action.ts
+++ b/frontend/src/app/edit-template-campaign/[templateId]/server-action.ts
@@ -3,7 +3,7 @@
import { redirect } from 'next/navigation';
import { z } from 'zod/v4';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import copy from '@content/content';
import { patchTemplate } from '@utils/form-actions';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
diff --git a/frontend/src/app/edit-template-name/[templateId]/server-action.ts b/frontend/src/app/edit-template-name/[templateId]/server-action.ts
index 25f3e9a1d4..e11d4e507e 100644
--- a/frontend/src/app/edit-template-name/[templateId]/server-action.ts
+++ b/frontend/src/app/edit-template-name/[templateId]/server-action.ts
@@ -2,7 +2,7 @@
import { z } from 'zod/v4';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { redirect } from 'next/navigation';
diff --git a/frontend/src/app/message-plans/create-message-plan/server-action.ts b/frontend/src/app/message-plans/create-message-plan/server-action.ts
index 5f852c0ceb..e526793ccd 100644
--- a/frontend/src/app/message-plans/create-message-plan/server-action.ts
+++ b/frontend/src/app/message-plans/create-message-plan/server-action.ts
@@ -8,11 +8,11 @@ import type {
} from 'nhs-notify-web-template-management-types';
import {
MESSAGE_ORDER_OPTIONS_LIST,
- type FormState,
type MessageOrder,
} from 'nhs-notify-web-template-management-utils';
import { createRoutingConfig } from '@utils/message-plans';
import { $MessagePlanFormData } from '@forms/MessagePlan/schema';
+import { FormState } from '@utils/types';
const $CreateMessagePlanFormData = $MessagePlanFormData.extend({
messageOrder: z.enum(MESSAGE_ORDER_OPTIONS_LIST, {
diff --git a/frontend/src/app/message-plans/edit-message-plan-settings/[routingConfigId]/server-action.ts b/frontend/src/app/message-plans/edit-message-plan-settings/[routingConfigId]/server-action.ts
index 5ceb9da9bb..225a894715 100644
--- a/frontend/src/app/message-plans/edit-message-plan-settings/[routingConfigId]/server-action.ts
+++ b/frontend/src/app/message-plans/edit-message-plan-settings/[routingConfigId]/server-action.ts
@@ -2,7 +2,7 @@
import { redirect, RedirectType } from 'next/navigation';
import { z } from 'zod/v4';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { $MessagePlanFormData } from '@forms/MessagePlan/schema';
import { updateRoutingConfig } from '@utils/message-plans';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
diff --git a/frontend/src/app/message-plans/edit-message-plan/[routingConfigId]/actions.ts b/frontend/src/app/message-plans/edit-message-plan/[routingConfigId]/actions.ts
index 1e017aa10d..0487bec6f5 100644
--- a/frontend/src/app/message-plans/edit-message-plan/[routingConfigId]/actions.ts
+++ b/frontend/src/app/message-plans/edit-message-plan/[routingConfigId]/actions.ts
@@ -8,9 +8,10 @@ import {
} from '@utils/routing-utils';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
import { redirect } from 'next/navigation';
-import { FormState, ORDINALS } from 'nhs-notify-web-template-management-utils';
+import { ORDINALS } from 'nhs-notify-web-template-management-utils';
import { interpolate } from '@utils/interpolate';
import copy from '@content/content';
+import { FormState } from '@utils/types';
const content = copy.pages.editMessagePlan;
diff --git a/frontend/src/app/message-plans/review-and-move-to-production/[routingConfigId]/server-action.ts b/frontend/src/app/message-plans/review-and-move-to-production/[routingConfigId]/server-action.ts
index a30ffce7f2..6f1324391c 100644
--- a/frontend/src/app/message-plans/review-and-move-to-production/[routingConfigId]/server-action.ts
+++ b/frontend/src/app/message-plans/review-and-move-to-production/[routingConfigId]/server-action.ts
@@ -2,7 +2,7 @@
import { redirect, RedirectType } from 'next/navigation';
import { z } from 'zod/v4';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
import { submitRoutingConfig } from '@utils/message-plans';
import content from '@content/content';
diff --git a/frontend/src/app/preview-letter-template/[templateId]/page.tsx b/frontend/src/app/preview-letter-template/[templateId]/page.tsx
index 2359aad238..732e15184a 100644
--- a/frontend/src/app/preview-letter-template/[templateId]/page.tsx
+++ b/frontend/src/app/preview-letter-template/[templateId]/page.tsx
@@ -24,6 +24,7 @@ import { LetterSubmitButton } from '@molecules/LetterRender/LetterSubmitButton';
import { submitAuthoringLetterAction } from './server-action';
import content from '@content/content';
import { NHSNotifyContainer } from '@layouts/container/container';
+import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton';
const {
approveButtonText,
@@ -40,12 +41,12 @@ export async function generateMetadata(): Promise
{
};
}
-function getValidationErrors(template: AuthoringLetterTemplate): string[] {
+function getValidationErrors(template: AuthoringLetterTemplate) {
if (template.templateStatus !== 'VALIDATION_FAILED') return [];
return (
- template.validationErrors?.flatMap(
- (error) => validationErrorMessages[error.name]
+ template.validationErrors?.map((error) =>
+ validationErrorMessages[error.name](error.issues)
) ?? []
);
}
@@ -92,13 +93,15 @@ export default async function PreviewLetterTemplatePage({
);
}
+ const validationErrors = getValidationErrors(validatedTemplate);
+
return (
)}
-
- {backLinkText}
-
+ {validationErrors.length > 0 ? (
+
+ {links.uploadDifferentTemplateFile.text}
+
+ ) : (
+
+ {backLinkText}
+
+ )}
diff --git a/frontend/src/app/preview-letter-template/[templateId]/server-action.ts b/frontend/src/app/preview-letter-template/[templateId]/server-action.ts
index 20b8079858..f3ab1ff89a 100644
--- a/frontend/src/app/preview-letter-template/[templateId]/server-action.ts
+++ b/frontend/src/app/preview-letter-template/[templateId]/server-action.ts
@@ -2,7 +2,7 @@
import { z } from 'zod/v4';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { redirect } from 'next/navigation';
const $FormSchema = z.object({
diff --git a/frontend/src/app/review-and-approve-letter-template/[templateId]/server-action.ts b/frontend/src/app/review-and-approve-letter-template/[templateId]/server-action.ts
index fc623b1a23..c75e26b248 100644
--- a/frontend/src/app/review-and-approve-letter-template/[templateId]/server-action.ts
+++ b/frontend/src/app/review-and-approve-letter-template/[templateId]/server-action.ts
@@ -1,7 +1,7 @@
'use server';
import { z } from 'zod/v4';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { redirect } from 'next/navigation';
import { approveTemplate } from '@utils/form-actions';
import { $LockNumber } from 'nhs-notify-backend-client/schemas';
diff --git a/frontend/src/app/upload-british-sign-language-letter-template/server-action.ts b/frontend/src/app/upload-british-sign-language-letter-template/server-action.ts
index f540283c28..ad17caa496 100644
--- a/frontend/src/app/upload-british-sign-language-letter-template/server-action.ts
+++ b/frontend/src/app/upload-british-sign-language-letter-template/server-action.ts
@@ -2,13 +2,11 @@
import { z } from 'zod/v4';
import { redirect, RedirectType } from 'next/navigation';
-import type {
- FormState,
- UploadLetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import type { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { uploadDocxTemplate } from '@utils/form-actions';
+import { FormState } from '@utils/types';
const { errors } = copy.components.uploadDocxLetterTemplateForm;
diff --git a/frontend/src/app/upload-large-print-letter-template/server-action.ts b/frontend/src/app/upload-large-print-letter-template/server-action.ts
index 399c1af592..a9c182a0cd 100644
--- a/frontend/src/app/upload-large-print-letter-template/server-action.ts
+++ b/frontend/src/app/upload-large-print-letter-template/server-action.ts
@@ -2,13 +2,11 @@
import { z } from 'zod/v4';
import { redirect, RedirectType } from 'next/navigation';
-import type {
- FormState,
- UploadLetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import type { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { uploadDocxTemplate } from '@utils/form-actions';
+import { FormState } from '@utils/types';
const { errors } = copy.components.uploadDocxLetterTemplateForm;
diff --git a/frontend/src/app/upload-other-language-letter-template/server-action.ts b/frontend/src/app/upload-other-language-letter-template/server-action.ts
index 94ab344f9d..1b9e20b87f 100644
--- a/frontend/src/app/upload-other-language-letter-template/server-action.ts
+++ b/frontend/src/app/upload-other-language-letter-template/server-action.ts
@@ -3,13 +3,11 @@
import { z } from 'zod/v4';
import { redirect, RedirectType } from 'next/navigation';
import { LANGUAGE_LIST } from 'nhs-notify-backend-client/schemas';
-import type {
- FormState,
- UploadLetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import type { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { uploadDocxTemplate } from '@utils/form-actions';
+import { FormState } from '@utils/types';
const { errors } = copy.components.uploadDocxLetterTemplateForm;
diff --git a/frontend/src/app/upload-standard-english-letter-template/server-action.ts b/frontend/src/app/upload-standard-english-letter-template/server-action.ts
index d9400ee3b2..de5be2d609 100644
--- a/frontend/src/app/upload-standard-english-letter-template/server-action.ts
+++ b/frontend/src/app/upload-standard-english-letter-template/server-action.ts
@@ -2,13 +2,11 @@
import { z } from 'zod/v4';
import { redirect, RedirectType } from 'next/navigation';
-import type {
- FormState,
- UploadLetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import type { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import copy from '@content/content';
import { formDataToFormStateFields } from '@utils/form-data-to-form-state';
import { uploadDocxTemplate } from '@utils/form-actions';
+import { FormState } from '@utils/types';
const { errors } = copy.components.uploadDocxLetterTemplateForm;
diff --git a/frontend/src/components/forms/ChooseChannelTemplate/ChooseChannelTemplate.tsx b/frontend/src/components/forms/ChooseChannelTemplate/ChooseChannelTemplate.tsx
index 3c54e3880c..931c9ab2ad 100644
--- a/frontend/src/components/forms/ChooseChannelTemplate/ChooseChannelTemplate.tsx
+++ b/frontend/src/components/forms/ChooseChannelTemplate/ChooseChannelTemplate.tsx
@@ -8,7 +8,7 @@ import Link from 'next/link';
import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton';
import { interpolate } from '@utils/interpolate';
import { useActionState, useState } from 'react';
-import { ErrorState } from 'nhs-notify-web-template-management-utils';
+import { ErrorState } from '@utils/types';
import { NhsNotifyErrorSummary } from '@molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary';
import {
$ChooseChannelTemplate,
diff --git a/frontend/src/components/forms/ChooseChannelTemplate/server-action.ts b/frontend/src/components/forms/ChooseChannelTemplate/server-action.ts
index 6a7d2ceba4..5c690900aa 100644
--- a/frontend/src/components/forms/ChooseChannelTemplate/server-action.ts
+++ b/frontend/src/components/forms/ChooseChannelTemplate/server-action.ts
@@ -1,5 +1,5 @@
import { redirect, RedirectType } from 'next/navigation';
-import { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { z } from 'zod';
import { updateRoutingConfig } from '@utils/message-plans';
import { ChooseChannelTemplateProps } from './choose-channel-template.types';
diff --git a/frontend/src/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.tsx b/frontend/src/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.tsx
index 88ad2096d1..aef487dc12 100644
--- a/frontend/src/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.tsx
+++ b/frontend/src/components/forms/ChooseLanguageLetterTemplates/ChooseLanguageLetterTemplates.tsx
@@ -5,10 +5,7 @@ import { Details, SummaryList } from 'nhsuk-react-components';
import Link from 'next/link';
import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton';
import { useActionState, useState } from 'react';
-import {
- ErrorState,
- LetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import { LetterTemplate } from 'nhs-notify-web-template-management-utils';
import { NhsNotifyErrorSummary } from '@molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary';
import {
$ChooseLanguageLetterTemplates,
@@ -22,6 +19,7 @@ import type { RoutingConfig } from 'nhs-notify-web-template-management-types';
import baseContent from '@content/content';
import { LanguageLetterTemplates } from '@molecules/LanguageLetterTemplates/LanguageLetterTemplates';
import { interpolate } from '@utils/interpolate';
+import { ErrorState } from '@utils/types';
const content = baseContent.components.chooseLanguageLetterTemplates;
diff --git a/frontend/src/components/forms/ChooseLanguageLetterTemplates/server-action.ts b/frontend/src/components/forms/ChooseLanguageLetterTemplates/server-action.ts
index 679dcfe44b..3fe350ec59 100644
--- a/frontend/src/components/forms/ChooseLanguageLetterTemplates/server-action.ts
+++ b/frontend/src/components/forms/ChooseLanguageLetterTemplates/server-action.ts
@@ -1,8 +1,5 @@
import { redirect, RedirectType } from 'next/navigation';
-import {
- FormState,
- LetterTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import { LetterTemplate } from 'nhs-notify-web-template-management-utils';
import { z } from 'zod';
import { updateRoutingConfig } from '@utils/message-plans';
import { replaceLanguageTemplatesInCascadeItem } from '@utils/routing-utils';
@@ -10,6 +7,7 @@ import { $LockNumber } from 'nhs-notify-backend-client/schemas';
import type { Language } from 'nhs-notify-web-template-management-types';
import { ChooseLanguageLetterTemplatesProps } from './ChooseLanguageLetterTemplates';
import baseContent from '@content/content';
+import { FormState } from '@utils/types';
const content = baseContent.components.chooseLanguageLetterTemplates;
diff --git a/frontend/src/components/forms/ChooseMessageOrder/ChooseMessageOrder.tsx b/frontend/src/components/forms/ChooseMessageOrder/ChooseMessageOrder.tsx
index 2516846f02..9e44bc2baf 100644
--- a/frontend/src/components/forms/ChooseMessageOrder/ChooseMessageOrder.tsx
+++ b/frontend/src/components/forms/ChooseMessageOrder/ChooseMessageOrder.tsx
@@ -7,7 +7,6 @@ import { NHSNotifyRadioButtonForm } from '@molecules/NHSNotifyRadioButtonForm/NH
import { NhsNotifyErrorSummary } from '@molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary';
import content from '@content/content';
import {
- ErrorState,
getMessageOrderOptions,
MessageOrder,
} from 'nhs-notify-web-template-management-utils';
@@ -15,6 +14,7 @@ import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { $ChooseMessageOrder, chooseMessageOrderAction } from './server-action';
import { validate } from '@utils/client-validate-form';
import { useFeatureFlags } from '@providers/client-config-provider';
+import { ErrorState } from '@utils/types';
export const messageOrderDisplayMappings: Record = {
NHSAPP: 'NHS App only',
diff --git a/frontend/src/components/forms/ChooseMessageOrder/server-action.ts b/frontend/src/components/forms/ChooseMessageOrder/server-action.ts
index ad39a2d2d3..56bd8b2038 100644
--- a/frontend/src/components/forms/ChooseMessageOrder/server-action.ts
+++ b/frontend/src/components/forms/ChooseMessageOrder/server-action.ts
@@ -1,10 +1,8 @@
import { redirect, RedirectType } from 'next/navigation';
-import {
- FormState,
- MESSAGE_ORDER_OPTIONS_LIST,
-} from 'nhs-notify-web-template-management-utils';
+import { MESSAGE_ORDER_OPTIONS_LIST } from 'nhs-notify-web-template-management-utils';
import { z } from 'zod';
import content from '@content/content';
+import { FormState } from '@utils/types';
export const $ChooseMessageOrder = z.object({
messageOrder: z.enum(MESSAGE_ORDER_OPTIONS_LIST, {
diff --git a/frontend/src/components/forms/ChooseTemplateType/ChooseTemplateType.tsx b/frontend/src/components/forms/ChooseTemplateType/ChooseTemplateType.tsx
index 12d1387698..c1b59975ca 100644
--- a/frontend/src/components/forms/ChooseTemplateType/ChooseTemplateType.tsx
+++ b/frontend/src/components/forms/ChooseTemplateType/ChooseTemplateType.tsx
@@ -4,10 +4,7 @@ import { useActionState, useState } from 'react';
import { Radios } from 'nhsuk-react-components';
import { NhsNotifyErrorSummary } from '@molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary';
import copy from '@content/content';
-import {
- ErrorState,
- FRONTEND_SUPPORTED_LETTER_TYPES,
-} from 'nhs-notify-web-template-management-utils';
+import { FRONTEND_SUPPORTED_LETTER_TYPES } from 'nhs-notify-web-template-management-utils';
import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { chooseTemplateTypeAction } from './server-action';
import {
@@ -21,6 +18,7 @@ import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
import { useFeatureFlags } from '@providers/client-config-provider';
import { NHSNotifyRadioButtonForm } from '@molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm';
import { ContentRenderer } from '@molecules/ContentRenderer/ContentRenderer';
+import { ErrorState } from '@utils/types';
const content = copy.components.chooseTemplateType;
diff --git a/frontend/src/components/forms/ChooseTemplateType/server-action.ts b/frontend/src/components/forms/ChooseTemplateType/server-action.ts
index be5b337498..c857ef45d3 100644
--- a/frontend/src/components/forms/ChooseTemplateType/server-action.ts
+++ b/frontend/src/components/forms/ChooseTemplateType/server-action.ts
@@ -3,7 +3,6 @@
import { redirect, RedirectType } from 'next/navigation';
import {
createTemplateUrl,
- FormState,
legacyTemplateCreationPages,
} from 'nhs-notify-web-template-management-utils';
import { z } from 'zod';
@@ -12,6 +11,7 @@ import {
$ChooseTemplateTypeBase,
$ChooseTemplateTypeWithLetterAuthoring,
} from './schemas';
+import { FormState } from '@utils/types';
export async function chooseTemplateTypeAction(
_: FormState,
diff --git a/frontend/src/components/forms/CopyTemplate/CopyTemplate.tsx b/frontend/src/components/forms/CopyTemplate/CopyTemplate.tsx
index c5a1c38f64..1527823bbd 100644
--- a/frontend/src/components/forms/CopyTemplate/CopyTemplate.tsx
+++ b/frontend/src/components/forms/CopyTemplate/CopyTemplate.tsx
@@ -4,10 +4,7 @@ import { useActionState, useState } from 'react';
import { NHSNotifyRadioButtonForm } from '@molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm';
import { NhsNotifyErrorSummary } from '@molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary';
import content from '@content/content';
-import {
- ErrorState,
- templateTypeDisplayMappings,
-} from 'nhs-notify-web-template-management-utils';
+import { templateTypeDisplayMappings } from 'nhs-notify-web-template-management-utils';
import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { $CopyTemplate, copyTemplateAction } from './server-action';
import type {
@@ -17,6 +14,7 @@ import type {
import { validate } from '@utils/client-validate-form';
import Link from 'next/link';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { ErrorState } from '@utils/types';
export type ValidCopyType = Exclude;
diff --git a/frontend/src/components/forms/CopyTemplate/server-action.ts b/frontend/src/components/forms/CopyTemplate/server-action.ts
index fa31eb155d..a0c4a62d2a 100644
--- a/frontend/src/components/forms/CopyTemplate/server-action.ts
+++ b/frontend/src/components/forms/CopyTemplate/server-action.ts
@@ -1,5 +1,5 @@
import { redirect, RedirectType } from 'next/navigation';
-import { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { z } from 'zod';
import { createTemplate } from '@utils/form-actions';
import { format } from 'date-fns/format';
diff --git a/frontend/src/components/forms/EmailTemplateForm/EmailTemplateForm.tsx b/frontend/src/components/forms/EmailTemplateForm/EmailTemplateForm.tsx
index b023c05763..1862fef359 100644
--- a/frontend/src/components/forms/EmailTemplateForm/EmailTemplateForm.tsx
+++ b/frontend/src/components/forms/EmailTemplateForm/EmailTemplateForm.tsx
@@ -14,9 +14,8 @@ import { MessageFormatting } from '@molecules/MessageFormatting/MessageFormattin
import {
CreateUpdateEmailTemplate,
EmailTemplate,
- ErrorState,
- PageComponentProps,
} from 'nhs-notify-web-template-management-utils';
+import type { ErrorState, PageComponentProps } from '@utils/types';
import content from '@content/content';
import { useTextInput } from '@hooks/use-text-input.hook';
import { ChannelGuidance } from '@molecules/ChannelGuidance/ChannelGuidance';
diff --git a/frontend/src/components/forms/EmailTemplateForm/server-action.ts b/frontend/src/components/forms/EmailTemplateForm/server-action.ts
index 731f333840..243694cee0 100644
--- a/frontend/src/components/forms/EmailTemplateForm/server-action.ts
+++ b/frontend/src/components/forms/EmailTemplateForm/server-action.ts
@@ -1,7 +1,6 @@
import {
CreateUpdateEmailTemplate,
EmailTemplate,
- TemplateFormState,
} from 'nhs-notify-web-template-management-utils';
import { z } from 'zod';
import { createTemplate, saveTemplate } from '@utils/form-actions';
@@ -12,6 +11,7 @@ import {
} from '@utils/constants';
import content from '@content/content';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/forms/LetterTemplateForm/LetterTemplateForm.tsx b/frontend/src/components/forms/LetterTemplateForm/LetterTemplateForm.tsx
index 985b54df27..ba6dd503ed 100644
--- a/frontend/src/components/forms/LetterTemplateForm/LetterTemplateForm.tsx
+++ b/frontend/src/components/forms/LetterTemplateForm/LetterTemplateForm.tsx
@@ -17,9 +17,7 @@ import {
alphabeticalLanguageList,
alphabeticalLetterTypeList,
UploadLetterTemplate,
- ErrorState,
isRightToLeft,
- PageComponentProps,
} from 'nhs-notify-web-template-management-utils';
import content from '@content/content';
import { useTextInput } from '@hooks/use-text-input.hook';
@@ -31,6 +29,7 @@ import { validate } from '@utils/client-validate-form';
import type { Language } from 'nhs-notify-web-template-management-types';
import Link from 'next/link';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { ErrorState, PageComponentProps } from '@utils/types';
export const LetterTemplateForm: FC<
PageComponentProps & {
diff --git a/frontend/src/components/forms/LetterTemplateForm/server-action.ts b/frontend/src/components/forms/LetterTemplateForm/server-action.ts
index bdd561424f..424ce0bbda 100644
--- a/frontend/src/components/forms/LetterTemplateForm/server-action.ts
+++ b/frontend/src/components/forms/LetterTemplateForm/server-action.ts
@@ -3,11 +3,9 @@
import { z } from 'zod';
import { uploadLetterTemplate } from '@utils/form-actions';
import { redirect, RedirectType } from 'next/navigation';
-import {
- UploadLetterTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { UploadLetterTemplate } from 'nhs-notify-web-template-management-utils';
import { $UploadLetterTemplateForm } from './form-schema';
+import { TemplateFormState } from '@utils/types';
export async function processFormActions(
formState: TemplateFormState,
diff --git a/frontend/src/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.tsx b/frontend/src/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.tsx
index 427426b25e..bcb9610781 100644
--- a/frontend/src/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.tsx
+++ b/frontend/src/components/forms/NhsAppTemplateForm/NhsAppTemplateForm.tsx
@@ -13,9 +13,7 @@ import { Personalisation } from '@molecules/Personalisation/Personalisation';
import { MessageFormatting } from '@molecules/MessageFormatting/MessageFormatting';
import {
CreateUpdateNHSAppTemplate,
- ErrorState,
NHSAppTemplate,
- PageComponentProps,
} from 'nhs-notify-web-template-management-utils';
import content from '@content/content';
import { useTextInput } from '@hooks/use-text-input.hook';
@@ -30,6 +28,7 @@ import { MarkdownContent } from '@molecules/MarkdownContent/MarkdownContent';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
import NHSNotifyTextArea from '@atoms/NHSNotifyTextArea/NHSNotifyTextArea';
import { renderErrorItem } from '@molecules/NhsNotifyErrorItem/NHSNotifyErrorItem';
+import { ErrorState, PageComponentProps } from '@utils/types';
export const NhsAppTemplateForm: FC<
PageComponentProps
diff --git a/frontend/src/components/forms/NhsAppTemplateForm/server-action.ts b/frontend/src/components/forms/NhsAppTemplateForm/server-action.ts
index 72a4f6f3e8..719be3822e 100644
--- a/frontend/src/components/forms/NhsAppTemplateForm/server-action.ts
+++ b/frontend/src/components/forms/NhsAppTemplateForm/server-action.ts
@@ -1,6 +1,5 @@
import markdownit from 'markdown-it';
import {
- TemplateFormState,
NHSAppTemplate,
CreateUpdateNHSAppTemplate,
} from 'nhs-notify-web-template-management-utils';
@@ -10,6 +9,7 @@ import { redirect, RedirectType } from 'next/navigation';
import { INVALID_PERSONALISATION_FIELDS } from '@utils/constants';
import content from '@content/content';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.tsx b/frontend/src/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.tsx
index 08464c83aa..cc671f9579 100644
--- a/frontend/src/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.tsx
+++ b/frontend/src/components/forms/PreviewEmailTemplate/PreviewEmailTemplate.tsx
@@ -4,17 +4,14 @@ import Link from 'next/link';
import PreviewTemplateDetailsEmail from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsEmail';
import { PreviewDigitalTemplate } from '@organisms/PreviewDigitalTemplate';
import content from '@content/content';
-import {
- EmailTemplate,
- ErrorState,
- PageComponentProps,
-} from 'nhs-notify-web-template-management-utils';
+import { EmailTemplate } from 'nhs-notify-web-template-management-utils';
import { useActionState, useState } from 'react';
import { useSearchParams } from 'next/navigation';
import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { $FormSchema, previewEmailTemplateAction } from './server-actions';
import { validate } from '@utils/client-validate-form';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { ErrorState, PageComponentProps } from '@utils/types';
export function PreviewEmailTemplate({
initialState,
diff --git a/frontend/src/components/forms/PreviewEmailTemplate/server-actions.ts b/frontend/src/components/forms/PreviewEmailTemplate/server-actions.ts
index 226b955cff..3aa40d732f 100644
--- a/frontend/src/components/forms/PreviewEmailTemplate/server-actions.ts
+++ b/frontend/src/components/forms/PreviewEmailTemplate/server-actions.ts
@@ -1,10 +1,8 @@
-import {
- EmailTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { EmailTemplate } from 'nhs-notify-web-template-management-utils';
import { redirect, RedirectType } from 'next/navigation';
import { z } from 'zod';
import content from '@content/content';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.tsx b/frontend/src/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.tsx
index 3550e5e10d..c6a24b9959 100644
--- a/frontend/src/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.tsx
+++ b/frontend/src/components/forms/PreviewNHSAppTemplate/PreviewNHSAppTemplate.tsx
@@ -3,11 +3,7 @@
import Link from 'next/link';
import PreviewTemplateDetailsNhsApp from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsNhsApp';
import { PreviewDigitalTemplate } from '@organisms/PreviewDigitalTemplate';
-import {
- ErrorState,
- NHSAppTemplate,
- PageComponentProps,
-} from 'nhs-notify-web-template-management-utils';
+import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
import content from '@content/content';
import { useSearchParams } from 'next/navigation';
import { useActionState, useState } from 'react';
@@ -15,6 +11,7 @@ import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { previewNhsAppTemplateAction, schema } from './server-action';
import { validate } from '@utils/client-validate-form';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { ErrorState, PageComponentProps } from '@utils/types';
export function PreviewNHSAppTemplate({
initialState,
diff --git a/frontend/src/components/forms/PreviewNHSAppTemplate/server-action.ts b/frontend/src/components/forms/PreviewNHSAppTemplate/server-action.ts
index f5a3237836..d2d27e2b7e 100644
--- a/frontend/src/components/forms/PreviewNHSAppTemplate/server-action.ts
+++ b/frontend/src/components/forms/PreviewNHSAppTemplate/server-action.ts
@@ -1,10 +1,8 @@
import { redirect, RedirectType } from 'next/navigation';
import { z } from 'zod';
-import {
- NHSAppTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
import content from '@content/content';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.tsx b/frontend/src/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.tsx
index 25de7ed782..8a892d7478 100644
--- a/frontend/src/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.tsx
+++ b/frontend/src/components/forms/PreviewSMSTemplate/PreviewSMSTemplate.tsx
@@ -4,17 +4,14 @@ import Link from 'next/link';
import PreviewTemplateDetailsSms from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsSms';
import { PreviewDigitalTemplate } from '@organisms/PreviewDigitalTemplate';
import content from '@content/content';
-import {
- ErrorState,
- PageComponentProps,
- SMSTemplate,
-} from 'nhs-notify-web-template-management-utils';
+import { SMSTemplate } from 'nhs-notify-web-template-management-utils';
import { useActionState, useState } from 'react';
import { useSearchParams } from 'next/navigation';
import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
import { $FormSchema, previewSmsTemplateAction } from './server-actions';
import { validate } from '@utils/client-validate-form';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { ErrorState, PageComponentProps } from '@utils/types';
export function PreviewSMSTemplate({
initialState,
diff --git a/frontend/src/components/forms/PreviewSMSTemplate/server-actions.ts b/frontend/src/components/forms/PreviewSMSTemplate/server-actions.ts
index fab071047c..b505304920 100644
--- a/frontend/src/components/forms/PreviewSMSTemplate/server-actions.ts
+++ b/frontend/src/components/forms/PreviewSMSTemplate/server-actions.ts
@@ -1,10 +1,8 @@
-import {
- SMSTemplate,
- TemplateFormState,
-} from 'nhs-notify-web-template-management-utils';
+import { SMSTemplate } from 'nhs-notify-web-template-management-utils';
import { redirect, RedirectType } from 'next/navigation';
import { z } from 'zod';
import content from '@content/content';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/forms/SmsTemplateForm/SmsTemplateForm.tsx b/frontend/src/components/forms/SmsTemplateForm/SmsTemplateForm.tsx
index 5278f90009..d56b81740b 100644
--- a/frontend/src/components/forms/SmsTemplateForm/SmsTemplateForm.tsx
+++ b/frontend/src/components/forms/SmsTemplateForm/SmsTemplateForm.tsx
@@ -8,8 +8,6 @@ import { Personalisation } from '@molecules/Personalisation/Personalisation';
import { HintText, Label, TextInput } from 'nhsuk-react-components';
import {
CreateUpdateSMSTemplate,
- ErrorState,
- PageComponentProps,
SMSTemplate,
} from 'nhs-notify-web-template-management-utils';
import { FC, useActionState, useState } from 'react';
@@ -29,6 +27,7 @@ import { ContentRenderer } from '@molecules/ContentRenderer/ContentRenderer';
import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
import NHSNotifyTextArea from '@atoms/NHSNotifyTextArea/NHSNotifyTextArea';
import { renderErrorItem } from '@molecules/NhsNotifyErrorItem/NHSNotifyErrorItem';
+import type { ErrorState, PageComponentProps } from '@utils/types';
export const SmsTemplateForm: FC<
PageComponentProps
diff --git a/frontend/src/components/forms/SmsTemplateForm/server-action.ts b/frontend/src/components/forms/SmsTemplateForm/server-action.ts
index fea0b084a4..b5d6f25e7f 100644
--- a/frontend/src/components/forms/SmsTemplateForm/server-action.ts
+++ b/frontend/src/components/forms/SmsTemplateForm/server-action.ts
@@ -1,5 +1,4 @@
import {
- TemplateFormState,
SMSTemplate,
CreateUpdateSMSTemplate,
} from 'nhs-notify-web-template-management-utils';
@@ -12,6 +11,7 @@ import {
} from '@utils/constants';
import content from '@content/content';
import { ErrorCodes } from '@utils/error-codes';
+import { TemplateFormState } from '@utils/types';
const {
components: {
diff --git a/frontend/src/components/molecules/ChannelTemplates/ChannelTemplates.tsx b/frontend/src/components/molecules/ChannelTemplates/ChannelTemplates.tsx
index 0ba7839df4..94a002372e 100644
--- a/frontend/src/components/molecules/ChannelTemplates/ChannelTemplates.tsx
+++ b/frontend/src/components/molecules/ChannelTemplates/ChannelTemplates.tsx
@@ -7,12 +7,12 @@ import Link from 'next/link';
import {
letterTypeDisplayMappings,
templateTypeDisplayMappings,
- ErrorState,
templateTypeToUrlTextMappings,
FrontendSupportedLetterType,
} from 'nhs-notify-web-template-management-utils';
import type { TemplateDto } from 'nhs-notify-web-template-management-types';
import { interpolate } from '@utils/interpolate';
+import { ErrorState } from '@utils/types';
const { tableHintText, tableContent } =
baseContent.components.chooseChannelTemplate;
diff --git a/frontend/src/components/molecules/LanguageLetterTemplates/LanguageLetterTemplates.tsx b/frontend/src/components/molecules/LanguageLetterTemplates/LanguageLetterTemplates.tsx
index 521c73e339..25dfc2dceb 100644
--- a/frontend/src/components/molecules/LanguageLetterTemplates/LanguageLetterTemplates.tsx
+++ b/frontend/src/components/molecules/LanguageLetterTemplates/LanguageLetterTemplates.tsx
@@ -6,11 +6,11 @@ import { format } from 'date-fns';
import Link from 'next/link';
import {
letterTypeDisplayMappings,
- ErrorState,
templateTypeToUrlTextMappings,
type LetterTemplate,
} from 'nhs-notify-web-template-management-utils';
import { interpolate } from '@utils/interpolate';
+import { ErrorState } from '@utils/types';
const { tableHintText, tableContent } =
baseContent.components.chooseLanguageLetterTemplates;
diff --git a/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx b/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
index cb00e21e18..ef963d6e7a 100644
--- a/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
+++ b/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
@@ -1,9 +1,6 @@
'use client';
-import type {
- AuthoringLetterTemplate,
- FormState,
-} from 'nhs-notify-web-template-management-utils';
+import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
import {
NHSNotifyFormProvider,
useNHSNotifyForm,
@@ -13,7 +10,7 @@ import { LetterRenderDetails } from './LetterRenderDetails';
import { LetterRenderForm } from './LetterRenderForm';
import { LetterRenderIframe } from './LetterRenderIframe';
import { updateLetterPreview } from './server-action';
-import type { PersonalisedRenderKey } from '@utils/types';
+import type { FormState, PersonalisedRenderKey } from '@utils/types';
import styles from './LetterRenderTab.module.scss';
import { PollLetterRender } from '@molecules/PollLetterRender/PollLetterRender';
import { PERSONALISATION_FORMDATA_PREFIX } from '@utils/constants';
diff --git a/frontend/src/components/molecules/LetterRender/server-action.ts b/frontend/src/components/molecules/LetterRender/server-action.ts
index 7045591de3..8451e71c3d 100644
--- a/frontend/src/components/molecules/LetterRender/server-action.ts
+++ b/frontend/src/components/molecules/LetterRender/server-action.ts
@@ -1,7 +1,7 @@
'use server';
import { z } from 'zod/v4';
-import type { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import copy from '@content/content';
import {
EXAMPLE_RECIPIENT_IDS,
diff --git a/frontend/src/components/molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm.tsx b/frontend/src/components/molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm.tsx
index 075ad8c894..44c4be6c67 100644
--- a/frontend/src/components/molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm.tsx
+++ b/frontend/src/components/molecules/NHSNotifyRadioButtonForm/NHSNotifyRadioButtonForm.tsx
@@ -1,5 +1,5 @@
import { Radios, Fieldset } from 'nhsuk-react-components';
-import { FormState } from 'nhs-notify-web-template-management-utils';
+import type { FormState } from '@utils/types';
import { NHSNotifyFormWrapper } from '@molecules/NHSNotifyFormWrapper/NHSNotifyFormWrapper';
import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton';
import { DetailedHTMLProps, FormHTMLAttributes, ReactNode } from 'react';
diff --git a/frontend/src/components/molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary.tsx b/frontend/src/components/molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary.tsx
index 8575da5066..27d522b688 100644
--- a/frontend/src/components/molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary.tsx
+++ b/frontend/src/components/molecules/NhsNotifyErrorSummary/NhsNotifyErrorSummary.tsx
@@ -1,8 +1,9 @@
import { ErrorSummary, HintText } from 'nhsuk-react-components';
-import { ErrorState } from 'nhs-notify-web-template-management-utils';
+import { ErrorState } from '@utils/types';
import { FC, HTMLProps, useEffect, useRef } from 'react';
import content from '@content/content';
import { renderErrorItem } from '@molecules/NhsNotifyErrorItem/NHSNotifyErrorItem';
+import { ContentRenderer } from '@molecules/ContentRenderer/ContentRenderer';
const UnlinkedErrorSummaryItem: FC> = (props) => (
@@ -62,7 +63,7 @@ export const NhsNotifyErrorSummary = ({
{formErrors &&
formErrors.map((error, id) => (
- {error}
+
))}
diff --git a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx
index fe9d6193b7..e5d3a3a71c 100644
--- a/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx
+++ b/frontend/src/components/molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate.tsx
@@ -1,6 +1,6 @@
'use client';
-import { PageComponentProps } from 'nhs-notify-web-template-management-utils';
+import type { PageComponentProps } from '@utils/types';
import baseContent from '@content/content';
import Link from 'next/link';
import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
diff --git a/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx b/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx
index c5134c0300..ec2603d5ba 100644
--- a/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx
+++ b/frontend/src/components/molecules/PreviewTemplateFromMessagePlan/PreviewTemplateFromMessagePlan.tsx
@@ -7,12 +7,12 @@ import NotifyBackLink from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
import type { TemplateDto } from 'nhs-notify-web-template-management-types';
import {
templateTypeToUrlTextMappings,
- PageComponentProps,
isFrontendSupportedLetterType,
FrontendSupportedLetterType,
} from 'nhs-notify-web-template-management-utils';
import { PreviewTemplateComponent } from '@molecules/PreviewTemplateDetails/common';
import { interpolate } from '@utils/interpolate';
+import { PageComponentProps } from '@utils/types';
export type MessagePlanPreviewTemplateProps =
PageComponentProps & {
diff --git a/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx b/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
index d58a5f6438..7d12784da5 100644
--- a/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
+++ b/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
@@ -169,7 +169,13 @@ export function PreviewPdfLetterTemplate({
)}
- {backLinkText}
+ {template.templateStatus === 'VIRUS_SCAN_FAILED' ? (
+
+ {virusScanErrorAction}
+
+ ) : (
+ {backLinkText}
+ )}