window.fsAttributes = window.fsAttributes || []; window.fsAttributes.push(["cmsfilter", (filterInstance) => { // Основные компоненты const [cmsFilter] = filterInstance; const listComponent = cmsFilter.listInstance; // Языковые настройки const currentLanguage = (document.documentElement.lang || "en").split("-")[0].toLowerCase(); const languageStrings = { en: { fromWord: "from", toWord: "to", locale: "en-US", priceRequest: "Price on Request" }, ru: { fromWord: "от", toWord: "до", locale: "ru-RU", priceRequest: "Цена по запросу" }, ar: { fromWord: "من", toWord: "إلى", locale: "en-US", priceRequest: "السعر عند الطلب" } }; const activeLanguage = languageStrings[currentLanguage] || languageStrings.en; const priceRequestText = activeLanguage.priceRequest; const priceInputId = "real-from"; const tagListSelector = '[fs-cmsfilter-element="tag-list"]'; console.log(`CMS Filter Initialized. Language: ${currentLanguage}`); // Элементы интерфейса const allFiltersMarker = document.querySelector("[data-all-filters-marker]"); // Управление видимостью элементов const updateElementsVisibility = () => { setTimeout(() => { // Элементы, скрываемые на мобильных document.querySelectorAll('[data-hide-el="true"]').forEach(element => { if (window.innerWidth < 767) { element.style.display = "none"; } else { element.style.display = cmsFilter.filtersActive ? "flex" : "none"; } }); // Элементы, скрываемые на всех разрешениях document.querySelectorAll('[data-hide-el="all-breakpoints"]').forEach(element => { element.style.display = cmsFilter.filtersActive ? "flex" : "none"; }); // Маркер активных фильтров if (allFiltersMarker) { allFiltersMarker.style.opacity = cmsFilter.filtersActive ? "1" : "0"; } }, 150); }; updateElementsVisibility(); // Форматирование чисел const formatNumber = (value) => { if (!value || value.includes("--")) return "0"; const numericValue = parseFloat(value.replace(/[^0-9.]/g, "")); return isNaN(numericValue) ? "0" : numericValue.toLocaleString(activeLanguage.locale); }; // Форматирование текста тегов фильтров const formatFilterTag = (tagElement) => { const originalText = tagElement.textContent.trim(); if (originalText === priceRequestText) return; const hasLanguageMarker = originalText.includes(activeLanguage.fromWord) || originalText.includes("from") || originalText.includes("от") || originalText.includes("من"); const isBracketFormat = originalText.startsWith("[") && originalText.endsWith("]"); const hasOnlyNumbers = !/[^0-9\s,.]/.test(originalText); if (hasLanguageMarker || !(isBracketFormat || hasOnlyNumbers)) return; // Обработка диапазона [x, y] const rangeMatch = originalText.match(/\[\s*(.*?)\s*,\s*(.*?)\s*\]/); if (rangeMatch) { const fromValue = formatNumber(rangeMatch[1]); const toValue = formatNumber(rangeMatch[2]); tagElement.textContent = `${activeLanguage.fromWord} ${fromValue} ${activeLanguage.toWord} ${toValue}`; return; } // Обработка одиночного числа if (/\d/.test(originalText)) { const singleValue = formatNumber(originalText); tagElement.textContent = `${activeLanguage.fromWord} ${singleValue}`; } }; // Наблюдение за новыми тегами const tagContainer = document.querySelector(tagListSelector) || document.body; const tagObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { // Обработка добавленных узлов mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { if (node.classList.contains("filter_tags_text")) { formatFilterTag(node); } else { node.querySelectorAll(".filter_tags_text").forEach(formatFilterTag); } } }); // Обработка изменений текста if (mutation.type === "characterData" || mutation.type === "childList") { let targetNode = mutation.target; if (targetNode.nodeType === 3) { targetNode = targetNode.parentNode; } if (targetNode.classList && targetNode.classList.contains("filter_tags_text")) { formatFilterTag(targetNode); } } }); }); tagObserver.observe(tagContainer, { childList: true, subtree: true, characterData: true }); // Форматирование существующих тегов document.querySelectorAll(".filter_tags_text").forEach(formatFilterTag); // Шаблон для тега "Цена по запросу" const priceRequestTagTemplate = `