From ab626af82f63037e1e421c5e01567bae87716ab8 Mon Sep 17 00:00:00 2001 From: FrankRua Date: Wed, 2 Mar 2022 10:59:51 -0500 Subject: [PATCH 1/4] Populate already selected options --- .../button-question/button-question.vue | 2 +- .../glass-part-question.vue | 26 ++++++++++++++++--- src/layouts/vehicle-parts/vehicle-parts.vue | 14 ++++++++++ src/store/index.js | 4 +-- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/common-components/button-question/button-question.vue b/src/common-components/button-question/button-question.vue index eb199cdf4..f2f87931e 100644 --- a/src/common-components/button-question/button-question.vue +++ b/src/common-components/button-question/button-question.vue @@ -1,7 +1,7 @@ diff --git a/src/layouts/vehicle-parts/vehicle-parts.vue b/src/layouts/vehicle-parts/vehicle-parts.vue index c12aba5b4..0ccfd9c4e 100644 --- a/src/layouts/vehicle-parts/vehicle-parts.vue +++ b/src/layouts/vehicle-parts/vehicle-parts.vue @@ -17,7 +17,7 @@
- + @@ -75,7 +75,7 @@ export default { // Glass Part Question dynamic component Object.keys(vm.$refs) - .filter((r) => r.includes(vm.refPrefix) && vm.$refs[r][0] !== undefined) + .filter((r) => r.includes(vm.RefPrefix) && vm.$refs[r][0] !== undefined) .forEach((c) => vm.$refs[c][0].initializeComponent({ ColorQuestionWidget: resultMap.cmsContent.ColorQuestionWidget, @@ -95,7 +95,6 @@ export default { data() { return { glassParts: {}, - refPrefix: "partQuestion", alertWidgetData: Object, }; }, @@ -110,7 +109,7 @@ export default { computed: { PartsForQuestions() { const partsData = this.$store.getters.pageData(this.$route.query.fmgPage); - const alreadyPopulatedPartsData = this.$store.getters.lineItems.glassParts; + const alreadyPopulatedPartsData = this.$store.getters.lineItems.glassParts === null ? {} : this.$store.getters.lineItems.glassParts; // Map API result data, to vehicle-parts data structure const mappedData = partsData.partsOrQuestions.map(g => { @@ -148,6 +147,10 @@ export default { PartsFromApi() { return store.getters.pageData(fmgPageValues.VEHICLE_PARTS); + }, + + RefPrefix() { + return 'partQuestion'; } }, diff --git a/src/layouts/vehicle-style/vehicle-style.vue b/src/layouts/vehicle-style/vehicle-style.vue index 11653e25d..d7b37b4b0 100644 --- a/src/layouts/vehicle-style/vehicle-style.vue +++ b/src/layouts/vehicle-style/vehicle-style.vue @@ -99,8 +99,8 @@ export default { }, resetDependentState() { // Invokes - store.dispatch(storeActions.RESET_DAMAGE_STATE); - store.dispatch(storeActions.RESET_REGISTRATION_STATE); + store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + store.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); }, }, diff --git a/src/layouts/vehicle-year/vehicle-year.spec.js b/src/layouts/vehicle-year/vehicle-year.spec.js index c04d61b17..5e6d9bf33 100644 --- a/src/layouts/vehicle-year/vehicle-year.spec.js +++ b/src/layouts/vehicle-year/vehicle-year.spec.js @@ -163,8 +163,8 @@ describe("vehicle-year.vue", () => { expect(store.commit).toBeCalledWith(storeMutations.UPDATE_CAR_ID, null) expect(store.commit).toBeCalledWith(storeMutations.UPDATE_VEHICLE_CATEGORY, null) - expect(store.dispatch).toBeCalledWith(storeActions.RESET_DAMAGE_STATE) - expect(store.dispatch).toBeCalledWith(storeActions.RESET_REGISTRATION_STATE) + expect(store.dispatch).toBeCalledWith(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES) + expect(store.dispatch).toBeCalledWith(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES) }); }); diff --git a/src/layouts/vehicle-year/vehicle-year.vue b/src/layouts/vehicle-year/vehicle-year.vue index d73ac46f9..460c8ced4 100644 --- a/src/layouts/vehicle-year/vehicle-year.vue +++ b/src/layouts/vehicle-year/vehicle-year.vue @@ -95,8 +95,8 @@ export default { store.commit(storeMutations.UPDATE_VEHICLE_CATEGORY, null); // Invokes - store.dispatch(storeActions.RESET_DAMAGE_STATE); - store.dispatch(storeActions.RESET_REGISTRATION_STATE); + store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + store.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); } }, components: { diff --git a/src/store/index.js b/src/store/index.js index eaa4e4f67..4b0e06eb4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -122,9 +122,8 @@ export const mutations = { }, resetPartsState(state) { - state.glassParts = null; - state.childParts = null; - state.otherParts = null; + state.order.lineItems.glassParts = null; + state.order.lineItems.otherParts = null; } } diff --git a/src/ux-components/radio/radio.vue b/src/ux-components/radio/radio.vue index cccc0d91d..84267fb01 100644 --- a/src/ux-components/radio/radio.vue +++ b/src/ux-components/radio/radio.vue @@ -42,12 +42,14 @@ export default { }, data() { return { - checkValue: false, + checkValue: Boolean, }; }, created() { if (this.selectedValues) { this.checkValue = this.selectedValues[0] === this.value; + }else{ + this.checkValue = false; } }, methods: { From bcc0114c52c914f98e8d1ec72a74befe7ef9fe55 Mon Sep 17 00:00:00 2001 From: FrankRua Date: Thu, 3 Mar 2022 11:06:53 -0500 Subject: [PATCH 4/4] defect updates --- src/layouts/vehicle-damage/vehicle-damage.vue | 2 +- .../glass-part-question.spec.js | 21 +- .../glass-part-question.vue | 19 + .../vehicle-parts/vehicle-parts.spec.js | 78 ++-- src/layouts/vehicle-parts/vehicle-parts.vue | 363 +++++++++--------- src/ux-components/radio/radio.spec.js | 2 +- 6 files changed, 279 insertions(+), 206 deletions(-) diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 7a4f3e6be..fe567ef55 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -119,7 +119,7 @@ export default { methods: { arePagePrerequisitesValid() { return store.getters.vehicle.carId !== null; - }, + }, resetDependentState() { store.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); }, diff --git a/src/layouts/vehicle-parts/glass-part-question/glass-part-question.spec.js b/src/layouts/vehicle-parts/glass-part-question/glass-part-question.spec.js index ec687023c..a6ef4e586 100644 --- a/src/layouts/vehicle-parts/glass-part-question/glass-part-question.spec.js +++ b/src/layouts/vehicle-parts/glass-part-question/glass-part-question.spec.js @@ -4,6 +4,9 @@ import glassPartQuestion from "@/layouts/vehicle-parts/glass-part-question/glass import store from "@/store"; jest.mock("@/store", () => { return {}; }, { virtual: true }); +store.getters = { + pageData: jest.fn() +}; const featureListData = { colorAnswersProp: [ @@ -93,9 +96,9 @@ describe("glass-part-question.vue", () => { //Act await wrapper.vm.$nextTick(); - wrapper.setData({selectedTint: {"Rear-Stationary" : 'Green Tint' } }); + wrapper.setData({ selectedTint: { "Rear-Stationary": 'Green Tint' } }); - expect(wrapper.vm.selectedTint).toStrictEqual({"Rear-Stationary": 'Green Tint'}); + expect(wrapper.vm.selectedTint).toStrictEqual({ "Rear-Stationary": 'Green Tint' }); await wrapper.vm.ResetTintAndPartSelections(); expect(wrapper.vm.selectedTint).toStrictEqual({}); @@ -107,7 +110,19 @@ describe("glass-part-question.vue", () => { function setupMocks({ glassNameProp, glassLocationProp, colorAnswersProp, modelValueProp }) { //Mock store - const mountOptions = getMountOptions({}); + store.getters.pageData.mockReturnValueOnce({ partsOrQuestions: {}}); + store.getters.lineItems = { glassParts: {} } + + const mountOptions = getMountOptions({ + store: { + getters: store.getters, + }, + route: { + query: { + fmgPage: 'vehicle-parts', + } + }, + }); mountOptions.propsData = { glassName: glassNameProp, diff --git a/src/layouts/vehicle-parts/glass-part-question/glass-part-question.vue b/src/layouts/vehicle-parts/glass-part-question/glass-part-question.vue index fcf27d3ba..7e8639ee0 100644 --- a/src/layouts/vehicle-parts/glass-part-question/glass-part-question.vue +++ b/src/layouts/vehicle-parts/glass-part-question/glass-part-question.vue @@ -147,10 +147,29 @@ export default { }, // Reset selections when tint changes for the same glass to ensure proper selection. + // Also checks if only a single part is present for the tint. ResetTintAndPartSelections() { + this.selectedTint = {}; this.selectedPart = {}; + this.AutoSelectIfSinglePart(); }, + + // Check if only a single part is present for the tint and set the v-model if it is. + AutoSelectIfSinglePart(){ + // Check if the selected tint only has a single feature + const partsData = this.$store.getters.pageData(this.$route.query.fmgPage); + + Object.keys(partsData.partsOrQuestions).forEach((key) => { + const currentGlassSelection = partsData.partsOrQuestions[key]; + + if (currentGlassSelection.glassName === this.glassName && currentGlassSelection.glassLocation === this.glassLocation) { + if (currentGlassSelection.parts.length === 1) { + this.selectedPart = { [currentGlassSelection.glassLocation]: [currentGlassSelection.parts[0].partNumber]}; + } + } + }); + } }, }; diff --git a/src/layouts/vehicle-parts/vehicle-parts.spec.js b/src/layouts/vehicle-parts/vehicle-parts.spec.js index 5d22a458c..74196c524 100644 --- a/src/layouts/vehicle-parts/vehicle-parts.spec.js +++ b/src/layouts/vehicle-parts/vehicle-parts.spec.js @@ -8,13 +8,10 @@ import glassPartQuestion from "@/layouts/vehicle-parts/glass-part-question/glass // Supporting Files import { settleAllPromises } from "@/helpers/layout-helper.js"; -import baseMixin from "@/mixins/base-mixin"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import { nextTick } from "vue"; -import { storeActions } from "@/constants/store-actions"; -import { storeMutations } from "@/constants/store-mutations"; import store from "@/store"; // Mock our module for promises. @@ -70,33 +67,8 @@ describe("vehicle-parts.vue", () => { test("Page header is initialized with api data", async (done) => { //Arrange - store.getters.pageData.mockReturnValueOnce({ - partsOrQuestions: [ - { - glassName: "Stationary", - glassLocation: "Rear", - parts: [ - { - partNumber: "DB12209GTYN", - description: "heated glass, solar, 1 hole", - color: "Green Tint", - requiresRecalibration: false, - requiresCapabilityQuestions: false, - childParts: null - }, - { - partNumber: "DB12209YPYNOEM", - description: "heated glass, solar, 1 hole", - color: "Gray Tint Privacy", - requiresRecalibration: false, - requiresCapabilityQuestions: false, - childParts: null - } - ], - partQuestions: null - } - ] - }); + store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: {} } const pageHeaderWidgetHeaderText = "Select Parts"; const { wrapper, apiPromise } = setupMocks( @@ -117,6 +89,7 @@ describe("vehicle-parts.vue", () => { } }); + //Act vehicleParts.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-parts" } }, @@ -139,6 +112,7 @@ describe("vehicle-parts.vue", () => { }; store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: {} } const { wrapper, apiPromise } = setupMocks( { @@ -181,6 +155,7 @@ describe("vehicle-parts.vue", () => { }; store.getters.pageData.mockReturnValue(basePartResponse); + store.getters.lineItems = { glassParts: {} } const { wrapper, apiPromise } = setupMocks( { @@ -219,6 +194,8 @@ describe("vehicle-parts.vue", () => { //Arrange store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: {} } + const { wrapper } = setupMocks({ mountOptionsMockData: { router: { @@ -250,10 +227,48 @@ describe("vehicle-parts.vue", () => { expect(arePagePrerequisitesValid).toBe(true); }); + test("Initial data, should populate this.glassParts", async () => { + + //Arrange + store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: { 0: { partNumber: 'DB12209YPYNOEM'} } } + + const { wrapper } = setupMocks({ + mountOptionsMockData: { + router: { + navigateAfterSave: jest.fn() + }, + route: { + query: { + fmgPage: 'vehicle-parts', + } + }, + store: { + getters: store.getters + }, + } + }); + + //Act + vehicleParts.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-parts" } }, + undefined, + (c) => c(wrapper.vm) + ); + + await nextTick(); + + //Assert + expect(wrapper.vm.glassParts).toEqual({ "Rear-Stationary": { "Rear": ['DB12209YPYNOEM'] } }); + }); + test("BackButtonAction triggers a router.navigate change", async () => { //Arrange store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: {} } + const { wrapper } = setupMocks({ mountOptionsMockData: { router: { @@ -290,6 +305,9 @@ describe("vehicle-parts.vue", () => { //Arrange store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.lineItems = { glassParts: {} } + + store.commit = jest.fn(); const { wrapper } = setupMocks({ diff --git a/src/layouts/vehicle-parts/vehicle-parts.vue b/src/layouts/vehicle-parts/vehicle-parts.vue index 0ccfd9c4e..7c0efeda7 100644 --- a/src/layouts/vehicle-parts/vehicle-parts.vue +++ b/src/layouts/vehicle-parts/vehicle-parts.vue @@ -1,26 +1,42 @@ diff --git a/src/ux-components/radio/radio.spec.js b/src/ux-components/radio/radio.spec.js index 113d534c6..c815b1ace 100644 --- a/src/ux-components/radio/radio.spec.js +++ b/src/ux-components/radio/radio.spec.js @@ -77,7 +77,7 @@ describe("radio.vue", () => { }); wrapper.vm.handleCheckChange(); // Assert - expect(wrapper.emitted()["isCheckedChanged"][0]).toEqual([{"buttonID": "List Card Checkbox", value: "List Card Checkbox", checkValue: Boolean}]); + expect(wrapper.emitted()["isCheckedChanged"][0]).toEqual([{"buttonID": "List Card Checkbox", value: "List Card Checkbox", checkValue: false}]); }); it("Should set checkValue data if selectedButtonIDs has value(s)", async () => {