Merged PR 2256: refactor(representations): preserve Welsh conditional validation and summary...

refactor(representations): preserve Welsh conditional validation and summary parity

Related work items: #22441
This commit is contained in:
Robert Bond
2026-04-17 12:44:23 +00:00
parent 33f31ad3c8
commit 7713fc3724
8 changed files with 949 additions and 899 deletions
@@ -61,6 +61,13 @@ const RepCompleteSubmit = (props) => {
repFormData = updateLinks(repFormData); repFormData = updateLinks(repFormData);
const representationOnBehalfOfDisplay =
repFormData.representationOnBehalfOf === "Yes"
? t("myrepresentations:questionnaire-yes")
: repFormData.representationOnBehalfOf === "No"
? t("myrepresentations:questionnaire-no")
: repFormData.representationOnBehalfOf;
//const repDate = new Date(); //const repDate = new Date();
// let day = repDate.getDate(); // let day = repDate.getDate();
@@ -406,7 +413,7 @@ const RepCompleteSubmit = (props) => {
<dd className="govuk-summary-list__value"> <dd className="govuk-summary-list__value">
{ {
repFormData.representationOnBehalfOf representationOnBehalfOfDisplay
} }
</dd> </dd>
@@ -258,6 +258,26 @@ export const RenderCondtionalRadioList = ({
}) => { }) => {
const required = (value) => (value ? undefined : "Required"); const required = (value) => (value ? undefined : "Required");
let { t } = useTranslation(); let { t } = useTranslation();
const yesValue = t("myrepresentations:questionnaire-yes");
const noValue = t("myrepresentations:questionnaire-no");
const normalizeYesNo = (rawValue) => {
if (rawValue === true) return "Yes";
if (rawValue === false) return "No";
if (rawValue === "Yes" || rawValue === yesValue) return "Yes";
if (rawValue === "No" || rawValue === noValue) return "No";
return rawValue;
};
const isYesSelected = normalizeYesNo(value) === "Yes";
const requiredIfYes = (fieldValue, allValues) => {
const selectedValue = normalizeYesNo(allValues?.[id]);
return selectedValue === "Yes" && !String(fieldValue || "").trim()
? "Required"
: undefined;
};
return ( return (
<> <>
<div <div
@@ -304,68 +324,84 @@ export const RenderCondtionalRadioList = ({
{custom.hint} {custom.hint}
</div> </div>
<div className="govuk-radios"> <div className="govuk-radios">
{Object.keys(options).map((key, index) => ( {Object.keys(options).map((key, index) => {
<div key={key} className="govuk-!-margin-bottom-3"> const normalizedOptionValue = normalizeYesNo(
options[key]
);
return (
<div <div
className="govuk-radios__item"
data-children-count={key}
key={key} key={key}
className="govuk-!-margin-bottom-3"
> >
<Field
id={id + "_" + index}
name={id}
component="input"
type="radio"
className="govuk-radios__input"
value={options[key]}
validate={[required]}
/>
<label
className="govuk-label govuk-radios__label"
htmlFor={id + "_" + index}
>
{options[key] == "Yes"
? t(
"myrepresentations:questionnaire-yes"
)
: t(
"myrepresentations:questionnaire-no"
)}
</label>
</div>
{value == "Yes" && options[key] == "Yes" && (
<div <div
className="govuk-radios__conditional " className="govuk-radios__item"
id={"conditional-" + id} data-children-count={key}
key={key}
> >
<div <Field
className="govuk-form-group" id={id + "_" + index}
key={"yes_group_" + key} name={id}
component="input"
type="radio"
className="govuk-radios__input"
value={normalizedOptionValue}
validate={[required]}
/>
<label
className="govuk-label govuk-radios__label"
htmlFor={id + "_" + index}
> >
<label {options[key] == "Yes"
className="govuk-label" ? t(
htmlFor={id + "_details"} "myrepresentations:questionnaire-yes"
> )
{t( : t(
"myrepresentations:representation-onbehalfof-label" "myrepresentations:questionnaire-no"
)} )}
</label> </label>
<Field
className="govuk-input govuk-!-width-one-half"
id={id + "_details"}
name={id + "_details"}
component={RenderTextfield}
type="text"
validate={[required]}
errorMsg={t(
"myrepresentations:is-required-label"
)}
/>
</div>
</div> </div>
)} {isYesSelected &&
</div> normalizedOptionValue === "Yes" && (
))} <div
className="govuk-radios__conditional "
id={"conditional-" + id}
>
<div
className="govuk-form-group"
key={"yes_group_" + key}
>
<label
className="govuk-label"
htmlFor={
id + "_details"
}
>
{t(
"myrepresentations:representation-onbehalfof-label"
)}
</label>
<Field
className="govuk-input govuk-!-width-one-half"
id={id + "_details"}
name={id + "_details"}
component={
RenderTextfield
}
type="text"
validate={[
requiredIfYes
]}
errorMsg={t(
"myrepresentations:is-required-label"
)}
/>
</div>
</div>
)}
</div>
);
})}
</div> </div>
</fieldset> </fieldset>
</div> </div>
@@ -114,12 +114,7 @@ const RepInterestedPartyPerson = (props) => {
name="representationOnBehalfOf" name="representationOnBehalfOf"
datafieldname="representationOnBehalfOf" datafieldname="representationOnBehalfOf"
// label="In what capacity do you wish to make representations on this case?" // label="In what capacity do you wish to make representations on this case?"
options={[ options={["Yes", "No"]}
t(
"myrepresentations:questionnaire-yes"
),
t("myrepresentations:questionnaire-no")
]}
id="representationOnBehalfOf" id="representationOnBehalfOf"
className="govuk-radios__input" className="govuk-radios__input"
errorMsg={t( errorMsg={t(
@@ -0,0 +1,24 @@
const SummaryCard = ({
id,
title,
headingTag = "h2",
headingClassName = "govuk-heading-m govuk-!-margin-bottom-7",
children
}) => {
const HeadingTag = headingTag;
return (
<div className="card" id={id}>
<div className="card-body">
<div className="govuk-grid-column-full">
<HeadingTag className={headingClassName}>
{title}
</HeadingTag>
{children}
</div>
</div>
</div>
);
};
export default SummaryCard;
@@ -0,0 +1,15 @@
const SummaryRow = ({
label,
value,
keyClassName = "govuk-summary-list__key",
valueClassName = "govuk-summary-list__value"
}) => {
return (
<div className="govuk-summary-list__row">
<dt className={keyClassName}>{label}</dt>
<dd className={valueClassName}>{value}</dd>
</div>
);
};
export default SummaryRow;
@@ -3,6 +3,8 @@ import _ from "lodash";
import useTranslation from "next-translate/useTranslation"; import useTranslation from "next-translate/useTranslation";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import transLookup from "../../../data/lookuptranslations.json"; import transLookup from "../../../data/lookuptranslations.json";
import SummaryCard from "../summary/components/SummaryCard";
import SummaryRow from "../summary/components/SummaryRow";
const Pinswg_planningappeals78id = (props) => { const Pinswg_planningappeals78id = (props) => {
let { t } = useTranslation(); let { t } = useTranslation();
@@ -13,345 +15,300 @@ const Pinswg_planningappeals78id = (props) => {
return ( return (
<div className="govuk-grid-row"> <div className="govuk-grid-row">
<div className="flex-container grid-row govuk-body case"> <div className="flex-container grid-row govuk-body case">
<div className="card" id="case-details-card"> <SummaryCard
<div className="card-body"> id="case-details-card"
<div className="govuk-grid-column-full"> title={t("case:summary-case-details-label")}
<h2 className="govuk-heading-m govuk-!-margin-bottom-7"> >
{t("case:summary-case-details-label")} <dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9">
</h2> <SummaryRow
label={t("case:summary-case-type-label")}
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9"> value={
<div className="govuk-summary-list__row"> router.locale == "cy"
<dt className="govuk-summary-list__key"> ? jsonpath({
{t("case:summary-case-type-label")} path:
</dt> '$..[?(@ && @.value=="' +
<dd className="govuk-summary-list__value"> casesObj[
{router.locale == "cy"
? jsonpath({
path:
'$..[?(@ && @.value=="' +
casesObj[
"pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
] +
'")].value_cy',
json: transLookup,
eval: true,
})
: casesObj[
"pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue" "pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-date-entered-label" json: transLookup,
)} eval: true
</dd> })
</div> : casesObj[
<div className="govuk-summary-list__row"> "pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
<dt className="govuk-summary-list__key"> ] ||
{t("case:summary-lpa-label")} t("case:summary-no-date-entered-label")
</dt> }
<dd className="govuk-summary-list__value"> />
{router.locale == "cy" <div className="govuk-summary-list__row">
? jsonpath({ <dt className="govuk-summary-list__key">
path: {t("case:summary-lpa-label")}
'$..[?(@ && @.value=="' + </dt>
casesObj[ <dd className="govuk-summary-list__value">
"_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue" {router.locale == "cy"
] + ? jsonpath({
'")].value_cy', path:
json: transLookup, '$..[?(@ && @.value=="' +
eval: true, casesObj[
})
: casesObj[
"_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue" "_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue"
] || ""} ] +
</dd> '")].value_cy',
</div> json: transLookup,
<div className="govuk-summary-list__row"> eval: true
<dt className="govuk-summary-list__key"> })
{t("case:summary-eia-required-label")} : casesObj[
</dt> "_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue"
<dd className="govuk-summary-list__value"> ] || ""}
{router.locale == "cy" </dd>
? jsonpath( </div>
'$..[?(@.value=="' + <div className="govuk-summary-list__row">
detailsObj[ <dt className="govuk-summary-list__key">
"pinswg_eiarequired@OData.Community.Display.V1.FormattedValue" {t("case:summary-eia-required-label")}
] + </dt>
'")].value_cy', <dd className="govuk-summary-list__value">
transLookup {router.locale == "cy"
) ? jsonpath(
: detailsObj[ '$..[?(@.value=="' +
detailsObj[
"pinswg_eiarequired@OData.Community.Display.V1.FormattedValue" "pinswg_eiarequired@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-to-be-confirmed-label" transLookup
)} )
</dd> : detailsObj[
</div> "pinswg_eiarequired@OData.Community.Display.V1.FormattedValue"
<div className="govuk-summary-list__row"> ] ||
<dt className="govuk-summary-list__key"> t("case:summary-to-be-confirmed-label")}
{t("case:summary-procedure-label")} </dd>
</dt> </div>
<dd className="govuk-summary-list__value"> <div className="govuk-summary-list__row">
{router.locale == "cy" <dt className="govuk-summary-list__key">
? jsonpath({ {t("case:summary-procedure-label")}
path: </dt>
'$..[?(@ && @.value=="' + <dd className="govuk-summary-list__value">
detailsObj[ {router.locale == "cy"
"pinswg_procedure@OData.Community.Display.V1.FormattedValue" ? jsonpath({
] + path:
'")].value_cy', '$..[?(@ && @.value=="' +
json: transLookup, detailsObj[
eval: true,
})
: detailsObj[
"pinswg_procedure@OData.Community.Display.V1.FormattedValue" "pinswg_procedure@OData.Community.Display.V1.FormattedValue"
] || ""} ] +
</dd> '")].value_cy',
</div> json: transLookup,
<div className="govuk-summary-list__row"> eval: true
<dt className="govuk-summary-list__key"> })
{t("case:summary-type-of-event-label")} : detailsObj[
</dt> "pinswg_procedure@OData.Community.Display.V1.FormattedValue"
<dd className="govuk-summary-list__value"> ] || ""}
{router.locale == "cy" </dd>
? jsonpath({ </div>
path: <div className="govuk-summary-list__row">
'$..[?(@ && @.value=="' + <dt className="govuk-summary-list__key">
detailsObj[ {t("case:summary-type-of-event-label")}
"pinswg_typeofevent@OData.Community.Display.V1.FormattedValue" </dt>
] + <dd className="govuk-summary-list__value">
'")].value_cy', {router.locale == "cy"
json: transLookup, ? jsonpath({
eval: true, path:
}) '$..[?(@ && @.value=="' +
: detailsObj[ detailsObj[
"pinswg_typeofevent@OData.Community.Display.V1.FormattedValue" "pinswg_typeofevent@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-information-to-date-label" json: transLookup,
)} eval: true
</dd> })
</div> : detailsObj[
<div className="govuk-summary-list__row"> "pinswg_typeofevent@OData.Community.Display.V1.FormattedValue"
<dt className="govuk-summary-list__key"> ] ||
{t("case:summary-status-label")} t(
</dt> "case:summary-no-information-to-date-label"
<dd className="govuk-summary-list__value"> )}
{router.locale == "cy" </dd>
? jsonpath({ </div>
path: <div className="govuk-summary-list__row">
'$..[?(@ && @.value=="' + <dt className="govuk-summary-list__key">
casesObj[ {t("case:summary-status-label")}
"statuscode@OData.Community.Display.V1.FormattedValue" </dt>
] + <dd className="govuk-summary-list__value">
'")].value_cy', {router.locale == "cy"
json: transLookup, ? jsonpath({
eval: true, path:
}) '$..[?(@ && @.value=="' +
: casesObj[ casesObj[
"statuscode@OData.Community.Display.V1.FormattedValue" "statuscode@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-date-entered-label" json: transLookup,
)} eval: true
</dd> })
</div> : casesObj[
<div className="govuk-summary-list__row"> "statuscode@OData.Community.Display.V1.FormattedValue"
<dt className="govuk-summary-list__key"> ] ||
{t("case:summary-decision-label")} t("case:summary-no-date-entered-label")}
</dt> </dd>
<dd className="govuk-summary-list__value"> </div>
{router.locale == "cy" <div className="govuk-summary-list__row">
? jsonpath({ <dt className="govuk-summary-list__key">
path: {t("case:summary-decision-label")}
'$..[?(@ && @.value=="' + </dt>
detailsObj[ <dd className="govuk-summary-list__value">
"pinswg_dicision@OData.Community.Display.V1.FormattedValue" {router.locale == "cy"
] + ? jsonpath({
'")].value_cy', path:
json: transLookup, '$..[?(@ && @.value=="' +
eval: true, detailsObj[
})
: detailsObj[
"pinswg_dicision@OData.Community.Display.V1.FormattedValue" "pinswg_dicision@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-information-to-date-label" json: transLookup,
)} eval: true
})
: detailsObj[
"pinswg_dicision@OData.Community.Display.V1.FormattedValue"
] ||
t(
"case:summary-no-information-to-date-label"
)}
<br /> <br />
{/* <Link href="/"> {/* <Link href="/">
<a> <a>
{casesObj.caseDetails {casesObj.caseDetails
.outcome_document || ""} .outcome_document || ""}
</a> </a>
</Link> */} </Link> */}
</dd> </dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-decision-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_casedecisiondate"
)
? !_.isEmpty(
detailsObj.pinswg_casedecisiondate
)
? formatDates(
detailsObj.pinswg_casedecisiondate
)
: t(
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
{casesObj.numberofchildincidents > 0 && (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-case-link-status-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(casesObj, [
"numberofchildincidents",
])
? casesObj.numberofchildincidents >
0
? t(
"case:summary-case-link-status-linked"
)
: t(
"case:summary-case-link-status-not-linked"
)
: t(
"case:summary-case-link-status-not-linked"
)}
</dd>
</div>
)}
{casesObj.numberofchildincidents > 0 ? (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-linked-cases-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{linkedCasesList(
props.currentView
.linkedCaseReferences
)}
</dd>
</div>
) : (
""
)}
</dl>
</div> </div>
</div> <div className="govuk-summary-list__row">
</div> <dt className="govuk-summary-list__key">
<div className="card" id="key-dates-card"> {t("case:summary-decision-date-label")}
<div className="card-body"> </dt>
<div className="govuk-grid-column-full"> <dd className="govuk-summary-list__value">
<h3 className="govuk-heading-m govuk-!-margin-bottom-7"> {_.has(detailsObj, "pinswg_casedecisiondate")
{t("case:summary-dates-label")} ? !_.isEmpty(
</h3> detailsObj.pinswg_casedecisiondate
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9"> )
<div className="govuk-summary-list__row"> ? formatDates(
<dt className="govuk-summary-list__key"> detailsObj.pinswg_casedecisiondate
{t("case:summary-start-date-label")} )
</dt> : t(
<dd className="govuk-summary-list__value"> "case:summary-no-date-entered-label"
{_.has(detailsObj, "pinswg_startdate") )
? !_.isEmpty( : t("case:summary-no-date-entered-label")}
detailsObj.pinswg_startdate </dd>
</div>
{casesObj.numberofchildincidents > 0 && (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-case-link-status-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(casesObj, ["numberofchildincidents"])
? casesObj.numberofchildincidents > 0
? t(
"case:summary-case-link-status-linked"
) )
? formatDates(
detailsObj.pinswg_startdate
)
: t(
"case:summary-no-date-entered-label"
)
: _.has(
detailsObj,
"pinswg_startdates"
)
? !_.isEmpty(
detailsObj.pinswg_startdates
)
? formatDates(
detailsObj.pinswg_startdates
)
: t(
"case:summary-no-date-entered-label"
)
: t( : t(
"case:summary-no-date-entered-label" "case:summary-case-link-status-not-linked"
)}
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-questionnaire-due-date-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_questionnaireduedate"
)
? !_.isEmpty(
detailsObj.pinswg_questionnaireduedate
) )
? formatDates( : t(
detailsObj.pinswg_questionnaireduedate "case:summary-case-link-status-not-linked"
) )}
: t( </dd>
"case:summary-no-date-entered-label" </div>
) )}
: t( {casesObj.numberofchildincidents > 0 ? (
"case:summary-no-date-entered-label" <div className="govuk-summary-list__row">
)} <dt className="govuk-summary-list__key">
</dd> {t("case:summary-linked-cases-label")}
</div> </dt>
<dd className="govuk-summary-list__value">
{linkedCasesList(
props.currentView.linkedCaseReferences
)}
</dd>
</div>
) : (
""
)}
</dl>
</SummaryCard>
<SummaryCard
id="key-dates-card"
title={t("case:summary-dates-label")}
headingTag="h3"
>
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9">
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-start-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_startdate")
? !_.isEmpty(detailsObj.pinswg_startdate)
? formatDates(
detailsObj.pinswg_startdate
)
: t(
"case:summary-no-date-entered-label"
)
: _.has(detailsObj, "pinswg_startdates")
? !_.isEmpty(detailsObj.pinswg_startdates)
? formatDates(
detailsObj.pinswg_startdates
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t("case:summary-questionnaire-due-date-label")}
"case:summary-statement-interested-party-due-date-label" </dt>
)} <dd className="govuk-summary-list__value">
</dt> {_.has(
<dd className="govuk-summary-list__value"> detailsObj,
{_.has( "pinswg_questionnaireduedate"
detailsObj, )
"pinswg_statementduedate" ? !_.isEmpty(
) detailsObj.pinswg_questionnaireduedate
? !_.isEmpty( )
detailsObj.pinswg_statementduedate ? formatDates(
) detailsObj.pinswg_questionnaireduedate
? formatDates( )
detailsObj.pinswg_statementduedate : t(
) "case:summary-no-date-entered-label"
: t( )
"case:summary-no-date-entered-label" : t("case:summary-no-date-entered-label")}
) </dd>
: t( </div>
"case:summary-no-date-entered-label"
)}
</dd>
</div>
{/* <div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-statement-interested-party-due-date-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_statementduedate")
? !_.isEmpty(
detailsObj.pinswg_statementduedate
)
? formatDates(
detailsObj.pinswg_statementduedate
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
{/* <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t(
"case:summary-interested-party-date-label" "case:summary-interested-party-date-label"
@@ -390,32 +347,28 @@ const Pinswg_planningappeals78id = (props) => {
</dd> </dd>
</div> */} </div> */}
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t("case:summary-final-comments-date-label")}
"case:summary-final-comments-date-label" </dt>
)} <dd className="govuk-summary-list__value">
</dt> {_.has(
<dd className="govuk-summary-list__value"> detailsObj,
{_.has( "pinswg_finalcommentsduedate"
detailsObj, )
"pinswg_finalcommentsduedate" ? !_.isEmpty(
) detailsObj.pinswg_finalcommentsduedate
? !_.isEmpty( )
detailsObj.pinswg_finalcommentsduedate ? formatDates(
) detailsObj.pinswg_finalcommentsduedate
? formatDates( )
detailsObj.pinswg_finalcommentsduedate : t(
) "case:summary-no-date-entered-label"
: t( )
"case:summary-no-date-entered-label" : t("case:summary-no-date-entered-label")}
) </dd>
: t( </div>
"case:summary-no-date-entered-label" {/* <div className="govuk-summary-list__row">
)}
</dd>
</div>
{/* <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t(
"case:summary-inquiry-evidence-date-label" "case:summary-inquiry-evidence-date-label"
@@ -440,7 +393,7 @@ const Pinswg_planningappeals78id = (props) => {
)} )}
</dd> </dd>
</div> */} </div> */}
{/* <div className="govuk-summary-list__row"> {/* <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t("case:summary-event-date-label")} {t("case:summary-event-date-label")}
</dt> </dt>
@@ -464,67 +417,61 @@ const Pinswg_planningappeals78id = (props) => {
</dd> </dd>
</div> */} </div> */}
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t("case:summary-event-date-label")} {t("case:summary-event-date-label")}
</dt> </dt>
<dd className="govuk-summary-list__value"> <dd className="govuk-summary-list__value">
{_.has( {_.has(
detailsObj, detailsObj,
"pinswg_startdatetimeiftheevent" "pinswg_startdatetimeiftheevent"
) )
? !_.isEmpty( ? !_.isEmpty(
detailsObj.pinswg_startdatetimeiftheevent detailsObj.pinswg_startdatetimeiftheevent
)
? formatDates(
detailsObj.pinswg_startdatetimeiftheevent
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
{detailsObj.pinswg_typeofevent == 846040002 ||
detailsObj.pinswg_typeofevent == 846040007 ||
detailsObj.pinswg_typeofevent == 846040012 ||
detailsObj.pinswg_typeofevent == 846040009 ? (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-start-event-time-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_startdatetimeiftheevent"
)
? !_.isEmpty(
detailsObj.pinswg_startdatetimeiftheevent
)
? formatDates(
detailsObj.pinswg_startdatetimeiftheevent,
true
) )
? formatDates(
detailsObj.pinswg_startdatetimeiftheevent
)
: t(
"case:summary-no-date-entered-label"
)
: t( : t(
"case:summary-no-date-entered-label" "case:summary-no-date-entered-label"
)} )
</dd> : t(
</div> "case:summary-no-date-entered-label"
{detailsObj.pinswg_typeofevent == 846040002 || )}
detailsObj.pinswg_typeofevent == 846040007 || </dd>
detailsObj.pinswg_typeofevent == 846040012 || </div>
detailsObj.pinswg_typeofevent == 846040009 ? ( ) : (
<div className="govuk-summary-list__row"> ""
<dt className="govuk-summary-list__key"> )}
{t( </dl>
"case:summary-start-event-time-label" </SummaryCard>
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_startdatetimeiftheevent"
)
? !_.isEmpty(
detailsObj.pinswg_startdatetimeiftheevent
)
? formatDates(
detailsObj.pinswg_startdatetimeiftheevent,
true
)
: t(
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
) : (
""
)}
</dl>
</div>
</div>
</div>
</div> </div>
</div> </div>
); );
@@ -3,6 +3,8 @@ import _ from "lodash";
import useTranslation from "next-translate/useTranslation"; import useTranslation from "next-translate/useTranslation";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import transLookup from "../../../data/lookuptranslations.json"; import transLookup from "../../../data/lookuptranslations.json";
import SummaryCard from "../summary/components/SummaryCard";
import SummaryRow from "../summary/components/SummaryRow";
const Pinswg_planningconditionss73s79id = (props) => { const Pinswg_planningconditionss73s79id = (props) => {
let { t } = useTranslation(); let { t } = useTranslation();
@@ -13,383 +15,335 @@ const Pinswg_planningconditionss73s79id = (props) => {
return ( return (
<div className="govuk-grid-row"> <div className="govuk-grid-row">
<div className="flex-container grid-row govuk-body case"> <div className="flex-container grid-row govuk-body case">
<div className="card" id="case-details-card"> <SummaryCard
<div className="card-body"> id="case-details-card"
<div className="govuk-grid-column-full"> title={t("case:summary-case-details-label")}
<h2 className="govuk-heading-m govuk-!-margin-bottom-7"> >
{t("case:summary-case-details-label")} <dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9">
</h2> <SummaryRow
label={t("case:summary-case-type-label")}
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9"> value={
<div className="govuk-summary-list__row"> router.locale == "cy"
<dt className="govuk-summary-list__key"> ? jsonpath({
{t("case:summary-case-type-label")} path:
</dt> '$..[?(@ && @.value=="' +
<dd className="govuk-summary-list__value"> casesObj[
{router.locale == "cy"
? jsonpath({
path:
'$..[?(@ && @.value=="' +
casesObj[
"pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
] +
'")].value_cy',
json: transLookup,
eval: true,
})
: casesObj[
"pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue" "pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-date-entered-label" json: transLookup,
)} eval: true
</dd> })
</div> : casesObj[
<div className="govuk-summary-list__row"> "pinswg_appealcasetype@OData.Community.Display.V1.FormattedValue"
<dt className="govuk-summary-list__key"> ] ||
{t("case:summary-lpa-label")} t("case:summary-no-date-entered-label")
</dt> }
<dd className="govuk-summary-list__value"> />
{router.locale == "cy" <div className="govuk-summary-list__row">
? jsonpath({ <dt className="govuk-summary-list__key">
path: {t("case:summary-lpa-label")}
'$..[?(@ && @.value=="' + </dt>
casesObj[ <dd className="govuk-summary-list__value">
"_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue" {router.locale == "cy"
] + ? jsonpath({
'")].value_cy', path:
json: transLookup, '$..[?(@ && @.value=="' +
eval: true, casesObj[
})
: casesObj[
"_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue" "_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue"
] || ""} ] +
</dd> '")].value_cy',
</div> json: transLookup,
<div className="govuk-summary-list__row"> eval: true
<dt className="govuk-summary-list__key"> })
{t("case:summary-eia-required-label")} : casesObj[
</dt> "_pinswg_associatedlpa_value@OData.Community.Display.V1.FormattedValue"
<dd className="govuk-summary-list__value"> ] || ""}
{router.locale == "cy" </dd>
? jsonpath( </div>
'$..[?(@.value=="' + <div className="govuk-summary-list__row">
detailsObj[ <dt className="govuk-summary-list__key">
"pinswg_detailedeiascreeningrequiered@OData.Community.Display.V1.FormattedValue" {t("case:summary-eia-required-label")}
] + </dt>
'")].value_cy', <dd className="govuk-summary-list__value">
transLookup {router.locale == "cy"
) ? jsonpath(
: detailsObj[ '$..[?(@.value=="' +
detailsObj[
"pinswg_detailedeiascreeningrequiered@OData.Community.Display.V1.FormattedValue" "pinswg_detailedeiascreeningrequiered@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-to-be-confirmed-label" transLookup
)} )
</dd> : detailsObj[
</div> "pinswg_detailedeiascreeningrequiered@OData.Community.Display.V1.FormattedValue"
<div className="govuk-summary-list__row"> ] ||
<dt className="govuk-summary-list__key"> t("case:summary-to-be-confirmed-label")}
{t("case:summary-procedure-label")} </dd>
</dt> </div>
<dd className="govuk-summary-list__value"> <div className="govuk-summary-list__row">
{router.locale == "cy" <dt className="govuk-summary-list__key">
? jsonpath({ {t("case:summary-procedure-label")}
path: </dt>
'$..[?(@ && @.value=="' + <dd className="govuk-summary-list__value">
detailsObj[ {router.locale == "cy"
"pinswg_procedure@OData.Community.Display.V1.FormattedValue" ? jsonpath({
] + path:
'")].value_cy', '$..[?(@ && @.value=="' +
json: transLookup, detailsObj[
eval: true,
})
: detailsObj[
"pinswg_procedure@OData.Community.Display.V1.FormattedValue" "pinswg_procedure@OData.Community.Display.V1.FormattedValue"
] || ""} ] +
</dd> '")].value_cy',
</div> json: transLookup,
<div className="govuk-summary-list__row"> eval: true
<dt className="govuk-summary-list__key"> })
{t("case:summary-type-of-event-label")} : detailsObj[
</dt> "pinswg_procedure@OData.Community.Display.V1.FormattedValue"
<dd className="govuk-summary-list__value"> ] || ""}
{router.locale == "cy" </dd>
? jsonpath({ </div>
path: <div className="govuk-summary-list__row">
'$..[?(@ && @.value=="' + <dt className="govuk-summary-list__key">
detailsObj[ {t("case:summary-type-of-event-label")}
"pinswg_typeofevent@OData.Community.Display.V1.FormattedValue" </dt>
] + <dd className="govuk-summary-list__value">
'")].value_cy', {router.locale == "cy"
json: transLookup, ? jsonpath({
eval: true, path:
}) '$..[?(@ && @.value=="' +
: detailsObj[ detailsObj[
"pinswg_typeofevent@OData.Community.Display.V1.FormattedValue" "pinswg_typeofevent@OData.Community.Display.V1.FormattedValue"
] || ""} ] +
</dd> '")].value_cy',
</div> json: transLookup,
<div className="govuk-summary-list__row"> eval: true
<dt className="govuk-summary-list__key"> })
{t("case:summary-status-label")} : detailsObj[
</dt> "pinswg_typeofevent@OData.Community.Display.V1.FormattedValue"
<dd className="govuk-summary-list__value"> ] || ""}
{router.locale == "cy" </dd>
? jsonpath({ </div>
path: <div className="govuk-summary-list__row">
'$..[?(@ && @.value=="' + <dt className="govuk-summary-list__key">
casesObj[ {t("case:summary-status-label")}
"statuscode@OData.Community.Display.V1.FormattedValue" </dt>
] + <dd className="govuk-summary-list__value">
'")].value_cy', {router.locale == "cy"
json: transLookup, ? jsonpath({
eval: true, path:
}) '$..[?(@ && @.value=="' +
: casesObj[ casesObj[
"statuscode@OData.Community.Display.V1.FormattedValue" "statuscode@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-date-entered-label" json: transLookup,
)} eval: true
</dd> })
</div> : casesObj[
<div className="govuk-summary-list__row"> "statuscode@OData.Community.Display.V1.FormattedValue"
<dt className="govuk-summary-list__key"> ] ||
{t("case:summary-decision-label")} t("case:summary-no-date-entered-label")}
</dt> </dd>
<dd className="govuk-summary-list__value"> </div>
{router.locale == "cy" <div className="govuk-summary-list__row">
? jsonpath({ <dt className="govuk-summary-list__key">
path: {t("case:summary-decision-label")}
'$..[?(@ && @.value=="' + </dt>
detailsObj[ <dd className="govuk-summary-list__value">
"pinswg_decision@OData.Community.Display.V1.FormattedValue" {router.locale == "cy"
] + ? jsonpath({
'")].value_cy', path:
json: transLookup, '$..[?(@ && @.value=="' +
eval: true, detailsObj[
})
: detailsObj[
"pinswg_decision@OData.Community.Display.V1.FormattedValue" "pinswg_decision@OData.Community.Display.V1.FormattedValue"
] || ] +
t( '")].value_cy',
"case:summary-no-information-to-date-label" json: transLookup,
)} eval: true
})
: detailsObj[
"pinswg_decision@OData.Community.Display.V1.FormattedValue"
] ||
t(
"case:summary-no-information-to-date-label"
)}
<br /> <br />
{/* <Link href="/"> {/* <Link href="/">
<a> <a>
{casesObj.caseDetails {casesObj.caseDetails
.outcome_document || ""} .outcome_document || ""}
</a> </a>
</Link> */} </Link> */}
</dd> </dd>
</div>
{casesObj.numberofchildincidents > 0 && (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-case-link-status-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(casesObj, [
"numberofchildincidents",
])
? casesObj.numberofchildincidents >
0
? t(
"case:summary-case-link-status-linked"
)
: t(
"case:summary-case-link-status-not-linked"
)
: t(
"case:summary-case-link-status-not-linked"
)}
</dd>
</div>
)}
{casesObj.numberofchildincidents > 0 ? (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-linked-cases-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{linkedCasesList(
props.currentView
.linkedCaseReferences
)}
</dd>
</div>
) : (
""
)}
</dl>
</div> </div>
</div> {casesObj.numberofchildincidents > 0 && (
</div> <div className="govuk-summary-list__row">
<div className="card" id="key-dates-card"> <dt className="govuk-summary-list__key">
<div className="card-body"> {t("case:summary-case-link-status-label")}
<div className="govuk-grid-column-full"> </dt>
<h3 className="govuk-heading-m govuk-!-margin-bottom-7"> <dd className="govuk-summary-list__value">
{t("case:summary-dates-label")} {_.has(casesObj, ["numberofchildincidents"])
</h3> ? casesObj.numberofchildincidents > 0
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9"> ? t(
<div className="govuk-summary-list__row"> "case:summary-case-link-status-linked"
<dt className="govuk-summary-list__key">
{t("case:summary-start-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_startdate")
? !_.isEmpty(
detailsObj.pinswg_startdate
) )
? formatDates(
detailsObj.pinswg_startdate
)
: t(
"case:summary-no-date-entered-label"
)
: _.has(
detailsObj,
"pinswg_startdates"
)
? !_.isEmpty(
detailsObj.pinswg_startdates
)
? formatDates(
detailsObj.pinswg_startdates
)
: t(
"case:summary-no-date-entered-label"
)
: t( : t(
"case:summary-no-date-entered-label" "case:summary-case-link-status-not-linked"
)} )
</dd> : t(
</div> "case:summary-case-link-status-not-linked"
)}
</dd>
</div>
)}
{casesObj.numberofchildincidents > 0 ? (
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-linked-cases-label")}
</dt>
<dd className="govuk-summary-list__value">
{linkedCasesList(
props.currentView.linkedCaseReferences
)}
</dd>
</div>
) : (
""
)}
</dl>
</SummaryCard>
<SummaryCard
id="key-dates-card"
title={t("case:summary-dates-label")}
headingTag="h3"
>
<dl className="govuk-summary-list govuk-!-font-size-16 govuk-!-margin-bottom-9">
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-start-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_startdate")
? !_.isEmpty(detailsObj.pinswg_startdate)
? formatDates(
detailsObj.pinswg_startdate
)
: t(
"case:summary-no-date-entered-label"
)
: _.has(detailsObj, "pinswg_startdates")
? !_.isEmpty(detailsObj.pinswg_startdates)
? formatDates(
detailsObj.pinswg_startdates
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t("case:summary-questionnaire-due-date-label")}
"case:summary-questionnaire-due-date-label" </dt>
)} <dd className="govuk-summary-list__value">
</dt> {_.has(
<dd className="govuk-summary-list__value"> detailsObj,
{_.has( "pinswg_questionnaireduedate"
detailsObj, )
"pinswg_questionnaireduedate" ? !_.isEmpty(
) detailsObj.pinswg_questionnaireduedate
? !_.isEmpty( )
detailsObj.pinswg_questionnaireduedate ? formatDates(
) detailsObj.pinswg_questionnaireduedate
? formatDates( )
detailsObj.pinswg_questionnaireduedate : t(
) "case:summary-no-date-entered-label"
: t( )
"case:summary-no-date-entered-label" : t("case:summary-no-date-entered-label")}
) </dd>
: t( </div>
"case:summary-no-date-entered-label"
)}
</dd>
</div>
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t("case:summary-statement-due-date-label")}
"case:summary-statement-due-date-label" </dt>
)} <dd className="govuk-summary-list__value">
</dt> {_.has(detailsObj, "pinswg_statementduedate")
<dd className="govuk-summary-list__value"> ? !_.isEmpty(
{_.has( detailsObj.pinswg_statementduedate
detailsObj, )
"pinswg_statementduedate" ? formatDates(
) detailsObj.pinswg_statementduedate
? !_.isEmpty( )
detailsObj.pinswg_statementduedate : t(
) "case:summary-no-date-entered-label"
? formatDates( )
detailsObj.pinswg_statementduedate : t("case:summary-no-date-entered-label")}
) </dd>
: t( </div>
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t("case:summary-interested-party-date-label")}
"case:summary-interested-party-date-label" </dt>
)} <dd className="govuk-summary-list__value">
</dt> {_.has(
<dd className="govuk-summary-list__value"> detailsObj,
{_.has( "pinswg_otherpartiesstatement"
)
? !_.isEmpty(
detailsObj.pinswg_otherpartiesstatement
)
? formatDates(
detailsObj.pinswg_otherpartiesstatement
)
: t(
"case:summary-no-date-entered-label"
)
: _.has(
detailsObj, detailsObj,
"pinswg_otherpartiesstatement" "pinswg_otherpartiesstatements"
) )
? !_.isEmpty( ? !_.isEmpty(
detailsObj.pinswg_otherpartiesstatement detailsObj.pinswg_otherpartiesstatements
) )
? formatDates( ? formatDates(
detailsObj.pinswg_otherpartiesstatement detailsObj.pinswg_otherpartiesstatements
) )
: t( : t(
"case:summary-no-date-entered-label" "case:summary-no-date-entered-label"
) )
: _.has( : t("case:summary-no-date-entered-label")}
detailsObj, </dd>
"pinswg_otherpartiesstatements" </div>
)
? !_.isEmpty(
detailsObj.pinswg_otherpartiesstatements
)
? formatDates(
detailsObj.pinswg_otherpartiesstatements
)
: t(
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t(
"case:summary-applicant-final-comments-date-label" "case:summary-applicant-final-comments-date-label"
)} )}
</dt> </dt>
<dd className="govuk-summary-list__value"> <dd className="govuk-summary-list__value">
{_.has( {_.has(
detailsObj, detailsObj,
"pinswg_finalcommentsduedate" "pinswg_finalcommentsduedate"
) )
? !_.isEmpty( ? !_.isEmpty(
detailsObj.pinswg_finalcommentsduedate detailsObj.pinswg_finalcommentsduedate
) )
? formatDates( ? formatDates(
detailsObj.pinswg_finalcommentsduedate detailsObj.pinswg_finalcommentsduedate
) )
: t( : t(
"case:summary-no-date-entered-label" "case:summary-no-date-entered-label"
) )
: t( : t("case:summary-no-date-entered-label")}
"case:summary-no-date-entered-label" </dd>
)} </div>
</dd> {/* <div className="govuk-summary-list__row">
</div>
{/* <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t( {t(
"case:summary-inquiry-evidence-date-label" "case:summary-inquiry-evidence-date-label"
@@ -414,82 +368,63 @@ const Pinswg_planningconditionss73s79id = (props) => {
)} )}
</dd> </dd>
</div> */} </div> */}
<div className="govuk-summary-list__row"> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{t("case:summary-event-date-label")} {t("case:summary-event-date-label")}
</dt> </dt>
<dd className="govuk-summary-list__value"> <dd className="govuk-summary-list__value">
{_.has( {_.has(detailsObj, "pinswg_dateeventrequested")
detailsObj, ? !_.isEmpty(
"pinswg_dateeventrequested" detailsObj.pinswg_dateeventrequested
) )
? !_.isEmpty( ? formatDates(
detailsObj.pinswg_dateeventrequested detailsObj.pinswg_dateeventrequested
) )
? formatDates( : t(
detailsObj.pinswg_dateeventrequested "case:summary-no-date-entered-label"
) )
: t( : t("case:summary-no-date-entered-label")}
"case:summary-no-date-entered-label" </dd>
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t(
"case:summary-start-event-date-label"
)}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_startdateofevent"
)
? !_.isEmpty(
detailsObj.pinswg_startdateofevent
)
? formatDates(
detailsObj.pinswg_startdateofevent
)
: t(
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-decision-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(
detailsObj,
"pinswg_casedecisiondate"
)
? !_.isEmpty(
detailsObj.pinswg_casedecisiondate
)
? formatDates(
detailsObj.pinswg_casedecisiondate
)
: t(
"case:summary-no-date-entered-label"
)
: t(
"case:summary-no-date-entered-label"
)}
</dd>
</div>
</dl>
</div> </div>
</div>
</div> <div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-start-event-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_startdateofevent")
? !_.isEmpty(
detailsObj.pinswg_startdateofevent
)
? formatDates(
detailsObj.pinswg_startdateofevent
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">
{t("case:summary-decision-date-label")}
</dt>
<dd className="govuk-summary-list__value">
{_.has(detailsObj, "pinswg_casedecisiondate")
? !_.isEmpty(
detailsObj.pinswg_casedecisiondate
)
? formatDates(
detailsObj.pinswg_casedecisiondate
)
: t(
"case:summary-no-date-entered-label"
)
: t("case:summary-no-date-entered-label")}
</dd>
</div>
</dl>
</SummaryCard>
</div> </div>
</div> </div>
); );
+93 -2
View File
@@ -6,8 +6,8 @@ Base branch: `refactor`
## Status ## Status
Current slice: Slice R6Async Data / Service Layer Cleanup Current slice: Slice R7Summary / Case-Type Rendering Simplification
Status: COMPLETE Status: IMPLEMENTED (manual validation in progress)
--- ---
@@ -214,6 +214,97 @@ Reduce duplication in summary-type components.
- unify repeated rendering patterns - unify repeated rendering patterns
- introduce shared summary renderer where safe - introduce shared summary renderer where safe
**Completion notes (this slice):**
- Implemented on feature branch created from `refactor`: `rep-slice-r7-summary-rendering-simplification`.
- Added render-only summary primitives:
- `components/case/summary/components/SummaryCard.js`
- `components/case/summary/components/SummaryRow.js`
- Applied these primitives to a small proof subset of summary-type files only:
- `components/case/summaryTypes/pinswg_planningappeals78id.js`
- `components/case/summaryTypes/pinswg_planningconditionss73s79id.js`
- Preserved Slice R7 constraints:
- no CaseSummary orchestration changes
- no translation/date/bilingual logic moved into shared primitives
- no linked-cases extraction (kept inline)
- no row/card order changes intended
- no route/query/payload/Redux/business-rule changes
- Validation evidence:
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` completed: **7 passed**.
- Manual APP/IP/Agent/LPA and EN/CY checks: **in progress** (Welsh IP statement option-label parity issue detected and patched in representation flow check display).
---
### Post-R7 follow-up patch — Welsh IP statement label parity
**Issue observed during manual check:**
- In Welsh journey (Interested Party → Statement), option-label parity regressed:
- selection step showed duplicated Welsh “No” labels
- check/submit summary displayed raw English `No`
**Fix applied (minimal, behaviour-preserving):**
- `components/case/representation/representationInterestedPartyPerson.js`
- restored canonical option values for conditional radio to `options={["Yes", "No"]}` so `RenderCondtionalRadioList` translation mapping behaves correctly.
- `components/case/representation/representationCompleteSubmit.js`
- added display mapping for `representationOnBehalfOf` summary value:
- `Yes``t("myrepresentations:questionnaire-yes")`
- `No``t("myrepresentations:questionnaire-no")`
- fallback unchanged for non-boolean/unexpected values
**Validation evidence (follow-up patch):**
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` completed: **7 passed (4.6m)**.
- Manual Welsh IP statement check: input labels and check-summary label now aligned via translation mapping.
---
### Post-R7 follow-up patch 2 — Welsh IP conditional details submit validation
**Issue observed during manual check:**
- In Welsh journey (Interested Party → Statement), when selecting “Yes” and entering conditional details, submit could still block with required validation on the conditional text field.
**Fix applied (minimal, behaviour-preserving):**
- `components/case/representation/representationElements.js`
- In `RenderCondtionalRadioList`, made “Yes selected” detection bilingual-safe and value-safe:
- accepts canonical value (`"Yes"`), translated display value (`t("myrepresentations:questionnaire-yes")`), and boolean `true`.
- Replaced unconditional conditional-field validator with context-aware validator:
- `requiredIfYes` only enforces required when “Yes” is selected.
- Updated conditional rendering check to use the same normalized `isYesSelected` guard.
**Validation evidence (follow-up patch 2):**
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` run completed with **6 passed / 1 failed**.
- Failure: `[chromium] Raise representation as an Appellant` timed out waiting for `dd a.govuk-link--no-underline` (entry-link locator timeout), not in Welsh IP conditional details path.
---
### Post-R7 follow-up patch 3 — Welsh conditional required check tied to current radio value
**Issue observed during manual check:**
- In Welsh journey, selecting “Yes” could still leave the conditional details field blocked with required validation (`Yn ofynnol`) after entering text, preventing progress.
**Fix applied (minimal, behaviour-preserving):**
- `components/case/representation/representationElements.js`
- Added explicit `normalizeYesNo(...)` mapping for both selected value and option values:
- canonical/translated/boolean values normalize to `"Yes"` / `"No"`.
- Radio `Field` values now use normalized canonical values (preserves existing payload expectation).
- Updated conditional `requiredIfYes` validator to evaluate against the **current form value** (`allValues[id]`) rather than closure-only value.
- Required check now trims whitespace and only errors when selected value resolves to `"Yes"` and details are empty.
**Validation evidence (follow-up patch 3):**
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` intentionally **not run** per user instruction while manual Welsh verification is in progress.
--- ---
### Slice R8 — Submission / Finalisation Boundary Isolation ### Slice R8 — Submission / Finalisation Boundary Isolation