0
+ );
case 'isDeductibleZero':
return (
- this.isDeductibleVisible && this.deductibleValue === 0
+ this.isDeductibleVisible && this.deductibleValue <= 0
);
+ case 'verifiedRepair':
+ return isRepair && this.isDeductibleVisible;
+ case 'verifiedReplaceZeroDeductible':
+ return !isRepair && this.isDeductibleVisible && this.deductibleValue <= 0;
+ case 'verifiedReplaceDeductibleOverZero':
+ return !isRepair && this.isDeductibleVisible && this.deductibleValue > 0;
default:
return null;
}
@@ -501,6 +508,9 @@ export default {
.deductible-text {
line-height: 1.5rem;
}
+ .sub-header {
+ line-height: 2rem;
+ }
:deep ol {
padding: 0;
padding-left: 1.125rem;
@@ -520,6 +530,10 @@ export default {
color: $black;
}
}
+ :deep .body-text {
+ font-size: 0.875rem;
+ line-height: 1.5rem;
+ }
:deep .question-text {
margin-top: 1.5rem;
margin-bottom: 0.5rem;
diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue
index 130b1758..455e6c6f 100644
--- a/src/layouts/entry-page/entry-page.vue
+++ b/src/layouts/entry-page/entry-page.vue
@@ -12,6 +12,7 @@ import issPageValues from '@/router/router-constants/issPage-values';
import { validateISSClientTag, validateISSClientSignature } from '@/helpers/clientauth-helper';
import { getISSCookie, updateOrCreateISSCookie } from '@/helpers/cookie-helper.js';
import { useMainStore } from '@/store';
+import showIssLoadingModal from '@/helpers/loading-modal-helper';
import applicationConfig from '@/constants/application-config';
export default {
@@ -35,51 +36,54 @@ export default {
async mounted() {
const queryStringParams = this.parseQueryParms();
- const { isAuthorized, clientData } = await this.validateClientTagOnEntry(queryStringParams);
+ const { isAuthorized, clientData, decryptedParams } = await this.validateClientTagOnEntry(queryStringParams);
this.unauthorized = !isAuthorized;
+ if (!isAuthorized) {
+ // Remove the loading animation if client tag validation fails so users can see the Unauthorized Access message.
+ showIssLoadingModal(false);
+ return;
+ }
- if (isAuthorized) {
- this.populateISSConfigValues(clientData);
+ this.populateISSConfigValues(clientData);
- try {
- // Check cookie
- const issCookie = getISSCookie();
- if (issCookie !== null && issCookie.VehicleMake && issCookie.VehicleModel) {
- const clientParentAccountNumber = clientData.parentAccountNumber;
- const cookieParentAccountNumber = issCookie.ReferralParentAccountNumber;
+ try {
+ // Check cookie
+ const issCookie = getISSCookie();
+ if (issCookie !== null && issCookie.VehicleMake && issCookie.VehicleModel) {
+ const clientParentAccountNumber = clientData.parentAccountNumber;
+ const cookieParentAccountNumber = issCookie.ReferralParentAccountNumber;
- if (clientParentAccountNumber === cookieParentAccountNumber) {
- const savedSessionTimeStamp = new Date(issCookie.SavedSessionTimeoutDate);
- const isSavedSessionTimedOut = new Date(new Date().toUTCString()) > savedSessionTimeStamp;
+ if (clientParentAccountNumber === cookieParentAccountNumber) {
+ const savedSessionTimeStamp = new Date(issCookie.SavedSessionTimeoutDate);
+ const isSavedSessionTimedOut = new Date(new Date().toUTCString()) > savedSessionTimeStamp;
- if (!isSavedSessionTimedOut) {
- this.mainStore.issConfig.enableContinueFromCookie = true;
- }
+ if (!isSavedSessionTimedOut) {
+ this.mainStore.issConfig.enableContinueFromCookie = true;
}
- } else {
- updateOrCreateISSCookie(true);
}
- } catch {
+ } else {
updateOrCreateISSCookie(true);
}
+ } catch {
+ updateOrCreateISSCookie(true);
+ }
- if (clientData.parameters?.length > 0) {
- const finalParams = this.combineClientParameters(clientData.parameters, queryStringParams);
- this.populateStoreItemsFromParams(finalParams);
- }
+ if (clientData.parameters?.length > 0) {
+ const finalParams = this.combineClientParameters(clientData.parameters, { ...queryStringParams, ...decryptedParams });
+ this.populateStoreItemsFromParams(finalParams);
+ }
- this.mainStore.applicationUser.coverageAttempts = 0;
- if (
- applicationConfig.CURRENT_ENVIRONMENT === 'Localhost'
- || applicationConfig.CURRENT_ENVIRONMENT === 'Dev'
- || applicationConfig.CURRENT_ENVIRONMENT === 'SysTest'
- ) {
- this.navigateForward();
- } else {
- // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history.
- window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`;
- }
+ this.mainStore.applicationUser.coverageAttempts = 0;
+ if (
+ applicationConfig.CURRENT_ENVIRONMENT === 'Localhost'
+ || applicationConfig.CURRENT_ENVIRONMENT === 'Dev'
+ || applicationConfig.CURRENT_ENVIRONMENT === 'SysTest'
+ ) {
+ this.navigateForward();
+ } else {
+ // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history.
+ window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`;
}
},
methods:
@@ -91,46 +95,51 @@ export default {
);
},
parseQueryParms() {
- // Dump the query string parameters into an array. Remove casing on the key for easy compare.
- const queryStringParams = [];
-
+ // Dump the query string parameters into an object
if (this.$route?.query) {
- Object.keys(this.$route.query).forEach((param) => {
- queryStringParams[param.toLowerCase()] = this.$route.query[param];
- });
+ return Object.fromEntries(Object.entries(this.$route?.query).map(([key, value]) => [key.toLowerCase(), value]));
}
- return queryStringParams;
+ return {};
},
async validateClientTagOnEntry(queryStringParams) {
const clientTag = queryStringParams.clienttag;
- const clientTagPresent = !!clientTag;
- let authorized = false;
+ if (!clientTag) {
+ return { isAuthorized: false };
+ }
+
+ const resp = await validateISSClientTag(clientTag);
+ if (!resp) {
+ return { isAuthorized: false };
+ }
+
+ let isAuthorized = false;
let clientData = null;
+ const decryptedParams = {};
- if (clientTagPresent) {
- const resp = await validateISSClientTag(clientTag);
-
- if (resp?.data.active && resp?.data.accountName.length > 0) {
- if (resp.data.authentication === 'RSAToken') {
- const { token, signature } = queryStringParams;
- const vsigResp = await validateISSClientSignature(clientTag, token, signature);
-
- this.mainStore.issConfig.isAuthenticated = vsigResp?.data?.valid ?? false;
- if (this.mainStore.issConfig.isAuthenticated) {
- authorized = true;
+ if (resp.active && resp.accountName.length > 0) {
+ if (resp.authentication.startsWith('RSAToken')) {
+ const { token, signature } = queryStringParams;
+ const vsigResp = await validateISSClientSignature(clientTag, token, signature);
+ if (resp.authentication.includes('EncParams')) {
+ const params = new URLSearchParams(vsigResp.decryptedData);
+ for (const [key, value] of params) {
+ decryptedParams[key.toLowerCase()] = value;
}
- } else {
- authorized = true;
}
- if (authorized) {
- clientData = resp.data;
- }
+ isAuthorized = vsigResp?.valid ?? false;
+ this.mainStore.issConfig.isAuthenticated = isAuthorized;
+ } else {
+ isAuthorized = true;
+ }
+
+ if (isAuthorized) {
+ clientData = resp;
}
}
- return { isAuthorized: authorized, clientData };
+ return { isAuthorized, clientData, decryptedParams };
},
populateISSConfigValues(data) {
this.mainStore.issConfig.clientName = data.accountName;
@@ -165,22 +174,17 @@ export default {
}
},
combineClientParameters(configParams, queryStringParams) {
- const finalParams = [];
+ const finalParams = {};
try {
const clientParams = JSON.parse(configParams);
-
- Object.keys(clientParams).forEach((cparam) => {
- const cname = clientParams[cparam].toLowerCase();
-
- Object.keys(queryStringParams).forEach((qsparam) => {
- const qsname = qsparam.toLowerCase();
-
- if (cname === qsname) {
- finalParams[cname] = queryStringParams[cname];
- }
- });
- });
+ for (const clientParam of clientParams) {
+ const paramName = clientParam.toLowerCase();
+ const value = queryStringParams[paramName];
+ if (value) {
+ finalParams[paramName] = value;
+ }
+ }
} catch (e) {
window.console.error(`Error combining client parameters: ${e}`);
}
@@ -189,12 +193,9 @@ export default {
},
populateStoreItemsFromParams(params) {
// Populate store items from parameters.
-
- Object.keys(params).forEach((param) => {
- const name = param.toLowerCase();
- const value = params[param];
-
- switch (name) {
+ for (const [key, value] of Object.entries(params)) {
+ switch (key.toLowerCase()) {
+ case 'policynbr':
case 'policynumber':
this.mainStore.order.policy.policyNumber = value;
this.mainStore.issConfig.disabledFields.policyNumber = true;
@@ -205,16 +206,19 @@ export default {
this.mainStore.issConfig.disabledFields.policyZipCode = true;
break;
+ case 'dateofloss':
case 'lossdate':
- // NOTE: May need some date parsing logic in here depending on client.
+ // NOTE: May need some date parsing logic in here depending on client.
this.mainStore.order.policy.dateOfLoss = value;
this.mainStore.issConfig.disabledFields.dateOfLoss = true;
break;
+ case 'returnurl':
case 'successreturnurl':
this.mainStore.issConfig.successReturnURL = value;
break;
+ case 'returnurl2':
case 'failurereturnurl':
this.mainStore.issConfig.failureReturnURL = value;
break;
@@ -226,7 +230,7 @@ export default {
break;
default:
}
- });
+ }
}
}
};
diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js
index e0f651c6..f57fac7a 100644
--- a/src/layouts/order-confirmation/order-confirmation.spec.js
+++ b/src/layouts/order-confirmation/order-confirmation.spec.js
@@ -13,6 +13,7 @@ import coverageStatuses from '@/constants/coverage-statuses';
import coverageType from '@/constants/coverage-type';
import { deepClone } from '@/helpers/object-helper';
import { AppointmentTypeStrings } from '@/constants/schedule-constants';
+import { paymentMethods } from "@/constants/payment-method-constants";
jest.mock('@/helpers/layout-helper.js', () => jest.fn());
@@ -80,7 +81,7 @@ const initialStore = {
},
payment: {
isInsurance: true,
- isPayInAdvance: false
+ paymentMethod: paymentMethods.PAY_AT_TIME_OF_SERVICE
},
contactInfo: {
firstName: 'Test',
@@ -920,6 +921,29 @@ describe('OrderConfirmation.vue', () => {
// Act
const testValue = wrapper.vm.isDropOffAppointment;
+ // Assert
+ expect(testValue).toBe(expected);
+ });
+ });
+ describe('showCart', () => {
+ test.each([
+ [true, true, 100],
+ [true, false, 100],
+ [false, true, 0],
+ [false, true, null]
+ ])('showCart is %p when is PIA is %p and settledTenderAmount is %p', (expected, isPia, settledTenderAmount) => {
+ // Arrange
+ const order = deepClone(sessionStorage);
+ order.payment.isPayInAdvance = isPia;
+ order.settledTenderAmount = settledTenderAmount;
+ const mockStoreActions = () => {
+ useMainStore().getSubmittedOrder = jest.fn().mockImplementation(() => order);
+ };
+ const { wrapper } = getMountedComponent({}, {}, mockStoreActions);
+
+ // Act
+ const testValue = wrapper.vm.showCart;
+
// Assert
expect(testValue).toBe(expected);
});
diff --git a/src/layouts/order-confirmation/order-confirmation.vue b/src/layouts/order-confirmation/order-confirmation.vue
index e33a5e08..c364ae05 100644
--- a/src/layouts/order-confirmation/order-confirmation.vue
+++ b/src/layouts/order-confirmation/order-confirmation.vue
@@ -56,6 +56,7 @@
0) {
+ return true;
+ }
+
+ // settleTenderAmount always shows 0 via localhost or dev.
+ // Temporarily set return true to see cart in localhost or dev environment
+ return false;
}
},
mounted() {
@@ -369,8 +384,7 @@ export default {
);
// Payment
- const paymentMethodReqs =
- useMainStore().order.payment.isPayInAdvance === false;
+ const paymentMethodReqs = useMainStore().order.payment.paymentMethod != null;
return (
serviceLocationReqs
diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js
index 3e60fce2..58811293 100644
--- a/src/layouts/payment-method/payment-method.spec.js
+++ b/src/layouts/payment-method/payment-method.spec.js
@@ -16,7 +16,8 @@ import coverageType from '@/constants/coverage-type';
// Mock so it can be used as an assertion
jest.mock('@/helpers/order-helper.js', () => ({
- submitWorkOrder: jest.fn()
+ submitWorkOrder: jest.fn(),
+ saveSession: jest.fn()
}));
function setupMocks({ customMountOptions = {}, queryString }, mainInitialState = {}, customMixin = null) {
@@ -72,8 +73,7 @@ describe('payment-method.vue', () => {
const store = {
order: {
payment: {
- isPayInAdvance: false,
- payInAdvanceType: null
+ paymentMethod: null
}
}
};
@@ -91,8 +91,7 @@ describe('payment-method.vue', () => {
const store = {
order: {
payment: {
- isPayInAdvance: true,
- payInAdvanceType: payInAdvanceMethod
+ paymentMethod: payInAdvanceMethod
},
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
@@ -115,8 +114,7 @@ describe('payment-method.vue', () => {
const store = {
order: {
payment: {
- isPayInAdvance: true,
- payInAdvanceType: payInAdvanceMethod
+ paymentMethod: payInAdvanceMethod
},
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
@@ -139,8 +137,7 @@ describe('payment-method.vue', () => {
const store = {
order: {
payment: {
- isPayInAdvance: true,
- payInAdvanceType: payInAdvanceMethod
+ paymentMethod: payInAdvanceMethod
},
insuranceCoverage: {
coverageStatus: coverageStatuses.PENDING,
@@ -173,8 +170,7 @@ describe('payment-method.vue', () => {
const store = {
order: {
payment: {
- isPayInAdvance: true,
- payInAdvanceType: payInAdvanceMethod
+ paymentMethod: payInAdvanceMethod
},
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
@@ -324,15 +320,8 @@ describe('payment-method.vue', () => {
describe('forwardButtonAction', () => {
test('Pay at the time of service is selected, should call saveWorkOrder', async () => {
// Arrange
- const store = {
- order: {
- payment: {
- isPayInAdvance: false,
- payInAdvanceType: null
- }
- }
- };
- const wrapper = setupMocks({}, store);
+ const wrapper = setupMocks({});
+ wrapper.vm.paymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE;
// Act
await wrapper.vm.forwardButtonAction();
diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue
index 832e2d9a..90d12c7b 100644
--- a/src/layouts/payment-method/payment-method.vue
+++ b/src/layouts/payment-method/payment-method.vue
@@ -43,8 +43,8 @@
:isDismissible="false" />
{
vm.setCmsContent(resultMap.cmsContent);
+ vm.initializeComponent();
vm.updateFooterButtonText(vm.customCallToActionButtonCopy);
});
},
data() {
return {
- paymentMethodInternalModel: this.getPaymentMethodFromStore(),
+ paymentMethod: null,
+ widget: {
+ paymentMethod: 'PaymentMethodWidget',
+ paymentMethodApplePay: 'PaymentMethodWidgetApplePay'
+ },
rules: {
optionRequired: globalRules.OPTION_REQUIRED
}
@@ -139,10 +146,8 @@ export default {
computed: {
customCallToActionButtonCopy() {
switch (this.paymentMethod) {
- case paymentMethods.CREDIT_CARD:
+ case paymentMethods.PayNow:
return 'Continue to checkout';
- case paymentMethods.PAYPAL:
- return 'Continue to Paypal';
case paymentMethods.AFTERPAY:
return 'Continue to Afterpay';
default:
@@ -159,8 +164,8 @@ export default {
return !isEnabled || useMainStore().isUnverified || (useMainStore().isDeductible && isDeductibleTotalEqualToZero);
},
- paymentMethod() {
- return this.paymentMethodInternalModel;
+ paymentMethodWidgetName() {
+ return supportsApplePay() ? this.widget.paymentMethodApplePay : this.widget.paymentMethod;
}
},
watch: {
@@ -247,26 +252,23 @@ export default {
&& serviceLocationReqs
&& scheduleReqs
&& customerReqs
- && contactInfoReqs
- );
+ && contactInfoReqs);
+ },
+ initializeComponent() {
+ this.paymentMethod = this.getPaymentMethodFromStore();
},
getPaymentMethodFromStore() {
- const { payInAdvanceType } = useMainStore().order.payment;
- const isPayInAdvance =
- useMainStore().order.payment.isPayInAdvance
- && !!payInAdvanceType
- && !this.isPayInAdvanceDisabled;
+ if (this.isPayInAdvanceDisabled) {
+ return paymentMethods.PAY_AT_TIME_OF_SERVICE;
+ }
- return isPayInAdvance
- ? payInAdvanceType
- : paymentMethods.PAY_AT_TIME_OF_SERVICE;
+ return useMainStore().order.payment.paymentMethod;
},
updateFooterButtonText(newValue) {
this.$refs.siteFooter.updateButtonText(newValue);
},
async forwardButtonAction() {
useMainStore().savePaymentMethodChoice(this.paymentMethod);
-
if (this.paymentMethod === paymentMethods.PAY_AT_TIME_OF_SERVICE) {
try {
await submitWorkOrder({ submitType: submitType.SAFELITE });
@@ -284,9 +286,16 @@ export default {
console.error(`error: response from submit work order:${error.message}`);
}
} else {
+ await saveSession({
+ createWorkOrderNumberForPIA: true,
+ shouldAwaitSaveSessionQueue: true
+ });
+
this.$router.navigate(
this.navigationScenarios.CLICKED_PAY_NOW,
- this.$route
+ this.$route,
+ {},
+ { [routerParams.SKIP_SAVE_SESSION]: true }
);
}
}
diff --git a/src/layouts/payment-page/payment-page.spec.js b/src/layouts/payment-page/payment-page.spec.js
index 3e0a831c..d36e9de2 100644
--- a/src/layouts/payment-page/payment-page.spec.js
+++ b/src/layouts/payment-page/payment-page.spec.js
@@ -3,11 +3,10 @@ import payment from '@/layouts/payment-page/payment-page.vue';
// Supporting Files
import { shallowMount } from '@vue/test-utils';
-import { getMountOptions } from '@/helpers/unit-test-helper';
+import { getEnumName, getMountOptions } from '@/helpers/unit-test-helper';
import { useMainStore } from '@/store';
-import { paymentMethods, hopPaymentMethods } from '@/constants/payment-method-constants.js';
+import { paymentMethods } from '@/constants/payment-method-constants.js';
import queryStrings from '@/constants/query-strings';
-import CartDropdown from '@/iss-components/cart-dropdown/cart-dropdown.vue';
import { createTestingPinia } from '@pinia/testing';
import settleAllPromises from '@/helpers/layout-helper';
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
@@ -207,8 +206,7 @@ const defaultOrder = {
},
payment: {
isInsurance: false,
- isPayInAdvance: true,
- payInAdvanceType: 'Afterpay',
+ paymentMethod: paymentMethods.AFTERPAY,
inactivePromos: []
},
schedule: {
@@ -239,8 +237,7 @@ describe('payment-page.vue', () => {
test('Returns false if pia options are not valid', () => {
// Arrange
const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.isPayInAdvance = null;
- useMainStore().order.payment.payInAdvanceType = null;
+ useMainStore().order.payment.paymentMethod = null;
// Act
const result = wrapper.vm.arePagePrerequisitesValid();
@@ -252,8 +249,7 @@ describe('payment-page.vue', () => {
test('Returns false if pay at time of service', () => {
// Arrange
const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.isPayInAdvance = false;
- useMainStore().order.payment.payInAdvanceType = null;
+ useMainStore().order.payment.paymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE;
// Act
const result = wrapper.vm.arePagePrerequisitesValid();
@@ -265,94 +261,6 @@ describe('payment-page.vue', () => {
});
describe('payment type mapping', () => {
- describe('getPaymentType', () => {
- test('Maps AFTERPAY -> hopPaymentMethods.AFTERPAY', () => {
- // Arrange
- const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.payInAdvanceType = paymentMethods.AFTERPAY;
-
- // Act
- const mapped = wrapper.vm.getPaymentType();
-
- // Assert
- expect(mapped).toBe(hopPaymentMethods.AFTERPAY);
- });
-
- test('Maps CREDIT_CARD -> hopPaymentMethods.CREDIT_CARD', () => {
- // Arrange
- const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.payInAdvanceType = paymentMethods.CREDIT_CARD;
-
- // Act
- const mapped = wrapper.vm.getPaymentType();
-
- // Assert
- expect(mapped).toBe(hopPaymentMethods.CREDIT_CARD);
- });
-
- test('Maps PAYPAL -> hopPaymentMethods.PAYPAL', () => {
- // Arrange
- const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.payInAdvanceType = paymentMethods.PAYPAL;
-
- // Act
- const mapped = wrapper.vm.getPaymentType();
-
- // Assert
- expect(mapped).toBe(hopPaymentMethods.PAYPAL);
- });
-
- test('Maps other values to self', () => {
- // Arrange
- const { wrapper } = getMountedComponent(defaultOrder);
- useMainStore().order.payment.payInAdvanceType = 'SomeOtherText';
-
- // Act
- const mapped = wrapper.vm.getPaymentType();
-
- // Assert
- expect(mapped).toBe('SomeOtherText');
- });
- });
-
- describe('cart-dropdown', () => {
- test('Show cart dropdown if credit card', async () => {
- const { wrapper } = getMountedComponent(defaultOrder);
- wrapper.vm.paymentType = hopPaymentMethods.CREDIT_CARD;
-
- // Act
- await wrapper.vm.$nextTick();
- const cartTable = wrapper.findComponent(CartDropdown);
-
- // Assert
- expect(cartTable.exists()).toBeTruthy();
- });
-
- test('show cart dropdown if afterpay', async () => {
- const { wrapper } = getMountedComponent(defaultOrder);
- wrapper.vm.paymentType = hopPaymentMethods.AFTERPAY;
-
- // Act
- await wrapper.vm.$nextTick();
- const cartTable = wrapper.findComponent(CartDropdown);
-
- // Assert
- expect(cartTable.exists()).toBeTruthy();
- });
-
- test('Hide cart dropdown if paypal', async () => {
- const { wrapper } = getMountedComponent(defaultOrder);
- wrapper.vm.paymentType = hopPaymentMethods.PAYPAL;
-
- // Act
- await wrapper.vm.$nextTick();
- const cartTable = wrapper.findComponent(CartDropdown);
-
- // Assert
- expect(cartTable.exists()).toBeFalsy();
- });
- });
-
describe('isPaypal', () => {
test('Is responsive if initial data changes', async () => {
// Arrange
@@ -361,7 +269,7 @@ describe('payment-page.vue', () => {
// Act
const preVal = wrapper.vm.isPaypal;
- wrapper.vm.paymentType = hopPaymentMethods.PAYPAL;
+ wrapper.vm.paymentType = paymentMethods.PAYPAL;
await wrapper.vm.$nextTick();
const postVal = wrapper.vm.isPaypal;
@@ -441,6 +349,7 @@ describe('payment-page.vue', () => {
};
const { wrapper } = getMountedComponent(defaultOrder);
+ useMainStore().order.payment.paymentMethod = paymentMethods.PayNow;
// Act
wrapper.vm.handleIFrameContentWindowMessage(event);
@@ -522,4 +431,26 @@ describe('payment-page.vue', () => {
expect(afterPayErrorAlert.isVisible()).toBeTruthy();
});
});
+
+ describe.each([
+ [paymentMethods.CREDIT_CARD, { data: 'creditCardSubmit' }],
+ [paymentMethods.AFTERPAY, { data: 'afterpayPaymentReceived' }],
+ [paymentMethods.APPLEPAY, { data: 'applepayOpened' }],
+ [paymentMethods.PAYPAL, { data: 'showLoaderForPaypal' }]
+ ])('handleIFrameContentWindowMessage', (expected, event) => {
+ test(`sets paymentMethod to ${getEnumName(paymentMethods, expected)} when data is ${event.data}`, () => {
+ // Arrange
+ const { wrapper } = getMountedComponent(defaultOrder);
+ useMainStore().order.payment.paymentMethod = paymentMethods.PayNow;
+
+ useMainStore().savePaymentMethodChoice = jest.fn().mockImplementation((value) => {useMainStore().order.payment.paymentMethod = value});
+
+ // Act
+ wrapper.vm.handleIFrameContentWindowMessage(event);
+ const result = useMainStore().order.payment.paymentMethod;
+
+ // Assert
+ expect(result).toBe(expected);
+ });
+ });
});
diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue
index acf89e2f..efdc2638 100644
--- a/src/layouts/payment-page/payment-page.vue
+++ b/src/layouts/payment-page/payment-page.vue
@@ -33,12 +33,12 @@
class="hop-iframe payment-iframe"
name="card-frame"
seamless
- scrolling="no">
+ scrolling="no"
+ allow="payment *; microphone *; geolocation *;">
-
+
+
diff --git a/src/layouts/payment-return/payment-return.vue b/src/layouts/payment-return/payment-return.vue
index b4df4190..08f844a8 100644
--- a/src/layouts/payment-return/payment-return.vue
+++ b/src/layouts/payment-return/payment-return.vue
@@ -15,8 +15,8 @@ import getQueryStringParameter from '@/helpers/querystring-helper.js';
import { paymentMethods } from '@/constants/payment-method-constants.js';
import { getCartTotal } from '@/helpers/cart-helper';
import { submitWorkOrder } from '@/helpers/order-helper.js';
-import showIssLoadingModal from '@/helpers/loading-modal-helper';
import submitType from '@/constants/submit-type';
+import showIssLoadingModal from '@/helpers/loading-modal-helper';
export default {
name: 'payment-return',
@@ -46,18 +46,18 @@ export default {
async mounted() {
showIssLoadingModal(true);
const payInAdvanceError = getQueryStringParameter(queryStrings.ERROR);
- const { payInAdvanceType } = useMainStore().order.payment;
+ const { paymentMethod } = useMainStore().order.payment;
if (payInAdvanceError) {
console.error(`Error during payment: ${payInAdvanceError}`);
const paymentPageNavScenario =
- payInAdvanceType === paymentMethods.CREDIT_CARD || payInAdvanceType === paymentMethods.AFTERPAY;
+ paymentMethod === paymentMethods.CREDIT_CARD || paymentMethod === paymentMethods.AFTERPAY;
if (paymentPageNavScenario) {
this.$router.navigate(
this.navigationScenarios.PAY_IN_ADVANCE_CREDIT_CARD_ERROR,
this.$route,
{
- [queryStrings.DISPLAY_PAY_IN_ADVANCE_ALERT]: payInAdvanceType
+ [queryStrings.DISPLAY_PAY_IN_ADVANCE_ALERT]: paymentMethod
}
);
} else {
@@ -70,16 +70,17 @@ export default {
);
}
} else {
- switch (payInAdvanceType) {
+ switch (paymentMethod) {
case paymentMethods.CREDIT_CARD:
case paymentMethods.AFTERPAY:
+ case paymentMethods.APPLEPAY:
await this.processCreditCardResponse();
break;
case paymentMethods.PAYPAL:
await this.processPaypalResponse();
break;
default:
- console.log(`Unknown pay in advance type: ${payInAdvanceType}`);
+ console.log(`Unknown payment method: ${paymentMethod}`);
this.$router.navigate(
this.navigationScenarios.PAY_IN_ADVANCE_ERROR,
this.$route,
@@ -129,11 +130,9 @@ export default {
} catch (error) {
console.error(`error: response from submit work order:${error.message}`);
this.navigateOnPayInAdvanceError();
- showIssLoadingModal(false);
return;
}
- showIssLoadingModal(false);
this.$router.navigate(
this.navigationScenarios.PAY_IN_ADVANCE_SUCCESS,
this.$route
diff --git a/src/layouts/policy-holder-details/policy-holder-details.vue b/src/layouts/policy-holder-details/policy-holder-details.vue
index 2758f64f..165fb775 100644
--- a/src/layouts/policy-holder-details/policy-holder-details.vue
+++ b/src/layouts/policy-holder-details/policy-holder-details.vue
@@ -19,7 +19,7 @@
id="address-questions-wrapper"
ref="addressQuestions"
v-model="customerQuestions.addressQuestions"
- includeStreetAddress2="true" />
+ :includeStreetAddress2="true" />
{
// Act
wrapper.vm.mainStore.applicationUser.pageData[issPageValues.BAILOUT_PAGE] = {
'bailout-page': {
- bailoutCode: bailoutCode.VehicleLookupError
+ bailoutCode: bailoutCode.VehicleVinLookupError
}
};
await wrapper.vm.forwardButtonAction();
// Assert
// eslint-disable-next-line max-len
- expect(wrapper.vm.mainStore.setBailout).toHaveBeenCalledWith(bailoutMessage.vehicleLookupError(vin, lookupReturnValue.data));
+ expect(wrapper.vm.mainStore.setBailout).toHaveBeenCalledWith(bailoutMessage.vehicleVinLookupError(vin, lookupReturnValue.data));
expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
undefined,
diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue
index 5251385e..65cc7ea6 100644
--- a/src/layouts/policy-vehicles/policy-vehicles.vue
+++ b/src/layouts/policy-vehicles/policy-vehicles.vue
@@ -85,7 +85,6 @@ export default {
return {
policyVehicles,
selectedVehicleVin: '',
- selectedPolicyVehicle: null,
displayGeneric: true,
policyVinFound: true,
rules: {
@@ -112,6 +111,13 @@ export default {
}) ?? [];
return mappedData;
},
+ selectedPolicyVehicle() {
+ if (this.selectedVehicleVin !== vehicleSelectionOptions.VEHICLE_NOT_LISTED) {
+ return this.policyVehicles.find((p) => p.vin === this.selectedVehicleVin);
+ }
+
+ return null;
+ },
noCoverageForSelectedVehicle() {
return noCoverageForSelectedVehicle(this.selectedPolicyVehicle);
},
@@ -135,7 +141,6 @@ export default {
// clear previously selected vehicle and image
this.mainStore.resetVehicleState();
this.displayGeneric = true;
- this.selectedPolicyVehicle = null;
} else {
// get vehicle details from selected VIN
const vehicle = await this.lookupVehicleByVin(value);
@@ -144,13 +149,11 @@ export default {
if (vehicle?.error === true) {
this.mainStore.resetVehicleState();
this.displayGeneric = true;
- this.selectedPolicyVehicle = null;
return;
}
if (vehicle) {
// save selected vehicle to the store
this.displayGeneric = false;
- this.selectedPolicyVehicle = this.policyVehicles.find((p) => p.vin === value);
useMainStore().updateVehicle({
...vehicle.data,
policyVehicleId: this.selectedPolicyVehicle?.id,
@@ -197,7 +200,7 @@ export default {
return this.navigateForward();
}
- this.mainStore.setBailout(bailoutMessage.vehicleLookupError(
+ this.mainStore.setBailout(bailoutMessage.vehicleVinLookupError(
vehicle.vin,
vehicleLookupResponse.data
));
diff --git a/src/layouts/provider-preference/provider-preference.vue b/src/layouts/provider-preference/provider-preference.vue
index c6eb6986..f00fd2a9 100644
--- a/src/layouts/provider-preference/provider-preference.vue
+++ b/src/layouts/provider-preference/provider-preference.vue
@@ -16,7 +16,7 @@ ref="theForm"
+ class="mb-0 mt-4 text-center" />
diff --git a/src/layouts/provider-preference/shop-preference-modal/shop-preference-modal.vue b/src/layouts/provider-preference/shop-preference-modal/shop-preference-modal.vue
index 96b239c5..882c7fb4 100644
--- a/src/layouts/provider-preference/shop-preference-modal/shop-preference-modal.vue
+++ b/src/layouts/provider-preference/shop-preference-modal/shop-preference-modal.vue
@@ -2,15 +2,16 @@
{{ ModalHeadline }}
-
-
+
+
+ @updated-contains-military-base="setContainsMilitaryBase"
+ @updated-mobile-ctu="setCtuForMobile" />
{
// Assert
expect(mainButton.exists()).toBeTruthy();
expect(mainButton.props().isPrimary).toBe(true);
- expect(mainButton.props().loaderColor).toBe('white');
expect(mainButton.classes()).toContain('w-100');
expect(mainButton.classes()).toContain('mb-5');
});
diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue
index 08f43bec..eded8794 100644
--- a/src/layouts/tpa-submit/tpa-submit.vue
+++ b/src/layouts/tpa-submit/tpa-submit.vue
@@ -41,7 +41,6 @@
ref="buttonMainOne"
isPrimary
:buttonText="forwardButtonText"
- loaderColor="white"
class="w-100 mb-5"
@clickEvent="forwardButtonAction" />
diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue
index b2394b82..a86fe4ca 100644
--- a/src/layouts/vehicle-damage/vehicle-damage.vue
+++ b/src/layouts/vehicle-damage/vehicle-damage.vue
@@ -415,7 +415,7 @@ export default {
if (this.isWindshieldRepair) {
const results = await Promise.allSettled([useMainStore().getSupportingItems(), useMainStore().getRecalParts()]);
- const supportingItems = results[0];
+ const supportingItems = results[0].value;
useMainStore().updateSupportingItems(supportingItems.data);
} else {
useMainStore().updateSupportingItems([]);
diff --git a/src/layouts/vehicle-selection/vehicle-selection.vue b/src/layouts/vehicle-selection/vehicle-selection.vue
index bbb4607e..59b96b38 100644
--- a/src/layouts/vehicle-selection/vehicle-selection.vue
+++ b/src/layouts/vehicle-selection/vehicle-selection.vue
@@ -88,6 +88,7 @@ import settleAllPromises from '@/helpers/layout-helper';
import { Form, defineRule } from 'vee-validate';
import { required } from '@/helpers/validation-rules';
import errorMessages from '@/constants/error-messages';
+import bailoutMessage from '@/constants/bailoutMessage';
// define validation rules
defineRule('year-required', required(errorMessages.YEAR_REQUIRED));
@@ -207,19 +208,62 @@ export default {
this.navigationScenarios.CLICKED_FORWARD,
this.$route
);
+ },
+ (error) => {
+ this.mainStore.setBailout(bailoutMessage.vehicleYMMSLookupError(this.mainStore.vehicle.year, this.mainStore.vehicle.make, this.mainStore.vehicle.model, this.mainStore.vehicle.style, error));
+ this.$router.navigate(
+ this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
+ this.$route
+ );
});
},
async updateYearValues() {
- return useMainStore().getVehicleYears();
+ return this.mainStore.getVehicleYears().then((response) => {
+ return response;
+ },
+ (error) => {
+ this.mainStore.setBailout(bailoutMessage.vehicleYMMSLookupError(null, null, null, null, error));
+ this.$router.navigate(
+ this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
+ this.$route
+ );
+ });
},
async updateMakeValues() {
- return this.mainStore.getVehicleMakes();
+ return this.mainStore.getVehicleMakes().then((response) => {
+ return response;
+ },
+ (error) => {
+ this.mainStore.setBailout(bailoutMessage.vehicleYMMSLookupError(this.mainStore.vehicle.year, null, null, null, error));
+ this.$router.navigate(
+ this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
+ this.$route
+ );
+ });
},
async updateModelValues() {
- return this.mainStore.getVehicleModels();
+ return this.mainStore.getVehicleModels().then((response) => {
+ return response;
+ },
+ (error) => {
+ this.mainStore.setBailout(bailoutMessage.vehicleYMMSLookupError(this.mainStore.vehicle.year, this.mainStore.vehicle.make, null, null, error));
+ this.$router.navigate(
+ this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
+ this.$route
+ );
+ });
},
async updateStyleValues() {
- return this.mainStore.getVehicleStyles();
+ return this.mainStore.getVehicleStyles().then((response) => {
+ return response;
+ },
+ (error) => {
+ this.mainStore.setBailout(bailoutMessage.vehicleYMMSLookupError(this.mainStore.vehicle.year, this.mainStore.vehicle.make, this.mainStore.vehicle.model, null, error));
+ this.$router.navigate(
+ this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
+ this.$route
+ );
+ });
}
}
};
diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue
index f469953d..9db38f8c 100644
--- a/src/layouts/vin-lookup/vin-lookup.vue
+++ b/src/layouts/vin-lookup/vin-lookup.vue
@@ -275,7 +275,6 @@ export default {
if (partsOrQuestionsResponse.error) {
this.mainStore.setBailout(bailoutMessage.PartsServiceError(partsOrQuestionsResponse.error.data));
window.console.error('Error on retrieving PartsOrQuestions');
- this.$refs.siteFooter.removeLoader();
this.hasBailedOut = true;
this.$router.navigate(
this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue
index 139bf4b1..6055a872 100644
--- a/src/layouts/welcome-page/welcome-page.vue
+++ b/src/layouts/welcome-page/welcome-page.vue
@@ -471,6 +471,7 @@ export default {
},
startNewReferral() {
this.mainStore.issConfig.enableContinueFromCookie = false;
+ // Setting this to true so we skip dupe check since the user already decided not to load the previous referral
this.mainStore.order.loadedFromCookie = true;
this.answeredContinueModal = true;
this.$refs.continueModal.closeModal();
diff --git a/src/router/index.js b/src/router/index.js
index 1b8deda3..c0cb576b 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -153,6 +153,7 @@ router.beforeEach(async (to, from) => {
// especially when navigating with browser buttons
const newUrl = `${window.top.location.origin}${to.href}`;
window.top.location.href = newUrl;
+ return false;
}
const store = useMainStore();
@@ -421,14 +422,14 @@ async function runExperiments(nextPage) {
if (!store.applicationUser.triggeredSiteEntry) {
await store.runExperimentsForTrigger({
- userId: getDeviceIdValue(),
+ deviceId: getDeviceIdValue(),
triggerEvent: experimentTriggers.SITE_ENTRY,
triggerValue: applicationConfig.SITE_ENTRY_TRIGGER_VALUE
});
}
await store.runExperimentsForTrigger({
- userId: getDeviceIdValue(),
+ deviceId: getDeviceIdValue(),
triggerEvent: experimentTriggers.PAGE_ENTRY,
triggerValue: nextPage
});
diff --git a/src/store/index.js b/src/store/index.js
index d0542ae7..84f40697 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,39 +1,40 @@
/* eslint-disable no-use-before-define */
/* eslint-disable max-len */
import { defineStore } from 'pinia';
+import applicationConfig from '@/constants/application-config';
+import bailoutCode from '@/constants/bailoutCode';
+import bailoutMessage from '@/constants/bailoutMessage';
+import coverageStatuses from '@/constants/coverage-statuses';
+import coverageType from '@/constants/coverage-type';
+import damageLocationsSelected from '@/constants/damage-locations-selected';
import { endpoints } from '@/constants/endpoints';
-// eslint-disable-next-line import/no-cycle
-import { getDateForSavedSessionTimeout } from '@/helpers/session-helper';
+import { experimentSettings, experimentTriggers, experimentUniverses } from '@/constants/experiments';
+import partNumberStrings from '@/constants/part-number-strings';
+import partTypeStrings from '@/constants/part-type-strings';
+import { paymentMethods } from '@/constants/payment-method-constants';
+import { AppointmentTypeStrings } from '@/constants/schedule-constants';
+import webStorageConstants from '@/constants/web-storage-constants';
// eslint-disable-next-line import/no-cycle
import globalMethods from '@/global-methods';
-import { experimentSettings, experimentTriggers, experimentUniverses } from '@/constants/experiments';
-import applicationConfig from '@/constants/application-config';
-import issPageValues from '@/router/router-constants/issPage-values';
-import damageLocationsSelected from '@/constants/damage-locations-selected';
-import coverageStatuses from '@/constants/coverage-statuses';
-import { AppointmentTypeStrings } from '@/constants/schedule-constants';
+// eslint-disable-next-line import/no-cycle
+import { getSessionKeyValue, getUserIdValue, deleteISSCookie, getDeviceIdValue } from '@/helpers/cookie-helper';
import { convertDateStringToDate, getDateDifferenceInDays, militaryToTwelveHourTime } from '@/helpers/date-helper';
-import { paymentMethods } from '@/constants/payment-method-constants';
-import webStorageConstants from '@/constants/web-storage-constants';
+import { getExperimentSettingValue, getFeatureTogglesPayloadObject } from '@/helpers/experiment-helper';
+import { findLineItemIndex, getLineItemsFlattened } from '@/helpers/line-items-helper';
import {
deductibleForSelectedVehicle, endorsementsForSelectedVehicle,
noCoverageForSelectedVehicle,
repairWaivedForSelectedVehicle
} from '@/helpers/policy-vehicle-helper';
-import partTypeStrings from '@/constants/part-type-strings';
-import bailoutMessage from '@/constants/bailoutMessage';
-import bailoutCode from '@/constants/bailoutCode';
-import partNumberStrings from '@/constants/part-number-strings';
-import { findLineItemIndex, getLineItemsFlattened } from '@/helpers/line-items-helper';
import {
- buildQueryStringParameterFromArrayOfComplexObjects,
- getLineItemQueryString,
+ buildURLSearchParams,
getPartNumbersListForQueryString,
getTaxLineItemQueryString
} from '@/helpers/querystring-helper';
-import coverageType from '@/constants/coverage-type';
-import { getExperimentSettingValue, getFeatureTogglesQueryString } from '@/helpers/experiment-helper';
-import { getSessionKeyValue, getUserIdValue, deleteISSCookie } from '@/helpers/cookie-helper';
+import { getTopLevelGlassPartsWithRecal } from '@/helpers/recal-helper';
+// eslint-disable-next-line import/no-cycle
+import { getDateForSavedSessionTimeout } from '@/helpers/session-helper';
+import issPageValues from '@/router/router-constants/issPage-values';
const storeId = 'main';
@@ -169,9 +170,8 @@ export const getDefaultState = () => ({
},
payment: {
parentAccountNumber: 0,
- isPayInAdvance: null,
nextGenSettledAmount: 0,
- payInAdvanceType: null,
+ paymentMethod: null,
paypalToken: null,
creditCardToken: {
subscriptionId: null,
@@ -214,11 +214,13 @@ export const getDefaultState = () => ({
eon: null,
workOrderId: null,
workOrderNumber: null,
+ settledTenderAmount: null,
+ lockToken: null,
customerPortalLoginToken: null,
originalDeductible: null,
currentDeductible: null,
carrierPhoneNumber: null,
- loadedFromCookie: null,
+ loadedFromCookie: false,
loadedFromDupeCheck: null,
loadedSessionClearedPreviousData: null,
availableVaps: null
@@ -303,6 +305,7 @@ export const useMainStore = defineStore({
isUnverified: (s) => s.order.insuranceCoverage.coverageStatus !== coverageStatuses.VERIFIED,
isVerified: (state) => state.order.insuranceCoverage.coverageStatus === coverageStatuses.VERIFIED,
isPendingClaimRegistration: (state) => state.order.insuranceCoverage.coverageStatus === coverageStatuses.PENDING,
+ isPayInAdvance: (state) => state.order.payment.paymentMethod != null && state.order.payment.paymentMethod !== paymentMethods.PAY_AT_TIME_OF_SERVICE,
providerNumber: (state) => state.order.serviceLocation.provider.providerNumber || state.order.serviceLocation.defaultProviderNumber,
hasOemEndorsement: (state) => state.order.policy.endorsements?.indexOf('OEM Approved') !== -1 ?? false,
eventBusItem: (state) => (eventCategory, eventSubCategory) => {
@@ -562,6 +565,11 @@ export const useMainStore = defineStore({
this.updateCoverageType(coverageType.Deductible);
const insured = responsePolicy.insureds?.[0];
+ // populate parent account number
+ if (response.data.accountNumber) {
+ order.parentAccountNumber = parseInt(response.data.accountNumber, 10);
+ }
+
// populate policy holder details from policy lookup
order.customer.address.streetAddress = insured?.address;
order.customer.address.city = insured?.city;
@@ -603,7 +611,7 @@ export const useMainStore = defineStore({
payload:
{
referralCorrelationId: this.order.referralCorrelationId,
- accountNumber: this.issConfig.parentAccountNumber?.toString() ?? '',
+ accountNumber: this.order.parentAccountNumber?.toString() ?? '',
policyData: this.order.policy.policyData,
isItac: isITAC,
insured: {
@@ -691,7 +699,7 @@ export const useMainStore = defineStore({
endpoint: endpoints.FinalDeductible.url,
payload: {
referralCorrelationId: this.order.referralCorrelationId,
- accountNumber: this.issConfig.parentAccountNumber?.toString() ?? '',
+ accountNumber: this.order.parentAccountNumber?.toString() ?? '',
endorsements: endorsementAnswersForPayload,
manualGlassNames: manualGlassNamesArray,
policyState: this.order.customer.address.state,
@@ -718,14 +726,18 @@ export const useMainStore = defineStore({
},
getDuplicateReferrals() {
+ const params = new URLSearchParams({
+ parentAccountNumber: this.order.parentAccountNumber,
+ customerPhoneNumber: this.order.contactInfo.servicePhone,
+ policyNumber: this.order.policy.policyNumber,
+ emailAddress: this.order.customer.emailAddress,
+ dateOfLoss: this.order.policy.dateOfLoss
+ });
+
return new Promise((resolve, reject) => {
globalMethods.callHttpClient({
method: endpoints.DuplicateSearch.method,
- endpoint: endpoints.DuplicateSearch.url(
- this.issConfig.parentAccountNumber,
- this.order.policy.policyNumber,
- this.order.policy.dateOfLoss
- )
+ endpoint: `${endpoints.DuplicateSearch.url}?${params.toString()}`
}).then((r) => {
this.applicationUser.duplicateOrders = r.data ?? [];
return resolve(r.data);
@@ -872,7 +884,7 @@ export const useMainStore = defineStore({
endDate,
applicationName: applicationConfig.APPLICATION_NAME,
billToAccountNumber: this.billToAccountNumber,
- parentAccountNumber: this.issConfig.parentAccountNumber, // this.payment.parentAccountNumber,
+ parentAccountNumber: order.parentAccountNumber, // this.payment.parentAccountNumber,
carId: vehicle.carId,
lineItems,
glassPieces,
@@ -936,7 +948,7 @@ export const useMainStore = defineStore({
shopAppointmentType,
applicationName: applicationConfig.APPLICATION_NAME,
billToAccountNumber: this.billToAccountNumber,
- parentAccountNumber: this.issConfig.parentAccountNumber, // this.payment.parentAccountNumber,
+ parentAccountNumber: this.order.parentAccountNumber, // this.payment.parentAccountNumber,
carId: vehicle.carId,
lineItems,
glassPieces,
@@ -998,23 +1010,41 @@ export const useMainStore = defineStore({
},
getProviders(serviceZipCode) {
+ const { carId } = this.order.vehicle;
const damageType = this.damage.isRepair ? 'Repair' : 'Replace';
+ const { parentAccountNumber } = this.order;
+ const partsWithRecal = getTopLevelGlassPartsWithRecal(this.order.lineItems.glassParts);
+ const windshieldPartWithRecal = partsWithRecal?.length > 0 ? partsWithRecal[0] : null;
+ const safeliteOnly = true;
const shopRadiusInMiles = 100;
+ let url = `${endpoints.GetProviders.url}/${serviceZipCode}/${damageType}/${shopRadiusInMiles}/${parentAccountNumber}/${safeliteOnly}/${carId}`;
+ if (windshieldPartWithRecal) {
+ url += `/${windshieldPartWithRecal.partNumber}`;
+ }
return globalMethods.callHttpClient({
method: endpoints.GetProviders.method,
- endpoint: `${endpoints.GetProviders.url}/${serviceZipCode}/${damageType}/${shopRadiusInMiles}`
+ endpoint: url
});
},
getTpaProviders(zipCode, radius) {
+ const { carId } = this.order.vehicle;
const damageType = this.damage.isRepair ? 'Repair' : 'Replace';
- const { parentAccountNumber } = this.issConfig;
+ const { parentAccountNumber } = this.order;
+ const partsWithRecal = getTopLevelGlassPartsWithRecal(this.order.lineItems.glassParts);
+ const windshieldPartWithRecal = partsWithRecal?.length > 0 ? partsWithRecal[0] : null;
const safeliteOnly = false;
+
+ let url = `${endpoints.GetProviders.url}/${zipCode}/${damageType}/${radius}/${parentAccountNumber}/${safeliteOnly}/${carId}`;
+ if (windshieldPartWithRecal) {
+ url += `/${windshieldPartWithRecal.partNumber}`;
+ }
+
return new Promise((resolve, reject) => {
globalMethods.callHttpClient({
method: endpoints.GetProviders.method,
- endpoint: `${endpoints.GetProviders.url}/${zipCode}/${damageType}/${radius}/${parentAccountNumber}/${safeliteOnly}`
+ endpoint: url
}).then((response) => resolve(response), (error) => reject(error));
});
},
@@ -1022,7 +1052,7 @@ export const useMainStore = defineStore({
return new Promise((resolve, reject) => {
globalMethods.callHttpClient({
method: endpoints.GetAccountInfo.method,
- endpoint: endpoints.GetAccountInfo.url + this.issConfig.parentAccountNumber
+ endpoint: endpoints.GetAccountInfo.url + this.order.parentAccountNumber
}).then((response) => {
this.order.carrierPhoneNumber = response.data.phoneNumber;
return resolve(response.data);
@@ -1135,7 +1165,7 @@ export const useMainStore = defineStore({
ServerData: this.order.lineItems.serverData,
Customer: {
PhoneNumber: contactInfo.servicePhone,
- State: policy.damageState,
+ State: policy.damageState || this.order.customer.address.state,
ZipCode: policy.policyZipCode
},
Account: {
@@ -1218,14 +1248,15 @@ export const useMainStore = defineStore({
Year: vehicle.year,
EON: eon,
ZipCode: policy.policyZipCode,
- State: policy.damageState,
+ State: this.order.customer.address.state,
ReferralNumber: referralNumber,
ReferralDate: referralDate,
ReferralSequenceNumber: referralSequenceNumber,
ServiceZipCode: serviceLocation.zipCode,
IsReplacement: !this.isRepair,
ServerData: lineItems.serverData,
- LineItems: getLineItemsFlattened(availableLineItems)
+ LineItems: getLineItemsFlattened(availableLineItems),
+ FeatureToggles: getFeatureTogglesPayloadObject(this.experimentSettings)
};
const response = await globalMethods
@@ -1276,18 +1307,27 @@ export const useMainStore = defineStore({
},
getServiceabilityDetails({ serviceZipCode }) {
- const lineItems = getLineItemQueryString(this.order.lineItems.supportingItems, 'lineItems');
-
- const { vehicle } = this.order;
+ const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order;
const { carId } = vehicle;
- const { damage } = this.order;
const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace);
+ const lineItemParts = [...(lineItems.glassParts || []), ...(lineItems.supportingItems || [])].map((part) => ({
+ partNumber: part.partNumber,
+ recalibrationType: part.recalibrationType
+ }));
- const glassPieces = buildQueryStringParameterFromArrayOfComplexObjects(glassArray, 'glassPieces');
+ const params = buildURLSearchParams({
+ applicationName: applicationConfig.APPLICATION_NAME,
+ parentAccountNumber,
+ referralSequenceNumber,
+ zip: serviceZipCode,
+ carId,
+ glassPieces: glassArray,
+ lineItems: lineItemParts
+ });
return globalMethods.callHttpClient({
method: endpoints.GetServiceabilityDetails.method,
- endpoint: `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}${lineItems}&${glassPieces}`
+ endpoint: `${endpoints.GetServiceabilityDetails.url}?${params.toString()}`
});
},
lookupVehicleByVin(vin) {
@@ -1322,12 +1362,14 @@ export const useMainStore = defineStore({
this.order.referralCorrelationId = response.referralCorrelationId;
this.order.eon = response.eon;
this.order.workOrderNumber = response.workOrderNumber;
+ this.order.settledTenderAmount = response.settledTenderAmount;
+ this.order.lockToken = response.lockToken;
this.order.customerPortalLoginToken = response.customerPortalLoginToken;
this.applicationUser.savedSessionId = response.savedSessionId;
this.applicationUser.crmCustomerId = response.crmCustomerId.toString();
},
- saveSession({ submitAfterSave }) {
+ saveSession({ submitAfterSave, createWorkOrderNumberForPIA }) {
const { vehicle, damage, policy, customer, contactInfo, payment,
lineItems, serviceLocation, schedule, insuranceCoverage } = this.order;
@@ -1422,9 +1464,10 @@ export const useMainStore = defineStore({
claimNumber: insuranceCoverage.claimNumber
},
payment: {
- parentAccountNumber: this.issConfig.parentAccountNumber,
+ parentAccountNumber: this.order.parentAccountNumber ?? this.issConfig.parentAccountNumber,
+ billToAccountNumber: this.billToAccountNumber,
paypalToken: payment.paypalToken,
- paymentMethod: payment.payInAdvanceType,
+ paymentMethod: payment.paymentMethod === paymentMethods.PayNow ? null : payment.paymentMethod,
nextGenSettledAmount: payment.nextGenSettledAmount,
CCToken: payment.creditCardToken
},
@@ -1467,6 +1510,8 @@ export const useMainStore = defineStore({
referralSequenceNumber: this.order.referralSequenceNumber,
eon: this.order.eon,
submitToMainframe: !!this.order.referralNumber,
+ createWorkOrderNumberForPIA,
+ lockToken: this.order.lockToken,
loadedFromDupeCheck,
submitAfterSave: !!submitAfterSave
};
@@ -1510,14 +1555,14 @@ export const useMainStore = defineStore({
});
},
async loadSession(duplicate) {
- const { order, issConfig } = this;
+ const { order } = this;
const response = await globalMethods.callHttpClient({
method: endpoints.LoadSession.method,
endpoint: endpoints.LoadSession.url,
payload: {
referralNumber: duplicate.referralNumber,
referralDate: duplicate.responseDate,
- parentAccountNumber: issConfig.parentAccountNumber,
+ parentAccountNumber: order.parentAccountNumber,
referralCorrelationId: duplicate.correlationId
}
});
@@ -1836,7 +1881,7 @@ export const useMainStore = defineStore({
feeData.forEach((fee) => {
if (fee.partNumber === partTypeStrings.MOBILE_FEE) {
this.updateMobileFee(fee);
- } else if (fee.partNumber === partTypeStrings.RECYCLE_FEE) {
+ } else if (fee.partNumber === partNumberStrings.RECYCLE_FEE) {
this.updateRecycleFee(fee);
} else {
this.addPartNumberFeeItem(fee, fee.partNumber);
@@ -1981,6 +2026,8 @@ export const useMainStore = defineStore({
this.order.referralSequenceNumber = null;
this.order.workOrderId = null;
this.order.workOrderNumber = null;
+ this.order.settledTenderAmount = null;
+ this.order.lockToken = null;
this.order.eon = null;
this.order.originalDeductible = null;
this.order.currentDeductible = null;
@@ -1989,6 +2036,7 @@ export const useMainStore = defineStore({
this.order.availableVaps = null;
this.order.carrierPhoneNumber = null;
this.order.customerPortalLoginToken = null;
+ this.order.loadedFromCookie = false;
},
resetPolicy() {
@@ -2006,6 +2054,25 @@ export const useMainStore = defineStore({
this.order.policy.deductible.replace = null;
},
+ resetPayment() {
+ this.order.payment.parentAccountNumber = 0;
+ this.order.payment.nextGenSettledAmount = 0;
+ this.order.payment.paymentMethod = null;
+ this.order.payment.paypalToken = null;
+ this.order.payment.creditCardToken.subscriptionId = null;
+ this.order.payment.creditCardToken.expMonth = null;
+ this.order.payment.creditCardToken.expYear = null;
+ this.order.payment.creditCardToken.cardType = null;
+ this.order.payment.creditCardToken.billToPostalCode = null;
+ this.order.payment.creditCardToken.billToFirstName = null;
+ this.order.payment.creditCardToken.billToLastName = null;
+ this.order.payment.creditCardToken.referenceNumber = null;
+ this.order.payment.creditCardToken.authCode = null;
+ this.order.payment.creditCardToken.transactionId = null;
+ this.order.payment.creditCardToken.transReferenceNumber = null;
+ this.order.payment.creditCardToken.lastFour = null;
+ },
+
resetCustomer() {
this.order.customer.emailAddress = null;
this.order.customer.firstName = null;
@@ -2386,6 +2453,7 @@ export const useMainStore = defineStore({
payload: {
experimentForLogging: {
userId: getUserIdValue(),
+ deviceId: getDeviceIdValue(),
experimentUniverseId: experiment.universeId,
experimentUniverseName: experiment.universeName,
experimentTestId: experiment.testId,
@@ -2525,14 +2593,14 @@ export const useMainStore = defineStore({
});
},
- async runExperimentsForTrigger({ userId, triggerEvent, triggerValue }) {
+ async runExperimentsForTrigger({ deviceId, triggerEvent, triggerValue }) {
if (triggerEvent === experimentTriggers.SITE_ENTRY) {
this.updateTriggeredSiteEntry(true);
}
const payload = {
applicationName: applicationConfig.APPLICATION_NAME,
- userId,
+ deviceId,
triggerEvent,
triggerValue,
experimentOrder: this.experimentOrder
@@ -2566,11 +2634,29 @@ export const useMainStore = defineStore({
}
},
+ async validateMobileZip({ zip }) {
+ const damageType = this.order.damage.isRepair ? 'Repair' : 'Replace';
+ try {
+ const response = await globalMethods.callHttpClient({
+ method: endpoints.ValidateZip.method,
+ endpoint: endpoints.ValidateMobileZip.url(zip, damageType)
+ });
+ const zipInfo = response.data;
+ if (zipInfo?.isValid === true) {
+ return Promise.resolve(zipInfo);
+ }
+
+ return Promise.reject(new Error('Invalid Zip Info'));
+ } catch (e) {
+ return Promise.reject(e);
+ }
+ },
+
async getBillToInfo() {
const { order, issConfig } = this;
try {
const params = new URLSearchParams({
- parentAccountNumber: issConfig.parentAccountNumber.toString(),
+ parentAccountNumber: order.parentAccountNumber.toString(),
providerNumber: this.providerNumber,
typeOfClaim: 'GLASS ONLY',
lineOfBusiness: 'PERSONAL',
@@ -2743,12 +2829,14 @@ export const useMainStore = defineStore({
this.order.serviceLocation.appointmentType = null;
this.order.serviceLocation.IsSafeliteProvider = null;
this.resetServiceLocationProvider();
+ this.resetServiceLocationMobileAddress();
},
resetPageFields() {
this.resetOrder();
this.resetCustomer();
this.resetPolicy();
+ this.resetPayment();
this.resetContactInfo();
this.resetVehicleState();
this.resetDamageState();
@@ -2760,9 +2848,7 @@ export const useMainStore = defineStore({
this.resetSubmittedOrder();
},
savePaymentMethodChoice(paymentMethod) {
- const isPayInAdvance = paymentMethod !== paymentMethods.PAY_AT_TIME_OF_SERVICE;
- this.order.payment.isPayInAdvance = isPayInAdvance;
- this.order.payment.payInAdvanceType = isPayInAdvance ? paymentMethod : null;
+ this.order.payment.paymentMethod = paymentMethod;
},
getPaymentSignature() {
@@ -2791,6 +2877,7 @@ export const useMainStore = defineStore({
submittedOrder.isUnverified = this.isUnverified;
submittedOrder.isVerified = this.isVerified;
submittedOrder.submitType = submitType;
+ submittedOrder.payment.isPayInAdvance = this.isPayInAdvance;
// set to local storage
window.sessionStorage.setItem(webStorageConstants.SUBMITTED_ORDER, JSON.stringify(submittedOrder));
diff --git a/src/store/store.spec.js b/src/store/store.spec.js
index c09a877c..c53fa5ac 100644
--- a/src/store/store.spec.js
+++ b/src/store/store.spec.js
@@ -844,7 +844,7 @@ describe('Store', () => {
it('calls api with expected payment', async () => {
// Arrange
const parentAccountNumber = getRandomString(6, 6);
- store.issConfig.parentAccountNumber = parentAccountNumber;
+ store.order.parentAccountNumber = parentAccountNumber;
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({}));
// Act
@@ -1740,7 +1740,7 @@ describe('Store', () => {
const policyData = getRandomString(100, 200);
store.order.referralCorrelationId = referralCorrelationId;
- store.issConfig.parentAccountNumber = parentAccountNumber;
+ store.order.parentAccountNumber = parentAccountNumber;
store.order.currentDeductible = currentDeductible;
store.order.originalDeductible = originalDeductible;
store.order.policy.status = status;
@@ -1837,7 +1837,7 @@ describe('Store', () => {
const policyData = getRandomString(100, 200);
store.order.referralCorrelationId = referralCorrelationId;
- store.issConfig.parentAccountNumber = parentAccountNumber;
+ store.order.parentAccountNumber = parentAccountNumber;
store.order.currentDeductible = currentDeductible;
store.order.originalDeductible = originalDeductible;
store.order.policy.status = status;
@@ -1937,9 +1937,11 @@ describe('Store', () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({}));
+ const carId = getRandomString(10, 14);
const parentAccountNumber = getRandomString(6, 6);
- store.issConfig.parentAccountNumber = parentAccountNumber;
+ store.order.parentAccountNumber = parentAccountNumber;
store.order.damage.isRepair = isRepair;
+ store.order.vehicle.carId = carId;
const zipCode = getRandomString(6, 6);
const radius = getRandomInt(5, 100);
const expectedEndpoint = [
@@ -1948,7 +1950,8 @@ describe('Store', () => {
damageType,
radius,
parentAccountNumber,
- 'false'
+ 'false',
+ carId
].join('/');
// Act
@@ -2048,28 +2051,20 @@ describe('Store', () => {
});
});
- describe('savePaymentMethodChoice method', () => {
- it('isPayInAdvance saved as false when choice is to pay at time of servce', () => {
+ describe.each([
+ [paymentMethods.CREDIT_CARD],
+ [paymentMethods.AFTERPAY],
+ [paymentMethods.APPLEPAY],
+ [paymentMethods.PAYPAL]
+ ])('savePaymentMethodChoice method', (expected) => {
+ test(`sets paymentMethod to ${getEnumName(paymentMethods, expected)} when value is ${getEnumName(paymentMethods, expected)}`, () => {
// Arrange
- const paymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE;
// Act
- store.savePaymentMethodChoice(paymentMethod);
+ store.savePaymentMethodChoice(expected);
// Assert
- expect(store.order.payment.isPayInAdvance).toEqual(false);
- expect(store.order.payment.payInAdvanceType).toEqual(null);
- });
- it('isPayInAdvance saved as true when choice is other than to pay at time of servce', () => {
- // Arrange
- const paymentMethod = paymentMethods.CREDIT_CARD;
-
- // Act
- store.savePaymentMethodChoice(paymentMethod);
-
- // Assert
- expect(store.order.payment.isPayInAdvance).toEqual(true);
- expect(store.order.payment.payInAdvanceType).toEqual(paymentMethod);
+ expect(store.order.payment.paymentMethod).toBe(expected);
});
});
diff --git a/src/styles/client-customizations.scss b/src/styles/client-customizations.scss
index 39bc12d2..bf59ece8 100644
--- a/src/styles/client-customizations.scss
+++ b/src/styles/client-customizations.scss
@@ -1,50 +1,427 @@
-//Libery Mutual Overrides
-$limu-header-color: #FFD100;
-$limu-accent-fill: #E6F1F3;
-$limu-svg-fill-color: '%2309748B';
-$limu-accent-color: #09748B;
-$limu-link: #09748B;
-$limu-button-radius: 8px;
-$limu-button-text-color: #181643;
-$limu-button-color: #A9E3E9;
+// Each Advanced client with custom colors/styles are defined in this file.
-.LibertyMutual {
- input[type="date"]::-webkit-calendar-picker-indicator {
- background-color: $limu-accent-fill !important;
- background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $limu-svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $limu-svg-fill-color + "'/%3E%3C/svg%3E") !important;
- }
-
- svg {
- fill: $limu-accent-color !important;
- }
-
- a {
- color: $limu-link !important;
+// Begin Liberty Mutual, SafeCo Custom Colors and Styles
+.LibertyMutual,
+.SafeCo {
+ //Define colors for namespaced classes
+ $header-background: #ffd100;
+ $accent-fill: #e6f1f3; // Calendar background
+ $accent-color: #09748b;
+ $link: #09748b;
+ $button-color: #a9e3e9;
+ $button-text-color: #181643;
+ $svg-fill-color: '%2309748b'; // Color of calendar icon. Place HEX code *after* %23
+
+ //Variables
+ --iss-loader-color: #{$button-text-color};
+
+ .site-header {
+ background-color: $header-background;
}
+ svg,
.modal-text {
- color: $limu-link !important;
+ fill: $accent-color;
}
- .btn {
- &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
- &.btn-primary {
- background: $limu-button-color !important;
- color: $limu-button-text-color !important;
- }
+ .container-fluid {
+ input[type="date"]::-webkit-calendar-picker-indicator {
+ background-color: $accent-fill;
+ background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $svg-fill-color + "'/%3E%3C/svg%3E");
+ }
- &:focus-visible {
- background: $limu-button-color !important;
- color: $limu-button-text-color !important;
- box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $limu-button-color !important;
- }
+ a,
+ a.new-window-link {
+ color: $link;
+ }
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
}
}
- .loader {
- &:after {
- background-color: $limu-button-text-color !important;
+ &.modal-open {
+ .modal {
+ .modal-body {
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ .modal-footer {
+ .btn:not(.navigation-link) {
+ background: $button-color;
+ color: $button-text-color;
+ }
+ }
}
}
-}
\ No newline at end of file
+}
+
+// End Liberty Mutual, SafeCo
+
+
+
+// Begin Amica Custom Colors and Styles
+.amica {
+ //Define colors for namespaced classes
+ $header-background: #fff;
+ $accent-fill: #e7f1f6; // Calendar background
+ $accent-color: #00a88f;
+ $link: #00a88f;
+ $button-color: #5508a5;
+ $button-text-color: #fff;
+ $svg-fill-color: '%231574a1'; // Color of calendar icon. Place HEX code *after* %23
+
+ //Variables
+ --iss-loader-color: #{$button-text-color};
+
+ .site-header {
+ background-color: $header-background;
+ }
+
+ svg,
+ .modal-text {
+ fill: $accent-color;
+ color: $accent-color;
+ }
+
+ .container-fluid {
+ input[type="date"]::-webkit-calendar-picker-indicator {
+ background-color: $accent-fill;
+ background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $svg-fill-color + "'/%3E%3C/svg%3E");
+ }
+
+ a,
+ a.new-window-link,
+ .btn-link {
+ color: $link;
+ }
+
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ &.modal-open {
+ .modal {
+ .modal-body {
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ .modal-footer {
+ .btn:not(.navigation-link) {
+ background: $button-color;
+ color: $button-text-color;
+ }
+ }
+ }
+ }
+}
+
+// End Amica
+
+
+
+// Begin Nationwide Custom Colors and Styles
+.Nationwide.Insurance {
+ //Define colors for namespaced classes
+ $header-background: #fff;
+ $accent-fill: #e6f1f3; // Calendar background
+ $accent-color: #1c57a5;
+ $link: #1c57a5;
+ $button-color: #1c57a5;
+ $button-text-color: #fff;
+ $svg-fill-color: '%231c57a5'; // Color of calendar icon. Place HEX code *after* %23
+
+ //Variables
+ --iss-loader-color: #{$button-text-color};
+
+ .site-header {
+ background-color: $header-background;
+ }
+
+ svg,
+ .modal-text {
+ fill: $accent-color;
+ }
+
+ .container-fluid {
+ input[type="date"]::-webkit-calendar-picker-indicator {
+ background-color: $accent-fill;
+ background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $svg-fill-color + "'/%3E%3C/svg%3E");
+ }
+
+ a,
+ a.new-window-link {
+ color: $link;
+ }
+
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ &.modal-open {
+ .modal {
+ .modal-body {
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ .modal-footer {
+ .btn:not(.navigation-link) {
+ background: $button-color;
+ color: $button-text-color;
+ }
+ }
+ }
+ }
+}
+
+// End Nationwide
+
+
+
+// Begin Country Financial Custom Colors and Styles
+.CountryFinancial {
+ //Define colors for namespaced classes
+ $header-background: #fff;
+ $accent-fill: #e6f1f3; // Calendar background
+ $accent-color: #007a3e;
+ $link: #007a3e;
+ $button-color: #007a3e;
+ $button-text-color: #fff;
+ $svg-fill-color: '%23007a3e'; // Color of calendar icon. Place HEX code *after* %23
+
+ //Variables
+ --iss-loader-color: #{$button-text-color};
+
+ .site-header {
+ background-color: $header-background;
+ }
+
+ svg,
+ .modal-text {
+ fill: $accent-color;
+ }
+
+ .container-fluid {
+ input[type="date"]::-webkit-calendar-picker-indicator {
+ background-color: $accent-fill;
+ background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $svg-fill-color + "'/%3E%3C/svg%3E");
+ }
+
+ a,
+ a.new-window-link {
+ color: $link;
+ }
+
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ &.modal-open {
+ .modal {
+ .modal-body {
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ .modal-footer {
+ .btn:not(.navigation-link) {
+ background: $button-color;
+ color: $button-text-color;
+ }
+ }
+ }
+ }
+}
+
+// End Country Financial
+
+
+
+// Begin Travelers Custom Colors and Styles
+.Travelers.Insurance {
+ //Define colors for namespaced classes
+ $header-background: #fff;
+ $accent-fill: #e6f1f3; // Calendar background
+ $accent-color: #007395;
+ $link: #007395;
+ $button-color: #e01719;
+ $button-text-color: #fff;
+ $svg-fill-color: '%23007395'; // Color of calendar icon. Place HEX code *after* %23
+
+ //Variables
+ --iss-loader-color: #{$button-text-color};
+
+ .site-header {
+ background-color: $header-background;
+ }
+
+ svg,
+ .modal-text {
+ fill: $accent-color;
+ }
+
+ .container-fluid {
+ input[type="date"]::-webkit-calendar-picker-indicator {
+ background-color: $accent-fill;
+ background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z' fill='" + $svg-fill-color + "'/%3E%3Cpath d='M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z' fill='" + $svg-fill-color + "'/%3E%3C/svg%3E");
+ }
+
+ a,
+ a.new-window-link {
+ color: $link;
+ }
+
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ &.modal-open {
+ .modal {
+ .modal-body {
+ .btn {
+ &.btn-override[aria-disabled="false"]:not(.form-test-invalid) {
+ &.btn-primary {
+ background: $button-color;
+ color: $button-text-color;
+ }
+
+ &:focus-visible {
+ background: $button-color;
+ color: $button-text-color;
+ box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $button-color;
+ }
+
+ }
+ }
+ }
+
+ .modal-footer {
+ .btn:not(.navigation-link) {
+ background: $button-color;
+ color: $button-text-color;
+ }
+ }
+ }
+ }
+}
+
+// End Travelers
\ No newline at end of file
diff --git a/src/styles/common-error-styles.scss b/src/styles/common-error-styles.scss
index 7df67aec..1fe0d071 100644
--- a/src/styles/common-error-styles.scss
+++ b/src/styles/common-error-styles.scss
@@ -217,6 +217,7 @@ html {
&.btn.btn-primary:hover,
&.btn.btn-primary:focus {
+ color: $gray-600;
background: $gray-200;
box-shadow: none;
}
diff --git a/src/styles/common-styles.scss b/src/styles/common-styles.scss
index d5475dd1..66c9534e 100644
--- a/src/styles/common-styles.scss
+++ b/src/styles/common-styles.scss
@@ -14,6 +14,7 @@ body {
.prevent-squish {
overflow-x: unset;
}
+
&.fade-on-route-transition {
height: 100vh;
display: flex;
@@ -90,6 +91,30 @@ body {
.pac-container {
z-index: 10000 !important;
}
+
+ div#app:has(~ div#onetrust-consent-sdk div#onetrust-banner-sdk[style]) {
+ padding-bottom: 3rem;
+
+ @include media-breakpoint-up(xl) {
+ padding-bottom: unset;
+ }
+
+ div.modal.show {
+ padding-bottom: 3rem;
+
+ @include media-breakpoint-up(xl) {
+ padding-bottom: unset;
+ }
+ }
+ }
+
+ div#app:has(~ div#onetrust-consent-sdk div#onetrust-banner-sdk[style*="display: none"]) {
+ padding-bottom: 0;
+
+ div.modal.show {
+ padding-bottom: 0;
+ }
+ }
}
.modal-open {
@@ -99,4 +124,8 @@ body {
height: auto;
}
}
+}
+
+:root {
+ --iss-loader-color: white;
}
\ No newline at end of file
diff --git a/src/ux-components/button-main/button-main.spec.js b/src/ux-components/button-main/button-main.spec.js
index 2caf56f1..0494405f 100644
--- a/src/ux-components/button-main/button-main.spec.js
+++ b/src/ux-components/button-main/button-main.spec.js
@@ -49,29 +49,6 @@ describe('buttonMain.vue', () => {
expect(button.attributes()['aria-disabled']).toEqual('true');
});
- it('Should return loader color', async () => {
- // Act
- const wrapper = shallowMount(
- buttonMain,
- setupMocks({
- propsData: {
- loaderColor: 'blue',
- loaderEnabled: true
- }
- })
- );
-
- // Assert
-
- wrapper.vm.clicked();
-
- await nextTick();
-
- const loader = wrapper.find('loader-stub');
-
- expect(loader.attributes('class')).toContain('blue');
- });
-
it('Should return loader position', async () => {
// Act
const wrapper = shallowMount(
diff --git a/src/ux-components/button-main/button-main.vue b/src/ux-components/button-main/button-main.vue
index fc04831a..69649e08 100644
--- a/src/ux-components/button-main/button-main.vue
+++ b/src/ux-components/button-main/button-main.vue
@@ -12,7 +12,7 @@
+ :class="[loaderPosition]" />
@@ -28,7 +28,6 @@ export default {
isPrimary: Boolean,
buttonText: String,
isDisabled: Boolean,
- loaderColor: String,
loaderPosition: String,
isFloat: Boolean,
suppressLoader: Boolean
@@ -69,8 +68,8 @@ export default {
@media (hover: hover) {
background: linear-gradient(270deg, $blue 0%, $blue-800 100%);
}
- // Mouse, touch, stylus focus
- &:focus-visible {
+ // Mouse, touch, stylus focus
+ &:focus-visible {
// Keyboard focus for accessibility
outline: none;
box-shadow: 0 0 0 3px, 0 0 0 5.5px $blue-700;
@@ -112,7 +111,7 @@ export default {
@include blue-gradient;
}
&:focus, // Mouse, touch, stylus focus
- &:focus-visible {
+ &:focus-visible {
// Keyboard focus for accessibility
outline: none;
box-shadow: 0 0 0 3px $white, 0 0 0 5.5px $blue-700;
diff --git a/src/ux-components/loader/loader.vue b/src/ux-components/loader/loader.vue
index a84730c5..6db8dbc5 100644
--- a/src/ux-components/loader/loader.vue
+++ b/src/ux-components/loader/loader.vue
@@ -112,8 +112,7 @@ export default {
}
//Spinner color
&:after {
- //Default spinner color (blue) if no other color is specified from the options below
- background-color: $blue;
+ background-color: var(--iss-loader-color);
}
&.red:after {
background-color: $red;
@@ -121,6 +120,9 @@ export default {
&.green:after {
background-color: $green;
}
+ &.blue:after {
+ background-color: $blue;
+ }
&.white:after {
background-color: $white;
}
diff --git a/vue.config.js b/vue.config.js
index b3ee3bb7..8d8fb3e0 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -3,7 +3,7 @@ process.env.VUE_APP_CONSUMER_CF_DISTRO = 'https://digitalapi.dev.safelite.io';
process.env.VUE_APP_CURRENT_ENVIRONMENT = 'Localhost';
process.env.VUE_APP_CUSTOMER_PORTAL_URL = 'https://myaccountdev.safelite.com/';
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = 'AIzaSyCuLhQcDdZTTb4JzpUFms1OCch2dk5lHF0';
-process.env.VUE_APP_SAFELITE_HOP = 'https://iss-hop-dev.safelite.net/fmgCheckoutEmbedded.aspx';
+process.env.VUE_APP_SAFELITE_HOP = 'https://iss-hop-dev.glassclaim.com/fmgCheckoutShared.aspx';
// GA & GTM
// NOTE: Using the old ISS site GTM Cotnainer ID for now, will create a new one soon.