From 053cd44cbedbca711ca974b24effe3ad96ba40e0 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 12 Feb 2026 17:58:35 -0500 Subject: [PATCH 1/8] INSR-8434: Fix defects seen on contact-details --- src/assets/img/icons/select-disabled.png | Bin 0 -> 1326 bytes .../dropdown-question/dropdown-question.vue | 4 ++-- .../textbox-question/textbox-question.vue | 1 + .../contact-details/contact-details.vue | 18 ++++++++++++--- src/ux-components/alert/alert.vue | 21 +++++++++++++----- 5 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 src/assets/img/icons/select-disabled.png diff --git a/src/assets/img/icons/select-disabled.png b/src/assets/img/icons/select-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..03ac8316652b7385bfb886649bae252967a8243b GIT binary patch literal 1326 zcmV+}1=0G6P)Px(=t)FDR9Fe^SX+o3MHH>uJ+qscl?W=q2NFRD`XTufjS^XPcV}jM!JvtLD)9k< zpkKc5S46**KtMDof*`0wn4Z_J>*6blfBGW|ei$Kw7(roYoSo?@&*`yuYpT0)dni>8k3kt}0QNP^yi_5jD`Sg`ti-xlk^j9XE}P8{qrRc_o97wAMMsib!8+ z=RVIX)yBy+mTSdvq>mgc zEVY_RcyV#@+FrlkR7zi&nh8E~$W7;Lc(xQ?T3Wh%t=DgAt@dw(C0pc>%a~-w2D<4O zV@xLlty)U!yEa0GmMD3dmR9;1+lMFaQ&-d+#=INz{R^bF7*DMO(RY(X9g%nD=gZIW zM?01rH_BM%i21e>uGQ7We(gF{z#=hS;uGQd8lSCV>`*EsRxC27J z+dkG;R#vWBZFjyz_a3nQqMS!PuYAVDM_P=BX#t|In*`br{S_0$T$(63^pQg@>t}s=lP=di{X!%}?(-D=s*YoDi5f5AJ z`%5<~396{uqFv6zSw)#JaoPDX5A5&z(TO|3(K1mlX?-o1~qv zr;5eL*2P0DXtLnZce8v^wtExQpw@Qt?8fi*z-|xh_Q3zK2mXt>TEexK1ZVN3*vBsj zza(6;?&JVq1)5uJx8J~W_hEhsMY~6^$L(VUqV`dU4iIQQ!oQs=>!M7E22v9%5V_G5 zpm?=bi>(?=&Nw!6g)KFLsEHMb`ozG7rdH4Te*I(&9}@_3AeS9RO-C0dxf(ccJFyFV zwN`5$v+=BT#xh3&|2#Fr1^sYc-TMMh_Z1d#O_W>0`NoQcZ(7AU$+T7hH*ymu5o_%~ zl+NGjc{AUKYhD^kyWC=QOkx;_gBI=%EIhRuauE~8jmtr;-*a> zIe3DvHgVd_$=oJBB1{Ljlh^^o_OuW`u)5l=;bdpZOhB6$edO3a=3-78j|r229l(p2 z#ZKE~>;P`X$<7Cyi6S3uV)R8=bY%|ait6SyQJ94JO64S`w+~G+ZFFU+-R_)0>x93d ztx7hJv0;vwV+e$=Q;JV*cItyemsc1!(E90Ee1=n>O@*0|tN-p=?{l>7mY6^iAoAUw ziTvT2nVCP6+!3~=Fo`^^TkG}Cp_}(dfk{`4>CY4S{Gr*|*$YX26H6Uqlf*=>|wp=79izwqV36oeZmw#{_<-u&TZWWx~DvulsPpxJaW(FP$W9~kNId^@bK${qS ksVWJMOk-@v?ZgTFKQebCaIJlJh5!Hn07*qoM6N<$f-y3L(*OVf literal 0 HcmV?d00001 diff --git a/src/digital-components/dropdown-question/dropdown-question.vue b/src/digital-components/dropdown-question/dropdown-question.vue index 0a25d34b..733f33d9 100644 --- a/src/digital-components/dropdown-question/dropdown-question.vue +++ b/src/digital-components/dropdown-question/dropdown-question.vue @@ -156,8 +156,8 @@ export default { &:disabled, &.disabled { background-color: $gray-100; - color: $gray-500; - filter: grayscale(100%); + background-image: url(~@/assets/img/icons/select-disabled.png); + cursor: not-allowed; } } &.dropdown-compact { diff --git a/src/digital-components/textbox-question/textbox-question.vue b/src/digital-components/textbox-question/textbox-question.vue index 85bef043..2d441edb 100644 --- a/src/digital-components/textbox-question/textbox-question.vue +++ b/src/digital-components/textbox-question/textbox-question.vue @@ -394,6 +394,7 @@ input::-webkit-date-and-time-value { &:disabled, &.disabled { background-color: $gray-100; + cursor: not-allowed; } } p { diff --git a/src/layouts/contact-details/contact-details.vue b/src/layouts/contact-details/contact-details.vue index c28d0d3a..0963d216 100644 --- a/src/layouts/contact-details/contact-details.vue +++ b/src/layouts/contact-details/contact-details.vue @@ -57,9 +57,9 @@ ref="stateQuestion" v-model="state" inputId="state" - class="form-group" + class="form-group state-dropdown" :cmsWidgetName="widget.stateQuestion" - :options="states" + :options="getStates" isDisabled /> { + // eslint-disable-next-line no-param-reassign + acc[key] = states[key].toUpperCase(); + return acc; + }, {}); + }, }, watch: { isSameAsPolicyAddress(newValue) { @@ -301,6 +308,11 @@ export default { .form-group { margin-bottom: 1.25rem; } +.state-dropdown { + :deep(option) { + text-transform: uppercase; + } +} .same-address-checkbox { :deep(.form-check-input) { &:checked + label p, diff --git a/src/ux-components/alert/alert.vue b/src/ux-components/alert/alert.vue index 4d50bc1b..29aa5853 100644 --- a/src/ux-components/alert/alert.vue +++ b/src/ux-components/alert/alert.vue @@ -7,7 +7,12 @@ alertClass, cssClassNameForCmsWidget, ]"> -
+
+ type="button"> + class="alert-body collapse" + :class="{ 'show': !startCollapsed }">
@@ -256,6 +261,10 @@ export default { appointmentEstimate() { return getDisplayTextForDurationLength(this.appointmentDurationMinutesMinimum, this.appointmentDurationMinutesMaximum); }, + calendarViewDirection() { + if (this.selectableDatesSetting === 'custom') return 'future'; + return 'past'; + }, daysToAdd() { return this.isMobileView ? this.daysInViewMobile : this.daysInViewStandard; }, @@ -284,10 +293,6 @@ export default { this.todayOverrideDateString || convertDateToDateString(new Date()) ); - }, - calendarViewDirection() { - if (this.selectableDatesSetting === 'custom') return 'future'; - return 'past'; } }, watch: { @@ -301,16 +306,16 @@ export default { this.findFirstAvailableDateInView(); } }, + selectedDate(newValue, oldValue) { + if (newValue !== oldValue) { + this.$emit('dateSelected', newValue); + } + }, selectedTimeSlot(newValue, oldValue) { if (newValue !== oldValue) { const testObj = this.getSelectedTimeSlotInfoObject(newValue); this.$emit('timeSlotSelected', testObj); } - }, - selectedDate(newValue, oldValue) { - if (newValue !== oldValue) { - this.$emit('dateSelected', newValue); - } } }, methods: { @@ -340,50 +345,44 @@ export default { addPremiumFlagToInput(routeCode) { return (`${routeCode}${PREMIUM_TIME_SLOT_ID_FLAG}`); }, - removePremiumFlagFromInput(routeCode) { - return routeCode.replace(PREMIUM_TIME_SLOT_ID_FLAG, ''); + checkIsSelectedDay(index, timeOfDayGrouping) { + const dateToShowString = this.getDateToShowString(index); + return this.selectedDate === dateToShowString && this.selectedTimeOfDayGrouping === timeOfDayGrouping; }, - getSelectedTimeSlotInfoObject(timeSlot) { - const routeCode = timeSlot?.id; - let routeCodeToUse = routeCode; - const routeCodeIncludesPremium = routeCode?.includes(PREMIUM_TIME_SLOT_ID_FLAG); - if (routeCodeIncludesPremium) { - routeCodeToUse = this.removePremiumFlagFromInput(routeCode); + checkIsSelectedTimeSlot(timeSlot) { + if (!this.selectedTimeSlot) { + return false; } - - const fullTimeSlot = this.selectableTimeSlotsData?.find((ts) => ts.id === routeCodeToUse); - - if (fullTimeSlot) { - return { - timeSlot: { - date: this.selectedDate, - routeCode: fullTimeSlot.id, - startTime: fullTimeSlot.startTime, - endTime: fullTimeSlot.endTime, - jobMaxMinutes: this.appointmentDurationMinutesMaximum.toString(), - jobMinMinutes: this.appointmentDurationMinutesMinimum.toString() - }, - isPremiumAppointment: !!routeCodeIncludesPremium - }; + return (this.selectedTimeSlot.isDropoff === timeSlot.isDropoff + && this.selectedTimeSlot.startTime === timeSlot.startTime + && this.selectedTimeSlot.timeOfDay === timeSlot.timeOfDay); + }, + displayDropOffInformation(timeSlot) { + if (timeSlot.isDropoff) { + if (timeSlot.timeOfDay === 'morning') { + return this.getCmsContent( + 'DropOffTimeSlotModal', + 'BodyText' + ); + } + return this.getCmsContent( + 'OvernightDropOffTimeSlotModal', + 'BodyText' + ); } - - return { - timeSlot: { - date: null, - startTime: null, - endTime: null, - routeCode: null, - jobMaxMinutes: null, - jobMinMinutes: null - }, - isPremiumAppointment: null - }; + return ''; }, displayTimeSlotTime(timeSlot) { const appointmentType = this.activeAppointmentType || AppointmentTypeStrings.IN_SHOP; if (appointmentType === AppointmentTypeStrings.MOBILE || appointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) { return `${militaryToTwelveHourTime(timeSlot.startTime)} - ${militaryToTwelveHourTime(timeSlot.endTime)}`; } + if (timeSlot.isDropoff) { + if (timeSlot.timeOfDay === 'morning') { + return 'Drop & Go'; + } + return 'Overnight drop off'; + } return militaryToTwelveHourTime(timeSlot.startTime); }, findFirstAvailableDateInView() { @@ -436,8 +435,7 @@ export default { if (!initialTimeSlot || !initialTimeSlot.startTime) { return; } - const initialStartTime = initialTimeSlot.startTime; - const foundTimeSlot = timeSlots.find((ts) => ts.startTime === initialStartTime); + const foundTimeSlot = timeSlots.find((ts) => ts.startTime === initialTimeSlot.startTime && ts.endTime === initialTimeSlot.endTime); if (foundTimeSlot) { this.selectTimeSlotForDay(foundTimeSlot); } @@ -452,6 +450,44 @@ export default { const dateToShow = this.getDateToShow(index); return convertDateToDateString(dateToShow); }, + getSelectedTimeSlotInfoObject(timeSlot) { + const routeCode = timeSlot?.id; + let routeCodeToUse = routeCode; + const routeCodeIncludesPremium = routeCode?.includes(PREMIUM_TIME_SLOT_ID_FLAG); + if (routeCodeIncludesPremium) { + routeCodeToUse = this.removePremiumFlagFromInput(routeCode); + } + + const fullTimeSlot = this.selectableTimeSlotsData?.find((ts) => ts.id === routeCodeToUse); + + if (fullTimeSlot) { + return { + timeSlot: { + date: this.selectedDate, + routeCode: fullTimeSlot.id, + startTime: fullTimeSlot.startTime, + endTime: fullTimeSlot.endTime, + isDropoff: fullTimeSlot.isDropoff, + jobMaxMinutes: this.appointmentDurationMinutesMaximum.toString(), + jobMinMinutes: this.appointmentDurationMinutesMinimum.toString() + }, + isPremiumAppointment: !!routeCodeIncludesPremium + }; + } + + return { + timeSlot: { + date: null, + routeCode: null, + startTime: null, + endTime: null, + isDropoff: null, + jobMaxMinutes: null, + jobMinMinutes: null + }, + isPremiumAppointment: null + }; + }, async gotoNextPage() { const maxPageIndex = Math.floor((this.daysLoaded - 1) / this.daysToAdd); if (this.activePageIndex >= maxPageIndex) { @@ -479,15 +515,15 @@ export default { this.selectedTimeSlot = null; this.findFirstAvailableDateInView(); }, - checkIsSelectedDay(index, timeOfDayGrouping) { - const dateToShowString = this.getDateToShowString(index); - return this.selectedDate === dateToShowString && this.selectedTimeOfDayGrouping === timeOfDayGrouping; + mapTimeSlot(timeSlot, timeOfDay) { + return { + ...timeSlot, + isDropoff: timeSlot.id.endsWith('DROP OFF'), + timeOfDay + }; }, - checkIsSelectedTimeSlot(timeSlot) { - if (!this.selectedTimeSlot) { - return false; - } - return this.selectedTimeSlot.startTime === timeSlot.startTime; + removePremiumFlagFromInput(routeCode) { + return routeCode.replace(PREMIUM_TIME_SLOT_ID_FLAG, ''); }, selectTimeSlotForDay(timeSlot) { if (timeSlot) { @@ -567,13 +603,28 @@ export default { morningTimeSlots: selectableDate.timeSlots.filter((timeSlot) => { const timeHour = parseInt(timeSlot.startTime.split(':')[0], 10); return timeHour < 12; - }), + }).map((timeSlot) => this.mapTimeSlot(timeSlot, 'morning')), afternoonTimeSlots: selectableDate.timeSlots.filter((timeSlot) => { const timeHour = parseInt(timeSlot.startTime.split(':')[0], 10); return timeHour >= 12; - }), + }).map((timeSlot) => this.mapTimeSlot(timeSlot, 'afternoon')), isSelected: false }; + + if (dateObjectToPush.morningTimeSlots.length > 0) { + const findIndex = dateObjectToPush.morningTimeSlots.findIndex((timeSlot) => timeSlot.id.endsWith('DROP OFF')); + if (findIndex !== -1) { + const dropOffSlot = dateObjectToPush.morningTimeSlots.splice(findIndex, 1)[0]; + dateObjectToPush.morningTimeSlots.unshift(dropOffSlot); + } + } + if (dateObjectToPush.afternoonTimeSlots.length > 0) { + const findIndex = dateObjectToPush.afternoonTimeSlots.findIndex((timeSlot) => timeSlot.id.endsWith('DROP OFF')); + if (findIndex !== -1) { + const dropOffSlot = dateObjectToPush.afternoonTimeSlots.splice(findIndex, 1)[0]; + dateObjectToPush.afternoonTimeSlots.push(dropOffSlot); + } + } this.selectableDatesData.push(dateObjectToPush); }); @@ -635,14 +686,28 @@ export default { morningTimeSlots: selectableDate.timeSlots.filter((timeSlot) => { const timeHour = parseInt(timeSlot.startTime.split(':')[0], 10); return timeHour < 12; - }), + }).map((timeSlot) => this.mapTimeSlot(timeSlot, 'morning')), afternoonTimeSlots: selectableDate.timeSlots.filter((timeSlot) => { const timeHour = parseInt(timeSlot.startTime.split(':')[0], 10); return timeHour >= 12; - }), + }).map((timeSlot) => this.mapTimeSlot(timeSlot, 'afternoon')), isSelected: false }; + if (dateObjectToPush.morningTimeSlots.length > 0) { + const findIndex = dateObjectToPush.morningTimeSlots.findIndex((timeSlot) => timeSlot.id.endsWith('DROP OFF')); + if (findIndex !== -1) { + const dropOffSlot = dateObjectToPush.morningTimeSlots.splice(findIndex, 1)[0]; + dateObjectToPush.morningTimeSlots.unshift(dropOffSlot); + } + } + if (dateObjectToPush.afternoonTimeSlots.length > 0) { + const findIndex = dateObjectToPush.afternoonTimeSlots.findIndex((timeSlot) => timeSlot.id.endsWith('DROP OFF')); + if (findIndex !== -1) { + const dropOffSlot = dateObjectToPush.afternoonTimeSlots.splice(findIndex, 1)[0]; + dateObjectToPush.afternoonTimeSlots.push(dropOffSlot); + } + } this.selectableDatesData.push(dateObjectToPush); } }); @@ -832,16 +897,55 @@ export default { text-align: center; cursor: pointer; + :deep(.dropoff-label) { + sup { + top: -0.375rem; + font-size: 0.75rem; + } + } + + & + .time-slot-drop-off-information { + max-height: 0; + overflow: hidden; + transition: max-height 0.75s ease-in-out; + font-weight: 400; + text-align: left; + color: $darker-gray; + + :deep(ul) { + margin: 0; + margin-bottom: 0.375rem; + + > li { + padding-left: 0.625rem; + margin-top: 0.625rem; + } + } + } + &.selected-time-slot { background-color: $background-color-selected; border: solid 1px #0070d1; color:#000; font-weight: 500; + + :deep(.dropoff-label) { + sup { + top: .25rem; + font-size: 1.625rem; + } + } + + & + .time-slot-drop-off-information { + max-height: 12rem; + transition: max-height 0.75s ease-in-out; + } } &.has-date-error { border: 1px solid #d93025; } + } } diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 8ee70191..da3ef43a 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -6,7 +6,6 @@
@@ -176,9 +175,7 @@ const getAvailableDates = async ( storeAction.payload.endDate, storeAction.payload.shopAppointmentType, storeAction.payload.providerNumber - ).catch(() => { - console.warn('Error fetching shop time slots...'); - }); + ); } else if (storeAction.payload?.zipCodeOverride) { timeSlotsResponse = await useMainStore().getMobileTimeSlots( storeAction.payload.startDate, @@ -343,7 +340,7 @@ export default { && (((this.selectedAppointmentType === AppointmentTypeStrings.MOBILE || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) && serviceLocationToUse.mobileProviderNumber) - || (this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP + || ((this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP || this.selectedAppointmentType === AppointmentTypeStrings.DROP_OFF) && (this.selectedProvider?.providerNumber || serviceLocationToUse.provider?.providerNumber))); const damageInfo = useMainStore().order.damage.isRepair @@ -652,8 +649,13 @@ export default { return; } - // Save service location then schedule and navigate forward - await this.$refs.serviceLocation.forwardButtonAction(); + let appointmentTypeToUse = this.selectedAppointmentType; + if (appointmentTypeToUse === AppointmentTypeStrings.IN_SHOP && this.selectedTimeSlotInfo.timeSlot?.isDropoff === true) { + appointmentTypeToUse = AppointmentTypeStrings.DROP_OFF; + } + + // Save service location then save schedule then navigate forward + await this.$refs.serviceLocation.forwardButtonAction(appointmentTypeToUse); this.mainStore.saveSchedule(this.selectedTimeSlotInfo.timeSlot); this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD, diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index d664a8ba..cc96f7c2 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -308,7 +308,7 @@ export default { } }, selectedAppointmentType(newValue, oldValue) { - if (this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP && this.selectedProvider && this.availabilityRating === null) { + if (this.isInshop && this.selectedProvider && this.availabilityRating === null) { this.refreshAvailabilityRating(); const appointmenTypeServiceLocationObj = { @@ -336,7 +336,7 @@ export default { }, selectedProvider(newProvider, oldProvider) { if (newProvider?.providerNumber !== oldProvider?.providerNumber || this.availabilityRating === null) { - const appointmentIsInshop = this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP; + const appointmentIsInshop = this.isInshop; const returnedProvider = { provider: newProvider, refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null @@ -358,7 +358,7 @@ export default { await this.setData(initialData); this.initializingData = false; }, - async forwardButtonAction() { + async forwardButtonAction(appointmentType) { let provider = this.selectedProvider; this.mainStore.updateMobileFee(null); if (this.isMobile) { @@ -382,7 +382,7 @@ export default { state: this.state, zipCode: this.zipCode, zipCodeCtu: this.zipCodeCtu, - appointmentType: this.selectedAppointmentType, + appointmentType: appointmentType || this.selectedAppointmentType, provider }); }, diff --git a/src/store/index.js b/src/store/index.js index e9b39fd0..74c3deb0 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -965,7 +965,8 @@ export const useMainStore = defineStore({ providerNumber, startDate, endDate, - shopAppointmentType, + shopAppointmentType: (shopAppointmentType === AppointmentTypeStrings.IN_SHOP + || shopAppointmentType === AppointmentTypeStrings.DROP_OFF) ? 'InShopOrDropoff' : shopAppointmentType, applicationName: applicationConfig.APPLICATION_NAME, billToAccountNumber: this.billToAccountNumber, parentAccountNumber: this.order.parentAccountNumber, // this.payment.parentAccountNumber, @@ -1605,7 +1606,7 @@ export const useMainStore = defineStore({ order.customer.firstName = data?.customer?.firstName; order.customer.lastName = data?.customer?.lastName; order.customer.emailAddress = data?.customer?.emailAddress; - + order.contactInfo.extension = data?.customer?.homePhone?.slice(10); order.contactInfo.homePhone = data?.customer?.homePhone?.slice(0, 10); order.contactInfo.servicePhone = data?.customer?.servicePhone; From 71ba9f7b8023fe2ea53531e6734f09ebf950ffb9 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Fri, 13 Feb 2026 11:05:46 -0500 Subject: [PATCH 4/8] three of the 4 issues from card --- .../vin-location-information/vin-location-information.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/layouts/vin-lookup/vin-location-information/vin-location-information.vue b/src/layouts/vin-lookup/vin-location-information/vin-location-information.vue index 72e970ad..7bc12729 100644 --- a/src/layouts/vin-lookup/vin-location-information/vin-location-information.vue +++ b/src/layouts/vin-lookup/vin-location-information/vin-location-information.vue @@ -61,7 +61,6 @@ export default { .vin-toggle { &::after { content: ""; - transition: all 0.5s ease; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 8.9' xml:space='preserve'%3e%3cpath d='M8 8.9c-.2 0-.5-.1-.6-.3L.3 1.5C.1 1.4 0 1.1 0 .9 0 .7.1.4.3.3.4.1.7 0 .9 0c.2 0 .5.1.6.3L8 6.7 14.5.2c.1-.1.4-.2.6-.2.2 0 .5.1.6.3s.3.4.3.6c0 .2-.1.5-.3.6L8.6 8.6c-.1.2-.4.3-.6.3z' fill='%231474a2'/%3e%3c/svg%3e"); background-repeat: no-repeat; margin-left: 0.5rem; @@ -72,9 +71,6 @@ export default { &.active::after { transform: rotate(180deg); } - a { - font-size: 0.875rem; - } } } #vin-location-detail-wrapper { From ed4c10af13ca53cfda9a38edbf1c86017a55e568 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Fri, 13 Feb 2026 12:11:20 -0500 Subject: [PATCH 5/8] All non styling changes --- .../address-vehicles-question.vue | 9 ++++--- .../address-vehicles/address-vehicles.vue | 26 ++++--------------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/layouts/address-vehicles/address-vehicles-question/address-vehicles-question.vue b/src/layouts/address-vehicles/address-vehicles-question/address-vehicles-question.vue index ba04cf22..d64f3815 100644 --- a/src/layouts/address-vehicles/address-vehicles-question/address-vehicles-question.vue +++ b/src/layouts/address-vehicles/address-vehicles-question/address-vehicles-question.vue @@ -49,7 +49,7 @@ export default { vehicles: Array, vehicleSelected: Object, modelValue: String, - cmsWidgetName: String, + questionText: String, validationRules: String, isCarIdDifferent: Boolean, displayMatchedDifferentVehicleAlert: Boolean, @@ -92,9 +92,6 @@ export default { .replaceAll('{custom:vinYmmsFound}', vinYmmsFound) .replaceAll('{custom:vinYmmsExpected}', vinYmmsExpected); }, - questionText() { - return this.getCmsContent('VehicleConfirmationQuestion', 'QuestionText'); - }, selectedVehicleVin: { get() { return this.modelValue; @@ -126,4 +123,8 @@ export default { #address-vehicles-question-alert p { margin-bottom: 0 !important; // Overrides extra margin-bottom on alert body text } + +:deep(div.list-button-content > span:first-child) { + text-transform: uppercase; +} diff --git a/src/layouts/address-vehicles/address-vehicles.vue b/src/layouts/address-vehicles/address-vehicles.vue index 3740b674..07100d77 100644 --- a/src/layouts/address-vehicles/address-vehicles.vue +++ b/src/layouts/address-vehicles/address-vehicles.vue @@ -13,15 +13,6 @@ - { const maskSymbol = '*'; - const vinStart = maskSymbol.repeat(v.vin.length - 6); + const vinStart = maskSymbol.repeat(6); const vinEnd = v.vin.substring(v.vin.length - 6); return { vin: v.vin, @@ -235,13 +226,6 @@ export default { } else { this.displayMatchedDifferentVehicleAlert = true; } - this.$refs.siteFooter.updateButtonText(`Continue with ${this.selectedVehicle.vehicle.year} ` - + `${this.selectedVehicle.vehicle.make} ${this.selectedVehicle.vehicle.model} ${this.forwardButtonCarStyle}`); - } else { - this.$refs.siteFooter.updateButtonText(this.getCmsContent( - 'SiteFooterWidget', - 'ForwardButtonText' - )); } }, deep: true From 88dff3fe650bba6163505dc90bc47e0c43fdff91 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Fri, 13 Feb 2026 12:18:50 -0500 Subject: [PATCH 6/8] Unit test fixes --- src/layouts/address-vehicles/address-vehicles.spec.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/address-vehicles/address-vehicles.spec.js b/src/layouts/address-vehicles/address-vehicles.spec.js index 542e9a0d..0b83a100 100644 --- a/src/layouts/address-vehicles/address-vehicles.spec.js +++ b/src/layouts/address-vehicles/address-vehicles.spec.js @@ -100,6 +100,9 @@ function setupMocks({ if (contentName === 'ProvideVinAlert') { return 'ProvideVinAlertTestReturn'; } + if (contentName === 'VehicleConfirmationQuestion') { + return 'VehicleConfirmationQuestionTestReturn'; + } return null; }) }, From fd8e8ec3fcb54b5bee9c1922c1dc0a5c41576b09 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Fri, 13 Feb 2026 11:56:35 -0600 Subject: [PATCH 7/8] INSR-7930 Implement Client Possessive logic --- src/helpers/text-helper.js | 17 +++++++++++++++++ src/layouts/entry-page/entry-page.spec.js | 2 ++ src/layouts/entry-page/entry-page.vue | 7 +++++++ src/store/index.js | 1 + 4 files changed, 27 insertions(+) diff --git a/src/helpers/text-helper.js b/src/helpers/text-helper.js index 1b54084f..379fa56e 100644 --- a/src/helpers/text-helper.js +++ b/src/helpers/text-helper.js @@ -133,3 +133,20 @@ export function formatDate(date, formatter) { } return ''; } + +/** + * @function toPossessive + * @param {string | null} input + * @returns {string} + */ +export function toPossessive(input) { + if (input == null || input.trim().length === 0) { + return input; + } + + if (input.toLowerCase().endsWith("s")) { + return `${input}'` + } + + return `${input}'s` +} \ No newline at end of file diff --git a/src/layouts/entry-page/entry-page.spec.js b/src/layouts/entry-page/entry-page.spec.js index afa28c8d..ee238737 100644 --- a/src/layouts/entry-page/entry-page.spec.js +++ b/src/layouts/entry-page/entry-page.spec.js @@ -144,6 +144,7 @@ describe('entry-page.vue', () => { TPAEnabled: true, ClientFullName: 'Full Name', ClientDisplayName: 'Display Name', + ClientPossessiveName: 'Display Name\'s', ClaimRegistrationRequired: true, EnableNoCompQuote: true }) @@ -153,6 +154,7 @@ describe('entry-page.vue', () => { expect(issConfig.clientName).toBe('TestClient'); expect(issConfig.clientFullName).toBe('Full Name'); expect(issConfig.clientDisplayName).toBe('Display Name'); + expect(issConfig.clientPossessiveName).toBe('Display Name\'s'); expect(issConfig.parentAccountNumber).toBe('12345'); expect(issConfig.styleSheet).toBe('test-style'); expect(issConfig.isCoverageEnabled).toBe(true); diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 3918dc33..e9880117 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -14,6 +14,7 @@ import { getISSCookie, updateOrCreateISSCookie } from '@/helpers/cookie-helper.j import { useMainStore } from '@/store'; import showIssLoadingModal from '@/helpers/loading-modal-helper'; import applicationConfig from '@/constants/application-config'; +import { toPossessive } from '@/helpers/text-helper'; export default { name: 'entry-page', @@ -144,6 +145,7 @@ export default { this.mainStore.issConfig.clientName = data.accountName; this.mainStore.issConfig.clientFullName = data.accountName; // Defaults to use the client name. this.mainStore.issConfig.clientDisplayName = data.accountName; // Defaults to use the client name. + this.mainStore.issConfig.clientPossessiveName = toPossessive(data.accountName); // Defaults to use the client name. this.mainStore.issConfig.parentAccountNumber = data.parentAccountNumber; this.mainStore.issConfig.styleSheet = data.styleSheet; this.mainStore.issConfig.isCoverageEnabled = data.coverageEnabled; @@ -163,6 +165,11 @@ export default { if (clientFlags.ClientDisplayName != null) { this.mainStore.issConfig.clientDisplayName = clientFlags.ClientDisplayName; + this.mainStore.issConfig.clientPossessiveName = toPossessive(clientFlags.ClientDisplayName); + } + + if (clientFlags.ClientPossessiveName != null) { + this.mainStore.issConfig.clientPossessiveName = clientFlags.ClientPossessiveName; } if (clientFlags.ClaimRegistrationRequired) { diff --git a/src/store/index.js b/src/store/index.js index 74c3deb0..676fadb7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -247,6 +247,7 @@ export const getDefaultState = () => ({ clientName: 'Generic Insurance', // this is the default and will be overriden by the client's name clientFullName: 'Generic Insurance', // this is the default and will be overriden by the client's name or client's full name. clientDisplayName: 'Generic Insurance', // this is the default and will be overridden by the client's name or client display name. + clientPossessiveName: 'Generic Insurance\'s', // this is the default and will be overridden by the client's name or client display name converted to possessive or the clients possessive name. clientHeader: {}, styleSheet: '', // Stylesheet used by the client. parentAccountNumber: 0, // Parent account number used by the client. From 1f690985a0910e9ce7487ee52ecc61ad536300c4 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 13 Feb 2026 14:02:01 -0500 Subject: [PATCH 8/8] INSR-7752: Validation tweaks, alert tweak to fix collapse animation --- src/constants/error-messages.js | 4 +- .../contact-details/contact-details.vue | 5 +- src/ux-components/alert/alert.vue | 68 ++++++++++--------- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/constants/error-messages.js b/src/constants/error-messages.js index 3292660a..62e79340 100644 --- a/src/constants/error-messages.js +++ b/src/constants/error-messages.js @@ -68,7 +68,9 @@ const errorMessages = Object.freeze({ BAILOUT_EMAIL_ADDRESS_REQUIRED: 'Email address is required.', TPA_SEARCH_ZIP_FORMAT: 'Please enter a valid Zip code.', TPA_SEARCH_SHOP_FORMAT: 'Please enter a valid shop name.', - TPA_SEARCH_REQUIRED: 'Please enter a shop name or ZIP code.' + TPA_SEARCH_REQUIRED: 'Please enter a shop name or ZIP code.', + SERVICE_ADDRESS_REQUIRED: 'Service street address is required.', + SERVICE_CITY_REQUIRED: 'Service city is required.' }); export default errorMessages; diff --git a/src/layouts/contact-details/contact-details.vue b/src/layouts/contact-details/contact-details.vue index 021fabd0..5a84b8f3 100644 --- a/src/layouts/contact-details/contact-details.vue +++ b/src/layouts/contact-details/contact-details.vue @@ -135,8 +135,8 @@ import widgetFields from '@/constants/cms-widget-fields'; import states from '@/constants/states'; // DEFINE VALIDATION RULES -defineRule('street-address-required', required(errorMessages.STREET_ADDRESS_REQUIRED)); -defineRule('city-required', required(errorMessages.CITY_REQUIRED)); +defineRule('street-address-required', required(errorMessages.SERVICE_ADDRESS_REQUIRED)); +defineRule('city-required', required(errorMessages.SERVICE_CITY_REQUIRED)); export default { name: 'contact-details', @@ -221,7 +221,6 @@ export default { }, getStates() { return Object.keys(states).reduce((acc, key) => { - // eslint-disable-next-line no-param-reassign acc[key] = states[key].toUpperCase(); return acc; }, {}); diff --git a/src/ux-components/alert/alert.vue b/src/ux-components/alert/alert.vue index 6c0ba950..a6323194 100644 --- a/src/ux-components/alert/alert.vue +++ b/src/ux-components/alert/alert.vue @@ -77,42 +77,44 @@
- +