Merge branch 'release/2026.02.26' into rlsmerge/2026.02.26-to-develop
This commit is contained in:
commit
cbddb33146
11 changed files with 89 additions and 7 deletions
5
src/assets/img/icons/info-circle-blue.svg
Normal file
5
src/assets/img/icons/info-circle-blue.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 0C6.41775 0 4.87104 0.469192 3.55544 1.34824C2.23985 2.22729 1.21447 3.47672 0.608967 4.93853C0.00346626 6.40034 -0.15496 8.00887 0.153721 9.56072C0.462403 11.1126 1.22433 12.538 2.34315 13.6569C3.46197 14.7757 4.88743 15.5376 6.43928 15.8463C7.99113 16.155 9.59966 15.9965 11.0615 15.391C12.5233 14.7855 13.7727 13.7602 14.6518 12.4446C15.5308 11.129 16 9.58225 16 8C16 5.87827 15.1571 3.84344 13.6569 2.34315C12.1566 0.842855 10.1217 0 8 0V0ZM8.4672 11.4C8.4672 11.5485 8.4082 11.691 8.30318 11.796C8.19816 11.901 8.05572 11.96 7.9072 11.96C7.75868 11.96 7.61624 11.901 7.51122 11.796C7.4062 11.691 7.3472 11.5485 7.3472 11.4V7.08C7.3472 6.93148 7.4062 6.78904 7.51122 6.68402C7.61624 6.579 7.75868 6.52 7.9072 6.52C8.05572 6.52 8.19816 6.579 8.30318 6.68402C8.4082 6.78904 8.4672 6.93148 8.4672 7.08V11.4ZM7.9072 5.4C7.79645 5.4 7.68818 5.36716 7.59608 5.30562C7.50399 5.24409 7.43222 5.15663 7.38983 5.0543C7.34745 4.95198 7.33636 4.83938 7.35796 4.73075C7.37957 4.62212 7.43291 4.52234 7.51122 4.44402C7.58954 4.3657 7.68932 4.31237 7.79795 4.29076C7.90658 4.26915 8.01918 4.28024 8.12151 4.32263C8.22383 4.36501 8.31129 4.43679 8.37283 4.52888C8.43436 4.62097 8.4672 4.72924 8.4672 4.84C8.46741 4.9136 8.45307 4.98651 8.42501 5.05455C8.39694 5.12259 8.3557 5.18441 8.30365 5.23645C8.25161 5.28849 8.18979 5.32973 8.12176 5.3578C8.05372 5.38587 7.9808 5.40021 7.9072 5.4Z" fill="#0070D1"/>
|
||||
</svg>
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -41,6 +41,8 @@ const experimentSettings = {
|
|||
SHOW_MOBILE_FIRST_POPUP_REPLACE_WITH_MSR: "Show_Mobile_First_Popup_Replace_With_MSR",
|
||||
OFFER_OEM: "OfferOem",
|
||||
USE_ADYEN_PAYMENT: "UseAdyenPayment",
|
||||
SHOW_UNVERIFIED_DEDUCT_ENTRY: "ShowUnverifiedDeducEntry",
|
||||
SERVICE_PACKAGE_ORDER: "ServicePackageOrder",
|
||||
};
|
||||
|
||||
const experimentTriggers = {
|
||||
|
|
|
|||
|
|
@ -94,6 +94,9 @@ function setupMocks() {
|
|||
vehicle: { year: 2020, make: "Toyota", model: "Camry", carId: "12345" },
|
||||
damage: { isRepair: false },
|
||||
},
|
||||
applicationUser: {
|
||||
experiments: [],
|
||||
},
|
||||
policy: {
|
||||
currentDeductible: 123,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -53,6 +53,17 @@
|
|||
v-bind:isDismissible="false" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<alert
|
||||
ref="UnverifiedInsuranceAlert"
|
||||
class="mt-5 mb-5"
|
||||
cmsWidgetName="UnverifiedInsuranceAlertWidget"
|
||||
v-if="shouldDisplayUnverifiedInsuranceAlert"
|
||||
:showInfoIcon="true"
|
||||
:showHorizontalRow="true"
|
||||
alertClass="alert-info" />
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="isRecalibrationOnOrder && shouldHideRecalibration"
|
||||
class="questions-about-service mt-5">
|
||||
|
|
@ -865,6 +876,13 @@ export default {
|
|||
shouldDisplayPiaAlert() {
|
||||
return getBoolFromString(this.$route?.query?.piaError);
|
||||
},
|
||||
shouldDisplayUnverifiedInsuranceAlert() {
|
||||
const shouldDisplayUnverifiedDeduct = experimentMixin.methods.hasSettingEqualTo(
|
||||
experimentSettings.SHOW_UNVERIFIED_DEDUCT_ENTRY,
|
||||
"true"
|
||||
);
|
||||
return shouldDisplayUnverifiedDeduct;
|
||||
},
|
||||
// Necessary to make the watcher of lineItems work
|
||||
// JavaScript does not keep a record of the old value, only a reference to it's location in the memory.
|
||||
// This creates a separate location for oldValue/newValue so they can be compared
|
||||
|
|
@ -1033,7 +1051,15 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.alert.alert-info.widget-name-UnverifiedInsuranceAlertWidget {
|
||||
:deep(.alert-heading) {
|
||||
color: $black;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(span.label),
|
||||
:deep(span) {
|
||||
font-family: UrbanistSemibold, Arial, Helvetica, sans-serif;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,11 @@ jest.mock("@/mixins/experiment-mixin.js", () => ({
|
|||
return true;
|
||||
}
|
||||
},
|
||||
hasSetting(settingName) {
|
||||
if (settingName === mockExperimentSettings.PROMO_ON_PACKAGE) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
hasSettingEqualTo(settingName, settingValue) {
|
||||
return false;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -163,6 +163,16 @@ export default {
|
|||
}));
|
||||
|
||||
this.$emit("currentNumberOfPackages", modifiedAnswers.length);
|
||||
|
||||
if (this.experimentPackageOrder()) {
|
||||
const orderedKeys = this.experimentPackageOrder()
|
||||
.split(",")
|
||||
.map((key) => key.trim());
|
||||
modifiedAnswers.sort(
|
||||
(a, b) => orderedKeys.indexOf(a.value) - orderedKeys.indexOf(b.value)
|
||||
);
|
||||
}
|
||||
|
||||
return modifiedAnswers;
|
||||
},
|
||||
isDiscountOnOrder() {
|
||||
|
|
@ -235,6 +245,11 @@ export default {
|
|||
)
|
||||
);
|
||||
},
|
||||
experimentPackageOrder() {
|
||||
return experimentMixin.methods.hasSetting(experimentSettings.SERVICE_PACKAGE_ORDER)
|
||||
? experimentMixin.methods.getSettingValue(experimentSettings.SERVICE_PACKAGE_ORDER)
|
||||
: false;
|
||||
},
|
||||
getButtonTypeObject() {
|
||||
if (this.isAfterpayBreakoutDisplay()) {
|
||||
return this.servicePackageRadioAfterpayExperiment;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
cmsWidgetName="ScheduleYourServiceWidget"
|
||||
id="schedule-your-service" />
|
||||
<appointmentTypeQuestion
|
||||
v-if="hasSelectableDatesLoaded"
|
||||
v-model="appointmentTypeFromAppointmentTypeQuestion"
|
||||
v-show="isAppointmentTypeDisplayed"
|
||||
:isServiceableMobile="isServiceableMobile"
|
||||
|
|
@ -36,7 +35,6 @@
|
|||
:isDisplayed="isAppointmentTypeDisplayed"
|
||||
:mobileFeeApplies="mobileFeeApplies"
|
||||
:zipCode="zipCode"
|
||||
ref="appointmentTypeQuestion"
|
||||
groupName="appointmentTypeQuestion"
|
||||
cmsWidgetName="AppointmentTypeQuestionWidget"
|
||||
validationRules="option-required"
|
||||
|
|
@ -950,7 +948,7 @@ export default {
|
|||
return false;
|
||||
},
|
||||
hasSelectableDatesLoaded() {
|
||||
if (this.isMobileSelected) {
|
||||
if (this.isServiceableMobile) {
|
||||
return this.selectableDatesMobile?.days?.length > 0;
|
||||
} else {
|
||||
return this.selectableDatesInshop?.days?.length > 0;
|
||||
|
|
@ -1842,10 +1840,13 @@ export default {
|
|||
} else {
|
||||
this.appointmentType = null;
|
||||
}
|
||||
this.setSelectedDateToFirstAvailable(); // v-if on appointmentTypeQuestion ensures dates have been loaded by now
|
||||
this.setSelectedDateToFirstAvailable();
|
||||
},
|
||||
setSelectedDateToFirstAvailable() {
|
||||
this.selectedDate = this.getFirstAvailableDate();
|
||||
if (this.hasSelectableDatesLoaded) {
|
||||
// ensure dates have been loaded by now
|
||||
this.selectedDate = this.getFirstAvailableDate();
|
||||
}
|
||||
},
|
||||
showRecalAcknowledgementModal() {
|
||||
if (this.shouldShowRecalAckModal()) {
|
||||
|
|
@ -2069,7 +2070,7 @@ export default {
|
|||
watch: {
|
||||
appointmentTypeFromAppointmentTypeQuestion: {
|
||||
handler(newValue, oldValue) {
|
||||
this.handleAppointmentTypeChange(newValue); // v-if on appointmentTypeQuestion ensures dates have been loaded by now
|
||||
this.handleAppointmentTypeChange(newValue);
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -200,6 +200,13 @@ export default {
|
|||
}
|
||||
}
|
||||
baseMixin.methods.ResetExternalParamsAndHideModal();
|
||||
|
||||
//clear any validation errors for external parameter flow
|
||||
const form = vm.$refs.theForm;
|
||||
if (form) {
|
||||
form.setFieldError("DamageLocationQuestion", undefined);
|
||||
form.setFieldTouched("DamageLocationQuestion", false, false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
baseMixin.methods.ResetExternalParamsAndHideModal();
|
||||
|
|
|
|||
|
|
@ -291,6 +291,7 @@ export default {
|
|||
sessionData.isPia = order?.payment?.isPia ?? false;
|
||||
sessionData.piaType = order?.payment?.piaType;
|
||||
sessionData.parentAccountNumber = order?.payment?.parentAccountNumber;
|
||||
sessionData.billToAccountNumber = order?.payment?.billToAccountNumber;
|
||||
sessionData.settledTenderAmount = order?.settledTenderAmount;
|
||||
sessionData.recalRequired = containsRecalParts(order?.lineItems);
|
||||
sessionData.recalType = getRecalPartNumbers(order?.lineItems?.glassParts);
|
||||
|
|
|
|||
|
|
@ -1645,6 +1645,7 @@ export const actions = {
|
|||
isPia,
|
||||
piaType,
|
||||
parentAccountNumber,
|
||||
billToAccountNumber,
|
||||
settledTenderAmount,
|
||||
recalRequired,
|
||||
recalType,
|
||||
|
|
@ -1718,6 +1719,7 @@ export const actions = {
|
|||
totalPrice: totalPrice,
|
||||
userAgent: userAgent,
|
||||
cashPriceSubTotal: cashPriceSubTotal,
|
||||
billToAccountNumber: billToAccountNumber,
|
||||
};
|
||||
|
||||
return globalMethods.callHttpClient({
|
||||
|
|
|
|||
|
|
@ -8,7 +8,11 @@
|
|||
this.alertClass,
|
||||
this.cssClassNameForCmsWidget,
|
||||
]">
|
||||
<p class="mx-6 my-0 fw-bold alert-heading">{{ alertHeadline }}</p>
|
||||
<p class="mx-6 my-0 fw-bold alert-heading">
|
||||
<img v-if="showInfoIcon" :src="infoIcon" alt="Info Icon" class="info-icon" />
|
||||
{{ alertHeadline }}
|
||||
</p>
|
||||
<hr v-if="showHorizontalRow" />
|
||||
<template v-for="paragraph in splitAlertCopyForParagraphTag" :key="paragraph">
|
||||
<p
|
||||
class="mx-4 mt-1 mb-0 text-body small"
|
||||
|
|
@ -58,6 +62,8 @@ import textBlock from "@/digital-components/text-block/text-block";
|
|||
export default {
|
||||
name: "alert",
|
||||
props: {
|
||||
showInfoIcon: Boolean,
|
||||
showHorizontalRow: Boolean,
|
||||
isDismissible: Boolean,
|
||||
alertClass: String,
|
||||
/*
|
||||
|
|
@ -87,6 +93,9 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
infoIcon() {
|
||||
return require(`@/assets/img/icons/info-circle-blue.svg`);
|
||||
},
|
||||
pageQueryString() {
|
||||
return applicationConfig.PAGE_QUERYSTRING;
|
||||
},
|
||||
|
|
@ -148,6 +157,12 @@ export default {
|
|||
border-radius: 0.5rem;
|
||||
border-width: 0px;
|
||||
|
||||
hr {
|
||||
border: 1px solid $blue;
|
||||
margin-left: 1rem;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
button {
|
||||
display: none;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue