diff --git a/src/assets/img/icons/ccpa-icon.svg b/src/assets/img/icons/ccpa-icon.svg
new file mode 100644
index 000000000..30eb3e086
--- /dev/null
+++ b/src/assets/img/icons/ccpa-icon.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/common-components/funnel-header/menu-modal/menu-modal.vue b/src/common-components/funnel-header/menu-modal/menu-modal.vue
index 55ed98dd9..b0ac81691 100644
--- a/src/common-components/funnel-header/menu-modal/menu-modal.vue
+++ b/src/common-components/funnel-header/menu-modal/menu-modal.vue
@@ -35,32 +35,15 @@
-
-
+
+
+
+
+
+
+
+
+
diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js
index 11e2ae4c5..34c5aa3c0 100644
--- a/src/constants/store-actions.js
+++ b/src/constants/store-actions.js
@@ -4,14 +4,15 @@ const storeActions = {
GET_HOMEPAGE_NAME: "getHomepageName",
GET_PAGE_DATA: "getPageData",
- // Vehicle Actions
- GET_VEHICLE_YEARS: "getVehicleYears",
- GET_VEHICLE_MAKES: "getVehicleMakes",
- GET_VEHICLE_MODELS: "getVehicleModels",
- GET_VEHICLE_STYLES: "getVehicleStyles",
- SET_VEHICLE: "setVehicle",
- GET_DAMAGE_OPTIONS: "getDamageOptions",
- GET_EVOX_IMAGE: "getEvoxImage",
+ // Vehicle Actions
+ GET_VEHICLE_YEARS: "getVehicleYears",
+ GET_VEHICLE_MAKES: "getVehicleMakes",
+ GET_VEHICLE_MODELS: "getVehicleModels",
+ GET_VEHICLE_STYLES: "getVehicleStyles",
+ SET_VEHICLE: "setVehicle",
+ GET_DAMAGE_OPTIONS: "getDamageOptions",
+ GET_EVOX_IMAGE: "getEvoxImage",
+ IS_VIN_OPTIONAL_VEHICLE: "isVinOptionalVehicle",
// Lookup Actions
LOOKUP_VEHICLE_BY_YMMS: "lookupVehicleByYmms",
diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js
index e51331779..01d5328f5 100644
--- a/src/helpers/heritage-integration/navigation-helper.js
+++ b/src/helpers/heritage-integration/navigation-helper.js
@@ -3,6 +3,8 @@ import { externalUrls } from "@/router/router-constants/externalUrl-values";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { saveSession } from "@/helpers/heritage-integration/order-helper.js";
import { fmgPageValues } from "@/router/router-constants/fmgPage-values";
+import { storeActions } from "@/constants/store-actions.js";
+import { settleAllPromises } from "@/helpers/layout-helper";
import store from "@/store";
import router from "@/router";
@@ -72,6 +74,17 @@ async function getLatestPageForRedirection() {
fmgPageValues.CAPABILITY_QUESTIONS
);
+ const vinOptionalVehiclePromise = store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE);
+ const promiseResultMap = [
+ {
+ resultKey: "vinOptionalOptions",
+ promise: vinOptionalVehiclePromise,
+ },
+ ];
+ const resultMap = await settleAllPromises(promiseResultMap);
+
+ var isVinOptionalVehicle = resultMap.vinOptionalOptions;
+
if (!vehicleMakeComponent.methods.arePagePrerequisitesValid()) {
return fmgPageValues.VEHICLE_YEAR;
} else if (!vehicleModelComponent.methods.arePagePrerequisitesValid()) {
@@ -91,10 +104,8 @@ async function getLatestPageForRedirection() {
return fmgPageValues.VEHICLE_PARTS;
} else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) {
return fmgPageValues.PART_QUESTIONS;
- } else if (
- vinLookupComponent.methods.arePagePrerequisitesValid() &&
- !store.getters.damage.isRepair
- ) {
+ }
+ else if (vinLookupComponent.methods.arePagePrerequisitesValid() && !store.getters.damage.isRepair && !isVinOptionalVehicle) {
return fmgPageValues.VIN_LOOKUP;
} else {
return fmgPageValues.ESTIMATE;
diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js
index 7e26f4a54..9f9d00516 100644
--- a/src/helpers/heritage-integration/navigation-helper.spec.js
+++ b/src/helpers/heritage-integration/navigation-helper.spec.js
@@ -5,6 +5,7 @@ import {
import * as orderHelper from "@/helpers/heritage-integration/order-helper";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { storeActions } from "@/constants/store-actions";
+import { storeMutations } from "@/constants/store-mutations";
import { setupMocksForJsFiles, getMockOrderInfo } from "@/helpers/unit-test-helper.js";
import { externalUrls } from "@/router/router-constants/externalUrl-values";
import { queryStrings } from "@/constants/query-strings";
@@ -25,6 +26,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: false,
@@ -43,6 +47,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -62,6 +69,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -82,6 +92,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -103,6 +116,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -125,6 +141,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -152,6 +171,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -179,6 +201,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -206,6 +231,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -233,6 +261,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -260,6 +291,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@@ -289,6 +323,9 @@ describe("getPageToRouteExistingOrderTo", () => {
},
};
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
// Act
const result = await getPageToRouteExistingOrderTo(toRoute, true);
diff --git a/src/layouts/estimate/estimate.spec.js b/src/layouts/estimate/estimate.spec.js
index 87c911232..21c0a1cec 100644
--- a/src/layouts/estimate/estimate.spec.js
+++ b/src/layouts/estimate/estimate.spec.js
@@ -61,6 +61,9 @@ describe("estimate.vue", () => {
selectedVinLookupMethod: vinLookupMethodSelections.MANUALVIN,
});
+ store.commit( storeMutations.UPDATE_IS_REPAIR, false );
+ store.commit( storeMutations.UPDATE_MAKE, "acura" );
+
//Act
await wrapper.vm.forwardButtonAction();
@@ -216,8 +219,22 @@ describe("estimate.vue", () => {
});
});
+describe("skipVinLookup", () => {
+ const skipOptions = [[true, true, true],
+ [true, false, true],
+ [false, true, true],
+ [false, false, false]];
+ test.each(skipOptions)("isRepair %s and isVinOptional %s should return %s", async (isRepair, isVinOptionalVehicle, expectedVinSkip) => {
+ const { wrapper } = setupMocks({ isVinOptionalVehicle: isVinOptionalVehicle});
+ store.commit( storeMutations.UPDATE_IS_REPAIR, isRepair);
+
+ expect(wrapper.vm.skipVinLookup).toEqual(expectedVinSkip);
+ });
+});
+
function setupMocks({
groupName = "estimate",
+ isVinOptionalVehicle = false,
cmsQuestionText = "Let's get your VIN. Or we can look it up for you!",
cmsAnswers = [
{ Name: "Provide my VIN manually Most specific to your vehicle" },
@@ -249,6 +266,7 @@ function setupMocks({
mountOptions["attachTo"] = document.body;
const wrapper = shallowMount(estimate, mountOptions);
+ wrapper.vm.isVinOptionalVehicle = isVinOptionalVehicle;
return { wrapper, apiPromise };
}
diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue
index 523e0b103..ece6f72a5 100644
--- a/src/layouts/estimate/estimate.vue
+++ b/src/layouts/estimate/estimate.vue
@@ -5,7 +5,7 @@
-
+
x.partNum === sortedMoldingQuestionAnswersArray[i].partNum
);
+
+ isVinOptionalVehicle(context){
+ switch((context.state.order.vehicle.make).toLowerCase()) {
+ case "mercedes benz":
+ case "volkswagen":
+ case "audi":
+ case "porsche":
+ return true;
+ default:
+ }
+
+ if ((context.state.order.vehicle.make).toLowerCase() === "ford" && context.state.order.vehicle.year >= 2018)
+ return true;
+
+ if ((context.state.order.vehicle.make).toLowerCase() === "bmw" && context.state.order.vehicle.year <= 2017)
+ return true;
+
+ return false;
+ }
+}
if (haveMoldingQuestionAnswersChanged) {
context.commit(storeMutations.UPDATE_GLASS_PARTS, null);
diff --git a/src/store/store.spec.js b/src/store/store.spec.js
index d99e42b82..600a45030 100644
--- a/src/store/store.spec.js
+++ b/src/store/store.spec.js
@@ -2711,3 +2711,28 @@ describe("Getters", () => {
});
});
});
+
+describe("isVinOptionalVehicle", () => {
+ const testVehicles = [["2017", "acura", false],
+ ["2017", "ford", false],
+ ["2018", "ford", true],
+ ["2018", "bmw", false],
+ ["2017", "bmw", true],
+ ["2016", "bmw", true],
+ ["2016", "mercedes benz", true],
+ ["2016", "volkswagen", true],
+ ["2016", "audi", true],
+ ["2016", "porsche", true]];
+ test.each(testVehicles)("%s %s should skip vin lookup is %s", async (year, make, expectedVinSkip) => {
+ const context = state;
+
+ context.state = {
+ order: {
+ vehicle: { year: year, make: make}
+ }
+ };
+
+ var vinOptionalResult = actions.isVinOptionalVehicle(context);
+ expect(vinOptionalResult).toEqual(expectedVinSkip);
+ });
+});
\ No newline at end of file
diff --git a/src/ux-components/text-link/text-link.vue b/src/ux-components/text-link/text-link.vue
index 57f061971..e6cd2aece 100644
--- a/src/ux-components/text-link/text-link.vue
+++ b/src/ux-components/text-link/text-link.vue
@@ -1,19 +1,8 @@
- {{
- text
- }}
-
- {{
- text
- }}
- {{ text }}
+ {{text}}
+
+ {{text}}
+ {{text}}