1class CompareProductPopup extends HTMLElement{constructor(){super(),this.compareItems=JSON.parse(localStorage.getItem("compareItem")||"[]"),this.init()}init(){document.addEventListener("click",this.handleClick.bind(this)),this.initCompareProduct(),this.setupEventListeners(),this.setLocalStorageProductForCompare()}getCompareDrawer(){return document.querySelector("#halo-compare-product-popup")}handleClick(event){const target=event.target;if(target.matches("[data-compare-link]")||target.closest("[data-compare-link]")){const opener=target.closest("[data-compare-link]");this.handleCompareLink(opener)}else target.matches("[data-compare-remove]")&&this.handleCompareRemove(target)}initCompareProduct(){const closeBtn=document.querySelector("[data-close-compare-product-popup]");if(window.compare.show){this.setLocalStorageProductForCompare();const drawer=this.getCompareDrawer(),hideComparePopup=()=>drawer?.close?.();closeBtn?.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),hideComparePopup()})}}setupEventListeners(){document.addEventListener("change",event=>{event.target.matches("[data-product-compare] input")&&this.handleCompareChange(event)})}setLocalStorageProductForCompare(){const items=document.querySelectorAll("[data-product-compare-handle]");this.compareItems&&(items.forEach(element=>{const handle=element.dataset.productCompareHandle,compareIcon=element.querySelector(".compare-button"),text=element.querySelector(".text .text-inner"),input=element.querySelector("input");this.compareItems.includes(handle)?(compareIcon?.classList.add("is-checked"),text&&(text.textContent=window.compare.added),input&&(input.checked=!0)):(compareIcon?.classList.remove("is-checked"),text&&(text.textContent=window.compare.add),input&&(input.checked=!1))}),this.updateCounterCompare())}handleCompareChange(event){const target=event.target,item=target.closest(".card-compare"),handle=target.value;target.checked?(item.querySelector(".compare-icon")?.classList.add("is-checked"),item.querySelector(".text").textContent=window.compare.added,target.checked=!0,target.closest(".compare-button").classList.add("is-checked"),this.incrementCounterCompare(handle)):(item.querySelector(".compare-icon")?.classList.remove("is-checked"),item.querySelector(".text").textContent=window.compare.add,target.checked=!1,target.closest(".compare-button").classList.remove("is-checked"),this.decrementCounterCompare(handle))}handleCompareLink(opener){if(this.compareItems.length<=1)return alert(window.compare.message),!1;opener?.classList?.add("loading"),opener?.querySelector(".loading__spinner")?.classList?.remove("hidden"),this.updateContentCompareProduct(this.compareItems,0,opener)}handleCompareRemove(target){const id=target.dataset.compareItem,compareTable=document.querySelector("[data-compare-product-popup] .compareTable"),item=compareTable.querySelector(`.compare-table-row[data-product-compare-id="${id}"]`),handle=item?.dataset.compareProductHandle,drawer=this.getCompareDrawer();compareTable.querySelectorAll("tbody .compare-table-row").length===1?(item?.remove(),this.decrementCounterCompare(handle),drawer?.close?.()):(item?.remove(),this.decrementCounterCompare(handle)),document.querySelectorAll(`[data-compare-handle="${handle}"]`).forEach(itemHandle=>{itemHandle.classList.remove("is-checked"),itemHandle.querySelector(".text").textContent=window.compare.add,itemHandle.querySelector("input[name='compare']").checked=!1})}updateCounterCompare(){const compareLink=document.querySelector("[data-compare-link]");compareLink&&(this.compareItems.length>1?(compareLink.parentElement.classList.add("is-show"),compareLink.querySelector("span.countPill").textContent=this.compareItems.length):compareLink.parentElement.classList.remove("is-show"))}incrementCounterCompare(item){this.compareItems.includes(item)||(this.compareItems.push(item),localStorage.setItem("compareItem",JSON.stringify(this.compareItems)),this.updateCounterCompare())}decrementCounterCompare(item){const index=this.compareItems.indexOf(item);index>-1&&(this.compareItems.splice(index,1),localStorage.setItem("compareItem",JSON.stringify(this.compareItems)),this.updateCounterCompare())}async updateContentCompareProduct(list,count,opener){const compareTable=document.querySelector("[data-compare-product-popup] .compareTable"),url=`${window.routes?.root||window.routes?.shop_origin||window.shopUrl||""}/products/${list[count]}?view=ajax_product_card_compare`,drawer=this.getCompareDrawer();if(count===0&&(compareTable.querySelector("tbody").innerHTML=""),list.length>count)try{const data=await(await fetch(url)).text();compareTable.querySelector("tbody").insertAdjacentHTML("beforeend",data),count++,this.updateContentCompareProduct(list,count,opener)}catch(error){console.error("Error fetching compare product:",error),opener?.classList?.remove("loading"),opener?.querySelector(".loading__spinner")?.classList?.add("hidden")}else drawer?.open?.(opener),opener?.classList?.remove("loading"),opener?.querySelector(".loading__spinner")?.classList?.add("hidden");document.querySelectorAll("[data-compare-remove]").forEach(element=>{element.addEventListener("click",()=>{this.handleCompareRemove(element)})})}}customElements.get("compare-product-popup")||customElements.define("compare-product-popup",CompareProductPopup); 2//# sourceMappingURL=/cdn/shop/t/15/assets/product-compare.js.map?v=120606182715615974771772638598
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.