From 22ab7632a5f4c0ba6711953302fd4e0037e12d0a Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 26 May 2025 11:09:59 +0530 Subject: [PATCH 01/20] CASH-761 remove link button for mobile address question --- .../mobile-location-modal-questions.vue | 63 +++---------------- .../service-location/service-location.spec.js | 3 +- .../service-location/service-location.vue | 20 +----- 3 files changed, 12 insertions(+), 74 deletions(-) diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index f50d855f7..33a443d5a 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -2,21 +2,7 @@
- - -
+
+ typeStyle="caption" + class="ps-4 pe-4 mt-4" />
-
+
diff --git a/src/fmg-components/funnel-header/funnel-header.vue b/src/fmg-components/funnel-header/funnel-header.vue index fc77336d3..f7d55b354 100644 --- a/src/fmg-components/funnel-header/funnel-header.vue +++ b/src/fmg-components/funnel-header/funnel-header.vue @@ -55,6 +55,8 @@ export default { return { globalAlertMessages: [], sierraChatOpen: false, + salesforceChatOpen: false, + isSalesforceTransferInProgress: false, }; }, props: { @@ -73,16 +75,19 @@ export default { return this.getCmsContent(this.cmsWidgetName, "LogoImage"); }, shouldShowWebchatButton() { - // Always update experiment flag before computing visibility - this.syncSierraExperimentFlag(); - // Show if Sierra experiment is active and chat is not open - if (this.webchatGlobalNonpersistedState.shouldLaunchSierra) { - return !this.sierraChatOpen; + // Hide the chat icon if Sierra chat is open + if (this.sierraChatOpen) { + return false; } - // Otherwise, use Salesforce logic + // Hide the chat icon if Salesforce chat is open or transfer is in progress + if (this.salesforceChatOpen || this.isSalesforceTransferInProgress) { + return false; + } + // Show if either Sierra is enabled or Salesforce button is available and not hidden by page return ( - !this.shouldHideWebchatButtonOnPage && - this.webchatGlobalNonpersistedState.showWebchatButton + (this.webchatGlobalNonpersistedState.shouldLaunchSierra || + this.webchatGlobalNonpersistedState.showWebchatButton) && + !this.shouldHideWebchatButtonOnPage ); }, }, @@ -123,6 +128,7 @@ export default { progressBar, }, mounted() { + this.syncSierraExperimentFlag(); // Check if alert event is on the bus const alertEvent = eventBus.readAndPopEventFromBus( globalEvents.Categories.GLOBAL_ALERT, @@ -144,14 +150,47 @@ export default { unknownAlertEvent.displayAlert = true; this.globalAlertMessages.push(unknownAlertEvent); } - // Listen for Sierra chat close event to re-enable the chat button if needed - this._handleSierraChatClosed = () => { - this.sierraChatOpen = false; + // Listen for Sierra chat open/close events from sierra-webchat + this._handleSierraChatVisibility = (event) => { + this.sierraChatOpen = !!(event.detail && event.detail.open); + if (this.sierraChatOpen) { + this.isSalesforceTransferInProgress = false; + } }; - window.addEventListener("sierra-chat-closed", this._handleSierraChatClosed); + window.addEventListener("sierra-chat-visibility", this._handleSierraChatVisibility); + + // Listen for Salesforce chat open/close events from salesforce-webchat + this._handleSalesforceChatVisibility = (event) => { + this.salesforceChatOpen = !!(event.detail && event.detail.open === true); + }; + window.addEventListener("salesforce-chat-visibility", this._handleSalesforceChatVisibility); + + // Listen for transfer event to set transfer-in-progress flag + this._handleSierraToSalesforceTransfer = () => { + this.isSalesforceTransferInProgress = true; + }; + window.addEventListener("sierra-chat-transfer", this._handleSierraToSalesforceTransfer); + + // Reset transfer flag when Salesforce chat opens + this._handleSalesforceChatOpened = (event) => { + if (event.detail && event.detail.open === true) { + this.isSalesforceTransferInProgress = false; + this.salesforceChatOpen = true; + } else { + this.salesforceChatOpen = false; + } + }; + window.addEventListener("salesforce-chat-visibility", this._handleSalesforceChatOpened); }, beforeUnmount() { window.removeEventListener("sierra-chat-closed", this._handleSierraChatClosed); + window.removeEventListener("sierra-chat-visibility", this._handleSierraChatVisibility); + window.removeEventListener( + "salesforce-chat-visibility", + this._handleSalesforceChatVisibility + ); + window.removeEventListener("sierra-chat-transfer", this._handleSierraToSalesforceTransfer); + window.removeEventListener("salesforce-chat-visibility", this._handleSalesforceChatOpened); }, }; From b5dbcb07db2b0f547372488bb7b10a66a7c5d3a3 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Wed, 28 May 2025 17:55:38 +0530 Subject: [PATCH 05/20] CASH-761 mobile location validation --- .../service-location/service-location.spec.js | 1 + .../service-location/service-location.vue | 29 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index b80644dc0..58187496e 100644 --- a/src/layouts/service-location/service-location.spec.js +++ b/src/layouts/service-location/service-location.spec.js @@ -1435,6 +1435,7 @@ function setupMocks({ 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 d4bdae818..3945d5e48 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -174,13 +174,20 @@ const MOBILE_FEE_PART_TYPE = "MOBILE FEE"; // DEFINE VALIDATION RULES defineRule("mobile-location-required", (value) => { + const addressQuestionsValues = Object.values( + [ + value.addressQuestions.streetAddress, + value.addressQuestions.city, + value.isVehicleProtected, + ] || {} + ); + const filledFields = addressQuestionsValues.filter( + (val) => val !== null && val !== undefined && val !== "" + ); if ( value.isMobileSelected && - (!value.addressQuestions.streetAddress || - !value.addressQuestions.city || - !value.addressQuestions.state || - !value.addressQuestions.zipCode || - !value.isVehicleProtected) + filledFields.length > 0 && + filledFields.length < addressQuestionsValues.length ) { return errorMessages.MOBILE_LOCATION_REQUIRED; } @@ -780,8 +787,18 @@ 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(); + this.$refs.mobileLocationQuestions.resetAlerts(); + } else { + this.resetMobileLocation(); + } } else { - this.selectedProvider = new Provider(); + this.selectedProvider = new Provider(); } }, }, From bc7671fe802ae166600779ce3d15486b6270c6d0 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Wed, 28 May 2025 18:05:22 +0530 Subject: [PATCH 06/20] CASH-761 formatting --- .../mobile-location-modal-questions.vue | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index 33a443d5a..b8b254be7 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -68,7 +68,6 @@ import { // Validation import { useField } from "vee-validate"; import { v4 as uuidv4 } from "uuid"; -import { FALSE } from "sass"; export default { name: "mobile-location-modal-questions", @@ -304,10 +303,6 @@ export default { .update-mobile-location-text-link { white-space: pre-line; } - // .address-questions-container { - // margin-top: 1rem; - // } - .text-black { color: $black; } From ad743b477498960b18b28b88c1b35a5701c7f601 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Wed, 28 May 2025 09:21:43 -0400 Subject: [PATCH 07/20] CASH-718 put dot in place outside of PDB experiment. --- .../date-picker/date-picker.vue | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index 17d06d057..f73ce44eb 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -1081,7 +1081,7 @@ export default { border-radius: 50%; background-color: $black; position: absolute; - top: 1.875rem; + top: 1.75rem; } .first-day { color: $blue; @@ -1090,13 +1090,6 @@ export default { input[type="radio"]:checked + label:after { background-color: $black; } - &.selectable-day { - label { - &:after { - display: none; - } - } - } } } @@ -1285,6 +1278,13 @@ export default { } } } + &.selectable-day.current-day { + label { + &:after { + display: none; + } + } + } } } } From cae4b723902eb8846547bed12d8cbc96f1e38f72 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Wed, 28 May 2025 20:19:07 +0530 Subject: [PATCH 08/20] CASH-550 Add coverage status to save-progress --- src/store/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/index.js b/src/store/index.js index 8356f35f3..64a0ba257 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2190,6 +2190,7 @@ export const actions = { serverData: lineItems.serverData, promos: lineItems.promos, }, + coverageStatus: order.payment.insuranceCoverage.coverageStatus ?? "", }, logApiCall: true, pageNameToLog: pageNameToLog, From f29e07529ac11e8884e43406788072853ec2a171 Mon Sep 17 00:00:00 2001 From: Johnny shultz Date: Wed, 28 May 2025 11:29:22 -0400 Subject: [PATCH 09/20] CASH-494 CASH-494 added experimentOrder fields for ITAC and NoComp --- src/store/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 8356f35f3..ddb2aab19 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -963,6 +963,8 @@ export const getters = { funnelServiceState: state.order.serviceLocation.state, funnelServiceZipCode: state.order.serviceLocation.zipCode, funnelServiceZipCodeCtu: state.order.serviceLocation.zipCodeCtu, + funnelPolicyIsItac: state.order.policy.isItac ? "TRUE" : "FALSE", + funnelPolicyIsNoComp: state.order.policy.isNoComp ? "TRUE" : "FALSE", funnelProviderNumber: state.order.serviceLocation.provider.providerNumber, funnelParentAccountNumber: state.order.payment.parentAccountNumber, funnelReferralType: state.order.payment.isInsurance ? "INSURANCE" : "CASH QUOTE", From 634713ab982cf1c3978f4b5aab826b43b5306e2e Mon Sep 17 00:00:00 2001 From: Johnny shultz Date: Wed, 28 May 2025 11:43:24 -0400 Subject: [PATCH 10/20] CASH-494 CASH-494 changed TRUE and FALSE to lowercase --- src/store/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index ddb2aab19..7499a4af9 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -963,8 +963,8 @@ export const getters = { funnelServiceState: state.order.serviceLocation.state, funnelServiceZipCode: state.order.serviceLocation.zipCode, funnelServiceZipCodeCtu: state.order.serviceLocation.zipCodeCtu, - funnelPolicyIsItac: state.order.policy.isItac ? "TRUE" : "FALSE", - funnelPolicyIsNoComp: state.order.policy.isNoComp ? "TRUE" : "FALSE", + funnelPolicyIsItac: state.order.policy.isItac ? "true" : "false", + funnelPolicyIsNoComp: state.order.policy.isNoComp ? "true" : "false", funnelProviderNumber: state.order.serviceLocation.provider.providerNumber, funnelParentAccountNumber: state.order.payment.parentAccountNumber, funnelReferralType: state.order.payment.isInsurance ? "INSURANCE" : "CASH QUOTE", From e6902b3cadbb1259b73b69121999ecf8a9732a9c Mon Sep 17 00:00:00 2001 From: Johnny shultz Date: Wed, 28 May 2025 12:06:47 -0400 Subject: [PATCH 11/20] CASH-494 CASH-494 fixed unit tests --- src/store/store.spec.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 68c8f6761..cfc442612 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -3758,6 +3758,8 @@ describe("Getters", () => { funnelServiceState: "OH-IO", funnelServiceZipCode: 43215, funnelParentAccountNumber: "999999", + funnelPolicyIsItac: "false", + funnelPolicyIsNoComp: "false", funnelIsCoverageVerified: true, funnelGlassParts: null, funnelSupportingItems: null, @@ -3809,6 +3811,8 @@ describe("Getters", () => { funnelServiceState: mockStateValues.funnelServiceState, funnelServiceZipCode: mockStateValues.funnelServiceZipCode, funnelParentAccountNumber: mockStateValues.funnelParentAccountNumber, + funnelPolicyIsItac: mockStateValues.funnelPolicyIsItac, + funnelPolicyIsNoComp: mockStateValues.funnelPolicyIsNoComp, funnelIsCoverageVerified: mockStateValues.funnelIsCoverageVerified, funnelOrderPartNumbers: [], funnelOrderPartTypes: [], @@ -3839,6 +3843,8 @@ describe("Getters", () => { funnelServiceState: "OH-IO", funnelServiceZipCode: 43215, funnelParentAccountNumber: "999999", + funnelPolicyIsItac: "false", + funnelPolicyIsNoComp: "false", funnelIsCoverageVerified: true, funnelGlassParts: [], funnelOtherParts: [], @@ -3889,6 +3895,8 @@ describe("Getters", () => { funnelServiceState: mockStateValues.funnelServiceState, funnelServiceZipCode: mockStateValues.funnelServiceZipCode, funnelParentAccountNumber: mockStateValues.funnelParentAccountNumber, + funnelPolicyIsItac: mockStateValues.funnelPolicyIsItac, + funnelPolicyIsNoComp: mockStateValues.funnelPolicyIsNoComp, funnelIsCoverageVerified: mockStateValues.funnelIsCoverageVerified, funnelOrderPartNumbers: [], funnelOrderPartTypes: [], @@ -3919,6 +3927,8 @@ describe("Getters", () => { serviceState: "OH-IO", serviceZipCode: 43215, parentAccountNumber: "999999", + funnelPolicyIsItac: "false", + funnelPolicyIsNoComp: "false", isCoverageVerified: false, glassParts: [ { @@ -3979,6 +3989,8 @@ describe("Getters", () => { funnelServiceState: mockStateValues.serviceState, funnelServiceZipCode: mockStateValues.serviceZipCode, funnelParentAccountNumber: mockStateValues.parentAccountNumber, + funnelPolicyIsItac: mockStateValues.funnelPolicyIsItac, + funnelPolicyIsNoComp: mockStateValues.funnelPolicyIsNoComp, funnelIsCoverageVerified: mockStateValues.isCoverageVerified, funnelOrderPartNumbers: ["WINDSHIELDPARTNUMBER"], funnelOrderPartTypes: ["ADAS, maybe"], @@ -4009,6 +4021,8 @@ describe("Getters", () => { serviceState: "OH-IO", serviceZipCode: 43215, parentAccountNumber: "999999", + funnelPolicyIsItac: "false", + funnelPolicyIsNoComp: "false", isCoverageVerified: false, glassParts: [ { @@ -4084,6 +4098,8 @@ describe("Getters", () => { funnelServiceState: mockStateValues.serviceState, funnelServiceZipCode: mockStateValues.serviceZipCode, funnelParentAccountNumber: mockStateValues.parentAccountNumber, + funnelPolicyIsItac: mockStateValues.funnelPolicyIsItac, + funnelPolicyIsNoComp: mockStateValues.funnelPolicyIsNoComp, funnelIsCoverageVerified: mockStateValues.isCoverageVerified, funnelOrderPartNumbers: ["WINDSHIELDPARTNUMBER"], funnelOrderPartTypes: ["ADAS, maybe"], @@ -4114,6 +4130,8 @@ describe("Getters", () => { serviceState: "OH-IO", serviceZipCode: 43215, parentAccountNumber: "999999", + funnelPolicyIsItac: "false", + funnelPolicyIsNoComp: "false", isCoverageVerified: false, glassParts: [ { @@ -4200,6 +4218,8 @@ describe("Getters", () => { funnelServiceState: mockStateValues.serviceState, funnelServiceZipCode: mockStateValues.serviceZipCode, funnelParentAccountNumber: mockStateValues.parentAccountNumber, + funnelPolicyIsItac: mockStateValues.funnelPolicyIsItac, + funnelPolicyIsNoComp: mockStateValues.funnelPolicyIsNoComp, funnelIsCoverageVerified: mockStateValues.isCoverageVerified, funnelOrderPartNumbers: ["BACKGLASS_PN", "DRIVERGLASS_PN", "PASSENGERGLASS_PN"], funnelOrderPartTypes: [], From 98099f909c22f95d9270d0da4009640de647c315 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Wed, 28 May 2025 15:09:30 -0400 Subject: [PATCH 12/20] CASH-580: UI fix --- src/layouts/payment/payment.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/payment/payment.vue b/src/layouts/payment/payment.vue index bb617ec58..3a9fc4cd0 100644 --- a/src/layouts/payment/payment.vue +++ b/src/layouts/payment/payment.vue @@ -919,6 +919,9 @@ export default { .payment-method-question { padding: 0 1.5rem; + .question-text span { + text-align: left; + } } .ui-block { From f35a2f2cdf705fa506f103b6849feb815a52712e Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Wed, 28 May 2025 15:29:42 -0400 Subject: [PATCH 13/20] CASH-609 - Add dataevents for Sierra/Salesforce chat --- .../salesforce-webchat/salesforce-webchat.vue | 5 +++ .../sierra-webchat/sierra-webchat.spec.js | 21 +++++++++-- .../sierra-webchat/sierra-webchat.vue | 3 ++ src/mixins/analytics-mixin.js | 35 +++++++++++++------ src/mixins/analytics-mixin.spec.js | 14 ++++++-- src/store/index.js | 2 +- src/store/store.spec.js | 1 + 7 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/digital-components/salesforce-webchat/salesforce-webchat.vue b/src/digital-components/salesforce-webchat/salesforce-webchat.vue index 20ac8e44f..29c0906b9 100644 --- a/src/digital-components/salesforce-webchat/salesforce-webchat.vue +++ b/src/digital-components/salesforce-webchat/salesforce-webchat.vue @@ -9,9 +9,11 @@ import { initializeSalesforceWebchatForQa } from "./salesforce-helper-qa"; import { initializeSalesforceWebchatForProd } from "./salesforce-helper-prod"; import { applicationConfig } from "@/constants/application-config"; import { webchatHelper } from "@/helpers/webchat-helper"; +import analyticsMixin from "@/mixins/analytics-mixin"; export default { name: "salesforceWebchat", + mixins: [analyticsMixin], data() { return { isAgentAvailable: false, @@ -94,6 +96,9 @@ export default { window.embedded_svc.settings.prechatBackgroundImgURL = require("@/assets/img/salesforce-webchat/safelite_logo_webchat.png"); window.embedded_svc.settings.smallCompanyLogoImgURL = require("@/assets/img/salesforce-webchat/minimized_chat_bubble_webchat.png"); window.embedded_svc.settings.displayHelpButton = false; + window.embedded_svc.addEventHandler("onChatEstablished", () => { + this.pushEventForChatsToGA("support_chat", "chat_opened", "Live Agent", true); + }); }, finishedLoadingCallback(data) { this.isAgentAvailable = data.isAgentAvailable; diff --git a/src/digital-components/sierra-webchat/sierra-webchat.spec.js b/src/digital-components/sierra-webchat/sierra-webchat.spec.js index 5734eaab8..e4d819ffb 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.spec.js +++ b/src/digital-components/sierra-webchat/sierra-webchat.spec.js @@ -1,11 +1,28 @@ import { shallowMount } from "@vue/test-utils"; -import SierraWebchat from "./sierra-webchat.vue"; +import sierraWebchat from "./sierra-webchat.vue"; + +jest.mock("@/mixins/analytics-mixin"); +// Mock router for analytics-mixin +jest.mock("@/router", () => ({ + currentRoute: { + value: { + name: "mockedPageName", + }, + }, + default: { + currentRoute: { + value: { + name: "mockedPageName", + }, + }, + }, +})); describe("sierraWebchat.vue", () => { let wrapper; beforeEach(() => { - wrapper = shallowMount(SierraWebchat); + wrapper = shallowMount(sierraWebchat); // Mock global window properties window.sierraChat = { openChatModal: jest.fn(), closeChatModal: jest.fn() }; window.sierra = undefined; diff --git a/src/digital-components/sierra-webchat/sierra-webchat.vue b/src/digital-components/sierra-webchat/sierra-webchat.vue index e12ab053e..2a114616a 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.vue +++ b/src/digital-components/sierra-webchat/sierra-webchat.vue @@ -3,8 +3,10 @@