https://www.christiania-belysning.no/cdn/shop/t/28/assets/block.pr…?v=139124466726936476201790941221
1import{EVENTS}from"util.events";import{fetchLocationInventory}from"util.storefront-inventory";import{getLocalStorage,removeLocalStorage,setLocalStorage}from"util.storage";import Modals from"module.modal";const STORAGE_KEY="store-availability:selected-location-id",STORAGE_EXPIRY_DAYS=90;class ProductLocationAvailability extends HTMLElement{connectedCallback(){this.abortController=new AbortController,this.shopDomain=this.dataset.shopDomain,this.storefrontToken=this.dataset.storefrontToken,this.hovedlagerLocationGid=this.dataset.hovedlagerLocationGid,this.excludedVariantIds=(this.dataset.excludedVariantIds||"").split(",").filter(Boolean),this.storeLocations=[],this.listEl=this.querySelector("[data-location-list]"),this.summaryIcon=this.querySelector("[data-summary-icon]"),this.summaryNameRow=this.querySelector("[data-summary-name-row]"),this.summaryPrefix=this.querySelector("[data-summary-prefix]"),this.summaryName=this.querySelector("[data-summary-name]"),this.summaryStatus=this.querySelector("[data-summary-status]"),this.clearButton=this.querySelector("[data-clear-store]"),this.triggerEl=this.querySelector(".store-availability-trigger"),this.iconInStock=this.querySelector("[data-icon-in-stock]")?.content,this.iconOutOfStock=this.querySelector("[data-icon-out-of-stock]")?.content,this.iconStore=this.querySelector("[data-icon-store]")?.content;const modalEl=this.querySelector("[data-location-availability-modal]");modalEl?.id&&(this.modal=new Modals(modalEl.id,"location-availability")),this.clearButton?.addEventListener("click",this.clearSelectedLocation.bind(this),{signal:this.abortController.signal}),document.addEventListener(`${EVENTS.variantChange}:${this.dataset.sectionId}:${this.dataset.productId}`,this.handleVariantChange.bind(this),{signal:this.abortController.signal}),this.loadForVariant(this.dataset.variantId)}disconnectedCallback(){this.abortController.abort()}handleVariantChange({detail}){const{variant}=detail;variant&&this.loadForVariant(variant.id)}loadForVariant(variantId){if(this.storefrontToken){if(this.pendingVariantId=variantId,this.clearSummary(),this.excludedVariantIds.includes(String(variantId))){this.summaryIcon.appendChild(this.iconStore.cloneNode(!0)),this.summaryStatus.textContent=this.dataset.excludedText,this.triggerEl&&(this.triggerEl.hidden=!0),this.hidden=!1;return}fetchLocationInventory(this.shopDomain,this.storefrontToken,variantId).then(locations=>{if(this.pendingVariantId===variantId){if(!locations){this.hidden=!0;return}this.storeLocations=locations.filter(loc=>loc.locationId!==this.hovedlagerLocationGid),this.renderModalList(),this.renderSummary(),this.triggerEl&&(this.triggerEl.hidden=this.storeLocations.length===0),this.hidden=!1}})}}clearSummary(){this.storeLocations=[],this.summaryIcon.innerHTML="",this.summaryIcon.className="store-availability-summary__icon",this.summaryNameRow.hidden=!0,this.summaryName.textContent="",this.summaryStatus.textContent="",this.listEl&&(this.listEl.innerHTML="")}renderModalList(){this.listEl.innerHTML="",this.storeLocations.slice().sort((a,b)=>
1a.locationName.localeCompare(b.locationName,"nb")).forEach(location=>{this.listEl.appendChild(this.buildLocationRow(location))})}buildLocationRow(location){const inStock=location.quantityAvailable>0,addressLines=location.address?.formatted||[],phone=location.address?.phone,li=document.createElement("li");li.className="store-location-availability__item",li.appendChild(this.buildIcon(inStock));const info=document.createElement("div"),name=document.createElement("strong");name.textContent=location.locationName,info.appendChild(name),info.appendChild(document.createElement("br"));const status=document.createElement("span");if(status.textContent=inStock?this.inStockCountText(location):this.dataset.outOfStockText,info.appendChild(status),addressLines.length){info.appendChild(document.createElement("br"));const address=document.createElement("span");address.className="store-location-availability__address",address.textContent=addressLines.join(", "),info.appendChild(address)}if(phone){info.appendChild(document.createElement("br"));const phoneLink=document.createElement("a");phoneLink.href=`tel:${phone}`,phoneLink.textContent=phone,info.appendChild(phoneLink)}const chooseButton=document.createElement("button");return chooseButton.type="button",chooseButton.className="store-location-availability__choose element-button element-button--size-sm",chooseButton.textContent=this.dataset.chooseStoreText,chooseButton.addEventListener("click",()=>this.selectLocation(location)),info.appendChild(document.createElement("br")),info.appendChild(chooseButton),li.appendChild(info),li}buildIcon(inStock){const wrapper=document.createElement("span");wrapper.className=`store-location-availability__icon ${inStock?"store-location-availability__icon--in-stock":"store-location-availability__icon--out-of-stock"}`;const template=inStock?this.iconInStock:this.iconOutOfStock;return template&&wrapper.appendChild(template.cloneNode(!0)),wrapper}selectLocation(location){setLocalStorage(STORAGE_KEY,location.locationId,STORAGE_EXPIRY_DAYS),this.renderSummary(),this.modal?.close()}clearSelectedLocation(){removeLocalStorage(STORAGE_KEY),this.renderSummary()}renderSummary(){const selectedId=getLocalStorage(STORAGE_KEY),selected=this.storeLocations.find(loc=>loc.locationId===selectedId);if(this.summaryIcon.innerHTML="",this.summaryIcon.className="store-availability-summary__icon",!selected){this.summaryNameRow.hidden=!0,this.summaryName.textContent="",this.renderAggregateSummary();return}const inStock=selected.quantityAvailable>0;this.summaryIcon.classList.add(inStock?"store-availability-summary__icon--in-stock":"store-availability-summary__icon--out-of-stock");const template=inStock?this.iconInStock:this.iconOutOfStock;template&&this.summaryIcon.appendChild(template.cloneNode(!0)),this.summaryNameRow.hidden=!1,this.summaryPrefix.textContent=this.dataset.pickupPrefixText,this.summaryName.textContent=selected.locationName,this.summaryStatus.textContent=inStock?this.inStockCountText(selected):this.dataset.outOfStockText}inStockCountText(location){return this.dataset.inStockCountText.replace("[count]",Math.max(0,location.quantityAvailable))}renderAggregateSummary(){const inStockCount=this.storeLocations.filter(loc=>loc.quantityAvailable>0).length;if(inStockCount>0){this.summaryIcon.classList.add("store-availability-summary__icon--in-stock"),this.iconInStock&&this.summaryIcon.appendChild(this.iconInStock.cloneNode(!0));const template=inStockCount===1?this.dataset.someInStockOneText:this.dataset.someInStockOtherText;this.summaryStatus.textContent=template.replace("[count]",inStockCount)}else{this.summaryIcon.classList.add("store-availability-summary__icon--none");const template=this.iconStore||this.iconOutOfStock;template&&this.summaryIcon.appendChild(template.cloneNode(!0)),this.summaryStatus.textContent=this.dataset.noneInStockText}}}customElements.define("product-location-availability",ProductLocationAvailability); 2//# sourceMappingURL=/cdn/shop/t/28/assets/block.product-location-availability.js.map?v=139124466726936476201790941221
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.