-
+
-
-
+
+
+
+
-
-
Sunday S
+
+
+
+ Morning
+
+ {{ showMorningAvailabilityForIndex(n - 1) }} available
+
+
+
-
-
Monday M
+
+
+
+ Afternoon
+
+ {{ showAfternoonAvailabilityForIndex(n - 1) }} available
+
+
+
-
- Tuesday T
+
+
+
-
- Wednesday W
-
-
- Thursday T
-
-
- Friday F
-
-
- Saturday S
-
-
+
+ name="time-slot"
+ class="sr-only"
+ :value="timeSlot.startTime"
+ @focus="timeSlotFocused(timeSlot)"
+ @change="timeSlotInputChanged(timeSlot)" />
- {{ date.dateNum.toString() }}
+ :for="`timeslot${timeSlot.startTime}`"
+ class="time-slot-button"
+ :class="[checkIsSelectedTimeSlot(timeSlot) ? 'selected-time-slot' : ''
+ , {'has-date-error': showTimeSlotError}]"
+ @click="selectTimeSlotForDay(timeSlot)">
+ {{ displayTimeSlotTime(timeSlot) }}
+
+
+
-
-
-
-
-
- View more dates
-
@@ -111,24 +131,27 @@
-
-
diff --git a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.spec.js b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.spec.js
index 5ddc7c30..31450a5b 100644
--- a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.spec.js
+++ b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.spec.js
@@ -38,16 +38,26 @@ describe('tpa-Recal-Modal.vue', () => {
test('should show error if not acknowledged', () => {
const { wrapper } = setupMocks();
wrapper.vm.acknowledged = false;
+ wrapper.vm.tpaRecalAnswer = 'TPAOption';
wrapper.vm.footerButtonClick();
- expect(wrapper.vm.showError).toBeTruthy();
+ expect(wrapper.vm.showAcknowledgementError).toBeTruthy();
});
test('should not show error if acknowledged', () => {
const { wrapper } = setupMocks();
wrapper.vm.acknowledged = true;
+ wrapper.vm.tpaRecalAnswer = 'TPAOption';
wrapper.vm.footerButtonClick();
- expect(wrapper.vm.showError).toBeFalsy();
+ expect(wrapper.vm.showAcknowledgementError).toBeFalsy();
+ });
+ test('should show error if no answer selected', () => {
+ const { wrapper } = setupMocks();
+ wrapper.vm.tpaRecalAnswer = '';
+ wrapper.vm.tpaRecalAnswer = undefined;
+ wrapper.vm.footerButtonClick();
+
+ expect(wrapper.vm.showNoSelectionError).toBeTruthy();
});
});
diff --git a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue
index 9141b32e..2b182c9f 100644
--- a/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue
+++ b/src/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue
@@ -16,11 +16,23 @@
+
@@ -42,24 +54,31 @@
import modal from '@/digital-components/modal/modal.vue';
import tpaRecalToggle from '@/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue';
import checkBox from '@/ux-components/checkbox/checkbox.vue';
+import buttonQuestion from '@/digital-components/button-question/button-question.vue';
import globalRules from '@/constants/global-rules';
+import PROVIDER_PREFERENCE_OPTIONS from '@/constants/provider-preference';
export default {
name: 'content-group-modal',
components: {
modal,
tpaRecalToggle,
- checkBox
+ checkBox,
+ buttonQuestion
},
props: {
cmsWidgetName: String,
- ackError: String
+ buttonCmsWidgetName: String,
+ ackError: String,
+ noSelectionError: String
},
emits: ['buttonClick'],
data() {
return {
acknowledged: false,
- showError: false,
+ showAcknowledgementError: false,
+ showNoSelectionError: false,
+ tpaRecalAnswer: '',
rules: {
optionRequired: globalRules.OPTION_REQUIRED
}
@@ -81,13 +100,34 @@ export default {
ModalCloseButtonText() {
return this.getCmsContent(this.cmsWidgetName, 'FooterText');
},
+ tpaRecalQuestionText() {
+ return this.getCmsContent(this.buttonCmsWidgetName, 'QuestionText');
+ },
+ tpaRecalAnswersFromCms() {
+ return this.getCmsContent(this.buttonCmsWidgetName, 'Answers');
+ },
+ showAcknowledgementCheckbox() {
+ return this.tpaRecalAnswer === PROVIDER_PREFERENCE_OPTIONS.TPA;
+ },
isButtonDisabled() {
return !this.acknowledged;
+ },
+ errorMessage() {
+ if (this.showNoSelectionError) {
+ return this.noSelectionError;
+ } else if (this.showAcknowledgementError) {
+ return this.ackError;
+ }
+ return '';
}
},
watch: {
acknowledged() {
- this.showError = false;
+ this.showAcknowledgementError = false;
+ },
+ tpaRecalAnswer() {
+ this.showNoSelectionError = false;
+ this.showAcknowledgementError = false;
}
},
methods: {
@@ -96,12 +136,15 @@ export default {
},
footerButtonClick() {
- // check if acked, if not show error
- if (this.acknowledged) {
+ if (this.tpaRecalAnswer && (!this.showAcknowledgementCheckbox || this.acknowledged )) {
this.$refs[this.ModalName]?.closeModal();
- this.$emit('buttonClick');
+ this.$emit('buttonClick', this.tpaRecalAnswer);
+ } else if (!this.tpaRecalAnswer) {
+ this.showNoSelectionError = true;
+ this.showAcknowledgementError = false;
} else {
- this.showError = true;
+ this.showAcknowledgementError = true;
+ this.showNoSelectionError = false;
}
}
}
@@ -130,29 +173,16 @@ export default {
}
}
}
-}
-
-.form-check {
- .form-check-input {
- &:checked {
- + label {
- p {
- font-weight: 400 !important;
- font-size: 1rem !important;
- color: $gray-600 !important;
- line-height: 1.5rem;
- }
+ .safelite-or-tpa-question {
+ :deep(.question-text) {
+ span {
+ font-weight: 500;
}
}
}
- p {
- font-weight: 400 !important;
- font-size: 1rem !important;
- color: $gray-600 !important;
- line-height: 1.5rem;
- }
}
+
.form-test-error {
p {
font-weight: 500;
diff --git a/src/layouts/schedule-page/schedule-page.spec.js b/src/layouts/schedule-page/schedule-page.spec.js
index ad18458e..133654da 100644
--- a/src/layouts/schedule-page/schedule-page.spec.js
+++ b/src/layouts/schedule-page/schedule-page.spec.js
@@ -6,7 +6,6 @@ import { createTestingPinia } from '@pinia/testing';
import { shallowMount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import { useMainStore } from '@/store/index.js';
-import { AppointmentTypeStrings } from '@/constants/schedule-constants';
// Mock fetchCmsContentForPage
jest.mock('@/helpers/cms-content-helper', () => ({
@@ -214,7 +213,7 @@ describe('schedule-page.vue', () => {
// Act
const newShopTimeSlots = await wrapper.vm.getAvailableDatesMethod(
'2023-01-01',
- '2023-01-31'
+ '2023-01-15'
);
// Assert
@@ -236,7 +235,7 @@ describe('schedule-page.vue', () => {
estimatedServiceMinutesMaximum: 120
});
});
- test('Should call API service in days of 34 or less when getAvailableDatesMethod is called with large date ranges', async () => {
+ test('Should call API service in days of 15 or less when getAvailableDatesMethod is called with large date ranges', async () => {
// Arrange
const { wrapper } = getShallowMountedComponent();
wrapper.vm.selectableDatesData = {
@@ -264,7 +263,7 @@ describe('schedule-page.vue', () => {
// 2023-01-01 --> 2023-02-05
// 2023-02-06 --> 2023-03-12
// 2023-03-13 --> 2023-03-31
- expect(store.getShopTimeSlots).toHaveBeenCalledTimes(3);
+ expect(store.getShopTimeSlots).toHaveBeenCalledTimes(6);
});
});
describe('Rendering', () => {
@@ -290,32 +289,16 @@ describe('schedule-page.vue', () => {
// Assert
expect(testValue).toStrictEqual('01234');
});
- test('getDisplayTextForMilitaryTime should return the correctly formatted string', () => {
- // Arrange
- const { wrapper } = getShallowMountedComponent();
- wrapper.vm.selectableDatesData = {
- days: []
- };
- const timeInput1 = '15:00';
- const timeInput2 = '15:30';
-
- // Act
- const testOutput1 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1);
- const testOutput2 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2);
- const testOutput3 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1, true);
- const testOutput4 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2, true);
-
- // Assert
- expect(testOutput1).toBe('3:00 PM');
- expect(testOutput2).toBe('3:30 PM');
- expect(testOutput3).toBe('3 PM');
- expect(testOutput4).toBe('3:30 PM');
- });
});
test('forwardButtonAction should call route method navigateWithoutSaving', async () => {
// Arrange
const { wrapper } = getShallowMountedComponent();
wrapper.vm.$router.navigate = jest.fn(() => ({}));
+ wrapper.vm.selectedTimeSlotInfo = {
+ timeSlot: {
+ routeCode: 'test-id'
+ }
+ };
// Act
await wrapper.vm.forwardButtonAction();
diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue
index 38a5b1b1..aa08e79a 100644
--- a/src/layouts/schedule-page/schedule-page.vue
+++ b/src/layouts/schedule-page/schedule-page.vue
@@ -1,7 +1,6 @@
@@ -257,7 +241,6 @@ export default {
duplicates: [],
rules: {
damageOption: 'damage-option-required',
- email: `${globalRules.EMAIL_ADDRESS_REQUIRED}|${globalRules.EMAIL_ADDRESS_FORMAT}`,
extension: `${globalRules.EXTENSION_FORMAT}`,
lossCity: `${globalRules.DATE_OF_LOSS_CITY_REQUIRED}|${globalRules.DATE_OF_LOSS_CITY_FORMAT}`,
// eslint-disable-next-line max-len
@@ -302,7 +285,11 @@ export default {
return !!this.getCmsContent('GlassOnlyQuestion', 'QuestionText');
},
getStates() {
- return states;
+ return Object.keys(states).reduce((acc, key) => {
+ // eslint-disable-next-line no-param-reassign
+ acc[key] = states[key].toUpperCase();
+ return acc;
+ }, {});
},
isPolicyHolderDisabled() {
return !!this.mainStore.issConfig.disabledFields.policyNumber;
@@ -408,7 +395,6 @@ export default {
isDamageGlassOnly: this.mainStore.order.policy.isDamageGlassOnly,
phoneNumber: this.mainStore.order.contactInfo.homePhone,
extension: this.mainStore.order.contactInfo.extension,
- email: this.mainStore.order.customer.emailAddress,
isPolicyNumberDisabled: this.mainStore.order.policy.isPolicyNumberDisabled
};
},
@@ -425,7 +411,6 @@ export default {
this.welcomePageModel.isDamageGlassOnly = response.policy.isDamageGlassOnly;
this.welcomePageModel.phoneNumber = response.customer.homePhone;
this.welcomePageModel.extension = response.customer.extension;
- this.welcomePageModel.email = response.customer.emailAddress;
},
findDamageCause(damageCause) {
const damageCauseOptions = this.DamageCauseOptions;
@@ -481,13 +466,6 @@ export default {
this.mainStore.order.loadedFromCookie = true;
this.answeredContinueModal = true;
this.$refs.continueModal.closeModal();
- },
- handleHelpLinkClick() {
- useMainStore().setBailout(bailoutMessage.RequestCallback());
- this.$router.navigate(
- this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
- this.$route
- );
}
}
};
@@ -508,6 +486,10 @@ form {
min-height: 1px;
padding-left: .9375rem;
padding-right: .9375rem;
+
+ .form-group {
+ margin-top: 1.25rem;
+ }
}
}
diff --git a/src/store/index.js b/src/store/index.js
index 1d6e44b7..5fb37e57 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -243,6 +243,7 @@ export const getDefaultState = () => ({
},
issConfig: {
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.
clientHeader: {},
styleSheet: '', // Stylesheet used by the client.
@@ -2156,6 +2157,7 @@ export const useMainStore = defineStore({
resetISSConfigState() {
this.issConfig.clientName = 'Generic Insurance';
+ this.issConfig.clientFullName = 'Generic Insurance';
this.issConfig.clientDisplayName = 'Generic Insurance';
this.issConfig.clientHeader = {};
this.issConfig.parentAccountNumber = 0;
@@ -2275,7 +2277,6 @@ export const useMainStore = defineStore({
this.order.policy.damageState = welcomePageModel?.damageState;
this.order.policy.damageCity = welcomePageModel?.damageCity;
this.order.policy.isDamageGlassOnly = welcomePageModel?.isDamageGlassOnly;
- this.order.customer.emailAddress = welcomePageModel?.email;
this.order.serviceLocation.zipCode = welcomePageModel?.policyZipCode;
this.updatePhoneNumbers({
home: welcomePageModel?.phoneNumber,
@@ -2369,23 +2370,23 @@ export const useMainStore = defineStore({
const isMobileApt = appointmentType === AppointmentTypeStrings.MOBILE
|| appointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
-
+
const retPricedLineItems = await globalMethods.callHttpClient({
method: endpoints.TaxOrderItems.method,
endpoint: endpoints.TaxOrderItems.url,
payload: {
- ParentAccountNumber: this.order.parentAccountNumber,
- BillToAccountNumber: this.billToAccountNumber,
- ProviderNumber: this.providerNumber,
- AppointmentType: appointmentType,
- PricedLineItems: getLineItemsFlattened(pricedLineItems),
- ServiceLocation: {
- City: isMobileApt ? serviceLocationCity : null,
- State: isMobileApt ? serviceLocationState : null,
- ZipCode: isMobileApt ? serviceLocationZipCode : null,
- },
- ServerData: lineItemServerData ? lineItemServerData : "",
- },
+ ParentAccountNumber: this.order.parentAccountNumber,
+ BillToAccountNumber: this.billToAccountNumber,
+ ProviderNumber: this.providerNumber,
+ AppointmentType: appointmentType,
+ PricedLineItems: getLineItemsFlattened(pricedLineItems),
+ ServiceLocation: {
+ City: isMobileApt ? serviceLocationCity : null,
+ State: isMobileApt ? serviceLocationState : null,
+ ZipCode: isMobileApt ? serviceLocationZipCode : null
+ },
+ ServerData: lineItemServerData || ''
+ }
}).then((response) => {
this.order.lineItems.serverData = response.data.serverData;
return addTaxesToPricedLineItems(pricedLineItems, response.data.taxedLineItems);
@@ -2393,9 +2394,6 @@ export const useMainStore = defineStore({
return retPricedLineItems;
},
- saveProviderPreferenceData(data) {
- this.updatePageData({ page: issPageValues.PROVIDER_PREFERENCE, data });
- },
addEventToBus(event) {
this.applicationUser.eventBus.push(event);
},
diff --git a/src/styles/common-styles.scss b/src/styles/common-styles.scss
index d60114d6..5c369f09 100644
--- a/src/styles/common-styles.scss
+++ b/src/styles/common-styles.scss
@@ -174,6 +174,7 @@ body {
div.textbox-question {
label {
span.sub-caption {
+ color: #525656;
font-weight: 400;
}
}
@@ -203,10 +204,10 @@ $heritage-btn-width: 9.0625rem; // 145px
@include heritage-btn-variant('secondary', $white, $heritage-blue-secondary, transparent, true);
@include heritage-btn-link('link', $blue, transparent, $heritage-blue-secondary);
- @include heritage-btn-size('lg', 0.625rem, 1.25rem);
+ @include heritage-btn-size('lg', 0.625rem, 1.25rem);
@include heritage-btn-size('md', 7px, 15px);
- @include heritage-btn-size('sm', 3px, 6px);
- @include heritage-btn-size('xs', 1px, 5px);
+ @include heritage-btn-size('sm', 3px, 6px);
+ @include heritage-btn-size('xs', 1px, 5px);
&.btn-link {
--bs-btn-padding-x: 0px;
diff --git a/src/styles/ux-variables.scss b/src/styles/ux-variables.scss
index 41cd8269..7d999430 100644
--- a/src/styles/ux-variables.scss
+++ b/src/styles/ux-variables.scss
@@ -20,7 +20,7 @@ $red-100: #ffe6e4;
$red-200: #fcbfbb;
$red-300: #f89892;
$red-400: #e65c53;
-$red: #d4281c; // Default Red
+$red: #db0020; // Default Red
$red-600: #ac160b;
$red-700: #840900;
$red-800: #5b0600;
@@ -154,6 +154,7 @@ $border-radius: 0.25rem;
$border-radius-sm: 0.2rem;
$border-radius-lg: 0.5rem; //Used for buttons. Can be used for other things, of course.
$border-radius-pill: 50rem;
+$border-radius-list-button: 1.375rem; // Used for list buttons
//Progress Bar Styling
$progress-bar-success-color: $green;