From 0963c312916c59ac725f56ab421f9f6cc00db2b4 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 12:57:36 -0500 Subject: [PATCH 01/12] revert changes from a previous PR --- src/layouts/schedule-page/schedule-page.vue | 49 ++++++++----- .../service-location/service-location.vue | 69 ++++++++++++++----- .../time-slot-modal-question.vue | 2 +- src/store/index.js | 3 - 4 files changed, 84 insertions(+), 39 deletions(-) diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index b9cb3ba3..a4de3a3e 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -89,9 +89,8 @@ import { import settleAllPromises from '@/helpers/layout-helper'; import showIssLoadingModal from '@/helpers/loading-modal-helper.js'; import { - getProviderData, - getZipCodeData, - onProviderChanged + getPricedMobileFeePart, + getZipCodeData } from '@/helpers/service-location-helper'; import { Form } from 'vee-validate'; import BaseFormMixin from '@/mixins/base-form-mixin.js'; @@ -225,9 +224,16 @@ export default { async beforeRouteEnter(to, from, next) { // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.issPage); - const { isMobileAppointment, storeServiceLocation, storeSelectedProvider, serviceZipCode } = getProviderData(); + const storeServiceLocation = useMainStore().order.serviceLocation; + const storeSelectedAppointmentType = storeServiceLocation?.appointmentType; + const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE + || storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP; + const storeSelectedProvider = storeServiceLocation?.provider; + const serviceZipCode = storeServiceLocation?.zipCode || useMainStore().order.customer.address.zipCode; const zipCodeData = getZipCodeData(serviceZipCode); + const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode); const serviceabilityDetailsPromise = useMainStore().getServiceabilityDetails(serviceZipCode); + const getGlassFeesPromise = useMainStore().getGlassFees(); const providersPromise = useMainStore().getSafeliteProviders(serviceZipCode, 150); const premiumFeePromise = useMainStore().getMobilePremiumFee(); @@ -244,6 +250,14 @@ export default { resultKey: 'cmsContent', promise: cmsContentPromise }, + { + resultKey: 'mobileFeePart', + promise: mobileFeePartPromise + }, + { + resultKey: 'glassFees', + promise: getGlassFeesPromise + }, { resultKey: 'serviceabilityDetails', promise: serviceabilityDetailsPromise @@ -256,10 +270,6 @@ export default { resultKey: 'providers', promise: providersPromise }, - { - resultKey: 'providerChanged', - promise: onProviderChanged() - }, { resultKey: 'premiumFeeWithPrice', promise: premiumFeeWithPricePromise @@ -321,6 +331,7 @@ export default { inShopDatesData: [], isMobileView: false, mobileDatesData: [], + mobileFeePart: null, mobilePremiumAppointmentFee: null, mobileProviderNumber: null, selectableDatesData: [], @@ -661,18 +672,22 @@ export default { }, async providerChangedFromServiceLocation(newProvider) { this.selectedProvider = newProvider?.provider; - if (newProvider?.provider) { - this.mainStore.updateServiceLocation(newProvider); + if (newProvider?.refreshDatePicker && newProvider.provider) { + this.mainStore.updateServiceLocationProvider(newProvider.provider); + showIssLoadingModal(true); - await onProviderChanged(); - if (newProvider.refreshDatePicker) { - await this.refreshDatePicker(); - } else { - showIssLoadingModal(false); - } + await this.mainStore.getBillToInfo(newProvider.provider?.providerNumber) + .then(() => { + this.refreshDatePicker(); + }) + .catch(() => { + console.warn('Error fetching bill to info...'); + showIssLoadingModal(false); + }); } }, async refreshDatePicker() { + console.log('refresh date picker...'); this.resetLocalFlags(); await this.getDatePickerInitialData().then((data) => { this.selectableDatesData = data.initialShopTimeSlotsResponse; @@ -700,7 +715,7 @@ export default { appointmentTypeToUse = AppointmentTypeStrings.DROP_OFF; } - this.mainStore.updateAppointmentType(appointmentTypeToUse); + await this.$refs.serviceLocation.forwardButtonAction(appointmentTypeToUse); this.mainStore.saveSchedule(this.selectedTimeSlotInfo.timeSlot); this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD, diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 5b43a165..eb121d40 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -182,6 +182,7 @@ export default { isRecalibrationServiceableMobile: null, selectedAppointmentType: this.getSelectedAppointmentType(), selectedProvider: this.getSelectedProvider(), + mobileFeePart: null, mobileProviderNumber: null, zipContainsMilitaryBase: false, zipCodeCtu: null, @@ -236,7 +237,8 @@ export default { ); }, isMobile() { - return this.selectedAppointmentType === AppointmentTypeStrings.MOBILE; + return this.selectedAppointmentType === AppointmentTypeStrings.MOBILE + || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP; }, isServiceableInshop() { if (this.isRecalibrationServiceableInshop !== null) { @@ -339,27 +341,16 @@ export default { } }, selectedProvider(newProvider, oldProvider) { - if (newProvider?.providerNumber !== oldProvider?.providerNumber) { + if (newProvider?.providerNumber !== oldProvider?.providerNumber || this.availabilityRating === null) { const appointmentIsInshop = this.isInshop; const returnedProvider = { - refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null, - state: this.state, - zipCode: this.zipCode, - zipCodeCtu: this.zipCodeCtu, - appointmentType: this.selectedAppointmentType, - provider: !this.isMobile ? newProvider : { - providerNumber: this.mobileProviderNumber, - address: { - streetAddress: null, - city: null, - state: null, - zipCode: null, - zipCodeCtu: null - } - } + provider: newProvider, + refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null }; - this.$emit('provider-changed', returnedProvider); + if (newProvider?.providerNumber !== oldProvider?.providerNumber) { + this.$emit('provider-changed', returnedProvider); + } } } }, @@ -369,6 +360,34 @@ export default { await this.setData(initialData); this.initializingData = false; }, + async forwardButtonAction(appointmentType) { + let provider = this.selectedProvider; + this.mainStore.updateMobileFee(null); + if (this.isMobile) { + if (this.mainStore.isNoComp || this.mainStore.isITAC) { + this.mainStore.updateMobileFee(this.mobileFeePart); + } + + provider = { + providerNumber: this.mobileProviderNumber, + address: { + streetAddress: null, + city: null, + state: null, + zipCode: null, + zipCodeCtu: null + } + }; + } + + this.mainStore.saveServiceLocation({ + state: this.state, + zipCode: this.zipCode, + zipCodeCtu: this.zipCodeCtu, + appointmentType: appointmentType || this.selectedAppointmentType, + provider + }); + }, openModalAction(modalName) { this.$refs[modalName].openModal(); }, @@ -446,6 +465,10 @@ export default { this.setServiceabilityDetails(initialData.serviceabilityDetails); } + if (initialData.mobileFeePart) { + this.mobileFeePart = initialData.mobileFeePart; + } + if (initialData.providers) { this.setMobileProviderNumber(initialData.providers.mobileProviderNumber); let foundMatch = false; @@ -462,12 +485,22 @@ export default { this.selectedProvider = null; } } + + if (initialData.glassFees) { + useMainStore().getCombinedQuote(initialData.glassFees) + .then((combinedQuote) => { + this.setGlassFeeItems(combinedQuote); + }); + } }, setContainsMilitaryBase(val) { if (this.zipContainsMilitaryBase !== val) { this.zipContainsMilitaryBase = val; } }, + setGlassFeeItems(newGlassFeeItems) { + this.mainStore.updateGlassFees(newGlassFeeItems); + }, setMobileProviderNumber(providerNumber) { this.mobileProviderNumber = providerNumber; }, diff --git a/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue b/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue index e292f37a..fd0b880e 100644 --- a/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue +++ b/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue @@ -426,7 +426,7 @@ export default { `+${formatAmountInDollars(getPriceOfLineItem(this.premiumAppointmentFee))}`; return { - // Unique value is required for each and the premium appoinment shares an id + // Unique value is required for each and the premium appointment shares an id value: this.addPremiumFlagToInput(timeSlotData.id), buttonLabel: this.premiumAppointmentButtonText, buttonLabelSubCopy: formattedPrice, diff --git a/src/store/index.js b/src/store/index.js index b52d619e..32ee3b69 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1865,7 +1865,6 @@ export const useMainStore = defineStore({ resetState() { Object.assign(this, getDefaultState()); }, - resetRegistrationState() { this.order.vehicle.registration.licensePlate = null; this.order.vehicle.registration.address = null; @@ -1904,14 +1903,12 @@ export const useMainStore = defineStore({ this.order.serviceLocation.state = null; this.order.serviceLocation.isVehicleProtected = null; }, - resetBailout() { this.updatePageData({ page: issPageValues.BAILOUT_PAGE, data: null }); }, - resetInsurance() { this.order.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; this.order.insuranceCoverage.coverageType = coverageType.NONE; From 32757d388776a84b020213e7d67b0493e72fb624 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 13:02:02 -0500 Subject: [PATCH 02/12] one more revert --- src/layouts/schedule-page/schedule-page.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index a4de3a3e..153e97a8 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -658,9 +658,7 @@ export default { } }, mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) { - if (mobileZipServiceLocation - && (this.mobileProviderNumber !== mobileZipServiceLocation.mobileProviderNumber - || !this.hasNeededServiceLocationData)) { + if (mobileZipServiceLocation) { this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber; this.selectedMobileZipCode = mobileZipServiceLocation.zipCode; this.selectedServiceLocation = mobileZipServiceLocation; From 965b579f59a7fc6e530d2b555c40eacba9560e74 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 24 Feb 2026 13:16:51 -0500 Subject: [PATCH 03/12] Fix mobile alert wrap --- .../service-location/service-location.vue | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index eb121d40..1aef10b7 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -604,6 +604,22 @@ $page-side-padding: 1.5rem; div.alert { margin-top: 0.625rem; + &.widget-name-AlertLowAvailabilityInshopWidget { + @include media-breakpoint-up(xs) { + :deep(.alert-headline-text-container) { + padding-left: 0.5rem; + padding-right: 0.375rem; + letter-spacing: 0.45px; + } + } + @include media-breakpoint-up(xl) { + :deep(.alert-headline-text-container) { + padding: 0rem 0.625rem; + } + } + + } + button.looka-likea-link { background: none; border: none; From f72772e6b0058271154bcb80ad0734ca48bebcb5 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 24 Feb 2026 13:31:11 -0500 Subject: [PATCH 04/12] More readable check --- src/layouts/schedule-page/schedule-page.vue | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 153e97a8..215654b0 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -352,14 +352,17 @@ export default { return false; } + const validMobileAppointmentType = ((this.selectedAppointmentType === AppointmentTypeStrings.MOBILE + || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) + && serviceLocationToUse.mobileProviderNumber); + const validInShopAppointmentType = ((this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP + || this.selectedAppointmentType === AppointmentTypeStrings.DROP_OFF) + && (this.selectedProvider?.providerNumber || serviceLocationToUse.provider?.providerNumber)); + const serviceLocationPreReqs = serviceLocationToUse.zipCode !== null && serviceLocationToUse.zipCodeCtu !== null && serviceLocationToUse.appointmentType !== null - && (((this.selectedAppointmentType === AppointmentTypeStrings.MOBILE - || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) - && serviceLocationToUse.mobileProviderNumber) - || ((this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP || this.selectedAppointmentType === AppointmentTypeStrings.DROP_OFF) - && (this.selectedProvider?.providerNumber || serviceLocationToUse.provider?.providerNumber))); + && (validMobileAppointmentType || validInShopAppointmentType); const damageInfo = useMainStore().order.damage.isRepair || (useMainStore().order.lineItems?.glassParts != null && useMainStore().order.lineItems.glassParts.length > 0); From 0ec6bb17eb3ccd691d85de8f82915552b40600fb Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 25 Feb 2026 13:47:45 -0500 Subject: [PATCH 05/12] Fix a couple defects found while testing payment-method - INSR-8663: contact-details was inadvertently blanking out provider - INSR-8666: shop-address was overwriting a global validation rule, causing incorrect validation text to appear on later pages --- src/layouts/contact-details/contact-details.vue | 5 ++++- .../service-location/shop-address/shop-address.vue | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/layouts/contact-details/contact-details.vue b/src/layouts/contact-details/contact-details.vue index 5a84b8f3..b864ff19 100644 --- a/src/layouts/contact-details/contact-details.vue +++ b/src/layouts/contact-details/contact-details.vue @@ -245,11 +245,14 @@ export default { }; useMainStore().updateContactInfo(contactInfo); + const provider = useMainStore().serviceLocation.provider; + useMainStore().updateServiceLocation({ address: this.address, address2: this.address2, city: this.city, - isVehicleProtected: this.isVehicleProtected || 'false' + isVehicleProtected: this.isVehicleProtected || 'false', + provider }); this.$router.navigate(this.navigationScenarios.CLICKED_FORWARD, this.$route); diff --git a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue index 98563ad1..afc33384 100644 --- a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue +++ b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue @@ -68,7 +68,7 @@ groupName="chooseShop" textPosition="text-start" isRequired - validationRules="option-required" /> + validationRules="provider-required" /> {{ serviceZipPrompt }} @@ -115,7 +115,7 @@ import errorMessages from '@/constants/error-messages'; import { defineRule } from 'vee-validate'; import { required } from '@/helpers/validation-rules'; -defineRule('option-required', required(errorMessages.PROVIDER_REQUIRED)); +defineRule('provider-required', required(errorMessages.PROVIDER_REQUIRED)); const SERVICE_ZIP_QUESTION_REF_NAME = 'serviceZipCodeQuestion'; From b4e929d5743d1dc34fd09419340feeafe2a7a52a Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 14:23:29 -0500 Subject: [PATCH 06/12] some hide show updates change modelValue to emit --- src/layouts/schedule-page/schedule-page.vue | 7 ++-- .../service-location/service-location.vue | 36 ++++++++++++------- .../service-zip-question.vue | 14 ++++---- .../shop-address/shop-address.vue | 12 +++++-- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 215654b0..590b319c 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -329,6 +329,7 @@ export default { return { inShopAvailabilityRating: 'high', inShopDatesData: [], + isDatePickerRefreshing: false, isMobileView: false, mobileDatesData: [], mobileFeePart: null, @@ -362,7 +363,8 @@ export default { const serviceLocationPreReqs = serviceLocationToUse.zipCode !== null && serviceLocationToUse.zipCodeCtu !== null && serviceLocationToUse.appointmentType !== null - && (validMobileAppointmentType || validInShopAppointmentType); + && (validMobileAppointmentType || validInShopAppointmentType) + && !this.isDatePickerRefreshing; const damageInfo = useMainStore().order.damage.isRepair || (useMainStore().order.lineItems?.glassParts != null && useMainStore().order.lineItems.glassParts.length > 0); @@ -688,11 +690,12 @@ export default { } }, async refreshDatePicker() { - console.log('refresh date picker...'); this.resetLocalFlags(); + this.isDatePickerRefreshing = true; await this.getDatePickerInitialData().then((data) => { this.selectableDatesData = data.initialShopTimeSlotsResponse; this.$refs.datePicker.initializeComponent(data); + this.isDatePickerRefreshing = false; showIssLoadingModal(false); }); }, diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 1aef10b7..d5559a95 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -96,13 +96,14 @@ + cmsWidgetName="MobileZipWidget" + @serviceZipCodeUpdated="handleServiceZipCodeChanged" />
@@ -32,7 +32,7 @@ export default { }, // TODO: Correct prop def. props: { - modelValue: String, + parentZipCode: String, cmsWidgetName: String, serviceZipFormatErrorMessage: { type: String, @@ -43,14 +43,14 @@ export default { default: false } }, - emits: ['update:modelValue', 'field-has-error'], + emits: ['service-zip-code-updated', 'field-has-error'], data() { return { - internalZipcode: this.modelValue + internalZipcode: this.parentZipCode }; }, watch: { - modelValue(newValue) { + parentZipCode(newValue) { if (newValue !== this.internalZipcode) { this.internalZipcode = newValue; } @@ -63,8 +63,8 @@ export default { handleFieldError(hasError) { this.$emit('field-has-error', hasError); }, - updateModelValue() { - this.$emit('update:modelValue', this.internalZipcode); + emitZipCodeUpdate() { + this.$emit('service-zip-code-updated', this.internalZipcode); } } }; diff --git a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue index 98563ad1..f2fca788 100644 --- a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue +++ b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue @@ -75,10 +75,11 @@ + @fieldHasError="handleFieldError" + @serviceZipCodeUpdated="handleServiceZipCodeChanged" />
{ From 8aeea7d5efb1ec809fa2aa6a1c4ea89f3d94c83e Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 14:37:43 -0500 Subject: [PATCH 07/12] fix tests --- .../schedule-page/service-location/service-location.spec.js | 2 +- .../service-zip-question/service-zip-question.spec.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 7b1b4294..6a50fe05 100644 --- a/src/layouts/schedule-page/service-location/service-location.spec.js +++ b/src/layouts/schedule-page/service-location/service-location.spec.js @@ -203,7 +203,7 @@ describe('service-location.vue', () => { const newMobileServiceZipCode = '45433'; // Act - mobileServiceZipCodeQuestion.vm.$emit('update:modelValue', newMobileServiceZipCode); + mobileServiceZipCodeQuestion.vm.$emit('service-zip-code-updated', newMobileServiceZipCode); await wrapper.vm.$nextTick(); // Assert diff --git a/src/layouts/schedule-page/service-location/service-zip-question/service-zip-question.spec.js b/src/layouts/schedule-page/service-location/service-zip-question/service-zip-question.spec.js index 82c44d56..182cbf42 100644 --- a/src/layouts/schedule-page/service-location/service-zip-question/service-zip-question.spec.js +++ b/src/layouts/schedule-page/service-location/service-zip-question/service-zip-question.spec.js @@ -7,7 +7,7 @@ describe('service-zip-question.vue', () => { const text = '12345'; const wrapper = shallowMount(serviceZipQuestion, { props: { - modelValue: text + parentZipCode: text }, attachTo: document.body }); @@ -32,9 +32,9 @@ describe('service-zip-question.vue', () => { // Act wrapper.vm.internalZipcode = '55555'; - wrapper.vm.updateModelValue(); + wrapper.vm.emitZipCodeUpdate(); // Assert - expect(wrapper.emitted('update:modelValue')).toEqual([['55555']]); + expect(wrapper.emitted('service-zip-code-updated')).toEqual([['55555']]); }); }); From 0c3515cef19577db982292feb0d913074b5ecf02 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 15:04:26 -0500 Subject: [PATCH 08/12] fix for unservicable. --- .../service-location/service-location.vue | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index d5559a95..835c1636 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -449,14 +449,19 @@ export default { async processMobileZipCodeChange() { showIssLoadingModal(true); await this.updateMobileZip(); - const updateMobileZipServiceLocationObj = { - mobileProviderNumber: this.mobileProviderNumber, - provider: null, - refreshDatePicker: true, - zipCode: this.zipCode, - zipCodeCtu: this.zipCodeCtu - }; - this.$emit('mobile-zip-updated', updateMobileZipServiceLocationObj); + + if (!this.mobileZipError) { + const updateMobileZipServiceLocationObj = { + mobileProviderNumber: this.mobileProviderNumber, + provider: null, + refreshDatePicker: true, + zipCode: this.zipCode, + zipCodeCtu: this.zipCodeCtu + }; + this.$emit('mobile-zip-updated', updateMobileZipServiceLocationObj); + } else { + showIssLoadingModal(false); + } }, setCtuForMobile(val) { this.zipCodeCtu = val; From e1a8f8a00ca63a5a73a91a2eb30250da22f4945d Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 15:59:16 -0500 Subject: [PATCH 09/12] clear mobile data if invalid zip entered --- src/iss-components/google-map/google-map.vue | 4 +++- src/layouts/schedule-page/schedule-page.vue | 9 +++++++++ .../schedule-page/service-location/service-location.vue | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/iss-components/google-map/google-map.vue b/src/iss-components/google-map/google-map.vue index cf07efe7..ea71a8f9 100644 --- a/src/iss-components/google-map/google-map.vue +++ b/src/iss-components/google-map/google-map.vue @@ -29,7 +29,9 @@ export default { } }, async beforeMount() { - await this.createMapWithMarkersForAddresses(this.markers); + if (this.markers && this.markers.length > 0) { + await this.createMapWithMarkersForAddresses(this.markers); + } }, methods: { async getMap(center) { diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 590b319c..db90a0eb 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -20,6 +20,7 @@ :schedulingInshopAvailabilityRating="inShopAvailabilityRating" @appointmentTypeChanged="appointmentTypeChangedFromServiceLocation" @cityUpdated="cityUpdatedFromServiceLocation" + @clearMobileData="clearMobileDataFromServiceLocation" @inShopZipUpdated="inShopZipUpdatedFromServiceLocation" @mobileZipUpdated="mobileZipUpdatedFromServiceLocation" @providerChanged="providerChangedFromServiceLocation" /> @@ -469,6 +470,14 @@ export default { cityUpdatedFromServiceLocation(newCity) { this.selectedServiceLocationCity = newCity; }, + clearMobileDataFromServiceLocation() { + if (this.selectedServiceLocation) { + this.selectedServiceLocation.mobileProviderNumber = null; + } + this.mobileDatesData = []; + this.mobileProviderNumber = null; + this.selectedMobileZipCode = null; + }, dateSelectedFromPicker(date) { this.selectedDate = date; this.showDatePickerError = false; diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 835c1636..0af2fc9e 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -158,7 +158,7 @@ export default { serviceZipQuestion }, mixins: [baseFormMixin], - emits: ['appointment-type-changed', 'city-updated', 'in-shop-zip-updated', 'mobile-zip-updated', 'provider-changed'], + emits: ['appointment-type-changed', 'city-updated', 'clear-mobile-data', 'in-shop-zip-updated', 'mobile-zip-updated', 'provider-changed'], props: { schedulingInshopAvailabilityRating: { type: String, @@ -460,6 +460,7 @@ export default { }; this.$emit('mobile-zip-updated', updateMobileZipServiceLocationObj); } else { + this.$emit('clear-mobile-data'); showIssLoadingModal(false); } }, From 836e383b46de049206b3449c835572b35c25b9e1 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 25 Feb 2026 16:07:00 -0500 Subject: [PATCH 10/12] handle a weird quick click. --- src/iss-components/google-map/google-map.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/iss-components/google-map/google-map.vue b/src/iss-components/google-map/google-map.vue index ea71a8f9..273c382c 100644 --- a/src/iss-components/google-map/google-map.vue +++ b/src/iss-components/google-map/google-map.vue @@ -29,9 +29,10 @@ export default { } }, async beforeMount() { - if (this.markers && this.markers.length > 0) { - await this.createMapWithMarkersForAddresses(this.markers); - } + await this.createMapWithMarkersForAddresses(this.markers) + .catch(() => { + console.error('Error creating map with markers: if handled jest fails to run tests'); + }); }, methods: { async getMap(center) { From 6ec3d55de9e50c8a830b9d40f39dba13492d7924 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 26 Feb 2026 09:59:55 -0500 Subject: [PATCH 11/12] Update test to account for changes --- .../contact-details/contact-details.spec.js | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/layouts/contact-details/contact-details.spec.js b/src/layouts/contact-details/contact-details.spec.js index 5b5131a8..8a4d4d7b 100644 --- a/src/layouts/contact-details/contact-details.spec.js +++ b/src/layouts/contact-details/contact-details.spec.js @@ -330,6 +330,30 @@ describe('contactDetails.vue', () => { navigate: jest.fn() } }); + const provider = { + address: { + city: getRandomString(4, 20), + state: getRandomString(2, 2), + streetAddress: getRandomString(10, 50), + zipCode: getRandomInt(10000, 99999).toString(), + zipCodeCtu: getRandomInt(10000, 99999).toString() + }, + companyName: getRandomString(5, 15), + phoneNumber: getRandomInt(1000000000, 9999999999).toString(), + providerNumber: getRandomInt(100000, 999999).toString() + } + const mainInitialState = { + order: { + serviceLocation: { + provider + } + } + }; + mountOptions.global.plugins = [createTestingPinia({ + initialState: { + main: mainInitialState + } + })]; const wrapper = shallowMount(contactDetails, mountOptions); const address = getRandomString(10, 50); const address2 = getRandomString(0, 50); @@ -354,7 +378,8 @@ describe('contactDetails.vue', () => { address, address2, city, - isVehicleProtected + isVehicleProtected, + provider }); }); From 71f8c2347ab9e687c55e584a9faf490ee201b0bd Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Thu, 26 Feb 2026 10:51:27 -0500 Subject: [PATCH 12/12] missed undo --- src/layouts/schedule-page/service-location/service-location.vue | 2 +- src/store/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 0af2fc9e..601a1e5d 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -372,7 +372,7 @@ export default { }; } - this.mainStore.saveServiceLocation({ + this.mainStore.updateServiceLocation({ state: this.state, zipCode: this.zipCode, zipCodeCtu: this.zipCodeCtu, diff --git a/src/store/index.js b/src/store/index.js index 32ee3b69..cd155ef2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1842,7 +1842,7 @@ export const useMainStore = defineStore({ this.order.serviceLocation.zipCodeCtu = serviceLocationInfo.zipCodeCtu ?? this.order.serviceLocation.zipCodeCtu; this.order.serviceLocation.appointmentType = serviceLocationInfo.appointmentType ?? this.order.serviceLocation.appointmentType; this.order.serviceLocation.isVehicleProtected = serviceLocationInfo.isVehicleProtected ?? this.order.serviceLocation.isVehicleProtected; - this.updateServiceLocationProvider(serviceLocationInfo.provider) + this.updateServiceLocationProvider(serviceLocationInfo.provider); this.order.serviceLocation.tpaSearchRadius = serviceLocationInfo.tpaSearchRadius; }, updateAppointmentType(appointmentType) {