From 6572f01910dff7cf3ce93dde2966c15ed4a91732 Mon Sep 17 00:00:00 2001 From: Sneha Date: Thu, 29 Jun 2023 11:28:01 +0530 Subject: [PATCH 01/41] CSR-1438 Reverting back FMG changes --- .../address-lookup/customer-questions/customer-questions.vue | 3 ++- src/layouts/address-vehicles/address-vehicles.vue | 1 + src/layouts/estimate/estimate.vue | 4 +++- src/layouts/license-plate-lookup/license-plate-lookup.vue | 3 ++- src/layouts/vin-lookup/vin-lookup.vue | 4 +++- src/store/index.js | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/layouts/address-lookup/customer-questions/customer-questions.vue b/src/layouts/address-lookup/customer-questions/customer-questions.vue index fd3e083f2..d10812df2 100644 --- a/src/layouts/address-lookup/customer-questions/customer-questions.vue +++ b/src/layouts/address-lookup/customer-questions/customer-questions.vue @@ -30,7 +30,7 @@ ref="emailAddress" inputId="00450a91b8964a768ce3992e6feb890f" disableAutoFill - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
@@ -52,6 +52,7 @@ import textBlock from "@/common-components/text-block/text-block"; // DEFINE VALIDATION RULES defineRule("first-name-required", required(errorMessages.FIRST_NAME_REQUIRED)); defineRule("last-name-required", required(errorMessages.LAST_NAME_REQUIRED)); +defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED)); defineRule( "email-address-format", regex( diff --git a/src/layouts/address-vehicles/address-vehicles.vue b/src/layouts/address-vehicles/address-vehicles.vue index 370cb8dc3..4babd7a33 100644 --- a/src/layouts/address-vehicles/address-vehicles.vue +++ b/src/layouts/address-vehicles/address-vehicles.vue @@ -157,6 +157,7 @@ export default { if ( store.getters.order.vehicle.carId && store.getters.order.serviceLocation.zipCode && + store.getters.order.customer.emailAddress && store.getters.pageData(fmgPageValues.ADDRESS_VEHICLES) ) { return true; diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue index f869d52a5..17135b1aa 100644 --- a/src/layouts/estimate/estimate.vue +++ b/src/layouts/estimate/estimate.vue @@ -45,8 +45,9 @@ cmsWidgetName="EmailAddressQuestionWidget" v-model="emailAddress" inputId="emailAddress" + isRequired disableAutoFill - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
@@ -118,6 +119,7 @@ import { queryStrings } from "@/constants/query-strings"; // Define Validation Rules defineRule("zip-required", required(errorMessages.SERVICE_ZIP_REQUIRED)); defineRule("zip-format", regex(/(^\d{5}$)|(^\d{5}-\d{4}$)/, errorMessages.SERVICE_ZIP_FORMAT)); +defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED)); defineRule( "email-address-format", regex( diff --git a/src/layouts/license-plate-lookup/license-plate-lookup.vue b/src/layouts/license-plate-lookup/license-plate-lookup.vue index 64eb818c8..4c540f09d 100644 --- a/src/layouts/license-plate-lookup/license-plate-lookup.vue +++ b/src/layouts/license-plate-lookup/license-plate-lookup.vue @@ -33,7 +33,7 @@ cmsWidgetName="EmailAddressQuestionWidget" v-model="email" inputId="email" - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
@@ -116,6 +116,7 @@ import vinPagesMixin from "@/mixins/vin-pages-mixin"; defineRule("license-plate-required", required(errorMessages.LICENSE_PLATE_REQUIRED)); defineRule("registration-zip-required", required(errorMessages.REGISTRATION_ZIP_REQUIRED)); defineRule("zip-format", regex(/(^\d{5}$)|(^\d{5}-\d{4}$)/, errorMessages.SERVICE_ZIP_FORMAT)); +defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED)); defineRule( "email-address-format", regex( diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 60e80ea89..9fe9077d9 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -60,8 +60,9 @@ cmsWidgetName="EmailAddressQuestionWidget" v-model="emailAddress" inputId="emailAddress" + isRequired disableAutoFill - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
@@ -154,6 +155,7 @@ import vinPagesMixin from "@/mixins/vin-pages-mixin"; // DEFINE VALIDATION RULES defineRule("zip-required", required(errorMessages.SERVICE_ZIP_REQUIRED)); defineRule("zip-format", regex(/(^\d{5}$)|(^\d{5}-\d{4}$)/, errorMessages.SERVICE_ZIP_FORMAT)); +defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED)); defineRule( "email-address-format", regex( diff --git a/src/store/index.js b/src/store/index.js index 18fb61995..510877a53 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1054,7 +1054,7 @@ export const actions = { }, }, customer: { - emailAddress: order.customer.emailAddress || null, + emailAddress: order.customer.emailAddress, }, damage: { numberOfChips: damage.numberOfChips, From 97ca23bc93f0d549269d4f316f6a0ba1dc7e0099 Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Thu, 29 Jun 2023 08:44:09 -0400 Subject: [PATCH 02/41] some debugging code added --- .../service-location-helper/service-location-helper.js | 4 ++++ .../shop-question/shop-list-button/shop-list-button.vue | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js index b100a50b5..dfae12bba 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js @@ -62,11 +62,15 @@ export async function getAvailabilityRating( false ); + console.log(shopTimeSlots) + // Rate the availability for the shop let numberOfAppointmentsPerDay = []; for (let i = 0; i < shopTimeSlots.data.days.length; i++) { numberOfAppointmentsPerDay.push(shopTimeSlots.data.days[i].timeSlots.length); } + + console.log(numberOfAppointmentsPerDay) const dateRange = 7; const minimumNumberOfAppointmentsPerDay = 1; diff --git a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue index df80fdffa..6eb34382e 100644 --- a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue +++ b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue @@ -73,10 +73,11 @@ export default { }, computed: { displayAvailabilityIndicators() { - return experimentMixin.methods.hasSettingEqualTo( - experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, - "true" - ); + return true; //TODO: REMOVE THIS + // return experimentMixin.methods.hasSettingEqualTo( + // experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, + // "true" + // ); }, isLoaderDisplayed() { return this.availabilityRating == null; From 129cccaa5813f9fa3d3012b4939038f173dc0ec1 Mon Sep 17 00:00:00 2001 From: Matt Caimi Date: Thu, 29 Jun 2023 15:16:43 -0400 Subject: [PATCH 03/41] CSR-1439 remove params from endpoint logging --- src/global-methods.js | 3 ++- src/mixins/analytics-mixin.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/global-methods.js b/src/global-methods.js index 1ae2dbf80..e9507dc9e 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -39,9 +39,10 @@ export default { } const pageName = analyticsMixIn.methods.getPageName(); const nextPageName = router.lastNavigationPage || pageName; + const endpointWithoutParams = analyticsMixIn.methods.removeParamsFromEndpoint(endpoint); analyticsMixIn.methods.pushEventToGA( GaCategories.API_RESPONSE, - `${nextPageName}_${endpoint}`, + `${nextPageName}_${endpointWithoutParams}`, `${GaLabels.SUCCESS}${additionalEventData}`, true ); diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 75f22edcb..cbea1bae9 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -176,6 +176,17 @@ export default { getSessionIdValue() === "00000000-0000-0000-0000-000000000000" ); }, + + removeParamsFromEndpoint(endpoint) { + const numSlashesBeforeParams = 6; + let splitString = endpoint.split('/'); + if (splitString.length > numSlashesBeforeParams) { + splitString = splitString.slice(0, numSlashesBeforeParams); + return splitString.join('/'); + } else { + return endpoint; + } + }, }, computed: { analyticsPageEvents() { From 71e57c2aa5e83133f87c1c353df3a5b5fb7ee44c Mon Sep 17 00:00:00 2001 From: Matt Caimi Date: Thu, 29 Jun 2023 15:19:56 -0400 Subject: [PATCH 04/41] CSR-1439 formatting --- src/global-methods.js | 3 ++- src/mixins/analytics-mixin.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/global-methods.js b/src/global-methods.js index e9507dc9e..46d50d2fd 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -39,7 +39,8 @@ export default { } const pageName = analyticsMixIn.methods.getPageName(); const nextPageName = router.lastNavigationPage || pageName; - const endpointWithoutParams = analyticsMixIn.methods.removeParamsFromEndpoint(endpoint); + const endpointWithoutParams = + analyticsMixIn.methods.removeParamsFromEndpoint(endpoint); analyticsMixIn.methods.pushEventToGA( GaCategories.API_RESPONSE, `${nextPageName}_${endpointWithoutParams}`, diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index cbea1bae9..b66711f46 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -179,10 +179,10 @@ export default { removeParamsFromEndpoint(endpoint) { const numSlashesBeforeParams = 6; - let splitString = endpoint.split('/'); + let splitString = endpoint.split("/"); if (splitString.length > numSlashesBeforeParams) { splitString = splitString.slice(0, numSlashesBeforeParams); - return splitString.join('/'); + return splitString.join("/"); } else { return endpoint; } From 2a89764989027eed0b71ee35b172ee2bc0b35072 Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Fri, 30 Jun 2023 07:34:35 -0400 Subject: [PATCH 05/41] Fixed logic in getAvailabilityRating --- .../service-location-helper.js | 27 +-- .../service-location-helper.spec.js | 170 +++++++----------- 2 files changed, 70 insertions(+), 127 deletions(-) diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js index dfae12bba..19758bd07 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js @@ -62,31 +62,10 @@ export async function getAvailabilityRating( false ); - console.log(shopTimeSlots) - - // Rate the availability for the shop - let numberOfAppointmentsPerDay = []; - for (let i = 0; i < shopTimeSlots.data.days.length; i++) { - numberOfAppointmentsPerDay.push(shopTimeSlots.data.days[i].timeSlots.length); - } - - console.log(numberOfAppointmentsPerDay) - - const dateRange = 7; - const minimumNumberOfAppointmentsPerDay = 1; const numberOfDaysToEvaluate = 2; - - let daysWithMinimalAppointmentsCount = 0; - for (let i = 0; i < dateRange; i++) { - if (numberOfAppointmentsPerDay[i] >= minimumNumberOfAppointmentsPerDay) { - daysWithMinimalAppointmentsCount++; - if (daysWithMinimalAppointmentsCount >= numberOfDaysToEvaluate) { - break; - } - } - } - - const isGoodAvailability = daysWithMinimalAppointmentsCount >= numberOfDaysToEvaluate; + const isGoodAvailability = + shopTimeSlots.data.days.filter((x) => x.timeSlots.length > 0).length >= + numberOfDaysToEvaluate; const shopStatus = isGoodAvailability ? "high" : "low"; diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js index 81d336968..2c0e5a95e 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js @@ -92,94 +92,54 @@ const mockStoreActionGetServiceabilityDetails = storeActions.GET_SERVICEABILITY_ const mockStoreActionGetShopTimeSlots = storeActions.GET_SHOP_TIME_SLOTS; const mockGetShopTimeSlotsGoodAvailability = { - estimatedServiceMinutesMinimum: 0, - estimatedServiceMinutesMaximimum: 0, - days: [ - { - date: "string", - timeSlots: [ - { - id: "string", - startTime: "", - endTime: "", - offerPremium: true, - }, - ], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [ - { - id: "string", - startTime: "", - endTime: "", - offerPremium: true, - }, - ], - }, - ], + data: { + estimatedServiceMinutesMinimum: 0, + estimatedServiceMinutesMaximimum: 0, + days: [ + { + date: "string", + timeSlots: [ + { + id: "string", + startTime: "", + endTime: "", + offerPremium: true, + }, + ], + }, + { + date: "string", + timeSlots: [ + { + id: "string", + startTime: "", + endTime: "", + offerPremium: true, + }, + ], + }, + ], + } }; const mockGetShopTimeSlotsLowAvailability = { - estimatedServiceMinutesMinimum: 0, - estimatedServiceMinutesMaximimum: 0, - days: [ - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [], - }, - { - date: "string", - timeSlots: [ - { - id: "string", - startTime: "", - endTime: "", - offerPremium: true, - }, - ], - }, - ], + data: { + estimatedServiceMinutesMinimum: 0, + estimatedServiceMinutesMaximimum: 0, + days: [ + { + date: "string", + timeSlots: [ + { + id: "string", + startTime: "", + endTime: "", + offerPremium: true, + }, + ], + }, + ], + } }; jest.mock("@/mixins/base-mixin.js", () => ({ @@ -228,6 +188,7 @@ jest.mock("@/mixins/base-mixin.js", () => ({ } if (actionName === mockStoreActionGetShopTimeSlots) { + console.log(request) if (request.providerNumber == "0000001") { return Promise.resolve(mockGetShopTimeSlotsGoodAvailability); } @@ -310,23 +271,26 @@ describe("service-location-helper.js", () => { }); describe("getAvailabilityRating", () => { - // it("Should return a 'Good' rating", async () => { - // // Arrange - // const providerNumber = "0000001"; - // const expected = "Good"; - // // Act - // const result = await getAvailabilityRating(providerNumber); - // // Assert - // expect(result).toEqual(expected); - // }); - // it("Should return a 'Low' rating", async () => { - // // Arrange - // const providerNumber = "0000000"; - // const expected = "Low"; - // // Act - // const result = await getAvailabilityRating(providerNumber); - // // Assert - // expect(result).toEqual(expected); - // }); + it("Should return a 'high' rating", async () => { + // Arrange + const providerNumber = "0000001"; + const expected = "high"; + // Act + const result = await getAvailabilityRating("2023-06-30", "2023-07-06", "Inshop", providerNumber); + + // Assert + expect(result).toEqual(expected); + }); + + it("Should return a 'low' rating", async () => { + // Arrange + const providerNumber = "0000000"; + const expected = "low"; + // Act + const result = await getAvailabilityRating("2023-06-30", "2023-07-06", "Inshop", providerNumber); + + // Assert + expect(result).toEqual(expected); + }); }); }); From 842bd8a20ac112375b5515aac4b130d1994f63a3 Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Fri, 30 Jun 2023 07:35:04 -0400 Subject: [PATCH 06/41] Prettified --- .../service-location-helper.spec.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js index 2c0e5a95e..ceea2db7a 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js @@ -119,7 +119,7 @@ const mockGetShopTimeSlotsGoodAvailability = { ], }, ], - } + }, }; const mockGetShopTimeSlotsLowAvailability = { @@ -139,7 +139,7 @@ const mockGetShopTimeSlotsLowAvailability = { ], }, ], - } + }, }; jest.mock("@/mixins/base-mixin.js", () => ({ @@ -188,7 +188,7 @@ jest.mock("@/mixins/base-mixin.js", () => ({ } if (actionName === mockStoreActionGetShopTimeSlots) { - console.log(request) + console.log(request); if (request.providerNumber == "0000001") { return Promise.resolve(mockGetShopTimeSlotsGoodAvailability); } @@ -276,7 +276,12 @@ describe("service-location-helper.js", () => { const providerNumber = "0000001"; const expected = "high"; // Act - const result = await getAvailabilityRating("2023-06-30", "2023-07-06", "Inshop", providerNumber); + const result = await getAvailabilityRating( + "2023-06-30", + "2023-07-06", + "Inshop", + providerNumber + ); // Assert expect(result).toEqual(expected); @@ -287,7 +292,12 @@ describe("service-location-helper.js", () => { const providerNumber = "0000000"; const expected = "low"; // Act - const result = await getAvailabilityRating("2023-06-30", "2023-07-06", "Inshop", providerNumber); + const result = await getAvailabilityRating( + "2023-06-30", + "2023-07-06", + "Inshop", + providerNumber + ); // Assert expect(result).toEqual(expected); From e89eadcb46c62c1d8fd0ea375c26756de2f21c06 Mon Sep 17 00:00:00 2001 From: Matt Caimi Date: Fri, 30 Jun 2023 13:50:42 -0400 Subject: [PATCH 07/41] CSR-1436 provisional triggers ga event logging --- src/global-methods.js | 4 +++- src/mixins/analytics-mixin.js | 12 ++++++++++++ src/store/index.js | 8 ++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/global-methods.js b/src/global-methods.js index a12c3870d..44ba07acc 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -39,9 +39,11 @@ export default { } const pageName = analyticsMixIn.methods.getPageName(); const nextPageName = router.lastNavigationPage || pageName; + const endpointWithoutParams = + analyticsMixIn.methods.removeParamsFromEndpoint(endpoint); analyticsMixIn.methods.pushEventToGA( GaCategories.API_RESPONSE, - `${nextPageName}_${endpoint}`, + `${nextPageName}_${endpointWithoutParams}`, `${GaLabels.SUCCESS}${additionalEventData}`, true ); diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 75f22edcb..88b4772f8 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -176,6 +176,18 @@ export default { getSessionIdValue() === "00000000-0000-0000-0000-000000000000" ); }, + + removeParamsFromEndpoint(endpoint) { + const endpointWithoutParams = endpoint.split("?")[0]; + const numSlashesBeforeParams = 6; + let splitString = endpointWithoutParams.split("/"); + if (splitString.length > numSlashesBeforeParams) { + splitString = splitString.slice(0, numSlashesBeforeParams); + return splitString.join("/"); + } else { + return endpointWithoutParams; + } + }, }, computed: { analyticsPageEvents() { diff --git a/src/store/index.js b/src/store/index.js index 7e7dfffaf..080abe822 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -596,6 +596,10 @@ function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { return (array ?? []).map((x) => x[propertyName]).filter((x) => x); } +function provisionalTriggersToString(provisionalTriggers) { + return "ProvisionalTriggers:" + provisionalTriggers.join(","); +} + // Export Actions export const actions = { // Vehicle API Actions @@ -1267,6 +1271,8 @@ export const actions = { method: endpoints.GetShopTimeSlots.method, endpoint: endpoints.GetShopTimeSlots.url, payload: payload, + additionalSuccessEventDataHandler: (response) => + provisionalTriggersToString(response.data.provisionalTriggers), }); }, @@ -1318,6 +1324,8 @@ export const actions = { method: endpoints.GetMobileTimeSlots.method, endpoint: endpoints.GetMobileTimeSlots.url, payload: payload, + additionalSuccessEventDataHandler: (response) => + provisionalTriggersToString(response.data.provisionalTriggers), }); }, From 6fb00ef84db8419fa2f6da26f63032fa4ed2f681 Mon Sep 17 00:00:00 2001 From: Matt Caimi Date: Fri, 30 Jun 2023 13:54:35 -0400 Subject: [PATCH 08/41] CSR-1439 another param bugfix --- src/mixins/analytics-mixin.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index b66711f46..88b4772f8 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -178,13 +178,14 @@ export default { }, removeParamsFromEndpoint(endpoint) { + const endpointWithoutParams = endpoint.split("?")[0]; const numSlashesBeforeParams = 6; - let splitString = endpoint.split("/"); + let splitString = endpointWithoutParams.split("/"); if (splitString.length > numSlashesBeforeParams) { splitString = splitString.slice(0, numSlashesBeforeParams); return splitString.join("/"); } else { - return endpoint; + return endpointWithoutParams; } }, }, From 818ca49af7e85dea2ac83f19b7a4daaaf2861fad Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Fri, 30 Jun 2023 14:36:30 -0400 Subject: [PATCH 09/41] Removed testing code and uncommented real code --- .../service-location-helper.spec.js | 1 - .../shop-question/shop-list-button/shop-list-button.vue | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js index 676541784..6b530fddb 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.spec.js @@ -189,7 +189,6 @@ jest.mock("@/mixins/base-mixin.js", () => ({ } if (actionName === mockStoreActionGetShopTimeSlots) { - console.log(request); if (request.providerNumber == "0000001") { return Promise.resolve(mockGetShopTimeSlotsGoodAvailability); } diff --git a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue index 6eb34382e..df80fdffa 100644 --- a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue +++ b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue @@ -73,11 +73,10 @@ export default { }, computed: { displayAvailabilityIndicators() { - return true; //TODO: REMOVE THIS - // return experimentMixin.methods.hasSettingEqualTo( - // experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, - // "true" - // ); + return experimentMixin.methods.hasSettingEqualTo( + experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, + "true" + ); }, isLoaderDisplayed() { return this.availabilityRating == null; From a05951b7ce5160ce73071a2c1785958d07ae07e6 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Wed, 5 Jul 2023 10:32:35 -0400 Subject: [PATCH 10/41] CSR-1454: minor tweak to avoid returning empty strings which were creating extra empty markup --- src/helpers/cms-content-helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index f4ae0be6d..21a7c5db5 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -296,7 +296,7 @@ export function doesCopyContainTextLink(copy) { * @returns array of strings */ export function splitCopyOnCMSPlaceHolder(copy) { - return copy.split(/{(.*?)}/g); + return copy.split(/{(.*?)}/g).filter(str => str.length > 0); } /** From a4e01e3670d2b7c6be19d21353016c0ba4d27c72 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Wed, 5 Jul 2023 11:24:55 -0400 Subject: [PATCH 11/41] CSR-1454: reduce text size of links on Schedule page --- src/layouts/schedule/schedule.vue | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index e26a6c76c..e552f48d0 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -8,7 +8,7 @@ @@ -16,6 +16,7 @@ selectableDatesSetting="custom" ref="datePicker" v-model="selectedDate" + class="text-link-small" :customSelectableDatesCallback="getAvailableDatesMethod" @date-clicked="openInshopTimeSlotsModal" /> + + \ No newline at end of file From b1ad1d921bd7a41d1a5051956f4bc0f02ce7c323 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Wed, 5 Jul 2023 11:27:16 -0400 Subject: [PATCH 12/41] CSR-1454: formatting changes --- src/helpers/cms-content-helper.js | 2 +- src/layouts/schedule/schedule.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index 21a7c5db5..84a834ee6 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -296,7 +296,7 @@ export function doesCopyContainTextLink(copy) { * @returns array of strings */ export function splitCopyOnCMSPlaceHolder(copy) { - return copy.split(/{(.*?)}/g).filter(str => str.length > 0); + return copy.split(/{(.*?)}/g).filter((str) => str.length > 0); } /** diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index e552f48d0..ea2ae4cfe 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -499,4 +499,4 @@ export default { line-height: 1.5; } } - \ No newline at end of file + From 5a97dc611b323316d058ec14e8ab83a1e2cefea7 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Wed, 5 Jul 2023 15:29:49 -0400 Subject: [PATCH 13/41] CSR-1438 If a customer navigates backwards and clears their email, we send an empty string to save-session which will fail validation. Pass nulls instead --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 39a9d3266..035c4bcc0 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1945,7 +1945,7 @@ export const actions = { }, saveEmail(context, email) { - context.commit(storeMutations.UPDATE_CUSTOMER_EMAIL_ADDRESS, email); + context.commit(storeMutations.UPDATE_CUSTOMER_EMAIL_ADDRESS, email === "" ? null : email); }, saveVin(context, { isSelectedGlassAvailableForVehicle, vehicleInfo }) { From 03181bc5ab927dbad50e07af33d3b533e33c099a Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 6 Jul 2023 13:47:04 -0400 Subject: [PATCH 14/41] Add getter to inform cms content --- src/store/index.js | 3 +++ src/store/store.spec.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 035c4bcc0..3c0ea1e39 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -523,6 +523,9 @@ export const getters = { ); return !!nonWindshieldItems?.length; }, + isMobileAppointment: (state) => { + return state.order.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE; + }, lineItems: (state) => state.order.lineItems, pageData: (state) => (page) => { return state.applicationUser.pageData[page]; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 1ea0125b0..4a6788433 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -4,6 +4,7 @@ import { storeMutations } from "@/constants/store-mutations"; import { storeActions } from "@/constants/store-actions"; import { experimentTriggers } from "@/constants/experiments"; import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; +import { AppointmentTypeStrings } from "@/constants/schedule-constants"; // Mock global method globalMethods.callHttpClient = jest.fn(); @@ -2869,6 +2870,45 @@ describe("Getters", () => { expect(getters.payment(storeState).insuranceCoverage.isVerified).toEqual(true); }); + describe("isMobileAppointment", () => { + it("Should return true for mobile appointments", () => { + // Arrange + const storeState = state; + + // Act + mutations.updateServiceLocation(storeState, { + appointmentType: AppointmentTypeStrings.MOBILE, + }); + + // Assert + expect(getters.isMobileAppointment(storeState)).toBe(true); + }); + + it("Should return false for non-mobile appointments", () => { + // Arrange + const storeState = state; + + // Act + mutations.updateServiceLocation(storeState, { + appointmentType: AppointmentTypeStrings.IN_SHOP, + }); + + // Assert + expect(getters.isMobileAppointment(storeState)).toBe(false); + }); + + it("Should return false for null appointments", () => { + // Arrange + const storeState = state; + + // Act + mutations.updateServiceLocation(storeState, { appointmentType: null }); + + // Assert + expect(getters.isMobileAppointment(storeState)).toBe(false); + }); + }); + describe("experimentOrder", () => { test("glassToReplace, glassParts, and otherParts are null > return correct experimentOrder values", () => { // Arrange From baf675b18dc26756a85b296d46f2b3ceb7abc8bd Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Thu, 6 Jul 2023 15:14:25 -0400 Subject: [PATCH 15/41] CSR-1312 fix overlay not blocking mouse click/tap. --- src/ux-components/button-main/button-main.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ux-components/button-main/button-main.vue b/src/ux-components/button-main/button-main.vue index 18d7427c2..f1099111b 100644 --- a/src/ux-components/button-main/button-main.vue +++ b/src/ux-components/button-main/button-main.vue @@ -100,7 +100,7 @@ export default { color: $white; background: $blue-700; box-shadow: 0 0 0 3px, 0 0 0 5.5px $blue-700; - pointer-events: none; + pointer-events: auto; } &.delay { // fixes flicker while transitioning between states From 378aa05fdefa99dcdf2e6d20492dd5073685160d Mon Sep 17 00:00:00 2001 From: Sneha Date: Fri, 7 Jul 2023 13:20:20 +0530 Subject: [PATCH 16/41] CSR-1506 --- .../address-lookup/customer-questions/customer-questions.vue | 2 +- src/layouts/license-plate-lookup/license-plate-lookup.vue | 2 +- src/layouts/vin-lookup/vin-lookup.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layouts/address-lookup/customer-questions/customer-questions.vue b/src/layouts/address-lookup/customer-questions/customer-questions.vue index 2bb20d286..e8a1ab4d6 100644 --- a/src/layouts/address-lookup/customer-questions/customer-questions.vue +++ b/src/layouts/address-lookup/customer-questions/customer-questions.vue @@ -27,7 +27,7 @@ v-model="customerModel.emailAddress" ref="emailAddress" customInputId="emailAddress" - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
diff --git a/src/layouts/license-plate-lookup/license-plate-lookup.vue b/src/layouts/license-plate-lookup/license-plate-lookup.vue index e1ff79cdc..cffe8248f 100644 --- a/src/layouts/license-plate-lookup/license-plate-lookup.vue +++ b/src/layouts/license-plate-lookup/license-plate-lookup.vue @@ -33,7 +33,7 @@ cmsWidgetName="EmailAddressQuestionWidget" v-model="email" customInputId="email" - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 36acfeeab..e820723bd 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -59,7 +59,7 @@ v-model="emailAddress" customInputId="emailAddress" isRequired - validationRules="email-address-format" /> + validationRules="email-address-required|email-address-format" />
From 7da696650ec6aba3a0a7915addc28a2f877219c3 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Fri, 7 Jul 2023 10:21:03 -0400 Subject: [PATCH 17/41] CSR-1505 | Refactoring and same-day functionality --- .../time-slot-modal-question.vue | 89 +++++++++++++++---- 1 file changed, 70 insertions(+), 19 deletions(-) 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 159994079..c4fbd4b50 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 @@ -55,6 +55,13 @@ import { PREMIUM_FEE_PART_TYPE, RouteCodeFlags, } from "@/constants/schedule-constants"; +const cmsWidgetFieldMappings = { + MODAL_CLOSE_BUTTON: "FooterText", + SUPPLEMENTAL_INFORMATION: "BodyText", + TIME_SLOT_BUTTON: "HeaderText", + DISCLAIMER: "FooterText", + DURATION: "SubheaderText", +}; // Validation for the modal button defineRule("time-slot-required", required(errorMessages.OPTION_REQUIRED)); @@ -124,30 +131,60 @@ export default { ); } } - return this.getCmsContent(appointmentTypeCmsWidgetName, "BodyText"); + return this.getCmsContent( + appointmentTypeCmsWidgetName, + cmsWidgetFieldMappings.SUPPLEMENTAL_INFORMATION + ); }, footerCloseButtonText() { - return this.getCmsContent(this.cmsWidgetName, "FooterText"); + return this.getCmsContent( + this.cmsWidgetName, + cmsWidgetFieldMappings.MODAL_CLOSE_BUTTON + ); }, premiumAppointmentButtonText() { - return this.getCmsContent(this.mobilePremiumCmsWidgetName, "HeaderText"); + return this.getCmsContent( + this.mobilePremiumCmsWidgetName, + cmsWidgetFieldMappings.TIME_SLOT_BUTTON + ); }, dropoffButtonText() { - return this.getCmsContent(this.dropoffCmsWidgetName, "HeaderText"); + return this.getCmsContent( + this.dropoffCmsWidgetName, + cmsWidgetFieldMappings.TIME_SLOT_BUTTON + ); + }, + sameDayDropoffButtonText() { + return this.getCmsContent( + this.sameDayDropOffCmsWidgetName, + cmsWidgetFieldMappings.TIME_SLOT_BUTTON + ); }, overnightDropoffButtonText() { - return this.getCmsContent(this.overnightDropOffCmsWidgetName, "HeaderText"); + return this.getCmsContent( + this.overnightDropOffCmsWidgetName, + cmsWidgetFieldMappings.TIME_SLOT_BUTTON + ); }, dropoffDisclaimerText() { - return this.getCmsContent(this.dropoffCmsWidgetName, "FooterText"); + return this.getCmsContent(this.dropoffCmsWidgetName, cmsWidgetFieldMappings.DISCLAIMER); + }, + sameDayDropOffDisclaimerText() { + return this.getCmsContent( + this.sameDayDropOffCmsWidgetName, + cmsWidgetFieldMappings.DISCLAIMER + ); }, overnightDropOffDisclaimerText() { - return this.getCmsContent(this.overnightDropOffCmsWidgetName, "FooterText"); + return this.getCmsContent( + this.overnightDropOffCmsWidgetName, + cmsWidgetFieldMappings.DISCLAIMER + ); }, disclaimerTextBlockCopy() { if (this.appointmentType === AppointmentTypeStrings.DROP_OFF) { if (this.isSameDay) { - return null; + return this.sameDayDropOffDisclaimerText; } else if (this.selectedTimeSlotId?.includes(RouteCodeFlags.ALL_DAY_DROP_OFF)) { return this.dropoffDisclaimerText; } else if (this.selectedTimeSlotId?.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF)) { @@ -160,15 +197,24 @@ export default { } }, dropOffDurationText() { - return this.getCmsContent(this.dropoffCmsWidgetName, "SubheaderText"); + return this.getCmsContent(this.dropoffCmsWidgetName, cmsWidgetFieldMappings.DURATION); + }, + sameDayDropoffDurationText() { + return this.getCmsContent( + this.sameDayDropOffCmsWidgetName, + cmsWidgetFieldMappings.DURATION + ); }, overnightDropoffDurationText() { - return this.getCmsContent(this.overnightDropOffCmsWidgetName, "SubheaderText"); + return this.getCmsContent( + this.overnightDropOffCmsWidgetName, + cmsWidgetFieldMappings.DURATION + ); }, inshopDurationText() { const inshopDurationTextWithoutTime = this.getCmsContent( this.cmsWidgetName, - "SubheaderText" + cmsWidgetFieldMappings.DURATION ); const inshopDurationTime = this.getDisplayTextForDurationLength( this.estimatedServiceMinutesMinimum, @@ -185,15 +231,16 @@ export default { if (this.selectedTimeSlotId?.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF)) { return this.overnightDropoffDurationText; } else if (this.selectedTimeSlotId?.includes(RouteCodeFlags.ALL_DAY_DROP_OFF)) { - return this.dropOffDurationText; + if (this.isSameDay) { + return this.sameDayDropoffDurationText; + } else { + return this.dropOffDurationText; + } } else { return null; } } }, - shouldShowDropoffDisclaimerText() { - return this.appointmentType === AppointmentTypeStrings.DROP_OFF && !this.isSameDay; - }, isSameDay() { if (!this.dateAndTimeSlotData) { return false; @@ -202,7 +249,6 @@ export default { const todaysDate = new Date().toISOString().split("T")[0]; return selectedDate === todaysDate; }, - dateSelectedReadableDate() { if (!this.dateAndTimeSlotData) { return null; @@ -303,9 +349,14 @@ export default { }, getAvailableTimeSlotsForDropOff(timeSlotsForSelectedDate) { const availableTimeSlots = timeSlotsForSelectedDate.map((timeSlot) => { - const buttonLabelValue = timeSlot.id.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF) - ? this.overnightDropoffButtonText - : this.dropoffButtonText; + let buttonLabelValue; + if (timeSlot.id.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF)) { + buttonLabelValue = this.overnightDropoffButtonText; + } else if (this.isSameDay) { + buttonLabelValue = this.sameDayDropoffButtonText; + } else { + buttonLabelValue = this.dropoffButtonText; + } return { value: timeSlot.id, buttonLabel: buttonLabelValue, From f811e76a10885c2f1f507e7ed350edd1a7e4ccc4 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Fri, 7 Jul 2023 15:42:18 -0400 Subject: [PATCH 18/41] CSR-1146 | add in provisionalBooking info to time-slot requests --- .../shop-question/shop-question.vue | 2 +- src/store/index.js | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/layouts/service-location/shop-question/shop-question.vue b/src/layouts/service-location/shop-question/shop-question.vue index 929c779af..f588f6422 100644 --- a/src/layouts/service-location/shop-question/shop-question.vue +++ b/src/layouts/service-location/shop-question/shop-question.vue @@ -108,7 +108,7 @@ export default { additionalButtonData() { const startDate = new Date(); const endDate = new Date(); - endDate.setDate(startDate.getDate() + 7); + endDate.setDate(startDate.getDate() + 6); const formattedStartDate = startDate.toISOString().split("T")[0]; const formattedEndDate = endDate.toISOString().split("T")[0]; diff --git a/src/store/index.js b/src/store/index.js index 3c0ea1e39..72faf237d 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1255,11 +1255,10 @@ export const actions = { additionalAuthFlag: "", }, partSelection: { - // TODO: Provisional booking will utilize these fields - hasAnsweredPartQuestions: false, - hasAnsweredMoldingQuestions: false, - hasAnsweredCapabilityQuestions: false, - hasManuallySelectedParts: false, + hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers, + hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers, + hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers, + hasManuallySelectedParts: !!context.state.applicationUser.pageData["vehicle-parts"], }, vehicle: { year: vehicle.year, @@ -1308,11 +1307,10 @@ export const actions = { additionalAuthFlag: "", }, partSelection: { - // TODO: Provisional booking will utilize these fields - hasAnsweredPartQuestions: false, - hasAnsweredMoldingQuestions: false, - hasAnsweredCapabilityQuestions: false, - hasManuallySelectedParts: false, + hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers, + hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers, + hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers, + hasManuallySelectedParts: !!context.state.applicationUser.pageData["vehicle-parts"], }, vehicle: { year: vehicle.year, From 17b6bd458214802f6e17bda6a2045883e8b9847b Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 10 Jul 2023 10:01:37 -0400 Subject: [PATCH 19/41] CSR-1146 | Empty arrays are inserted on refresh - fix --- src/store/index.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 72faf237d..8ade2e5a5 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1255,10 +1255,12 @@ export const actions = { additionalAuthFlag: "", }, partSelection: { - hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers, - hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers, - hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers, - hasManuallySelectedParts: !!context.state.applicationUser.pageData["vehicle-parts"], + hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers?.length, + hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers?.length, + hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers?.length, + hasManuallySelectedParts: + !!context.state.applicationUser.pageData["vehicle-parts"]?.partsOrQuestions + .length, }, vehicle: { year: vehicle.year, From 26bde84bfb6ad93e13532d1991375b7216a7ba1c Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 10 Jul 2023 10:13:41 -0400 Subject: [PATCH 20/41] CSR-1146 | Provisional flag fix for mobile slots --- src/store/index.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 8ade2e5a5..a40c7eaeb 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1309,10 +1309,12 @@ export const actions = { additionalAuthFlag: "", }, partSelection: { - hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers, - hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers, - hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers, - hasManuallySelectedParts: !!context.state.applicationUser.pageData["vehicle-parts"], + hasAnsweredPartQuestions: !!order.damage.partQuestionAnswers?.length, + hasAnsweredMoldingQuestions: !!order.damage.moldingQuestionAnswers?.length, + hasAnsweredCapabilityQuestions: !!order.damage.capabilityQuestionAnswers?.length, + hasManuallySelectedParts: + !!context.state.applicationUser.pageData["vehicle-parts"]?.partsOrQuestions + .length, }, vehicle: { year: vehicle.year, From 901db2e4b02bbd6ac16e644fc767ac178dbf2819 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Mon, 10 Jul 2023 10:35:53 -0400 Subject: [PATCH 21/41] CSR-1478 remove perfect match alert when zip is invalid. --- src/layouts/vin-lookup/vin-lookup.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index e820723bd..709029459 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -79,7 +79,7 @@ :manualHeadline="AlertPerfectMatchInsuranceVerifiedHeader" :manualCopy="AlertPerfectMatchInsuranceVerifiedBody" v-model="customAlertData" - v-if="vinPopulatedOnPageLoad && isInsuranceVerified" + v-if="vinPopulatedOnPageLoad && isInsuranceVerified && !displayInvalidZipAlert" alertClass="alert-success" /> Date: Tue, 11 Jul 2023 08:38:18 -0400 Subject: [PATCH 22/41] CSR-1474: set max-height to prevent iphone problems --- .../date-picker/date-picker.vue | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index 8b2cdc9ce..6c6cd48a4 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -6,7 +6,7 @@ v-for="month in months" :key="`${month.monthLabel}-${month.yearNum?.toString()}`" :id="`${month.monthLabel}-${month.yearNum?.toString()}`" - class="calendar-grid-container position-relative" + class="calendar-grid-container" :class="[ hideSomeDaysForInitialView ? 'partial-month-initial-view' : '', month.monthClass, @@ -628,12 +628,16 @@ export default { .date-picker { overflow: hidden; position: relative; - height: 100%; + flex-grow: 1; + display: flex; + flex-direction: column; fieldset { overflow-y: auto; - height: 88%; + flex-grow: 1; position: relative; + padding-bottom: 6rem; // arbitrary amount to provide enough spacing for scroll animation + max-height: 21.25rem; // 340px... arbitrary amount to not push View More link out of view on iphones } .loader { position: absolute; @@ -648,6 +652,7 @@ export default { .calendar-grid-container { margin: 0 auto 2rem auto; max-width: 414px; + position: relative; transition: height ease 2s, opacity ease 2s; display: grid; grid-template-columns: repeat(7, 1fr); @@ -864,21 +869,17 @@ export default { opacity: 0; max-height: 0; margin-bottom: 0; + overflow: hidden; } &.last-available-month:not(&.month-hidden) { margin-bottom: 14rem; } } - #bottom-spacer { - height: 20rem; - background: lightblue; - } .btn-link { font-weight: 500; text-underline-offset: 4px; - position: absolute; - top: 90%; + flex-grow: 0; } .past { From c3316df7ae751659a0807afcad624af391414b93 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Tue, 11 Jul 2023 10:02:12 -0400 Subject: [PATCH 23/41] CSR-1512 | Send in partType and partNumber to timeslots endpoints --- src/store/index.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index a40c7eaeb..5d74b26be 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1227,13 +1227,16 @@ export const actions = { const order = context.state.order; const vehicle = context.state.order.vehicle; - let partNumbers = [ + let lineItems = [ ...(order.lineItems.supportingItems ?? []), ...(order.lineItems.vaps ?? []), ...getFlattenedArrayOfLineItemsWithChildParts(order.lineItems.glassParts), ]; - partNumbers = partNumbers.map((lineItem) => { - return lineItem.partNumber; + lineItems = lineItems.map((lineItem) => { + return { + partNumber: lineItem.partNumber, + partType: lineItem.partType, + }; }); const glassPieces = order.damage.glassToReplace ? convertGlassPieceToBackEndCompatibleFormat(order.damage.glassToReplace) @@ -1246,7 +1249,7 @@ export const actions = { applicationName: applicationConfig.APPLICATION_NAME, parentAccountNumber: context.getters.payment.parentAccountNumber, carId: vehicle.carId, - partNumbers: partNumbers, + lineItems: lineItems, glassPieces: glassPieces, eon: order.eon, coverage: { @@ -1283,13 +1286,16 @@ export const actions = { getMobileTimeSlots(context, { startDate, endDate }) { const order = context.state.order; const vehicle = context.state.order.vehicle; - let partNumbers = [ + let lineItems = [ ...(order.lineItems.supportingItems ?? []), ...(order.lineItems.vaps ?? []), ...getFlattenedArrayOfLineItemsWithChildParts(order.lineItems.glassParts), ]; - partNumbers = partNumbers.map((lineItem) => { - return lineItem.partNumber; + lineItems = lineItems.map((lineItem) => { + return { + partNumber: lineItem.partNumber, + partType: lineItem.partType, + }; }); const glassPieces = order.damage.glassToReplace ? convertGlassPieceToBackEndCompatibleFormat(order.damage.glassToReplace) @@ -1300,7 +1306,7 @@ export const actions = { applicationName: applicationConfig.APPLICATION_NAME, parentAccountNumber: context.getters.payment.parentAccountNumber, carId: vehicle.carId, - partNumbers: partNumbers, + lineItems: lineItems, glassPieces: glassPieces, eon: order.eon, coverage: { From edab92d71bac9dd88e46c9b9b05830afc1480c92 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Tue, 11 Jul 2023 10:08:12 -0400 Subject: [PATCH 24/41] CSR-1497 | Same-day disclaimer fix --- .../time-slot-modal-question.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 c4fbd4b50..59b1e2e42 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 @@ -183,10 +183,12 @@ export default { }, disclaimerTextBlockCopy() { if (this.appointmentType === AppointmentTypeStrings.DROP_OFF) { - if (this.isSameDay) { - return this.sameDayDropOffDisclaimerText; - } else if (this.selectedTimeSlotId?.includes(RouteCodeFlags.ALL_DAY_DROP_OFF)) { - return this.dropoffDisclaimerText; + if (this.selectedTimeSlotId?.includes(RouteCodeFlags.ALL_DAY_DROP_OFF)) { + if (this.isSameDay) { + return this.sameDayDropOffDisclaimerText; + } else { + return this.dropoffDisclaimerText; + } } else if (this.selectedTimeSlotId?.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF)) { return this.overnightDropOffDisclaimerText; } else { From 6361c05cd67ddccf92ef53a00266206c90d4657d Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Tue, 11 Jul 2023 13:05:06 -0400 Subject: [PATCH 25/41] Update appointment time check to not auto-fail for same-day --- src/store/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/index.js b/src/store/index.js index a40c7eaeb..315a424c2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2189,6 +2189,7 @@ async function resetScheduleIfUnavailable(context, order) { // If you put any kind of time stamp on the date string with dashes, then it IS parsed as local time. var aptDate = new Date(order.schedule.date + "T00:00:00"); var curDate = new Date(); + curDate.setHours(0, 0, 0, 0); // if appointment date is in the past, clear schedule if (aptDate.getTime() < curDate.getTime()) { From 7f546164d4d176773777115776315a7fb13d76f0 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Tue, 11 Jul 2023 16:15:57 -0400 Subject: [PATCH 26/41] CSR-1409 remove margin from row and apply to error. --- src/digital-components/button-question/button-question.vue | 4 ++-- src/digital-components/textbox-question/textbox-question.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/digital-components/button-question/button-question.vue b/src/digital-components/button-question/button-question.vue index 7441ab422..610f8d4f8 100644 --- a/src/digital-components/button-question/button-question.vue +++ b/src/digital-components/button-question/button-question.vue @@ -72,9 +72,9 @@ https://safelite.atlassian.net/wiki/spaces/DC/pages/76644418/Button+Question+Com
-
+
diff --git a/src/digital-components/textbox-question/textbox-question.vue b/src/digital-components/textbox-question/textbox-question.vue index 1c87a2ac5..5e9662c87 100644 --- a/src/digital-components/textbox-question/textbox-question.vue +++ b/src/digital-components/textbox-question/textbox-question.vue @@ -64,9 +64,9 @@
-
+
{{ errorMessage }} Date: Thu, 13 Jul 2023 15:20:25 +0530 Subject: [PATCH 27/41] CSR-1418 Consolidated YMMS vehicle page --- src/constants/error-messages.js | 4 + .../dropdown-question/dropdown-question.vue | 1 + .../funnel-footer/funnel-footer.vue | 1 + .../vehicle-question/vehicle-question.spec.js | 56 ++++ .../vehicle-question/vehicle-question.vue | 62 ++++ src/layouts/vehicle/vehicle.spec.js | 91 ++++++ src/layouts/vehicle/vehicle.vue | 278 ++++++++++++++++++ src/router/router-constants/fmgPage-values.js | 1 + src/router/router-constants/routing-table.js | 9 + 9 files changed, 503 insertions(+) create mode 100644 src/layouts/vehicle/vehicle-question/vehicle-question.spec.js create mode 100644 src/layouts/vehicle/vehicle-question/vehicle-question.vue create mode 100644 src/layouts/vehicle/vehicle.spec.js create mode 100644 src/layouts/vehicle/vehicle.vue diff --git a/src/constants/error-messages.js b/src/constants/error-messages.js index 415647879..ef5459395 100644 --- a/src/constants/error-messages.js +++ b/src/constants/error-messages.js @@ -29,6 +29,10 @@ const errorMessages = { DATE_REQUIRED: "Please select a date", PHONE_REQUIRED: "Please enter your phone number", PHONE_FORMAT: "Phone number must be 10 digits", + YEAR_REQUIRED: "Please select your vehicle year", + MAKE_REQUIRED: "Please select your vehicle make", + MODEL_REQUIRED: "Please select your vehicle model", + STYLE_REQUIRED: "Please select your vehicle style", }; export { errorMessages }; diff --git a/src/digital-components/dropdown-question/dropdown-question.vue b/src/digital-components/dropdown-question/dropdown-question.vue index 0fc4a977c..1d8fe22cd 100644 --- a/src/digital-components/dropdown-question/dropdown-question.vue +++ b/src/digital-components/dropdown-question/dropdown-question.vue @@ -44,6 +44,7 @@ export default { isDisabled: Boolean, isRequired: Boolean, validationRules: String, + placeHolderText: String, cmsWidgetName: String, hasError: Boolean, }, diff --git a/src/fmg-components/funnel-footer/funnel-footer.vue b/src/fmg-components/funnel-footer/funnel-footer.vue index c036f8d0a..e093e43f9 100644 --- a/src/fmg-components/funnel-footer/funnel-footer.vue +++ b/src/fmg-components/funnel-footer/funnel-footer.vue @@ -13,6 +13,7 @@ :isDisabled="isForwardActionDisabled" @click-event="buttonClick" data-bs-target="#footerModal" + data-test-id="funnel-footer-main-button" data-bs-dismiss="modal" />
@@ -74,10 +76,11 @@ export default { }, computed: { displayAvailabilityIndicators() { - return experimentMixin.methods.hasSettingEqualTo( - experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, - "true" - ); + return true; + // return experimentMixin.methods.hasSettingEqualTo( + // experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, + // "true" + // ); }, isLoaderDisplayed() { return this.availabilityRating == null; diff --git a/src/ux-components/loader/loader.vue b/src/ux-components/loader/loader.vue index 0de04da27..eb244c796 100644 --- a/src/ux-components/loader/loader.vue +++ b/src/ux-components/loader/loader.vue @@ -3,7 +3,11 @@ class="loader" role="alert" aria-label="Loading new page" - v-bind:class="[this.loaderColor, this.loaderPosition]">
+ v-bind:class="[ + this.loaderColor, + this.loaderPosition, + this.allowPageInteraction ? 'allow-ui-interaction' : '', + ]"> @@ -83,8 +93,8 @@ export default { &.black:after { background-color: $black; } - //no-block to enable clicking on certain buttons with loaders while the loader is actives - &.no-block::before { + &.allow-ui-interaction::before { + //no-block to enable clicking on certain buttons with loaders while the loader is actives z-index: -1; } } From 1a1e97485cee4288a27beedc82d330bf8f431d49 Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Mon, 17 Jul 2023 08:52:25 -0400 Subject: [PATCH 37/41] Removed commented test code --- .../shop-question/shop-list-button/shop-list-button.vue | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue index 510d9bbbf..31c415a2d 100644 --- a/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue +++ b/src/layouts/service-location/shop-question/shop-list-button/shop-list-button.vue @@ -76,11 +76,10 @@ export default { }, computed: { displayAvailabilityIndicators() { - return true; - // return experimentMixin.methods.hasSettingEqualTo( - // experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, - // "true" - // ); + return experimentMixin.methods.hasSettingEqualTo( + experimentSettings.DISPLAY_AVAILABILITY_INDICATORS, + "true" + ); }, isLoaderDisplayed() { return this.availabilityRating == null; From 5b5d03097cdb1ff6218ee189bd0aa4e585f19f50 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Mon, 17 Jul 2023 09:46:16 -0400 Subject: [PATCH 38/41] CSR-1530 fix multi-error displaying. --- src/layouts/vin-lookup/vin-lookup.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 709029459..41583308e 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -79,7 +79,7 @@ :manualHeadline="AlertPerfectMatchInsuranceVerifiedHeader" :manualCopy="AlertPerfectMatchInsuranceVerifiedBody" v-model="customAlertData" - v-if="vinPopulatedOnPageLoad && isInsuranceVerified && !displayInvalidZipAlert" + v-if="vinPopulatedOnPageLoad && isInsuranceVerified && !displayInvalidZipAlert && !displayNonServiceableZipAlert" alertClass="alert-success" /> Date: Mon, 17 Jul 2023 09:49:03 -0400 Subject: [PATCH 39/41] Code format. --- src/layouts/vin-lookup/vin-lookup.vue | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 41583308e..a6b902c09 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -79,7 +79,12 @@ :manualHeadline="AlertPerfectMatchInsuranceVerifiedHeader" :manualCopy="AlertPerfectMatchInsuranceVerifiedBody" v-model="customAlertData" - v-if="vinPopulatedOnPageLoad && isInsuranceVerified && !displayInvalidZipAlert && !displayNonServiceableZipAlert" + v-if=" + vinPopulatedOnPageLoad && + isInsuranceVerified && + !displayInvalidZipAlert && + !displayNonServiceableZipAlert + " alertClass="alert-success" /> Date: Mon, 17 Jul 2023 10:45:51 -0400 Subject: [PATCH 40/41] CSR-1483: styling fixes --- .../date-picker/date-picker.vue | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index a20884d40..2149a9cd5 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -56,15 +56,15 @@ :class="[!isLoading ? 'date-picker-hidden' : '']" loaderColor="blue" loaderPosition="center" /> + - @@ -660,27 +660,22 @@ export default { max-height: 0; } .date-picker { - overflow: hidden; position: relative; flex-grow: 1; display: flex; flex-direction: column; fieldset { - overflow-y: auto; flex-grow: 1; position: relative; - padding-bottom: 6rem; // arbitrary amount to provide enough spacing for scroll animation - max-height: 21.25rem; // 340px... arbitrary amount to not push View More link out of view on iphones } .loader { - position: absolute; height: 2rem; - width: 2rem; + width: calc(100% - 1.5rem); &::after { - width: 100%; - height: 100%; + width: 1.5rem; + height: 1.5rem; } } .calendar-grid-container { @@ -813,9 +808,9 @@ export default { display: flex; justify-content: center; align-items: center; - width: 3rem; + min-width: 2.5rem; + width: 2.5rem; height: 2.5rem; - min-width: 3rem; span { &.small { From 11416be775bd559a4b5e417c780c8302308a5d75 Mon Sep 17 00:00:00 2001 From: Sneha Date: Tue, 18 Jul 2023 16:54:11 +0530 Subject: [PATCH 41/41] Update routing-table.js --- src/router/router-constants/routing-table.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/router/router-constants/routing-table.js b/src/router/router-constants/routing-table.js index 7cc111d58..0c2beffee 100644 --- a/src/router/router-constants/routing-table.js +++ b/src/router/router-constants/routing-table.js @@ -66,7 +66,7 @@ const routingTable = function (store) { maps: [ { scenario: navigationScenarios.CLICKED_BACK, - destinationFmgPageValue: fmgPageValues.VEHICLE_STYLE, + destinationFmgPageValue: fmgPageValues.VEHICLE, }, { scenario: navigationScenarios.CLICKED_FORWARD_WITH_VIN, @@ -466,7 +466,7 @@ const routingTable = function (store) { maps: [ { scenario: navigationScenarios.CLICKED_VEHICLE_EDIT, - destinationFmgPageValue: fmgPageValues.VEHICLE_YEAR, + destinationFmgPageValue: fmgPageValues.VEHICLE, }, { scenario: navigationScenarios.CLICKED_DAMAGE_EDIT,