From 17c9366e9b60813c51fcc39f54ce9a8b4a032195 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Thu, 19 Mar 2026 15:53:02 +0000 Subject: [PATCH 01/15] initial setup for 3571 FE --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a35338832..3e13e2bc0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pcs-frontend +# pcs-frontend - SDM COMMENT ## Getting Started From 70ff79783cd7fd7cf94396a3b4e7fb1aca3a46e7 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Mon, 23 Mar 2026 16:22:05 +0000 Subject: [PATCH 02/15] Initial commit for additional circumstances views and data persistence --- README.md | 2 +- .../cy/respondToClaim/yourCircumstances.json | 20 ++++ .../en/respondToClaim/yourCircumstances.json | 20 ++++ src/main/interfaces/ccdCase.interface.ts | 4 + .../currentCircumstances.njk | 34 ++++++- .../current-circumstances/index.ts | 93 ++++++++++++++++++- 6 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 src/main/assets/locales/cy/respondToClaim/yourCircumstances.json create mode 100644 src/main/assets/locales/en/respondToClaim/yourCircumstances.json diff --git a/README.md b/README.md index 3e13e2bc0..a35338832 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pcs-frontend - SDM COMMENT +# pcs-frontend ## Getting Started diff --git a/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json b/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json new file mode 100644 index 000000000..e142b9cec --- /dev/null +++ b/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json @@ -0,0 +1,20 @@ +{ + "caption": "cyRespond to a property possession claim", + "pageTitle": "cyYour circumstances", + "introParagraph": "cyYou can use this section to give details about any events or circumstances that have impacted your case that you think a judge should know about.", + "forExample": "cyFor example:", + "bullet1": "cysomeone in your household has an illness or disability", + "bullet2": "cychildren in your household attend a local school", + "bullet3": "cyyou work irregular hours, making it hard to find a new place to live", + "question": "cyWould you like to share anything about your circumstances?", + "options": { + "yes": "cyYes", + "no": "cyNo" + }, + "textAreaLabel": "cyGive details about your circumstances", + "errors": { + "shareCircumstances": "cyChoose yes or no", + "circumstancesDetails": "cyEnter details about your circumstances" + } +} + diff --git a/src/main/assets/locales/en/respondToClaim/yourCircumstances.json b/src/main/assets/locales/en/respondToClaim/yourCircumstances.json new file mode 100644 index 000000000..ec1200137 --- /dev/null +++ b/src/main/assets/locales/en/respondToClaim/yourCircumstances.json @@ -0,0 +1,20 @@ +{ + "caption": "Respond to a property possession claim", + "pageTitle": "Your circumstances", + "introParagraph": "You can use this section to give details about any events or circumstances that have impacted your case that you think a judge should know about.", + "forExample": "For example:", + "bullet1": "someone in your household has an illness or disability", + "bullet2": "children in your household attend a local school", + "bullet3": "you work irregular hours, making it hard to find a new place to live", + "question": "Would you like to share anything about your circumstances?", + "options": { + "yes": "Yes", + "no": "No" + }, + "textAreaLabel": "Give details about your circumstances", + "errors": { + "shareCircumstances": "Choose yes or no", + "circumstancesDetails": "Enter details about your circumstances" + } +} + diff --git a/src/main/interfaces/ccdCase.interface.ts b/src/main/interfaces/ccdCase.interface.ts index 7ed005ab4..c61b7a96d 100644 --- a/src/main/interfaces/ccdCase.interface.ts +++ b/src/main/interfaces/ccdCase.interface.ts @@ -57,6 +57,10 @@ export interface PossessionClaimResponse { defendantNameConfirmation?: string; dateOfBirth?: string; landlordRegistered?: YesNoNotSureValue; + householdCircumstances?: { + shareAdditionalCircumstances?: YesNoValue; + additionalCircumstancesDetails?: string; + }; }; } diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index be7675650..0cd5d8f36 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -1,17 +1,43 @@ {% extends "stepsTemplate.njk" %} {% from "govuk/components/button/macro.njk" import govukButton %} +{% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} {% from "macros/csrf.njk" import csrfProtection %} +{# GOV.UK pattern: [Browser title] - HM Courts & Tribunals Service – GOV.UK #} +{% block pageTitle %} + {{ pageTitle }} - HM Courts & Tribunals Service – GOV.UK +{% endblock %} {% block mainContent %} {% if errorSummary %} {{ govukErrorSummary(errorSummary) }} {% endif %} -

Your circumstances (placeholder)

-

This is a placeholder for Your Circumstances step.

-
+ + {% if caption %} + {{ caption }} + {% endif %} + +

{{ pageTitle }}

+ +

{{ introParagraph }}

+ +

{{ forExample }}

+ +
    +
  • {{ bullet1 }}
  • +
  • {{ bullet2 }}
  • +
  • {{ bullet3 }}
  • +
