From 56422e5459cceda119e0e9e25df05aac326117bd Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Thu, 19 Feb 2026 16:14:40 -0500 Subject: [PATCH 001/111] modal updates WIP --- src/digital-components/modal/modal.vue | 46 ++++++------------- .../content-group-modal.vue | 2 +- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/digital-components/modal/modal.vue b/src/digital-components/modal/modal.vue index d4be7797..1f410236 100644 --- a/src/digital-components/modal/modal.vue +++ b/src/digital-components/modal/modal.vue @@ -13,14 +13,13 @@ }">
-
-
+ ref="recalModal" + :footerButtonText="modalCloseButtonText" + @footerButtonEvent="footerButtonClick">
@@ -9,7 +11,7 @@ :src="modalImage" class="mw-100 d-flex" alt="" /> - +
@@ -34,15 +36,18 @@ export default { }, modalImage() { return this.getCmsContent('RecalModal', 'Image'); + }, + modalCloseButtonText() { + return this.getCmsContent('RecalModal', 'FooterText'); } }, methods: { - // openModal() { - // this.$refs['RecalModal'].openModal(); - // }, - // closeModal() { - // this.$refs['RecalModal'].closeModal(); - // }, + openModal() { + this.$refs.recalModal.openModal(); + }, + footerButtonClick() { + this.$refs.recalModal.closeModal(); + }, } }; @@ -50,8 +55,34 @@ export default { From ae76220e847a99b012891dba87612a011fa3092e Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Thu, 26 Feb 2026 14:15:33 -0500 Subject: [PATCH 031/111] update --- src/layouts/coverage-statement/recal-modal/recal-modal.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/coverage-statement/recal-modal/recal-modal.vue b/src/layouts/coverage-statement/recal-modal/recal-modal.vue index d7b82c09..6419ff33 100644 --- a/src/layouts/coverage-statement/recal-modal/recal-modal.vue +++ b/src/layouts/coverage-statement/recal-modal/recal-modal.vue @@ -39,6 +39,9 @@ export default { }, modalCloseButtonText() { return this.getCmsContent('RecalModal', 'FooterText'); + }, + vehicleMake() { + return this.mainStore.order.vehicle.make.toUpperCase(); } }, methods: { From 2f8650174d2ab216851ead5b55046b5818453510 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Thu, 26 Feb 2026 14:47:14 -0500 Subject: [PATCH 032/111] updates/remove unneeded code --- .../recal-modal/recal-modal.vue | 2 +- .../provider-preference.vue | 21 ++++++------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/layouts/coverage-statement/recal-modal/recal-modal.vue b/src/layouts/coverage-statement/recal-modal/recal-modal.vue index 6419ff33..0edfcdae 100644 --- a/src/layouts/coverage-statement/recal-modal/recal-modal.vue +++ b/src/layouts/coverage-statement/recal-modal/recal-modal.vue @@ -26,7 +26,7 @@ export default { }, computed: { modalBodyText() { - return this.getCmsContent('RecalModal', 'BodyText'); + return this.getCmsContent('RecalModal', 'BodyText').replaceAll('{custom:vehicleMake}', this.vehicleMake); }, modalHeaderText() { return this.getCmsContent('RecalModal', 'HeaderText'); diff --git a/src/layouts/provider-preference/provider-preference.vue b/src/layouts/provider-preference/provider-preference.vue index 27e38ff8..21a6bc20 100644 --- a/src/layouts/provider-preference/provider-preference.vue +++ b/src/layouts/provider-preference/provider-preference.vue @@ -58,11 +58,11 @@ // Import Supporting Files import { fetchCmsContentForPage, + processIfStatements, setupModalLinks } from '@/helpers/cms-content-helper'; import settleAllPromises from '@/helpers/layout-helper'; import errorMessages from '@/constants/error-messages'; -import buttonQuestion from '@/digital-components/button-question/button-question.vue'; import showIssLoadingModal from '@/helpers/loading-modal-helper'; import bailoutMessage from '@/constants/bailoutMessage'; import baseFormMixin from '@/mixins/base-form-mixin'; @@ -133,26 +133,14 @@ export default { return this.getCmsContent('ScheduleWithSafeliteText', 'BodyText'); }, scheduleWithOtherText() { - return this.getCmsContent('ScheduleWithOtherText', 'BodyText'); + const text = this.getCmsContent('ScheduleWithOtherText', 'BodyText'); + return processIfStatements(text, 'custom', this.getStateSpecificText); } }, mounted() { setupModalLinks(this); }, methods: { - getHeaderTextFromCms(cmsWidgetName) { - const headerText = this.getCmsContent(cmsWidgetName, 'HeaderText'); - return headerText?.replace( - '{custom:SafeliteLogo}', - "" - ); - }, - getSubheaderTextFromCms(cmsWidgetName) { - return this.getCmsContent(cmsWidgetName, 'SubheaderText'); - }, - getBodyTextFromCms(cmsWidgetName) { - return this.getCmsContent(cmsWidgetName, 'BodyText'); - }, arePagePrerequisiteValid() { return true; }, @@ -191,6 +179,9 @@ export default { }, openStateSteeringModal() { this.$refs[STEERING_MODAL_REF_NAME].openModal(); + }, + getStateSpecificText(value) { + return this.mainStore.order.customer.address.state?.toLowerCase() === value?.toLowerCase(); } } }; From db8d5bc3b5efb5c3841c035e5eb09f3882b8058b Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 26 Feb 2026 14:49:44 -0500 Subject: [PATCH 033/111] INSR-7760: Some more payment-page and HOP updates --- src/helpers/browser-helper.js | 16 +++++++++++++++- src/layouts/payment-page/payment-page.vue | 6 ++++-- vue.config.js | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/helpers/browser-helper.js b/src/helpers/browser-helper.js index 64c3a390..eb1d77fb 100644 --- a/src/helpers/browser-helper.js +++ b/src/helpers/browser-helper.js @@ -1,3 +1,17 @@ export function supportsApplePay() { - return !!(window.ApplePaySession && window.ApplePaySession.canMakePayments()); + var iOSversion = getiOSversion(); + var isMacOS = navigator.platform.indexOf("Mac") !== -1; + if (isMacOS || (iOSversion && iOSversion[0] >= 17)) { + if (window.ApplePaySession && window.ApplePaySession.canMakePayments()) { + return true; + } + } + return false; +} +function getiOSversion() { + if (/iP(hone|od|ad)/.test(navigator.platform)) { + // supports iOS 2.0 and later: + var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/); + return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; + } } \ No newline at end of file diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue index 04b7bb9a..e1f7daa0 100644 --- a/src/layouts/payment-page/payment-page.vue +++ b/src/layouts/payment-page/payment-page.vue @@ -890,7 +890,7 @@ export default { margin-bottom: .625rem; } - .cart-dropdown-component:deep(*) { + .cart-dropdown-component.cart-table { font-size: .8125rem; } @@ -900,7 +900,9 @@ export default { } .switch-payment-container { - padding-top: 1.25rem + @include media-breakpoint-up(lg) { + padding-top: 1.25rem + } } .switch-payment-text { diff --git a/vue.config.js b/vue.config.js index 3e5f6ffa..8d1b6687 100644 --- a/vue.config.js +++ b/vue.config.js @@ -2,7 +2,7 @@ process.env.VUE_APP_CONSUMER_CF_DISTRO = 'https://digitalapi.dev.safelite.io'; process.env.VUE_APP_CURRENT_ENVIRONMENT = 'Localhost'; process.env.VUE_APP_CUSTOMER_PORTAL_URL = 'https://myaccountdev.safelite.com/'; process.env.VUE_APP_GOOGLE_PLACES_API_KEY = 'AIzaSyCuLhQcDdZTTb4JzpUFms1OCch2dk5lHF0'; -process.env.VUE_APP_SAFELITE_HOP = 'https://iss-hop-dev.glassclaim.com/fmgCheckoutShared.aspx'; +process.env.VUE_APP_SAFELITE_HOP = 'https://iss-hop-sys.glassclaim.com/fmgCheckoutShared.aspx'; // GA & GTM // NOTE: Using the old ISS site GTM Cotnainer ID for now, will create a new one soon. From 98a227afced9eb4aa6e0b21be164f08fbd7fee80 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 26 Feb 2026 15:08:57 -0500 Subject: [PATCH 034/111] INSR-7760: Address copilot comments - Add some missing semicolons - Better null checking for iframe - Better iOS check - Correct icon for successful dropdown input --- public/scss/hop-styling.scss | 2 +- src/helpers/browser-helper.js | 4 ++++ src/layouts/payment-page/payment-page.vue | 15 +++++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/public/scss/hop-styling.scss b/public/scss/hop-styling.scss index 2bc6a195..ace72aa6 100644 --- a/public/scss/hop-styling.scss +++ b/public/scss/hop-styling.scss @@ -216,7 +216,7 @@ body { border-color: #0c7e47; } select { - background-image: url(/icons/select-error.png); + background-image: url(/icons/select-success.png); } } diff --git a/src/helpers/browser-helper.js b/src/helpers/browser-helper.js index eb1d77fb..5ce440e6 100644 --- a/src/helpers/browser-helper.js +++ b/src/helpers/browser-helper.js @@ -12,6 +12,10 @@ function getiOSversion() { if (/iP(hone|od|ad)/.test(navigator.platform)) { // supports iOS 2.0 and later: var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/); + if (!v) { + return null; + } return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; } + return null; } \ No newline at end of file diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue index e1f7daa0..d4bf082f 100644 --- a/src/layouts/payment-page/payment-page.vue +++ b/src/layouts/payment-page/payment-page.vue @@ -782,7 +782,6 @@ export default { }); }, handleIFrameContentWindowMessage(event) { - console.log('Received message from iframe:', event.data); const iframe = this.$refs.paymentFrame; if (typeof event.data !== 'string') { return; @@ -856,12 +855,16 @@ export default { }, submitPaymentAction() { const iframe = this.$refs.paymentFrame; - iframe.contentWindow.postMessage('submitPayment', '*'); + if (iframe && iframe.contentWindow) { + iframe.contentWindow.postMessage('submitPayment', '*'); + } }, switchToAfterPay() { const iframe = this.$refs.paymentFrame; - this.afterpayModalOpen = true; - iframe.contentWindow.postMessage('afterpay-switch', '*'); + if (iframe && iframe.contentWindow) { + this.afterpayModalOpen = true; + iframe.contentWindow.postMessage('afterpay-switch', '*'); + } }, showIssLoadingModal } @@ -901,14 +904,14 @@ export default { .switch-payment-container { @include media-breakpoint-up(lg) { - padding-top: 1.25rem + padding-top: 1.25rem; } } .switch-payment-text { padding-top: 1rem; padding-bottom: .625rem; - border-top: 1px solid #f0f1f2 + border-top: 1px solid #f0f1f2; } .footer-component:deep(.footer) { From 15130a3151293c2aedef7ee2f52df99c5eca3b4e Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 26 Feb 2026 15:22:08 -0500 Subject: [PATCH 035/111] Remove loopback-network permission --- src/layouts/payment-page/payment-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue index d4bf082f..4d307e34 100644 --- a/src/layouts/payment-page/payment-page.vue +++ b/src/layouts/payment-page/payment-page.vue @@ -35,7 +35,7 @@ name="card-frame" seamless scrolling="no" - allow="payment *; microphone *; geolocation *; loopback-network *;"> + allow="payment *; microphone *; geolocation *;">
From 216815c853d04c00c4477bd65b9c55bfebb088d8 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Thu, 26 Feb 2026 15:33:00 -0500 Subject: [PATCH 036/111] move recal modal to iss components --- .../recal-modal/recal-modal.vue | 1 + src/layouts/coverage-statement/coverage-statement.vue | 2 +- .../provider-preference/provider-preference.spec.js | 5 +++-- .../service-location/service-location.spec.js | 2 +- .../schedule-page/service-location/service-location.vue | 9 ++++----- 5 files changed, 10 insertions(+), 9 deletions(-) rename src/{layouts/coverage-statement => iss-components}/recal-modal/recal-modal.vue (98%) diff --git a/src/layouts/coverage-statement/recal-modal/recal-modal.vue b/src/iss-components/recal-modal/recal-modal.vue similarity index 98% rename from src/layouts/coverage-statement/recal-modal/recal-modal.vue rename to src/iss-components/recal-modal/recal-modal.vue index 0edfcdae..fc5df201 100644 --- a/src/layouts/coverage-statement/recal-modal/recal-modal.vue +++ b/src/iss-components/recal-modal/recal-modal.vue @@ -84,6 +84,7 @@ export default { p { strong { font-weight: 600; + color: $black; } } } diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index a79c11fa..4e31fa37 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -121,7 +121,7 @@ import textLink from '@/ux-components/text-link/text-link.vue'; import buttonMain from '@/ux-components/button-main/button-main.vue'; import siteFooter from '@/iss-components/site-footer/site-footer.vue'; import afterpayModalBanner from '@/layouts/coverage-statement/afterpay-modal-banner/afterpay-modal-banner.vue'; -import recalModal from '@/layouts/coverage-statement/recal-modal/recal-modal.vue'; +import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; // Import Supporting Files import { diff --git a/src/layouts/provider-preference/provider-preference.spec.js b/src/layouts/provider-preference/provider-preference.spec.js index 0d93ed3a..d00c9183 100644 --- a/src/layouts/provider-preference/provider-preference.spec.js +++ b/src/layouts/provider-preference/provider-preference.spec.js @@ -2,7 +2,7 @@ import ProviderPreference from '@/layouts/provider-preference/provider-preferenc import { shallowMount } from '@vue/test-utils'; import settleAllPromises from '@/helpers/layout-helper.js'; -import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; +import { fetchCmsContentForPage, processIfStatements } from '@/helpers/cms-content-helper'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; import { useMainStore } from '@/store'; import navigationScenarios from '@/router/router-constants/navigation-scenarios'; @@ -13,7 +13,8 @@ jest.mock('@/helpers/layout-helper.js', () => jest.fn()); // Mock fetchCmsContentForPage jest.mock('@/helpers/cms-content-helper', () => ({ fetchCmsContentForPage: jest.fn(), - setupModalLinks: jest.fn() + setupModalLinks: jest.fn(), + processIfStatements: jest.fn() })); /** @ignore */ diff --git a/src/layouts/schedule-page/service-location/service-location.spec.js b/src/layouts/schedule-page/service-location/service-location.spec.js index 6a50fe05..cda30da8 100644 --- a/src/layouts/schedule-page/service-location/service-location.spec.js +++ b/src/layouts/schedule-page/service-location/service-location.spec.js @@ -124,7 +124,7 @@ const mountOptions = { alert: true, textBlock: true, appointmentTypeQuestion: true, - contentGroupModal: true, + recalModal: true, siteFooter: true, siteHeader: true, siteSubHeader: true, diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 601a1e5d..cbce93d2 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -117,9 +117,8 @@ cmsWidgetName="MobileFeeDisclaimerWidget" typeStyle="disclaimer" />
-
@@ -140,10 +139,10 @@ import alert from '@/ux-components/alert/alert.vue'; import textBlock from '@/digital-components/text-block/text-block.vue'; import appointmentTypeQuestion from '@/layouts/schedule-page/service-location/appointment-type-question/appointment-type-question.vue'; import baseFormMixin from '@/mixins/base-form-mixin'; -import contentGroupModal from '@/iss-components/content-group-modal/content-group-modal.vue'; import shopAddress from '@/layouts/schedule-page/service-location/shop-address/shop-address.vue'; import serviceZipQuestion from '@/layouts/schedule-page/service-location/service-zip-question/service-zip-question.vue'; import widgetFields from '@/constants/cms-widget-fields'; +import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; const RECAL_MODAL_REF_NAME = 'RecalModal'; @@ -153,9 +152,9 @@ export default { alert, textBlock, appointmentTypeQuestion, - contentGroupModal, shopAddress, - serviceZipQuestion + serviceZipQuestion, + recalModal }, mixins: [baseFormMixin], emits: ['appointment-type-changed', 'city-updated', 'clear-mobile-data', 'in-shop-zip-updated', 'mobile-zip-updated', 'provider-changed'], From 8db41a1e102507cc9b1f2ff7dafb61515ff4c8e1 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 27 Feb 2026 11:21:57 -0500 Subject: [PATCH 037/111] INSR-8561: Fix default "enter" key behavior This specifically fixes an issue where hitting "enter" on the welcome page was triggering the "finish filing existing claim" button, even in cases where that modal was not visible. --- src/iss-components/site-footer/site-footer.vue | 3 ++- src/ux-components/button-main/button-main.vue | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/iss-components/site-footer/site-footer.vue b/src/iss-components/site-footer/site-footer.vue index a694015e..386147aa 100644 --- a/src/iss-components/site-footer/site-footer.vue +++ b/src/iss-components/site-footer/site-footer.vue @@ -22,8 +22,9 @@ 'hide-button': isForwardButtonHidden }" :aria-disabled="disableForwardAction || isForwardActionDisabled" - :isDisabled="disableForwardAction || isForwardActionDisabled" + :isDisabled="disableForwardAction || isForwardActionDisabled || isForwardButtonHidden" data-test-id="site-footer-main-button" + buttonType="submit" @clickEvent="buttonClick" />
{{ buttonText }} @@ -21,7 +22,8 @@ export default { isDisabled: Boolean, isOutline: Boolean, pushToGA: Boolean, - canOverride: { type: Boolean, required: false, default: true } + canOverride: { type: Boolean, required: false, default: true }, + buttonType: { type: String, required: false, default: 'button' } }, emits: ['click-event'], computed: { From 2c810282fda7e926471f96b154215d60f27341c4 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Fri, 27 Feb 2026 11:57:18 -0500 Subject: [PATCH 038/111] copilot fixes --- src/digital-components/modal/modal.vue | 3 ++- src/iss-components/recal-modal/recal-modal.vue | 16 +++++++++++----- .../cancel-claim-modal/cancel-claim-modal.vue | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/digital-components/modal/modal.vue b/src/digital-components/modal/modal.vue index 6ad8bb08..83e07ccb 100644 --- a/src/digital-components/modal/modal.vue +++ b/src/digital-components/modal/modal.vue @@ -45,6 +45,7 @@ class="w-100" :buttonText="footerButtonText" pushToGA + :variant="buttonVariant" :class="[ (isButtonDisabled || isFooterButtonDisabled) && 'form-test-invalid' @@ -55,7 +56,7 @@ class="mt-4 mb-0" linkType="text" text="Close window" - href="#" + href="#!" @click="closeModal" />
diff --git a/src/iss-components/recal-modal/recal-modal.vue b/src/iss-components/recal-modal/recal-modal.vue index fc5df201..c6638b14 100644 --- a/src/iss-components/recal-modal/recal-modal.vue +++ b/src/iss-components/recal-modal/recal-modal.vue @@ -24,21 +24,27 @@ export default { components: { modal }, + props: { + cmsWidgetName: { + type: String, + default: 'RecalModal' + } + }, computed: { modalBodyText() { - return this.getCmsContent('RecalModal', 'BodyText').replaceAll('{custom:vehicleMake}', this.vehicleMake); + return this.getCmsContent(this.cmsWidgetName, 'BodyText').replaceAll('{custom:vehicleMake}', this.vehicleMake); }, modalHeaderText() { - return this.getCmsContent('RecalModal', 'HeaderText'); + return this.getCmsContent(this.cmsWidgetName, 'HeaderText'); }, modalFooterText() { - return this.getCmsContent('RecalModal', 'FooterText'); + return this.getCmsContent(this.cmsWidgetName, 'FooterText'); }, modalImage() { - return this.getCmsContent('RecalModal', 'Image'); + return this.getCmsContent(this.cmsWidgetName, 'Image'); }, modalCloseButtonText() { - return this.getCmsContent('RecalModal', 'FooterText'); + return this.getCmsContent(this.cmsWidgetName, 'FooterText'); }, vehicleMake() { return this.mainStore.order.vehicle.make.toUpperCase(); diff --git a/src/layouts/coverage-statement/cancel-claim-modal/cancel-claim-modal.vue b/src/layouts/coverage-statement/cancel-claim-modal/cancel-claim-modal.vue index 57bae07e..5aa96972 100644 --- a/src/layouts/coverage-statement/cancel-claim-modal/cancel-claim-modal.vue +++ b/src/layouts/coverage-statement/cancel-claim-modal/cancel-claim-modal.vue @@ -21,7 +21,7 @@ class="cancel-link" linkType="text" text="No, I want to cancel" - href="#" + href="#!" @clickEvent="cancelClaimConfirmation"> From bf93a57dce8efd86ef846bf7144e58b347216b47 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Fri, 27 Feb 2026 11:58:00 -0500 Subject: [PATCH 039/111] missed one --- src/iss-components/recal-modal/recal-modal.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/iss-components/recal-modal/recal-modal.vue b/src/iss-components/recal-modal/recal-modal.vue index c6638b14..311c4f82 100644 --- a/src/iss-components/recal-modal/recal-modal.vue +++ b/src/iss-components/recal-modal/recal-modal.vue @@ -37,9 +37,6 @@ export default { modalHeaderText() { return this.getCmsContent(this.cmsWidgetName, 'HeaderText'); }, - modalFooterText() { - return this.getCmsContent(this.cmsWidgetName, 'FooterText'); - }, modalImage() { return this.getCmsContent(this.cmsWidgetName, 'Image'); }, From e1e7ee086e42e3b6dca213042e8454bfec112e8d Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 27 Feb 2026 12:49:52 -0500 Subject: [PATCH 040/111] Remove redundant aria-disabled --- src/iss-components/site-footer/site-footer.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/iss-components/site-footer/site-footer.vue b/src/iss-components/site-footer/site-footer.vue index 386147aa..cd2fc531 100644 --- a/src/iss-components/site-footer/site-footer.vue +++ b/src/iss-components/site-footer/site-footer.vue @@ -21,7 +21,6 @@ 'form-test-invalid': (disableForwardAction || isForwardActionDisabled), 'hide-button': isForwardButtonHidden }" - :aria-disabled="disableForwardAction || isForwardActionDisabled" :isDisabled="disableForwardAction || isForwardActionDisabled || isForwardButtonHidden" data-test-id="site-footer-main-button" buttonType="submit" From 1cd6bdc43292ae6e2b58a61fc0f153f7adaf857d Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 27 Feb 2026 12:58:13 -0500 Subject: [PATCH 041/111] Add validator and unit tests related to button type --- .../button-main/button-main.spec.js | 33 +++++++++++++++++++ src/ux-components/button-main/button-main.vue | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/ux-components/button-main/button-main.spec.js b/src/ux-components/button-main/button-main.spec.js index c6825826..1f2b3863 100644 --- a/src/ux-components/button-main/button-main.spec.js +++ b/src/ux-components/button-main/button-main.spec.js @@ -192,4 +192,37 @@ describe('buttonMain.vue', () => { // Expect expect(spy).not.toHaveBeenCalled(); }); + + describe('Button Types', () => { + it('Should set button type to submit', async () => { + // Act + const wrapper = shallowMount( + buttonMain, + setupMocks({ + propsData: { + buttonType: 'submit' + } + }) + ); + + // Assert + const button = wrapper.find('button'); + + // Expect + expect(button.attributes('type')).toEqual('submit'); + }); + it('Should default button type to button', async () => { + // Act + const wrapper = shallowMount( + buttonMain, + setupMocks() + ); + + // Assert + const button = wrapper.find('button'); + + // Expect + expect(button.attributes('type')).toEqual('button'); + }); + }); }); diff --git a/src/ux-components/button-main/button-main.vue b/src/ux-components/button-main/button-main.vue index 7ffb7759..e88a4b74 100644 --- a/src/ux-components/button-main/button-main.vue +++ b/src/ux-components/button-main/button-main.vue @@ -23,7 +23,7 @@ export default { isOutline: Boolean, pushToGA: Boolean, canOverride: { type: Boolean, required: false, default: true }, - buttonType: { type: String, required: false, default: 'button' } + buttonType: { type: String, required: false, default: 'button', validator: (val) => ['button', 'submit', 'reset'].includes(val) } }, emits: ['click-event'], computed: { From f8aa275aac337b50c580c18499d0e9f631b91214 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 27 Feb 2026 13:20:38 -0500 Subject: [PATCH 042/111] INSR-8544: Fix some error/alert differences --- src/constants/error-messages.js | 2 +- src/layouts/vehicle-damage/vehicle-damage.vue | 3 ++- .../vehicle-damage/windshield-options/windshield-options.vue | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/constants/error-messages.js b/src/constants/error-messages.js index 62e79340..2fa565e2 100644 --- a/src/constants/error-messages.js +++ b/src/constants/error-messages.js @@ -10,7 +10,7 @@ const errorMessages = Object.freeze({ PASSENGER_SIDE_OPTIONS_REQUIRED: 'Please select window', WINDSHIELD_DAMAGE_TYPE_REQUIRED: 'Please select windshield damage', WINDSHIELD_CHIP_COUNT_REQUIRED: 'Please select chip(s)', - WINDSHIELD_REPLACE_OPTIONS_REQUIRED: 'Please select windshield part', + WINDSHIELD_REPLACE_OPTIONS_REQUIRED: 'Select all windshield parts that need to be replaced', REPLACE_OPTIONS_REQUIRED: 'Please select rear window type', STREET_ADDRESS_REQUIRED: 'Street Address is required.', CITY_REQUIRED: 'City is required.', diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index a27e3655..47f7463d 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -46,7 +46,8 @@ class="my-5" cmsWidgetName="HasReplacementConflict" alertClass="alert-danger" - :isDismissible="false" /> + :isDismissible="false" + :isCollapsible="true" />
diff --git a/src/layouts/vehicle-damage/windshield-options/windshield-options.vue b/src/layouts/vehicle-damage/windshield-options/windshield-options.vue index bee1bc28..dc529605 100644 --- a/src/layouts/vehicle-damage/windshield-options/windshield-options.vue +++ b/src/layouts/vehicle-damage/windshield-options/windshield-options.vue @@ -34,7 +34,8 @@ class="mt-5" cmsWidgetName="SplitSingleConflict" alertClass="alert-danger" - :isDismissible="false" /> + :isDismissible="false" + :isCollapsible="true" />
From ecfd8317d1b0ba9489700c38b1a255abaf11cd91 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Fri, 27 Feb 2026 15:17:54 -0500 Subject: [PATCH 043/111] Serviceability details update Modify parameters needed for new endpoint functionality --- src/store/index.js | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index cd155ef2..28140f87 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1341,27 +1341,19 @@ export const useMainStore = defineStore({ }, getServiceabilityDetails(serviceZipCode) { - const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order; + const { damage, parentAccountNumber, lineItems, vehicle } = this.order; const { carId } = vehicle; - const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace); - const lineItemParts = [...(lineItems.glassParts || []), ...(lineItems.supportingItems || [])].map((part) => ({ - partNumber: part.partNumber, - recalibrationType: part.recalibrationType - })); + const flattenedGlassParts = getLineItemsFlattened(lineItems.glassParts); + const lineItemsList = flattenedGlassParts.map((part) => part.partNumber).join(','); - const params = buildURLSearchParams({ - applicationName: applicationConfig.APPLICATION_NAME, - parentAccountNumber, - referralSequenceNumber, - zip: serviceZipCode, - carId, - glassPieces: glassArray, - lineItems: lineItemParts - }); + let endPoint = `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}&parentAccountNumber=${parentAccountNumber}&isRepair=${damage.isRepair}`; + if (lineItemsList) { + endPoint += `&lineItems=${lineItemsList}`; + } return globalMethods.callHttpClient({ method: endpoints.GetServiceabilityDetails.method, - endpoint: `${endpoints.GetServiceabilityDetails.url}?${params.toString()}` + endpoint: endPoint }); }, lookupVehicleByVin(vin) { From f49168b4da9ee450417d304e9e30aada5887e6bf Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 27 Feb 2026 15:56:33 -0500 Subject: [PATCH 044/111] Fixes a few defects on order-confirmation: - INSR-8676: Display proper copy for windshield repair - INSR-8684 Fix some display differences for paid orders - Also fixes a defect where the cart was real close to the footer on mobile --- .../cart-dropdown/cart-dropdown.vue | 40 ++++++++++++++----- .../order-confirmation/order-confirmation.vue | 6 ++- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 6d48a69a..a989ea89 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -1,6 +1,6 @@ @@ -89,7 +89,6 @@ export default { components: { siteHeader, siteFooter, - siteSubHeader, Form, servicePackageQuestion, loadingModal, @@ -182,6 +181,20 @@ export default { computed: { PriceDisclaimerText() { return this.getCmsContent('PriceDisclaimerWidget', 'Text'); + }, + vehicleMake() { + return store.order.vehicle.make.toUpperCase(); + }, + vehicleModel() { + return store.order.vehicle.model.toUpperCase(); + }, + servicePackagesSubHeader() { + return this.getCmsContent('SiteSubHeaderWidget', 'SubHeaderText') + .replace('{custom:vehicleMake}', this.vehicleMake) + .replace('{custom:vehicleModel}', this.vehicleModel); + }, + secondaryText() { + return this.getCmsContent('SiteSubHeaderWidget', 'SecondaryText'); } }, methods: { @@ -244,7 +257,7 @@ export default { padding-left: .9375rem; padding-right: .9375rem; display: block; - margin: 0 auto; + margin: 1.5rem auto; :deep(.subheader-primary) { display: block; } @@ -274,4 +287,10 @@ export default { .back-link { margin-left: 1rem; } + +.sub-header { + text-align: center; + color: $black; + line-height: 2rem; +} From 152f5f81ddf6b55b08b5ba9688182fa8ade3e299 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Tue, 3 Mar 2026 12:24:06 -0500 Subject: [PATCH 052/111] save package to store / pre-select --- .../service-package-question.vue | 19 +++++++++++++++---- .../service-packages/service-packages.vue | 6 ++++++ src/store/index.js | 5 +++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/layouts/service-packages/service-package-question/service-package-question.vue b/src/layouts/service-packages/service-package-question/service-package-question.vue index 0dddc248..c8dd5f66 100644 --- a/src/layouts/service-packages/service-package-question/service-package-question.vue +++ b/src/layouts/service-packages/service-package-question/service-package-question.vue @@ -22,6 +22,7 @@ import servicePackageRadio from '@/layouts/service-packages/service-package-ques import partTypeStrings from '@/constants/part-type-strings'; import { useMainStore } from '@/store'; import { getPriceOfLineItem } from '@/helpers/price-calculator'; +import { shallowRef } from 'vue'; const glassLocations = damageLocationsSelected; @@ -44,16 +45,16 @@ export default { availableLineItems: { type: Array, default: () => [] - } + }, }, setup() { const mainStore = useMainStore(); return { mainStore }; }, - emits: ['vapsItemsSelected'], + emits: ['vapsItemsSelected', 'packageSelected', 'update:modelValue'], data() { return { - servicePackageRadio, + servicePackageRadio: shallowRef(servicePackageRadio), selectedPackageName: '', questionText: 'Select an option:' }; @@ -149,7 +150,11 @@ export default { selectedPackageName(newValue) { const VapsProductsInSelectedPackage = this.getVapsLineItemsForSelectedPackage(newValue); this.$emit('vapsItemsSelected', VapsProductsInSelectedPackage); - } + this.$emit('packageSelected', newValue); + }, + availableLineItems() { + this.preselectPackage(); + }, }, methods: { processIfStatements, @@ -266,6 +271,12 @@ export default { const glassLocationMatches = this.mainStore.order.damage.glassToReplace?.filter((glassToReplace) => glassToReplace.glassLocation === glassLocation) ?? []; return !!glassLocationMatches.length; + }, + preselectPackage() { + if (this.mainStore.order.servicePackage) { + this.selectedPackageName = this.mainStore.order.servicePackage; + return; + } } } }; diff --git a/src/layouts/service-packages/service-packages.vue b/src/layouts/service-packages/service-packages.vue index cfd4fad0..55873656 100644 --- a/src/layouts/service-packages/service-packages.vue +++ b/src/layouts/service-packages/service-packages.vue @@ -27,6 +27,7 @@ :validationRules="rules.optionRequired" isRequired @vapsItemsSelected="vapsItemsSelectedAction" + @packageSelected="packageSelectedAction" @link-event="openModalAction" />
({ vaps: null, serverData: null }, + servicePackage: null, insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.NONE, @@ -1948,6 +1949,10 @@ export const useMainStore = defineStore({ this.order.lineItems.vaps = partsData; }, + updateServicePackage(packageName) { + this.order.servicePackage = packageName; + }, + updateMobileFee(fee) { const isMobileFeeHidden = getExperimentSettingValue(this.experimentSettings, experimentSettings.ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_HIDDEN) === 'true'; // Mobile Fee is only added for NO COMP or ITAC and is NOT hidden From befe387d69eff3581e95cf5bba89816d976aa58e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 17:53:09 +0000 Subject: [PATCH 053/111] Bump underscore from 1.13.6 to 1.13.8 Bumps [underscore](https://github.com/jashkenas/underscore) from 1.13.6 to 1.13.8. - [Commits](https://github.com/jashkenas/underscore/compare/1.13.6...1.13.8) --- updated-dependencies: - dependency-name: underscore dependency-version: 1.13.8 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 cf98e150..6a33fb8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20117,7 +20117,9 @@ } }, "node_modules/underscore": { - "version": "1.13.6", + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", "dev": true, "license": "MIT" }, From f0e294a92849581c9a1447dd59b34b4e3e8197b6 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Fri, 27 Feb 2026 08:41:15 -0500 Subject: [PATCH 054/111] Move alert down below text --- .../service-location/service-location.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index cbce93d2..227c20bb 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -1,11 +1,5 @@