Merge branch 'develop' of https://github.com/Safelite/DigitalConsumer.ISS into feature/digital/SSR-791
This commit is contained in:
commit
fe3f1fb86c
11 changed files with 116 additions and 35 deletions
|
|
@ -267,6 +267,11 @@ export default {
|
||||||
this.$options.components[this.buttonTypeString] = this.buttonTypeObject;
|
this.$options.components[this.buttonTypeString] = this.buttonTypeObject;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
this.resetField({
|
||||||
|
value: ''
|
||||||
|
});
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
formatString(str) {
|
formatString(str) {
|
||||||
return String(str).replaceAll(' ', '-');
|
return String(str).replaceAll(' ', '-');
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="dropdown-question"
|
class="dropdown-question"
|
||||||
:class="(errors && errors.length) || hasError ? 'has-error' : ''">
|
:class="(meta.touched && errors && errors.length) || hasError ? 'has-error' : ''">
|
||||||
<label
|
<label
|
||||||
:for="inputId"
|
:for="inputId"
|
||||||
:aria-label="questionText"
|
:aria-label="questionText"
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<div
|
<div
|
||||||
v-show="errorMessage && !isDisabled"
|
v-show="meta.touched && errorMessage && !isDisabled"
|
||||||
class="row mt-1 form-test-error">
|
class="row mt-1 form-test-error">
|
||||||
<span role="alert">{{ errorMessage }}</span>
|
<span role="alert">{{ errorMessage }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -82,6 +82,7 @@ export default {
|
||||||
const { errorMessage,
|
const { errorMessage,
|
||||||
handleBlur,
|
handleBlur,
|
||||||
handleChange,
|
handleChange,
|
||||||
|
setTouched,
|
||||||
meta, errors,
|
meta, errors,
|
||||||
setErrors } = useField(props.inputId, props.validationRules, fieldOptions);
|
setErrors } = useField(props.inputId, props.validationRules, fieldOptions);
|
||||||
|
|
||||||
|
|
@ -91,6 +92,7 @@ export default {
|
||||||
handleChange,
|
handleChange,
|
||||||
meta,
|
meta,
|
||||||
errors,
|
errors,
|
||||||
|
setTouched,
|
||||||
setErrors
|
setErrors
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
@ -130,7 +132,7 @@ export default {
|
||||||
watch: {
|
watch: {
|
||||||
isDisabled(newValue, oldValue) {
|
isDisabled(newValue, oldValue) {
|
||||||
if (newValue !== oldValue) {
|
if (newValue !== oldValue) {
|
||||||
this.setErrors([]);
|
this.setTouched(false, null);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
selectedOption(newValue) {
|
selectedOption(newValue) {
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
loaderColor="white"
|
loaderColor="white"
|
||||||
:buttonText="footerButtonText"
|
:buttonText="footerButtonText"
|
||||||
:class="(isButtonDisabled || isFooterButtonDisabled) && 'form-test-invalid'"
|
:class="(isButtonDisabled || isFooterButtonDisabled) && 'form-test-invalid'"
|
||||||
|
:isDisabled="(isButtonDisabled || isFooterButtonDisabled)"
|
||||||
@clickEvent="validateAndEmit" />
|
@clickEvent="validateAndEmit" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ export default {
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
:deep .subheader-primary {
|
:deep .subheader-primary {
|
||||||
margin-bottom: map-get($spacers, 3);
|
margin-bottom: map-get($spacers, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep .subheader-secondary {
|
:deep .subheader-secondary {
|
||||||
|
|
|
||||||
|
|
@ -140,13 +140,62 @@ describe('policy-vehicles.vue', () => {
|
||||||
|
|
||||||
test(
|
test(
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
'Selected VIN matches vehicle listed in system and policy vehicle has endorsements => update vehicle and navigate forward with CLICKED_FORWARD_WITH_ENDORSEMENTS scenario.',
|
'Selected VIN matches vehicle listed in system and policy vehicle has Educator endorsement => update vehicle and navigate forward with CLICKED_FORWARD_WITH_ENDORSEMENTS scenario.',
|
||||||
async () => {
|
async () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const { wrapper } = setupMocks({});
|
const { wrapper } = setupMocks({});
|
||||||
|
|
||||||
const vin = getRandomString(17, 17);
|
const vin = getRandomString(17, 17);
|
||||||
const endorsements = [getRandomString(10, 20)];
|
const endorsements = ['Educator'];
|
||||||
|
await wrapper.setData({
|
||||||
|
selectedVehicleVin: vin,
|
||||||
|
policyVehicles: [
|
||||||
|
{
|
||||||
|
vin,
|
||||||
|
endorsements
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
const year = getRandomInt(1998, 2023);
|
||||||
|
const lookupVehicleResponse = {
|
||||||
|
data: {
|
||||||
|
year
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const store = useMainStore();
|
||||||
|
store.lookupVehicleByVin.mockReturnValue(Promise.resolve(lookupVehicleResponse));
|
||||||
|
|
||||||
|
const expectedInput = {
|
||||||
|
year,
|
||||||
|
vin,
|
||||||
|
noCoverage: true,
|
||||||
|
deductible: 0,
|
||||||
|
repairWaived: false,
|
||||||
|
endorsements
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(store.updateVehicle).toHaveBeenCalledWith(expectedInput);
|
||||||
|
expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith(
|
||||||
|
navigationScenarios.CLICKED_FORWARD_WITH_ENDORSEMENTS,
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
test(
|
||||||
|
// eslint-disable-next-line max-len
|
||||||
|
'Selected VIN matches vehicle listed in system and policy vehicle has Parking Guard endorsement => update vehicle and navigate forward with CLICKED_FORWARD_WITH_ENDORSEMENTS scenario.',
|
||||||
|
async () => {
|
||||||
|
// Arrange
|
||||||
|
const { wrapper } = setupMocks({});
|
||||||
|
|
||||||
|
const vin = getRandomString(17, 17);
|
||||||
|
const endorsements = ['Parking Guard'];
|
||||||
await wrapper.setData({
|
await wrapper.setData({
|
||||||
selectedVehicleVin: vin,
|
selectedVehicleVin: vin,
|
||||||
policyVehicles: [
|
policyVehicles: [
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,9 @@ export default {
|
||||||
{},
|
{},
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
} else if (this.endorsementsForSelectedVehicle?.length > 0) {
|
} else if (this.endorsementsForSelectedVehicle?.length > 0
|
||||||
|
&& (this.endorsementsForSelectedVehicle?.includes(endorsementOptions.PARKING_GUARD)
|
||||||
|
|| this.endorsementsForSelectedVehicle?.includes(endorsementOptions.EDUCATOR))) {
|
||||||
this.$router.navigate(
|
this.$router.navigate(
|
||||||
this.navigationScenarios.CLICKED_FORWARD_WITH_ENDORSEMENTS,
|
this.navigationScenarios.CLICKED_FORWARD_WITH_ENDORSEMENTS,
|
||||||
this.$route
|
this.$route
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,6 @@ export default {
|
||||||
&& (store.order.damage.isRepair
|
&& (store.order.damage.isRepair
|
||||||
|| (store.order.lineItems?.glassParts != null
|
|| (store.order.lineItems?.glassParts != null
|
||||||
&& store.order.lineItems.glassParts.length > 0))
|
&& store.order.lineItems.glassParts.length > 0))
|
||||||
&& store.order.referralNumber?.length !== 6
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
vapsItemsSelectedAction(vapsItemsSelected) {
|
vapsItemsSelectedAction(vapsItemsSelected) {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,20 @@ Object {
|
||||||
"initialLoading": false,
|
"initialLoading": false,
|
||||||
"mapZipCode": "12663",
|
"mapZipCode": "12663",
|
||||||
"providers": Array [],
|
"providers": Array [],
|
||||||
|
"radiusFilterPairs": Array [
|
||||||
|
Object {
|
||||||
|
"filter": "25 miles",
|
||||||
|
"radius": 25,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"filter": "50 miles",
|
||||||
|
"radius": 50,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"filter": "100 miles",
|
||||||
|
"radius": 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
"reloadProviders": false,
|
"reloadProviders": false,
|
||||||
"rules": Object {
|
"rules": Object {
|
||||||
"filter": "option-required",
|
"filter": "option-required",
|
||||||
|
|
|
||||||
|
|
@ -1264,6 +1264,7 @@ describe('TPA search page', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.filter).toBe(expectedFilter);
|
expect(wrapper.vm.filter).toBe(expectedFilter);
|
||||||
expect(wrapper.vm.providers).toEqual(providers);
|
expect(wrapper.vm.providers).toEqual(providers);
|
||||||
|
expect(useMainStore().getTpaProviders).toBeCalledTimes(1);
|
||||||
});
|
});
|
||||||
test('when providers exist at 50 mile radius but not 25, filter is set to "50 miles" and providers set to expected', async () => {
|
test('when providers exist at 50 mile radius but not 25, filter is set to "50 miles" and providers set to expected', async () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
|
|
@ -1289,6 +1290,7 @@ describe('TPA search page', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.filter).toBe(expectedFilter);
|
expect(wrapper.vm.filter).toBe(expectedFilter);
|
||||||
expect(wrapper.vm.providers).toEqual(providers);
|
expect(wrapper.vm.providers).toEqual(providers);
|
||||||
|
expect(useMainStore().getTpaProviders).toBeCalledTimes(2);
|
||||||
});
|
});
|
||||||
test(
|
test(
|
||||||
'when providers exist at 100 mile radius but not 50 or 25, filter is set to "100 miles" and providers set to expected',
|
'when providers exist at 100 mile radius but not 50 or 25, filter is set to "100 miles" and providers set to expected',
|
||||||
|
|
@ -1316,6 +1318,7 @@ describe('TPA search page', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.filter).toBe(expectedFilter);
|
expect(wrapper.vm.filter).toBe(expectedFilter);
|
||||||
expect(wrapper.vm.providers).toEqual(providers);
|
expect(wrapper.vm.providers).toEqual(providers);
|
||||||
|
expect(useMainStore().getTpaProviders).toBeCalledTimes(3);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
test(
|
test(
|
||||||
|
|
@ -1342,6 +1345,7 @@ describe('TPA search page', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.filter).toBe(expectedFilter);
|
expect(wrapper.vm.filter).toBe(expectedFilter);
|
||||||
expect(wrapper.vm.providers).toEqual([]);
|
expect(wrapper.vm.providers).toEqual([]);
|
||||||
|
expect(useMainStore().getTpaProviders).toBeCalledTimes(3);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,21 @@ export default {
|
||||||
filter: globalRules.OPTION_REQUIRED, // TODO do we even need this?
|
filter: globalRules.OPTION_REQUIRED, // TODO do we even need this?
|
||||||
provider: globalRules.OPTION_REQUIRED
|
provider: globalRules.OPTION_REQUIRED
|
||||||
},
|
},
|
||||||
shopListButton: shallowRef(shopListButton)
|
shopListButton: shallowRef(shopListButton),
|
||||||
|
radiusFilterPairs: [
|
||||||
|
{
|
||||||
|
radius: 25,
|
||||||
|
filter: '25 miles'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
radius: 50,
|
||||||
|
filter: '50 miles'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
radius: 100,
|
||||||
|
filter: '100 miles'
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
@ -233,16 +247,8 @@ export default {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
radiusInMiles() {
|
radiusInMiles() {
|
||||||
switch (this.filter) {
|
const pair = this.radiusFilterPairs.find((p) => p.filter === this.filter);
|
||||||
case '25 miles':
|
return pair?.radius ?? 0;
|
||||||
return 25;
|
|
||||||
case '50 miles':
|
|
||||||
return 50;
|
|
||||||
case '100 miles':
|
|
||||||
return 100;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
noNetworkShopsAlertHeaderText() {
|
noNetworkShopsAlertHeaderText() {
|
||||||
return this.getCmsContent(
|
return this.getCmsContent(
|
||||||
|
|
@ -310,25 +316,24 @@ export default {
|
||||||
},
|
},
|
||||||
async setInitialFilterAndProviders() {
|
async setInitialFilterAndProviders() {
|
||||||
this.initialLoading = true;
|
this.initialLoading = true;
|
||||||
const radiusOptions = [25, 50, 100];
|
|
||||||
const { zipCode } = useMainStore().order.customer.address;
|
const { zipCode } = useMainStore().order.customer.address;
|
||||||
|
|
||||||
const tpaProvidersRadius25 = useMainStore().getTpaProviders(zipCode, radiusOptions[0]);
|
let pairIndex = 0;
|
||||||
const tpaProvidersRadius50 = useMainStore().getTpaProviders(zipCode, radiusOptions[1]);
|
let providers = [];
|
||||||
const tpaProvidersRadius100 = useMainStore().getTpaProviders(zipCode, radiusOptions[2]);
|
let filter = '';
|
||||||
|
while (providers.length === 0 && pairIndex < this.radiusFilterPairs.length) {
|
||||||
|
const pair = this.radiusFilterPairs[pairIndex];
|
||||||
|
const { radius } = pair;
|
||||||
|
filter = pair.filter;
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const result = await useMainStore().getTpaProviders(zipCode, radius);
|
||||||
|
providers = result?.data?.shopProviders ?? [];
|
||||||
|
|
||||||
let radius = '25 miles';
|
pairIndex += 1;
|
||||||
let providers = await tpaProvidersRadius25;
|
|
||||||
if ((providers?.data?.shopProviders ?? []).length === 0) {
|
|
||||||
radius = '50 miles';
|
|
||||||
providers = await tpaProvidersRadius50;
|
|
||||||
if ((providers?.data?.shopProviders ?? []).length === 0) {
|
|
||||||
radius = '100 miles';
|
|
||||||
providers = await tpaProvidersRadius100;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.filter = radius;
|
|
||||||
this.providers = providers?.data?.shopProviders ?? [];
|
this.filter = filter;
|
||||||
|
this.providers = providers;
|
||||||
},
|
},
|
||||||
async getProviderButtonData() {
|
async getProviderButtonData() {
|
||||||
const getTpaProvidersResult = await useMainStore().getTpaProviders(this.zipCode, this.radiusInMiles);
|
const getTpaProvidersResult = await useMainStore().getTpaProviders(this.zipCode, this.radiusInMiles);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
<vehicleBanner
|
<vehicleBanner
|
||||||
class="mt-2 mb-4"
|
class="mt-2 mb-4"
|
||||||
cmsWidgetName="VehicleBannerWidget"
|
cmsWidgetName="VehicleBannerWidget"
|
||||||
:displayGenericVehicleImage="carIdIsValid" />
|
:displayGenericVehicleImage="!carIdIsValid" />
|
||||||
<siteSubHeader cmsWidgetName="SiteSubHeaderWidget" />
|
<siteSubHeader cmsWidgetName="SiteSubHeaderWidget" />
|
||||||
<vinLookupAlerts
|
<vinLookupAlerts
|
||||||
class="mt-5"
|
class="mt-5"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue