Merge branch 'develop' of https://github.com/Safelite/DigitalConsumer.ISS into feature/digital/SSR-791

This commit is contained in:
Michaela Brydon 2023-11-30 16:01:52 -05:00
commit fe3f1fb86c
11 changed files with 116 additions and 35 deletions

View file

@ -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(' ', '-');

View file

@ -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) {

View file

@ -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>

View file

@ -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 {

View file

@ -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: [

View file

@ -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

View file

@ -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) {

View file

@ -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",

View file

@ -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);
} }
); );
}); });

View file

@ -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);

View file

@ -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"