Merge branch 'develop' into feature/CSR-32-A
This commit is contained in:
commit
9b7d2c8e81
10 changed files with 70 additions and 66 deletions
|
|
@ -33,10 +33,9 @@
|
|||
:key="i"
|
||||
class="packaged-cart-item">
|
||||
<span
|
||||
><span v-if="cartItem.category === 'promos'"><</span
|
||||
>{{ cartItem.name
|
||||
}}<span v-if="cartItem.category === 'promos'">></span></span
|
||||
>
|
||||
><span v-if="cartItem.category === 'promos'"></span>{{ cartItem.name
|
||||
}}<span v-if="cartItem.category === 'promos'"></span
|
||||
></span>
|
||||
<textLink
|
||||
v-if="allowItemRemoval"
|
||||
ref="removeLink"
|
||||
|
|
@ -103,7 +102,6 @@
|
|||
ref="promoModalQuestion"
|
||||
class="small mt-4"
|
||||
v-model="lineItems"
|
||||
@addedPromo="handleAddedPromo"
|
||||
:availableVaps="availableVaps"
|
||||
modalWidgetName="PromoModalWidget" />
|
||||
</div>
|
||||
|
|
@ -112,7 +110,7 @@
|
|||
class="my-2 lh-1 applied-promo"
|
||||
v-for="(promoCode, i) in this.getPromoCodeList()"
|
||||
:key="i">
|
||||
<span class="caption">Promo code <{{ promoCode }}> applied </span>
|
||||
<span class="caption">Promo code {{ promoCode }} applied </span>
|
||||
</div>
|
||||
<contentGroupModal ref="RecycleModal" cmsWidgetName="RecycleModal">
|
||||
<textBlock cmsWidgetName="RecycleTextBlock" />
|
||||
|
|
@ -158,7 +156,6 @@ export default {
|
|||
style: "currency",
|
||||
currency: "USD",
|
||||
}),
|
||||
lineItems: deepClone(this.modelValue),
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
|
@ -236,8 +233,6 @@ export default {
|
|||
this.lineItems[category] = this.lineItems[category].filter(
|
||||
(lineItemsToKeep) => lineItemsToKeep.cartItemType != cartItemType
|
||||
);
|
||||
|
||||
this.$emit("update:modelValue", this.lineItems);
|
||||
},
|
||||
getPromoCodeList() {
|
||||
if (this.$refs["promoModalQuestion"]) {
|
||||
|
|
@ -245,12 +240,16 @@ export default {
|
|||
}
|
||||
return [];
|
||||
},
|
||||
handleAddedPromo(lineItems) {
|
||||
// NOTE: these lineItems are passed from promo-modal-question
|
||||
this.$emit("update:modelValue", lineItems);
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
lineItems: {
|
||||
get: function () {
|
||||
return this.modelValue;
|
||||
},
|
||||
set: function (newValue) {
|
||||
this.$emit("update:modelValue", newValue);
|
||||
},
|
||||
},
|
||||
screenReaderTotalAmountDueText() {
|
||||
return this.getCmsContent("ScreenReaderTotalAmountDueWidget", "Text");
|
||||
},
|
||||
|
|
@ -843,14 +842,6 @@ export default {
|
|||
return this.subTotal + this.salesTax;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
modelValue: {
|
||||
handler(newValue) {
|
||||
this.lineItems = deepClone(newValue);
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
textBlock,
|
||||
textLink,
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ export default {
|
|||
props: {
|
||||
modelValue: Object,
|
||||
modalWidgetName: String,
|
||||
availableVaps: Object,
|
||||
addableVaps: Object,
|
||||
pageName: String,
|
||||
taxPromos: {
|
||||
type: Boolean,
|
||||
|
|
@ -186,14 +186,14 @@ export default {
|
|||
resetModalButtonStyle() {
|
||||
this.modal.resetButtonStyle();
|
||||
},
|
||||
async getPromoCodeData(promoCode, lineItems, availableVaps, pageNameToLog = null) {
|
||||
async getPromoCodeData(promoCode, lineItems, addableVaps, pageNameToLog = null) {
|
||||
const pageName = pageNameToLog ?? this.$options?.name;
|
||||
const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging(
|
||||
storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA,
|
||||
{
|
||||
promoCode: promoCode,
|
||||
lineItemsToUse: lineItems,
|
||||
addableVaps: availableVaps,
|
||||
addableVaps: addableVaps,
|
||||
},
|
||||
pageName,
|
||||
false
|
||||
|
|
@ -258,7 +258,7 @@ export default {
|
|||
const promoCodeData = await this.getPromoCodeData(
|
||||
this.promoCode,
|
||||
this.lineItems,
|
||||
this.availableVaps,
|
||||
this.addableVaps,
|
||||
this.pageName
|
||||
);
|
||||
if (promoCodeData.isValid) {
|
||||
|
|
@ -292,7 +292,7 @@ export default {
|
|||
);
|
||||
const taxedVaps = mapTaxedLineItemsToStoreFormat(
|
||||
taxedLineItems,
|
||||
this.availableVaps
|
||||
this.addableVaps
|
||||
);
|
||||
|
||||
const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos(
|
||||
|
|
@ -304,7 +304,6 @@ export default {
|
|||
this.lineItems.vaps?.push(...getVaps);
|
||||
}
|
||||
this.lineItems?.promos.push(...promoCodeData.promoCode);
|
||||
this.$emit("added-promo", this.lineItems);
|
||||
this.closeModal();
|
||||
} else {
|
||||
this.getErrorMessage(promoCodeData.errorCode, promoCodeData.additionalInfo);
|
||||
|
|
|
|||
|
|
@ -73,6 +73,13 @@ export async function navigateToHeritageFunnel({ shouldSaveSession, pageNameToLo
|
|||
heritageParms["promo"] = promo;
|
||||
}
|
||||
|
||||
if (
|
||||
process.env.VUE_APP_HERITAGE_FUNNEL.includes("fixmyglassdev") &&
|
||||
process.env.VUE_APP_CURRENT_ENVIRONMENT === "Localhost"
|
||||
) {
|
||||
heritageParms["forceEndToEndInsurance"] = true;
|
||||
}
|
||||
|
||||
router.navigateToExternalUrl(externalUrls.HERITAGE_FUNNEL, heritageParms);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -331,10 +331,10 @@ export function getNewlyInactivatedPromos(oldInactivePromos, newInactivePromos)
|
|||
|
||||
export function createPromoSuccessAlert(promoCode) {
|
||||
return {
|
||||
messageHeadline: "Promo applied!",
|
||||
messageCopy: `Promo "${getPromoCodeWithoutBundleIdentifier(
|
||||
messageHeadline: "Promo code applied!",
|
||||
messageCopy: `Promo code ${getPromoCodeWithoutBundleIdentifier(
|
||||
promoCode.toUpperCase()
|
||||
)}" was successfully applied to your cart.`,
|
||||
)} was successfully applied to your cart.`,
|
||||
type: "alert-success",
|
||||
isDismissible: true,
|
||||
shouldAutoFade: true,
|
||||
|
|
@ -343,19 +343,19 @@ export function createPromoSuccessAlert(promoCode) {
|
|||
|
||||
export function createPromoErrorAlert(promoCode, errorCode = null, additionalInfo) {
|
||||
const alert = {
|
||||
messageHeadline: "Promo error",
|
||||
messageHeadline: "Promo code error",
|
||||
type: "alert-danger",
|
||||
shouldAutoFade: false,
|
||||
isDismissible: true,
|
||||
};
|
||||
if (stackingPromoErrorCodes.includes(errorCode)) {
|
||||
alert.messageCopy = `Sorry, promo code "${getPromoCodeWithoutBundleIdentifier(
|
||||
alert.messageCopy = `Sorry, promo code ${getPromoCodeWithoutBundleIdentifier(
|
||||
promoCode.toUpperCase()
|
||||
)}" cannot be combined with "${additionalInfo[0].toUpperCase()}"`;
|
||||
)} cannot be combined with ${additionalInfo[0].toUpperCase()}`;
|
||||
} else {
|
||||
alert.messageCopy = `Sorry, promo code "${getPromoCodeWithoutBundleIdentifier(
|
||||
alert.messageCopy = `Sorry, promo code ${getPromoCodeWithoutBundleIdentifier(
|
||||
promoCode.toUpperCase()
|
||||
)}" is not valid`;
|
||||
)} is not valid`;
|
||||
}
|
||||
return alert;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
:availableLineItems="availableLineItems"
|
||||
:isInsuranceSelected="isInsuranceSelected"
|
||||
@vapsItemsSelected="vapsItemsSelectedAction"
|
||||
:activePromos="allActivePromos"
|
||||
:activePromos="lineItems.promos"
|
||||
v-on="{ 'buttonEvent.openModal': openModalAction }"
|
||||
validationRules="option-required"
|
||||
isRequired />
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
<promoModalQuestion
|
||||
class="small mt-4"
|
||||
v-model="lineItems"
|
||||
:availableVaps="availableVaps"
|
||||
:addableVaps="addableVaps"
|
||||
pageName="quote"
|
||||
:taxPromos="false"
|
||||
modalWidgetName="PromoModalWidget" />
|
||||
|
|
@ -86,6 +86,7 @@ import baseMixin from "@/mixins/base-mixin.js";
|
|||
import vehicleQuestionsMixin from "../../mixins/vehicle-questions-mixin";
|
||||
import { settleAllPromises } from "@/helpers/layout-helper";
|
||||
import { storeActions } from "@/constants/store-actions";
|
||||
import { deepClone } from "@/helpers/object-helper";
|
||||
import store from "@/store";
|
||||
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
|
||||
import { required } from "@/helpers/validation-rules";
|
||||
|
|
@ -149,7 +150,8 @@ export default {
|
|||
];
|
||||
|
||||
const resultMap = await settleAllPromises(promiseResultMap);
|
||||
const lineItems = store.getters.order.lineItems;
|
||||
const lineItems = deepClone(store.getters.order.lineItems);
|
||||
lineItems.vaps = lineItems.vaps ?? [];
|
||||
const nullSafeGlassParts = lineItems.glassParts ?? [];
|
||||
const availableLineItems = [
|
||||
resultMap.rainDefense,
|
||||
|
|
@ -172,30 +174,29 @@ export default {
|
|||
resultMap.supportingItems,
|
||||
false
|
||||
);
|
||||
lineItems.supportingItems = resultMap.supportingItems;
|
||||
const addableVaps = [...resultMap.wipers, resultMap.rainDefense];
|
||||
|
||||
// Promo logic
|
||||
// Populate the previous state of promos for toast message usage in "next()"
|
||||
const availableVaps = [...resultMap.wipers, resultMap.rainDefense];
|
||||
const oldActivePromos = store.getters.lineItems.promos?.slice(0);
|
||||
const oldInactivePromos = store.getters.order.payment.inactivePromos?.slice(0);
|
||||
|
||||
const promoCodeFromQueryString = getQuerystringParameter(queryStrings.PROMO);
|
||||
|
||||
const { validatePromoResponse, revalidatePromoResponse } =
|
||||
await revalidatePromosAndValidateQueryStringPromo(
|
||||
promoCodeFromQueryString,
|
||||
pricingResults,
|
||||
"quote"
|
||||
);
|
||||
lineItems.glassParts = nullSafeGlassParts;
|
||||
lineItems.promos = lineItems.promos ?? [];
|
||||
lineItems.vaps = lineItems.vaps ?? [];
|
||||
// Sync local promos with any new promos added by validate/revalidate
|
||||
lineItems.promos = store.getters.lineItems.promos ?? [];
|
||||
// End of promo logic
|
||||
|
||||
// Call the "next" function to complete the transition to this page.
|
||||
next((vm) => {
|
||||
vm.setCmsContent(resultMap.cmsContent);
|
||||
vm.availableVaps = availableVaps;
|
||||
vm.addableVaps = addableVaps;
|
||||
vm.lineItems = lineItems;
|
||||
vm.availableLineItems = pricingResults;
|
||||
vm.isInsuranceSelected = vm.getDefaultIsInsuranceSelectedValue(vm.availableLineItems);
|
||||
|
|
@ -225,13 +226,10 @@ export default {
|
|||
isInsuranceSelected: null,
|
||||
availableLineItems: null,
|
||||
lineItems: [],
|
||||
availableVaps: [],
|
||||
addableVaps: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
allActivePromos() {
|
||||
return this.lineItems.promos ?? [];
|
||||
},
|
||||
lineItemsCloneForWatcher() {
|
||||
return Object.assign({}, this.lineItems);
|
||||
},
|
||||
|
|
@ -304,7 +302,7 @@ export default {
|
|||
this.$store.getters.order.payment.parentAccountNumber !=
|
||||
applicationConfig.CASH_PARENT_ACCOUNT_NUMBER
|
||||
) {
|
||||
this.supportingItems = this.filterOutFees(this.supportingItems);
|
||||
this.lineItems.supportingItems = this.filterOutFees(this.lineItems.supportingItems);
|
||||
}
|
||||
|
||||
if (this.lineItems.glassParts?.length > 0) {
|
||||
|
|
@ -320,7 +318,6 @@ export default {
|
|||
storeActions.SAVE_ACTIVE_AND_OR_INACTIVE_PROMOS,
|
||||
{
|
||||
activePromos: this.lineItems.promos,
|
||||
inactivePromos: this.$store.getters.order.payment.inactivePromos,
|
||||
},
|
||||
false
|
||||
);
|
||||
|
|
|
|||
|
|
@ -95,19 +95,14 @@ export default {
|
|||
},
|
||||
|
||||
tintSelectionOptions() {
|
||||
let tintOptions = [];
|
||||
|
||||
Object.keys(this.featureListData).forEach((tintOption) => {
|
||||
tintOptions.push({
|
||||
const tintOptions = Object.keys(this.featureListData).map((tintOption) => {
|
||||
const buttonImage = this.getTintSourceImage(this.glassLocation, tintOption);
|
||||
return {
|
||||
value: tintOption,
|
||||
buttonLabel: tintOption,
|
||||
buttonImage: require(`@/assets/img/tints/${this.getTintSourceImage(
|
||||
this.glassLocation,
|
||||
tintOption
|
||||
)}`),
|
||||
});
|
||||
buttonImage: buttonImage ? require(`@/assets/img/tints/${buttonImage}`) : null,
|
||||
};
|
||||
});
|
||||
|
||||
return tintOptions;
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ const routes = [
|
|||
// the saveSessionPromise will no longer point to a valid promise
|
||||
baseMixin.methods.dispatchStoreAction(storeActions.RESET_SAVE_SESSION_PROMISE);
|
||||
|
||||
if (!to.query.fmgPage.startsWith("payment")) {
|
||||
if (!to.query.fmgPage?.startsWith("payment")) {
|
||||
//payment pages used to return from safelitehop so exclude here
|
||||
// Remove the parameter after quote release
|
||||
const loadSessionResponse = await loadSessionIfPresent(
|
||||
|
|
@ -451,6 +451,11 @@ async function DisplayPageError() {
|
|||
|
||||
// we use the pageError querystring as a counter to how many times a user has experienced an error and been routed here.
|
||||
// once they receive more than 1 pageerrors, we'll reset their state to hopefully correct any issues they may be having.
|
||||
var navPage = fmgPageValues.VEHICLE;
|
||||
if (store.getters.payment.insuranceCoverage.isVerified) {
|
||||
navPage = fmgPageValues.VEHICLE_DAMAGE;
|
||||
}
|
||||
|
||||
if (pageError) {
|
||||
var errorCount = Number(pageError);
|
||||
if (errorCount > 1) {
|
||||
|
|
@ -459,19 +464,19 @@ async function DisplayPageError() {
|
|||
|
||||
router.push({
|
||||
path: "/",
|
||||
query: { fmgPage: "vehicle" },
|
||||
query: { fmgPage: navPage },
|
||||
});
|
||||
} else {
|
||||
errorCount++;
|
||||
router.push({
|
||||
path: "/",
|
||||
query: { fmgPage: "vehicle", pageError: errorCount },
|
||||
query: { fmgPage: navPage, pageError: errorCount },
|
||||
});
|
||||
}
|
||||
} else {
|
||||
router.push({
|
||||
path: "/",
|
||||
query: { fmgPage: "vehicle", pageError: "1" },
|
||||
query: { fmgPage: navPage, pageError: "1" },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -514,7 +514,7 @@ export const mutations = {
|
|||
state.order.damage.glassToReplace = sessionInformation.order.damage.glassToReplace;
|
||||
state.order.damage.isRepair = sessionInformation.order.damage.isRepair;
|
||||
state.order.damage.numberOfChips = sessionInformation.order.damage.numberOfChips;
|
||||
state.order.damage.dateOfLoss = sessionInformation.order.damage?.lossDate;
|
||||
state.order.damage.dateOfLoss = sessionInformation.order.damage?.dateOfLoss;
|
||||
state.order.damage.damageCause = sessionInformation.order.damage?.damageCause;
|
||||
|
||||
state.order.damage.partQuestionAnswers =
|
||||
|
|
@ -1101,6 +1101,10 @@ export const actions = {
|
|||
parentAccountNumber,
|
||||
}
|
||||
) {
|
||||
if (!pageName) {
|
||||
return;
|
||||
}
|
||||
|
||||
var payload = {
|
||||
userId: userId,
|
||||
sessionKey: sessionKey,
|
||||
|
|
@ -1146,6 +1150,10 @@ export const actions = {
|
|||
parentAccountNumber,
|
||||
}
|
||||
) {
|
||||
if (!pageName) {
|
||||
return;
|
||||
}
|
||||
|
||||
var payload = {
|
||||
userId: userId,
|
||||
sessionKey: sessionKey,
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
class="d-flex w-100 align-items-center px-2 h-100 list-card-content button-content rounded-3"
|
||||
:class="labelClasses">
|
||||
<img
|
||||
v-if="buttonImage"
|
||||
:id="buttonImageId"
|
||||
:class="!isWide ? 'order-1' : 'ms-auto order-3'"
|
||||
:src="buttonImage"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
process.env.VUE_APP_CONSUMER_CF_DISTRO = "https://digitalapi.dev.safelite.io";
|
||||
process.env.VUE_APP_HERITAGE_FUNNEL = "http://localhost:38000/default.aspx";
|
||||
//process.env.VUE_APP_HERITAGE_FUNNEL = "http://localhost:38000/default.aspx";
|
||||
process.env.VUE_APP_HERITAGE_FUNNEL = "https://fixmyglassdev.safelite.com/default.aspx";
|
||||
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = "AIzaSyDptGCkOPgN2uWJOy4ou4M33phRD4MAoJo";
|
||||
process.env.VUE_APP_CURRENT_ENVIRONMENT = "Localhost";
|
||||
process.env.VUE_APP_MY_ACCOUNT = "https://myaccountdev.safelite.com/";
|
||||
|
|
|
|||
Loading…
Reference in a new issue