PageSourceSearch

https://www.weblens.be/cdn/shop/t/6/assets/nf-pdp-configuration.js?v=158633275525920791201762180268

js weblens.be collected 2026-10-08 08:23:04 UTC 20,443 bytes, 2 lines download raw bytes

1class PDPConfiguration extends HTMLElement{constructor(){super(),this.presetQuantities=this.querySelectorAll('input[name="preset-qty"]'),this.attributeQuantity=this.querySelectorAll(".quantity__input"),this.lensesOption=this.querySelectorAll(".lens_options"),this.enableAttribute=this.querySelectorAll(".enable_attribute"),this.quantityInput=document.querySelector('input.quantity__input[name="quantity"]'),this.isPromo=this.getAttribute("data-is-promo")==="true",this.isLensProduct=!1}connectedCallback(){this.init()}init(){const rechtsCheckbox=this.querySelector("#enable_rechts"),linksCheckbox=this.querySelector("#enable_links");this.isLensProduct=!!(rechtsCheckbox||linksCheckbox),this.setAllLensDefaults(),this.presetQuantities.forEach(radio=>{radio.addEventListener("change",()=>this.radioChanged(this,!0))}),this.lensesOption.forEach(select=>{this.updatelensesAttribute(select),select.addEventListener("change",()=>this.updatelensesAttribute(select))}),this.enableAttribute.forEach(input=>{this.enableLensesAttribute(input),input.addEventListener("change",()=>this.enableLensesAttribute(input))}),this.attributeQuantity.forEach(input=>{input.addEventListener("change",()=>this.quantityChange(input,!1)),input.addEventListener("input",()=>this.quantityChange(input,!1))}),this.radioChanged(this,!0),this.rePositionElements(),this.isPromo&&this.ensureLensSelectsEnabled(),this.isLensProduct&&this.setupCustomFormHandling()}setupCustomFormHandling(){const productForm=document.querySelector("product-form"),originalSubmitButton=productForm?.querySelector('button[type="submit"]');if(originalSubmitButton&&this.isLensProduct){originalSubmitButton.style.display="none";const customButton=originalSubmitButton.cloneNode(!0);customButton.style.display="",customButton.type="button",customButton.removeAttribute("form"),originalSubmitButton.parentNode.insertBefore(customButton,originalSubmitButton.nextSibling),customButton.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.handleCustomSubmit()}),this.customSubmitButton=customButton,this.originalProductForm=productForm}}async handleCustomSubmit(){const form=this.originalProductForm?.querySelector("form");if(!form){console.error("Form not found");return}const rechtsCheckbox=this.querySelector("#enable_rechts"),linksCheckbox=this.querySelector("#enable_links"),rechtsInput=this.querySelector('input[name="rechts_qty"]'),linksInput=this.querySelector('input[name="links_qty"]'),rechtsQty=parseInt(rechtsInput?.value||0),linksQty=parseInt(linksInput?.value||0),validationError=this.validateLensSelects(rechtsCheckbox?.checked&&rechtsQty>0,linksCheckbox?.checked&&linksQty>0);if(validationError){this.showError(validationError);return}const variantId=form.querySelector('input[name="id"]')?.value;if(!variantId){this.showError("Product variant not found");return}const itemsToAdd=[];if(rechtsCheckbox?.checked&&rechtsQty>0){const rechtsItem={id:variantId,quantity:rechtsQty,properties:{Eye:"Rechts"}};this.addLensAttributesToItem(rechtsItem,"rechts",form),itemsToAdd.push(rechtsItem)}if(linksCheckbox?.checked&&linksQty>0){const linksItem={id:variantId,quantity:linksQty,properties:{Eye:"Links"}};this.addLensAttributesToItem(linksItem,"links",form),itemsToAdd.push(linksItem)}if(itemsToAdd.length===0){this.showError("Please select at least one eye and set a quantity.");return}this.setLoadingState(!0);try{const cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer"),requestBody={items:itemsToAdd};cart&&(requestBody.sections=cart.getSectionsToRender().map(section=>section.id),requestBody.sections_url=window.location.pathname,cart.setActiveElement&&cart.setActiveElement(document.activeElement)),console.log("Sending custom request:",requestBody);const response=await fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",headers:{"Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},body:JSON.stringify(requestBody)}),responseData=await response.json();console.log("Response:",responseData),response.ok?this.handleSuccessfulAdd(responseData,cart):this.showError(responseData.message||responseData.description||"Error adding to cart")}catch(error){console.error("Network error:",error),this.showError("Network error. Please check your connection and try again.")}finally{this.setLoadingState(!1)}}handleSuccessfulAdd(responseData,cart){if(this.clearErrors(),!cart){window.location.href=window.Shopify.routes.root+"cart";return}typeof publish<"u"&&typeof PUB_SUB_EVENTS<"u"&&publish(PUB_SUB_EVENTS.cartUpdate,{source:"product-form",cartData:responseData}),document.dispatchEvent(new CustomEvent("cart:updated",{detail:{cart:responseData,source:"pdp-configuration"}}));const quickAddModal=this.closest("quick-add-modal");quickAddModal?(document.body.addEventListener("modalClosed",()=>{setTimeout(()=>{this.renderCartUpdate(cart,responseData)})},{once:!0}),quickAddModal.hide(!0)):this.renderCartUpdate(cart,responseData),cart.classList.contains("is-empty")&&cart.classList.remove("is-empty"),(cart.classList.contains("drawer")||cart.tagName==="CART-DRAWER")&&this.openCartDrawer(cart)}renderCartUpdate(cart,responseData){cart.renderContents?cart.renderContents(responseData):cart.getSectionsToRender&&cart.getSectionsToRender().forEac
1h(section=>{const sectionElement=document.querySelector(section.selector)||document.getElementById(section.id);sectionElement&&responseData.sections&&responseData.sections[section.id]&&(sectionElement.innerHTML=responseData.sections[section.id])})}openCartDrawer(cart){if(cart.open)cart.open();else if(cart.classList.contains("drawer")){cart.classList.add("animate","active");const overlay=document.querySelector(".cart-drawer-overlay")||document.querySelector('[id*="cart-drawer-overlay"]');overlay&&overlay.classList.add("active"),document.body.classList.add("overflow-hidden"),cart.dispatchEvent(new CustomEvent("cart-drawer:opened"))}}addLensAttributesToItem(item,eyeType,form){const prefix=eyeType==="rechts"?"R":"L";if(console.log(`Getting attributes for ${eyeType} (${prefix})`),document.querySelectorAll(`.${eyeType} select.lens_options`).forEach(select=>{const targetId=select.getAttribute("data-target"),value=select.value;if(targetId&&value){const parts=targetId.split("-");if(parts.length>=2){const propertyName=parts[0]+"-"+parts[1].charAt(0).toUpperCase()+parts[1].slice(1);item.properties[propertyName]=value,console.log(`Added ${propertyName}: ${value}`)}}}),eyeType==="rechts"){const sterkte=document.querySelector("#R-sterkte")?.value,dia=document.querySelector("#R-dia")?.value,bc=document.querySelector("#R-BC")?.value;sterkte&&!item.properties["R-Sterkte"]&&(item.properties["R-Sterkte"]=sterkte),dia&&!item.properties["R-Dia"]&&(item.properties["R-Dia"]=dia),bc&&!item.properties["R-BC"]&&(item.properties["R-BC"]=bc)}else if(eyeType==="links"){const sterkte=document.querySelector('input[name="items[0][properties][L-Sterkte]"]')?.value||document.querySelector("#L-sterkte")?.value,dia=document.querySelector('input[name="items[0][properties][L-Dia]"]')?.value||document.querySelector("#L-dia")?.value,bc=document.querySelector('input[name="items[0][properties][L-BC]"]')?.value||document.querySelector("#L-BC")?.value;sterkte&&!item.properties["L-Sterkte"]&&(item.properties["L-Sterkte"]=sterkte),dia&&!item.properties["L-Dia"]&&(item.properties["L-Dia"]=dia),bc&&!item.properties["L-BC"]&&(item.properties["L-BC"]=bc)}this.querySelectorAll(`.${eyeType} select:not([data-target*="sterkte"]):not([data-target*="dia"]):not([data-target*="bc"])`).forEach(select=>{if(select.value&&select.getAttribute("data-target")){const targetId=select.getAttribute("data-target"),label=select.closest("tr")?.querySelector("td:first-child")?.textContent?.trim()||targetId.replace(prefix+"-",""),propertyKey=`${prefix}-${label}`;item.properties[propertyKey]||(item.properties[propertyKey]=select.value,console.log(`Added additional property ${propertyKey}: ${select.value}`))}}),console.log("Final properties for",eyeType,":",item.properties)}setLoadingState(loading){if(!this.customSubmitButton)return;const spinner=this.customSubmitButton.querySelector(".loading__spinner"),buttonText=this.customSubmitButton.querySelector("span");loading?(this.customSubmitButton.setAttribute("aria-disabled","true"),this.customSubmitButton.classList.add("loading"),spinner&&spinner.classList.remove("hidden"),buttonText&&(this.originalButtonText=buttonText.textContent,buttonText.textContent="Adding to cart...")):(this.customSubmitButton.removeAttribute("aria-disabled"),this.customSubmitButton.classList.remove("loading"),spinner&&spinner.classList.add("hidden"),buttonText&&this.originalButtonText&&(buttonText.textContent=this.originalButtonText))}showError(message){const errorWrapper=document.querySelector(".product-form__error-message-wrapper"),errorMessage=errorWrapper?.querySelector(".product-form__error-message");errorWrapper&&errorMessage?(errorMessage.textContent=message,errorWrapper.hidden=!1,setTimeout(()=>{errorWrapper.hidden=!0},5e3)):alert(message)}clearErrors(){const errorWrapper=document.querySelector(".product-form__error-message-wrapper");errorWrapper&&(errorWrapper.hidden=!0)}validateLensSelects(rechtsEnabled,linksEnabled){if(rechtsEnabled){const rechtsSelects=this.querySelectorAll(".rechts select.lens_options");for(const select of rechtsSelects)if(!select.value||select.value.trim()==="")return"Please select all lens o
1ptions for Rechts (Right) eye before adding to cart."}if(linksEnabled){const linksSelects=this.querySelectorAll(".links select.lens_options");for(const select of linksSelects)if(!select.value||select.value.trim()==="")return"Please select all lens options for Links (Left) eye before adding to cart."}return null}rePositionElements(){let productForm=document.querySelector("product-form form"),appendToFormDiv=this.querySelector(".append-to-form");if(productForm&&appendToFormDiv&&(appendToFormDiv.style.display="none",this.isLensProduct)){const standardQtyInput=productForm.querySelector('input[name="quantity"]');standardQtyInput&&(standardQtyInput.removeAttribute("name"),standardQtyInput.setAttribute("data-original-name","quantity"),standardQtyInput.disabled=!0)}}setAllLensDefaults(){this.lensesOption.forEach(select=>{this.updatelensesAttribute(select)}),document.querySelectorAll("select.lens_options[data-target]").forEach(select=>{const targetId=select.getAttribute("data-target"),targetInput=document.getElementById(targetId);targetInput&&select.value&&(targetInput.value=select.value,console.log(`Set default for ${targetId}: ${select.value}`))});const rechtsInput=this.querySelector('input[name="rechts_qty"]'),linksInput=this.querySelector('input[name="links_qty"]');rechtsInput&&this.quantityChange(rechtsInput,!1),linksInput&&this.quantityChange(linksInput,!1)}radioChanged(element,isRadio){const checked=element.querySelector('input[name="preset-qty"]:checked');if(!checked)return;const value=checked.value,price_update=checked.getAttribute("data-discount-price"),priceID=element.getAttribute("data-price"),priceItem=document.getElementById(priceID)?.querySelector(".price-item--regular");priceItem&&(priceItem.innerHTML=price_update),this.attributeQuantity.forEach(input=>{input.value=value;const event=new Event("change",{bubbles:!0});input.dispatchEvent(event)}),window.PriceCalculator&&window.PriceCalculator.updateTotalPrice()}quantityChange(element,isRadio){if(!element)return;const rechtsInput=this.querySelector('input[name="rechts_qty"]'),linksInput=this.querySelector('input[name="links_qty"]'),rechtsQty=parseInt(rechtsInput?.value||0),linksQty=parseInt(linksInput?.value||0),totalQty=rechtsQty+linksQty;console.log(`Quantity change - Rechts: ${rechtsQty}, Links: ${linksQty}, Total: ${totalQty}`),window.PriceCalculator&&window.PriceCalculator.updateTotalPrice()}updatelensesAttribute(select){let targetId=select.getAttribute("data-target"),targetInput=document.getElementById(targetId);if(targetInput){targetInput.value=select.value,console.log(`Updated ${targetId} to ${select.value}`);const event=new Event("change",{bubbles:!0});targetInput.dispatchEvent(event)}const eyeSection=select.closest(".rechts, .links");if(eyeSection){const prefix=eyeSection.classList.contains("rechts")?"R":"L",label=select.closest(".lens-option-wrapper")?.querySelector("label")?.textContent||select.getAttribute("data-label")||select.name;if(label){const cleanLabel=label.trim().toLowerCase().replace(/[:\s]+/g,"-").replace(/sterkte/i,"sterkte").replace(/dia/i,"dia").replace(/bc/i,"bc"),possibleIds=[`${prefix}-${cleanLabel}`,`${prefix}${cleanLabel}`,`${prefix}_${cleanLabel}`];for(const id of possibleIds){const input=document.getElementById(id);if(input&&input!==targetInput){input.value=select.value,console.log(`Also updated ${id} to ${select.value}`);break}}}}}enableLensesAttribute(input){const retchsItems=document.querySelectorAll(".rechts"),linksItems=document.querySelectorAll(".links");if(input.checked)this.radioChanged(this,!1),input.name==="enable_rechts"?retchsItems.forEach(retchs=>{let select=retchs.querySelector("select");retchs.classList.remove("disabled"),select&&select.removeAttribute("disabled")}):linksItems.forEach(links=>{let select=links.querySelector("select");links.classList.remove("disabled"),select&&select.removeAttribute("disabled")});else if(input.name==="enable_rechts"){const rechtsInput=this.querySelector('input[name="rechts_qty"]');if(rechtsInput){rechtsInput.value=0;const event=new Event("change",{bubbles:!0});rechtsInput.dispatchEvent(event)}
1this.isPromo||retchsItems.forEach(retchs=>{let select=retchs.querySelector("select");retchs.classList.add("disabled"),select&&select.setAttribute("disabled","disabled")})}else{const linksInput=this.querySelector('input[name="links_qty"]');if(linksInput){linksInput.value=0;const event=new Event("change",{bubbles:!0});linksInput.dispatchEvent(event)}this.isPromo||linksItems.forEach(links=>{let select=links.querySelector("select");links.classList.add("disabled"),select&&select.setAttribute("disabled","disabled")})}this.quantityChange(),window.PriceCalculator&&window.PriceCalculator.updateTotalPrice()}ensureLensSelectsEnabled(){const retchsItems=document.querySelectorAll(".rechts"),linksItems=document.querySelectorAll(".links");[...retchsItems,...linksItems].forEach(item=>{let select=item.querySelector("select");item.classList.remove("disabled"),select&&select.removeAttribute("disabled")})}}customElements.define("pdp-configuration",PDPConfiguration),(function(){"use strict";const CONFIG={selectors:{priceElement:".price__container .price-item.price-item--regular",rechtsCheckbox:"#enable_rechts",linksCheckbox:"#enable_links",rechtsQtyInput:'input[name="rechts_qty"]',linksQtyInput:'input[name="links_qty"]',quantityButtons:".quantity__button",totalPriceContainer:".total-price",totalPriceStrong:".total-price strong",quantityInputs:".quantity__input"},styles:{fontWeight:"bold",fontSize:"1.2em",marginTop:"10px",padding:"8px",backgroundColor:"#f8f9fa",border:"1px solid #dee2e6",borderRadius:"4px"}};let elements={},totalPriceElement=null,priceObserver=null;function init(){try{findElements(),createTotalPriceElement(),attachEventListeners(),setupPriceObserver(),addQuantityButtonHandling(),updateTotalPrice()}catch(error){console.error("Price Calculator initialization failed:",error)}}function findElements(){elements={price:document.querySelector(CONFIG.selectors.priceElement),rechtsCheckbox:document.querySelector(CONFIG.selectors.rechtsCheckbox),linksCheckbox:document.querySelector(CONFIG.selectors.linksCheckbox),rechtsQtyInput:document.querySelector(CONFIG.selectors.rechtsQtyInput),linksQtyInput:document.querySelector(CONFIG.selectors.linksQtyInput),quantityButtons:document.querySelectorAll(CONFIG.selectors.quantityButtons),quantityInputs:document.querySelectorAll(CONFIG.selectors.quantityInputs)},elements.price||console.warn("Price element not found. Calculator may not work properly.")}function createTotalPriceElement(){totalPriceElement=document.querySelector(CONFIG.selectors.totalPriceContainer),totalPriceElement||console.warn(".total-price element not found. Make sure your Liquid template includes the total-price div.")}function extractPrice(priceText){if(!priceText)return 0;let cleanPrice=priceText.replace(/[€$£\s]/g,"");const commaIndex=cleanPrice.lastIndexOf(","),dotIndex=cleanPrice.lastIndexOf(".");commaIndex>-1&&cleanPrice.length-commaIndex<=3?cleanPrice=cleanPrice.replace(/\./g,"").replace(",","."):dotIndex>-1&&cleanPrice.length-dotIndex<=3&&(cleanPrice=cleanPrice.replace(/,/g,""));const price=parseFloat(cleanPrice);return isNaN(price)?0:price}function addQuantityButtonHandling(){const pdpConfig=document.querySelector("pdp-configuration");pdpConfig&&pdpConfig.getAttribute("data-is-promo")==="true"||document.querySelectorAll(".quantity__button:not([\\@click]):not([\\@click\\.prevent])").forEach(button=>{const newButton=button.cloneNode(!0);button.parentNode.replaceChild(newButton,button),newButton.addEventListener("click",function(e){e.preventDefault(),e.stopImmediatePropagation();const quantityInput=this.closest("quantity-input").querySelector(".quantity__input"),buttonName=this.getAttribute("name"),currentValue=parseInt(quantityInput.value)||1;buttonName==="plus"?quantityInput.value=currentValue+1:buttonName==="minus"&&currentValue>1&&(quantityInput.value=currentValue-1),updateButtonStates(quantityInput);const event=new Event("change",{bubbles:!0});quantityInput.dispatchEvent(event),updateTotalPrice()})})}function updateButtonStates(input){const minusButton=input.closest("quantity-input").querySelector('button[name="minus"]'),currentValue=parseInt(input.value)||1;
1minusButton&&(currentValue<=1?(minusButton.classList.add("disabled"),minusButton.disabled=!0):(minusButton.classList.remove("disabled"),minusButton.disabled=!1))}function updateTotalPrice(){if(!(!elements.price||!totalPriceElement))try{const basePrice=extractPrice(elements.price.textContent||elements.price.innerText),rechtsQty=elements.rechtsCheckbox?.checked?Math.max(0,parseInt(elements.rechtsQtyInput?.value||0)):0,linksQty=elements.linksCheckbox?.checked?Math.max(0,parseInt(elements.linksQtyInput?.value||0)):0,totalQuantity=rechtsQty+linksQty,totalPrice=basePrice*totalQuantity;console.log(`Price calculation: Base: \u20AC${basePrice}, Rechts: ${rechtsQty}, Links: ${linksQty}, Total: \u20AC${totalPrice}`),updateTotalPriceDisplay(basePrice,totalQuantity,totalPrice)}catch(error){console.error("Error updating total price:",error),totalPriceElement.innerHTML="<strong>Error calculating price</strong>"}}function updateTotalPriceDisplay(basePrice,totalQuantity,totalPrice){const strongElement=totalPriceElement.querySelector("strong");strongElement?totalQuantity>0?strongElement.textContent=`\u20AC${totalPrice.toFixed(2)}`:strongElement.textContent="\u20AC0.00":console.warn("Strong element not found in .total-price div. Cannot update total price.")}function attachEventListeners(){elements.rechtsCheckbox&&elements.rechtsCheckbox.addEventListener("change",updateTotalPrice),elements.linksCheckbox&&elements.linksCheckbox.addEventListener("change",updateTotalPrice),elements.rechtsQtyInput&&(elements.rechtsQtyInput.addEventListener("input",updateTotalPrice),elements.rechtsQtyInput.addEventListener("change",updateTotalPrice)),elements.linksQtyInput&&(elements.linksQtyInput.addEventListener("input",updateTotalPrice),elements.linksQtyInput.addEventListener("change",updateTotalPrice)),elements.quantityInputs.forEach(input=>{updateButtonStates(input),input.addEventListener("input",function(){updateButtonStates(this)}),input.addEventListener("change",function(){updateButtonStates(this)})})}function setupPriceObserver(){!elements.price||!window.MutationObserver||(priceObserver=new MutationObserver(function(mutations){let shouldUpdate=!1;mutations.forEach(function(mutation){(mutation.type==="childList"||mutation.type==="characterData")&&(shouldUpdate=!0)}),shouldUpdate&&updateTotalPrice()}),priceObserver.observe(elements.price,{childList:!0,subtree:!0,characterData:!0}))}function destroy(){priceObserver&&(priceObserver.disconnect(),priceObserver=null)}function autoInit(){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",init):setTimeout(init,100)}window.PriceCalculator={init,destroy,updateTotalPrice,version:"1.3.0"},autoInit()})();
2//# sourceMappingURL=/cdn/shop/t/6/assets/nf-pdp-configuration.js.map?v=158633275525920791201762180268

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.