diff --git a/src/constants/schedule-constants.js b/src/constants/schedule-constants.js index 89b4a4c1a..86c2a793c 100644 --- a/src/constants/schedule-constants.js +++ b/src/constants/schedule-constants.js @@ -8,4 +8,9 @@ const PREMIUM_TIME_SLOT_ID_FLAG = "-premium"; const PREMIUM_FEE_PART_TYPE = "EARLY BIRD"; -export { AppointmentTypeStrings, PREMIUM_TIME_SLOT_ID_FLAG, PREMIUM_FEE_PART_TYPE }; +const RouteCodeFlags = { + ALL_DAY_DROP_OFF: "ALL DAY DROP OFF", + OVERNIGHT_DROP_OFF: "OVERNIGHT DROP OFF", +}; + +export { AppointmentTypeStrings, PREMIUM_TIME_SLOT_ID_FLAG, PREMIUM_FEE_PART_TYPE, RouteCodeFlags }; diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index ebffdebde..392e7b59e 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -54,6 +54,7 @@ const storeActions = { RESET_DAMAGE_STATE_AND_DEPENDENCIES: "resetDamageAndDependencies", RESET_REGISTRATION_STATE_AND_DEPENDENCIES: "resetRegistrationAndDependencies", RESET_PARTS_STATE_AND_DEPENDENCIES: "resetPartsAndDependencies", + RESET_SERVICE_LOCATION_STATE_AND_DEPENDENCIES: "resetServiceLocationAndDependencies", RESET_STATE: "resetState", // SAVE COMPONENT STATE diff --git a/src/fmg-components/funnel-header/menu-modal/menu-modal.vue b/src/fmg-components/funnel-header/menu-modal/menu-modal.vue index 55ff95c48..72fef029b 100644 --- a/src/fmg-components/funnel-header/menu-modal/menu-modal.vue +++ b/src/fmg-components/funnel-header/menu-modal/menu-modal.vue @@ -21,6 +21,19 @@ aria-hidden="true" v-on="{ 'show.bs.modal': show, 'hide.bs.modal': hide }" :style="`height: calc(100% - ${currentFooterAndHeaderHeight}px);`"> +
- Finding shops near you + Tidying up the shop . . .
- Looking for dates + Getting all the glass shined up . . .
- Searching for times + Planning your new view of the road . . . @@ -164,19 +164,19 @@ export default { transform: translateX(-600px); } 55% { - transform: translateX(-1110px); + transform: translateX(-1195px); } 66% { - transform: translateX(-1110px); + transform: translateX(-1195px); } 77% { - transform: translateX(-1600px); + transform: translateX(-1750px); } 88% { - transform: translateX(-1600px); + transform: translateX(-1750px); } 100% { - transform: translateX(-2050px); + transform: translateX(-2200px); } } diff --git a/src/global-methods.js b/src/global-methods.js index 45bbc467c..756b58dc8 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -1,13 +1,21 @@ import axios from "axios"; import analyticsMixIn from "@/mixins/analytics-mixin.js"; import store from "@/store"; +import router from "@/router"; import { applicationConfig } from "@/constants/application-config.js"; import { GaCategories, GaActions, GaLabels } from "@/constants/analytics"; import { headerKeys } from "@/constants/header-keys"; export default { - callHttpClient({ method, endpoint, payload, logApiCall = true, isFormData = false }) { + callHttpClient({ + method, + endpoint, + payload, + logApiCall = true, + isFormData = false, + additionalSuccessEventDataHandler, + }) { return new Promise((resolve, reject) => { const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; let payloadAndAnalyticsData = {}; @@ -31,10 +39,16 @@ export default { }).then( (response) => { if (logApiCall) { + let additionalEventData = ""; + if (additionalSuccessEventDataHandler) { + additionalEventData = "_" + additionalSuccessEventDataHandler(response); + } + const pageName = analyticsMixIn.methods.getPageName(); + const nextPageName = router.getNextPage() || pageName; analyticsMixIn.methods.pushEventToGA( GaCategories.API_RESPONSE, - GaActions.RESULT, - `${GaLabels.SUCCESS}_${endpoint}`, + `${nextPageName}_${endpoint}`, + `${GaLabels.SUCCESS}${additionalEventData}`, true ); } diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 7fcf3afcd..a364319ee 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -25,6 +25,7 @@ mobileCmsWidgetName="MobileTimeSlotModal" dropoffCmsWidgetName="DropOffTimeSlotModal" sameDayDropOffCmsWidgetName="SameDayDropOffTimeSlotModal" + overnightDropOffCmsWidgetName="OvernightDropOffTimeSlotModal" v-model="selectedTimeSlotData" @time-slot-modal-closed="timeSlotModalClosed" :appointmentType="appointmentType" @@ -50,7 +51,6 @@ import funnelFooter from "@/fmg-components/funnel-footer/funnel-footer"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; import { Form, defineRule } from "vee-validate"; -import { processIfStatements } from "@/helpers/cms-content-helper"; import datePicker from "@/digital-components/date-picker/date-picker"; import locationAlerts from "@/layouts/schedule/location-alerts/location-alerts"; import timeSlotModalQuestion from "./time-slot-modal-question/time-slot-modal-question"; @@ -62,12 +62,7 @@ import baseMixin from "@/mixins/base-mixin.js"; import { storeActions } from "@/constants/store-actions"; import { settleAllPromises } from "@/helpers/layout-helper"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; -import { - doesCopyContainRouterLink, - splitCopyOnCMSPlaceHolder, - getRouterLinkRouteFromCopy, - getRouterLinkDisplayTextFromCopy, -} from "@/helpers/cms-content-helper"; +import { splitCopyOnCMSPlaceHolder } from "@/helpers/cms-content-helper"; import { AppointmentTypeStrings, PREMIUM_FEE_PART_TYPE } from "@/constants/schedule-constants"; import { errorMessages } from "@/constants/error-messages"; import { required } from "@/helpers/validation-rules"; @@ -225,11 +220,7 @@ export default { }, }, methods: { - doesCopyContainRouterLink, splitCopyOnCMSPlaceHolder, - getRouterLinkRouteFromCopy, - getRouterLinkDisplayTextFromCopy, - processIfStatements, arePagePrerequisitesValid() { const serviceLocation = store.getters.order.serviceLocation; const serviceLocationPreReqs = @@ -268,8 +259,8 @@ export default { getTimeSlotObjectFromTimeSlotId(timeSlotId) { const timeSlots = this.selectableDatesData.days.find( (selectableDate) => selectableDate.date === this.selectedDate - ).timeSlots; - return timeSlots.find((timeSlot) => timeSlot.id === timeSlotId); + )?.timeSlots; + if (timeSlots) return timeSlots.find((timeSlot) => timeSlot.id === timeSlotId); }, getSelectedDate() { return store.getters.order.schedule.date; @@ -285,7 +276,7 @@ export default { }, updateFooterButtonText(timeSlotData) { let funnelFooterButtonText; - if (!timeSlotData.id) { + if (!timeSlotData.id || !this.appointmentDateAndTime) { funnelFooterButtonText = "Continue"; } else { funnelFooterButtonText = diff --git a/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue b/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue index 34086b728..589b12cc5 100644 --- a/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue +++ b/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue @@ -28,11 +28,11 @@ v-if="supplementalInformationBlock" v-html="supplementalInformationBlock">