diff --git a/src/constants/progress-bar-mapper.js b/src/constants/progress-bar-mapper.js index b9f3af77..6d39bbaf 100644 --- a/src/constants/progress-bar-mapper.js +++ b/src/constants/progress-bar-mapper.js @@ -71,6 +71,9 @@ export const pageProgressMapper = { 'tpa-search': { percent: 85 }, + 'tpa-submit': { + percent: 95 + }, 'tpa-confirmation': { percent: 100 }, diff --git a/src/helpers/text-helper.js b/src/helpers/text-helper.js index 13e65e11..b35f4803 100644 --- a/src/helpers/text-helper.js +++ b/src/helpers/text-helper.js @@ -34,11 +34,8 @@ export function createOrderedListFromStringOfParagraphs(stringOfParagraphs) { * @returns {string} */ export function toTitleCase(text) { - const temp = text?.toLowerCase()?.split(' ') ?? []; - for (let i = 0; i < temp.length; i++) { - temp[i] = temp[i].charAt(0).toUpperCase() + temp[i].slice(1); - } - return temp.join(' '); + let temp = text.toLowerCase(); + return temp.replace(/(^|\s|-)\S/g, (letter) => letter.toUpperCase()); } /** diff --git a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue index 334ba86a..931b950e 100644 --- a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue +++ b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue @@ -1,6 +1,7 @@ @@ -51,10 +60,11 @@ import modal from '@/digital-components/modal/modal.vue'; import textboxQuestion from '@/digital-components/textbox-question/textbox-question.vue'; // Supporting Files -import { useMainStore } from '@/store/index.js'; +import { useMainStore } from '@/store'; import globalRules from '@/constants/global-rules.js'; import MaskaFormattedMasks from '@/constants/maska-masks'; import widgetFields from '@/constants/cms-widget-fields.js'; +import { modalPositions } from '@/constants/component-variants'; export default { name: 'contact-details-drawer', @@ -67,27 +77,39 @@ export default { const { firstName, lastName, emailAddress, - servicePhone } = useMainStore().contactInfo; + servicePhone, + extension } = useMainStore().contactInfo; + console.log('Initial contact info loaded:', { + firstName, + lastName, + emailAddress, + servicePhone, + extension + }); return { isModalOpened: false, firstName, lastName, emailAddress, phoneNumber: servicePhone, + extension: extension, widget: { title: 'ContactDetailsDrawerHeaderWidget', firstNameQuestion: 'FirstNameQuestionWidget', lastNameQuestion: 'LastNameQuestionWidget', emailQuestion: 'EmailQuestionWidget', phoneNumberQuestion: 'PhoneNumberQuestionWidget', + extensionQuestion: 'ExtensionQuestionWidget', drawerFooter: 'ContactDetailsDrawerFooterWidget' }, rules: { firstName: globalRules.FIRST_NAME_REQUIRED, lastName: globalRules.LAST_NAME_REQUIRED, emailAddress: `${globalRules.EMAIL_ADDRESS_REQUIRED}|${globalRules.EMAIL_ADDRESS_FORMAT}`, - phoneNumber: `${globalRules.PHONE_NUMBER_REQUIRED}|${globalRules.PHONE_NUMBER_FORMAT}` - } + phoneNumber: `${globalRules.PHONE_NUMBER_REQUIRED}|${globalRules.PHONE_NUMBER_FORMAT}`, + extension: `${globalRules.EXTENSION_FORMAT}` + }, + modalPositions }; }, computed: { @@ -121,10 +143,11 @@ export default { lastName: this.lastName, emailAddress: this.emailAddress }; - useMainStore().updateContactInfo(contactInfo); - useMainStore().updatePhoneNumbers({ + this.mainStore.updateContactInfo(contactInfo); + this.mainStore.updatePhoneNumbers({ home: this.phoneNumber, - service: this.phoneNumber + service: this.phoneNumber, + extension: this.extension }); this.$emit('update-contact-details'); }, @@ -132,11 +155,20 @@ export default { const { firstName, lastName, emailAddress, - servicePhone } = useMainStore().contactInfo; + servicePhone, + extension } = this.mainStore.contactInfo; + console.log('Resetting form values to:', { + firstName, + lastName, + emailAddress, + servicePhone, + extension + }); this.firstName = firstName; this.lastName = lastName; this.emailAddress = emailAddress; this.phoneNumber = servicePhone; + this.extension = extension; }, openModal() { this.modal.openModal(); @@ -155,5 +187,14 @@ export default { font-size: $h5-font-size; font-weight: $font-weight-normal !important; } + .textbox-question { + margin-bottom: 1.25rem; + :deep(label:has(b)) { + font-weight: $font-weight-normal; + b { + font-weight: 600; + } + } + } } diff --git a/src/layouts/tpa-submit/deductible-box/deductible-box.vue b/src/layouts/tpa-submit/deductible-box/deductible-box.vue index 756f7da0..fd1ea4bd 100644 --- a/src/layouts/tpa-submit/deductible-box/deductible-box.vue +++ b/src/layouts/tpa-submit/deductible-box/deductible-box.vue @@ -1,17 +1,9 @@ @@ -28,12 +20,17 @@ export default { diff --git a/src/layouts/tpa-submit/review-block/review-block.vue b/src/layouts/tpa-submit/review-block/review-block.vue index 4f5af710..63e6efa4 100644 --- a/src/layouts/tpa-submit/review-block/review-block.vue +++ b/src/layouts/tpa-submit/review-block/review-block.vue @@ -1,29 +1,28 @@ @@ -36,14 +35,13 @@ export default { props: { customHeaderText: String, editScreenReaderTextCmsWidgetName: String, - lines: Array + lines: Array, + editLinkText: { + type: String, + default: 'Edit' + }, }, emits: ['click-edit'], - data() { - return { - editLinkText: 'Edit' - }; - }, methods: { editClicked() { this.$emit('click-edit'); @@ -59,12 +57,16 @@ export default { } .review-block__header { color: $black; + font-weight: $font-weight-bold; + margin-bottom: .625rem; } - .review-block__body--line { - color: $gray-600; + + .review-body { + margin-bottom: .625rem } + .link { - text-underline-offset: 1px; + font-weight: $font-weight-normal } } diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index 181fa0aa..aa334adf 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -13,53 +13,52 @@
- + + class="tpa-submit-title"/> - - -
+ :customText="subHeaderBodyOne" /> + + +
{{ recalModalContent.subHeaderText }}
+ +
+
+
- -
-
-
- -
+
+
+
-
+
@@ -67,17 +66,10 @@ id="tpaSubmitOrderDetailsTitle" ref="tpaSubmitOrderDetailsTitle" :customText="orderDetailsTitle" - :marginTopSizeOverride="4" - class="fw-bold text-color--black" /> - + :marginTopSizeOverride="0" + class="fw-bold order-details-title" />
v != null && v !== '') - .join(' '); - return [line]; - }, - locationAnswers() { - return this.getInputQuestionWidgetAnswersNullSafe(this.widget.damageLocations); - }, - driverSideDamageAnswers() { - const answerContent = getLocationAnswer( - damageLocationsSelected.DRIVER, - this.locationAnswers - ); - return this.getInputQuestionWidgetAnswersNullSafe(answerContent?.SubWidgetName); - }, - passengerSideDamageAnswers() { - const answerContent = getLocationAnswer( - damageLocationsSelected.PASSENGER, - this.locationAnswers - ); - return this.getInputQuestionWidgetAnswersNullSafe(answerContent?.SubWidgetName); - }, - getDamageLines() { - const { glassToReplace, isRepair } = useMainStore().order.damage; - return getDamageDisplayContent( - this.locationAnswers, - this.driverSideDamageAnswers, - this.passengerSideDamageAnswers, - glassToReplace, - isRepair - ); + getPreferredShopTitle() { + return toTitleCase(this.mainStore.order.serviceLocation.provider.companyName ?? ''); }, getPreferredShopLines() { - const { phoneNumber, address } = - useMainStore().order.serviceLocation.provider; + const { phoneNumber, address } = this.mainStore.order.serviceLocation.provider; const { streetAddress, city, state, zipCode } = address; const displayAddress = formatAddress( streetAddress, @@ -284,58 +235,82 @@ export default { ); const displayPhoneNumber = toDisplayPhoneNumber(phoneNumber); return [ - toTitleCase(this.companyName ?? ''), displayAddress, displayPhoneNumber ]; }, + getEditShopLinkText() { + return this.getCmsContent( + this.widget.editShopLinkText, + widgetFields.TEXT_BLOCK_WIDGET.TEXT + ); + }, + getContactInfoTitle() { + const cmsContent = this.getCmsContent( + this.widget.contactDetails, + widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT + ); + return getStringWithCustomValues(cmsContent, this.customValueMap); + }, getContactInfoLines() { - const { firstName, lastName, emailAddress, servicePhone } = - useMainStore().contactInfo; + const cmsContent = this.getCmsContent( + this.widget.contactDetails, + widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT + ); return [ - `${firstName} ${lastName}`, - emailAddress ?? '', - toDisplayPhoneNumber(servicePhone) + getStringWithCustomValues(cmsContent, this.customValueMap) ]; + }, + getEditContactInfoLinkText() { + return this.getCmsContent( + this.widget.contactDetails, + widgetFields.CONTENT_GROUP_WIDGET.FOOTER_TEXT + ); + }, + recalModalContent() { + const widgetName = 'RecalModal'; + return { + headerText: this.getCmsContent(widgetName, widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT), + subHeaderText: this.getCmsContent(widgetName, widgetFields.CONTENT_GROUP_WIDGET.SUBHEADER_TEXT), + bodyText: this.getCmsContent(widgetName, widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT), + footerButtonText: this.getCmsContent(widgetName, widgetFields.CONTENT_GROUP_WIDGET.FOOTER_TEXT), + image: this.getCmsContent(widgetName, widgetFields.CONTENT_GROUP_WIDGET.IMAGE) + } + }, + recalibrationRequired() { + return this.mainStore.hasRecalibrationPart; + }, + customValueMap() { + return { + glassShop: this.getPreferredShopTitle, + contactPhone: toDisplayPhoneNumber(this.mainStore.contactInfo.servicePhone), + contactEmail: this.mainStore.contactInfo.emailAddress + } } }, methods: { setSections() { - const vehicleScenario = useMainStore().isPolicyVehicle - ? this.navigationScenarios.EDIT_POLICY_VEHICLE - : this.navigationScenarios.EDIT_VEHICLE; this.sections = [ this.getSection( - this.widget.subheader.vehicle, - this.getVehicleLines, - () => this.navigate(vehicleScenario) - ), - // eslint-disable-next-line max-len - this.getSection( - this.widget.subheader.damage, - this.getDamageLines, - () => this.navigate(this.navigationScenarios.EDIT_DAMAGE) - ), - this.getSection( - this.widget.subheader.shop, + this.getPreferredShopTitle, this.getPreferredShopLines, - () => this.navigate(this.navigationScenarios.EDIT_PREFERRED_SHOP) + this.getEditShopLinkText, + () => this.navigate(this.navigationScenarios.EDIT_PREFERRED_SHOP), ), // eslint-disable-next-line max-len this.getSection( - this.widget.subheader.contactInfo, + this.getContactInfoTitle, this.getContactInfoLines, + this.getEditContactInfoLinkText, this.openContactDetailsModal ) ]; }, - getSection(widgetName, lines, onClick) { + getSection(title, lines, editLinkText, onClick) { return { - title: this.getCmsContent( - widgetName, - widgetFields.TEXT_BLOCK_WIDGET.TEXT - ), + title: title, lines, + editLinkText, onClickEdit: onClick }; }, @@ -344,7 +319,7 @@ export default { await submitWorkOrder({ submitType: submitType.TPA }).then(() => { this.navigate(this.navigationScenarios.CLICKED_FORWARD); }).catch((submitError) => { - useMainStore().setBailout(bailoutMessage.saveSessionError(submitError.data)); + this.mainStore.setBailout(bailoutMessage.saveSessionError(submitError.data)); this.navigate( this.navigationScenarios.SAVE_SESSION_FAILED, this.$route, @@ -372,6 +347,12 @@ export default { }, openContactDetailsModal() { this.$refs.contactDetailsDrawer.openModal(); + }, + openRecalModal() { + this.$refs.recalModal.openModal(); + }, + closeRecalModal() { + this.$refs.recalModal.closeModal(); } } }; @@ -387,26 +368,69 @@ export default { } .tpa-submit { - #tpaSubmitOrderDetailsBody { - p { - font-size: .875rem; - } - } - .tpa-submit__title--line-height { - line-height: map-get($spacers, 6); + .alert-warning { + margin-top: 1.25rem; + margin-bottom: 0rem; } - .text-color--darker-gray { - color: $darker-gray; + .tpa-submit-title { + font-size: 1.25rem; + color: $black; + font-weight: 400; + margin-top: 1.25rem; + margin-bottom: .625rem; } - .text-color--black { + .recal-alert { + margin-bottom: 4rem; + } + + b { + font-weight: $font-weight-bold; color: $black; } hr { - opacity: 1; - color: $gray-350; + margin: 1.875rem 0rem; + } + + .fw-bold { + color: $black; + } + + .order-details-title { + margin-bottom: .625rem; + } + + .modal.recal-modal .modal-dialog { + .modal-header { + justify-content: start; + margin: 0rem; + padding: 1.25rem 1.25rem .625rem 1.25rem; + .modal-title { + font-weight: $font-weight-bolder; + font-size: .875rem; + line-height: 1.25rem; + text-align: start; + justify-content: start; + } + .btn-close { + display: none; + } + } + .modal-body { + padding: 0rem 1.25rem 1.25rem 1.25rem; + b { + font-weight: 600; + } + } + .recal-modal-subheader { + font-weight: $font-weight-bold; + color: $black; + } + .recal-modal-image { + margin: 1.25rem 0rem + } } } diff --git a/src/store/index.js b/src/store/index.js index 05927b17..3959bd62 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -197,6 +197,7 @@ export const getDefaultState = () => ({ homePhone: null, alternativePhone: null, servicePhone: null, + extension: null, requestTextUpdates: false, notesForTechnician: '' }, @@ -354,6 +355,7 @@ export const useMainStore = defineStore({ homePhone: s.order.contactInfo.homePhone, alternativePhone: s.order.contactInfo.alternativePhone, servicePhone: s.order.contactInfo.servicePhone, + extension: s.order.contactInfo.extension, requestTextUpdates: s.order.contactInfo.requestTextUpdates ?? false, notesForTechnician: s.order.contactInfo.notesForTechnician }), @@ -2572,9 +2574,12 @@ export const useMainStore = defineStore({ updatePhoneNumbers(phoneNumbers) { const contact = this.order.contactInfo; + console.log('Updating phone numbers with:', phoneNumbers); + console.log('Current contact info before update:', contact); contact.homePhone = phoneNumbers.home !== undefined ? phoneNumbers.home : contact.homePhone; contact.alternativePhone = phoneNumbers.alternative !== undefined ? phoneNumbers.alternative : contact.alternativePhone; contact.servicePhone = phoneNumbers.service !== undefined ? phoneNumbers.service : contact.servicePhone; + contact.extension = phoneNumbers.extension !== undefined ? phoneNumbers.extension : contact.extension; }, GetExperimentsByUser(userId) { diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 154776b2..239589ee 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -494,18 +494,21 @@ describe('Store', () => { const homePhone = getRandomInt(1000000000, 9999999999); const servicePhone = getRandomInt(1000000000, 9999999999); const altPhone = getRandomInt(1000000000, 9999999999); + const extension = getRandomInt(10000, 99999); // Act store.updatePhoneNumbers({ home: homePhone, service: servicePhone, - alternative: altPhone + alternative: altPhone, + extension: extension }); // Assert expect(store.contactInfo.homePhone).toEqual(homePhone); expect(store.contactInfo.servicePhone).toEqual(servicePhone); expect(store.contactInfo.alternativePhone).toEqual(altPhone); + expect(store.contactInfo.extension).toEqual(extension); }); it('All null values => contact info set in store to all nulls', () => { // Act diff --git a/src/ux-components/alert/alert.vue b/src/ux-components/alert/alert.vue index 00b3e91f..cda82a85 100644 --- a/src/ux-components/alert/alert.vue +++ b/src/ux-components/alert/alert.vue @@ -226,6 +226,7 @@ export default { padding: 0rem .625rem; } .btn-collapse { + display: flex; border: none; background: none; min-width: 1rem; @@ -242,7 +243,7 @@ export default { } } a { - text-decoration: none; + font-weight: $font-weight-normal; } border-color: transparent; .btn-close {