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)"
);
});