From be19ba761083b6bd464a2e1193001fb161a5b03c Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Tue, 24 Jun 2025 19:11:19 +0530 Subject: [PATCH] CASH-813 New mobile-details page --- src/constants/progress-bar-mapper.js | 1 + src/constants/store-actions.js | 1 + src/constants/store-mutations.js | 1 + .../customer-details/customer-details.vue | 19 +- .../mobile-address-questions.spec.js | 198 +++++++++++++++ .../mobile-address-questions.vue | 223 ++++++++++++++++ .../mobile-details/mobile-details.spec.js | 139 ++++++++++ src/layouts/mobile-details/mobile-details.vue | 168 +++++++++++++ .../service-location/service-location.spec.js | 238 ------------------ .../service-location/service-location.vue | 151 +++++------ src/router/constants/navigation-scenarios.js | 6 + src/router/constants/routes.js | 4 + src/router/constants/routing-table.js | 21 ++ src/router/methods/routes.js | 1 + src/store/index.js | 9 + 15 files changed, 854 insertions(+), 326 deletions(-) create mode 100644 src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.spec.js create mode 100644 src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.vue create mode 100644 src/layouts/mobile-details/mobile-details.spec.js create mode 100644 src/layouts/mobile-details/mobile-details.vue diff --git a/src/constants/progress-bar-mapper.js b/src/constants/progress-bar-mapper.js index 98ae07992..dc1bc4a05 100644 --- a/src/constants/progress-bar-mapper.js +++ b/src/constants/progress-bar-mapper.js @@ -15,6 +15,7 @@ const pagePercentageMapper = { "insurance-company": 52, "service-location": 60, schedule: 72, + "mobile-details": 76, "customer-details": 84, "payment-method": 92, payment: 96, diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 9f0965480..d726819a1 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -78,6 +78,7 @@ const storeActions = { SAVE_VIN_LOOKUP: "saveVinLookup", SAVE_SERVICE_ZIP_CODE_INFO: "saveServiceZipCodeInfo", SAVE_SERVICE_LOCATION: "saveServiceLocation", + SAVE_MOBILE_DETAILS: "saveMobileDetails", SAVE_SCHEDULE: "saveSchedule", SAVE_EMAIL: "saveEmail", SAVE_PHONE_NUMBER: "savePhoneNumber", diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index f7e8d9f4b..2112c789c 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -38,6 +38,7 @@ const storeMutations = { UPDATE_SERVICE_ZIP: "updateServiceZip", UPDATE_SERVICE_LOCATION: "updateServiceLocation", + UPDATE_MOBILE_DETAILS: "updateMobileDetails", UPDATE_SERVICE_LOCATION_TECH_NOTES: "updateServiceLocationTechNotes", UPDATE_SCHEDULE: "updateSchedule", diff --git a/src/layouts/customer-details/customer-details.vue b/src/layouts/customer-details/customer-details.vue index e3549b813..f473aa50b 100644 --- a/src/layouts/customer-details/customer-details.vue +++ b/src/layouts/customer-details/customer-details.vue @@ -85,6 +85,7 @@ import { Form, defineRule } from "vee-validate"; import store from "@/store"; import { paymentMethods } from "@/constants/payment-method-constants"; import { flushSaveSessionQueue } from "@/helpers/heritage-integration/order-helper"; +import { AppointmentTypeStrings } from "@/constants/schedule-constants"; // DEFINE VALIDATION RULES defineRule("first-name-required", required(errorMessages.FIRST_NAME_REQUIRED)); @@ -157,11 +158,21 @@ export default { getTechNotesFromStore() { return store.getters.order.serviceLocation.techNotes; }, + getSelectedAppointmentType() { + return store.getters.order.serviceLocation.appointmentType; + }, backButtonAction() { - this.$router.navigateWithoutSaving( - this.navigationScenarios.CLICKED_BACK, - this.pageName - ); + if (this.getSelectedAppointmentType() == AppointmentTypeStrings.MOBILE) { + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_BACK_WITH_MOBILE_SERVICE, + this.pageName + ); + } else { + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_BACK, + this.pageName + ); + } }, async forwardButtonAction() { this.dispatchStoreAction( diff --git a/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.spec.js b/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.spec.js new file mode 100644 index 000000000..06a3ca901 --- /dev/null +++ b/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.spec.js @@ -0,0 +1,198 @@ +// Components +import mobileAddressQuestions from "@/layouts/mobile-details/mobile-address-questions/mobile-address-questions.vue"; + +// Supporting Files +import { mount, shallowMount } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import { storeMutations } from "@/constants/store-mutations"; +import store from "@/store"; + +describe("initial state", () => { + test("Should show all the address field", () => { + // Arrange + const { wrapper } = setupMocks({}); + + // Assert + const streetAddressField = wrapper.findComponent({ ref: "streetAddress" }); + const cityField = wrapper.findComponent({ ref: "city" }); + const stateField = wrapper.findComponent({ ref: "state" }); + const zipCodeField = wrapper.findComponent({ ref: "zipCode" }); + + expect(streetAddressField.exists()).toBe(true); + expect(streetAddressField.isVisible()).toBe(true); + expect(cityField.exists()).toBe(true); + expect(cityField.isVisible()).toBe(true); + expect(stateField.exists()).toBe(true); + expect(stateField.isVisible()).toBe(true); + expect(zipCodeField.exists()).toBe(true); + expect(zipCodeField.isVisible()).toBe(true); + }); + + test("Should render mobileAddressQuestions sub-components (textbox-questions and dropdown-questions)", async () => { + // Arrange + const { wrapper } = setupMocks({}); + + // Act + const streetAddress = wrapper.findComponent({ ref: "streetAddress" }); + const city = wrapper.findComponent({ ref: "city" }); + const state = wrapper.findComponent({ ref: "state" }); + const zipCode = wrapper.findComponent({ ref: "zipCode" }); + + // Assert + expect(streetAddress.exists()).toBe(true); + expect(city.exists()).toBe(true); + expect(state.exists()).toBe(true); + expect(zipCode.exists()).toBe(true); + }); + + test("Should render apartmentNumberOrBusinessName textbox-question when captureApartmentNumberOrBusinessName = true", async () => { + // Arrange + const { wrapper } = setupMocks({ + props: { + modelValue: { + streetAddress: "", + apartmentNumberOrBusinessName: "", + city: "", + state: "", + zipCode: "", + }, + captureApartmentNumberOrBusinessName: true, + }, + }); + + // Act + const streetAddress = wrapper.findComponent({ ref: "streetAddress" }); + const apartmentNumberOrBusinessName = wrapper.findComponent({ + ref: "apartmentNumberOrBusinessName", + }); + const city = wrapper.findComponent({ ref: "city" }); + const state = wrapper.findComponent({ ref: "state" }); + const zipCode = wrapper.findComponent({ ref: "zipCode" }); + + // Assert + expect(streetAddress.exists()).toBe(true); + expect(apartmentNumberOrBusinessName.exists()).toBe(true); + expect(apartmentNumberOrBusinessName.isVisible()).toBe(true); + expect(city.exists()).toBe(true); + expect(state.exists()).toBe(true); + expect(zipCode.exists()).toBe(true); + }); + + test("Should *not* render apartmentNumberOrBusinessName textbox-question when captureApartmentNumberOrBusinessName = false", async () => { + // Arrange + const { wrapper } = setupMocks({ + props: { + modelValue: { + streetAddress: "", + apartmentNumberOrBusinessName: "", + city: "", + state: "", + zipCode: "", + }, + captureApartmentNumberOrBusinessName: false, + }, + }); + + // Act + const streetAddress = wrapper.findComponent({ ref: "streetAddress" }); + const apartmentNumberOrBusinessName = wrapper.findComponent({ + ref: "apartmentNumberOrBusinessName", + }); + const city = wrapper.findComponent({ ref: "city" }); + const state = wrapper.findComponent({ ref: "state" }); + const zipCode = wrapper.findComponent({ ref: "zipCode" }); + + // Assert + expect(streetAddress.exists()).toBe(true); + expect(apartmentNumberOrBusinessName.exists()).toBe(true); + expect(apartmentNumberOrBusinessName.isVisible()).toBe(false); + expect(city.exists()).toBe(true); + expect(state.exists()).toBe(true); + expect(zipCode.exists()).toBe(true); + }); +}); + +describe("happy paths", () => { + test("full street address is passed in => address fields are displayed", async () => { + // Arrange/Act + const { wrapper } = setupMocks({ + props: { + modelValue: { + streetAddress: "12345 Test Road", + city: "Tests", + state: "OH", + zipCode: "12312", + }, + }, + }); + + await wrapper.vm.$nextTick(); + + // Assert + const cityField = wrapper.findComponent({ ref: "city" }); + const stateField = wrapper.findComponent({ ref: "state" }); + const zipField = wrapper.findComponent({ ref: "zipCode" }); + expect(cityField.exists()).toBeTruthy(); + expect(cityField.isVisible()).toBeTruthy(); + expect(stateField.exists()).toBeTruthy(); + expect(cityField.isVisible()).toBeTruthy(); + expect(zipField.exists()).toBeTruthy(); + expect(cityField.isVisible()).toBeTruthy(); + }); +}); + +function setupMocks({ + mountOptions, + props, + isShallowMount = true, + querySelectorFunction, + geocoderResult = ["1234 Test Street"], + matchFound = false, +}) { + store.commit(storeMutations.RESET_STATE); + + const resultingMountOptions = getMountOptions({ + ...mountOptions, + router: { + navigate: jest.fn(), + navigate: jest.fn(), + }, + loadScript: jest.fn().mockResolvedValue(), + }); + + if (props) resultingMountOptions.propsData = props; + + if (isShallowMount) { + resultingMountOptions.global.stubs = { + ...(resultingMountOptions.global.stubs ?? {}), + textboxQuestion: { + template: ``, + methods: { + handleChange: jest.fn(), + }, + }, + dropdownQuestion: { + template: ``, + methods: { + handleChange: jest.fn(), + }, + }, + }; + } + + const wrapper = isShallowMount + ? shallowMount(mobileAddressQuestions, resultingMountOptions) + : mount(mobileAddressQuestions, resultingMountOptions); + + document.querySelector = jest.fn().mockImplementation((query) => { + let result = null; + if (query == ".pac-container") result = document.createElement("div"); + else if (querySelectorFunction) { + result = querySelectorFunction(query); + } + + return result ?? null; + }); + + return { wrapper }; +} diff --git a/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.vue b/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.vue new file mode 100644 index 000000000..40a50d47e --- /dev/null +++ b/src/layouts/mobile-details/mobile-address-questions/mobile-address-questions.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/layouts/mobile-details/mobile-details.spec.js b/src/layouts/mobile-details/mobile-details.spec.js new file mode 100644 index 000000000..8ed9e27b7 --- /dev/null +++ b/src/layouts/mobile-details/mobile-details.spec.js @@ -0,0 +1,139 @@ +import mobileDetails from "@/layouts/mobile-details/mobile-details.vue"; +import { mount, shallowMount } from "@vue/test-utils"; +import { storeActions } from "@/constants/store-actions"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import store from "@/store"; + +const linkWidgetName = "linkWidgetName"; +const modalWidgetName = "modalWidgetName"; + +const mockLinkCmsContent = { + BodyText: "Sample link body text here.", +}; + +const mockModalCmsContent = { + FooterText: "Sample modal footer text here.", +}; + +const mockMixin = { + methods: { + getCmsContent: jest.fn((widgetName, cmsFieldName) => { + if (widgetName === linkWidgetName) { + return mockLinkCmsContent[cmsFieldName]; + } + + if (widgetName === modalWidgetName) { + return mockModalCmsContent[cmsFieldName]; + } + + return null; + }), + dispatchStoreAction: jest.fn((actionName) => { + if (actionName === storeActions.SAVE_MOBILE_DETAILS) { + return true; + } + }), + }, +}; + +beforeEach(() => { + store.getters = { + order: { + serviceLocation: { + zipCode: "43235", + zipCodeCtu: "00000", + state: "OH", + appointmentType: "Mobile", + city: "Columbus", + address: "123 Main St", + address2: "Suite 100", + isVehicleProtected: true, + }, + schedule: { + date: "2023-10-10", + endTime: "14:00", + startTime: "13:00", + routeCode: "R1", + jobMaxMinutes: "60", + jobMinMinutes: "30", + }, + }, + payment: { + isInsurance: false, + }, + }; +}); + +describe("mobile-details.vue", () => { + test("if the continue button is clicked, navigate forward", async () => { + // Arrange + const { wrapper } = setupMocks(mobileDetails, { + mixins: [mockMixin], + attachTo: document.body, + }); + + wrapper.setData({ + addressQuestions: { + streetAddress: "Test Street", + apartmentNumberOrBusinessName: "Test Apartment", + city: "Test City", + state: "TS", + zipCode: "12345", + }, + isVehicleProtected: true, + }); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); + }); + test("arePagePrerequisitesValid should be true ", async () => { + //Arrange + const { wrapper } = setupMocks(mobileDetails, { + mixins: [mockMixin], + attachTo: document.body, + }); + + //Act + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); + + test("if the back button is clicked, navigate back", async () => { + // Arrange + const { wrapper } = setupMocks(mobileDetails, { + mixins: [mockMixin], + attachTo: document.body, + }); + + // Act + await wrapper.vm.backButtonAction(); + + // Assert + expect(wrapper.vm.$router.navigateWithoutSaving).toHaveBeenCalled(); + }); +}); + +function setupMocks({ mountOptions, mixins, props, isShallowMount = true }) { + const resultingMountOptions = getMountOptions({ + ...mountOptions, + mixins, + router: { + navigate: jest.fn(), + navigateWithSaving: jest.fn(), + navigateWithoutSaving: jest.fn(), + }, + }); + + if (props) resultingMountOptions.propsData = props; + resultingMountOptions["attachTo"] = document.body; + const wrapper = isShallowMount + ? shallowMount(mobileDetails, resultingMountOptions) + : mount(mobileDetails, resultingMountOptions); + + return { wrapper }; +} diff --git a/src/layouts/mobile-details/mobile-details.vue b/src/layouts/mobile-details/mobile-details.vue new file mode 100644 index 000000000..25268805c --- /dev/null +++ b/src/layouts/mobile-details/mobile-details.vue @@ -0,0 +1,168 @@ + + diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index 58187496e..551e15ae0 100644 --- a/src/layouts/service-location/service-location.spec.js +++ b/src/layouts/service-location/service-location.spec.js @@ -314,57 +314,6 @@ describe("service-location.vue", () => { expect(wrapper.vm.serviceZipCodeQuestion).toStrictEqual(newServiceZipCodeQuestion); }); - test("resets mobile location when service zip code is updated", () => { - // Arrange - const { wrapper } = setupMocks({}); - - const mobileLocationQuestionsComponent = wrapper.findComponent({ - ref: "mobileLocationQuestions", - }); - mobileLocationQuestionsComponent.resetComponent = jest.fn(); - - const serviceZipCodeComponent = wrapper.findComponent({ - ref: "serviceZipCodeQuestion", - }); - serviceZipCodeComponent.resetMobileFeePart = jest.fn(); - - const newServiceZipCodeQuestion = { - zipCode: "61606", - state: "IL", - zipCodeCtu: "01526", - }; - - const mobileLocationQuestions = { - addressQuestions: { - streetAddress: "5555 Sulgrave Dr", - apartmentNumberOrBusinessName: "Apt 1", - city: "New Albany", - state: "OH", - zipCode: "43054", - }, - isVehicleProtected: true, - }; - wrapper.vm.mobileLocationQuestions = mobileLocationQuestions; - - const newMobileLocationQuestions = { - addressQuestions: { - streetAddress: "", - apartmentNumberOrBusinessName: "", - city: "", - state: "IL", - zipCode: "61606", - }, - isVehicleProtected: null, - isMobileSelected: false, - }; - - // Act - serviceZipCodeComponent.vm.$emit("update:modelValue", newServiceZipCodeQuestion); - - // Assert - expect(wrapper.vm.mobileLocationQuestions).toStrictEqual(newMobileLocationQuestions); - }); - test("resets appointment type selection when service zip code is updated by service zip modal", () => { // Arrange const { wrapper } = setupMocks({}); @@ -424,190 +373,6 @@ describe("service-location.vue", () => { }); }); - describe("updating mobile location", () => { - test("updates the page model after providing the mobile location", async () => { - // Arrange - const { wrapper } = setupMocks({}); - - await wrapper.setData({ - shopProviderData: { - mobileProviderNumber: "001820", - }, - selectedAppointmentType: "Mobile", - providerData: { mobileProviderNumber: "01820" }, - isGlassServiceableMobile: true, - }); - - const mobileLocationQuestionsComponent = wrapper.findComponent({ - ref: "mobileLocationQuestions", - }); - mobileLocationQuestionsComponent.resetComponent = jest.fn(); - - const serviceZipCodeComponent = wrapper.findComponent({ - ref: "serviceZipCodeQuestion", - }); - serviceZipCodeComponent.resetMobileFeePart = jest.fn(); - wrapper.vm.forwardButtonAction = jest.fn(); - - const mobileLocationQuestions = { - addressQuestions: { - streetAddress: "", - apartmentNumberOrBusinessName: "", - city: "", - state: "", - zipCode: "", - }, - isVehicleProtected: null, - }; - wrapper.vm.mobileLocationQuestions = mobileLocationQuestions; - const newMobileLocationQuestions = { - addressQuestions: { - streetAddress: "5555 Sulgrave Dr", - apartmentNumberOrBusinessName: "Apt 1", - city: "New Albany", - state: "OH", - zipCode: "43054", - }, - isVehicleProtected: true, - isMobileSelected: true, - }; - - // Act - - // Trigger the event - await mobileLocationQuestionsComponent.vm.$emit( - "setMobileLocation", - newMobileLocationQuestions - ); - - await wrapper.vm.$nextTick(); // Wait for DOM updates - - // Assert - expect(wrapper.vm.mobileLocationQuestions).toStrictEqual(newMobileLocationQuestions); - }); - - test("resets service zip code when mobile location is updated", async () => { - // Arrange - const { wrapper } = setupMocks({}); - - await wrapper.setData({ - shopProviderData: { - mobileProviderNumber: "001820", - }, - selectedAppointmentType: "Mobile", - providerData: { mobileProviderNumber: "01820" }, - isGlassServiceableMobile: true, - }); - - const mobileLocationQuestionsComponent = wrapper.findComponent({ - ref: "mobileLocationQuestions", - }); - mobileLocationQuestionsComponent.resetComponent = jest.fn(); - - const serviceZipCodeComponent = wrapper.findComponent({ - ref: "serviceZipCodeQuestion", - }); - serviceZipCodeComponent.resetMobileFeePart = jest.fn(); - wrapper.vm.forwardButtonAction = jest.fn(); - const mobileLocationQuestions = { - addressQuestions: { - streetAddress: "", - apartmentNumberOrBusinessName: "", - city: "", - state: "", - zipCode: "", - }, - isVehicleProtected: null, - isMobileSelectedAndModalClosed: false, - mobileFeePart: null, - }; - wrapper.vm.mobileLocationQuestions = mobileLocationQuestions; - - const newMobileLocationQuestions = { - addressQuestions: { - streetAddress: "5555 Rustic Dr", - apartmentNumberOrBusinessName: "Apt 1", - city: "Westerville", - state: "OH", - zipCode: "43081", - }, - isVehicleProtected: true, - isMobileSelectedAndModalClosed: true, - mobileFeePart: null, - }; - - wrapper.vm.serviceZipCodeQuestion = { - zipCode: "61606", - state: "IL", - zipCodeCtu: "01526", - }; - - const newServiceZipCodeInfo = { - state: "OH", - zipCode: "43081", - zipCodeCtu: "01526", - }; - - wrapper.vm.closeModalAction = jest.fn(); - // Act - - // Trigger the event - await mobileLocationQuestionsComponent.vm.$emit( - "setMobileLocation", - newMobileLocationQuestions - ); - - await wrapper.vm.$nextTick(); // Wait for DOM updates - - // Assert - expect(wrapper.vm.serviceZipCodeQuestion).toStrictEqual(newServiceZipCodeInfo); - }); - - test("does not reset appointment type selection when service zip code is updated by mobile location modal when Mobile is selected", async () => { - // Arrange - const { wrapper } = setupMocks({}); - - await wrapper.setData({ - shopProviderData: { - mobileProviderNumber: "001820", - }, - selectedAppointmentType: "Mobile", - providerData: { mobileProviderNumber: "01820" }, - }); - - const mobileLocationQuestionsComponent = wrapper.findComponent({ - ref: "mobileLocationQuestions", - }); - mobileLocationQuestionsComponent.resetComponent = jest.fn(); - wrapper.vm.forwardButtonAction = jest.fn(); - wrapper.vm.isServiceableMobile = true; - - const serviceZipCodeComponent = wrapper.findComponent({ - ref: "serviceZipCodeQuestion", - }); - serviceZipCodeComponent.resetMobileFeePart = jest.fn(); - - const mobileLocationQuestions = { - addressQuestions: { - streetAddress: "555 Some Street", - apartmentNumberOrBusinessName: "", - city: "Westerville", - state: "OH", - zipCode: "43081", - }, - isVehicleProtected: "YesAnswer", - isMobileSelectedAndModalClosed: true, - }; - - wrapper.vm.closeModalAction = jest.fn(); - // Act - mobileLocationQuestionsComponent.vm.$emit("setMobileLocation", mobileLocationQuestions); - - // Assert - expect(wrapper.vm.selectedAppointmentType).toStrictEqual("Mobile"); - }); - }); - describe("serviceability logic", () => { describe("should be logical AND when recalibration is defined.", () => { test("T & T => T", async () => { @@ -1434,8 +1199,5 @@ function setupMocks({ mountOptionsMockData = {} }) { const mountOptions = getMountOptions(mountOptionsMockData); const wrapper = shallowMount(serviceLocation, mountOptions); wrapper.vm.setCmsContent = baseMixin.methods.setCmsContent; - wrapper.vm.$refs.mobileLocationQuestions.isMobileAddressComplete = jest.fn(); - wrapper.vm.$refs.mobileLocationQuestions.resetAlerts = jest.fn(); - wrapper.vm.$refs.mobileLocationQuestions.openModal = jest.fn(); return { wrapper, apiPromise }; } diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 6893ad9b4..ccb2c7866 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -89,24 +89,14 @@
- - +
+ +
{ - if (this.isServiceableMobile) { - this.shopProviderData = result.data; - this.selectedProvider = new Provider( - this.shopProviderData.mobileProviderNumber - ); - } - }); - } - if (this.isServiceableMobile) { - this.setMobileLocation(newValue); - this.setMobileLocationInValid(false); - } else { - await getZipCodeData(newZipCode).then((zipCodeData) => { - this.serviceZipCodeQuestion = { - state: zipCodeData.state, - zipCode: newZipCode, - zipCodeCtu: zipCodeData.zipCodeCtu, - }; - }); - } - }, getCarIdfromStore() { return store.getters.vehicle.carId; }, @@ -590,15 +556,6 @@ export default { this.isRecalibrationServiceableMobile = serviceabilityDetails.isRecalibrationServiceableMobile; }, - setMobileLocation(mobileLocation) { - this.streetAddress = mobileLocation.addressQuestions.streetAddress; - this.apartmentNumberOrBusinessName = - mobileLocation.addressQuestions.apartmentNumberOrBusinessName; - this.city = mobileLocation.addressQuestions.city; - this.state = mobileLocation.addressQuestions.state; - this.zipCode = mobileLocation.addressQuestions.zipCode; - this.isVehicleProtected = mobileLocation.isVehicleProtected; - }, async reloadShopData(zipCode) { await this.$refs.shopQuestion.reloadShopData(zipCode); }, @@ -755,13 +712,49 @@ export default { this.updateAndSaveSupportingItems(); this.updateAndSaveIsMSRFeeApplicable(); - this.$router.navigateWithSaving( - this.navigationScenarios.CLICKED_FORWARD, - this.pageName + + //mocked schedule and should be clear when implement schedule page. + this.dispatchStoreAction( + this.storeActions.SAVE_SCHEDULE, + this.getTimeSlotInfo(), + false ); + + if (this.selectedAppointmentType == AppointmentTypeStrings.MOBILE) { + //navigate to mobile details page + this.$router.navigateWithSaving( + this.navigationScenarios.CLICKED_FORWARD_WITH_MOBILE_SERVICE, + this.pageName + ); + } else { + this.$router.navigateWithSaving( + this.navigationScenarios.CLICKED_FORWARD, + this.pageName + ); + } }, - setMobileLocationInValid(isMobileLocationInValid) { - this.isMobileAddressValid = !isMobileLocationInValid; + getTimeSlotInfo() { + // Get the current date + const currentDate = new Date(); + + // Add 10 days to the current date + currentDate.setDate(currentDate.getDate() + 10); + + // Format the date as yyyy-mm-dd + const year = currentDate.getFullYear(); + const month = String(currentDate.getMonth() + 1).padStart(2, "0"); + const day = String(currentDate.getDate()).padStart(2, "0"); + + const formattedDate = `${year}-${month}-${day}`; + + return { + date: formattedDate, + endTime: "12:00", + jobMaxMinutes: "180", + jobMinMinutes: "120", + routeCode: "3357I-03357-M-I*20988*AM", + startTime: "08:00", + }; }, }, watch: { @@ -787,16 +780,6 @@ export default { this.selectedProvider = new Provider( this.shopProviderData.mobileProviderNumber ); - if (this.zipCode == this.getServiceZipCodeFromStore()) { - //restore mobile address from store in case user make changes to address but not commit it. - this.streetAddress = this.getServiceAddressFromStore(); - this.apartmentNumberOrBusinessName = this.getServiceAddress2FromStore(); - this.city = this.getServiceCityFromStore(); - this.isVehicleProtected = this.getIsVehicleProtectedFromStore(); - } else { - this.resetMobileLocation(); - } - this.$refs.mobileLocationQuestions.resetAlerts(); } else { this.selectedProvider = new Provider(); } @@ -807,7 +790,6 @@ export default { alert, serviceZipModalQuestion, appointmentTypeQuestion, - mobileLocationModalQuestions, funnelHeader, navbar, funnelSubHeader, @@ -815,6 +797,7 @@ export default { loadingModal, contentGroupModal, shopQuestion, + textBlock, }, }; diff --git a/src/router/constants/navigation-scenarios.js b/src/router/constants/navigation-scenarios.js index a6e117948..b660afca3 100644 --- a/src/router/constants/navigation-scenarios.js +++ b/src/router/constants/navigation-scenarios.js @@ -49,6 +49,12 @@ const navigationScenarios = { // Insurance-Company CLICKED_PAY_ON_MY_OWN: "CLICKED_PAY_ON_MY_OWN", + //Service-Location + CLICKED_FORWARD_WITH_MOBILE_SERVICE: "CLICKED_FORWARD_WITH_MOBILE_SERVICE", + + //Customer-details + CLICKED_BACK_WITH_MOBILE_SERVICE: "CLICKED_BACK_WITH_MOBILE_SERVICE", + // Schedule CLICKED_CHANGE_LOCATION: "CLICKED_CHANGE_LOCATION", diff --git a/src/router/constants/routes.js b/src/router/constants/routes.js index d03954867..7e9a3a793 100644 --- a/src/router/constants/routes.js +++ b/src/router/constants/routes.js @@ -68,6 +68,10 @@ export const routeData = { name: "schedule", path: "/schedule", }, + MOBILE_DETAILS: { + name: "mobile-details", + path: "/mobile-details", + }, CUSTOMER_DETAILS: { name: "customer-details", path: "/customer-details", diff --git a/src/router/constants/routing-table.js b/src/router/constants/routing-table.js index 4b7286741..4a07bcfaf 100644 --- a/src/router/constants/routing-table.js +++ b/src/router/constants/routing-table.js @@ -460,6 +460,10 @@ const routingTable = function () { scenario: navigationScenarios.CLICKED_FORWARD, destinationPageData: routeData.SCHEDULE, }, + { + scenario: navigationScenarios.CLICKED_FORWARD_WITH_MOBILE_SERVICE, + destinationPageData: routeData.MOBILE_DETAILS, + }, ], }, { @@ -479,6 +483,19 @@ const routingTable = function () { }, ], }, + { + pageName: routeData.MOBILE_DETAILS.name, + maps: [ + { + scenario: navigationScenarios.CLICKED_BACK, + destinationPageData: routeData.SERVICE_LOCATION, + }, + { + scenario: navigationScenarios.CLICKED_FORWARD, + destinationPageData: routeData.CUSTOMER_DETAILS, + }, + ], + }, { pageName: routeData.CUSTOMER_DETAILS.name, maps: [ @@ -486,6 +503,10 @@ const routingTable = function () { scenario: navigationScenarios.CLICKED_BACK, destinationPageData: routeData.SCHEDULE, }, + { + scenario: navigationScenarios.CLICKED_BACK_WITH_MOBILE_SERVICE, + destinationPageData: routeData.MOBILE_DETAILS, + }, { scenario: navigationScenarios.CLICKED_FORWARD, destinationPageData: routeData.PAYMENT_METHOD, diff --git a/src/router/methods/routes.js b/src/router/methods/routes.js index c029ce2cb..01f4f8a58 100644 --- a/src/router/methods/routes.js +++ b/src/router/methods/routes.js @@ -37,6 +37,7 @@ export const routes = [ createRoute(routeData.PAYMENT_PIA_RETURN), createRoute(routeData.CONFIRMATION), createRoute(routeData.RETURN_USER), + createRoute(routeData.MOBILE_DETAILS), // Virtual pages (resolve to a non-virtual page.) createVirtualRoute(routeData.LANDING, landingBeforeEnter), diff --git a/src/store/index.js b/src/store/index.js index 073a50e23..89de1a494 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -421,6 +421,12 @@ export const mutations = { }, }; }, + updateMobileDetails(state, mobileDetails) { + state.order.serviceLocation.address = mobileDetails.address; + state.order.serviceLocation.address2 = mobileDetails.address2; + state.order.serviceLocation.city = mobileDetails.city; + state.order.serviceLocation.isVehicleProtected = mobileDetails.isVehicleProtected; + }, updateServiceLocationTechNotes(state, techNotes) { state.order.serviceLocation.techNotes = techNotes; }, @@ -3204,6 +3210,9 @@ export const actions = { context.commit(storeMutations.UPDATE_SERVICE_LOCATION, serviceLocationInfo); }, + saveMobileDetails(context, mobileDetails) { + context.commit(storeMutations.UPDATE_MOBILE_DETAILS, mobileDetails); + }, saveServiceLocationTechNotes(context, techNotesInfo) { context.commit(storeMutations.UPDATE_SERVICE_LOCATION_TECH_NOTES, techNotesInfo);