From 5fe72420da028dcb50fcb124a3bfd045b8339481 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:08:55 +0000 Subject: [PATCH 01/10] Bump follow-redirects from 1.15.11 to 1.16.0 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.11 to 1.16.0. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.11...v1.16.0) --- updated-dependencies: - dependency-name: follow-redirects dependency-version: 1.16.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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": [ { From 6e5a6411ab93d56e1c8f21e8f8b5f2a9ab054fe1 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 16 Apr 2026 09:50:47 -0400 Subject: [PATCH 02/10] INSR-8883: Add events to provider-preference --- .../provider-preference/provider-preference.vue | 2 ++ .../steering-modal/steering-modal.vue | 1 + .../tpa-recal-modal/tpa-recal-modal.vue | 9 +++++++++ .../tpa-recal-toggle/tpa-recal-toggle.vue | 11 +++++++++++ 4 files changed, 23 insertions(+) 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..5597b65d 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="handleModelOpenedEvent" :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 === 'yes' ? '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; } + }, + handleModelOpenedEvent(isOpened) { + if (!isOpened) { + 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; } } From 08a9a473606ef5ec6cddb576236fc8b19da8b94a Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 16 Apr 2026 10:18:55 -0400 Subject: [PATCH 03/10] INSR-8883: Fix type in for modal event handler, fix bug with event on modal close --- .../provider-preference/tpa-recal-modal/tpa-recal-modal.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 5597b65d..68dfc66d 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,7 +6,7 @@ :footerButtonText="ModalCloseButtonText" :isButtonDisabled="isButtonDisabled" @footerButtonEvent="footerButtonClick" - @isModalOpened="handleModelOpenedEvent" + @isModalOpened="handleModalOpenedEvent" :displayCloseButton="false" :displayCloseLink="true">
@@ -156,8 +156,8 @@ export default { this.showNoSelectionError = false; } }, - handleModelOpenedEvent(isOpened) { - if (!isOpened) { + handleModalOpenedEvent(isOpened) { + if (!isOpened && !(!this.showAcknowledgementCheckbox || this.acknowledged)) { this.pushEventToGA('ADAS_self_service', 'acknowledge_recal', 'TPA_decline', true); } } From 20a8a9b8fd32240044413cf60d22545d54031c34 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 16 Apr 2026 11:10:12 -0400 Subject: [PATCH 04/10] INSR-8883: Fix conditional for an event label --- .../provider-preference/tpa-recal-modal/tpa-recal-modal.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 68dfc66d..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 @@ -144,7 +144,7 @@ export default { footerButtonClick() { if (this.tpaRecalAnswer && (!this.showAcknowledgementCheckbox || this.acknowledged)) { - const eventLabel = this.tpaRecalAnswer === PROVIDER_PREFERENCE_OPTIONS.SAFELITE === 'yes' ? 'TPA_schedule_with_safelite' : 'TPA_accept'; + 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); From 3af2d3e737f101bbbef9938368af42d1e36d2ed5 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Fri, 17 Apr 2026 09:35:35 -0400 Subject: [PATCH 05/10] Make cart work with MSR before split pay is implemented --- src/iss-components/cart-dropdown/cart-dropdown.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 From 9fd92eb4cd898c6d94c941ac38b2b4070d0a204a Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 17 Apr 2026 10:36:26 -0400 Subject: [PATCH 06/10] INSR-8881: Ensure modal links don't end up with doubled listeners --- src/helpers/cms-content-helper.js | 5 +++-- src/layouts/coverage-statement/coverage-statement.vue | 11 ++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index bf12c5c2..d2c3ce97 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -526,13 +526,13 @@ 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()); + element.addEventListener('click', () => context.$refs[target].openModal(), { signal: abortSignal }); } } }); @@ -547,6 +547,7 @@ export function setupModalLink(context, desiredTarget) { context.$nextTick(() => { const element = document.querySelector(`[modalTarget=${desiredTarget}]`); if (element) { + element.removeEventListener('click', () => context.$refs[desiredTarget].openModal()); element.addEventListener('click', () => context.$refs[desiredTarget].openModal()); } }); 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() { From 191663258f082eeaa54b5586084ec20d4c0c9e4a Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 17 Apr 2026 10:47:02 -0400 Subject: [PATCH 07/10] INSR-8881.2: Handle null abort signal, remove now-unneeded code --- src/helpers/cms-content-helper.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index d2c3ce97..c8ddf306 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -532,7 +532,12 @@ export function setupModalLinks(context, abortSignal = null) { for (const element of elements) { const target = element.getAttribute('modalTarget'); if (target) { - element.addEventListener('click', () => context.$refs[target].openModal(), { signal: abortSignal }); + if (abortSignal) { + element.addEventListener('click', () => context.$refs[target].openModal(), { signal: abortSignal }); + } + else { + element.addEventListener('click', () => context.$refs[target].openModal()); + } } } }); @@ -547,7 +552,6 @@ export function setupModalLink(context, desiredTarget) { context.$nextTick(() => { const element = document.querySelector(`[modalTarget=${desiredTarget}]`); if (element) { - element.removeEventListener('click', () => context.$refs[desiredTarget].openModal()); element.addEventListener('click', () => context.$refs[desiredTarget].openModal()); } }); From 6c7750c74a433ce5d025e0eb770d8a82a9b8dede Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 17 Apr 2026 13:01:57 -0400 Subject: [PATCH 08/10] INSR-9260: Fix missing sentence in drop off appointment time text --- src/layouts/order-confirmation/order-confirmation.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From 44a2b389881c51ac0969c2520fe4535c04674f87 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 17 Apr 2026 13:08:01 -0400 Subject: [PATCH 09/10] INSR-9260: update test to match new text --- src/layouts/order-confirmation/order-confirmation.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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'], From 1a9e545730dfb8d3d61b3c4b8b7618190e5d0adf Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 17 Apr 2026 14:04:39 -0400 Subject: [PATCH 10/10] INSR-9260: Update snapshot --- .../__snapshots__/coverage-statement.spec.js.snap | 5 +++++ 1 file changed, 5 insertions(+) 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 {