PageSourceSearch

https://cham.com/cdn/shop/t/59/assets/facets.js?v=37846301351938516081780086807

js cham.com collected 2026-10-07 15:25:33 UTC 12,496 bytes, 2 lines download raw bytes

1class FacetFiltersForm extends HTMLElement{constructor(){super(),this.onActiveFilterClick=this.onActiveFilterClick.bind(this),this.debouncedOnSubmit=debounce(event=>{this.onSubmitHandler(event)},500);const facetForm=this.querySelector("form");if(!facetForm)return;facetForm.addEventListener("input",this.debouncedOnSubmit.bind(this));const facetWrapper=this.querySelector("#FacetsWrapperDesktop");facetWrapper&&facetWrapper.addEventListener("keyup",onKeyUpEscape),this.hasAttribute("data-defer-filter-submit")&&this.setupDeferredFacetApply()}setupDeferredFacetApply(){const drawerDetails=this.closest(".mobile-facets__wrapper")?.querySelector("details.mobile-facets__disclosure");drawerDetails&&drawerDetails.addEventListener("toggle",()=>{drawerDetails.open||document.querySelectorAll("facet-filters-form[data-defer-filter-submit]").forEach(ff=>{typeof ff.syncFormStateFromURL=="function"&&ff.syncFormStateFromURL()})});const applyBtn=this.querySelector(".js-facets-apply"),clearBtn=this.querySelector(".js-facets-clear");applyBtn&&applyBtn.addEventListener("click",this.onDeferredApply.bind(this),!0),clearBtn&&clearBtn.addEventListener("click",this.onDeferredClear.bind(this),!0)}isDeferredFacetField(target){return!target||!target.name?!1:!!(target.tagName==="SELECT"&&target.name==="sort_by"||target.tagName==="INPUT"&&target.type==="checkbox"&&target.name.startsWith("filter.")||target.tagName==="INPUT"&&target.type==="number"&&target.closest("price-range"))}syncFormStateFromURL(){const form=this.querySelector("form");if(!form)return;const params=new URLSearchParams(window.location.search);form.querySelectorAll('input[type="checkbox"][name^="filter."]').forEach(cb=>{const vals=params.getAll(cb.name);cb.checked=vals.includes(cb.value)}),form.querySelectorAll('price-range input[type="number"]').forEach(input=>{const v=params.get(input.name);input.value=v??""}),form.querySelectorAll('select[name="sort_by"]').forEach(sortSelect=>{params.has("sort_by")?sortSelect.value=params.get("sort_by"):sortSelect.selectedIndex=0})}onDeferredApply(event){event.preventDefault(),event.stopImmediatePropagation();const merged=FacetFiltersForm.mergeFacetFormSearchParams(),drawer=this.closest(".mobile-facets__wrapper")?.querySelector("details.mobile-facets__disclosure"),submitFilters=()=>this.onSubmitForm(merged,event);drawer?.open?(drawer.querySelector("summary")?.click(),setTimeout(submitFilters,400)):submitFilters()}onDeferredClear(event){event.preventDefault(),event.stopImmediatePropagation(),FacetFiltersForm.resetAllFacetForms(),this.onSubmitForm("",event)}static setListeners(){const onHistoryChange=event=>{const searchParams=event.state?event.state.searchParams:FacetFiltersForm.searchParamsInitial;searchParams!==FacetFiltersForm.searchParamsPrev&&FacetFiltersForm.renderPage(searchParams,null,!1)};window.addEventListener("popstate",onHistoryChange)}static toggleActiveFacets(disable=!0){document.querySelectorAll(".js-facet-remove").forEach(element=>{element.classList.toggle("disabled",disable)})}static renderPage(searchParams,event,updateURLHash=!0){FacetFiltersForm.searchParamsPrev=searchParams;const sections=FacetFiltersForm.getSections(),countContainer=document.getElementById("ProductCount"),countContainerDesktop=document.getElementById("ProductCountDesktop"),productGridContainer=document.getElementById("ProductGridContainer");if(!productGridContainer){console.warn("facets.js: #ProductGridContainer not found \u2014 add it around the collection product area in your section (see main-collection-product-grid).");return}const collectionEl=productGridContainer.querySelector(".collection");collectionEl&&collectionEl.classList.add("loading"),countContainer&&countContainer.classList.add("loading"),countContainerDesktop&&countContainerDesktop.classList.add("loading"),sections.forEach(section=>{const url=`${window.location.pathname}?section_id=${section.section}&${searchParams}`,filterDataUrl=element=>element.url===url;FacetFiltersForm.filterData.some(filterDataUrl)?FacetFiltersForm.renderSectionFromCache(filterDataUrl,event):FacetFiltersForm.renderSectionFromFetch(url,event)}),updateURLHash&&FacetFiltersForm.updateURLHash(searchParams)}
1static renderSectionFromFetch(url,event){fetch(url).then(response=>response.text()).then(responseText=>{const html=responseText;FacetFiltersForm.filterData=[...FacetFiltersForm.filterData,{html,url}],FacetFiltersForm.renderFilters(html,event),FacetFiltersForm.renderProductGridContainer(html)})}static renderSectionFromCache(filterDataUrl,event){const html=FacetFiltersForm.filterData.find(filterDataUrl).html;FacetFiltersForm.renderFilters(html,event),FacetFiltersForm.renderProductGridContainer(html)}static renderProductGridContainer(html){const container=document.getElementById("ProductGridContainer"),parsed=new DOMParser().parseFromString(html,"text/html").getElementById("ProductGridContainer");if(!container||!parsed){console.warn("facets.js: could not update product grid \u2014 #ProductGridContainer missing in DOM or section response.");return}container.innerHTML=parsed.innerHTML;const collectionEl=container.querySelector(".collection");collectionEl&&collectionEl.classList.remove("loading")}static renderProductCount(html){const count=new DOMParser().parseFromString(html,"text/html").getElementById("ProductCount").innerHTML,container=document.getElementById("ProductCount"),containerDesktop=document.getElementById("ProductCountDesktop");container.innerHTML=count,container.classList.remove("loading"),containerDesktop&&(containerDesktop.innerHTML=count,containerDesktop.classList.remove("loading"))}static renderFilters(html,event){const parsedHTML=new DOMParser().parseFromString(html,"text/html"),facetDetailsElements=parsedHTML.querySelectorAll("#FacetFiltersForm .js-filter, #FacetFiltersFormMobile .js-filter, #FacetFiltersPillsForm .js-filter"),matchesIndex=element=>{const jsFilter=event?event.target.closest(".js-filter"):void 0;return jsFilter?element.dataset.index===jsFilter.dataset.index:!1},facetsToRender=Array.from(facetDetailsElements).filter(element=>!matchesIndex(element)),countsToRender=Array.from(facetDetailsElements).find(matchesIndex);facetsToRender.forEach(element=>{document.querySelector(`.js-filter[data-index="${element.dataset.index}"]`).innerHTML=element.innerHTML}),FacetFiltersForm.renderActiveFacets(parsedHTML),FacetFiltersForm.renderAdditionalElements(parsedHTML),countsToRender&&FacetFiltersForm.renderCounts(countsToRender,event.target.closest(".js-filter"))}static renderActiveFacets(html){[".active-facets-mobile",".active-facets-desktop"].forEach(selector=>{const activeFacetsElement=html.querySelector(selector);activeFacetsElement&&(document.querySelector(selector).innerHTML=activeFacetsElement.innerHTML)}),FacetFiltersForm.toggleActiveFacets(!1)}static renderAdditionalElements(html){[".mobile-facets__open",".mobile-facets__count",".sorting"].forEach(selector=>{html.querySelector(selector)&&(document.querySelector(selector).innerHTML=html.querySelector(selector).innerHTML)})}static renderCounts(source,target){const targetElement=target.querySelector(".facets__selected"),sourceElement=source.querySelector(".facets__selected"),targetElementAccessibility=target.querySelector(".facets__summary"),sourceElementAccessibility=source.querySelector(".facets__summary");sourceElement&&targetElement&&(target.querySelector(".facets__selected").outerHTML=source.querySelector(".facets__selected").outerHTML),targetElementAccessibility&&sourceElementAccessibility&&(target.querySelector(".facets__summary").outerHTML=source.querySelector(".facets__summary").outerHTML)}static updateURLHash(searchParams){history.pushState({searchParams},"",`${window.location.pathname}${searchParams&&"?".concat(searchParams)}`)}static getSections(){return[{section:document.getElementById("product-grid").dataset.id}]}createSearchParams(form){const formData=new FormData(form);return new URLSearchParams(formData).toString()}static resetAllFacetForms(){document.querySelectorAll("facet-filters-form form").forEach(form=>{["FacetSortForm","FacetFiltersForm","FacetSortDrawerForm"].includes(form.id)&&(form.querySelectorAll('input[type="checkbox"][name^="filter."]').forEach(cb=>{cb.disabled||(cb.checked=!1)}),form.querySelectorAll('price-range input[type="number"]').forEach(input=>{input.value=""}),form.querySelectorAll('select[name="sort_by"]').forEach(select=>{select.selectedIndex=0}))})}static appendSearchParam(params,key,value){if(!(value===""||value==null)){if(key==="sort_by"){params.set(key,value);return}if(key.startsWith("filter.")){params.append(key,value);return}params.set(key,value)}}static getPrimaryFiltersForm(){const forms=document.querySelectorAll("form#FacetFiltersForm");for(const form of forms)if(form.getClientRects().length>0)return form;return forms[0]||null}static getActiveSortValue(){const selects=document.querySelectorAll('select[name="sort_by"]');for(const select of selects){const sortContainer=select.closest(".facet-filters, .mobile-facets__sort");if(!(sortContainer&&sortContainer.getClientRects().length===0)&&select.getClientRects().length!==0)return select.value}return null}static mergeFacetFormSearchParams(){const host=document.querySelector("facet-filters-form");if(!host||typeof host.createSearchParams!="function")return"";document.querySelectorAll(".no-js-list").forEach(el=>el.remove());const merged=new URLSearchParams,primaryForm=FacetFiltersForm.getPrimaryFiltersForm();primaryForm&&new URLSearchParams(host.createSearchParams(primaryForm)).forEac
1h((value,key)=>{key!=="sort_by"&&FacetFiltersForm.appendSearchParam(merged,key,value)});const sortForm=document.querySelector("form#FacetSortForm, form#FacetSortDrawerForm");if(sortForm&&sortForm.getClientRects().length>0){const sortParams=new URLSearchParams(host.createSearchParams(sortForm));sortParams.has("sort_by")&&merged.set("sort_by",sortParams.get("sort_by"))}else{const sortValue=FacetFiltersForm.getActiveSortValue();sortValue&&merged.set("sort_by",sortValue)}return merged.toString()}onSubmitForm(searchParams,event){FacetFiltersForm.renderPage(searchParams,event)}onSubmitHandler(event){if(event.preventDefault(),!(this.hasAttribute("data-defer-filter-submit")&&this.isDeferredFacetField(event.target)))if(event.srcElement.className=="mobile-facets__checkbox"){const searchParams=this.createSearchParams(event.target.closest("form"));this.onSubmitForm(searchParams,event)}else this.onSubmitForm(FacetFiltersForm.mergeFacetFormSearchParams(),event)}onActiveFilterClick(event){event.preventDefault(),FacetFiltersForm.toggleActiveFacets();const url=event.currentTarget.href.indexOf("?")==-1?"":event.currentTarget.href.slice(event.currentTarget.href.indexOf("?")+1);FacetFiltersForm.renderPage(url)}}FacetFiltersForm.filterData=[],FacetFiltersForm.searchParamsInitial=window.location.search.slice(1),FacetFiltersForm.searchParamsPrev=window.location.search.slice(1),customElements.define("facet-filters-form",FacetFiltersForm),FacetFiltersForm.setListeners();class PriceRange extends HTMLElement{constructor(){super(),this.querySelectorAll("input").forEach(element=>element.addEventListener("change",this.onRangeChange.bind(this))),this.setMinAndMaxValues()}onRangeChange(event){this.adjustToValidValues(event.currentTarget),this.setMinAndMaxValues()}setMinAndMaxValues(){const inputs=this.querySelectorAll("input"),minInput=inputs[0],maxInput=inputs[1];maxInput.value&&minInput.setAttribute("max",maxInput.value),minInput.value&&maxInput.setAttribute("min",minInput.value),minInput.value===""&&maxInput.setAttribute("min",0),maxInput.value===""&&minInput.setAttribute("max",maxInput.getAttribute("max"))}adjustToValidValues(input){const value=Number(input.value),min=Number(input.getAttribute("min")),max=Number(input.getAttribute("max"));value<min&&(input.value=min),value>max&&(input.value=max)}}customElements.define("price-range",PriceRange);class FacetRemove extends HTMLElement{constructor(){super();const facetLink=this.querySelector("a");facetLink.setAttribute("role","button"),facetLink.addEventListener("click",this.closeFilter.bind(this)),facetLink.addEventListener("keyup",event=>{event.preventDefault(),event.code.toUpperCase()==="SPACE"&&this.closeFilter(event)})}closeFilter(event){event.preventDefault(),(this.closest("facet-filters-form")||document.querySelector("facet-filters-form")).onActiveFilterClick(event)}}customElements.define("facet-remove",FacetRemove);
2//# sourceMappingURL=/cdn/shop/t/59/assets/facets.js.map?v=37846301351938516081780086807

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.