diff --git a/src/assets/img/icons/info-circle-blue.svg b/src/assets/img/icons/info-circle-blue.svg new file mode 100644 index 000000000..fca619fb0 --- /dev/null +++ b/src/assets/img/icons/info-circle-blue.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/constants/experiments.js b/src/constants/experiments.js index f81484058..c76b1ea1c 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -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 = { diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index 76d4daa1e..1bc123d3f 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -94,6 +94,9 @@ function setupMocks() { vehicle: { year: 2020, make: "Toyota", model: "Camry", carId: "12345" }, damage: { isRepair: false }, }, + applicationUser: { + experiments: [], + }, policy: { currentDeductible: 123, }, diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 2a6d1d9ed..4d80f84c0 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -53,6 +53,17 @@ v-bind:isDismissible="false" /> +
+ +
+
@@ -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; diff --git a/src/layouts/quote/service-package-question/service-package-question.spec.js b/src/layouts/quote/service-package-question/service-package-question.spec.js index a44dc463c..b3e4742e7 100644 --- a/src/layouts/quote/service-package-question/service-package-question.spec.js +++ b/src/layouts/quote/service-package-question/service-package-question.spec.js @@ -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; }, diff --git a/src/layouts/quote/service-package-question/service-package-question.vue b/src/layouts/quote/service-package-question/service-package-question.vue index 436e98b24..72472e195 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -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; diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index e20c025fb..adc85ef2a 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -28,7 +28,6 @@ cmsWidgetName="ScheduleYourServiceWidget" id="schedule-your-service" /> 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); }, }, }, diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 7b313dbf7..5e128e867 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -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(); diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 238bed59d..316553548 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -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); diff --git a/src/store/index.js b/src/store/index.js index 1c83807a1..9ddd011bd 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -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({ diff --git a/src/ux-components/alert/alert.vue b/src/ux-components/alert/alert.vue index cccab36f0..5c78853d4 100644 --- a/src/ux-components/alert/alert.vue +++ b/src/ux-components/alert/alert.vue @@ -8,7 +8,11 @@ this.alertClass, this.cssClassNameForCmsWidget, ]"> -

{{ alertHeadline }}

+

+ Info Icon + {{ alertHeadline }} +

+