PageSourceSearch

https://www.spovcr.cz/assets/components/Filters/Filters-3YfFFEu.js

js spovcr.cz collected 2026-10-09 17:10:55 UTC 13,957 bytes, 1 lines download raw bytes

1import{Datepicker}from"vanillajs-datepicker";import List from"list.js";export class IndexTableFilter{static DEBOUNCE_TIME=300;constructor(e){if(!e)throw new Error("Tabulator instance is required.");if(this.table=e,this.tableId=this.table.element.id,this.STORAGE_KEY=`filters_${this.tableId}`,this.filterRootSelector=`#${this.tableId.replace("_table","")}`,this.filterRootElement=document.querySelector(this.filterRootSelector),!this.filterRootElement)throw new Error(`Filter root element not found: ${this.filterRootSelector}`);this.searchContainer=this.filterRootElement.querySelector("[data-filter-query]"),this.filterGroups=this.filterRootElement.querySelectorAll("[data-filter-id]"),this.clearButtons=[...this.filterRootElement.querySelectorAll("[data-filter-clear]"),...this.filterRootElement.querySelectorAll(".Filters-FilterPill--clearButton")],this.searchContainer&&(this.searchField=this.searchContainer.querySelector(".form-search"),this.searchFieldTypes=(this.searchContainer.dataset.filterType||"like").split("|"),this.searchFieldNames=(this.searchContainer.dataset.filterField||"").split("|")),this.compare={"=":(e,t)=>this.normalize(e)===this.normalize(t),"!=":(e,t)=>this.normalize(e)!==this.normalize(t),"<":(e,t)=>this.normalize(e)<this.normalize(t),"<=":(e,t)=>this.normalize(e)<=this.normalize(t),">":(e,t)=>this.normalize(e)>this.normalize(t),">=":(e,t)=>this.normalize(e)>=this.normalize(t),like:(e,t)=>String(e??"").toLowerCase().includes(String(t??"").toLowerCase())},this.initOriginalData(),this.initEventListeners(),this.setFilterPanelHeightVariable(),this.restoreFilters(),this.initTabListeners(),this.initListSearch(),this.initForceRefreshListener()}initForceRefreshListener(){this.table.element.addEventListener("forceFilterRefresh",()=>{this.applyFilters()})}initOriginalData(){this.table.options.dataTree&&(!this.table.options.dataOriginal||!this.table.options.dataOriginal.length)&&(this.table.options.dataOriginal=this.table.getData("all"))}initEventListeners(){this.searchField&&this.searchField.addEventListener("input",IndexTableFilter.debounce(()=>{this.applyFilters(),this.saveFilters()},IndexTableFilter.DEBOUNCE_TIME)),this.filterGroups.forEach(e=>{const t=this.getFilterInputs(e);t.forEach(t=>{t.addEventListener("input",IndexTableFilter.debounce(()=>{this.applyFilters(),this.updateFilterButtonText(e),this.saveFilters()},IndexTableFilter.DEBOUNCE_TIME)),t.classList.contains("form-control")&&t.addEventListener("blur",IndexTableFilter.debounce(()=>{this.applyFilters(),this.updateFilterButtonText(e),this.saveFilters()},IndexTableFilter.DEBOUNCE_TIME))}),this.bindClearButtonEvent(e)}),this.clearButtons.forEach(e=>{e.addEventListener("click",e=>{this.clearFilterGroup(e.target.closest("[data-filter-id]")),this.saveFilters(),this.applyFilters()})}),this.filterRootElement.querySelector("[data-filter-expanded]")?.addEventListener("click",e=>{const t=e.currentTarget,n=(t.getAttribute("data-filter-expanded")!=="true").toString();t.setAttribute("data-filter-expanded",n),requestAnimationFrame(()=>{this.setFilterPanelHeightVariable(),n==="true"&&this.filterRootElement.querySelector(".Filters__SearchField input.form-search")?.focus()})})}initTabListeners(){const e=this.filterRootElement.querySelectorAll("[data-view]");e.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.view;try{if(t){const n=JSON.parse(t),s=this.table.getFilters();IndexTableFilter.areEqual(n,s)||(this.filterGroups.forEach(e=>{this.clearFilterGroup(e)}),this.applySavedFilters(n),this.saveFilters(),this.updateActiveTab(e))}}catch(e){console.error("Invalid JSON in data-view:",t,e)}})})}initFilterResetButton(){const e=this.filterRootElement.querySelector("[data-filter-reset]");if(!e)return;e.addEventListener("click",()=>{const e=this.getCurrentFilters(),t=this.setActiveTabFromFilters(e);t||this.applyDefaultTabFilter(),this.filterRootElement.querySelector("[data-filter-expanded]")?.setAttribute("data-filter-expanded","false")})}initListSearch(){this.filterGroups.forEach(e=>{const t=e.querySelector(".ChoiceList__Choices");if(t){const s=e.dataset.filterId;if(!s)return;if(t.dataset.listInitialized)return;var n={listClass:"ChoiceList__Choices",searchClass:"form-control",valueNames:["form-check-label"]};new List(s,n),t.dataset.listInitialized=!0}})}
1bindClearButtonEvent(e){const s=e.dataset.filterId,n=this.filterRootElement.querySelector(`[popovertarget="${s}"]`);if(!n)return;const t=n.nextElementSibling;t&&t.classList.contains("Filters-FilterPill--clearButton")&&t.addEventListener("click",()=>{this.clearFilterGroup(e),this.applyFilters(),this.saveFilters()})}restoreFilters(){let e=null;this.initFilterResetButton();try{const t=sessionStorage.getItem(this.STORAGE_KEY);t&&(e=JSON.parse(t))}catch(e){console.error("Error restoring filters:",e)}if(e?.length||(e=this.table.options.initialFilter),e?.length){this.applySavedFilters(e),this.saveFilters();const t=this.setActiveTabFromFilters(e);t||this.filterRootElement.querySelector("[data-filter-expanded]")?.setAttribute("data-filter-expanded","true");return}this.applyDefaultTabFilter()}applySavedFilters(e){e.forEach(e=>{e[0].search!==0[0]?this.searchField&&(this.searchField.value=e[0].value):e.forEach(e=>{const t=this.filterRootElement.querySelector(`[data-filter-field="${e.field}"]`);if(t){if(e.type==="rangeDate"){const o=t.querySelector("[data-daterangepicker]"),i=t.querySelector("input[name='from']"),a=t.querySelector("input[name='to']"),n=isNaN(Number(e.value[0]))?null:Number(e.value[0]),s=isNaN(Number(e.value[1]))?null:Number(e.value[1]),r=!isNaN(n)&&n>0?new Date(n*1e3):null,c=!isNaN(s)&&s>0?new Date(s*1e3):null;o?.rangepicker?o.rangepicker.setDates(r??{clear:!0},c??{clear:!0}):(i&&(i.value=n>0?n:""),a&&(a.value=s>0?s:""))}else{const n=this.getFilterInputs(t);n.forEach(t=>{Array.isArray(e.value)?e.value.includes(t.value)&&(t.checked=!0,t.selected=!0):e.value===t.value&&(t.checked=!0,t.selected=!0)})}this.updateFilterButtonText(t)}})}),this.applyFilters(),this.saveFilters(),this.setActiveTabFromFilters(e)}applyFilters(){let e=[];
1if(this.searchField&&this.searchField.value.trim()!==""&&this.searchFieldNames?.length){const t=this.searchField.value.trim(),n=this.searchFieldNames.map((e,n)=>({field:e,type:this.searchFieldTypes[n]||this.searchFieldTypes[0]||"like",value:t,search:!0}));e.push(n)}this.filterGroups.forEach(t=>{const n=this.processFilterGroup(t);n&&e.push(n)});const t=this.table.getFilters();if(!IndexTableFilter.areEqual(e,t))if(e.length>0)if(this.table.options.dataTree){let t=this.table.options.dataOriginal;this.table.setFilter(this.filterTree,e);let n=this.filterTreeArray(t,e);const s=e.some(e=>Array.isArray(e)&&e.some(e=>e.search===!0)),o=new CustomEvent("annotateTreeData",{bubbles:!0,detail:{data:n,expandAll:s}});this.table.element.dispatchEvent(o)}else this.table.setFilter(e);else if(this.table.clearFilter(),this.table.options.dataTree){let e=this.table.options.dataOriginal;const t=new CustomEvent("annotateTreeData",{bubbles:!0,detail:{data:e}});this.table.element.dispatchEvent(t)}return e}filterTreeData=(e,t)=>{const a=(e,t)=>t.split(".").reduce((e,t)=>e&&e[t],e),n=this.table?.options?.dataTreeChildField||"children";let o=!1;const r=(e,t)=>{const n=this.compare[t.type];if(!n)return!1;const i=a(e,t.field),s=n(i,t.value);return t.search&&s&&(o=!0),s},c=(e,t)=>t.some(t=>r(e,t)),l=e=>t.every(t=>c(e,t)),d=Array.isArray(e[n])?e[n]:[],s=d.map(e=>this.filterTreeData(e,t)).filter(Boolean),i=l(e);if(i||s.length){const t={...e};return i&&o&&(t.exactMatch=!0),s.length?t[n]=s:delete t[n],t}return null};filterTreeArray=(e,t)=>{const s=e.find(e=>e.id==="id0"),o=e.filter(e=>e.id!=="id0"),n=o.map(e=>this.filterTreeData(e,t)).filter(Boolean);return n.length===0?[]:s?[s,...n]:n};filterTree=()=>!0;saveFilters(){const t=this.getCurrentFilters(),e=t.filter(e=>!Array.isArray(e)||!e.some(e=>e.search===!0));e.length?sessionStorage.setItem(this.STORAGE_KEY,JSON.stringify(e)):sessionStorage.removeItem(this.STORAGE_KEY)}processFilterGroup(e){const{field:s,type:t}=this.getFilterGroupData(e);let n=[];if(t==="rangeDate"){const[o,i]=this.getRangeDateValues(e);(o||i)&&n.push({field:s,type:t,value:[o,i]})}else if(t==="rangeNumber"){const[o,i]=this.getRangeNumberValues(e);(o||i)&&n.push({field:s,type:t,value:[o,i]})}else{const o=this.getSelectedInputs(e);o.forEach(e=>n.push({field:s,type:t,value:e.value}))}return n.length>0?n:null}getCurrentFilters(){let e=[];
1if(this.searchField&&this.searchField.value.trim()!==""&&this.searchFieldNames?.length){const t=this.searchField.value.trim(),n=this.searchFieldNames.map((e,n)=>({field:e,type:this.searchFieldTypes[n]||this.searchFieldTypes[0]||"like",value:t,search:!0}));e.push(n)}return this.filterGroups.forEach(t=>{const n=this.processFilterGroup(t);n&&e.push(n)}),e}clearAllFilters(){sessionStorage.removeItem(this.STORAGE_KEY),this.filterGroups.forEach(e=>{this.clearFilterGroup(e)}),this.searchField&&(this.searchField.value=""),this.saveFilters()}clearFilterGroup(e){if(!e)return;const{type:t}=this.getFilterGroupData(e);if(t==="rangeDate"){const t=e.querySelector("[data-daterangepicker]");t?.rangepicker&&t.rangepicker.setDates({clear:!0},{clear:!0})}const n=this.getFilterInputs(e);n.forEach(e=>{e.type==="checkbox"||e.type==="radio"?e.checked=!1:e.tagName==="SELECT"?e.selectedIndex=0:e.value=""}),this.updateFilterButtonText(e)}updateFilterButtonText(e){const n=e.dataset.filterId,t=this.filterRootElement.querySelector(`[popovertarget="${n}"]`);if(!t)return;const s=this.getFilterButtonText(e,t);this.setFilterButtonText(t,s)}setFilterButtonText(e,t){const o=e.dataset.filterDefault||"Filtr",n=e.querySelector(".Filters-FilterPill__Label .Text--root.Text--bodySm"),s=e.closest(".Filters-FilterPill__FilterButton");n&&(n.textContent=t),s&&s.classList.toggle("Filters-FilterPill__ActiveFilterButton",t!==o)}updateActiveTab(e){const t=this.filterRootElement.querySelectorAll("[data-view]");t.forEach(e=>{e.classList.remove("Tabs__Tab--active"),e.setAttribute("aria-selected","false")}),e.classList.add("Tabs__Tab--active"),e.setAttribute("aria-selected","true")}setActiveTabFromFilters(e){const t=this.filterRootElement.querySelectorAll("[data-view]");for(const n of t)try{const t=JSON.parse(n.dataset.view);if(IndexTableFilter.areEqual(t,e))return this.updateActiveTab(n),!0}catch(e){console.error("Invalid JSON in data-view:",n.dataset.view,e)}return!1}applyDefaultTabFilter(){const e=this.filterRootElement.querySelector("[data-tab-default]");if(e){const t=e.dataset.view;try{const e=JSON.parse(t),n=this.table.getFilters();IndexTableFilter.areEqual(e,n)||(this.clearAllFilters(),this.applySavedFilters(e)),this.setActiveTabFromFilters(e)}catch(e){console.error("Chyba při parsování výchozího filtru ze záložky:",e)}}else this.clearAllFilters()}getFilterInputs(e){return e.querySelectorAll("input, select")}getSelectedInputs(e){return e.querySelectorAll("input:checked, select option:checked")}getFilterGroupData(e){return{field:e.dataset.filterField,type:e.dataset.filterType||"="}}getRangeNumberValues(e){const t=e.querySelector("input[data-range-number='from']"),n=e.querySelector("input[data-range-number='to']"),s=!!t?.value&&Number(t.value),o=!!n?.value&&Number(n.value);return[s,o]}getRangeDateValues(e){const o=e.querySelector("input[data-range-date='from']"),i=e.querySelector("input[data-range-date='to']"),a=e.querySelector("[data-daterangepicker]"),t="d. m. yyyy";let n,s;if(a?.rangepicker){const e=a.rangepicker.getDates(t);n=!!e[0]&&Datepicker.parseDate(e[0],t)/1e3,s=!!e[1]&&Datepicker.parseDate(e[1],t)/1e3}else n=!!o?.value&&Number(o.value),s=!!i?.value&&Number(i.value);return[n,s]}getFilterButtonText(e,t){const{type:s}=this.getFilterGroupData(e),n=t.dataset.filterDefault||"Filtr",o=this.hasActiveFilters(e);if(!o)return n;if(s==="rangeDate"){{const[t,s]=this.getRangeDateValues(e);if(t||s){const o=[],i=e.querySelector("input[data-range-date='from']"),a=e.querySelector("input[data-range-date='to']"),r=i?this.getLabelForInput(i):"od",c=a?this.getLabelForInput(a):"do";return t&&o.push(`${r} ${Datepicker.formatDate(new Date(t*1e3),"d. m. yyyy")}`),s&&o.push(`${c} ${Datepicker.formatDate(new Date(s*1e3),"d. m. yyyy")}`),`${n}: ${o.join(" ")}`}}}else if(s==="rangeNumber"){{const[t,s]=this.getRangeNumberValues(e);if(t||s){const o=[],i=e.querySelector("input[data-range-number='from']"),a=e.querySelector("input[data-range-number='to']"),r=i?this.getLabelForInput(i):"od",c=a?this.getLabelForInput(a):"do";return t&&o.push(`${r} ${t}`),s&&o.push(`${c} ${s}`),`${n}: ${o.join(" ")}`}}}else{const t=[],s=this.getSelectedInputs(e);if(s.forEach(n=>{const s=e.querySelector(`label[for="${n.id}"]`);
1s&&t.push(s.textContent.trim())}),t.length>0)return`${n}: ${t.join(", ")}`}return n}hasActiveFilters(e){const{type:t}=this.getFilterGroupData(e);if(t==="rangeDate"){const[t,n]=this.getRangeDateValues(e);return t||n}if(t==="rangeNumber"){const[t,n]=this.getRangeNumberValues(e);return t||n}return this.getSelectedInputs(e).length>0}getLabelForInput(e){if(!e.id)return"";const t=this.filterRootElement.querySelector(`label[for="${e.id}"] .Text--root`);return t?t.textContent.trim().toLowerCase():""}setFilterPanelHeightVariable(){const e=this.filterRootElement.querySelector(".Filters__FiltersWrapper"),t=this.filterRootElement.querySelector(".Filters__FiltersInner");if(e&&t){const n=t.offsetHeight;e.style.setProperty("--filters-height",`${n}px`)}}normalize(e){if(e==null)return"";if(typeof e=="number")return e;const t=Number(e);return!isNaN(t)&&e!==""?t:String(e).toLowerCase()}static debounce(e,t){let n;return function(...s){clearTimeout(n),n=setTimeout(()=>e.apply(this,s),t)}}static areEqual(e,t){if(e===t)return!0;if(typeof e!==typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((e,n)=>IndexTableFilter.areEqual(e,t[n]));if(typeof e=="object"&&e!==null&&t!==null){const n=Object.keys(e),s=Object.keys(t);return n.length===s.length&&n.every(n=>IndexTableFilter.areEqual(e[n],t[n]))}return!1}}

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.