diff --git a/src/constants/endorsement-codes.js b/src/constants/endorsement-codes.js new file mode 100644 index 00000000..222c90f8 --- /dev/null +++ b/src/constants/endorsement-codes.js @@ -0,0 +1,6 @@ +const endorsementCodes_LibertyMutual = Object.freeze({ + EDUCATOR: '001', + PARKING_GUARD: '003' +}); + +export default endorsementCodes_LibertyMutual; \ No newline at end of file diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index bf12c5c2..c8ddf306 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -526,13 +526,18 @@ export function doesCopyContainTextLink(copy) { * * @param context */ -export function setupModalLinks(context) { +export function setupModalLinks(context, abortSignal = null) { context.$nextTick(() => { const elements = document.getElementsByClassName('modal-text'); for (const element of elements) { const target = element.getAttribute('modalTarget'); if (target) { - element.addEventListener('click', () => context.$refs[target].openModal()); + if (abortSignal) { + element.addEventListener('click', () => context.$refs[target].openModal(), { signal: abortSignal }); + } + else { + element.addEventListener('click', () => context.$refs[target].openModal()); + } } } }); diff --git a/src/helpers/policy-vehicle-helper.js b/src/helpers/policy-vehicle-helper.js index 69a80e74..783f210d 100644 --- a/src/helpers/policy-vehicle-helper.js +++ b/src/helpers/policy-vehicle-helper.js @@ -1,4 +1,5 @@ import endorsementOptions from '@/constants/endorsement-options'; +import endorsementCodes_LibertyMutual from '@/constants/endorsement-codes'; export function noCoverageForSelectedVehicle(vehicle) { return (vehicle?.coverages?.length ?? 0) === 0; @@ -18,6 +19,20 @@ export function endorsementsForSelectedVehicle(vehicle) { } return []; } +export function endorsementCodesForSelectedVehicle(vehicle) { + if (!Array.isArray(vehicle?.endorsements) || vehicle.endorsements.length === 0) { + return ''; + } + + let codes = []; + if (vehicle.endorsements.includes(endorsementOptions.EDUCATOR)) { + codes.push(endorsementCodes_LibertyMutual.EDUCATOR); + } + if (vehicle.endorsements.includes(endorsementOptions.PARKING_GUARD)) { + codes.push(endorsementCodes_LibertyMutual.PARKING_GUARD); + } + return codes.join(','); +} export function repairWaivedForSelectedVehicle(vehicle) { return vehicle?.endorsements?.includes(endorsementOptions.REPAIR_WAIVED) ?? false; } diff --git a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap index 52bab2ae..997f06bc 100644 --- a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap +++ b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap @@ -5,6 +5,11 @@ Object { "CANCEL_CLAIM_REF_NAME": "CancelClaimModal", "OEM_ENDORSEMENT_REF_NAME": "OEMModal", "RECAL_MODAL_REF_NAME": "RecalModal", + "abortController": AbortController { + Symbol(SameObject caches): Object { + "signal": AbortSignal {}, + }, + }, "baseServiceLineItems": Array [], "isPageLoading": true, "widget": Object { diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 88a0ecb7..54e341ff 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -131,7 +131,6 @@ import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; // Import Supporting Files import { fetchCmsContentForPage, - setupModalLink, setupModalLinks, processIfStatements } from '@/helpers/cms-content-helper.js'; @@ -231,7 +230,8 @@ export default { }, RECAL_MODAL_REF_NAME, CANCEL_CLAIM_REF_NAME, - OEM_ENDORSEMENT_REF_NAME + OEM_ENDORSEMENT_REF_NAME, + abortController: new AbortController() }; }, computed: { @@ -367,8 +367,9 @@ export default { watch: { nextStepsBody(newValue, oldValue) { if (newValue !== oldValue) { - setupModalLink(this, RECAL_MODAL_REF_NAME); - setupModalLink(this, OEM_ENDORSEMENT_REF_NAME); + this.abortController.abort(); + this.abortController = new AbortController(); + setupModalLinks(this, this.abortController.signal); } } }, @@ -376,7 +377,7 @@ export default { if (this.isPageLoading) { showIssLoadingModal(true); } - setupModalLinks(this); + setupModalLinks(this, this.abortController.signal); }, methods: { logEventsToGA() { diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js index 9438b038..aef28e10 100644 --- a/src/layouts/order-confirmation/order-confirmation.spec.js +++ b/src/layouts/order-confirmation/order-confirmation.spec.js @@ -441,7 +441,7 @@ describe('OrderConfirmation.vue', () => { const testValue = wrapper.vm.appointmentTimeText; // Assert - expect(testValue).toEqual('Drop off before 9:30 AM'); + expect(testValue).toEqual('Drop off by 9:30 AM. Pick-up time dependent on shop schedule'); }); test.each([ ['Your appointment is at 9:00 AM', '09:00', '10:00'], diff --git a/src/layouts/order-confirmation/order-confirmation.vue b/src/layouts/order-confirmation/order-confirmation.vue index 063346f2..1a3b6db9 100644 --- a/src/layouts/order-confirmation/order-confirmation.vue +++ b/src/layouts/order-confirmation/order-confirmation.vue @@ -341,7 +341,7 @@ export default { appointmentTimeText() { const { startTime, endTime } = this.schedule; if (this.isDropOffAppointment) { - return 'Drop off before 9:30 AM'; + return 'Drop off by 9:30 AM. Pick-up time dependent on shop schedule'; } if (this.isInShopAppointment) { const formattedStartTime = get12HourTimeFormat(startTime); diff --git a/src/layouts/policy-vehicles/policy-vehicles.spec.js b/src/layouts/policy-vehicles/policy-vehicles.spec.js index 176d4eb7..f144af63 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.spec.js +++ b/src/layouts/policy-vehicles/policy-vehicles.spec.js @@ -125,7 +125,8 @@ describe('policy-vehicles.vue', () => { noCoverage: true, deductible: 0, repairWaived: false, - endorsements: [] + endorsements: [], + cvrgEndorsementCode: "" }; // Act @@ -180,7 +181,8 @@ describe('policy-vehicles.vue', () => { noCoverage: true, deductible: 0, repairWaived: false, - endorsements + endorsements, + cvrgEndorsementCode: "001" }; // Act @@ -233,7 +235,8 @@ describe('policy-vehicles.vue', () => { noCoverage: true, deductible: 0, repairWaived: false, - endorsements + endorsements, + cvrgEndorsementCode: "003" }; // Act diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index 019c0059..776a48a5 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -55,6 +55,7 @@ import { useMainStore } from '@/store/index.js'; import { deductibleForSelectedVehicle, endorsementsForSelectedVehicle, + endorsementCodesForSelectedVehicle, noCoverageForSelectedVehicle, repairWaivedForSelectedVehicle } from '@/helpers/policy-vehicle-helper'; @@ -132,6 +133,9 @@ export default { endorsementsForSelectedVehicle() { return endorsementsForSelectedVehicle(this.selectedPolicyVehicle); }, + endorsementCodesForSelectedVehicle() { + return endorsementCodesForSelectedVehicle(this.selectedPolicyVehicle); + }, repairWaivedForSelectedVehicle() { return repairWaivedForSelectedVehicle(this.selectedPolicyVehicle); } @@ -201,7 +205,8 @@ export default { noCoverage: this.noCoverageForSelectedVehicle, deductible: this.deductibleForSelectedVehicle, repairWaived: this.repairWaivedForSelectedVehicle, - endorsements: this.endorsementsForSelectedVehicle + endorsements: this.endorsementsForSelectedVehicle, + cvrgEndorsementCode: this.endorsementCodesForSelectedVehicle }); this.navigateForward(); } catch (e) { diff --git a/src/layouts/service-packages/service-packages.vue b/src/layouts/service-packages/service-packages.vue index 6c95e13b..1e378490 100644 --- a/src/layouts/service-packages/service-packages.vue +++ b/src/layouts/service-packages/service-packages.vue @@ -71,6 +71,7 @@ import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue' import contentGroupModal from '@/iss-components/content-group-modal/content-group-modal.vue'; import loadingModal from '@/iss-components/loading-modal/loading-modal.vue'; import settleAllPromises from '@/helpers/layout-helper'; +import showIssLoadingModal from '@/helpers/loading-modal-helper'; import { useMainStore } from '@/store'; import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; import { Form } from 'vee-validate'; @@ -227,6 +228,7 @@ export default { this.selectedPackageTier = packageTier; }, forwardButtonAction() { + showIssLoadingModal(true); const parts = { vaps: this.selectedVaps }; diff --git a/src/store/index.js b/src/store/index.js index 680561af..de4e1d4a 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,6 +4,7 @@ import bailoutCode from '@/constants/bailoutCode'; import coverageStatuses from '@/constants/coverage-statuses'; import coverageType from '@/constants/coverage-type'; import damageLocationsSelected from '@/constants/damage-locations-selected'; +import endorsementOptions from '@/constants/endorsement-options'; import endpoints from '@/constants/endpoints'; import { experimentSettings, experimentTriggers, experimentUniverses } from '@/constants/experiments'; import partNumberStrings from '@/constants/part-number-strings'; @@ -17,7 +18,7 @@ import { convertDateStringToDate, getDateDifferenceInDays, militaryToTwelveHourT import { getExperimentSettingValue, getFeatureTogglesPayloadObject } from '@/helpers/experiment-helper'; import { findLineItemIndex, getLineItemsFlattened } from '@/helpers/line-items-helper'; import { - deductibleForSelectedVehicle, endorsementsForSelectedVehicle, + deductibleForSelectedVehicle, endorsementsForSelectedVehicle, endorsementCodesForSelectedVehicle, noCoverageForSelectedVehicle, repairWaivedForSelectedVehicle } from '@/helpers/policy-vehicle-helper'; @@ -109,6 +110,7 @@ export const getDefaultState = () => ({ vehicles: [], endorsements: [], endorsementQuestionAnswers: [], + cvrgEndorsementCode: null, status: null, policyData: null }, @@ -1469,7 +1471,9 @@ export const useMainStore = defineStore({ currentDeductible: this.currentDeductible, OemEndorsement: this.hasOemEndorsement, noCoverage: this.isNoComp, - isItac: this.isITAC + isItac: this.isITAC, + cvrgEndorsementCode: policy.cvrgEndorsementCode ?? endorsementCodesForSelectedVehicle(vehicle), + endorsementQuestionAnswers: policy.endorsementQuestionAnswers }, customer: { address: { @@ -2071,6 +2075,7 @@ export const useMainStore = defineStore({ this.order.policy.deductible.replace = coverage.deductible; this.order.policy.deductible.repair = coverage?.repairWaived ?? false ? 0 : coverage.deductible; this.order.policy.endorsements = coverage?.endorsements; + this.order.policy.cvrgEndorsementCode = coverage?.cvrgEndorsementCode; this.order.originalDeductible.replace = this.order.policy.deductible.replace; this.order.currentDeductible.replace = this.order.policy.deductible.replace; @@ -2112,6 +2117,7 @@ export const useMainStore = defineStore({ this.order.policy.vehicles = []; this.order.policy.endorsements = []; this.order.policy.endorsementQuestionAnswers = []; + this.order.policy.cvrgEndorsementCode = null; this.order.policy.policyData = null; this.order.policy.deductible.repair = null; this.order.policy.deductible.replace = null;