Merge branch 'release/2025.02.27' into feature/CASH-151

This commit is contained in:
CarlNation 2025-02-15 01:35:53 -05:00
commit 86812eefe2
29 changed files with 1332 additions and 153 deletions

View file

@ -1,5 +1,6 @@
{ {
"tabWidth": 4, "tabWidth": 4,
"htmlWhitespaceSensitivity": "ignore",
"bracketSameLine": true, "bracketSameLine": true,
"printWidth": 100, "printWidth": 100,
"trailingComma" : "es5" "trailingComma" : "es5"

View file

@ -16,8 +16,6 @@ const storeMutations = {
UPDATE_VEHICLE_IMAGE_COLOR: "updateVehicleImageColor", UPDATE_VEHICLE_IMAGE_COLOR: "updateVehicleImageColor",
UPDATE_VEHICLE_VIN: "updateVehicleVin", UPDATE_VEHICLE_VIN: "updateVehicleVin",
UPDATE_VEHICLE: "updateVehicle", UPDATE_VEHICLE: "updateVehicle",
UPDATE_VEHICLE_MOBILE_STATIC_RECALIBRATION_APPLICABLE:
"updateIsMobileStaticRecalibrationApplicable",
UPDATE_IS_REPAIR: "updateIsRepair", UPDATE_IS_REPAIR: "updateIsRepair",
UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips", UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips",

File diff suppressed because it is too large Load diff

View file

@ -17,18 +17,40 @@
<div <div
v-if="calendarViewDirection === 'future'" v-if="calendarViewDirection === 'future'"
class="legend caption d-flex align-items-center justify-content-end"> class="legend caption d-flex align-items-center justify-content-end">
<span class="legend-circle me-1"></span> &equals; Available <span class="legend-circle me-1"></span>
&equals; Available
</div> </div>
<div class="separator-line"></div> <div class="separator-line"></div>
<div class="nav-back ps-3"><button></button></div> <div class="nav-back ps-3"><button></button></div>
<div class="nav-forward pe-3"><button></button></div> <div class="nav-forward pe-3"><button></button></div>
<div class="grid-item caption"><span class="sr-only">Sunday</span>S</div> <div class="grid-item caption">
<div class="grid-item caption"><span class="sr-only">Monday</span>M</div> <span class="sr-only">Sunday</span>
<div class="grid-item caption"><span class="sr-only">Tuesday</span>T</div> S
<div class="grid-item caption"><span class="sr-only">Wednesday</span>W</div> </div>
<div class="grid-item caption"><span class="sr-only">Thursday</span>T</div> <div class="grid-item caption">
<div class="grid-item caption"><span class="sr-only">Friday</span>F</div> <span class="sr-only">Monday</span>
<div class="grid-item caption"><span class="sr-only">Saturday</span>S</div> M
</div>
<div class="grid-item caption">
<span class="sr-only">Tuesday</span>
T
</div>
<div class="grid-item caption">
<span class="sr-only">Wednesday</span>
W
</div>
<div class="grid-item caption">
<span class="sr-only">Thursday</span>
T
</div>
<div class="grid-item caption">
<span class="sr-only">Friday</span>
F
</div>
<div class="grid-item caption">
<span class="sr-only">Saturday</span>
S
</div>
<div <div
v-for="date in month.dates" v-for="date in month.dates"
:key="date.inputValue" :key="date.inputValue"

View file

@ -16,8 +16,7 @@
:maxlength="maxLength" :maxlength="maxLength"
role="textbox" role="textbox"
aria-multiline="true" aria-multiline="true"
:aria-required="isRequired"> :aria-required="isRequired"></textarea>
</textarea>
<p <p
tabindex="-1" tabindex="-1"
class="caption mt-2 mb-0 w-100" class="caption mt-2 mb-0 w-100"

View file

@ -75,9 +75,9 @@
class="d-inline-flex small mt-1" class="d-inline-flex small mt-1"
aria-atomic="true" aria-atomic="true"
aria-live="polite" aria-live="polite"
:class="[centerErrorMessage ? 'center-error-message' : '']" :class="[centerErrorMessage ? 'center-error-message' : '']">
>{{ errorMessage }}</span {{ errorMessage }}
> </span>
</div> </div>
</div> </div>
</template> </template>

View file

@ -10,9 +10,9 @@
href="javascript:void(0)" href="javascript:void(0)"
class="col d-flex justify-content-between py-0"> class="col d-flex justify-content-between py-0">
<span class="label">{{ OrderDetailsText }}</span> <span class="label">{{ OrderDetailsText }}</span>
<span class="label amount-due">{{ <span class="label amount-due">
getLineItemAmount(amountDue, showCoverageAsPending) {{ getLineItemAmount(amountDue, showCoverageAsPending) }}
}}</span> </span>
</a> </a>
</div> </div>
<div class="cart-panel"> <div class="cart-panel">
@ -48,11 +48,11 @@
v-for="(cartItem, i) in packageCartItems" v-for="(cartItem, i) in packageCartItems"
:key="i" :key="i"
class="packaged-cart-item"> class="packaged-cart-item">
<span <span>
><span :class="cartItem.category === 'promos' ? 'promo' : ''">{{ <span :class="cartItem.category === 'promos' ? 'promo' : ''">
cartItem.name {{ cartItem.name }}
}}</span></span </span>
> </span>
<textLink <textLink
v-if="allowItemRemoval" v-if="allowItemRemoval"
ref="removeLink" ref="removeLink"
@ -99,11 +99,9 @@
!showCoverageAsVerified || !showCoverageAsVerified ||
cartItem.name === 'Recycling' || cartItem.name === 'Recycling' ||
(showCoverageAsVerified && !cartItem.isCoveredByInsurance) (showCoverageAsVerified && !cartItem.isCoveredByInsurance)
" ">
>{{ {{ getLineItemAmount(cartItem.subTotal, null, cartItem.category) }}
getLineItemAmount(cartItem.subTotal, null, cartItem.category) </span>
}}</span
>
</div> </div>
<!-- Sub total, sales tax, total columns --> <!-- Sub total, sales tax, total columns -->
@ -143,8 +141,10 @@
class="my-2 lh-1 applied-promo-tag" class="my-2 lh-1 applied-promo-tag"
v-for="(promoCode, i) in getPromoCodeList" v-for="(promoCode, i) in getPromoCodeList"
:key="i"> :key="i">
<span class="caption" <span class="caption">
>Promo code <span class="promo-code">{{ promoCode }}</span> applied Promo code
<span class="promo-code">{{ promoCode }}</span>
applied
</span> </span>
</div> </div>
<contentGroupModal ref="RecycleModal" cmsWidgetName="RecycleModal"> <contentGroupModal ref="RecycleModal" cmsWidgetName="RecycleModal">

View file

@ -54,8 +54,10 @@
class="mt-4 d-flex align-items-center justify-content-between" class="mt-4 d-flex align-items-center justify-content-between"
v-for="(promoCode, i) in this.getPromoCodeList()" v-for="(promoCode, i) in this.getPromoCodeList()"
:key="i"> :key="i">
<span class="applied-promo" <span class="applied-promo">
>Promo code <span class="promo-code">{{ promoCode }}</span> applied Promo code
<span class="promo-code">{{ promoCode }}</span>
applied
</span> </span>
<textLink <textLink
ref="removeLink" ref="removeLink"

View file

@ -4,8 +4,8 @@
<button v-on:click="openCalendarModal"> <button v-on:click="openCalendarModal">
<span class="add-to-calendar-span"> <span class="add-to-calendar-span">
<img src="@/assets/img/icons/add-to-calendar.svg" class="add-to-calendar-img" /> <img src="@/assets/img/icons/add-to-calendar.svg" class="add-to-calendar-img" />
<span class="add-to-calendar-text">Add to calendar</span></span <span class="add-to-calendar-text">Add to calendar</span>
> </span>
</button> </button>
</div> </div>
<calendarModalQuestion <calendarModalQuestion
@ -14,8 +14,7 @@
cmsWidgetName="CalendarModalQuestion" cmsWidgetName="CalendarModalQuestion"
@calendar-modal-closed="calendarModalClosed" @calendar-modal-closed="calendarModalClosed"
:calendarOptionsData="calendarValues" :calendarOptionsData="calendarValues"
v-model="selectedCalendarOption"> v-model="selectedCalendarOption"></calendarModalQuestion>
</calendarModalQuestion>
</div> </div>
</template> </template>
<script> <script>

View file

@ -16,6 +16,13 @@
v-model="parentAccountNumber" v-model="parentAccountNumber"
:originalList="originalList" /> :originalList="originalList" />
</div> </div>
<textLink
id="payOnMyOwnBackButton"
useLoadingModal
linkType="text"
:text="payWithCashButtonCopy"
href="javascript:void(0)"
@click-event="backButtonAction((foreceCashSelectionOnQuote = true))" />
<navbar <navbar
cmsWidgetName="FunnelFooterWidget" cmsWidgetName="FunnelFooterWidget"
@ -36,6 +43,7 @@ import navbar from "@/fmg-components/nav-bar/nav-bar";
import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header";
import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue";
import insuranceCompanyQuestion from "@/layouts/insurance-company/insurance-company-question"; import insuranceCompanyQuestion from "@/layouts/insurance-company/insurance-company-question";
import textLink from "../../ux-components/text-link/text-link.vue";
// Supporting files // Supporting files
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
@ -92,6 +100,9 @@ export default {
isParentAccountNumber() { isParentAccountNumber() {
return !!this.parentAccountNumber; return !!this.parentAccountNumber;
}, },
payWithCashButtonCopy() {
return this.getCmsContent("PayWithCashWidget", "Text");
},
}, },
methods: { methods: {
isCashParentAccountNumber() { isCashParentAccountNumber() {
@ -109,8 +120,17 @@ export default {
arePagePrerequisitesValid() { arePagePrerequisitesValid() {
return store.getters.order.payment.isInsurance === true; return store.getters.order.payment.isInsurance === true;
}, },
backButtonAction() { backButtonAction(forceCashSelectionOnQuote) {
// Go back to Quote page // Go back to Quote page
if (forceCashSelectionOnQuote) {
this.$router.navigateWithoutSaving(
this.navigationScenarios.CLICKED_BACK,
this.$route,
{ isCashSelected: true }
);
return;
}
this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route);
}, },
async forwardButtonAction() { async forwardButtonAction() {
@ -157,6 +177,7 @@ export default {
Form, Form,
loadingModal, loadingModal,
insuranceCompanyQuestion, insuranceCompanyQuestion,
textLink,
}, },
}; };
</script> </script>

View file

@ -78,6 +78,20 @@ export default {
); );
} }
if (store.getters.externalParameterCustomer?.phoneNumber) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
store.getters.externalParameterCustomer.phoneNumber,
false
);
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_IS_SMS_OPT_IN,
true,
false
);
}
baseMixin.methods.ResetExternalParamsAndHideModal(); baseMixin.methods.ResetExternalParamsAndHideModal();
} }
}); });

