Merge remote-tracking branch 'origin/release/2025.08.21' into feature/CASH-1182

This commit is contained in:
Johnny shultz 2025-08-04 08:54:23 -04:00
commit ad4c1000ed
7 changed files with 159 additions and 65 deletions

View file

@ -27,4 +27,3 @@ ADMIN_SERVICE_API_URL="https://issadminapi.dev.sagaws.net/iss-admin/api/v1/"
# API authentication (replace with actual value when running tests)
CCIS_API_AUTH="undefined"

View file

@ -131,24 +131,24 @@ export class BasePage {
}
async validateProgressBar(progressPercentage: string, timeout: number = 60000) {
// This section has been commented out until progress bar work is completed for parity.
await waitUntil(async () => {
let loaderElements = await this.page.locator('button .loader, .buy-loader, timeout, .modal-loader').all();
return !(await Promise.any(loaderElements.map(el => el.isVisible())).catch(() => false));
});
// await waitUntil(async () => {
// let loaderElements = await this.page.locator('button .loader, .buy-loader, timeout, .modal-loader').all();
// return !(await Promise.any(loaderElements.map(el => el.isVisible())).catch(() => false));
// });
// Take a screenshot of the page before validating the progress bar
await this.page.screenshot({ path: `test-results\\ortoni-data\\progress-bar-${Date.now()}.png`, fullPage: true });
// Wait until the progress bar element is attached and visible
// // Take a screenshot of the page before validating the progress bar
// await this.page.screenshot({ path: `test-results\\ortoni-data\\progress-bar-${Date.now()}.png`, fullPage: true });
// // Wait until the progress bar element is attached and visible
const actualProgressPercentage = await this.progressBar.evaluate(
async (element) => {
await new Promise(resolve => setTimeout(resolve, 200));
return element.style.width || "Not Found";
}
);
Soft.expect(actualProgressPercentage).toBe(progressPercentage);
console.log(`Progress Bar Percentage: Actual - ${actualProgressPercentage} vs Expected - ${progressPercentage}`);
// const actualProgressPercentage = await this.progressBar.evaluate(
// async (element) => {
// await new Promise(resolve => setTimeout(resolve, 200));
// return element.style.width || "Not Found";
// }
// );
// Soft.expect(actualProgressPercentage).toBe(progressPercentage);
// console.log(`Progress Bar Percentage: Actual - ${actualProgressPercentage} vs Expected - ${progressPercentage}`);
}
}

View file

@ -1470,19 +1470,8 @@ export default {
display: flex;
max-width: 100%;
flex-wrap: wrap;
gap: 0 0.5rem;
& > div {
flex: 0 0 calc(50% - 0.25rem);
}
}
:deep(.button-question.is-mobile-appointment) {
.button-inner-wrapper > div {
flex: 0 0 100%;
}
}
:deep(.button-question.is-drop-off-appointment) {
.button-inner-wrapper > div {
flex: 0 0 100%;
}
}

View file

@ -86,17 +86,19 @@
class="row your-shop-location"
v-if="appointmentType && appointmentType !== appointmentTypeStrings.MOBILE">
<div class="col-12 col-md-10 col-lg-8 col-xl-7">
<button-question
class="shop-question-button"
ref="buttonQuestion"
:answers="selectedShopAnswer"
:modelValue="selectedProvider?.providerNumber"
:isMultiSelect="false"
:readonly="true"
:questionText="questionText"
buttonTypeString="shopListButton"
:buttonTypeObject="shopListButton"
groupName="chooseShop" />
<div>
<shopLocation
v-if="
appointmentType && appointmentType !== appointmentTypeStrings.MOBILE
"
:selectedShop="selectedShopAnswer"
:selectedProviderNumberFromParent="selectedProvider?.providerNumber"
:shopProviderDataFromParent="shopProviderData"
:zipCodeFromParent="zipCode"
:isShopQuestionDisplayed="isShopQuestionDisplayed"
@shop-selected="onShopSelected"
@updated-serviceability="setServiceabilityDetails" />
</div>
<div>
<textBlock
v-if="mobileFeeApplies && isMobileSelected"
@ -105,14 +107,6 @@
typeStyle="caption"
class="ps-4 pe-4 mt-4" />
</div>
<shopQuestionPopup
v-if="isShopQuestionDisplayed"
:selectedProviderNumberFromParent="selectedProvider?.providerNumber"
:shopProviderDataFromParent="shopProviderData"
@shop-selected="onShopSelected"
@updated-serviceability="setServiceabilityDetails"
:zipCodeFromParent="zipCode"
cmsWidgetName="YourSafeliteShopWidget" />
<contentGroupModal ref="RecalModal" cmsWidgetName="RecalModal" />
</div>
@ -163,9 +157,8 @@ import alert from "@/ux-components/alert/alert";
import serviceZipModalQuestion from "@/layouts/service-location/service-zip-modal-question/service-zip-modal-question";
import appointmentTypeQuestion from "@/layouts/service-location/appointment-type-question/appointment-type-question";
import shopQuestion from "@/layouts/service-location/shop-question/shop-question";
import shopQuestionPopup from "@/layouts/service-location/shop-question/shop-question-popup";
import buttonQuestion from "@/digital-components/button-question/button-question.vue";
import shopListButton from "@/layouts/service-location/shop-question/shop-list-button/shop-list-button";
import shopLocation from "@/layouts/schedule/shop-location/shop-location";
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
import navbar from "@/fmg-components/nav-bar/nav-bar";
@ -774,21 +767,15 @@ export default {
const zipCode = this.selectedProvider.address.zipCode;
const distanceInMiles = provider ? Math.round(provider.distanceInMiles * 2) / 2 : 0;
return [
{
buttonLabel: `${city}`,
buttonLabelSubCopy: `${distanceInMiles} mi`,
buttonBodyCopy: `${streetAddress}, ${city}, ${state} ${zipCode}`,
additionalButtonData: this.additionalButtonData,
value: this.selectedProvider.providerNumber,
},
];
return {
city: `${city}`,
distance: `${distanceInMiles} mi`,
address1: `${streetAddress}`,
address2: `${city}, ${state} ${zipCode}`,
};
}
return [];
},
questionText() {
return this.getCmsContent("YourSafeliteShopWidget", "QuestionText");
},
appointmentTypeStrings() {
return AppointmentTypeStrings;
},
@ -1745,8 +1732,7 @@ export default {
serviceZipModalQuestion,
appointmentTypeQuestion,
contentGroupModal,
shopQuestionPopup,
buttonQuestion,
shopLocation,
},
};
</script>

