1// ТÐÐЬÐРФÐÐЬТРÐЦÐЯ ÐÐÐÐÐÐ 2(function() { 3 'use strict'; 4 5 // Ð¥ÑанилиÑе акÑивнÑÑ ÑилÑÑÑов 6 let activeFilters = new Set(); 7 8 // СÑÑлки на ÑлеменÑÑ 9 const chipsWrapper = document.getElementById('mapFilterChips'); 10 const filterPopup = document.querySelector('[data-popup="filter"]'); 11 const applyBtn = filterPopup?.querySelector('[data-btn-filter]'); 12 const resetBtns = filterPopup?.querySelectorAll('.popup-filter-reset'); 13 const filterCheckboxes = filterPopup?.querySelectorAll('input[type="checkbox"][data-filter]'); 14 15 // ФÑнкÑÐ¸Ñ ÑилÑÑÑаÑии клиник 16 function filterClinics() { 17 const clinicItems = document.querySelectorAll('.clinic-item'); 18 if (clinicItems.length === 0) return; 19 20 if (activeFilters.size === 0) { 21 clinicItems.forEach(item => item.style.display = ''); 22 updateChips(); 23 return; 24 } 25 26 clinicItems.forEach(item => { 27 const tags = item.dataset.tags ? JSON.parse(item.dataset.tags) : []; 28 const hasMatch = Array.from(activeFilters).some(filter => tags.includes(filter)); 29 item.style.display = hasMatch ? '' : 'none'; 30 }); 31 32 updateChips(); 33 } 34 35 // Ðбновление Ñипов 36 function updateChips() { 37 if (!chipsWrapper) return; 38 chipsWrapper.innerHTML = ''; 39 40 if (activeFilters.size === 0) return; 41 42 activeFilters.forEach(filter => { 43 const checkbox = document.querySelector(`input[data-filter="${filter}"]`); 44 const label = checkbox?.closest('.c-checkbox')?.querySelector('.c-checkbox-label'); 45 const labelText = label ? label.textContent.trim() : filter; 46 47 const chip = document.createElement('span'); 48 chip.className = 'chip';
49 chip.dataset.filter = filter; 50 chip.innerHTML = ` 51 ${labelText} 52 <button class="chip-remove btn-reset" data-filter="${filter}"> 53 <svg width="16" height="16" viewBox="0 0 16 16" fill="none"> 54 <path d="M12 4L4 12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/> 55 <path d="M4 4L12 12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/> 56 </svg> 57 </button> 58 `; 59 60 const removeBtn = chip.querySelector('.chip-remove'); 61 removeBtn.addEventListener('click', function(e) { 62 e.stopPropagation(); 63 const filterValue = this.dataset.filter; 64 removeFilter(filterValue); 65 }); 66 67 chipsWrapper.appendChild(chip); 68 }); 69 } 70 71 // Удаление ÑилÑÑÑа 72 function removeFilter(filter) { 73 if (!filter) return; 74 activeFilters.delete(filter); 75 const checkbox = document.querySelector(`input[data-filter="${filter}"]`); 76 if (checkbox) checkbox.checked = false; 77 applyFilters(); 78 } 79 80 // ÐÑименение ÑилÑÑÑов 81 function applyFilters() { 82 updateChips(); 83 filterClinics(); 84 85 // ÐбновлÑем каÑÑÑ ÐµÑли еÑÑÑ 86 if (typeof updateMapMarkers === 'function') { 87 updateMapMarkers(Array.from(activeFilters)); 88 } 89 } 90 91 // СбÑÐ¾Ñ Ð²ÑÐµÑ ÑилÑÑÑов 92 function resetFilters() { 93 activeFilters.clear(); 94 filterCheckboxes?.forEach(checkbox => checkbox.checked = false); 95 applyFilters(); 96 } 97 98 // ÐниÑиализаÑÐ¸Ñ ÑобÑÑий 99 function initFilter() { 100 // Ðнопка "ÐÑимениÑÑ ÑилÑÑÑÑ" 101 if (applyBtn) { 102 applyBtn.addEventListener('click', function(e) { 103 e.preventDefault(); 104 105 const checkedCheckboxes = filterPopup?.querySelectorAll('input[type="checkbox"][data-filter]:checked'); 106 const newFilters = new Set(); 107 108 checkedCheckboxes?.forEach(checkbox => { 109 const filter = checkbox.dataset.filter; 110 if (filter) newFilters.add(filter); 111 }); 112 113 activeFilters = newFilters; 114 applyFilters(); 115 }); 116 } 117 118 // Ðнопки "СбÑоÑиÑÑ" 119 resetBtns?.forEach(btn => { 120 btn.addEventListener('click', function(e) { 121 e.preventDefault(); 122 resetFilters(); 123 }); 124 }); 125 126 // ÐÑименÑем ÑилÑÑÑÑ Ð¿Ñи загÑÑзке 127 applyFilters(); 128 } 129 130 // ÐкÑпоÑÑиÑÑем ÑÑнкÑии 131 window.filterClinics = filterClinics; 132 window.applyFilters = applyFilters; 133 window.resetFilters = resetFilters; 134 window.removeFilter = removeFilter; 135 window.activeFilters = activeFilters; 136 137 // ÐниÑиализаÑÐ¸Ñ 138 if (document.readyState === 'loading') { 139 document.addEventListener('DOMContentLoaded', initFilter); 140 } else { 141 initFilter(); 142 } 143 144})();
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.