diff --git a/public/static/error/index.html b/public/static/error/index.html index 53bb9fc08..da15bd7a0 100644 --- a/public/static/error/index.html +++ b/public/static/error/index.html @@ -258,10 +258,36 @@ body { return match?.value; } + // Refactor opportunity: sessionStorage keys and cookie names below are duplicated from the + // Vue app because this static page is not webpack-bundled. Canonical sources: + // - src/constants/session-storage.js (sessionStorageKeyConstants) + // - src/constants/cookie-names.js (cookieNames; env-suffixed funnel cookies) + // - src/router/methods/error.js (clearBailoutSessionStorage — keep in sync on bailout keys) + // Options: build-time inject into this file, shared plain JS under public/static/, or generate + // from constants during CI. Until then, update all three places when keys change. function clearApplicationData() { window.localStorage.removeItem('vuex'); + // Keys match sessionStorageKeyConstants in src/constants/session-storage.js and + // clearBailoutSessionStorage() in src/router/methods/error.js — keep in sync. + const sessionStorageKeysToClear = [ + 'submittedState', + 'heritageSuppressRedirectCount', + 'beforeEachErrorRecoveryCount', + 'externalParameterState', + ]; + // Clear sessionStorage keys that can re-poison the funnel on re-entry. + sessionStorageKeysToClear.forEach((key) => { + try { + window.sessionStorage.removeItem(key); + } catch { + // sessionStorage unavailable + } + }); + const environmentData = getCurrentEnvironmentData(); + // Funnel cookie prefixes match cookie-names.js; suffix is environmentData.name here + // (equivalent to applicationConfig.CURRENT_ENVIRONMENT in the Vue app). const cookieNames = [ `FunnelUserId-${environmentData?.name}`, `FunnelSessionKey-${environmentData?.name}`, diff --git a/src/assets/img/party.svg b/src/assets/img/party.svg new file mode 100644 index 000000000..82f794a7b --- /dev/null +++ b/src/assets/img/party.svg @@ -0,0 +1,9 @@ + diff --git a/src/assets/img/van.svg b/src/assets/img/van.svg new file mode 100644 index 000000000..886cee73f --- /dev/null +++ b/src/assets/img/van.svg @@ -0,0 +1,7 @@ + diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index efb32ffc6..76077db76 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -56,6 +56,10 @@ const endpoints = { url: "/parts/api/v1/parts/parts-or-questions", method: "POST", }, + GetPartsOrQuestionsV3: { + url: "/parts/api/v3/parts/parts-or-questions", + method: "POST", + }, GetParts: { url: "/parts/api/v1/parts/parts", method: "POST", diff --git a/src/constants/header-keys.js b/src/constants/header-keys.js index ed88393b5..4341d416b 100644 --- a/src/constants/header-keys.js +++ b/src/constants/header-keys.js @@ -6,4 +6,5 @@ export const headerKeys = { TRANSACTION_ID: "X-Transaction-Id", EON: "X-Enterprise-Order-Number", LOG_ENABLED: "log-enabled", + PAGE_NAME_TO_LOG: "X-Page-Name-To-Log", }; diff --git a/src/constants/session-storage.js b/src/constants/session-storage.js index 75cd1b578..9481c53d8 100644 --- a/src/constants/session-storage.js +++ b/src/constants/session-storage.js @@ -2,4 +2,8 @@ export const sessionStorageKeyConstants = { SUBMITTED_STATE: "submittedState", /** Counts SuppressConceptFunnel → heritage redirects to avoid an infinite loop in one tab session. */ HERITAGE_SUPPRESS_REDIRECT_COUNT: "heritageSuppressRedirectCount", + /** Counts beforeEach uncaught-exception recovery attempts to avoid an infinite ERROR redirect loop. */ + BEFORE_EACH_ERROR_RECOVERY_COUNT: "beforeEachErrorRecoveryCount", + /** Persists deep-link / querystring funnel entry state across navigations. */ + EXTERNAL_PARAMETER_STATE: "externalParameterState", }; diff --git a/src/digital-components/date-picker-popup/date-picker-popup.vue b/src/digital-components/date-picker-popup/date-picker-popup.vue index ea24197bc..087e68765 100644 --- a/src/digital-components/date-picker-popup/date-picker-popup.vue +++ b/src/digital-components/date-picker-popup/date-picker-popup.vue @@ -290,4 +290,16 @@ export default { background-color: #ffc966 !important; color: $black; } + +// Enlarge the calendar popup. The menu is teleported to
, so these must +// be global rules. VueDatePicker sizes itself via CSS custom properties. +.dp__menu { + --dp-cell-size: 46px; + --dp-cell-padding: 8px; + --dp-font-size: 1.05rem; + --dp-menu-min-width: 320px; + --dp-button-height: 40px; + --dp-month-year-row-height: 40px; + --dp-row-margin: 6px 0; +} diff --git a/src/fmg-components/funnel-header/funnel-header.vue b/src/fmg-components/funnel-header/funnel-header.vue index ac6e73bde..8a8889ae6 100644 --- a/src/fmg-components/funnel-header/funnel-header.vue +++ b/src/fmg-components/funnel-header/funnel-header.vue @@ -1,5 +1,8 @@ -