diff --git a/package-lock.json b/package-lock.json index 404753f6..77a51eea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10492,7 +10492,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index bf12c5c2..c8ddf306 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -526,13 +526,18 @@ export function doesCopyContainTextLink(copy) { * * @param context */ -export function setupModalLinks(context) { +export function setupModalLinks(context, abortSignal = null) { context.$nextTick(() => { const elements = document.getElementsByClassName('modal-text'); for (const element of elements) { const target = element.getAttribute('modalTarget'); if (target) { - element.addEventListener('click', () => context.$refs[target].openModal()); + if (abortSignal) { + element.addEventListener('click', () => context.$refs[target].openModal(), { signal: abortSignal }); + } + else { + element.addEventListener('click', () => context.$refs[target].openModal()); + } } } }); diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 0d661c09..a24586c7 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -237,7 +237,7 @@ export default { if (this.recycleFeeCartItem && !isRecycleFeeHidden) { items.push(this.recycleFeeCartItem); } - if (this.mobileFeeCartItem && !isMobileFeeHidden) { + if (this.mobileFeeCartItem && !isMobileFeeHidden && !this.mobileFeeCartItem.isInsurable) { items.push(this.mobileFeeCartItem); } const vapPartTypesInOrder = Array.from(new Set(this.lineItems.vaps?.map((vap) => vap.partType) ?? [])); @@ -306,7 +306,7 @@ export default { }, mobileFeeCartItem() { const mobileFeeLineItem = getMobileFeeLineItem(this.cartOrder); - return mobileFeeLineItem + const cartItem = mobileFeeLineItem ? this.getCartItem( this.getCmsContent(this.widget.mobileFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), [mobileFeeLineItem], @@ -314,6 +314,10 @@ export default { partTypeStrings.MOBILE_FEE ) : null; + if (cartItem) { + cartItem["isInsurable"] = mobileFeeLineItem?.isInsurable; + } + return cartItem; }, warrantyCartItem() { const label = this.cartOrder.damage.glassToReplace?.length > 0 diff --git a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap index 52bab2ae..997f06bc 100644 --- a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap +++ b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap @@ -5,6 +5,11 @@ Object { "CANCEL_CLAIM_REF_NAME": "CancelClaimModal", "OEM_ENDORSEMENT_REF_NAME": "OEMModal", "RECAL_MODAL_REF_NAME": "RecalModal", + "abortController": AbortController { + Symbol(SameObject caches): Object { + "signal": AbortSignal {}, + }, + }, "baseServiceLineItems": Array [], "isPageLoading": true, "widget": Object { diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 88a0ecb7..54e341ff 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -131,7 +131,6 @@ import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; // Import Supporting Files import { fetchCmsContentForPage, - setupModalLink, setupModalLinks, processIfStatements } from '@/helpers/cms-content-helper.js'; @@ -231,7 +230,8 @@ export default { }, RECAL_MODAL_REF_NAME, CANCEL_CLAIM_REF_NAME, - OEM_ENDORSEMENT_REF_NAME + OEM_ENDORSEMENT_REF_NAME, + abortController: new AbortController() }; }, computed: { @@ -367,8 +367,9 @@ export default { watch: { nextStepsBody(newValue, oldValue) { if (newValue !== oldValue) { - setupModalLink(this, RECAL_MODAL_REF_NAME); - setupModalLink(this, OEM_ENDORSEMENT_REF_NAME); + this.abortController.abort(); + this.abortController = new AbortController(); + setupModalLinks(this, this.abortController.signal); } } }, @@ -376,7 +377,7 @@ export default { if (this.isPageLoading) { showIssLoadingModal(true); } - setupModalLinks(this); + setupModalLinks(this, this.abortController.signal); }, methods: { logEventsToGA() { diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js index 9438b038..aef28e10 100644 --- a/src/layouts/order-confirmation/order-confirmation.spec.js +++ b/src/layouts/order-confirmation/order-confirmation.spec.js @@ -441,7 +441,7 @@ describe('OrderConfirmation.vue', () => { const testValue = wrapper.vm.appointmentTimeText; // Assert - expect(testValue).toEqual('Drop off before 9:30 AM'); + expect(testValue).toEqual('Drop off by 9:30 AM. Pick-up time dependent on shop schedule'); }); test.each([ ['Your appointment is at 9:00 AM', '09:00', '10:00'], diff --git a/src/layouts/order-confirmation/order-confirmation.vue b/src/layouts/order-confirmation/order-confirmation.vue index 063346f2..1a3b6db9 100644 --- a/src/layouts/order-confirmation/order-confirmation.vue +++ b/src/layouts/order-confirmation/order-confirmation.vue @@ -341,7 +341,7 @@ export default { appointmentTimeText() { const { startTime, endTime } = this.schedule; if (this.isDropOffAppointment) { - return 'Drop off before 9:30 AM'; + return 'Drop off by 9:30 AM. Pick-up time dependent on shop schedule'; } if (this.isInShopAppointment) { const formattedStartTime = get12HourTimeFormat(startTime); diff --git a/src/layouts/provider-preference/provider-preference.vue b/src/layouts/provider-preference/provider-preference.vue index 21a6bc20..ff2fdf5c 100644 --- a/src/layouts/provider-preference/provider-preference.vue +++ b/src/layouts/provider-preference/provider-preference.vue @@ -158,11 +158,13 @@ export default { scheduleWithSafelite() { this.mainStore.updateIsSafeliteProvider(true); const scenario = this.navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE; + this.pushEventToGA('prefered_provider', 'Safelite', this.mainStore.accountNameForEvents, true); this.navigateForward(scenario); }, scheduleWithTPA() { this.mainStore.updateIsSafeliteProvider(false); const scenario = this.navigationScenarios.CLICKED_FORWARD_WITH_TPA_ENABLED; + this.pushEventToGA('prefered_provider', 'TPA', this.mainStore.accountNameForEvents, true); this.navigateForward(scenario); }, findAnotherShopClicked() { diff --git a/src/layouts/provider-preference/steering-modal/steering-modal.vue b/src/layouts/provider-preference/steering-modal/steering-modal.vue index fb324ced..ab726051 100644 --- a/src/layouts/provider-preference/steering-modal/steering-modal.vue +++ b/src/layouts/provider-preference/steering-modal/steering-modal.vue @@ -62,6 +62,7 @@ export default { }, methods: { openModal() { + this.pushEventToGA('prefered_provider', 'display_modal', 'right_to_choose', true); this.$refs[this.ModalName].openModal(); }, diff --git a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue index 549e933b..535f8620 100644 --- a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue +++ b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue @@ -6,6 +6,7 @@ :footerButtonText="ModalCloseButtonText" :isButtonDisabled="isButtonDisabled" @footerButtonEvent="footerButtonClick" + @isModalOpened="handleModalOpenedEvent" :displayCloseButton="false" :displayCloseLink="true">
@@ -137,11 +138,14 @@ export default { }, methods: { openModal() { + this.pushEventToGA('ADAS_self_service', 'acknowledge_recal', 'TPA_displayed_message', true); this.$refs[this.ModalName].openModal(); }, footerButtonClick() { if (this.tpaRecalAnswer && (!this.showAcknowledgementCheckbox || this.acknowledged)) { + const eventLabel = this.tpaRecalAnswer === PROVIDER_PREFERENCE_OPTIONS.SAFELITE ? 'TPA_schedule_with_safelite' : 'TPA_accept'; + this.pushEventToGA('ADAS_self_service', 'acknowledge_recal', eventLabel, true); this.$refs[this.ModalName]?.closeModal(); this.$emit('buttonClick', this.tpaRecalAnswer); } else if (!this.tpaRecalAnswer) { @@ -151,6 +155,11 @@ export default { this.showAcknowledgementError = true; this.showNoSelectionError = false; } + }, + handleModalOpenedEvent(isOpened) { + if (!isOpened && !(!this.showAcknowledgementCheckbox || this.acknowledged)) { + this.pushEventToGA('ADAS_self_service', 'acknowledge_recal', 'TPA_decline', true); + } } } }; diff --git a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue index 2c64ba69..0306ee12 100644 --- a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue +++ b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue @@ -51,6 +51,17 @@ export default { }, methods: { handleClickToggle() { + let coverageType = ''; + if (this.mainStore.isItac) { + coverageType = 'ITAC'; + } else if (this.mainStore.isNoComp) { + coverageType = 'no_comp'; + } else if (this.mainStore.isVerified) { + coverageType = 'verified'; + } else { + coverageType = 'unverified'; + } + this.pushEventToGA('ADAS_self_service', 'WSN_learn_more_clicked', coverageType, true); this.isDetailVisible = !this.isDetailVisible; } }