+ + + {% for field in fields %} + {% if field.componentType == 'radios' %} + {{ govukRadios(field.component) }} + {% endif %} + {% endfor %} +
{{ govukButton({ - text: continue, + text: saveAndContinue, attributes: { type: 'submit', name: 'action', value: 'continue' } }) }} {{ govukButton({ diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index 4da773d72..fd339172b 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -1,13 +1,102 @@ +import type { PossessionClaimResponse } from '../../../interfaces/ccdCase.interface'; import type { StepDefinition } from '../../../interfaces/stepFormData.interface'; +import { buildCcdCaseForPossessionClaimResponse } from '../../utils/populateResponseToClaimPayloadmap'; import { flowConfig } from '../flow.config'; -import { createFormStep } from '@modules/steps'; +import { createFormStep, getTranslationFunction } from '@modules/steps'; export const step: StepDefinition = createFormStep({ stepName: 'your-circumstances', journeyFolder: 'respondToClaim', stepDir: __dirname, flowConfig, - fields: [], + translationKeys: { + pageTitle: 'pageTitle', + caption: 'caption', + }, + fields: [ + { + name: 'shareCircumstances', + type: 'radio', + required: true, + legendClasses: 'govuk-fieldset__legend--l', + translationKey: { label: 'question' }, + errorMessage: 'errors.shareCircumstances', + options: [ + { + value: 'yes', + translationKey: 'options.yes', + subFields: { + circumstancesDetails: { + name: 'circumstancesDetails', + type: 'character-count', + required: true, + maxLength: 500, + errorMessage: 'errors.circumstancesDetails', + translationKey: { label: 'textAreaLabel' }, + attributes: { + rows: 5, + }, + }, + }, + }, + { + value: 'no', + translationKey: 'options.no', + }, + ], + }, + ], customTemplate: `${__dirname}/currentCircumstances.njk`, + extendGetContent: req => { + const t = getTranslationFunction(req, 'your-circumstances', ['common']); + + return { + introParagraph: t('introParagraph'), + forExample: t('forExample'), + bullet1: t('bullet1'), + bullet2: t('bullet2'), + bullet3: t('bullet3'), + }; + }, + beforeRedirect: async req => { + const shareCircumstances = req.body?.shareCircumstances as string | undefined; + + if (!shareCircumstances) { + return; + } + + const shareAdditionalCircumstances = shareCircumstances === 'yes' ? 'YES' : 'NO'; + const additionalCircumstancesDetails = + shareCircumstances === 'yes' ? (req.body?.circumstancesDetails as string | undefined) : undefined; + + const possessionClaimResponse: PossessionClaimResponse = { + defendantResponses: { + householdCircumstances: { + shareAdditionalCircumstances, + additionalCircumstancesDetails, + }, + }, + }; + + await buildCcdCaseForPossessionClaimResponse(req, possessionClaimResponse); + }, + getInitialFormData: req => { + const caseData = req.res?.locals?.validatedCase?.data; + const circumstances = + caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; + + if (!circumstances?.shareAdditionalCircumstances) { + return {}; + } + + const shareCircumstances = circumstances.shareAdditionalCircumstances === 'YES' ? 'yes' : 'no'; + + return { + shareCircumstances, + ...(shareCircumstances === 'yes' && circumstances.additionalCircumstancesDetails + ? { circumstancesDetails: circumstances.additionalCircumstancesDetails } + : {}), + }; + }, }); From c54045f8c69d30de3deb050897b89069b04b3f18 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Mon, 23 Mar 2026 16:28:20 +0000 Subject: [PATCH 03/15] prettier fixes --- .../assets/locales/cy/respondToClaim/yourCircumstances.json | 1 - .../assets/locales/en/respondToClaim/yourCircumstances.json | 1 - src/main/steps/respond-to-claim/current-circumstances/index.ts | 3 +-- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json b/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json index e142b9cec..55ccaf295 100644 --- a/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json +++ b/src/main/assets/locales/cy/respondToClaim/yourCircumstances.json @@ -17,4 +17,3 @@ "circumstancesDetails": "cyEnter details about your circumstances" } } - diff --git a/src/main/assets/locales/en/respondToClaim/yourCircumstances.json b/src/main/assets/locales/en/respondToClaim/yourCircumstances.json index ec1200137..e525468da 100644 --- a/src/main/assets/locales/en/respondToClaim/yourCircumstances.json +++ b/src/main/assets/locales/en/respondToClaim/yourCircumstances.json @@ -17,4 +17,3 @@ "circumstancesDetails": "Enter details about your circumstances" } } - diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index fd339172b..827052afe 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -83,8 +83,7 @@ export const step: StepDefinition = createFormStep({ }, getInitialFormData: req => { const caseData = req.res?.locals?.validatedCase?.data; - const circumstances = - caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; + const circumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; if (!circumstances?.shareAdditionalCircumstances) { return {}; From 71440d4b04cefb718df63b293406073a72ead02f Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 10:47:13 +0000 Subject: [PATCH 04/15] data persistence and heading fix --- .../currentCircumstances.njk | 2 +- .../current-circumstances/index.ts | 24 +++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index 0cd5d8f36..31f98788b 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -13,7 +13,7 @@ {% endif %} {% if caption %} - {{ caption }} + {{ caption }} {% endif %}

{{ pageTitle }}

diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index 827052afe..46c074601 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -19,7 +19,7 @@ export const step: StepDefinition = createFormStep({ name: 'shareCircumstances', type: 'radio', required: true, - legendClasses: 'govuk-fieldset__legend--l', + legendClasses: 'govuk-fieldset__legend--m', translationKey: { label: 'question' }, errorMessage: 'errors.shareCircumstances', options: [ @@ -68,7 +68,9 @@ export const step: StepDefinition = createFormStep({ const shareAdditionalCircumstances = shareCircumstances === 'yes' ? 'YES' : 'NO'; const additionalCircumstancesDetails = - shareCircumstances === 'yes' ? (req.body?.circumstancesDetails as string | undefined) : undefined; + shareCircumstances === 'yes' + ? (req.body?.['shareCircumstances.circumstancesDetails'] as string | undefined) + : undefined; const possessionClaimResponse: PossessionClaimResponse = { defendantResponses: { @@ -89,12 +91,26 @@ export const step: StepDefinition = createFormStep({ return {}; } - const shareCircumstances = circumstances.shareAdditionalCircumstances === 'YES' ? 'yes' : 'no'; + // Map CCD enum to frontend value + const shareCircumstances = + circumstances.shareAdditionalCircumstances === 'YES' + ? 'yes' + : circumstances.shareAdditionalCircumstances === 'NO' + ? 'no' + : circumstances.shareAdditionalCircumstances === 'Yes' + ? 'yes' + : circumstances.shareAdditionalCircumstances === 'No' + ? 'no' + : undefined; + + if (!shareCircumstances) { + return {}; + } return { shareCircumstances, ...(shareCircumstances === 'yes' && circumstances.additionalCircumstancesDetails - ? { circumstancesDetails: circumstances.additionalCircumstancesDetails } + ? { 'shareCircumstances.circumstancesDetails': circumstances.additionalCircumstancesDetails } : {}), }; }, From 554ec703496cd560c17b6a67e60302a2b4fc2f66 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 14:36:08 +0000 Subject: [PATCH 05/15] initial hardship page setup --- .../respondToClaim/exceptionalHardship.json | 22 ++++ .../respondToClaim/exceptionalHardship.json | 22 ++++ src/main/interfaces/ccdCase.interface.ts | 2 + .../exceptionalHardship.njk | 35 +++++- .../exceptional-hardship/index.ts | 117 +++++++++++++++++- 5 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json create mode 100644 src/main/assets/locales/en/respondToClaim/exceptionalHardship.json diff --git a/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json b/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json new file mode 100644 index 000000000..bb3a765e8 --- /dev/null +++ b/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json @@ -0,0 +1,22 @@ +{ + "caption": "cyRespond to a property possession claim", + "pageTitle": "cyExceptional hardship", + "introParagraph1": "cyExceptional hardship means experiencing serious difficulties that go beyond the normal difficulty of losing your home.", + "introParagraph2": "cyIf this applies to you, a judge might allow you to stay in your home for longer.", + "introParagraph3": "cyAny details you provide will be considered by a judge when making their decision, but it is up to them to decide if exceptional hardship applies in your case.", + "forExample": "cyFor example, you might have:", + "bullet1": "cygone through a divorce or separation", + "bullet2": "cylost your job or been made redundant", + "bullet3": "cyexperienced a bereavement or long-term illness", + "bullet4": "cybeen declared bankrupt", + "question": "cyWould you experience exceptional hardship if you were asked to leave your home?", + "options": { + "yes": "cyYes", + "no": "cyNo" + }, + "textAreaLabel": "cyGive details about the exceptional hardship you’d experience", + "errors": { + "wouldExperienceExceptionalHardship": "cyChoose yes or no", + "exceptionalHardshipDetails": "cyEnter details about the exceptional hardship you’d experience" + } +} diff --git a/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json new file mode 100644 index 000000000..aa94ef5a6 --- /dev/null +++ b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json @@ -0,0 +1,22 @@ +{ + "caption": "Respond to a property possession claim", + "pageTitle": "Exceptional hardship", + "introParagraph1": "Exceptional hardship means experiencing serious difficulties that go beyond the normal difficulty of losing your home.", + "introParagraph2": "If this applies to you, a judge might allow you to stay in your home for longer.", + "introParagraph3": "Any details you provide will be considered by a judge when making their decision, but it is up to them to decide if exceptional hardship applies in your case.", + "forExample": "For example, you might have:", + "bullet1": "gone through a divorce or separation", + "bullet2": "lost your job or been made redundant", + "bullet3": "experienced a bereavement or long-term illness", + "bullet4": "been declared bankrupt", + "question": "Would you experience exceptional hardship if you were asked to leave your home?", + "options": { + "yes": "Yes", + "no": "No" + }, + "textAreaLabel": "Give details about the exceptional hardship you'd experience", + "errors": { + "wouldExperienceExceptionalHardship": "Choose yes or no", + "exceptionalHardshipDetails": "Enter details about the exceptional hardship you'd experience" + } +} diff --git a/src/main/interfaces/ccdCase.interface.ts b/src/main/interfaces/ccdCase.interface.ts index c61b7a96d..372b8c469 100644 --- a/src/main/interfaces/ccdCase.interface.ts +++ b/src/main/interfaces/ccdCase.interface.ts @@ -60,6 +60,8 @@ export interface PossessionClaimResponse { householdCircumstances?: { shareAdditionalCircumstances?: YesNoValue; additionalCircumstancesDetails?: string; + exceptionalHardship?: YesNoValue; + exceptionalHardshipDetails?: string; }; }; } diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk index d3ea0c1fa..5b9157f41 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk +++ b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk @@ -1,17 +1,44 @@ {% extends "stepsTemplate.njk" %} {% from "govuk/components/button/macro.njk" import govukButton %} +{% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} {% from "macros/csrf.njk" import csrfProtection %} +{% block pageTitle %} + {{ pageTitle }} - HM Courts & Tribunals Service – GOV.UK +{% endblock %} {% block mainContent %} {% if errorSummary %} {{ govukErrorSummary(errorSummary) }} {% endif %} -

Exceptional hardship (placeholder)

-

This is a placeholder for Exceptional Hardship step.

- + + {% if caption %} + {{ caption }} + {% endif %} + +

{{ pageTitle }}

+ +

{{ introParagraph1 }}

+

{{ introParagraph2 }}

+

{{ introParagraph3 }}

+

{{ forExample }}

+ +
    +
  • {{ bullet1 }}
  • +
  • {{ bullet2 }}
  • +
  • {{ bullet3 }}
  • +
  • {{ bullet4 }}
  • +
+ + + {% for field in fields %} + {% if field.componentType == 'radios' %} + {{ govukRadios(field.component) }} + {% endif %} + {% endfor %} +
{{ govukButton({ - text: continue, + text: saveAndContinue, attributes: { type: 'submit', name: 'action', value: 'continue' } }) }} {{ govukButton({ diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index 490e9f6a5..4f5a5e737 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -1,13 +1,126 @@ +import type { PossessionClaimResponse } from '../../../interfaces/ccdCase.interface'; import type { StepDefinition } from '../../../interfaces/stepFormData.interface'; +import { buildCcdCaseForPossessionClaimResponse } from '../../utils/populateResponseToClaimPayloadmap'; import { flowConfig } from '../flow.config'; -import { createFormStep } from '@modules/steps'; +import { createFormStep, getTranslationFunction } from '@modules/steps'; export const step: StepDefinition = createFormStep({ stepName: 'exceptional-hardship', journeyFolder: 'respondToClaim', stepDir: __dirname, flowConfig, - fields: [], + translationKeys: { + pageTitle: 'pageTitle', + caption: 'caption', + }, + fields: [ + { + name: 'wouldExperienceExceptionalHardship', + type: 'radio', + required: true, + legendClasses: 'govuk-fieldset__legend--m', + translationKey: { label: 'question' }, + errorMessage: 'errors.wouldExperienceExceptionalHardship', + options: [ + { + value: 'yes', + translationKey: 'options.yes', + subFields: { + exceptionalHardshipDetails: { + name: 'exceptionalHardshipDetails', + type: 'character-count', + required: true, + maxLength: 500, + errorMessage: 'errors.exceptionalHardshipDetails', + translationKey: { label: 'textAreaLabel' }, + attributes: { + rows: 5, + }, + }, + }, + }, + { + value: 'no', + translationKey: 'options.no', + }, + ], + }, + ], customTemplate: `${__dirname}/exceptionalHardship.njk`, + extendGetContent: req => { + const t = getTranslationFunction(req, 'exceptional-hardship', ['common']); + + return { + introParagraph1: t('introParagraph1'), + introParagraph2: t('introParagraph2'), + introParagraph3: t('introParagraph3'), + forExample: t('forExample'), + bullet1: t('bullet1'), + bullet2: t('bullet2'), + bullet3: t('bullet3'), + bullet4: t('bullet4'), + }; + }, + beforeRedirect: async req => { + const wouldExperienceExceptionalHardship = req.body?.wouldExperienceExceptionalHardship as string | undefined; + + if (!wouldExperienceExceptionalHardship) { + return; + } + + const enumMapping: Record = { + yes: 'YES', + no: 'NO', + }; + + const exceptionalHardship = enumMapping[wouldExperienceExceptionalHardship]; + const exceptionalHardshipDetails = + wouldExperienceExceptionalHardship === 'yes' + ? (req.body?.['wouldExperienceExceptionalHardship.exceptionalHardshipDetails'] as string | undefined) + : undefined; + + const possessionClaimResponse: PossessionClaimResponse = { + defendantResponses: { + householdCircumstances: { + exceptionalHardship, + exceptionalHardshipDetails, + }, + }, + }; + + await buildCcdCaseForPossessionClaimResponse(req, possessionClaimResponse); + }, + getInitialFormData: req => { + const caseData = req.res?.locals?.validatedCase?.data; + const existingAnswer = + caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances?.exceptionalHardship; + const exceptionalHardshipDetails = + caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances?.exceptionalHardshipDetails; + + // Map CCD enum to frontend value + const formValue = + existingAnswer === 'YES' + ? 'yes' + : existingAnswer === 'NO' + ? 'no' + : existingAnswer === 'Yes' + ? 'yes' + : existingAnswer === 'No' + ? 'no' + : undefined; + + if (!formValue) { + return {}; + } + + return { + wouldExperienceExceptionalHardship: formValue, + ...(formValue === 'yes' && exceptionalHardshipDetails + ? { + 'wouldExperienceExceptionalHardship.exceptionalHardshipDetails': exceptionalHardshipDetails, + } + : {}), + }; + }, }); From e5cfb73981a2c41e2447cf2886c6f7314c36f4e7 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 14:49:03 +0000 Subject: [PATCH 06/15] comment removal --- .../current-circumstances/currentCircumstances.njk | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index 31f98788b..94ebad32b 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -3,7 +3,6 @@ {% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} {% from "macros/csrf.njk" import csrfProtection %} -{# GOV.UK pattern: [Browser title] - HM Courts & Tribunals Service – GOV.UK #} {% block pageTitle %} {{ pageTitle }} - HM Courts & Tribunals Service – GOV.UK {% endblock %} From d1bf328048119a305df9863e342f669af2019461 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 16:24:29 +0000 Subject: [PATCH 07/15] update curly apostrophe --- .../assets/locales/en/respondToClaim/exceptionalHardship.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json index aa94ef5a6..ae7de1cda 100644 --- a/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json +++ b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json @@ -14,9 +14,9 @@ "yes": "Yes", "no": "No" }, - "textAreaLabel": "Give details about the exceptional hardship you'd experience", + "textAreaLabel": "Give details about the exceptional hardship you’d experience", "errors": { "wouldExperienceExceptionalHardship": "Choose yes or no", - "exceptionalHardshipDetails": "Enter details about the exceptional hardship you'd experience" + "exceptionalHardshipDetails": "Enter details about the exceptional hardship you’d experience" } } From 79ba2276b87782a6d2e7536d91830ced34ee7922 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 16:45:41 +0000 Subject: [PATCH 08/15] minor blank space --- .../current-circumstances/currentCircumstances.njk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index 94ebad32b..7a36ce40d 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -19,7 +19,7 @@

{{ introParagraph }}

-

{{ forExample }}

+

{{ forExample }}

  • {{ bullet1 }}
  • From 7443aef3e69ee21ece39f415d7a8db31df509366 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 18:10:11 +0000 Subject: [PATCH 09/15] refactoring --- .../respondToClaim/exceptionalHardship.json | 2 +- .../respondToClaim/exceptionalHardship.json | 2 +- .../current-circumstances/index.ts | 34 ++++-------- .../exceptional-hardship/index.ts | 52 +++++++------------ 4 files changed, 31 insertions(+), 59 deletions(-) diff --git a/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json b/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json index bb3a765e8..cab2c95a7 100644 --- a/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json +++ b/src/main/assets/locales/cy/respondToClaim/exceptionalHardship.json @@ -16,7 +16,7 @@ }, "textAreaLabel": "cyGive details about the exceptional hardship you’d experience", "errors": { - "wouldExperienceExceptionalHardship": "cyChoose yes or no", + "exceptionalHardship": "cyChoose yes or no", "exceptionalHardshipDetails": "cyEnter details about the exceptional hardship you’d experience" } } diff --git a/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json index ae7de1cda..3426844e0 100644 --- a/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json +++ b/src/main/assets/locales/en/respondToClaim/exceptionalHardship.json @@ -16,7 +16,7 @@ }, "textAreaLabel": "Give details about the exceptional hardship you’d experience", "errors": { - "wouldExperienceExceptionalHardship": "Choose yes or no", + "exceptionalHardship": "Choose yes or no", "exceptionalHardshipDetails": "Enter details about the exceptional hardship you’d experience" } } diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index 46c074601..e5bdb1060 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -1,4 +1,4 @@ -import type { PossessionClaimResponse } from '../../../interfaces/ccdCase.interface'; +import type { PossessionClaimResponse, YesNoValue } from '../../../interfaces/ccdCase.interface'; import type { StepDefinition } from '../../../interfaces/stepFormData.interface'; import { buildCcdCaseForPossessionClaimResponse } from '../../utils/populateResponseToClaimPayloadmap'; import { flowConfig } from '../flow.config'; @@ -24,7 +24,7 @@ export const step: StepDefinition = createFormStep({ errorMessage: 'errors.shareCircumstances', options: [ { - value: 'yes', + value: 'YES', translationKey: 'options.yes', subFields: { circumstancesDetails: { @@ -41,7 +41,7 @@ export const step: StepDefinition = createFormStep({ }, }, { - value: 'no', + value: 'NO', translationKey: 'options.no', }, ], @@ -60,22 +60,21 @@ export const step: StepDefinition = createFormStep({ }; }, beforeRedirect: async req => { - const shareCircumstances = req.body?.shareCircumstances as string | undefined; + const shareCircumstances = req.body?.shareCircumstances as YesNoValue | undefined; if (!shareCircumstances) { return; } - const shareAdditionalCircumstances = shareCircumstances === 'yes' ? 'YES' : 'NO'; const additionalCircumstancesDetails = - shareCircumstances === 'yes' + shareCircumstances === 'YES' ? (req.body?.['shareCircumstances.circumstancesDetails'] as string | undefined) : undefined; const possessionClaimResponse: PossessionClaimResponse = { defendantResponses: { householdCircumstances: { - shareAdditionalCircumstances, + shareAdditionalCircumstances: shareCircumstances, additionalCircumstancesDetails, }, }, @@ -87,21 +86,10 @@ export const step: StepDefinition = createFormStep({ const caseData = req.res?.locals?.validatedCase?.data; const circumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; - if (!circumstances?.shareAdditionalCircumstances) { - return {}; - } - - // Map CCD enum to frontend value - const shareCircumstances = - circumstances.shareAdditionalCircumstances === 'YES' - ? 'yes' - : circumstances.shareAdditionalCircumstances === 'NO' - ? 'no' - : circumstances.shareAdditionalCircumstances === 'Yes' - ? 'yes' - : circumstances.shareAdditionalCircumstances === 'No' - ? 'no' - : undefined; + // YesOrNo (CCD SDK type) serialises as "Yes"/"No"; normalise to uppercase to match radio option values + const shareCircumstances = circumstances?.shareAdditionalCircumstances + ? (String(circumstances.shareAdditionalCircumstances).toUpperCase() as YesNoValue) + : undefined; if (!shareCircumstances) { return {}; @@ -109,7 +97,7 @@ export const step: StepDefinition = createFormStep({ return { shareCircumstances, - ...(shareCircumstances === 'yes' && circumstances.additionalCircumstancesDetails + ...(shareCircumstances === 'YES' && circumstances?.additionalCircumstancesDetails ? { 'shareCircumstances.circumstancesDetails': circumstances.additionalCircumstancesDetails } : {}), }; diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index 4f5a5e737..b36ec792c 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -1,4 +1,4 @@ -import type { PossessionClaimResponse } from '../../../interfaces/ccdCase.interface'; +import type { PossessionClaimResponse, YesNoValue } from '../../../interfaces/ccdCase.interface'; import type { StepDefinition } from '../../../interfaces/stepFormData.interface'; import { buildCcdCaseForPossessionClaimResponse } from '../../utils/populateResponseToClaimPayloadmap'; import { flowConfig } from '../flow.config'; @@ -16,15 +16,15 @@ export const step: StepDefinition = createFormStep({ }, fields: [ { - name: 'wouldExperienceExceptionalHardship', + name: 'exceptionalHardship', type: 'radio', required: true, legendClasses: 'govuk-fieldset__legend--m', translationKey: { label: 'question' }, - errorMessage: 'errors.wouldExperienceExceptionalHardship', + errorMessage: 'errors.exceptionalHardship', options: [ { - value: 'yes', + value: 'YES', translationKey: 'options.yes', subFields: { exceptionalHardshipDetails: { @@ -41,7 +41,7 @@ export const step: StepDefinition = createFormStep({ }, }, { - value: 'no', + value: 'NO', translationKey: 'options.no', }, ], @@ -63,21 +63,15 @@ export const step: StepDefinition = createFormStep({ }; }, beforeRedirect: async req => { - const wouldExperienceExceptionalHardship = req.body?.wouldExperienceExceptionalHardship as string | undefined; + const exceptionalHardship = req.body?.exceptionalHardship as YesNoValue | undefined; - if (!wouldExperienceExceptionalHardship) { + if (!exceptionalHardship) { return; } - const enumMapping: Record = { - yes: 'YES', - no: 'NO', - }; - - const exceptionalHardship = enumMapping[wouldExperienceExceptionalHardship]; const exceptionalHardshipDetails = - wouldExperienceExceptionalHardship === 'yes' - ? (req.body?.['wouldExperienceExceptionalHardship.exceptionalHardshipDetails'] as string | undefined) + exceptionalHardship === 'YES' + ? (req.body?.['exceptionalHardship.exceptionalHardshipDetails'] as string | undefined) : undefined; const possessionClaimResponse: PossessionClaimResponse = { @@ -93,32 +87,22 @@ export const step: StepDefinition = createFormStep({ }, getInitialFormData: req => { const caseData = req.res?.locals?.validatedCase?.data; - const existingAnswer = - caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances?.exceptionalHardship; - const exceptionalHardshipDetails = - caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances?.exceptionalHardshipDetails; + const householdCircumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; - // Map CCD enum to frontend value - const formValue = - existingAnswer === 'YES' - ? 'yes' - : existingAnswer === 'NO' - ? 'no' - : existingAnswer === 'Yes' - ? 'yes' - : existingAnswer === 'No' - ? 'no' - : undefined; + // YesOrNo (CCD SDK type) serialises as "Yes"/"No"; normalise to uppercase to match radio option values + const exceptionalHardship = householdCircumstances?.exceptionalHardship + ? (String(householdCircumstances.exceptionalHardship).toUpperCase() as YesNoValue) + : undefined; - if (!formValue) { + if (!exceptionalHardship) { return {}; } return { - wouldExperienceExceptionalHardship: formValue, - ...(formValue === 'yes' && exceptionalHardshipDetails + exceptionalHardship, + ...(exceptionalHardship === 'YES' && householdCircumstances?.exceptionalHardshipDetails ? { - 'wouldExperienceExceptionalHardship.exceptionalHardshipDetails': exceptionalHardshipDetails, + 'exceptionalHardship.exceptionalHardshipDetails': householdCircumstances.exceptionalHardshipDetails, } : {}), }; From 5838406ae9450877139d4acceb3cd8093b960502 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 18:39:19 +0000 Subject: [PATCH 10/15] refactoring index to match implementation across codebase --- .../current-circumstances/index.ts | 23 +++++++-------- .../exceptional-hardship/index.ts | 28 +++++++++++-------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index e5bdb1060..d159d2e21 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -24,7 +24,7 @@ export const step: StepDefinition = createFormStep({ errorMessage: 'errors.shareCircumstances', options: [ { - value: 'YES', + value: 'yes', translationKey: 'options.yes', subFields: { circumstancesDetails: { @@ -41,7 +41,7 @@ export const step: StepDefinition = createFormStep({ }, }, { - value: 'NO', + value: 'no', translationKey: 'options.no', }, ], @@ -60,21 +60,23 @@ export const step: StepDefinition = createFormStep({ }; }, beforeRedirect: async req => { - const shareCircumstances = req.body?.shareCircumstances as YesNoValue | undefined; + const shareCircumstances = req.body?.shareCircumstances as string | undefined; - if (!shareCircumstances) { + if (!shareCircumstances || (shareCircumstances !== 'yes' && shareCircumstances !== 'no')) { return; } + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const shareAdditionalCircumstances = ccdMapping[shareCircumstances]; const additionalCircumstancesDetails = - shareCircumstances === 'YES' + shareCircumstances === 'yes' ? (req.body?.['shareCircumstances.circumstancesDetails'] as string | undefined) : undefined; const possessionClaimResponse: PossessionClaimResponse = { defendantResponses: { householdCircumstances: { - shareAdditionalCircumstances: shareCircumstances, + shareAdditionalCircumstances, additionalCircumstancesDetails, }, }, @@ -85,11 +87,10 @@ export const step: StepDefinition = createFormStep({ getInitialFormData: req => { const caseData = req.res?.locals?.validatedCase?.data; const circumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; + const existingAnswer = circumstances?.shareAdditionalCircumstances as string | undefined; - // YesOrNo (CCD SDK type) serialises as "Yes"/"No"; normalise to uppercase to match radio option values - const shareCircumstances = circumstances?.shareAdditionalCircumstances - ? (String(circumstances.shareAdditionalCircumstances).toUpperCase() as YesNoValue) - : undefined; + const mapping: Record = { Yes: 'yes', No: 'no' }; + const shareCircumstances = existingAnswer ? mapping[existingAnswer] : undefined; if (!shareCircumstances) { return {}; @@ -97,7 +98,7 @@ export const step: StepDefinition = createFormStep({ return { shareCircumstances, - ...(shareCircumstances === 'YES' && circumstances?.additionalCircumstancesDetails + ...(shareCircumstances === 'yes' && circumstances?.additionalCircumstancesDetails ? { 'shareCircumstances.circumstancesDetails': circumstances.additionalCircumstancesDetails } : {}), }; diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index b36ec792c..1fbb84921 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -24,7 +24,7 @@ export const step: StepDefinition = createFormStep({ errorMessage: 'errors.exceptionalHardship', options: [ { - value: 'YES', + value: 'yes', translationKey: 'options.yes', subFields: { exceptionalHardshipDetails: { @@ -41,7 +41,7 @@ export const step: StepDefinition = createFormStep({ }, }, { - value: 'NO', + value: 'no', translationKey: 'options.no', }, ], @@ -63,14 +63,19 @@ export const step: StepDefinition = createFormStep({ }; }, beforeRedirect: async req => { - const exceptionalHardship = req.body?.exceptionalHardship as YesNoValue | undefined; + const exceptionalHardshipValue = req.body?.exceptionalHardship as string | undefined; - if (!exceptionalHardship) { + if ( + !exceptionalHardshipValue || + (exceptionalHardshipValue !== 'yes' && exceptionalHardshipValue !== 'no') + ) { return; } + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const exceptionalHardship = ccdMapping[exceptionalHardshipValue]; const exceptionalHardshipDetails = - exceptionalHardship === 'YES' + exceptionalHardshipValue === 'yes' ? (req.body?.['exceptionalHardship.exceptionalHardshipDetails'] as string | undefined) : undefined; @@ -88,19 +93,18 @@ export const step: StepDefinition = createFormStep({ getInitialFormData: req => { const caseData = req.res?.locals?.validatedCase?.data; const householdCircumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; + const existingAnswer = householdCircumstances?.exceptionalHardship as string | undefined; - // YesOrNo (CCD SDK type) serialises as "Yes"/"No"; normalise to uppercase to match radio option values - const exceptionalHardship = householdCircumstances?.exceptionalHardship - ? (String(householdCircumstances.exceptionalHardship).toUpperCase() as YesNoValue) - : undefined; + const mapping: Record = { Yes: 'yes', No: 'no' }; + const exceptionalHardshipValue = existingAnswer ? mapping[existingAnswer] : undefined; - if (!exceptionalHardship) { + if (!exceptionalHardshipValue) { return {}; } return { - exceptionalHardship, - ...(exceptionalHardship === 'YES' && householdCircumstances?.exceptionalHardshipDetails + exceptionalHardship: exceptionalHardshipValue, + ...(exceptionalHardshipValue === 'yes' && householdCircumstances?.exceptionalHardshipDetails ? { 'exceptionalHardship.exceptionalHardshipDetails': householdCircumstances.exceptionalHardshipDetails, } From 0842578af8621dee833461b252b1ed88e4ae0d4b Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Tue, 24 Mar 2026 18:43:54 +0000 Subject: [PATCH 11/15] fixing linting errors --- .../steps/respond-to-claim/exceptional-hardship/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index 1fbb84921..8c4b51bb3 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -65,10 +65,7 @@ export const step: StepDefinition = createFormStep({ beforeRedirect: async req => { const exceptionalHardshipValue = req.body?.exceptionalHardship as string | undefined; - if ( - !exceptionalHardshipValue || - (exceptionalHardshipValue !== 'yes' && exceptionalHardshipValue !== 'no') - ) { + if (!exceptionalHardshipValue || (exceptionalHardshipValue !== 'yes' && exceptionalHardshipValue !== 'no')) { return; } From 0550ad76a729af13edef07db928b4c80d29cadd6 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Fri, 27 Mar 2026 13:32:16 +0000 Subject: [PATCH 12/15] Align yes/no typing with backend enums and updating stepButtons macros --- src/main/interfaces/ccdCase.interface.ts | 9 +++++---- .../current-circumstances/currentCircumstances.njk | 13 ++----------- .../respond-to-claim/current-circumstances/index.ts | 2 +- .../exceptional-hardship/exceptionalHardship.njk | 13 ++----------- .../respond-to-claim/exceptional-hardship/index.ts | 2 +- 5 files changed, 11 insertions(+), 28 deletions(-) diff --git a/src/main/interfaces/ccdCase.interface.ts b/src/main/interfaces/ccdCase.interface.ts index 372b8c469..11ec92709 100644 --- a/src/main/interfaces/ccdCase.interface.ts +++ b/src/main/interfaces/ccdCase.interface.ts @@ -3,7 +3,8 @@ export enum CaseState { SUBMITTED = 'Submitted', } -export type YesNoValue = 'YES' | 'NO' | null; +export type VerticalYesNoValue = 'YES' | 'NO' | null; +export type YesNoValue = 'Yes' | 'No'; export type ContactPreference = 'EMAIL' | 'POST' | null; export type YesNoNotSureValue = 'YES' | 'NO' | 'NOT_SURE'; @@ -42,7 +43,7 @@ export interface PossessionClaimResponse { firstName?: string; lastName?: string; address?: Address; - phoneNumberProvided?: YesNoValue; + phoneNumberProvided?: VerticalYesNoValue; phoneNumber?: string; emailAddress?: string; }; @@ -50,8 +51,8 @@ export interface PossessionClaimResponse { defendantResponses?: { tenancyStartDateCorrect?: string; tenancyStartDate?: string; - contactByPhone?: YesNoValue; - contactByText?: YesNoValue; + contactByPhone?: VerticalYesNoValue; + contactByText?: VerticalYesNoValue; preferenceType?: ContactPreference; freeLegalAdvice?: string; defendantNameConfirmation?: string; diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index 7a36ce40d..4260b60a5 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -1,4 +1,5 @@ {% extends "stepsTemplate.njk" %} +{% from "macros/stepButtons.njk" import stepButtons %} {% from "govuk/components/button/macro.njk" import govukButton %} {% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} @@ -34,17 +35,7 @@ {% endif %} {% endfor %} -
    - {{ govukButton({ - text: saveAndContinue, - attributes: { type: 'submit', name: 'action', value: 'continue' } - }) }} - {{ govukButton({ - text: saveForLater, - classes: 'govuk-button--secondary', - attributes: { type: 'submit', name: 'action', value: 'saveForLater' } - }) }} -
    + {{ stepButtons(saveAndContinue, saveForLater) }} {{ csrfProtection(csrfToken) }} {% endblock %} diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index d159d2e21..c66cd8c9f 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -66,7 +66,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; const shareAdditionalCircumstances = ccdMapping[shareCircumstances]; const additionalCircumstancesDetails = shareCircumstances === 'yes' diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk index 5b9157f41..9221c803e 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk +++ b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk @@ -1,4 +1,5 @@ {% extends "stepsTemplate.njk" %} +{% from "macros/stepButtons.njk" import stepButtons %} {% from "govuk/components/button/macro.njk" import govukButton %} {% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} @@ -36,17 +37,7 @@ {% endif %} {% endfor %} -
    - {{ govukButton({ - text: saveAndContinue, - attributes: { type: 'submit', name: 'action', value: 'continue' } - }) }} - {{ govukButton({ - text: saveForLater, - classes: 'govuk-button--secondary', - attributes: { type: 'submit', name: 'action', value: 'saveForLater' } - }) }} -
    + {{ stepButtons(saveAndContinue, saveForLater) }} {{ csrfProtection(csrfToken) }} {% endblock %} diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index 8c4b51bb3..e115b6be8 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -69,7 +69,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; const exceptionalHardship = ccdMapping[exceptionalHardshipValue]; const exceptionalHardshipDetails = exceptionalHardshipValue === 'yes' From 4c4be1863002ece9776b4685a847b4ad36af8e4a Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Mon, 30 Mar 2026 09:07:25 +0100 Subject: [PATCH 13/15] quick dash amend on page title --- .../current-circumstances/currentCircumstances.njk | 2 +- .../exceptional-hardship/exceptionalHardship.njk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk index 4260b60a5..7eed60f2c 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk +++ b/src/main/steps/respond-to-claim/current-circumstances/currentCircumstances.njk @@ -5,7 +5,7 @@ {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} {% from "macros/csrf.njk" import csrfProtection %} {% block pageTitle %} - {{ pageTitle }} - HM Courts & Tribunals Service – GOV.UK + {{ pageTitle }} – HM Courts & Tribunals Service – GOV.UK {% endblock %} {% block mainContent %} {% if errorSummary %} diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk index 9221c803e..42972d1de 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk +++ b/src/main/steps/respond-to-claim/exceptional-hardship/exceptionalHardship.njk @@ -5,7 +5,7 @@ {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %} {% from "macros/csrf.njk" import csrfProtection %} {% block pageTitle %} - {{ pageTitle }} - HM Courts & Tribunals Service – GOV.UK + {{ pageTitle }} – HM Courts & Tribunals Service – GOV.UK {% endblock %} {% block mainContent %} {% if errorSummary %} From d4ebae3fe4f7cb1b46e468e3a6fa7a62e2e46e9c Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Mon, 30 Mar 2026 09:43:00 +0100 Subject: [PATCH 14/15] updating enums again --- .../steps/respond-to-claim/current-circumstances/index.ts | 4 ++-- src/main/steps/respond-to-claim/exceptional-hardship/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index c66cd8c9f..cff26a5ed 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -66,7 +66,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; const shareAdditionalCircumstances = ccdMapping[shareCircumstances]; const additionalCircumstancesDetails = shareCircumstances === 'yes' @@ -89,7 +89,7 @@ export const step: StepDefinition = createFormStep({ const circumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; const existingAnswer = circumstances?.shareAdditionalCircumstances as string | undefined; - const mapping: Record = { Yes: 'yes', No: 'no' }; + const mapping: Record = { YES: 'yes', NO: 'no' }; const shareCircumstances = existingAnswer ? mapping[existingAnswer] : undefined; if (!shareCircumstances) { diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index e115b6be8..6f37ff9df 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -69,7 +69,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; const exceptionalHardship = ccdMapping[exceptionalHardshipValue]; const exceptionalHardshipDetails = exceptionalHardshipValue === 'yes' @@ -92,7 +92,7 @@ export const step: StepDefinition = createFormStep({ const householdCircumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; const existingAnswer = householdCircumstances?.exceptionalHardship as string | undefined; - const mapping: Record = { Yes: 'yes', No: 'no' }; + const mapping: Record = { YES: 'yes', NO: 'no' }; const exceptionalHardshipValue = existingAnswer ? mapping[existingAnswer] : undefined; if (!exceptionalHardshipValue) { From c4a93ee4ad9b67b654d8b489d6fee0069440d444 Mon Sep 17 00:00:00 2001 From: Simon Middleton Date: Mon, 30 Mar 2026 10:50:05 +0100 Subject: [PATCH 15/15] updating enum values and casing --- src/main/interfaces/ccdCase.interface.ts | 4 ++-- .../steps/respond-to-claim/current-circumstances/index.ts | 4 ++-- src/main/steps/respond-to-claim/exceptional-hardship/index.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/interfaces/ccdCase.interface.ts b/src/main/interfaces/ccdCase.interface.ts index 61d0c7fcc..969857deb 100644 --- a/src/main/interfaces/ccdCase.interface.ts +++ b/src/main/interfaces/ccdCase.interface.ts @@ -4,8 +4,8 @@ export enum CaseState { } export type VerticalYesNoValue = 'YES' | 'NO' | null; -export type YesNoValue = 'YES' | 'NO' | null; -export type TenancyTypeCorrectValue = YesNoValue | 'NOT_SURE'; +export type YesNoValue = 'Yes' | 'No'; +export type TenancyTypeCorrectValue = VerticalYesNoValue | 'NOT_SURE'; export type ContactPreference = 'EMAIL' | 'POST' | null; export type YesNoNotSureValue = 'YES' | 'NO' | 'NOT_SURE'; diff --git a/src/main/steps/respond-to-claim/current-circumstances/index.ts b/src/main/steps/respond-to-claim/current-circumstances/index.ts index cff26a5ed..c66cd8c9f 100644 --- a/src/main/steps/respond-to-claim/current-circumstances/index.ts +++ b/src/main/steps/respond-to-claim/current-circumstances/index.ts @@ -66,7 +66,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; const shareAdditionalCircumstances = ccdMapping[shareCircumstances]; const additionalCircumstancesDetails = shareCircumstances === 'yes' @@ -89,7 +89,7 @@ export const step: StepDefinition = createFormStep({ const circumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; const existingAnswer = circumstances?.shareAdditionalCircumstances as string | undefined; - const mapping: Record = { YES: 'yes', NO: 'no' }; + const mapping: Record = { Yes: 'yes', No: 'no' }; const shareCircumstances = existingAnswer ? mapping[existingAnswer] : undefined; if (!shareCircumstances) { diff --git a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts index 6f37ff9df..e115b6be8 100644 --- a/src/main/steps/respond-to-claim/exceptional-hardship/index.ts +++ b/src/main/steps/respond-to-claim/exceptional-hardship/index.ts @@ -69,7 +69,7 @@ export const step: StepDefinition = createFormStep({ return; } - const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'YES', no: 'NO' }; + const ccdMapping: Record<'yes' | 'no', YesNoValue> = { yes: 'Yes', no: 'No' }; const exceptionalHardship = ccdMapping[exceptionalHardshipValue]; const exceptionalHardshipDetails = exceptionalHardshipValue === 'yes' @@ -92,7 +92,7 @@ export const step: StepDefinition = createFormStep({ const householdCircumstances = caseData?.possessionClaimResponse?.defendantResponses?.householdCircumstances; const existingAnswer = householdCircumstances?.exceptionalHardship as string | undefined; - const mapping: Record = { YES: 'yes', NO: 'no' }; + const mapping: Record = { Yes: 'yes', No: 'no' }; const exceptionalHardshipValue = existingAnswer ? mapping[existingAnswer] : undefined; if (!exceptionalHardshipValue) {