From 17795f20c76f184ed916807a3d5a0ae0548e7aa0 Mon Sep 17 00:00:00 2001 From: robbond Date: Thu, 9 Apr 2026 14:33:54 +0100 Subject: [PATCH] 22541 extract deterministic case breadcrumb branches into factory maps --- components/breadcrumbs.js | 33 +---------------- lib/routing/breadcrumbRendererFactories.js | 33 +++++++++++++++++ memory-bank/change-log.md | 37 +++++++++++++++++++ .../breadcrumbs-route-map-structure.test.cjs | 24 ++++++++++++ 4 files changed, 95 insertions(+), 32 deletions(-) diff --git a/components/breadcrumbs.js b/components/breadcrumbs.js index ab0bb689..23e17a77 100644 --- a/components/breadcrumbs.js +++ b/components/breadcrumbs.js @@ -227,6 +227,7 @@ const Breadcrumbs = (props) => { breadcrumbLabel, fallbackSearchTitle, currentReference, + nestedSearchString, caseReferenceDisplay, renderAnchorCrumb, renderLinkCrumb, @@ -321,38 +322,6 @@ const Breadcrumbs = (props) => { )} - {isPath("/myportal/case") && ( - <> - {renderLinkCrumb( - isWelsh - ? `/${router.locale}/fymhorth` - : "/myportal", - t("common:breadcrumb-my-portal") - )} - {renderCaseReferenceCrumb(currentReference)} - - )} - - {isPath("/case/id/[incident]") && ( - <> - {renderLinkCrumb( - isWelsh - ? `/${router.locale}/chwiliadcyfeiriadau` - : "/addresssearch", - t("common:breadcrumb-address-search") - )} - {renderLinkCrumb( - isWelsh - ? `/${router.locale}/canlyniadaucyfeiriadau?${nestedSearchString}` - : `/addresssearchresults?${nestedSearchString}`, - t( - "common:breadcrumb-address-search-results" - ) - )} - {renderCaseReferenceCrumb(currentReference)} - - )} - {isPath("/myportal/case/id/[incident]") && ( <> {renderMyPortalCrumb()} diff --git a/lib/routing/breadcrumbRendererFactories.js b/lib/routing/breadcrumbRendererFactories.js index 7cf29243..21c3024b 100644 --- a/lib/routing/breadcrumbRendererFactories.js +++ b/lib/routing/breadcrumbRendererFactories.js @@ -111,6 +111,8 @@ export const createCaseDetailRouteRenderers = ({ t, router, isWelsh, + currentReference, + nestedSearchString, caseResultsHref, breadcrumbLabel, fallbackSearchTitle, @@ -120,6 +122,34 @@ export const createCaseDetailRouteRenderers = ({ renderCaseReferenceCrumb, renderMyPortalCrumb }) => ({ + "/myportal/case": () => ( + <> + {renderLinkCrumb( + isWelsh ? `/${router.locale}/fymhorth` : "/myportal", + t("common:breadcrumb-my-portal") + )} + {renderCaseReferenceCrumb(currentReference)} + + ), + + "/case/id/[incident]": () => ( + <> + {renderLinkCrumb( + isWelsh + ? `/${router.locale}/chwiliadcyfeiriadau` + : "/addresssearch", + t("common:breadcrumb-address-search") + )} + {renderLinkCrumb( + isWelsh + ? `/${router.locale}/canlyniadaucyfeiriadau?${nestedSearchString}` + : `/addresssearchresults?${nestedSearchString}`, + t("common:breadcrumb-address-search-results") + )} + {renderCaseReferenceCrumb(currentReference)} + + ), + "/case/[ticketnumber]": () => { const { ads, adv, va, key } = router.query; @@ -325,6 +355,7 @@ export const createMappedRouteRendererGroups = ({ breadcrumbLabel, fallbackSearchTitle, currentReference, + nestedSearchString, caseReferenceDisplay, renderAnchorCrumb, renderLinkCrumb, @@ -369,6 +400,8 @@ export const createMappedRouteRendererGroups = ({ t, router, isWelsh, + currentReference, + nestedSearchString, caseResultsHref, breadcrumbLabel, fallbackSearchTitle, diff --git a/memory-bank/change-log.md b/memory-bank/change-log.md index a798936c..bf772e1f 100644 --- a/memory-bank/change-log.md +++ b/memory-bank/change-log.md @@ -565,6 +565,43 @@ Follow-ups: - Next slice option A (larger): extract remaining deterministic inline branches (`/myportal/case`, `/case/id/[incident]` if kept deterministic after constraints review) only if they remain callback/state free. - Next slice option B (smaller): add one focused assertion in helper-level tests that empty grouped map entries are tolerated without affecting precedence resolution. +### CL-22541-S: breadcrumbs deterministic case-branch extraction (`/myportal/case`, `/case/id/[incident]`) + +date: 2026-04-09 +author: Cline +scope: `lib/routing/breadcrumbRendererFactories.js`, `components/breadcrumbs.js`, `tests/phase22/breadcrumbs-route-map-structure.test.cjs` +type: change +rationale: Execute the next deterministic extraction slice by migrating remaining callback-free case breadcrumb branches into the case-detail factory group while preserving map precedence and leaving stateful/callback routes inline. +impact: Refactor-only structural extraction and test guardrail expansion; no intended route/auth/session/API/EN-CY/a11y behavior change. +status: completed + +Summary: + +- Extended `createCaseDetailRouteRenderers(...)` in `lib/routing/breadcrumbRendererFactories.js` to map: + - `/myportal/case` + - `/case/id/[incident]` +- Injected additional deterministic inputs required by these routes: + - `currentReference` + - `nestedSearchString` +- Updated `createMappedRouteRendererGroups(...)` wiring to pass the new inputs to case-detail factory composition. +- Updated `components/breadcrumbs.js` to pass `nestedSearchString` into grouped factory composition. +- Removed now-redundant inline `isPath(...)` branches for: + - `/myportal/case` + - `/case/id/[incident]` +- Expanded `tests/phase22/breadcrumbs-route-map-structure.test.cjs` to assert: + - both new routes are mapped in `createCaseDetailRouteRenderers` + - both inline branches are absent from `components/breadcrumbs.js` + +Validation: + +- `npx eslint lib/routing/breadcrumbRendererFactories.js components/breadcrumbs.js tests/phase22/breadcrumbs-route-map-structure.test.cjs tests/phase22/index.test.cjs` -> pass. +- `node tests/phase22/index.test.cjs` -> pass (combined suite; breadcrumbs-route-map 4/4). + +Follow-ups: + +- Next slice option A (larger): evaluate whether any remaining deterministic inline branches can be extracted without violating callback/state constraints. +- Next slice option B (smaller): add a focused helper-level precedence test where earlier map contains falsy/non-function values and later maps contain valid renderers. + ### CL-00X: 22500 `components/elements/index.js` Phase 1 helper extraction date: 2026-04-07 diff --git a/tests/phase22/breadcrumbs-route-map-structure.test.cjs b/tests/phase22/breadcrumbs-route-map-structure.test.cjs index e37eb836..60cb5a27 100644 --- a/tests/phase22/breadcrumbs-route-map-structure.test.cjs +++ b/tests/phase22/breadcrumbs-route-map-structure.test.cjs @@ -90,6 +90,18 @@ test("breadcrumbs/factory module includes expected mapped route definitions", as "Expected /case/[ticketnumber] to be mapped in createCaseDetailRouteRenderers" ); + assert.strictEqual( + source.includes('"/myportal/case": () =>'), + true, + "Expected /myportal/case to be mapped in createCaseDetailRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/case/id/[incident]": () =>'), + true, + "Expected /case/id/[incident] to be mapped in createCaseDetailRouteRenderers" + ); + assert.strictEqual( source.includes('"/myportal/case/[ticketnumber]": () =>'), true, @@ -230,6 +242,18 @@ test("breadcrumbs/component composes mapped routes via imported factories and sh "Expected /case/[ticketnumber] explicit branch to be removed after mapping" ); + assert.strictEqual( + source.includes('isPath("/myportal/case")'), + false, + "Expected /myportal/case explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/case/id/[incident]")'), + false, + "Expected /case/id/[incident] explicit branch to be removed after mapping" + ); + assert.strictEqual( source.includes('isPath("/myportal/case/[ticketnumber]")'), false,