View file

@ -79,6 +79,21 @@ export default {
false false
); );
} }
if (store.getters.externalParameterCustomer?.phoneNumber) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
store.getters.externalParameterCustomer.phoneNumber,
false
);
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_IS_SMS_OPT_IN,
true,
false
);
}
baseMixin.methods.ResetExternalParamsAndHideModal(); baseMixin.methods.ResetExternalParamsAndHideModal();
} }
}); });

View file

@ -18,7 +18,7 @@
v-if="hasImage" v-if="hasImage"
:src="buttonImage" :src="buttonImage"
:alt="getInlineAltText(token)" /> :alt="getInlineAltText(token)" />
<span v-else> {{ getInlineAltText(token) }}</span> <span v-else>{{ getInlineAltText(token) }}</span>
</span> </span>
<span v-else> <span v-else>
{{ token }} {{ token }}

View file

@ -11,7 +11,7 @@
class="ms-2" class="ms-2"
:src="buttonImage" :src="buttonImage"
:alt="getInlineAltText(token)" /> :alt="getInlineAltText(token)" />
<span v-else> {{ getInlineAltText(token) }}</span> <span v-else>{{ getInlineAltText(token) }}</span>
</span> </span>
<span v-else> <span v-else>
{{ token }} {{ token }}

View file

