@@ -70,7 +70,7 @@
@@ -151,7 +151,7 @@ export default {
vm.$refs.backGlassOptions.initializeComponent(
resultMap.damageOptions.backGlassOptions.availableReplacementOptions
);
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
await nextTick();
const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm);
if (isValid) {
@@ -180,6 +180,36 @@ export default {
this.attachCustomEvents();
},
methods: {
+ clearChildEntries() {
+ if (!this.isSideDoorDamageLocation) {
+ this.sideDoorOptionsData = {
+ selectedDoorSides: [],
+ selectedDriverSideReplaceOptions: [],
+ selectedPassengerSideReplaceOptions: [],
+ };
+ } else {
+ if (!this.isDriverSideReplace) {
+ this.sideDoorOptionsData.selectedDriverSideReplaceOptions = [];
+ }
+ if (!this.isPassengerSideReplace) {
+ this.sideDoorOptionsData.selectedPassengerSideReplaceOptions = [];
+ }
+ }
+ if (!this.isRearWindowDamageLocation) {
+ this.selectedRearReplaceOptions = "";
+ }
+ if (!this.isWindshieldDamageLocation) {
+ this.selectedWindshieldOptions = {
+ selectedWindshieldDamageType: "",
+ selectedWindshieldChipCount: null,
+ selectedWindshieldReplaceOptions: [],
+ };
+ } else {
+ if (!this.isWindshieldRepair) {
+ this.selectedWindshieldOptions.selectedWindshieldChipCount = null;
+ }
+ }
+ },
arePagePrerequisitesValid() {
if (store.getters.vehicle.carId) {
return true;
@@ -584,6 +614,94 @@ export default {
shouldHideBackButton() {
return this.$store.getters.requiresVerifiedRedirecting;
},
+ isContinueEnabled() {
+ return (
+ this.isAnyDamageSelected &&
+ this.isWindshieldValid &&
+ this.isRearGlassValid &&
+ this.isSideGlassValid
+ );
+ },
+ isAnyDamageSelected() {
+ return this.selectedDamageLocations != null && this.selectedDamageLocations.length != 0;
+ },
+ isSideGlassValid() {
+ if (this.isSideDoorDamageLocation) {
+ if (
+ this.sideDoorOptionsData.selectedDoorSides == null ||
+ this.sideDoorOptionsData.selectedDoorSides == 0
+ ) {
+ // SideDoor is selected, but "which side" question is unanswered
+ return false;
+ } else {
+ if (this.isPassengerSideReplace) {
+ if (
+ this.sideDoorOptionsData.selectedPassengerSideReplaceOptions == null ||
+ this.sideDoorOptionsData.selectedPassengerSideReplaceOptions.length == 0
+ ) {
+ // PassengerSide is selected, but no sub option is
+ return false;
+ }
+ }
+ if (this.isDriverSideReplace) {
+ if (
+ this.sideDoorOptionsData.selectedDriverSideReplaceOptions == null ||
+ this.sideDoorOptionsData.selectedDriverSideReplaceOptions.length == 0
+ ) {
+ // DriverSide is selected, but no sub option is
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ },
+ isRearGlassValid() {
+ if (this.isRearWindowDamageLocation) {
+ if (!this.selectedRearReplaceOptions) {
+ // RearDoor is selected, but rear option question is unanswered
+ return false;
+ }
+ }
+ return true;
+ },
+ isWindshieldValid() {
+ if (this.isWindshieldDamageLocation) {
+ if (!this.selectedWindshieldOptions.selectedWindshieldDamageType) {
+ // Windshield is selected but no replace/repair option is selected
+ return false;
+ } else {
+ if (this.hasSplitSingleConflict) {
+ return false;
+ }
+ if (this.isWindshieldRepair) {
+ if (this.hasRepairReplaceConflict) {
+ return false;
+ }
+ if (!this.selectedWindshieldOptions.selectedWindshieldChipCount) {
+ // Repair selected but no chips selected
+ return false;
+ }
+ } else {
+ if (
+ this.selectedWindshieldOptions.selectedWindshieldReplaceOptions ==
+ null ||
+ this.selectedWindshieldOptions.selectedWindshieldReplaceOptions
+ .length == 0
+ ) {
+ // Replace selected but follow-up split/single question not answered
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ },
+ },
+ watch: {
+ selectedDamageLocations() {
+ this.clearChildEntries();
+ },
},
components: {
diff --git a/src/layouts/vehicle-parts/vehicle-parts.vue b/src/layouts/vehicle-parts/vehicle-parts.vue
index 5361c5e7e..bf21b1749 100644
--- a/src/layouts/vehicle-parts/vehicle-parts.vue
+++ b/src/layouts/vehicle-parts/vehicle-parts.vue
@@ -102,7 +102,7 @@ export default {
FeatureQuestionWidget: resultMap.cmsContent.FeatureQuestionWidget,
})
);
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
baseMixin.methods.ResetExternalParamsAndHideModal();
}
});
diff --git a/src/layouts/vehicle/vehicle.spec.js b/src/layouts/vehicle/vehicle.spec.js
index 8aaab5008..d4bc1f726 100644
--- a/src/layouts/vehicle/vehicle.spec.js
+++ b/src/layouts/vehicle/vehicle.spec.js
@@ -28,7 +28,7 @@ jest.mock("@/store", () => ({
applicationUser: {
experiments: [{ universeName: "ConceptFunnel" }],
},
- isExternalParameter: false,
+ externalParameterState: { isExternalParameter: false },
externalParameterVehicle: {
year: null,
make: null,
@@ -94,7 +94,7 @@ describe("vehicle.vue", () => {
describe("vehicle.vue", () => {
test("should call forwardButtonAction if isExternalParameter is true and form is valid", async () => {
- store.getters.isExternalParameter = true;
+ store.getters.externalParameterState.isExternalParameter = true;
// Create a shallow mount of MyComponent
const { wrapper } = setupMocks();
// Set displayNoServiceAlert to false
diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue
index 56f966ac7..7f629db0a 100644
--- a/src/layouts/vehicle/vehicle.vue
+++ b/src/layouts/vehicle/vehicle.vue
@@ -221,7 +221,7 @@ export default {
let resultMap = await settleAllPromises(promiseResultMap);
//ExternalParameter widget have different case style value so need to parse with NextGen
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
if (
makeQuestionInitialDataPromise &&
modelQuestionInitialDataPromise &&
@@ -269,7 +269,7 @@ export default {
resultMap.modelQuestionInitialData,
resultMap.styleQuestionInitialData
);
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
await vm.getVehicleDetails();
if (!vm.displayNoServiceAlert) {
const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm);
diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue
index ddb24f924..b63158680 100644
--- a/src/layouts/vin-lookup/vin-lookup.vue
+++ b/src/layouts/vin-lookup/vin-lookup.vue
@@ -192,7 +192,7 @@ export default {
// Call the "next" function to complete the transition to this page.
next((vm) => {
vm.setCmsContent(resultMap.cmsContent);
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
baseMixin.methods.ResetExternalParamsAndHideModal();
}
});
diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js
index 9ce6874ae..416113d2e 100644
--- a/src/mixins/analytics-mixin.js
+++ b/src/mixins/analytics-mixin.js
@@ -37,9 +37,11 @@ export default {
const currentPageName = getPageNameByQueryString();
await this.validateSession();
+ const submittedOrder = baseMixin.methods.getSubmittedOrder();
+
const refSequenceNum =
store.getters.order.referralSequenceNumber ||
- store.getters.submittedOrder?.referralSequenceNumber;
+ submittedOrder?.referralSequenceNumber;
var payload = {
userId: getUserIdValue(),
@@ -125,8 +127,9 @@ export default {
const isDefined = (x) => x !== null && x !== undefined;
// Get correct order object
- const hasSubmittedOrder = store.getters.hasSubmittedOrder;
- const order = hasSubmittedOrder ? store.getters.submittedOrder : store.getters.order;
+ const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder();
+ const submittedOrder = baseMixin.methods.getSubmittedOrder();
+ const order = hasSubmittedOrder ? submittedOrder : store.getters.order;
// Begin assembling payload for data layer
const payload = {};
diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js
index e56840c61..87d85e952 100644
--- a/src/mixins/analytics-mixin.spec.js
+++ b/src/mixins/analytics-mixin.spec.js
@@ -21,6 +21,7 @@ import {
getSessionKeyValue,
getUserIdValue,
} from "@/helpers/heritage-integration/cookie-helper";
+import baseMixin from "./base-mixin";
const parts = {
windshield: {
@@ -470,8 +471,9 @@ describe("analyticsMixin.js", () => {
test("Pushes correct data when submitted order is present", () => {
// Arrange
window.dataLayer = [];
- store.getters.hasSubmittedOrder = true;
- store.getters.submittedOrder = store.getters.order;
+ baseMixin.methods.hasSubmittedOrder = jest.fn().mockReturnValue(true);
+ baseMixin.methods.getSubmittedOrder = jest.fn().mockReturnValue(store.getters.order);
+
store.getters.order = {
vehicle: {
year: null,
diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js
index 109f90d04..571ac3638 100644
--- a/src/mixins/base-mixin.js
+++ b/src/mixins/base-mixin.js
@@ -102,6 +102,12 @@ export default {
});
return filteredLineItems;
},
+ filterOutRecalibration(lineItems) {
+ const filteredLineItems = lineItems.filter((item) => {
+ return item.partType != partTypeStrings.RECALIBRATION;
+ });
+ return filteredLineItems;
+ },
getTotalPriceOfAllLineItemsAndChildParts(lineItems, includeTax) {
let totalPrice = 0;
lineItems.forEach((lineItem) => {
@@ -160,9 +166,7 @@ export default {
);
}
- const order = store.getters.hasSubmittedOrder
- ? store.getters.submittedOrder
- : store.getters.order;
+ const order = this.hasSubmittedOrder() ? this.getSubmittedOrder() : store.getters.order;
if (
order.payment.insuranceCoverage.isVerified &&
@@ -218,6 +222,12 @@ export default {
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
},
+ getSubmittedOrder() {
+ return JSON.parse(window.sessionStorage.getItem("submittedOrder"));
+ },
+ hasSubmittedOrder() {
+ return window.sessionStorage.getItem("submittedOrder") !== null;
+ },
},
computed: {
storeActions() {
diff --git a/src/mixins/base-mixin.spec.js b/src/mixins/base-mixin.spec.js
index 77295b33f..9a062a831 100644
--- a/src/mixins/base-mixin.spec.js
+++ b/src/mixins/base-mixin.spec.js
@@ -226,15 +226,16 @@ describe("baseMixin.js", () => {
const payment = { insuranceCoverage: { isVerified: true } };
const policy = { isNoComp: false, isItac: false, currentDeductible: 250 };
+ mixIn.methods.hasSubmittedOrder = jest.fn().mockReturnValue(true);
+ mixIn.methods.getSubmittedOrder = jest.fn().mockReturnValue({
+ payment: payment,
+ policy: policy,
+ });
+
store.getters = {
payment: {},
policy: {},
order: {},
- submittedOrder: {
- payment: payment,
- policy: policy,
- },
- hasSubmittedOrder: true,
};
var amtDue = mixIn.methods.getAmountDue(lineItems);
@@ -301,6 +302,8 @@ describe("baseMixin.js", () => {
const payment = { isInsurance: null, insuranceCoverage: { isVerified: null } };
const policy = { isNoComp: false, isItac: false, currentDeductible: 0 };
+ mixIn.methods.hasSubmittedOrder = jest.fn().mockReturnValue(false);
+
store.getters = {
payment: payment,
policy: policy,
diff --git a/src/router/index.js b/src/router/index.js
index 23b61282c..4549f9e7c 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -64,7 +64,7 @@ const routes = [
}
// Intercept all navigation if a submitted order exists in storage
- if (store.getters.hasSubmittedOrder) {
+ if (window.sessionStorage.getItem("submittedOrder") !== null) {
if (to.query.fmgPage !== funnelStartPageName) {
to.query.fmgPage = fmgPageValues.CONFIRMATION;
}
@@ -245,7 +245,7 @@ router.beforeEach(async (to, from, next) => {
const notToPIAReturn = toQueryPage != fmgPageValues.PAYMENT_PIA_RETURN;
const isInIframe = window !== window.top;
- if (store.getters.isExternalParameter) {
+ if (store.getters.externalParameterState?.isExternalParameter) {
// Check if alert event is on the bus
const alertEvent = eventBus.readEventFromBus(
globalEvents.Categories.GLOBAL_ALERT,
@@ -295,7 +295,7 @@ router.afterEach(async (to, from) => {
await saveSession({ pageNameToLog: to.query.fmgPage });
}
}
- if (!store.getters.isExternalParameter) {
+ if (!store.getters.externalParameterState?.isExternalParameter) {
showFmgLoadingModal(false);
}
@@ -409,6 +409,7 @@ async function navigate(
const zip = getQuerystringParameter(queryStrings.ZIP_CODE);
const promo = getQuerystringParameter(queryStrings.PROMO);
const pageError = getQuerystringParameter(queryStrings.PAGE_ERROR);
+ const log = getQuerystringParameter(queryStrings.LOG);
if (
hasZip &&
@@ -428,6 +429,10 @@ async function navigate(
queryStringsObject[queryStrings.PAGE_ERROR] = pageError;
}
+ if (log) {
+ queryStringsObject[queryStrings.LOG] = log;
+ }
+
router.push({
name: "root",
query: Object.assign(optionalQuery, queryStringsObject),
diff --git a/src/store/index.js b/src/store/index.js
index aa5747a0f..5c04398ac 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -883,8 +883,6 @@ export const getters = {
.filter((x) => !!x.isActive)
.map((x) => x.settings)
.reduce((r, c) => Object.assign(r, c), {}) ?? {},
- submittedOrder: (state) => JSON.parse(window.sessionStorage.getItem("submittedOrder")),
- hasSubmittedOrder: (state) => window.sessionStorage.getItem("submittedOrder") !== null,
isVerifiedAndDeductibleZeroConfirmed: (state) => {
// used as a CMS variable on /payment-method, needed for FunnelSubHeaderWidget on cart pages
if (
@@ -900,7 +898,7 @@ export const getters = {
requiresVerifiedRedirecting: (state) => {
return state.order?.referralNumber?.length === 6;
},
- isExternalParameter: (state) => externalParameterState?.isExternalParameter,
+ externalParameterState: (state) => externalParameterState,
externalParameterVehicle: (state) => externalParameterState?.vehicle,
externalParameterDamage: (state) => externalParameterState?.vehicleDamage,
externalParameterQuote: (state) => externalParameterState?.quote,
@@ -2798,7 +2796,7 @@ export const actions = {
},
createSubmittedOrder(context) {
- if (context.getters.hasSubmittedOrder) {
+ if (window.sessionStorage.getItem("submittedOrder") !== null) {
return;
}