From 5b80824f1765c1fbdb0c171f96467a65cb3fbd8d Mon Sep 17 00:00:00 2001 From: Matt Sykes Date: Mon, 22 Jun 2026 17:00:03 -0400 Subject: [PATCH 01/18] Avoid logging unhandledRejection with browser extensions in stack trace --- src/App.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/App.vue b/src/App.vue index 36c4b58a3..d8600aa87 100644 --- a/src/App.vue +++ b/src/App.vue @@ -87,9 +87,18 @@ window.onerror = (msg, url, line, col, error) => { return suppressErrorAlert; }; +function isBrowserExtensionUnhandledRejection(reason) { + const stack = reason instanceof Error ? reason.stack : ""; + return typeof stack === "string" && stack.includes("chrome-extension://"); +} + // Log Promise rejections that are never handled (.catch / await try/catch), e.g. fire-and-forget async. window.addEventListener("unhandledrejection", (event) => { const reason = event.reason; + if (isBrowserExtensionUnhandledRejection(reason)) { + return; + } + const message = reason instanceof Error ? reason.message : String(reason); global.$logger.logError(`unhandledrejection: ${message}`, { stack: reason instanceof Error ? reason.stack : undefined, From 45c669b30fa1f13b2f8b440ad5a60043c4206fb1 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Tue, 23 Jun 2026 11:14:19 -0400 Subject: [PATCH 02/18] CASH-2942: Always bailout for VIN required vehicles --- .../heritage-integration/navigation-helper.js | 3 +++ .../navigation-helper.spec.js | 15 ++++++++++++ src/mixins/vin-pages-mixin.js | 2 +- src/mixins/vin-pages-mixin.spec.js | 23 +++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index a2b4452d5..029fb1f08 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -65,6 +65,9 @@ export async function skipVinLookup() { if (store.getters.damage.isRepair) { return true; } + if (store.getters.vehicle.vinRequired) { + return false; + } const isVinOptionalVehicle = store.getters.order.vehicle.make ? await store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE) : false; diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js index 752c98fdc..ab1b9d6d7 100644 --- a/src/helpers/heritage-integration/navigation-helper.spec.js +++ b/src/helpers/heritage-integration/navigation-helper.spec.js @@ -11,6 +11,7 @@ import { damageLocationsSelected as glassLocations } from "@/constants/damage-lo import store from "@/store"; import router from "@/router"; +import { skipVinLookup } from "@/helpers/heritage-integration/navigation-helper"; const getPageToRouteExistingOrderTo = navigationHelper.getPageToRouteExistingOrderTo; const navigateToHeritageFunnel = navigationHelper.navigateToHeritageFunnel; @@ -147,6 +148,20 @@ describe("navigateToHeritageFunnel", () => { }); }); +describe("skipVinLookup", () => { + afterEach(() => { + store.commit(storeMutations.UPDATE_VIN_REQUIRED, false); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + }); + + test("returns false when vehicle vin is required", async () => { + store.commit(storeMutations.UPDATE_VIN_REQUIRED, true); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + + await expect(skipVinLookup()).resolves.toBe(false); + }); +}); + /** * `arePagePrerequisitesValidObject` is an object where the keys are fmgPageValue names and the values are booleans that indicate * whether arePagePrerequisitesValid is true or false diff --git a/src/mixins/vin-pages-mixin.js b/src/mixins/vin-pages-mixin.js index 78cb134cf..c15529d4f 100644 --- a/src/mixins/vin-pages-mixin.js +++ b/src/mixins/vin-pages-mixin.js @@ -37,7 +37,7 @@ export default { pageNameToLog: pageName, }); - if (result.PartNotFound) { + if (result.PartNotFound || store.getters.vehicle.vinRequired) { return bailoutMixin.methods.navigateToBailoutPage( this, bailoutCodes.PART_NOT_FOUND diff --git a/src/mixins/vin-pages-mixin.spec.js b/src/mixins/vin-pages-mixin.spec.js index d9ff6f874..46d755c3c 100644 --- a/src/mixins/vin-pages-mixin.spec.js +++ b/src/mixins/vin-pages-mixin.spec.js @@ -3,6 +3,10 @@ import { shallowMount } from "@vue/test-utils"; import { setupMocksForJsFiles, getMountOptions } from "@/helpers/unit-test-helper.js"; import { storeActions } from "@/constants/store-actions"; import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; +import bailoutMixin from "@/mixins/bailout-mixin"; +import { bailoutCodes } from "@/constants/bailout-codes"; +import store from "@/store"; +import { storeMutations } from "@/constants/store-mutations"; jest.mock("@/helpers/heritage-integration/navigation-helper", () => ({ navigateForward: jest.fn(), @@ -15,6 +19,7 @@ jest.mock("@/helpers/heritage-integration/order-helper.js", () => ({ describe("vin-pages-mixin", () => { afterEach(() => { jest.clearAllMocks(); + store.commit(storeMutations.UPDATE_VIN_REQUIRED, false); }); describe("navigateForwardWithSingleCarMatch", () => { @@ -29,6 +34,24 @@ describe("vin-pages-mixin", () => { // Assert expect(vehicleQuestionsMixin.methods.navigateForward).toHaveBeenCalled(); }); + + test("vinRequired vehicles navigate to bailout after VIN is saved", async () => { + // Arrange + store.commit(storeMutations.UPDATE_VIN_REQUIRED, true); + const { wrapper } = setupMocks({}); + bailoutMixin.methods.navigateToBailoutPage = jest.fn(); + vehicleQuestionsMixin.methods.navigateForward = jest.fn(); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(bailoutMixin.methods.navigateToBailoutPage).toHaveBeenCalledWith( + wrapper.vm, + bailoutCodes.PART_NOT_FOUND + ); + expect(vehicleQuestionsMixin.methods.navigateForward).not.toHaveBeenCalled(); + }); }); }); From 5d8c5b44f51e4376163bb7b66b57bc50b29a9774 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Wed, 24 Jun 2026 10:42:36 -0400 Subject: [PATCH 03/18] CASH-2880 | Add loader to date-picker for scheduling --- .../scheduling/date-picker/date-picker.vue | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/layouts/scheduling/date-picker/date-picker.vue b/src/layouts/scheduling/date-picker/date-picker.vue index 3ade2058e..a7f78cc2c 100644 --- a/src/layouts/scheduling/date-picker/date-picker.vue +++ b/src/layouts/scheduling/date-picker/date-picker.vue @@ -10,16 +10,21 @@ class="date-picker__nav-icon date-picker__nav-icon--flipped" alt="" /> -
+
+ +