1class FiltersUIController{constructor(e,t={}){this.element="string"==typeof e?document.querySelector(e):e,this.element?(this.activeDropdowns=new Set,this.options=t,this.init()):console.warn("FiltersUIController: No valid element provided")}init(){this.modal=document.querySelector(".filters-modal"),this.setupToolbar(),this.setupModal(),this.renderActiveFilters()}getFilterParams(){const e=new Set;return[this.element,this.modal].forEach(t=>{t?.querySelectorAll("[data-filter-param]").forEach(t=>e.add(t.dataset.filterParam))}),Array.from(e)}getParamValues(e,t){return(e.get(t)||"").split(",").filter(Boolean)}setParamValues(e,t,a){a.length>0?e.searchParams.set(t,a.join(",")):e.searchParams.delete(t)}getActiveFilters(){const e=new URLSearchParams(window.location.search),t=[];return this.getFilterParams().forEach(a=>{this.getParamValues(e,a).forEach(e=>{t.push({paramName:a,value:e})})}),t}buildToggleUrl(e,t,a){const r=new URL(window.location.href);r.searchParams.delete("page");const l=this.getParamValues(r.searchParams,e).filter(e=>e!==t);return a&&l.push(t),this.setParamValues(r,e,l),r.pathname+r.search}buildFilterUrl(e=null,t=null){const a=new URL(window.location.href);return a.searchParams.delete("page"),this.getFilterParams().forEach(r=>{if(null!==e&&r!==e)return;const l=this.getParamValues(a.searchParams,r).filter(e=>null!==t&&e!==t);this.setParamValues(a,r,l)}),a.pathname+a.search}buildModalUrl(){const e=new URL(window.location.href);return e.searchParams.delete("page"),this.modal.querySelectorAll(".filters-modal__section[data-filter-param]").forEach(t=>{const a=Array.from(t.querySelectorAll('input[type="checkbox"]:checked')).map(e=>e.value);this.setParamValues(e,t.dataset.filterParam,a)}),this.modal.querySelectorAll(".filters-ui__toggle").forEach(t=>{const a=this.isTogglePressed(t)?[t.dataset.filterValue]:[];this.setParamValues(e,t.dataset.filterParam,a)}),e.pathname+e.search}setupToolbar(){this.element.querySelectorAll(".filters-ui__dropdown").forEach(e=>{e.addEventListener("click",e=>this.handleDropdownClick(e))}),this.element.querySelectorAll(".filters-ui__toggle").forEach(e=>{e.addEventListener("click",()=>{window.location.href=this.buildToggleUrl(e.dataset.filterParam,e.dataset.filterValue,!this.isTogglePressed(e))})});const e=this.element.querySelector(".filters-ui__mobile-trigger");e&&e.addEventListener("click",()=>this.openModal()),document.addEventListener("click",e=>this.handleDocumentClick(e))}handleDropdownClick(e){e.stopPropagation();const t=e.currentTarget,a=t.dataset.filterType;this.closeAllDropdowns();const r=this.getOrCreateMenu(a);this.activeDropdowns.has(a)?this.closeDropdown(t,r,a):this.openDropdown(t,r,a)}handleDocumentClick(e){e.target.closest(".filters-ui__dropdown-wrapper")||this.closeAllDropdowns()}openDropdown(e,t,a){t.classList.add("active"),this.activeDropdowns.add(a),e.setAttribute("aria-expanded","true"),e.classList.add("open")}closeDropdown(e,t,a){t.classList.remove("active"),this.activeDropdowns.delete(a),e.setAttribute("aria-expanded","false"),e.classList.remove("open")}closeAllDropdowns(){const e=this.element.querySelectorAll(".filters-ui__dropdown"),t=this.element.querySelectorAll(".filters-ui__dropdown-menu");e.forEach(e=>{e.setAttribute("aria-expanded","false"),e.classList.remove("open")}),t.forEach(e=>{e.classList.remove("active")}),this.activeDropdowns.clear()}getOrCreateMenu(e){let t=this.element.querySelector(`.filters-ui__dropdown-menu[data-filter-type="${e}"]`);return t||(t=this.createMenu(e)),t}createMenu(e){const t=this.element.querySelector(`.filters-ui__dropdown[data-filter-type="${e}"]`),a=t?.dataset.filterParam,r=document.createElement("div");r.className="filters-ui__dropdown-menu",r.dataset.filterType=e,r.setAttribute("role","listbox");const l=document.createElement("input");l.className="filters-ui__dropdown-search",l.id=`searchbar--${e}`,l.placeholder="Hledat...",l.autocomplete="off",l.addEventListener("input",this.handleSearchInput),r.appendChild(l),r.appendChild(this.createOptionsContainer(e,a));const s=t?.closest(".filters-ui__dropdown-wrapper");return s&&s.appendChild(r),r}setupModal(){this.modal&&(this.modal.querySelector(".filters-modal__close-btn")?.addEventListener("click",()=>this.modal.close()),this.modal.addEventListener("close",()=>{document.documentElement.classList.remove("hide-overflow")}),this.modal.querySelector(".filters-modal__form")?.addEventListener("submit",e=>{e.preventDefault(),window.location.href=this.buildModalUrl()}
1),this.modal.querySelectorAll(".filters-ui__toggle").forEach(e=>{e.addEventListener("click",()=>{this.setTogglePressed(e,!this.isTogglePressed(e))})}),this.modal.querySelectorAll(".filters-modal__section-toggle").forEach(e=>{e.addEventListener("click",()=>{const t=e.closest(".filters-modal__section").classList.toggle("open");e.setAttribute("aria-expanded",t)})}),this.populateModalSections())}openModal(){this.modal&&(this.modal.showModal(),document.documentElement.classList.add("hide-overflow"))}populateModalSections(){const e=new URLSearchParams(window.location.search);this.modal.querySelectorAll(".filters-modal__section").forEach(t=>{const a=t.dataset.filterType,r=t.dataset.filterParam,l=t.querySelector(".filters-modal__section-body");if(l&&r){if(this.getParamValues(e,r).length>0&&t.classList.add("has-active"),"true"===t.dataset.optionsSearch){const e=document.createElement("input");e.className="filters-ui__dropdown-search",e.id=`searchbar-modal--${a}`,e.placeholder="Hledat...",e.autocomplete="off",e.addEventListener("input",this.handleSearchInput),l.appendChild(e)}l.appendChild(this.createOptionsContainer(a,r,{navigate:!1}))}})}createOptionsContainer(e,t,{navigate:a=!0}={}){const r=new URLSearchParams(window.location.search),l=t?this.getParamValues(r,t):[],s=document.createElement("div");return s.className="filters-ui__dropdown-menu-options",this.getMenuOptions(e).forEach(e=>{const r=document.createElement("label");r.className="filters-ui__checkbox-label";const i=document.createElement("input");i.type="checkbox",i.className="filters-ui__checkbox",i.value=e.value,i.checked=l.includes(e.value),a&&t&&i.addEventListener("change",()=>{window.location.href=this.buildToggleUrl(t,e.value,i.checked)}),r.appendChild(i),r.appendChild(document.createTextNode(e.label)),s.appendChild(r)}),s}getMenuOptions(e){return(this.options[e]||[]).map(e=>"string"==typeof e?{value:e,label:e}:e)}isTogglePressed(e){return"true"===e.getAttribute("aria-pressed")}setTogglePressed(e,t){e.setAttribute("aria-pressed",t),e.classList.toggle("active",t)}getFilterLabel(e,t){const a=this.element.querySelector(`[data-filter-param="${e}"]`)||this.modal?.querySelector(`[data-filter-param="${e}"]`);if(a?.dataset.filterLabel)return a.dataset.filterLabel;const r=a?.dataset.filterType,l=r?this.getMenuOptions(r).find(e=>e.value===t):null;return l?l.label:t}createTagLink({paramName:e,value:t}){const a=this.getFilterLabel(e,t),r=document.createElement("a");return r.className="filters-ui__tag",r.href=this.buildFilterUrl(e,t),r.title=`Zrušit filtr ${a}`,r.innerHTML='\n <span class="filters-ui__tag-label"></span>\n <span class="filters-ui__tag-remove">\n <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path d="M1 1L13 13M13 1L1 13" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>\n </svg>\n </span>\n ',r.querySelector(".filters-ui__tag-label").textContent=a,r}renderActiveFilters(){const e=this.getActiveFilters(),t=this.buildFilterUrl();[this.element,this.modal].forEach(t=>{t?.querySelectorAll(".filters-ui__toggle").forEach(t=>{this.setTogglePressed(t,e.some(e=>e.paramName===t.dataset.filterParam&&e.value===t.dataset.filterValue))})});const a=this.element.querySelector(".filters-ui__tags");a&&e.forEach(e=>a.appendChild(this.createTagLink(e))),this.element.querySelectorAll(".filters-ui__dropdown[data-filter-param]").forEach(t=>{const a=e.filter(e=>e.paramName===t.dataset.filterParam).length;if(a>0){const e=document.createElement("span");e.className="filters-ui__dropdown-count",e.textContent=a,t.querySelector(".filters-ui__dropdown-label")?.after(e)}});const r=this.element.querySelector(".filters-ui__reset");r&&(r.href=t,r.hidden=0===e.length);const l=this.element.querySelector(".filters-ui__mobile-trigger-count");l&&(l.textContent=e.length>0?`(${e.length})`:"");const s=this.modal?.querySelector(".filters-modal__active");if(!s||0===e.length)return;const i=s.querySelector(".filters-modal__tags");i&&e.forEach(e=>i.appendChild(this.createTagLink(e)));const o=s.querySelector(".filters-modal__reset");o&&(o.href=t),s.hidden=!1}handleSearchInput(e){const t=e=>e.trim().toLowerCase().normalize("NFD").replace(/\p{Diacritic}/gu,""),a=t(e.target.value),r=e.target.closest(".filters-ui__dropdown-menu, .filters-modal__section-body"),l=r.querySelectorAll(".filters-ui__checkbox-label");let s=!1;
1l.forEach(e=>{t(e.textContent).indexOf(a)>-1?(e.style.display="",s=!0):e.style.display="none",r.setAttribute("data-results",s)})}}
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.