PageSourceSearch

https://polyclinika.ru/local/components/coweb/include.area/templates/map_v1/script.js

js polyclinika.ru collected 2026-09-28 12:37:46 UTC 4,543 bytes, 144 lines download raw bytes

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.