@ -41,8 +41,7 @@
id="card-frame" id="card-frame"
seamless seamless
scrolling="no" scrolling="no"
allow="payment *; microphone *; geolocation *;"> allow="payment *; microphone *; geolocation *;"></iframe>
</iframe>
</div> </div>
<hr /> <hr />

View file

@ -577,6 +577,52 @@ describe("quote.vue", () => {
//Assert //Assert
expect(wrapper.vm.isInsuranceSelected).toBe(false); expect(wrapper.vm.isInsuranceSelected).toBe(false);
}); });
test("should default to cash if isCashSelected is true, despite all other checks pointing to insurance selection", async () => {
// Also needs no query parameter or previous selection in store to be present
//Arrange
store.getters = {
lineItems: {
glassParts: ["item", "item2"],
},
applicationUser: {
experiments: [],
},
order: {
lineItems: {
glassParts: ["item", "item2"],
},
payment: {
isInsurance: true,
},
customer: {
emailAddress: "test@test.com",
},
serviceLocation: {
state: null,
},
},
vehicle: {
cardId: "123",
},
experimentSettings: {
settingName: "SERVICE_PACKAGE_DISCOUNT",
},
};
mockTierOnePrice = 505;
const { wrapper } = setupMocks({});
//Act
await quote.beforeRouteEnter.call(
wrapper.vm,
{ query: { fmgPage: "quote", isInsuranceSelected: true, isCashSelected: true } },
undefined,
(c) => c(wrapper.vm)
);
//Assert
expect(wrapper.vm.isInsuranceSelected).toBe(false);
});
test("should default to insurance if total economy package price is over $500", async () => { test("should default to insurance if total economy package price is over $500", async () => {
// Also needs no query parameter or previous selection in store to be present // Also needs no query parameter or previous selection in store to be present
//Arrange //Arrange

View file

@ -328,6 +328,10 @@ export default {
} }
const getIsInsuranceSelectedValue = (availableLineItems, insuranceThreshold) => { const getIsInsuranceSelectedValue = (availableLineItems, insuranceThreshold) => {
// query param checked here is set on insurance-selection "Pay on my own" link click
if (to.query?.isCashSelected || to.query?.iscashselected) {
return false;
}
const serviceLocationState = store.getters.order.serviceLocation.state; const serviceLocationState = store.getters.order.serviceLocation.state;
// usually true when returning from heritage but can be false when returning from heritage on a save quote // usually true when returning from heritage but can be false when returning from heritage on a save quote

View file

@ -3,7 +3,7 @@
<div class="alert-heading"> <div class="alert-heading">
<span> <span>
<img v-if="hasImage" :src="imageUrl" /> <img v-if="hasImage" :src="imageUrl" />
<span class="px-2"> {{ recalHeaderText }}</span> <span class="px-2">{{ recalHeaderText }}</span>
</span> </span>
</div> </div>
<div> <div>

View file

@ -27,9 +27,10 @@
</div> </div>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 col-xl-4 start-over"> <div class="col-md-6 col-xl-4 start-over">
<a @click="startOver" alt="Start Over Button" <a @click="startOver" alt="Start Over Button">
><img v-bind:src="startOverImage" />{{ startOverText }}</a <img v-bind:src="startOverImage" />
> {{ startOverText }}
</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -18,7 +18,7 @@
marginTopSizeOverride="1" /> marginTopSizeOverride="1" />
</template> </template>
<locationAlerts cmsWidgetPrefix="LocationAlert-" ref="locationAlerts" /> <locationAlerts cmsWidgetPrefix="LocationAlert-" ref="locationAlerts" />
<datePicker <datePicker2
customComponentId="dateQuestion" customComponentId="dateQuestion"
selectableDatesSetting="custom" selectableDatesSetting="custom"
ref="datePicker" ref="datePicker"
@ -69,7 +69,7 @@ import navbar from "@/fmg-components/nav-bar/nav-bar";
import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header";
import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue";
import { Form, defineRule } from "vee-validate"; import { Form, defineRule } from "vee-validate";
import datePicker from "@/digital-components/date-picker/date-picker"; import datePicker2 from "@/digital-components/date-picker/date-picker-2";
import locationAlerts from "@/layouts/schedule/location-alerts/location-alerts"; import locationAlerts from "@/layouts/schedule/location-alerts/location-alerts";
import timeSlotModalQuestion from "./time-slot-modal-question/time-slot-modal-question"; import timeSlotModalQuestion from "./time-slot-modal-question/time-slot-modal-question";
import textBlock from "@/digital-components/text-block/text-block"; import textBlock from "@/digital-components/text-block/text-block";
@ -213,7 +213,7 @@ export default {
preSelectedDate = null; preSelectedDate = null;
} }
const datePickerInitialDataPromise = await datePicker.methods.loadInitialData({ const datePickerInitialDataPromise = await datePicker2.methods.loadInitialData({
// setup config options for date-picker // setup config options for date-picker
selectableDatesSetting: "custom", selectableDatesSetting: "custom",
initialViewRowsToShow: 5, initialViewRowsToShow: 5,
@ -537,7 +537,7 @@ export default {
funnelSubHeader, funnelSubHeader,
Form, Form,
loadingModal, loadingModal,
datePicker, datePicker2,
locationAlerts, locationAlerts,
timeSlotModalQuestion, timeSlotModalQuestion,
textBlock, textBlock,

View file

@ -182,9 +182,6 @@ beforeEach(() => {
zipCode: "43235", zipCode: "43235",
state: "OH", state: "OH",
}, },
vehicle: {
isMobileStaticRecalibrationApplicable: true,
},
}, },
damage: { damage: {
isRepair: false, isRepair: false,

View file

@ -192,8 +192,6 @@ export default {
isRecalibrationServiceableInshop: null, isRecalibrationServiceableInshop: null,
isGlassServiceableMobile: null, isGlassServiceableMobile: null,
isRecalibrationServiceableMobile: null, isRecalibrationServiceableMobile: null,
isVehicleMobileStaticRecalibrationApplicable:
this.getIsVehicleMobileStaticRecalibrationApplicableFromStore(),
selectedAppointmentType: this.getSelectedAppointmentType(), selectedAppointmentType: this.getSelectedAppointmentType(),
selectedProvider: this.getSelectedProvider(), selectedProvider: this.getSelectedProvider(),
mobileFeePart: null, mobileFeePart: null,
@ -324,9 +322,8 @@ export default {
isMobileStaticRecalibrationApplicable() { isMobileStaticRecalibrationApplicable() {
return ( return (
this.displayMSR && this.displayMSR &&
this.isVehicleMobileStaticRecalibrationApplicable &&
this.mobileFeePart?.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE && this.mobileFeePart?.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE &&
(this.isInsurance ? this.mobileFeePart?.isInsurable : true) (this.isInsurance && !this.isITAC ? this.mobileFeePart?.isInsurable : true)
); );
}, },
displayMSR() { displayMSR() {
@ -403,6 +400,9 @@ export default {
isInsurance() { isInsurance() {
return store.getters.payment.isInsurance; return store.getters.payment.isInsurance;
}, },
isITAC() {
return store.getters.order.policy.isItac;
},
}, },
methods: { methods: {
arePagePrerequisitesValid() { arePagePrerequisitesValid() {
@ -515,9 +515,6 @@ export default {
getSelectedProvider() { getSelectedProvider() {
return store.getters.order.serviceLocation.provider; return store.getters.order.serviceLocation.provider;
}, },
getIsVehicleMobileStaticRecalibrationApplicableFromStore() {
return store.getters.order.vehicle.isMobileStaticRecalibrationApplicable;
},
resetMobileLocation() { resetMobileLocation() {
this.streetAddress = ""; this.streetAddress = "";
this.apartmentNumberOrBusinessName = ""; this.apartmentNumberOrBusinessName = "";

View file

@ -8,7 +8,7 @@
href="#!" href="#!"
@click-event="openModal"> @click-event="openModal">
<template v-slot:after-text v-if="editScreenReaderTextCmsWidgetName"> <template v-slot:after-text v-if="editScreenReaderTextCmsWidgetName">
<span class="sr-only"> {{ screenReaderOnlyText }} </span> <span class="sr-only">{{ screenReaderOnlyText }}</span>
</template> </template>
</textLink> </textLink>
</div> </div>

View file

@ -8,12 +8,12 @@
:aria-label="buttonLabel" :aria-label="buttonLabel"
class="button-content list-button-content d-flex flex-column justify-content-center py-3 px-4"> class="button-content list-button-content d-flex flex-column justify-content-center py-3 px-4">
<div class="row-one"> <div class="row-one">
<span class="m-0 button-label-copy text-truncate" :class="textPosition">{{ <span class="m-0 button-label-copy text-truncate" :class="textPosition">
buttonLabel {{ buttonLabel }}
}}</span> </span>
<span class="m-0 caption mx-1 text-nowrap" :class="textPosition">{{ <span class="m-0 caption mx-1 text-nowrap" :class="textPosition">
buttonLabelSubCopy {{ buttonLabelSubCopy }}
}}</span> </span>
<div <div
v-if="displayAvailabilityIndicators" v-if="displayAvailabilityIndicators"
class="availability-indicator rounded-pill text-nowrap" class="availability-indicator rounded-pill text-nowrap"
@ -22,9 +22,9 @@
v-if="!isLoaderDisplayed" v-if="!isLoaderDisplayed"
class="availability-badge" class="availability-badge"
:class="availabilityRating == 'high' ? 'green' : 'orange'"></div> :class="availabilityRating == 'high' ? 'green' : 'orange'"></div>
<span v-if="!isLoaderDisplayed" class="m-0 button-auxillary-copy">{{ <span v-if="!isLoaderDisplayed" class="m-0 button-auxillary-copy">
badgeText {{ badgeText }}
}}</span> </span>
<loader <loader
v-if="isLoaderDisplayed" v-if="isLoaderDisplayed"
:loaderPosition="left" :loaderPosition="left"

View file

@ -133,36 +133,36 @@ export default {
vm.setCmsContent(resultMap.cmsContent); vm.setCmsContent(resultMap.cmsContent);
if (store.getters.externalParameterState?.isExternalParameter) { if (store.getters.externalParameterState?.isExternalParameter) {
if (store.getters.externalParameterServiceZip.zipCode) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_SERVICE_ZIP_CODE_INFO,
{
zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null,
zipCodeCtu: null,
},
false
);
}
if (store.getters.externalParameterCustomer?.phoneNumber) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
store.getters.externalParameterCustomer.phoneNumber,
false
);
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_IS_SMS_OPT_IN,
true,
false
);
}
const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm); const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm);
if (isValid) { if (isValid) {
vm.forwardButtonAction(); vm.forwardButtonAction();
} else { } else {
if (store.getters.externalParameterServiceZip.zipCode) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_SERVICE_ZIP_CODE_INFO,
{
zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null,
zipCodeCtu: null,
},
false
);
}
if (store.getters.externalParameterCustomer?.phoneNumber) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
store.getters.externalParameterCustomer.phoneNumber,
false
);
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_IS_SMS_OPT_IN,
true,
false
);
}
baseMixin.methods.ResetExternalParamsAndHideModal(); baseMixin.methods.ResetExternalParamsAndHideModal();
} }
} }
@ -202,11 +202,17 @@ export default {
async forwardButtonAction() { async forwardButtonAction() {
const zipCodeData = await this.getZipCodeData(this.serviceZipCode); const zipCodeData = await this.getZipCodeData(this.serviceZipCode);
if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) { // if no value due to field being optional, blank both phone and email address
const phone = this.emailOrSms.replace(/[()]/g, ""); if (!this.emailOrSms) {
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
} else { } else {
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailOrSms, false); if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) {
const phone = this.emailOrSms.replace(/[()]/g, "");
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false);
} else {
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailOrSms, false);
}
} }
await this.dispatchStoreAction( await this.dispatchStoreAction(

View file

@ -152,6 +152,20 @@ export default {
if (isValid) { if (isValid) {
vm.forwardButtonAction(); vm.forwardButtonAction();
} else { } else {
if (store.getters.externalParameterCustomer?.phoneNumber) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
store.getters.externalParameterCustomer.phoneNumber,
false
);
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_IS_SMS_OPT_IN,
true,
false
);
}
if (store.getters.externalParameterServiceZip.zipCode) { if (store.getters.externalParameterServiceZip.zipCode) {
await baseMixin.methods.dispatchStoreAction( await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_SERVICE_ZIP_CODE_INFO, storeActions.SAVE_SERVICE_ZIP_CODE_INFO,

View file

@ -121,7 +121,6 @@ export default {
modelOptions: [], modelOptions: [],
styleOptions: [], styleOptions: [],
displayNoServiceAlert: false, displayNoServiceAlert: false,
isMobileStaticRecalibrationApplicable: this.getIsMobileStaticRecalibrationApplicable(),
}; };
}, },
@ -444,8 +443,6 @@ export default {
this.imageVifNumber = result?.data.imageVifNumber; this.imageVifNumber = result?.data.imageVifNumber;
this.imageVifColor = result?.data.imageVifColor; this.imageVifColor = result?.data.imageVifColor;
this.displayNoServiceAlert = !result?.data.canSafeliteService; this.displayNoServiceAlert = !result?.data.canSafeliteService;
this.isMobileStaticRecalibrationApplicable =
result?.data.isMobileStaticRecalibrationApplicable;
}, },
resetAlert() { resetAlert() {
this.displayNoServiceAlert = false; this.displayNoServiceAlert = false;
@ -464,8 +461,6 @@ export default {
imageUrl: this.imageUrl, imageUrl: this.imageUrl,
imageVifNumber: this.imageVifNumber, imageVifNumber: this.imageVifNumber,
imageVifColor: this.imageVifColor, imageVifColor: this.imageVifColor,
isMobileStaticRecalibrationApplicable:
this.isMobileStaticRecalibrationApplicable,
}, },
false false
); );
@ -541,9 +536,6 @@ export default {
getImageVifColorfromStore() { getImageVifColorfromStore() {
return store.getters.vehicle.imageVifColor; return store.getters.vehicle.imageVifColor;
}, },
getIsMobileStaticRecalibrationApplicable() {
return store.getters.vehicle.isMobileStaticRecalibrationApplicable;
},
}, },
components: { components: {

View file

@ -68,7 +68,6 @@ const getDefaultState = () => {
registration: { registration: {
licensePlate: null, licensePlate: null,
}, },
isMobileStaticRecalibrationApplicable: false,
}, },
serviceLocation: { serviceLocation: {
address: null, address: null,
@ -226,10 +225,6 @@ export const mutations = {
updateVehicleVin(state, vin) { updateVehicleVin(state, vin) {
state.order.vehicle.vin = vin; state.order.vehicle.vin = vin;
}, },
updateIsMobileStaticRecalibrationApplicable(state, isMobileStaticRecalibrationApplicable) {
state.order.vehicle.isMobileStaticRecalibrationApplicable =
isMobileStaticRecalibrationApplicable;
},
updateIsRepair(state, isRepair) { updateIsRepair(state, isRepair) {
state.order.damage.isRepair = isRepair; state.order.damage.isRepair = isRepair;
}, },
@ -361,8 +356,6 @@ export const mutations = {
state.order.vehicle.imageUrl = vehicleInfo.imageUrl; state.order.vehicle.imageUrl = vehicleInfo.imageUrl;
state.order.vehicle.imageVifNumber = vehicleInfo.imageVifNumber; state.order.vehicle.imageVifNumber = vehicleInfo.imageVifNumber;
state.order.vehicle.imageColor = vehicleInfo.imageVifColor; state.order.vehicle.imageColor = vehicleInfo.imageVifColor;
state.order.vehicle.isMobileStaticRecalibrationApplicable =
vehicleInfo.isMobileStaticRecalibrationApplicable;
}, },
updateRegistration(state, registrationInfo) { updateRegistration(state, registrationInfo) {
state.order.vehicle.registration.licensePlate = registrationInfo?.licensePlate; state.order.vehicle.registration.licensePlate = registrationInfo?.licensePlate;
@ -555,7 +548,6 @@ export const mutations = {
state.order.vehicle.imageUrl = null; state.order.vehicle.imageUrl = null;
state.order.vehicle.imageVifNumber = null; state.order.vehicle.imageVifNumber = null;
state.order.vehicle.imageColor = null; state.order.vehicle.imageColor = null;
state.order.vehicle.isMobileStaticRecalibrationApplicable = false;
}, },
resetDamageState(state) { resetDamageState(state) {
state.order.damage.isRepair = null; state.order.damage.isRepair = null;
@ -1024,8 +1016,12 @@ export const getters = {
return email; return email;
} }
// if we're here, then we have both email and phone so get the value from pageData to reflect what they entered on the page // if we're here, then we have both email and phone so get the value from pageData to reflect what they entered on the page.
return state.applicationUser.pageData[fmgPageValues.EMAIL_SMS_PAGES]?.emailOrSmsValue; // if they didn't enter anything on the page default to email
return (
state.applicationUser.pageData[fmgPageValues.EMAIL_SMS_PAGES]?.emailOrSmsValue ??
state.order.customer.emailAddress
);
}, },
}; };
@ -1701,8 +1697,6 @@ export const actions = {
const coverageStatus = coverageStatusEnum(order.payment?.insuranceCoverage?.coverageStatus); const coverageStatus = coverageStatusEnum(order.payment?.insuranceCoverage?.coverageStatus);
const coverageType = coverageTypeEnum(order.payment?.insuranceCoverage?.coverageType); const coverageType = coverageTypeEnum(order.payment?.insuranceCoverage?.coverageType);
const isItacOptimized = order.policy?.isItac ?? false; const isItacOptimized = order.policy?.isItac ?? false;
const isMobileStaticRecalibrationApplicable =
order.vehicle?.isMobileStaticRecalibrationApplicable;
const zipCode = const zipCode =
serviceZipCode ?? serviceZipCode ??
order.serviceLocation?.provider?.address?.zipCode ?? order.serviceLocation?.provider?.address?.zipCode ??
@ -1718,12 +1712,10 @@ export const actions = {
var endPoint = `${endpoints.GetMobileFeePart.url}/?serviceType=${serviceType}&facilityType=${facilityType}&parentAccountNumber=${parentAccountNumber}&billToAccountNumber=${billToAccountNumber}&providerNumber=${providerNumber}&isItacOptimized=${isItacOptimized}&zipCode=${zipCode}`; var endPoint = `${endpoints.GetMobileFeePart.url}/?serviceType=${serviceType}&facilityType=${facilityType}&parentAccountNumber=${parentAccountNumber}&billToAccountNumber=${billToAccountNumber}&providerNumber=${providerNumber}&isItacOptimized=${isItacOptimized}&zipCode=${zipCode}`;
if (isMobileStaticRecalibrationApplicable) { const recalPartNumber = getRecalPartNumber(order.lineItems?.glassParts[0]);
const recalPartNumber = getRecalPartNumber(order.lineItems?.glassParts[0]); const carId = order.vehicle?.carId;
const carId = order.vehicle?.carId; if (recalPartNumber && carId) {
if (recalPartNumber && carId) { endPoint = `${endPoint}&partNumbers=${recalPartNumber}&carId=${carId}`;
endPoint = `${endPoint}&partNumbers=${recalPartNumber}&carId=${carId}`;
}
} }
if (coverageStatus) { if (coverageStatus) {
@ -2326,18 +2318,7 @@ export const actions = {
// Vehicle // Vehicle
saveVehicle( saveVehicle(
context, context,
{ { year, make, model, style, carId, category, imageUrl, imageVifNumber, imageVifColor }
year,
make,
model,
style,
carId,
category,
imageUrl,
imageVifNumber,
imageVifColor,
isMobileStaticRecalibrationApplicable,
}
) { ) {
if ( if (
context.state.order.vehicle.year != year || context.state.order.vehicle.year != year ||
@ -2358,10 +2339,6 @@ export const actions = {
context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, imageUrl); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, imageUrl);
context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_VIF_NUMBER, imageVifNumber); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_VIF_NUMBER, imageVifNumber);
context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, imageVifColor); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, imageVifColor);
context.commit(
storeMutations.UPDATE_VEHICLE_MOBILE_STATIC_RECALIBRATION_APPLICABLE,
isMobileStaticRecalibrationApplicable
);
} }
}, },

View file

@ -1,22 +1,26 @@
<template> <template>
<loadingModal v-if="useLoadingModal" notFullScreen ref="loadingModal" /> <loadingModal v-if="useLoadingModal" notFullScreen ref="loadingModal" />
<a v-if="linkType === 'navigation'" @click="handleClick" class="navigation-link" :href="href" <a v-if="linkType === 'navigation'" @click="handleClick" class="navigation-link" :href="href">
>{{ text }}<slot name="after-text"></slot {{ text }}
></a> <slot name="after-text"></slot>
</a>
<a <a
v-else-if="linkType === 'newWindowLink'" v-else-if="linkType === 'newWindowLink'"
@click="handleClick" @click="handleClick"
class="new-window-link" class="new-window-link"
:href="href" :href="href"
target="_blank" target="_blank">
>{{ text }}<slot name="after-text"></slot {{ text }}
></a> <slot name="after-text"></slot>
<a v-else-if="linkType === 'textSmall'" @click="handleClick" class="small" :href="href" </a>
>{{ text }}<slot name="after-text"></slot <a v-else-if="linkType === 'textSmall'" @click="handleClick" class="small" :href="href">
></a> {{ text }}
<a v-else-if="linkType === 'text'" @click="handleClick" :href="href" <slot name="after-text"></slot>
>{{ text }}<slot name="after-text"></slot </a>
></a> <a v-else-if="linkType === 'text'" @click="handleClick" :href="href">
{{ text }}
<slot name="after-text"></slot>
</a>
</template> </template>
<script> <script>