{"version":3,"file":"catalog.js","sources":["../../../../../Flow.Showcase.Static.Bundler/Root/entrypoints/catalog.ts"],"sourcesContent":["// @ts-nocheck\n\nimport { SortSelect } from \"@root/modules/sort-select.module.ts\";\nimport eventBus from \"../modules/event-bus.module.ts\";\n\nconst errorContainer = document.getElementById(\"error-message\");\nif (errorContainer) {\n errorContainer.style.display = \"none\";\n\n // Отобразить ошибку\n eventBus.subscribe(\"update-cart-error\", ({ error }) => {\n errorContainer.textContent = error;\n errorContainer.style.display = \"block\";\n setTimeout(() => {\n errorContainer.style.display = \"none\";\n }, 5000);\n });\n}\n\nconst filterTooltipContainer = document.querySelector(\n \".js-filter-tooltip-container\",\n);\nif (filterTooltipContainer instanceof HTMLElement) {\n try {\n const filterTooltip =\n /** @type {HTMLElement} */ document.querySelector(\n \".js-filter-tooltip\",\n );\n\n // Применить фильтры\n const tooltipApplyBtn =\n /** @type {HTMLElement} */ filterTooltip.querySelector(\n \".js-filter-tooltip-apply\",\n );\n tooltipApplyBtn.addEventListener(\"click\", () => {\n hideFilterTooltip();\n loadProducts();\n });\n\n // Закрыть тултип\n const tooltipCloseBtn =\n /** @type {HTMLElement} */ filterTooltip.querySelector(\n \".js-filter-tooltip-close\",\n );\n tooltipCloseBtn.addEventListener(\"click\", () => {\n hideFilterTooltip();\n });\n\n const rootStyle = getComputedStyle(document.documentElement);\n\n // Показать тултип при нажатии на чекбокс\n document\n .querySelectorAll(\".js-filter-list .js-filter-list__item\")\n .forEach((listItem) => {\n const checkbox =\n /** @type {HTMLInputElement} */ listItem.querySelector(\n 'input[type=\"checkbox\"]',\n );\n checkbox.addEventListener(\"click\", () => {\n // Не показывать тултип в мобильной версии\n if (rootStyle.getPropertyValue(\"--mobile\") === \"true\") {\n return;\n }\n\n window.addEventListener(\"resize\", hideFilterTooltip);\n filterTooltipContainer.hidden = false;\n const parent = getOffsetParent(filterTooltipContainer);\n const listItemRect = listItem.getBoundingClientRect();\n const parentRect = parent.getBoundingClientRect();\n const left = listItemRect.left - parentRect.left;\n const top = listItemRect.top - parentRect.top;\n filterTooltipContainer.style.left = left + \"px\";\n filterTooltipContainer.style.top = top + \"px\";\n filterTooltipContainer.style.width =\n listItemRect.width + \"px\";\n filterTooltipContainer.style.height =\n listItemRect.height + \"px\";\n });\n });\n } catch (error) {\n console.error(error);\n }\n}\n\nfunction hideFilterTooltip() {\n if (filterTooltipContainer instanceof HTMLElement) {\n filterTooltipContainer.hidden = true;\n window.removeEventListener(\"resize\", hideFilterTooltip);\n }\n}\n\n/**\n * Получить родительский элемент, относительно которого происходит позиционирование.\n * Если такой элемент отсутствует, возвращается documentElement.\n * @param {HTMLElement} el\n * @returns\n */\nfunction getOffsetParent(el) {\n if (el.offsetParent === null) {\n throw new Error(\"offsetParent === null\");\n }\n if (\n el.offsetParent === document.body &&\n window.getComputedStyle(el.offsetParent).position === \"static\"\n ) {\n return document.documentElement;\n }\n return el.offsetParent;\n}\n\n// Обработка выбора минимальной и максимальной цены\n/** @type {number} */\nlet priceMin = NaN;\n/** @type {number} */\nlet priceMax = NaN;\n/** @type {Element | null} */\nlet priceFromInput;\n/** @type {Element | null} */\nlet priceToInput;\nconst priceFilter = document.querySelector(\"#price .js-price-range\");\nif (priceFilter instanceof HTMLElement) {\n priceMin = parseFloat(priceFilter.dataset.priceMin || \"\");\n priceMax = parseFloat(priceFilter.dataset.priceMax || \"\");\n priceFromInput = priceFilter.querySelector(\"input.js-price-from\");\n if (priceFromInput) {\n priceFromInput.addEventListener(\"keydown\", priceRangeChangeHandler);\n }\n priceToInput = priceFilter.querySelector(\"input.js-price-to\");\n if (priceToInput) {\n priceToInput.addEventListener(\"keydown\", priceRangeChangeHandler);\n }\n}\nif (!Number.isFinite(priceMin)) {\n priceMin = 0;\n}\nif (!Number.isFinite(priceMax)) {\n priceMax = Infinity;\n}\n\nfunction priceRangeChangeHandler(event) {\n if (event.key === \"Enter\") {\n loadProducts(true);\n }\n}\n\n// Обработка нажатия кнопки Применить\nconst applyButton = document.querySelector(\".js-filter-apply\");\nif (applyButton instanceof HTMLButtonElement) {\n applyButton.addEventListener(\"click\", () => loadProducts());\n}\n\n// Обработка нажатия кнопки Сбросить фильтры\nconst clearButton = document.querySelector(\".js-filter-clear\");\nif (clearButton instanceof HTMLButtonElement) {\n clearButton.addEventListener(\"click\", () => clearFilters());\n}\n\n//Загрузка отфильтрованных продуктов\nfunction loadProducts(applyPriceRange = false) {\n const filters = [];\n const urlParams = new URLSearchParams(window.location.search);\n\n // Поиск\n if (window.location.pathname.includes(\"search\")) {\n const searchQuery = urlParams.get(\"search\");\n filters.push(`search=${searchQuery}`);\n }\n\n // Бренды\n const brandCheckboxes = document.querySelectorAll(\n '#brands-list input[type=\"checkbox\"]:checked',\n );\n const brandFilterValues = Array.from(brandCheckboxes).map((checkbox) =>\n checkbox instanceof HTMLElement ? checkbox.dataset.id : \"\",\n );\n brandFilterValues.forEach((value) => {\n if (!value) return;\n\n filters.push(`brand-filter=${value}`);\n });\n\n // Производители\n const manufacturerCheckboxes = document.querySelectorAll(\n '#manufacturers-list input[type=\"checkbox\"]:checked',\n );\n const manufacturerFilterValues = Array.from(manufacturerCheckboxes).map(\n (checkbox) =>\n checkbox instanceof HTMLElement ? checkbox.dataset.id : \"\",\n );\n manufacturerFilterValues.forEach((value) => {\n if (!value) return;\n\n filters.push(`manufacturer-filter=${value}`);\n });\n\n // Цена\n if (applyPriceRange) {\n let priceFrom = NaN;\n if (priceFromInput instanceof HTMLInputElement) {\n priceFrom = priceFromInput.valueAsNumber;\n }\n let priceTo = NaN;\n if (priceToInput instanceof HTMLInputElement) {\n priceTo = priceToInput.valueAsNumber;\n }\n priceTo = clamp(priceTo, priceMin, priceMax);\n priceFrom = clamp(priceFrom, priceMin, priceTo);\n if (Number.isFinite(priceFrom)) {\n filters.push(`price-min=${priceFrom.toFixed(2)}`);\n }\n if (Number.isFinite(priceTo)) {\n filters.push(`price-max=${priceTo.toFixed(2)}`);\n }\n }\n\n // Варианты\n const variantsFilters = document.querySelectorAll(\n \".js-variants-filter-list\",\n );\n const keysObj = {};\n variantsFilters.forEach((filter) => {\n if (!(filter instanceof HTMLElement)) {\n return;\n }\n const key = filter.dataset.id;\n const checkboxes = filter.querySelectorAll(\n 'input[type=\"checkbox\"]:checked',\n );\n const values = Array.from(checkboxes).map((checkbox) =>\n checkbox instanceof HTMLElement ? checkbox.dataset.id : \"\",\n );\n if (values.length > 0) {\n keysObj[key] = values;\n }\n });\n if (Object.keys(keysObj).length > 0) {\n filters.push(`keys=${encodeURI(JSON.stringify(keysObj))}`);\n }\n\n // Пагинация\n if (urlParams.has(\"page\")) {\n filters.push(`page=${urlParams.get(\"page\")}`);\n }\n if (urlParams.has(\"limit\")) {\n filters.push(`limit=${urlParams.get(\"limit\")}`);\n }\n\n window.location.search = filters.join(\"&\");\n}\n\n/**\n * Убрать все query параметры, кроме поиска и пагинации\n */\nfunction clearFilters() {\n const filters = [];\n const urlParams = new URLSearchParams(window.location.search);\n\n // Поиск\n if (window.location.pathname.includes(\"search\")) {\n const searchQuery = urlParams.get(\"search\");\n filters.push(`search=${searchQuery}`);\n }\n\n // Пагинация\n if (urlParams.has(\"page\")) {\n filters.push(`page=${urlParams.get(\"page\")}`);\n }\n if (urlParams.has(\"limit\")) {\n filters.push(`limit=${urlParams.get(\"limit\")}`);\n }\n\n window.location.search = filters.join(\"&\");\n}\n\n/**\n * @param {number} value\n * @param {number} min\n * @param {number} max\n */\nfunction clamp(value, min, max) {\n if (value > max) {\n value = max;\n }\n if (value < min) {\n value = min;\n }\n return value;\n}\n\nSortSelect(document.querySelector(\"[data-catalog-sort]\"));\n"],"names":["errorContainer","eventBus","error","filterTooltipContainer","filterTooltip","hideFilterTooltip","loadProducts","rootStyle","listItem","parent","getOffsetParent","listItemRect","parentRect","left","top","el","priceMin","priceMax","priceFromInput","priceToInput","priceFilter","priceRangeChangeHandler","event","applyButton","clearButton","clearFilters","applyPriceRange","filters","urlParams","searchQuery","brandCheckboxes","checkbox","value","manufacturerCheckboxes","priceFrom","priceTo","clamp","variantsFilters","keysObj","filter","key","checkboxes","values","min","max","SortSelect"],"mappings":"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"}