diff --git a/src/constants/cart-item-types.js b/src/constants/cart-item-types.js index 858aa1e8e..7db2ac312 100644 --- a/src/constants/cart-item-types.js +++ b/src/constants/cart-item-types.js @@ -7,6 +7,7 @@ const cartItemTypes = { RECYCLE_FEE: "RECYCLE FEE", MOBILE_FEE: "MOBILE FEE", PROMOS: "PROMOS", + EARLY_BIRD: "EARLY BIRD", }; export { cartItemTypes }; diff --git a/src/constants/part-type-strings.js b/src/constants/part-type-strings.js index 50d92832c..fd1f4e781 100644 --- a/src/constants/part-type-strings.js +++ b/src/constants/part-type-strings.js @@ -5,6 +5,8 @@ const partTypeStrings = { RECALIBRATION: "RECALIBRATION", RECYCLE_FEE: "RECYCLE FEE", MOBILE_FEE: "MOBILE FEE", + REPAIR_FEE: "REPAIR FEE", + EARLY_BIRD: "EARLY BIRD", }; export { partTypeStrings }; diff --git a/src/fmg-components/cart/cart.spec.js b/src/fmg-components/cart/cart.spec.js index bfe1dbb55..ae84083e6 100644 --- a/src/fmg-components/cart/cart.spec.js +++ b/src/fmg-components/cart/cart.spec.js @@ -268,7 +268,7 @@ describe("cart.vue", () => { kitPrice: 0, laborAmount: 34.98, partNumber: "MOBILE FEE", - partType: "REPLACE FEE", + partType: "MOBILE FEE", salesTax: 2.62, sellingPrice: 0, }, diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index ce43971d8..a6290e46c 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -1,5 +1,5 @@ @@ -76,6 +108,7 @@ // Components import textLink from "@/ux-components/text-link/text-link"; import textBlock from "@/digital-components/text-block/text-block"; +import contentGroupModal from "@/fmg-components/content-group-modal/content-group-modal"; // Mixins import baseMixin from "@/mixins/base-mixin.js"; @@ -96,6 +129,8 @@ export default { damage: Object, servicePackageOptionsCmsName: String, availableLineItems: Object, + allowItemRemoval: Boolean, + recyclingModalCmsWidgetName: String, }, data() { return { @@ -109,6 +144,9 @@ export default { }; }, methods: { + openModal(modalName) { + this.$refs[modalName].openModal(); + }, toggleClass: function (event) { this.isActive = !this.isActive; }, @@ -216,6 +254,10 @@ export default { cartItems.push(cartItem); }); + if (this.premiumAppointmentDiscountCartItem) { + cartItems.push(this.premiumAppointmentDiscountCartItem); + } + return cartItems; }, }, @@ -294,7 +336,11 @@ export default { const nonpackageCartItems = []; this.cartItems.forEach((cartItem) => { - if (cartItem == this.recycleFeeCartItem || cartItem == this.mobileFeeCartItem) { + if ( + cartItem == this.recycleFeeCartItem || + cartItem == this.mobileFeeCartItem || + cartItem == this.premiumAppointmentDiscountCartItem + ) { return; } @@ -470,8 +516,8 @@ export default { lineItems: [], }; - //recycleFeeLineItem.cartItemType = cartItem.cartItemType; - //cartItem.lineItems.push(recycleFeeLineItem); + recycleFeeLineItem.cartItemType = cartItem.cartItemType; + cartItem.lineItems.push(recycleFeeLineItem); cartItem.subTotal += (recycleFeeLineItem.kitPrice ?? 0) + @@ -490,7 +536,7 @@ export default { let cartItem = null; const mobileFeeLineItem = this.supportingItems.find( - (lineItem) => lineItem.partNumber == partTypeStrings.MOBILE_FEE + (lineItem) => lineItem.partType == partTypeStrings.MOBILE_FEE ); if (mobileFeeLineItem) { @@ -520,10 +566,11 @@ export default { otherSupportingItemsCartItem() { let cartItem = null; - const otherSupportingItemsLineItems = this.supportingItems.filter( - (lineItem) => - lineItem.partNumber != partTypeStrings.MOBILE_FEE && - lineItem.partNumber != partTypeStrings.RECYCLE_FEE + let otherSupportingItemsLineItems = baseMixin.methods.filterOutFees( + this.supportingItems + ); + otherSupportingItemsLineItems = otherSupportingItemsLineItems.filter( + (lineItem) => lineItem.partType != partTypeStrings.EARLY_BIRD ); if (otherSupportingItemsLineItems.length > 0) { @@ -552,6 +599,40 @@ export default { return cartItem; }, + premiumAppointmentDiscountCartItemName() { + return "Early bird appointment"; // TODO: get from CMS + }, + premiumAppointmentDiscountCartItem() { + let cartItem = null; + + const premiumAppointmentDiscountLineItem = this.supportingItems.find( + (lineItem) => lineItem.partType == partTypeStrings.EARLY_BIRD + ); + + if (premiumAppointmentDiscountLineItem) { + cartItem = { + name: this.premiumAppointmentDiscountCartItemName, + category: cartItemCategories.SUPPORTING_ITEMS, + cartItemType: cartItemTypes.EARLY_BIRD, + isDisplayed: true, + subTotal: 0, + salesTax: 0, + lineItems: [], + }; + + premiumAppointmentDiscountLineItem.cartItemType = cartItem.cartItemType; + cartItem.lineItems.push(premiumAppointmentDiscountLineItem); + + cartItem.subTotal += + (premiumAppointmentDiscountLineItem.kitPrice ?? 0) + + (premiumAppointmentDiscountLineItem.laborAmount ?? 0) + + (premiumAppointmentDiscountLineItem.sellingPrice ?? 0); + + cartItem.salesTax += premiumAppointmentDiscountLineItem.salesTax ?? 0; + } + + return cartItem; + }, removeLinkText() { return this.getCmsContent("RemoveCartItemTextWidget", "Text"); }, @@ -599,6 +680,7 @@ export default { components: { textBlock, textLink, + contentGroupModal, }, }; @@ -609,6 +691,12 @@ export default { border-bottom: 1px solid $gray-500; color: $black; } + .modal-body { + h5 { + text-align: center; + border-bottom: none; + } + } .border-bottom { color: $gray; } @@ -643,7 +731,7 @@ export default { align-items: center; span { display: flex; - width: 33.33333%; + font-size: 0.875rem; &:nth-child(2) { justify-content: flex-end; } @@ -651,6 +739,9 @@ export default { justify-content: flex-end; } } + a { + font-size: 0.875rem; + } } .package-type, .service-type { @@ -673,6 +764,18 @@ export default { padding: 0; } } + // Custom order/wrap for nonpackaged Cart Items + .premium-appt-cart-item { + flex-wrap: wrap; + span { + display: flex; + justify-content: space-between; + } + a { + order: 3; + margin-right: 100%; + } + } } .vin-toggle { &:after { diff --git a/src/fmg-components/funnel-header/funnel-header.vue b/src/fmg-components/funnel-header/funnel-header.vue index b5775e649..d9c598bb4 100644 --- a/src/fmg-components/funnel-header/funnel-header.vue +++ b/src/fmg-components/funnel-header/funnel-header.vue @@ -5,14 +5,18 @@ Safelite logo - + + + +