diff --git a/.env.local b/.env.local index b8d02b17..7fcf638a 100644 --- a/.env.local +++ b/.env.local @@ -32,7 +32,7 @@ RELAYPATH = "ar-hc-lz-pedw-test-uks-01" CRMURL = "ts-pedw.crm11.dynamics.com" CRMURL_VERSION = "v9.2" -# # //New PreProd +# //New PreProd # CLIENT_ID = ab6c4678-b31a-4eb3-b429-e039120e488a # CLIENT_SECRET = VWY8Q~9EtRzGXpd8Xs~5OS1fej2IyVJ8JgTMncw3 # RELAY_ROOT = https://ar-ns-lz-pedw-ppe-uks-01.servicebus.windows.net/ar-hc-lz-pedw-ppe-uks-01/ @@ -271,3 +271,4 @@ HIDEERRORLOGS = false SHOWSIPS = true ALLOWED_IPS=::1,203.0.113.42,198.51.100.17 +UPLOAD_BATCH_COUNT = 5 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 28014204..4c5f74a4 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ GUARDRAILS.md ai-prompts/ workflows/ AI_CONTEXT.md +pages/baracuda.min.html diff --git a/components/breadcrumbs.js b/components/breadcrumbs.js index ff3e52fa..f27c33ff 100644 --- a/components/breadcrumbs.js +++ b/components/breadcrumbs.js @@ -21,7 +21,8 @@ import { createSimpleRouteRenderers, createSimpleLinkTextPairRenderers, createSimpleMyPortalRouteRenderers, - createCaseDetailRouteRenderers + createCaseDetailRouteRenderers, + createDetailAndAccountRouteRenderers } from "../lib/routing/breadcrumbRendererFactories"; const Breadcrumbs = (props) => { @@ -259,11 +260,26 @@ const Breadcrumbs = (props) => { renderMyPortalCrumb }); + const detailAndAccountRouteRenderersByPath = + createDetailAndAccountRouteRenderers({ + t, + router, + isWelsh, + cyMyPortalHref, + currentReference, + caseReferenceDisplay, + renderMyPortalCrumb, + renderLinkCrumb, + renderCaseReferenceCrumb, + renderDnsCaseReferenceCrumbs + }); + const mappedRouteRendererMaps = buildBreadcrumbRendererMaps({ simpleRouteRenderersByPath, simpleLinkTextPairRenderersByPath, simpleMyPortalRouteRenderersByPath, - caseDetailRouteRenderersByPath + caseDetailRouteRenderersByPath, + detailAndAccountRouteRenderersByPath }); const staticTextCrumbLabel = getStaticTextCrumbLabel(pathname); @@ -398,33 +414,6 @@ const Breadcrumbs = (props) => { )} - {isPath("/myportal/dnsdetails") && ( - <> - {renderMyPortalCrumb()} - {renderLinkCrumb( - "/myportal/dnsapplications", - t("dnsCommon:service-name") - )} - {renderCaseReferenceCrumb(currentReference)} - - )} - - {isPath("/myportal/dns/[developmentName]") && ( - <> - {renderLinkCrumb( - isWelsh - ? `${router.locale}/fymhorth` - : "/myportal", - t("common:breadcrumb-my-portal") - )} - {renderLinkCrumb( - "/myportal/dnsapplications", - t("dnsCommon:service-name") - )} - {renderCaseReferenceCrumb(caseReferenceDisplay)} - - )} - {isPath("/case") && ( <> {renderLinkCrumb( @@ -471,50 +460,6 @@ const Breadcrumbs = (props) => { )} - {isPath("/account/personaldetails") && ( - <> - {renderLinkCrumb( - cyMyPortalHref, - t("common:breadcrumb-my-portal") - )} -
  • - {t("account:account-title")} -
  • - - )} - - {isPath("/account/changepassword") && ( - <> - {renderLinkCrumb( - cyMyPortalHref, - t("common:breadcrumb-my-portal") - )} -
  • - Update your password -
  • - - )} - - {isPath("/dnsdetails") && - renderDnsCaseReferenceCrumbs(currentReference)} - - {isPath("/dns/[developmentName]") && - renderDnsCaseReferenceCrumbs(caseReferenceDisplay)} - - {isPath("/dns/application-view") && ( - <> - {renderLinkCrumb( - isWelsh - ? `${router.locale}/dns/applications` - : "/dns/applications", - t("dnsApplicationView:page-parent-title") - )} -
  • - TWA - Morlais Demonstration Zone -
  • - - )} - {staticTextCrumbLabel && renderTextCrumb(staticTextCrumbLabel)} diff --git a/lib/routing/breadcrumbRendererFactories.js b/lib/routing/breadcrumbRendererFactories.js index 756a8054..138497cc 100644 --- a/lib/routing/breadcrumbRendererFactories.js +++ b/lib/routing/breadcrumbRendererFactories.js @@ -236,3 +236,79 @@ export const createCaseDetailRouteRenderers = ({ ); } }); + +export const createDetailAndAccountRouteRenderers = ({ + t, + router, + isWelsh, + cyMyPortalHref, + currentReference, + caseReferenceDisplay, + renderMyPortalCrumb, + renderLinkCrumb, + renderCaseReferenceCrumb, + renderDnsCaseReferenceCrumbs +}) => ({ + "/myportal/dnsdetails": () => ( + <> + {renderMyPortalCrumb()} + {renderLinkCrumb( + "/myportal/dnsapplications", + t("dnsCommon:service-name") + )} + {renderCaseReferenceCrumb(currentReference)} + + ), + + "/myportal/dns/[developmentName]": () => ( + <> + {renderMyPortalCrumb()} + {renderLinkCrumb( + "/myportal/dnsapplications", + t("dnsCommon:service-name") + )} + {renderCaseReferenceCrumb(caseReferenceDisplay)} + + ), + + "/dnsdetails": () => renderDnsCaseReferenceCrumbs(currentReference), + + "/dns/[developmentName]": () => + renderDnsCaseReferenceCrumbs(caseReferenceDisplay), + + "/dns/application-view": () => ( + <> + {renderLinkCrumb( + isWelsh + ? `/${router.locale}/dns/applications` + : "/dns/applications", + t("dnsApplicationView:page-parent-title") + )} + {renderLinkCrumb( + isWelsh + ? `/${router.locale}/dnsapplications` + : "/dnsapplications", + t("dnsCommon:service-name") + )} + {renderCaseReferenceCrumb("TWA - Morlais Demonstration Zone")} + + ), + + "/account/personaldetails": () => ( + <> + {renderLinkCrumb(cyMyPortalHref, t("common:breadcrumb-my-portal"))} +
  • + {t("account:account-title")} +
  • + + ), + + "/account/changepassword": () => ( + <> + {renderLinkCrumb(cyMyPortalHref, t("common:breadcrumb-my-portal"))} +
  • + Update your password +
  • + + ) +}); diff --git a/lib/routing/breadcrumbRouteMaps.js b/lib/routing/breadcrumbRouteMaps.js index 14375002..3d505eb1 100644 --- a/lib/routing/breadcrumbRouteMaps.js +++ b/lib/routing/breadcrumbRouteMaps.js @@ -16,12 +16,14 @@ const buildBreadcrumbRendererMaps = ({ simpleRouteRenderersByPath, simpleLinkTextPairRenderersByPath, simpleMyPortalRouteRenderersByPath, - caseDetailRouteRenderersByPath + caseDetailRouteRenderersByPath, + detailAndAccountRouteRenderersByPath }) => [ simpleRouteRenderersByPath, simpleLinkTextPairRenderersByPath, simpleMyPortalRouteRenderersByPath, - caseDetailRouteRenderersByPath + caseDetailRouteRenderersByPath, + detailAndAccountRouteRenderersByPath ]; module.exports = { diff --git a/tests/phase22/breadcrumb-route-maps-helper.test.cjs b/tests/phase22/breadcrumb-route-maps-helper.test.cjs index fbf951f4..60ab8661 100644 --- a/tests/phase22/breadcrumb-route-maps-helper.test.cjs +++ b/tests/phase22/breadcrumb-route-maps-helper.test.cjs @@ -57,15 +57,23 @@ test("buildBreadcrumbRendererMaps returns grouped maps in explicit precedence or const simpleMyPortalRouteRenderersByPath = { "/gamma": () => "gamma" }; + const caseDetailRouteRenderersByPath = { + "/delta": () => "delta" + }; + const detailAndAccountRouteRenderersByPath = { + "/epsilon": () => "epsilon" + }; const result = buildBreadcrumbRendererMaps({ simpleRouteRenderersByPath, simpleLinkTextPairRenderersByPath, - simpleMyPortalRouteRenderersByPath + simpleMyPortalRouteRenderersByPath, + caseDetailRouteRenderersByPath, + detailAndAccountRouteRenderersByPath }); assert.ok(Array.isArray(result), "Expected grouped maps array"); - assert.strictEqual(result.length, 3, "Expected three grouped route maps"); + assert.strictEqual(result.length, 5, "Expected five grouped route maps"); assert.strictEqual( result[0], simpleRouteRenderersByPath, @@ -81,6 +89,16 @@ test("buildBreadcrumbRendererMaps returns grouped maps in explicit precedence or simpleMyPortalRouteRenderersByPath, "Expected my-portal route renderers third" ); + assert.strictEqual( + result[3], + caseDetailRouteRenderersByPath, + "Expected case detail route renderers fourth" + ); + assert.strictEqual( + result[4], + detailAndAccountRouteRenderersByPath, + "Expected detail and account route renderers fifth" + ); }); test("resolveMappedRouteRenderer returns renderer from first matching grouped map", () => { @@ -97,7 +115,9 @@ test("resolveMappedRouteRenderer returns renderer from first matching grouped ma simpleLinkTextPairRenderersByPath: { "/known": secondRenderer }, - simpleMyPortalRouteRenderersByPath: {} + simpleMyPortalRouteRenderersByPath: {}, + caseDetailRouteRenderersByPath: {}, + detailAndAccountRouteRenderersByPath: {} }); const result = resolveMappedRouteRenderer("/known", maps); @@ -113,21 +133,23 @@ test("resolveMappedRouteRenderer returns renderer from later grouped map when ea const { buildBreadcrumbRendererMaps, resolveMappedRouteRenderer } = loadHelpers(); - const myPortalRenderer = () => "myportal"; + const detailRenderer = () => "detail"; const maps = buildBreadcrumbRendererMaps({ simpleRouteRenderersByPath: {}, simpleLinkTextPairRenderersByPath: {}, - simpleMyPortalRouteRenderersByPath: { - "/myportal/searchresults": myPortalRenderer + simpleMyPortalRouteRenderersByPath: {}, + caseDetailRouteRenderersByPath: {}, + detailAndAccountRouteRenderersByPath: { + "/account/personaldetails": detailRenderer } }); - const result = resolveMappedRouteRenderer("/myportal/searchresults", maps); + const result = resolveMappedRouteRenderer("/account/personaldetails", maps); assert.strictEqual( result, - myPortalRenderer, + detailRenderer, "Expected resolver to return matching renderer from later grouped map" ); }); @@ -141,7 +163,9 @@ test("resolveMappedRouteRenderer returns null for unmapped path", () => { "/known": () => "known" }, simpleLinkTextPairRenderersByPath: {}, - simpleMyPortalRouteRenderersByPath: {} + simpleMyPortalRouteRenderersByPath: {}, + caseDetailRouteRenderersByPath: {}, + detailAndAccountRouteRenderersByPath: {} }); const result = resolveMappedRouteRenderer("/unknown", maps); diff --git a/tests/phase22/breadcrumbs-route-map-structure.test.cjs b/tests/phase22/breadcrumbs-route-map-structure.test.cjs index e740838a..59f890b0 100644 --- a/tests/phase22/breadcrumbs-route-map-structure.test.cjs +++ b/tests/phase22/breadcrumbs-route-map-structure.test.cjs @@ -36,6 +36,18 @@ test("breadcrumbs/factory module includes expected mapped route definitions", as "Expected my-portal route renderer factory export" ); + assert.strictEqual( + source.includes("export const createCaseDetailRouteRenderers ="), + true, + "Expected case detail route renderer factory export" + ); + + assert.strictEqual( + source.includes("export const createDetailAndAccountRouteRenderers ="), + true, + "Expected detail and account route renderer factory export" + ); + assert.strictEqual( source.includes('"/addresssearchresults": () => ('), true, @@ -71,6 +83,60 @@ test("breadcrumbs/factory module includes expected mapped route definitions", as true, "Expected /myportal/addresssearchresults to be mapped in createSimpleMyPortalRouteRenderers" ); + + assert.strictEqual( + source.includes('"/case/[ticketnumber]": () =>'), + true, + "Expected /case/[ticketnumber] to be mapped in createCaseDetailRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/myportal/case/[ticketnumber]": () =>'), + true, + "Expected /myportal/case/[ticketnumber] to be mapped in createCaseDetailRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/myportal/dnsdetails": () =>'), + true, + "Expected /myportal/dnsdetails to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/myportal/dns/[developmentName]": () =>'), + true, + "Expected /myportal/dns/[developmentName] to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/dnsdetails": () =>'), + true, + "Expected /dnsdetails to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/dns/[developmentName]": () =>'), + true, + "Expected /dns/[developmentName] to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/dns/application-view": () =>'), + true, + "Expected /dns/application-view to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/account/personaldetails": () =>'), + true, + "Expected /account/personaldetails to be mapped in createDetailAndAccountRouteRenderers" + ); + + assert.strictEqual( + source.includes('"/account/changepassword": () =>'), + true, + "Expected /account/changepassword to be mapped in createDetailAndAccountRouteRenderers" + ); }); test("breadcrumbs/component composes mapped routes via imported factories and shared resolver", async () => { @@ -106,6 +172,18 @@ test("breadcrumbs/component composes mapped routes via imported factories and sh "Expected breadcrumbs to reference createSimpleMyPortalRouteRenderers" ); + assert.strictEqual( + /createCaseDetailRouteRenderers/.test(source), + true, + "Expected breadcrumbs to reference createCaseDetailRouteRenderers" + ); + + assert.strictEqual( + /createDetailAndAccountRouteRenderers/.test(source), + true, + "Expected breadcrumbs to reference createDetailAndAccountRouteRenderers" + ); + assert.strictEqual( /const\s+simpleRouteRenderersByPath\s*=\s*createSimpleRouteRenderers\s*\(/.test( source @@ -130,6 +208,22 @@ test("breadcrumbs/component composes mapped routes via imported factories and sh "Expected breadcrumbs to build my-portal route renderers from factory" ); + assert.strictEqual( + /const\s+caseDetailRouteRenderersByPath\s*=\s*createCaseDetailRouteRenderers\s*\(/.test( + source + ), + true, + "Expected breadcrumbs to build case detail route renderers from factory" + ); + + assert.strictEqual( + /const\s+detailAndAccountRouteRenderersByPath\s*=\s*createDetailAndAccountRouteRenderers\s*\(/.test( + source + ), + true, + "Expected breadcrumbs to build detail and account route renderers from factory" + ); + assert.strictEqual( /const\s+mappedRouteRendererMaps\s*=\s*buildBreadcrumbRendererMaps\s*\(/.test( source @@ -179,6 +273,60 @@ test("breadcrumbs/component composes mapped routes via imported factories and sh false, "Expected /myportal/addresssearchresults explicit branch to be removed after mapping" ); + + assert.strictEqual( + source.includes('isPath("/case/[ticketnumber]")'), + false, + "Expected /case/[ticketnumber] explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/myportal/case/[ticketnumber]")'), + false, + "Expected /myportal/case/[ticketnumber] explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/myportal/dnsdetails")'), + false, + "Expected /myportal/dnsdetails explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/myportal/dns/[developmentName]")'), + false, + "Expected /myportal/dns/[developmentName] explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/dnsdetails")'), + false, + "Expected /dnsdetails explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/dns/[developmentName]")'), + false, + "Expected /dns/[developmentName] explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/dns/application-view")'), + false, + "Expected /dns/application-view explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/account/personaldetails")'), + false, + "Expected /account/personaldetails explicit branch to be removed after mapping" + ); + + assert.strictEqual( + source.includes('isPath("/account/changepassword")'), + false, + "Expected /account/changepassword explicit branch to be removed after mapping" + ); }); test("breadcrumbs/map builder preserves route map ordering", async () => { @@ -196,7 +344,7 @@ test("breadcrumbs/map builder preserves route map ordering", async () => { const mapBuilderSlice = source.slice( mapBuilderCallIndex, - mapBuilderCallIndex + 500 + mapBuilderCallIndex + 700 ); const simpleRouteOrderIndex = mapBuilderSlice.indexOf( @@ -208,13 +356,21 @@ test("breadcrumbs/map builder preserves route map ordering", async () => { const simpleMyPortalOrderIndex = mapBuilderSlice.indexOf( "simpleMyPortalRouteRenderersByPath" ); + const caseDetailOrderIndex = mapBuilderSlice.indexOf( + "caseDetailRouteRenderersByPath" + ); + const detailAndAccountOrderIndex = mapBuilderSlice.indexOf( + "detailAndAccountRouteRenderersByPath" + ); assert.strictEqual( simpleRouteOrderIndex >= 0 && simpleLinkTextPairOrderIndex > simpleRouteOrderIndex && - simpleMyPortalOrderIndex > simpleLinkTextPairOrderIndex, + simpleMyPortalOrderIndex > simpleLinkTextPairOrderIndex && + caseDetailOrderIndex > simpleMyPortalOrderIndex && + detailAndAccountOrderIndex > caseDetailOrderIndex, true, - "Expected map builder call to preserve explicit route-map ordering (simple -> link-text -> myportal)" + "Expected map builder call to preserve explicit route-map ordering (simple -> link-text -> myportal -> case detail -> detail/account)" ); });