From d05e54c0203e47ca02ddd7ebd517b6fccb1ec3b7 Mon Sep 17 00:00:00 2001 From: Robert Bond Date: Fri, 17 Apr 2026 06:45:21 +0000 Subject: [PATCH] Merged PR 2252: refactor(representations): extract journey step-resolution helpers (Slice R3,... refactor(representations): extract journey step-resolution helpers (Slice R3, behaviour-preserving) Related work items: #22441 --- components/case/representation/index.js | 75 ++++++++++--------- .../representation/utils/stepResolution.js | 73 ++++++++++++++++++ context/representations-refactor-tracker.md | 28 ++++++- 3 files changed, 140 insertions(+), 36 deletions(-) create mode 100644 components/case/representation/utils/stepResolution.js diff --git a/components/case/representation/index.js b/components/case/representation/index.js index a67d1e1e..155e197c 100644 --- a/components/case/representation/index.js +++ b/components/case/representation/index.js @@ -33,6 +33,12 @@ import RepLPACapacitySelection from "./representationLPACapacitySelection"; import RepLandOwner from "./representationLandowner"; import RepresentationProgress_enforcement from "./representationProgress/representationProgress_enforcement"; import RepresentationProgress_s78 from "./representationProgress/representationProgress_s78"; +import { + getQuestionnaireNextSection, + resolveJourneyStageFlags, + resolveRepresentationControlKey, + resolveSubmitTransition +} from "./utils/stepResolution"; let MakeRepresentation = (props) => { let { t } = useTranslation(); @@ -105,6 +111,11 @@ let MakeRepresentation = (props) => { : false; const isNRW = currentView.caseReference?.isNRW; + const { showCheckStage } = resolveJourneyStageFlags({ + "representationSubmit": currentView.representationSubmit, + "representationSubmitConfirmation": + currentView.representationSubmitConfirmation + }); const setRepFileName = (values) => { if ( @@ -586,19 +597,16 @@ let MakeRepresentation = (props) => { setCurrentReference }; - const getNormalizedCapacity = () => { - const rawCapacity = - currentView.representationCapacity || - currentView.caseReference?.repDetails?.representationCapacity || - "false"; - return rawCapacity.toLowerCase(); - }; + const { controlKey } = resolveRepresentationControlKey({ + "isLPA": isLPA, + "representationCapacity": currentView.representationCapacity, + "repDetailsCapacity": + currentView.caseReference?.repDetails?.representationCapacity, + "appealType": appealType, + "normalizeCapacity": normalizeCapacity + }); - if ( - isLPA && - (!currentView.representationCapacity || - currentView.representationCapacity === "") - ) { + if (controlKey === "lpa-capacity-selection") { return ( { ); } - const capacity = normalizeCapacity(getNormalizedCapacity()); - - switch (capacity) { - case "appellant": { + switch (controlKey) { + case "capacity-appellant": { const Component = appealType === 846040002 ? ConsultationAppellant @@ -634,7 +640,7 @@ let MakeRepresentation = (props) => { ); } - case "lpa": { + case "capacity-lpa": { return ( { ); } - case "agent": { + case "capacity-agent": { const Component = appealType === 846040002 ? ConsultationAgent : RepAgent; return ( @@ -663,7 +669,7 @@ let MakeRepresentation = (props) => { ); } - case "interestedparty": { + case "capacity-interestedparty": { const Component = appealType === 846040002 ? ConsultationInterestedPartyPerson @@ -678,7 +684,7 @@ let MakeRepresentation = (props) => { ); } - case "landowner": { + case "capacity-landowner": { return ( { : normalizeCapacity(values.representationCapacity); setRepresentationCapacity(capacity); } else { - if (repType === "Questionnaire") { - if ( - questionnaireCount !== 0 && - showQuestionnaireSection < questionnaireCount - ) { - setShowQuestionnaireSection( - showQuestionnaireSection + 1 - ); - updateRepresentation(values, false, false); - } else { - updateRepresentation(values, false, false); - setRepresentationSubmit(true); - } + const submitTransition = resolveSubmitTransition({ + "representationType": repType, + "showQuestionnaireSection": showQuestionnaireSection, + "questionnaireCount": questionnaireCount + }); + + if (submitTransition === "advanceQuestionnaire") { + setShowQuestionnaireSection( + getQuestionnaireNextSection( + showQuestionnaireSection, + questionnaireCount + ) + ); + updateRepresentation(values, false, false); } else { updateRepresentation(values, false, false); setRepresentationSubmit(true); @@ -1252,7 +1259,7 @@ let MakeRepresentation = (props) => { return (
- {currentView.representationSubmit ? ( + {showCheckStage ? ( { + const showCheckStage = + representationSubmit === true || representationSubmit === "true"; + const showCompletionStage = + representationSubmitConfirmation === true || + representationSubmitConfirmation === "true"; + + return { + showFormStage: !showCheckStage, + showCheckStage, + showCompletionStage + }; +}; + +export const resolveRepresentationControlKey = ({ + isLPA, + representationCapacity, + repDetailsCapacity, + appealType, + normalizeCapacity +}) => { + if (isLPA && (!representationCapacity || representationCapacity === "")) { + return { + controlKey: "lpa-capacity-selection", + normalizedCapacity: "" + }; + } + + const rawCapacity = representationCapacity || repDetailsCapacity || "false"; + const normalizedCapacity = normalizeCapacity(rawCapacity.toLowerCase()); + + return { + controlKey: `capacity-${normalizedCapacity}`, + normalizedCapacity + }; +}; + +export const resolveSubmitTransition = ({ + representationType, + showQuestionnaireSection, + questionnaireCount +}) => { + if (representationType !== "Questionnaire") { + return "goToCheck"; + } + + if ( + questionnaireCount !== 0 && + showQuestionnaireSection < questionnaireCount + ) { + return "advanceQuestionnaire"; + } + + return "goToCheck"; +}; + +export const getQuestionnaireNextSection = ( + currentSection, + questionnaireCount +) => { + if (questionnaireCount !== 0 && currentSection < questionnaireCount) { + return currentSection + 1; + } + + return currentSection; +}; + +export const getQuestionnairePreviousSection = (currentSection) => { + return currentSection > 1 ? currentSection - 1 : currentSection; +}; diff --git a/context/representations-refactor-tracker.md b/context/representations-refactor-tracker.md index 29ef8a74..da70991a 100644 --- a/context/representations-refactor-tracker.md +++ b/context/representations-refactor-tracker.md @@ -6,8 +6,8 @@ Base branch: `refactor` ## Status -Current slice: Slice R2 — Representation Page Loader Separation -Status: COMPLETE +Current slice: Slice R3 — Journey Step Resolution Extraction +Status: IMPLEMENTED (manual validation pending) --- @@ -94,6 +94,30 @@ Isolate step navigation logic. - next/previous step logic - validation gating between steps +**Completion notes (this slice):** + +- Added pure step-resolution helpers in `components/case/representation/utils/stepResolution.js`: + - `resolveJourneyStageFlags({ representationSubmit, representationSubmitConfirmation })` + - `resolveRepresentationControlKey({ isLPA, representationCapacity, repDetailsCapacity, appealType, normalizeCapacity })` + - `resolveSubmitTransition({ representationType, showQuestionnaireSection, questionnaireCount })` + - `getQuestionnaireNextSection(currentSection, questionnaireCount)` + - `getQuestionnairePreviousSection(currentSection)` +- Updated `components/case/representation/index.js` to call helpers for: + - check-stage flag resolution (`showCheckStage`) + - control key resolution in `whichControl()` + - questionnaire/non-questionnaire submit transition decision + - questionnaire next-section increment calculation +- Preserved behaviour-critical constraints: + - no JSX structure redesign + - no route/query changes + - no payload/Redux shape changes + - no dispatch/API side-effect sequencing changes + - no representation-type availability logic changes (`buildRepsArr` unchanged) +- Validation evidence: + - `npm run lint` completed (warnings only, no new errors). + - `npm run test:reps` re-run completed: **6 passed**. + - Manual APP/IP/Agent/LPA and EN/CY checks: **pending for this slice**. + --- ### Slice R4 — Flow Shell Decomposition