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/insurance.js b/src/constants/insurance.js index 1439fafcb..2b0cacc53 100644 --- a/src/constants/insurance.js +++ b/src/constants/insurance.js @@ -89,4 +89,5 @@ export const NON_MANAGED_SHOW_CLAIM_NUMBER_PARENTS = [ export const PARENT_ACCOUNT_NUMBERS = { STATE_FARM: "711310", USAA: "900040", + GEICO: "250034", }; diff --git a/src/fmg-components/funnel-sub-header/funnel-sub-header.vue b/src/fmg-components/funnel-sub-header/funnel-sub-header.vue index 4002b28fb..8c3c2fed2 100644 --- a/src/fmg-components/funnel-sub-header/funnel-sub-header.vue +++ b/src/fmg-components/funnel-sub-header/funnel-sub-header.vue @@ -39,6 +39,14 @@ export default { default: "dark-header", }, alignLeft: Boolean, + overrideHeaderText: { + type: String, + default: "", + }, + overrideHeaderSubText: { + type: String, + default: "", + }, }, components: { buttonBack, @@ -48,10 +56,13 @@ export default { return this.getCmsContent(this.cmsWidgetName, "HeaderSubText"); }, text() { - return this.getCmsContent(this.cmsWidgetName, "HeaderText"); + return this.overrideHeaderText || this.getCmsContent(this.cmsWidgetName, "HeaderText"); }, subText() { - return this.getCmsContent(this.cmsWidgetName, "HeaderSubText"); + return ( + this.overrideHeaderSubText || + this.getCmsContent(this.cmsWidgetName, "HeaderSubText") + ); }, backButtonAccessibleText() { return this.getCmsContent(this.cmsWidgetName, "BackButtonAccessibleText"); diff --git a/src/global-methods.js b/src/global-methods.js index f408230f8..584743b2d 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -69,6 +69,7 @@ export default { [headerKeys.APPLICATION_NAME]: applicationConfig.APPLICATION_NAME, [headerKeys.SESSION_SEQUENCE_NUMBER]: getSessionKeyValue(), [headerKeys.REFERRAL_SEQUENCE_NUMBER]: order?.referralSequenceNumber, + [headerKeys.PAGE_NAME_TO_LOG]: pageNameToLog, [headerKeys.TRANSACTION_ID]: crypto.randomUUID(), [headerKeys.EON]: order?.eon, [headerKeys.LOG_ENABLED]: store.getters.applicationUser?.loggingOption ?? false, diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index 450875d0f..e5e189908 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -3,29 +3,48 @@ import store from "@/store"; import { dynamicStrings } from "@/constants/dynamic-strings"; export function fetchCmsContentForPage(fmgPage) { - return store.dispatch(storeActions.GET_PAGE_DATA, { pageName: fmgPage }).then((response) => { - const pageDataFromCms = {}; + return store + .dispatch(storeActions.GET_PAGE_DATA, { pageName: fmgPage }) + .then((response) => { + const pageDataFromCms = {}; - response.data.Result.forEach((widget) => { - let widgetWithReplacements = findAndReplaceGlobalStateValues(widget.Model, widget.Name); + response.data.Result.forEach((widget) => { + let widgetWithReplacements = findAndReplaceGlobalStateValues( + widget.Model, + widget.Name + ); - // If we already have this widget, push it on the collection - if (widgetWithReplacements.Name in pageDataFromCms) { - pageDataFromCms[widgetWithReplacements.Name].push(widgetWithReplacements.Model); - return; + // If we already have this widget, push it on the collection + if (widgetWithReplacements.Name in pageDataFromCms) { + pageDataFromCms[widgetWithReplacements.Name].push(widgetWithReplacements.Model); + return; + } + + pageDataFromCms[widgetWithReplacements.Name] = [widgetWithReplacements.Model]; + }); + + Object.keys(pageDataFromCms).forEach((key) => { + if (pageDataFromCms[key].length === 1) { + pageDataFromCms[key] = pageDataFromCms[key][0]; + } + }); + + return pageDataFromCms; + }) + .catch((error) => { + // Client-specific config pages are optional. When one doesn't exist + // the CMS returns a 404 - treat that as "no overrides" instead of an + // error so callers receive an empty config object. + const isClientConfigPage = typeof fmgPage === "string" && fmgPage.startsWith("client_"); + const status = error?.status ?? error?.response?.status; + const isNotFound = status == 404; + + if (isClientConfigPage && isNotFound) { + return {}; } - pageDataFromCms[widgetWithReplacements.Name] = [widgetWithReplacements.Model]; + return Promise.reject(error); }); - - Object.keys(pageDataFromCms).forEach((key) => { - if (pageDataFromCms[key].length === 1) { - pageDataFromCms[key] = pageDataFromCms[key][0]; - } - }); - - return pageDataFromCms; - }); } // Function to convert a string, into a matching global state item. diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index acdab2f17..f3269bcd9 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -127,7 +127,7 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); next((vm) => { vm.setCmsContent(resultMap.cmsContent); - vm.clientConfig = resultMap.clientConfig; + vm.clientConfig = resultMap.clientConfig ?? {}; debugLog( `coverage-statement clientConfig::${clientConfigPageName}`, JSON.stringify(vm.clientConfig) @@ -182,7 +182,7 @@ export default { return this.clientConfig?.ClientLogoWidget?.Image || ""; }, deductibleAmount() { - return this.$store.getters.order.policy.currentDeductible; + return Number(this.$store.getters.order.policy.currentDeductible); }, cashPrice() { const lineItems = this.$store.getters.order.lineItems; diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index 8af8351df..40f0a8c0d 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -8,19 +8,10 @@
- - - - - + { vm.setCmsContent(resultMap.cmsContent); - vm.clientConfig = resultMap.clientConfig; + vm.clientConfig = resultMap.clientConfig ?? {}; debugLog( `duplicate-check clientConfig::${clientConfigPageName}`, JSON.stringify(vm.clientConfig) @@ -116,12 +105,6 @@ export default { clientLogoImageSrc() { return this.clientConfig?.ClientLogoWidget?.Image || ""; }, - pageTitleText() { - return this.getCmsContent("DupCheckPageTitleWidget", "Text"); - }, - pageInstructionsText() { - return this.getCmsContent("DupCheckPageInstructionsWidget", "Text"); - }, existingClaimsQuestionText() { return this.getCmsContent("ExistingClaimsListWidget", "QuestionText"); }, diff --git a/src/layouts/endorsements/endorsements.vue b/src/layouts/endorsements/endorsements.vue index ecf4482ac..7aa027dec 100644 --- a/src/layouts/endorsements/endorsements.vue +++ b/src/layouts/endorsements/endorsements.vue @@ -8,19 +8,10 @@
- - - - - + { vm.setCmsContent(resultMap.cmsContent); - vm.clientConfig = resultMap.clientConfig; + vm.clientConfig = resultMap.clientConfig ?? {}; debugLog( `endorsements clientConfig::${clientConfigPageName}`, JSON.stringify(vm.clientConfig) @@ -113,12 +102,6 @@ export default { clientLogoImageSrc() { return this.clientConfig?.ClientLogoWidget?.Image || ""; }, - endorsementHeading() { - return this.getCmsContent("EndorsementsPageAdditionalInfoWidget", "Text"); - }, - moreDetailsText() { - return this.getCmsContent("MoreDetailsWidget", "Text"); - }, schoolEndorsementQuestionText() { return this.getCmsContent("SchoolEndorsmentQuestionWidget", "QuestionText"); }, diff --git a/src/layouts/insurance-details/insurance-details.vue b/src/layouts/insurance-details/insurance-details.vue index a675e0871..d4a686fa1 100644 --- a/src/layouts/insurance-details/insurance-details.vue +++ b/src/layouts/insurance-details/insurance-details.vue @@ -80,8 +80,8 @@ isRequired class="mb-4" cmsWidgetName="ApartmentWidget" - v-model="apartment" - inputId="apartment" /> + v-model="streetAddress2" + inputId="streetAddress2" /> +
+ + + 0); next((vm) => { vm.setCmsContent(resultMap.cmsContent); + vm.showSaveProgressModal = showSaveProgressModal; }); }, @@ -242,19 +260,19 @@ export default { return store.getters.order.damage.damageCause ?? ""; }, getStreetAddressFromStore() { - return store.getters.order.policy.streetAddress ?? ""; + return store.getters.order.policy.policyAddress.streetAddress ?? ""; }, - getApartmentFromStore() { - return store.getters.order.policy.apartment ?? ""; + getStreetAddress2FromStore() { + return store.getters.order.policy.policyAddress.streetAddress2 ?? ""; }, getCityFromStore() { - return store.getters.order.policy.city ?? ""; + return store.getters.order.policy.policyAddress.city ?? ""; }, getPolicyStateFromStore() { - return store.getters.order.policy.state ?? ""; + return store.getters.order.policy.policyAddress.state ?? ""; }, getPolicyZipFromStore() { - return store.getters.order.policy.zipCode ?? ""; + return store.getters.order.policy.policyAddress.zipCode ?? ""; }, getClaimNumberFromStore() { return store.getters.order.policy.claimNumber ?? ""; @@ -271,11 +289,15 @@ export default { { policyNumber: this.policyNumber, streetAddress: this.streetAddress, - apartment: this.apartment, + streetAddress2: this.streetAddress2, city: this.city, state: this.policyState, zipCode: this.policyZip, claimNumber: this.claimNumber, + currentDeductible: 7777, + originalDeductible: 7777, + coverageStatus: coverageStatusEnum(coverageStatus.PENDING), + coverageSubStatus: "", }, false ); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index b0347f581..810414b96 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -567,14 +567,14 @@ export default { this.dispatchStoreAction(storeActions.RESET_SAVE_SESSION_PROMISE); - const shouldUseAdyen = experimentMixin.methods.hasSettingEqualTo( + const shouldUseCybersource = experimentMixin.methods.hasSettingEqualTo( experimentSettings.USE_ADYEN_PAYMENT, - "true" + "false" ); - const scenarioName = shouldUseAdyen - ? this.navigationScenarios.CLICKED_PAY_NOW_ADYEN - : this.navigationScenarios.CLICKED_PAY_NOW; + const scenarioName = shouldUseCybersource + ? this.navigationScenarios.CLICKED_PAY_NOW + : this.navigationScenarios.CLICKED_PAY_NOW_ADYEN; this.$router.navigateWithoutSaving(scenarioName, this.pageName); }, diff --git a/src/layouts/policy-driver/policy-driver.spec.js b/src/layouts/policy-driver/policy-driver.spec.js index 60ed331e6..f06904c1d 100644 --- a/src/layouts/policy-driver/policy-driver.spec.js +++ b/src/layouts/policy-driver/policy-driver.spec.js @@ -55,6 +55,15 @@ function setupMocks() { fetchCmsContentForPage.mockResolvedValue(mockCmsContent); settleAllPromises.mockResolvedValue({ cmsContent: mockCmsContent }); + const mockMixin = { + methods: { + getCmsContent: jest.fn((widgetName, fieldName) => { + return mockCmsContent?.[widgetName]?.[fieldName] ?? ""; + }), + setCmsContent: jest.fn(), + }, + }; + const mountOptions = getMountOptions({ route: { name: "policy-driver", query: {}, params: {} }, router: { @@ -62,6 +71,7 @@ function setupMocks() { navigateWithSaving: jest.fn(), navigateWithoutSaving: jest.fn(), }, + mixins: [mockMixin], }); const wrapper = shallowMount(policyDriver, mountOptions); diff --git a/src/layouts/policy-driver/policy-driver.vue b/src/layouts/policy-driver/policy-driver.vue index 0659ff658..ae2d9fb6c 100644 --- a/src/layouts/policy-driver/policy-driver.vue +++ b/src/layouts/policy-driver/policy-driver.vue @@ -8,10 +8,20 @@
- - + + + + { vm.setCmsContent(resultMap.cmsContent); - vm.clientConfig = resultMap.clientConfig; + vm.clientConfig = resultMap.clientConfig ?? {}; debugLog( `policy-driver clientConfig::${clientConfigPageName}`, JSON.stringify(vm.clientConfig) @@ -81,6 +93,12 @@ export default { clientLogoImageSrc() { return this.clientConfig?.ClientLogoWidget?.Image || ""; }, + driverSelectionText() { + return this.getCmsContent("DriverSelectionWidget", "QuestionText"); + }, + driverSelectionAnswers() { + return this.getCmsContent("DriverSelectionWidget", "Answers"); + }, }, methods: { diff --git a/src/layouts/policy-info-submitted/policy-info-submitted.spec.js b/src/layouts/policy-info-submitted/policy-info-submitted.spec.js index 4d80621ee..b528c8075 100644 --- a/src/layouts/policy-info-submitted/policy-info-submitted.spec.js +++ b/src/layouts/policy-info-submitted/policy-info-submitted.spec.js @@ -26,11 +26,6 @@ describe("policy-info-submitted.vue", () => { expect(wrapper.findComponent({ name: "funnelSubHeader" }).exists()).toBe(true); }); - test("renders navbar component", () => { - const { wrapper } = setupMocks(); - expect(wrapper.findComponent({ name: "insuranceNavBar" }).exists()).toBe(true); - }); - test("renders Form component", () => { const { wrapper } = setupMocks(); expect(wrapper.findComponent({ name: "Form" }).exists()).toBe(true); @@ -55,13 +50,23 @@ function setupMocks() { fetchCmsContentForPage.mockResolvedValue(mockCmsContent); settleAllPromises.mockResolvedValue({ cmsContent: mockCmsContent }); + const mockMixin = { + methods: { + getCmsContent: jest.fn((widgetName, fieldName) => { + return mockCmsContent?.[widgetName]?.[fieldName] ?? ""; + }), + setCmsContent: jest.fn(), + }, + }; + const mountOptions = getMountOptions({ - route: { name: "policy-vehicle", query: {}, params: {} }, + route: { name: "endorsements", query: {}, params: {} }, router: { navigate: jest.fn(), navigateWithSaving: jest.fn(), navigateWithoutSaving: jest.fn(), }, + mixins: [mockMixin], }); const wrapper = shallowMount(policyInfoSubmitted, mountOptions); diff --git a/src/layouts/policy-info-submitted/policy-info-submitted.vue b/src/layouts/policy-info-submitted/policy-info-submitted.vue index 4b93def2e..5afec595d 100644 --- a/src/layouts/policy-info-submitted/policy-info-submitted.vue +++ b/src/layouts/policy-info-submitted/policy-info-submitted.vue @@ -1,5 +1,5 @@