PageSourceSearch

https://justemoi.co.uk/cdn/shop/t/20/assets/qf-custom-filter.js?v=29911146530577672171781609559

js justemoi.co.uk collected 2026-10-08 20:12:19 UTC 17,225 bytes, 19 lines download raw bytes

1class QFCustomFilter{constructor(settings={}){this.container=settings.container?settings.container:"post-container",this.item=settings.item?settings.item:"post",this.itemID=settings.itemID?settings.itemID:"data-post-id",this.noPosts=settings.noPosts?settings.noPosts:"custom-filter-no-posts",this.loadMore=settings.loadMore?settings.loadMore:"custom-filter-load-more",this.filterContainer=settings.filterContainer?settings.filterContainer:"filter-container",this.sortContainer=settings.sortContainer?settings.sortContainer:"sort-container",this.selectedFiltersContainer=settings.selectedFiltersContainer?settings.selectedFiltersContainer:"selected-filters-wrapper",this.containerEl=document.querySelector(`.${this.container}`),this.loadMoreEl=document.querySelector(`.${this.loadMore}`),this.noPostsEl=document.querySelector(`.${this.noPosts}`),this.filterContainerEl=document.querySelector(`.${this.filterContainer}`),this.sortContainerEl=document.querySelector(`.${this.sortContainer}`),this.selectedFiltersContainerEl=document.querySelector(`.${this.selectedFiltersContainer}`),this.postData=settings.postData?settings.postData:{},this.filterSettings=settings.filterSettings?settings.filterSettings:{},this.postsToShow=settings.postsToShow?settings.postsToShow:12,this.loadMoretoShow=settings.loadMoretoShow?settings.loadMoretoShow:this.postsToShow,this.buildFilters=settings.buildFilters!="false",this.ignoreFilters=settings.ignoreFilters?settings.ignoreFilters:[],this.defaultMinPrice=0,this.defaultMaxPrice=Number.MAX_SAFE_INTEGER,this.minPrice=this.defaultMinPrice,this.maxPrice=this.defaultMaxPrice,this.filterOptions={},this.allPostHtml={},this.currentPostHtml={},this.allowedSortMethods=["default","title_asc","title_dsc","published_at_asc","published_at_dsc","price_asc","price_dsc"],this.selectedFilters=[],this.sortMethod="default",this.#init()}#init(){window.log("postData:",this.postData),this.#buildAdditionalElements(),this.#storePostHtml(),this.buildFilters&&this.#buildFilters(),this.#urlFilters(),this.#setUpListeners(),this.showPosts(),this.showSelectedFilters();let wrapper=document.getElementById("qf-filter-wrapper");wrapper.style.overflow="unset",wrapper.style.maxHeight="unset"}#buildAdditionalElements(){if(!this.containerEl)return window.log(`%cQFCustomFilter: ERROR - No element with class ${this.container} found. Please ensure the element exists.`,"color: red; background: black; padding: 6px;"),!1;this.loadMoreEl||(window.log(`%cQFCustomFilter: WARNING - No element with class ${this.loadMore} found. All posts will be shown be default.`,"color: orange; background: linear-gradient(45deg, rgba(28,87,126,1) 0%, rgba(70,54,122,1) 100%); padding: 6px;"),this.postsToShow=Number.MAX_SAFE_INTEGER),this.noPostsEl?this.noPostsEl.style.display="none":window.log(`%cQFCustomFilter: WARNING - No element with class ${this.noPosts} found. No message will be shown when search criteria returns no results.`,"color: orange; background: linear-gradient(45deg, rgba(28,87,126,1) 0%, rgba(70,54,122,1) 100%); padding: 6px;")}#storePostHtml(){let filter=this;document.querySelectorAll(`.${this.container} .${this.item}`).forEach((el,i)=>{let id=el.getAttribute(`${filter.itemID}`);filter.allPostHtml[id]=el}),this.currentPostHtml=this.allPostHtml,window.log(" test "),window.log("HTML:",this.currentPostHtml)}#buildFilters(){console.log("this file");let filter_html="";const total_ignore_length=this.ignoreFilters.length,filter_col_length=Object.keys(this.filterSettings).length-total_ignore_length;if(Object.keys(this.filterSettings).forEach((theme,i)=>{if(this.filterSettings[theme].length>1&&!this.ignoreFilters.includes(theme)){var labelTheme=theme.replace(/_/g," ");filter_html+=`
2                                <div class="custom-filter" data-theme="${theme}" style="display: flex; flex-direction: column">
3                                    <p class="filter-heading" style="text-transform: capitalize">
4                                        <span class="filter-heading-label">${labelTheme}</span>
5                                        <span class="close-custom-filter"></span>
6                                    </p>
7                                    <div class="custom-filter-checkboxes">
8                                `;let terms=this.filterSettings[theme].sort();
8theme=="shapes"&&console.log("this is the theme",theme,terms),terms.forEach(term=>{filter_html+=`
9                                    <div class="checkbox-group" data-term="${term}">
10                                        <input id="${theme}_${term}" type="checkbox" data-theme="${theme}" data-term="${term}" >
11                                        <span for="${theme}_${term}" class="">${term}</span>
12                                    </div>`}),filter_html+="</div></div>"}}),!this.filterContainerEl){let filterContainer=document.createElement("div");filterContainer.classList.add(this.filterContainer),this.containerEl.parentNode.insertBefore(filterContainer,this.containerEl),this.filterContainerEl=filterContainer}this.filterContainerEl.append(this.htmlToElement(filter_html)),this.filterContainerEl.classList.add(`filter-length-${filter_col_length}`);const typeLabel=document.querySelector('[data-theme="type"] .filter-heading-label');typeLabel&&(typeLabel.innerHTML=typeLabel.innerHTML.replace(typeLabel.innerHTML,"Category"));let category_filter=document.querySelector('[data-theme="type"]');if(category_filter){let filter_title=document.title.split("|");(filter_title[0].includes("Lingerie")||filter_title.includes("Nightwear")&&category_filter)&&(category_filter.style.display="none")}const vendorLabel=document.querySelector('[data-theme="vendor"] .filter-heading-label');vendorLabel&&(vendorLabel.innerHTML=vendorLabel.innerHTML.replace(vendorLabel.innerHTML,"Brand"));const collection_handle=document.querySelector("#collection-grid").dataset.collectionHandle,tagsLabel=document.querySelector('[data-theme="shapes"] .filter-heading-label');tagsLabel&&(tagsLabel.innerHTML=tagsLabel.innerHTML.replace(tagsLabel.innerHTML,"Style"),(collection_handle.includes("lingerie")||collection_handle.includes("new-arrivals")||collection_handle.includes("swimwear")||collection_handle.includes("nightwear"))&&(tagsLabel.innerHTML=tagsLabel.innerHTML.replace(tagsLabel.innerHTML,"Style")));const brandNull=document.querySelector('[data-theme="vendor"] [data-term="."]');brandNull&&brandNull.remove();const sizeNull=document.querySelector('[data-theme="size"] #size_undefined');sizeNull&&sizeNull.parentElement.remove()}#setUpListeners(){let filter=this;document.querySelectorAll(`.${this.filterContainer} input[type=checkbox]`).forEach(el=>{el.addEventListener("change",()=>{let checked=el.checked,theme=el.getAttribute("data-theme"),term=el.getAttribute("data-term");if(term.includes("Preference:")&&(term=term.replace("Preference:","")),window.log("THEME:",theme),window.log("TERM:",term),checked)filter.filterOptions.hasOwnProperty(theme)||(filter.filterOptions[theme]=[]),filter.filterOptions[theme].push(term),this.selectedFilters.push(term+":"+theme);else{let index=filter.filterOptions[theme].indexOf(term);index>-1&&filter.filterOptions[theme].splice(index,1),this.selectedFilters.indexOf(term+":"+theme)>-1&&this.selectedFilters.splice(index,1)}window.log("Filter Options:",filter.filterOptions),this.showSelectedFilters(),filter.showPosts(),filter.filterOptions[theme].length>0?(document.querySelector("#reset-filters").style.display="block",document.querySelector(`.custom-filter[data-theme="${theme}"]`).classList.add("is-active"),document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label`).innerHTML+='<span class="label-counter"></span>',document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label .label-counter`).innerHTML=`(${this.filterOptions[theme].length})`):(document.querySelector("#reset-filters").style.display="none",document.querySelector(`.custom-filter[data-theme="${theme}"]`).classList.remove("is-active"),document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label .label-counter`).remove())})}),document.querySelector(".openCollectionFilters").addEventListener("click",()=>{document.querySelector(".filter-container-wrapper").classList.add("active")}),document.querySelector(".desktop-close-filters").addEventListener("click",()=>{document.querySelector(".filter-container-wrapper").classList.remove("active")});let filterContainer=document.querySelectorAll(".custom-filter");if(document.addEventListener("click",event=>{filterContainer.forEach(el=>{let closeCustomFilter=el.querySelector(".filter-heading");const isClickInside=el.querySelector(".custom-filter-checkboxes").contains(event.target);closeCustomFilter.contains(event.target)?el.classList.toggle("hide"):isClickInside||el.classList.remove("hide")})}),this.loadMoreEl.addEventListener("click",()=>{filter.postsToShow+=filter.loadMoretoShow,filter.showPosts()}),this.sortContainerEl){let sort_select=document.querySelector(`.${this.sortContainer} select`);sort_select.addEventListener("change",()=>{let sortMethod=sort_select.value;this.allowedSortMethods.includes(sortMethod)?(this.sortMethod=sortMethod,filter.showPosts()):window.log(`${sortMethod} is not a vaild sort option`)});const changeSelected=value=>{sort_select.value=value;let sortMethod=sort_select.value;this.allowedSortMethods.includes(sortMethod)?(this.sortMethod=sortMethod,filter.showPosts()):window.log(`${sortMethod} is not a vaild sort option`)};let sortFilterLinks=document.querySelectorAll(".custom-filter-sort a");sortFilterLinks.forEach(link=>{link.addEventListener("click",e=>{let newValue=link.getAttribute("data-id");changeSelected(newValue),sortFilterLinks.forEach(el=>el.classList.remove("active")),link.classList.add("active"),link.parentElement.parentElement.classList.remove("hide")})})}let rangeInputs=document.querySelectorAll("#price-container .range-input input");
12rangeInputs.forEach(input=>{input.addEventListener("input",e=>{let minPrice=parseInt(rangeInputs[0].value),maxPrice=parseInt(rangeInputs[1].value);filter.minPrice=minPrice*100,filter.maxPrice=maxPrice*100})});let applyPriceMin=document.querySelector("#price-container .range-min"),applyPriceMax=document.querySelector("#price-container .range-max");applyPriceMin.addEventListener("change",()=>{filter.showPosts()}),applyPriceMax.addEventListener("change",()=>{filter.showPosts()}),document.querySelector("#reset-filters").addEventListener("click",()=>{document.querySelectorAll('input[type="checkbox"]:checked').forEach(el=>{el.click()}),console.log("Reset filter");let changeEvent=new Event("change"),sortSelect=document.querySelector(".custom-filter-sort select");sortSelect.value="default",sortSelect.dispatchEvent(changeEvent);let sortFilterLinks=document.querySelectorAll(".custom-filter-sort a");sortFilterLinks.forEach(link=>{sortFilterLinks.forEach(el=>el.classList.remove("active"))})})}showSelectedFilters(){this.selectedFiltersContainerEl.innerHTML="",this.selectedFilters.forEach(filter=>{let filter_term=filter.split(":")[0];this.selectedFiltersContainerEl.innerHTML+=`
13                <div class="selected-filter">
14                    ${filter_term}
15                    <svg data-term="${filter}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" fill="none" viewBox="0 0 18 17">
16                        <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor">
17                    </svg>
18                </div>`}),document.querySelectorAll(".selected-filter svg").forEach(selectedFilterTab=>{selectedFilterTab.addEventListener("click",e=>{let filter_name=selectedFilterTab.dataset.term,theme=filter_name.split(":")[1],term=filter_name.split(":")[0];document.querySelectorAll(`.custom-filter input[data-theme='${theme}']`).forEach(checkbox=>{if(checkbox.dataset.term===term){checkbox.checked=!1;let index=this.selectedFilters.indexOf(filter_name);index>-1&&this.selectedFilters.splice(index,1),selectedFilterTab.parentElement.remove();let event=new Event("change");checkbox.dispatchEvent(event)}})})})}#getPosts(){var filterOptionsCount=0;for(let key in this.filterOptions)filterOptionsCount+=this.filterOptions[key].length;return filterOptionsCount==0&&this.minPrice==this.defaultMinPrice&&this.maxPrice==this.defaultMaxPrice?this.allPostHtml:this.#filterPosts()}#filterPosts(){let filtered_posts=[];
18for(let key in this.postData)if(this.#inPriceRange(key)){let found=!0;for(let theme in this.postData[key]){let terms=this.postData[key][theme];if(this.filterOptions.hasOwnProperty(theme)&&this.filterOptions[theme].length>0&&(found=this.filterOptions[theme].some(el=>terms.indexOf(el)>=0)),!found)break}found&&filtered_posts.push(key)}window.log("FILTERED: ",filtered_posts,"Length: ",filtered_posts.length);let filteredPostHtml={};return filtered_posts.forEach(postId=>{filteredPostHtml[postId]=this.allPostHtml[postId]}),filteredPostHtml}#inPriceRange(product_id){let price=this.postData[product_id].price;return this.minPrice<=price&&price<=this.maxPrice}#urlFilters(){let queryString=window.location.search;if(queryString!=""){let queryParts=queryString.substring(1).split("&"),urlQuery={};queryParts.forEach(part=>{let themeQuery=part.split("="),searchTheme=themeQuery[0],searchTerms=themeQuery[1].split("+");searchTerms=searchTerms.map(term=>decodeURIComponent(term)),urlQuery[searchTheme]=searchTerms});for(let theme in this.filterSettings){let searchTerms=Object.keys(urlQuery).includes(theme)?urlQuery[theme]:null;searchTerms&&searchTerms.forEach(term=>{let termsForTheme=this.filterSettings[theme];if(window.log("term",term,termsForTheme),Object.values(termsForTheme).includes(term)){this.filterOptions[theme]||(this.filterOptions[theme]=[]),this.filterOptions[theme].push(term);let termInput=document.querySelector(`[data-theme="${theme}"][data-term="${term}"]`);termInput.checked=!0,this.selectedFilters.push(term+":"+theme),this.showSelectedFilters(),theme?(document.querySelector("#reset-filters").style.display="block",document.querySelector(`.custom-filter[data-theme="${theme}"]`).classList.add("is-active"),document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label`).innerHTML+='<span class="label-counter"></span>',document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label .label-counter`).innerHTML=`(${this.filterOptions[theme].length})`):(document.querySelector("#reset-filters").style.display="none",document.querySelector(`.custom-filter[data-theme="${theme}"]`).classList.remove("is-active"),document.querySelector(`.custom-filter[data-theme="${theme}"] .filter-heading-label .label-counter`).remove())}})}}}#setUrlParams(){if(Object.keys(this.filterOptions).length>0){let searchParams="?";for(let theme in this.filterOptions){searchParams=searchParams+`${theme}=`;let terms=this.filterOptions[theme];terms=terms.map(term=>encodeURIComponent(term)),terms=terms.join("+"),searchParams=searchParams+terms+"&"}searchParams=searchParams.substring(0,searchParams.length-1);var newurl=window.location.protocol+"//"+window.location.host+window.location.pathname+searchParams;window.history.pushState({path:newurl},"",newurl)}}showPosts(){window.log("SHOWING POSTS");let postHtml=this.#getPosts();this.currentPostHtml=postHtml,this.clearPosts();let postsAdded=0,i=0;if(this.sortMethod!="default"){let sortOrder=this.#sortPosts(postHtml);for(let i2=0;i2<sortOrder.length&&(this.containerEl.append(postHtml[sortOrder[i2]]),postsAdded++,!(postsAdded>=this.postsToShow));i2++);}else{let productIds=Object.keys(postHtml);for(let i2=0;i2<productIds.length&&(this.containerEl.append(postHtml[productIds[i2]]),postsAdded++,!(postsAdded>=this.postsToShow));i2++);}return postsAdded==0?this.noPostsEl.style.display="table":this.noPostsEl.style.display="none",Object.keys(postHtml).length<=this.postsToShow?this.loadMoreEl.style.display="none":this.loadMoreEl.style.display="table",this.#setUrlParams(),postHtml}#sortPosts(postHtml){let sortOrder=Object.keys(postHtml);switch(this.sortMethod){case"published_at_asc":sortOrder.sort((a,b)=>this.postData[a].published_at-this.postData[b].published_at);break;case"published_at_dsc":sortOrder.sort((a,b)=>this.postData[b].published_at-this.postData[a].published_at);break;case"price_asc":sortOrder.sort((a,b)=>this.postData[a].price-this.postData[b].price);break;case"price_dsc":sortOrder.sort((a,b)=>this.postData[b].price-this.postData[a].price);break;case"title_asc":sortOrder.sort((a,b)=>this.postData[a].title.localeCompare(this.postData[b].title));break;case"title_dsc":sortOrder.sort((a,b)=>this.postData[b].title.localeCompare(this.postData[a].title));break}return sortOrder}htmlToElement(html){var template=document.createElement("template");return html=html.trim(),template.innerHTML=html,template.content}clearPosts(){document.querySelectorAll(`.${this.container} .${this.item}`).forEach((el,i)=>{el.parentNode.removeChild(el)})}}
19//# sourceMappingURL=/cdn/shop/t/20/assets/qf-custom-filter.js.map?v=29911146530577672171781609559

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.