View file

@ -0,0 +1,120 @@
<template>
<div id="shop-location">
<textBlock :customText="questionText" typeStyle="button-question" />
<div>
<div>
<label v-for="addressItem in addressDetails" :key="addressItem">
{{ addressItem }}
</label>
</div>
<div>
<label>{{ selectedShop.distance }}</label>
</div>
</div>
<shopQuestionPopup
v-if="isShopQuestionDisplayed"
:selectedProviderNumberFromParent="selectedProviderNumberFromParent"
:shopProviderDataFromParent="shopProviderDataFromParent"
:zipCodeFromParent="zipCodeFromParent"
@shop-selected="onShopSelected"
@updated-serviceability="setServiceabilityDetails"
cmsWidgetName="YourSafeliteShopWidget" />
</div>
</template>
<script>
import textBlock from "@/digital-components/text-block/text-block";
import shopQuestionPopup from "@/layouts/service-location/shop-question/shop-question-popup";
export default {
name: "shopLocation",
props: {
selectedShop: {
type: Object,
default: () => ({
city: null,
distance: null,
address1: null,
address2: null,
}),
},
isShopQuestionDisplayed: {
type: Boolean,
default: false,
},
selectedProviderNumberFromParent: {
type: String,
default: null,
},
shopProviderDataFromParent: {
type: Object,
default: () => ({}),
},
zipCodeFromParent: {
type: String,
default: null,
},
},
computed: {
questionText() {
return this.getCmsContent("YourSafeliteShopWidget", "QuestionText");
},
addressDetails() {
const { distance, ...addressDetails } = this.selectedShop;
return addressDetails;
},
},
components: {
textBlock,
shopQuestionPopup,
},
methods: {
onShopSelected(shopQuestionPopUpData) {
this.$emit("shop-selected", shopQuestionPopUpData);
},
setServiceabilityDetails(serviceabilityDetails) {
this.$emit("updated-serviceability", serviceabilityDetails);
},
},
};
</script>
<style lang="scss" scoped>
#shop-location {
& > div {
display: flex;
justify-content: space-between;
& > div {
display: flex;
flex-direction: column;
label {
font-size: 0.875rem;
}
}
}
& > div.shop-question {
width: 172px;
}
}
</style>
<style lang="scss">
#shop-location {
& > div.shop-question {
width: fit-content;
background-color: $blue;
border-radius: $border-radius-pill;
padding: 0.75rem 3rem;
a {
text-decoration: none;
color: $white;
font-weight: $font-weight-600;
line-height: 1.5rem;
}
}
}
</style>

View file

@ -90,7 +90,7 @@ export default {
position: relative;
background: $white;
transition: all 150ms linear;
border-radius: $border-radius-lg;
border-radius: $border-radius-pill;
border: 1px solid $gray-500;
width: 100%;
outline: none;

View file

@ -28,7 +28,7 @@
position: relative;
z-index: 5;
@include box-shadow-hover($blue-300);
border-radius: 0.5rem;
border-radius: $border-radius-pill;
}
}
}