diff --git a/jest.config.js b/jest.config.js index 0debddc86..ce4aa3ad6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -32,7 +32,7 @@ module.exports = { testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], coverageThreshold: { global: { - statements: 76, + statements: 75, }, }, // Uncomment this to avoid the massive amount of warnings we are getting for onSubmit and onInvalidSubmit diff --git a/public/index.html b/public/index.html index e88f8ca8f..abba76b43 100644 --- a/public/index.html +++ b/public/index.html @@ -10,9 +10,6 @@ - - - <%= htmlWebpackPlugin.options.title %> diff --git a/src/assets/fonts/averta-bold-webfont.woff b/src/assets/fonts/averta-bold-webfont.woff new file mode 100644 index 000000000..422e65fff Binary files /dev/null and b/src/assets/fonts/averta-bold-webfont.woff differ diff --git a/src/assets/fonts/averta-bold-webfont.woff2 b/src/assets/fonts/averta-bold-webfont.woff2 new file mode 100644 index 000000000..c66990f59 Binary files /dev/null and b/src/assets/fonts/averta-bold-webfont.woff2 differ diff --git a/src/assets/fonts/averta-bolditalic-webfont.woff b/src/assets/fonts/averta-bolditalic-webfont.woff new file mode 100644 index 000000000..e3fff494c Binary files /dev/null and b/src/assets/fonts/averta-bolditalic-webfont.woff differ diff --git a/src/assets/fonts/averta-bolditalic-webfont.woff2 b/src/assets/fonts/averta-bolditalic-webfont.woff2 new file mode 100644 index 000000000..afde47c88 Binary files /dev/null and b/src/assets/fonts/averta-bolditalic-webfont.woff2 differ diff --git a/src/assets/fonts/averta-extrabold-webfont.woff b/src/assets/fonts/averta-extrabold-webfont.woff new file mode 100644 index 000000000..1f76979dd Binary files /dev/null and b/src/assets/fonts/averta-extrabold-webfont.woff differ diff --git a/src/assets/fonts/averta-extrabold-webfont.woff2 b/src/assets/fonts/averta-extrabold-webfont.woff2 new file mode 100644 index 000000000..48c8bfeda Binary files /dev/null and b/src/assets/fonts/averta-extrabold-webfont.woff2 differ diff --git a/src/assets/fonts/averta-regular-webfont.woff b/src/assets/fonts/averta-regular-webfont.woff new file mode 100644 index 000000000..e657e8a0f Binary files /dev/null and b/src/assets/fonts/averta-regular-webfont.woff differ diff --git a/src/assets/fonts/averta-regular-webfont.woff2 b/src/assets/fonts/averta-regular-webfont.woff2 new file mode 100644 index 000000000..4b481ebb1 Binary files /dev/null and b/src/assets/fonts/averta-regular-webfont.woff2 differ diff --git a/src/assets/fonts/averta-regularitalic-webfont.woff b/src/assets/fonts/averta-regularitalic-webfont.woff new file mode 100644 index 000000000..0bb7810b6 Binary files /dev/null and b/src/assets/fonts/averta-regularitalic-webfont.woff differ diff --git a/src/assets/fonts/averta-regularitalic-webfont.woff2 b/src/assets/fonts/averta-regularitalic-webfont.woff2 new file mode 100644 index 000000000..86b275720 Binary files /dev/null and b/src/assets/fonts/averta-regularitalic-webfont.woff2 differ diff --git a/src/assets/fonts/averta-semibold-webfont.woff b/src/assets/fonts/averta-semibold-webfont.woff new file mode 100644 index 000000000..e7fbb0d86 Binary files /dev/null and b/src/assets/fonts/averta-semibold-webfont.woff differ diff --git a/src/assets/fonts/averta-semibold-webfont.woff2 b/src/assets/fonts/averta-semibold-webfont.woff2 new file mode 100644 index 000000000..1245f1a4e Binary files /dev/null and b/src/assets/fonts/averta-semibold-webfont.woff2 differ diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 185d3d369..c9592c315 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -57,6 +57,7 @@ const storeActions = { GET_RECAL_PARTS_AND_SAVE_TO_LINE_ITEMS: "getRecalPartsAndSaveToLineItems", // DEPENDENCY MUTATIONS + RESET_VEHICLE_STATE_AND_DEPENDENCIES: "resetVehicleStateAndDependencies", RESET_DAMAGE_STATE_AND_DEPENDENCIES: "resetDamageAndDependencies", RESET_REGISTRATION_STATE_AND_DEPENDENCIES: "resetRegistrationAndDependencies", RESET_PARTS_STATE_AND_DEPENDENCIES: "resetPartsAndDependencies", diff --git a/src/digital-components/modal/modal.vue b/src/digital-components/modal/modal.vue index 6e6664ca1..37ebee18e 100644 --- a/src/digital-components/modal/modal.vue +++ b/src/digital-components/modal/modal.vue @@ -73,6 +73,11 @@ export default { resetForm, }; }, + data() { + return { + isEnterClicked: false, + }; + }, methods: { async validateAndEmit() { const validationResult = await this.validate(); @@ -84,9 +89,14 @@ export default { }, async onEnter(e) { e.preventDefault(); + if (this.isEnterClicked) return; + this.isEnterClicked = true; document.getElementById("modalbtn")?.focus(); this.$refs.modalButtonMain.clicked(); document.getElementById(this.modalId)?.focus(); + setTimeout(() => { + this.isEnterClicked = false; + }, 2000); }, resetButtonStyle() { this.$refs.modalButtonMain?.resetButtonStyle(); @@ -156,7 +166,7 @@ export default { width: 100%; bottom: 0; z-index: 5; - background-color: $gray-100; + background-color: $white; } &.modal-component { .modal-dialog { diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index f2799d7be..2dcafb154 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -96,7 +96,7 @@ {{ @@ -110,7 +110,7 @@ {{ subtotalText }} {{ getLineItemAmount(subTotal, showCoverageAsPending) }} -
+
{{ salesTaxText }} {{ getLineItemAmount(salesTax) }}
@@ -134,7 +134,8 @@ v-model="lineItems" :addableVaps="availableVaps" :pageName="pageName" - modalWidgetName="PromoModalWidget" /> + modalWidgetName="PromoModalWidget" + @promoAdded="saveVaps" />
lineItemsToKeep.cartItemType != cartItemType ); + + await this.dispatchStoreAction(storeActions.SAVE_VAPS, this.lineItems.vaps, false); + }, + + async saveVaps(lineItems) { + this.lineItems.vaps = [...lineItems.vaps]; + this.lineItems.promos = [...lineItems.promos]; + await this.dispatchStoreAction(storeActions.SAVE_VAPS, this.lineItems.vaps, false); + await this.dispatchStoreAction( + storeActions.SAVE_ACTIVE_AND_OR_INACTIVE_PROMOS, + { + activePromos: this.lineItems.promos, + }, + false + ); }, getPromoCodeList() { @@ -318,6 +335,10 @@ export default { showCoverageAsVerified() { return this.showInsuranceCoverageAs === coverageStatus.VERIFIED; }, + showSalesTax() { + const tax = parseFloat(this.salesTax).toFixed(2); + return tax > 0; + }, currentDeductible() { const deductible = this.insuranceDeductible; if (!(deductible === 0 || deductible > 0)) { diff --git a/src/fmg-components/funnel-header/funnel-header.vue b/src/fmg-components/funnel-header/funnel-header.vue index 8de05c3c1..22d9e77fa 100644 --- a/src/fmg-components/funnel-header/funnel-header.vue +++ b/src/fmg-components/funnel-header/funnel-header.vue @@ -94,7 +94,7 @@ export default { } .logo-image { - max-width: 114px; - height: auto; + width: auto; + height: 1.1875rem; } diff --git a/src/fmg-components/funnel-header/menu-modal/menu-modal.vue b/src/fmg-components/funnel-header/menu-modal/menu-modal.vue index be2cdab23..825e5e0fb 100644 --- a/src/fmg-components/funnel-header/menu-modal/menu-modal.vue +++ b/src/fmg-components/funnel-header/menu-modal/menu-modal.vue @@ -42,8 +42,8 @@
-
- - +
@@ -56,7 +52,6 @@ diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index bd3c228e9..41491dd59 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -147,7 +147,15 @@ export async function navigateToHeritageFunnel({ ) { heritageParms["forceEndToEndInsurance"] = true; } - router.navigateToExternalUrl(applicationConfig.HERITAGE_FUNNEL, heritageParms, callBackMethod); + + // clear the heritage session that may still exist after an order was already submitted + if (window.sessionStorage.getItem("createNewSessionForHeritage") !== null) { + heritageParms["cns"] = "all"; + window.sessionStorage.removeItem("createNewSessionForHeritage"); + } + + router.navigateToExternalUrl(applicationConfig.HERITAGE_FUNNEL, heritageParms, callBackMethod); + } export async function skipVinLookup() { diff --git a/src/layouts/address-lookup/address-lookup.vue b/src/layouts/address-lookup/address-lookup.vue index 6ac7a3d9a..50a3f0e11 100644 --- a/src/layouts/address-lookup/address-lookup.vue +++ b/src/layouts/address-lookup/address-lookup.vue @@ -12,11 +12,7 @@
-
- +
@@ -103,7 +99,6 @@ // Components import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import navbar from "@/fmg-components/nav-bar/nav-bar"; -import vehicleBanner from "@/fmg-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import customerQuestions from "@/layouts/address-lookup/customer-questions/customer-questions"; import alert from "@/ux-components/alert/alert"; @@ -480,7 +475,6 @@ export default { components: { funnelHeader, navbar, - vehicleBanner, funnelSubHeader, customerQuestions, textboxQuestion, diff --git a/src/layouts/address-vehicles/address-vehicles.vue b/src/layouts/address-vehicles/address-vehicles.vue index 7b5fc72b2..495e66de9 100644 --- a/src/layouts/address-vehicles/address-vehicles.vue +++ b/src/layouts/address-vehicles/address-vehicles.vue @@ -7,10 +7,7 @@
-
- +
@@ -54,7 +51,6 @@ // Components import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import navbar from "@/fmg-components/nav-bar/nav-bar"; -import vehicleBanner from "@/fmg-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import alert from "@/ux-components/alert/alert"; import addressVehiclesQuestion from "@/layouts/address-vehicles/address-vehicles-question/address-vehicles-question"; @@ -243,7 +239,6 @@ export default { components: { Form, funnelHeader, - vehicleBanner, funnelSubHeader, alert, navbar, diff --git a/src/layouts/bailout/bailout.vue b/src/layouts/bailout/bailout.vue index a7cf017b4..66720baba 100644 --- a/src/layouts/bailout/bailout.vue +++ b/src/layouts/bailout/bailout.vue @@ -8,10 +8,7 @@
-
- +
@@ -30,7 +27,6 @@ // Components import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import navbar from "@/fmg-components/nav-bar/nav-bar"; -import vehicleBanner from "@/fmg-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; @@ -71,7 +67,6 @@ export default { components: { funnelHeader, navbar, - vehicleBanner, funnelSubHeader, loadingModal, }, diff --git a/src/layouts/confirmation/confirmation.spec.js b/src/layouts/confirmation/confirmation.spec.js index 166973ce6..2141d0591 100644 --- a/src/layouts/confirmation/confirmation.spec.js +++ b/src/layouts/confirmation/confirmation.spec.js @@ -9,6 +9,10 @@ import { nextTick } from "vue"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import store from "@/store"; import router from "@/router"; +import experimentMixin from "@/mixins/experiment-mixin.js"; +import { experimentSettings } from "@/constants/experiments"; + +const mockExperimentSettings = experimentSettings; // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ @@ -66,6 +70,9 @@ beforeEach(() => { customer: { emailAddress: "test@test.com", }, + policy: { + isNoComp: false, + }, }, damage: {}, payment: { @@ -237,7 +244,7 @@ describe("computed properties...", () => { const testValue = wrapper.vm.AppointmentWordingText; // Assert - expect(testValue).toEqual("wording Text 123, test,
test, AZ 12345"); + expect(testValue).toEqual("wording Text test, 123,
test, AZ 12345"); }); test("AppointmentWordingText should return DROP_OFF text in expected format.", () => { //Arrange @@ -419,7 +426,7 @@ describe("computed properties...", () => { const testValue = wrapper.vm.ServiceLocationFullAddress; // Assert - expect(testValue).toEqual("123, test,
test, AZ 12345"); + expect(testValue).toEqual("test, 123,
test, AZ 12345"); }); test("ProviderFullAddress should return text in expected format.", () => { //Arrange @@ -552,6 +559,140 @@ describe("computed properties...", () => { // Assert expect(testValue).toEqual("Duration: Overnight"); }); + + test("NoComp should return false for shouldHideRecalibration", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.submittedOrder = { + vehicle: { + imageUrl: "", + }, + schedule: { + endTime: "10:00", + date: "2024-09-28", + jobMaxMinutes: 120, + jobMinMinutes: 60, + routeCode: "", + }, + policy: { + isNoComp: true, + }, + serviceLocation: store.getters.order.serviceLocation, + }; + wrapper.vm.submittedOrder.serviceLocation.appointmentType = AppointmentTypeStrings.MOBILE; + // Act + const testValue = wrapper.vm.shouldHideRecalibration; + + // Assert + expect(testValue).toEqual(false); + }); + test("Itac should return false for shouldHideRecalibration", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.submittedOrder = { + vehicle: { + imageUrl: "", + }, + schedule: { + endTime: "10:00", + date: "2024-09-28", + jobMaxMinutes: 120, + jobMinMinutes: 60, + routeCode: "", + }, + policy: { + isItac: true, + }, + serviceLocation: store.getters.order.serviceLocation, + }; + wrapper.vm.submittedOrder.serviceLocation.appointmentType = AppointmentTypeStrings.MOBILE; + // Act + const testValue = wrapper.vm.shouldHideRecalibration; + + // Assert + expect(testValue).toEqual(false); + }); + test("Not Itac/NoComp with Recal should return true for shouldHideRecalibration", async () => { + //Arrange + const { wrapper } = setupMocks({}); + const lineItems = { + glassParts: [ + { + partType: "RECALIBRATION", + }, + ], + }; + + wrapper.vm.submittedOrder = { + vehicle: { + imageUrl: "", + }, + schedule: { + endTime: "10:00", + date: "2024-09-28", + jobMaxMinutes: 120, + jobMinMinutes: 60, + routeCode: "", + }, + policy: { + isItac: false, + isNoComp: false, + }, + lineItems: { + glassParts: { + partType: "Recalibration", + }, + }, + serviceLocation: store.getters.order.serviceLocation, + }; + + wrapper.setData({ lineItems: lineItems }); + await wrapper.vm.$nextTick(); + + // Act + const testValue = wrapper.vm.shouldHideRecalibration; + + // Assert + expect(testValue).toEqual(true); + }); + test("Itac/NoComp with Recal should return false for shouldHideRecalibration", async () => { + //Arrange + const { wrapper } = setupMocks({}); + const lineItems = { + glassParts: [ + { + partType: "RECALIBRATION", + }, + ], + }; + + wrapper.vm.submittedOrder = { + vehicle: { + imageUrl: "", + }, + schedule: { + endTime: "10:00", + date: "2024-09-28", + jobMaxMinutes: 120, + jobMinMinutes: 60, + routeCode: "", + }, + policy: { + isItac: true, + isNoComp: false, + }, + serviceLocation: store.getters.order.serviceLocation, + }; + + wrapper.setData({ lineItems: lineItems }); + await wrapper.vm.$nextTick(); + + // Act + const testValue = wrapper.vm.shouldHideRecalibration; + + // Assert + expect(testValue).toEqual(false); + }); }); function setupMocks({ customMountOptions }) { @@ -565,10 +706,17 @@ function setupMocks({ customMountOptions }) { getCmsContent: jest.fn().mockImplementation(() => { return wordingText; }), - getSettingValue: jest.fn(), + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.RECAL_PRICE_REMOVE) { + return "true"; + } + + return "false"; + }), }, }, ]; + const wrapper = shallowMount(confirmation, mountOptions); return { wrapper }; } diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 1d77585b3..f8b27a01e 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -16,10 +16,7 @@
- +
@@ -88,7 +85,6 @@