PageSourceSearch

https://lectricebikes.com/cdn/shop/t/249/assets/seed-product-upsells.js?v=96043402135474941031771021640

js lectricebikes.com collected 2026-09-25 14:58:10 UTC 7,596 bytes, 2 lines download raw bytes

1class ProductUpsells extends HTMLElement{constructor(){super(),this._selectors={checkbox:"input.upsell-item-checkbox",bundle:"[js-upsell-bundle]",bundleLabel:"[js-upsell-bundle-title]",upsellRow:"[js-upsell-row]",selectBtn:"[js-select-upsell]"},this.checkboxes=this.querySelectorAll(this._selectors.checkbox),this.bundles=this.querySelectorAll(this._selectors.bundle),this.upsellRows=this.querySelectorAll(this._selectors.upsellRow),this.discountConfig={pickFreeMax:this.getAttribute("data-bundle-pick-max"),tieredMin:this.getAttribute("data-bundle-discount-min"),tieredDiscount:this.getAttribute("data-bundle-discount-amount")},this.events={change:"upsell:change"}}connectedCallback(){this.upsellRows.forEach(row=>{const checkbox=row.querySelector(this._selectors.checkbox),button=row.querySelector(this._selectors.selectBtn);!checkbox||!button||(checkbox.checked&&this._handleClick(row,button,checkbox),button.addEventListener("click",evt=>{this._handleClick(row,button,checkbox,!0)}))})}_handleClick(row,button,checkbox,isClicked=!1){if(isClicked){if(button.getAttribute("disabled"))return;button.setAttribute("aria-selected",!checkbox.checked),checkbox.checked=!checkbox.checked}const bundleContainer=row.closest("[js-upsell-bundle]");
1if(bundleContainer){const bundleType=bundleContainer.getAttribute("js-upsell-bundle-type");bundleType==="pick free"?this._handlePickFreeBundle(bundleContainer):bundleType==="tiered discount"&&this._handleTieredDiscount(bundleContainer)}document.dispatchEvent(new CustomEvent(this.events.change))}_handlePickFreeBundle(wrapperElm){const tabTitle=this._getGroupLabel(wrapperElm),selectedAmount=wrapperElm.querySelectorAll("input:checked"),shouldApplyDiscount=selectedAmount.length>=this.discountConfig.pickFreeMax;let totalSavings=0,savingsIndex=0;wrapperElm.querySelectorAll(this._selectors.upsellRow).forEach(item=>{const comparePriceText=item.querySelector("span.old-price"),priceText=item.querySelector("span.new-price"),price=Number(priceText.getAttribute("data-price")),checkbox=item.querySelector("input");let isItemChecked=!!checkbox.checked;isItemChecked&&savingsIndex++,isItemChecked&&savingsIndex<=this.discountConfig.pickFreeMax&&(totalSavings+=price,priceText.innerHTML="FREE",comparePriceText.classList.contains("hidden")&&(comparePriceText.innerHTML=formatMoney(price,"${{no_trailing_zeros}}"),comparePriceText.classList.remove("hidden")),checkbox.setAttribute("data-product-price",0),checkbox.setAttribute("data-product-savings",price)),(!isItemChecked||savingsIndex>this.discountConfig.pickFreeMax)&&(checkbox.removeAttribute("data-savings"),comparePriceText.classList.add("hidden"),priceText.innerHTML=price===0?"FREE":formatMoney(price,"${{no_trailing_zeros}}"))}),selectedAmount.length===this.discountConfig.pickFreeMax?wrapperElm.querySelectorAll(this._selectors.upsellRow).forEach(item=>{const checkbox=item.querySelector("input"),button=item.querySelector(this._selectors.selectBtn);checkbox.checked||button.setAttribute("disabled",!0)}):wrapperElm.querySelectorAll(this._selectors.upsellRow).forEach(item=>{const checkbox=item.querySelector("input");item.querySelector(this._selectors.selectBtn).removeAttribute("disabled")});let labelConfig={isComplete:!1};selectedAmount.length>=this.discountConfig.pickFreeMax?labelConfig={isComplete:!0,remaining:0,amount:totalSavings}:selectedAmount.length>0?labelConfig={isComplete:!1,remaining:this.discountConfig.pickFreeMax-selectedAmount.length}:labelConfig={isComplete:!1,remaining:this.discountConfig.pickFreeMax},tabTitle&&this._setPickFreeBundleLabel(tabTitle,labelConfig),wrapperElm.setAttribute("data-discount-applied",shouldApplyDiscount?"true":"false"),document.dispatchEvent(new CustomEvent(this.events.change))}_setPickFreeBundleLabel(label,{isComplete=!1,remaining=this.discountConfig.pickFreeMax,amount}){label&&(isComplete?label.innerHTML=`Order Now & Save ${formatMoney(amount,"${{no_trailing_zeros}}")}`:remaining===this.discountConfig.pickFreeMax?label.innerHTML=`Pick ${this.discountConfig.pickFreeMax} Free Accessories`:remaining===1?label.innerHTML=`Pick ${remaining} More Free Accessory`:remaining!==this.discountConfig.pickFreeMax&&(label.innerHTML=`Pick ${remaining} More Free Accessories`))}_handleTieredDiscount(wrapperElm){const tabTitle=this._getGroupLabel(wrapperElm),selectedAmount=wrapperElm.querySelectorAll("input:checked"),shouldApplyDiscount=selectedAmount.length>=this.discountConfig.tieredMin;let totalSavings=0,savingsIndex=0;wrapperElm.querySelectorAll(this._selectors.upsellRow).forEach(item=>{const comparePriceText=item.querySelector("span.old-price"),priceText=item.querySelector("span.new-price"),price=Number(priceText.getAttribute("data-price")),checkbox=item.querySelector("input"),isItemChecked=!!checkbox.checked;if(isItemChecked&&savingsIndex++,isItemChecked&&selectedAmount.length>=this.discountConfig.tieredMin&&(totalSavings+=price*(this.discountConfig.tieredDiscount/100),priceText.innerHTML=formatMoney(price-price*(this.discountConfig.tieredDiscount/100),"${{no_trailing_zeros}}"),comparePriceText.classList.contains("hidden")&&(comparePriceText.innerHTML=formatMoney(price,"${{no_trailing_zeros}}"),comparePriceText.classList.remove("hidden")),checkbox.setAttribute("data-product-savings",price),checkbox.setAttribute("data-product-price",price*(this.discountConfig.tieredDiscount/100))),!isItemChecked||selectedAmount.length<this.discountConfig.tieredMin){checkbox.removeAttribute("data-discount"),checkbox.setAttribute("data-product-savings",0),checkbox.setAttribute("data-product-price",price);const compareDefaultPrice=Number(comparePriceText.getAttribute("data-price"))??!1;compareDefaultPrice?(comparePriceText.classList.remove("hidden"),comparePriceText.innerHTML=formatMoney(compareDefaultPrice,"${{no_trailing_zeros}}")):comparePriceText.classList.add("hidden"),priceText.innerHTML=price===0?"FREE":formatMoney(price,"${{no_trailing_zeros}}")}});let labelConfig={isComplete:!1};selectedAmount.length>=this.discountConfig.tieredMin?labelConfig={isComplete:!0,remaining:0,amount:totalSavings}:selectedAmount.length>0?labelConfig={isComplete:!1,remaining:this.discountConfig.tieredMin-selectedAmount.length}:labelConfig={isComplete:!1,remaining:this.discountConfig.tieredMin},tabTitle&&this.setTieredLabel(tabTitle,labelConfig),wrapperElm.setAttribute("data-discount-applied",shouldApplyDiscount?"true":"false"),document.dispatchEvent(new CustomEvent(this.events.change))}setTieredLabel(label,{isComplete=!1,remaining=this.discountConfig.tieredMin,amount}){label&&(isComplete?label.innerHTML=`Order Now & Save ${formatMoney(amount,"${{no_trailing_zeros}}")}`:remaining===this.discountConfig.tieredMax?label.innerHTML=`Add ${this.discountConfig.tieredMax}, Save ${this.discountConfig.tieredDiscount}%`:remaining!==this.discountConfig.minSelect&&(label.innerHTML=`Add ${remaining} more, Save ${this.discountConfig.tieredDiscount}%`))}_getGroupLabel(wrapperElm){const groupWrapper=wrapperElm.closest(".upsell-wrapper"),isAccordion=wrapperElm.classList.contains("upsell-group--accordion")??!1,isTab=wrapperElm.getAttribute("role")==="tabpanel";let tabTitle;if(isTab){const tabTitleId=wrapperElm.getAttribute("aria-labelledby");tabTitle=this.querySelector(`#${tabTitleId}`)}else isAccordion?tabTitle=wrapperElm.querySelector(this._selectors.bundleLabel):tabTitle=groupWrapper.querySelector(this._selectors.bundleLabel);return tabTitle}}customElements.get("product-upsells")||customElements.define("product-upsells",ProductUpsells);
2//# sourceMappingURL=/cdn/shop/t/249/assets/seed-product-upsells.js.map?v=96043402135474941031771021640

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.