{"version":3,"file":"js/982-31907bfaa56dfe3070fe.js","mappings":"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","sources":["webpack://app/./app/javascript/components/ sync ^\\.\\/.*$","webpack://app/./app/javascript/components/CompareCategory.jsx","webpack://app/./app/javascript/components/CompareConstants.jsx","webpack://app/./app/javascript/components/CompareFilter.jsx","webpack://app/./app/javascript/components/CompareHelper.jsx","webpack://app/./app/javascript/components/CompareRoot.jsx","webpack://app/./app/javascript/components/CompareTable.jsx","webpack://app/./app/javascript/components/CompareTableCells.jsx","webpack://app/./app/javascript/components/CompareToggleDifferences.jsx","webpack://app/./app/javascript/components/CompareVariantNames.jsx"],"sourcesContent":["var map = {\n\t\"./CompareCategory\": 35594,\n\t\"./CompareCategory.jsx\": 35594,\n\t\"./CompareConstants\": 17850,\n\t\"./CompareConstants.jsx\": 17850,\n\t\"./CompareFilter\": 65420,\n\t\"./CompareFilter.jsx\": 65420,\n\t\"./CompareHelper\": 51036,\n\t\"./CompareHelper.jsx\": 51036,\n\t\"./CompareRoot\": 23821,\n\t\"./CompareRoot.jsx\": 23821,\n\t\"./CompareTable\": 80350,\n\t\"./CompareTable.jsx\": 80350,\n\t\"./CompareTableCells\": 81993,\n\t\"./CompareTableCells.jsx\": 81993,\n\t\"./CompareToggleDifferences\": 18404,\n\t\"./CompareToggleDifferences.jsx\": 18404,\n\t\"./CompareVariantNames\": 83086,\n\t\"./CompareVariantNames.jsx\": 83086\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 982;","import React from \"react\"\nimport CompareTableCells from './CompareTableCells'\nimport * as Constants from \"./CompareConstants\"\nimport classNames from \"classnames\"\n\n// Компонент для отрисовки блока с выбранными фильтрами и кнопки возврата в исходное состояние\n// @param key - идентификатор категории и подкатегории, соединённые точкой, пример: \"0.0\", \"1.3\"\n// @param category - объект категории, содержит ключи .name и .children\n// @param category_index - порядковый номер категории в массиве\n// @param visible_variants - видимые комплектации\n// @param variants - глобальный объект комплектаций\n// @param searchParams - объект GET-параметров, тип URLSearchParams\n// @param setParamsHandler - функция, для изменения GET-параметров\n// @param crossHovered - массив из двух элементов, ряд и номер ячейки на которую\n// наведён курсор мыши, для подстветки\n// @param setCrossHovered - функция, для изменения crossHovered\nexport default function CompareCategory (props) {\n const visible_children = props.category.children.filter(i => props.visible_variants.length < 2 || !i.hidden)\n const total_count = props.category.children.length\n const visible_count = visible_children.length\n const hidden_count = total_count - visible_count\n\n const expanded = props.searchParams.get(Constants.COLLAPSE_PARAM) & Math.pow(2, props.category_index)\n\n function toggleCategoryHandler(category_index) {\n props.setParamsHandler(prevParams => {\n const currentValue = prevParams.get(Constants.COLLAPSE_PARAM) || 0\n let new_value = 0\n if (currentValue & Math.pow(2, category_index)) {\n new_value = currentValue ^ Math.pow(2, category_index)\n }\n else {\n new_value = currentValue | Math.pow(2, category_index)\n }\n if (new_value > 0) {\n prevParams.set(Constants.COLLAPSE_PARAM, new_value)\n }\n else {\n prevParams.delete(Constants.COLLAPSE_PARAM)\n }\n return prevParams\n })\n }\n\n return [\n \n toggleCategoryHandler(props.category_index) : null}>\n
\n {props.category.name}\n {visible_children.length < props.category.children.length && \n <>\n \n {hidden_count > 0 && <>{hidden_count} {russianPlural(hidden_count, ...Constants.SAME_NAMES)} и }\n {visible_count > 0 && <>{visible_count} {russianPlural(hidden_count, ...Constants.DIFFERENT_NAMES)} опций из }\n {total_count}\n \n {expanded? Constants.COLLAPSE_TEXT: Constants.EXPAND_TEXT}\n \n }\n
\n \n ,\n // В случае если характеристики \"развёрнуты\", то выводим все, но добавляем им класс compare-same\n // чтобы одинаковые значения были серенькими\n // Если не развёрнуты, то выводим все.\n ...(props.category.children).map((category_item, i) => {\n const class_names = classNames({\n \"sub-param\": true,\n \"compare-same\": expanded && category_item.hidden,\n \"hidden-row\": props.visible_variants.length > 1 && category_item.hidden && !expanded,\n \"cross-hover\": props.visible_variants.length > Constants.VERTICAL_CROSS_HOVER_MIN && props.crossHovered[0] == `${props.category_index}.${i}`\n })\n return (\n \n \n
{category_item.name}
\n \n \n \n )\n })\n ]\n}\n","// \"специальный\" параметр для галочки \"Показать отличия\", его название в URL.search\nexport const HIDESAME_PARAM = 'hidesame'\n// \"специальный\" параметр для скрытия комплектаций. Принимает цифровое значение\n// которое является битовой маской. Скрытие первой комплектации - первый бит справа 0b1 = 1,\n// скрытие второй комплектации - второй бит справа (0b10=2), скрытие и первой и второй\n// комплектации - первый и второй бит (0b11 = 3)\nexport const FILTER_VARIANTS_PARAM = 'filter_variants'\n// \"специальный\" параметр для разворачивания свёрнутых характеристик при включенной\n// галочке \"Показать отличия\", тоже работает как битовая маска\nexport const COLLAPSE_PARAM = 'collapse'\n\nexport const COMPLETIONS_NAMES = [\"комплектация\", \"комплектации\", \"комплектаций\"]\nexport const HIDDEN_NAMES = [\"скрыта\", \"скрыто\", \"скрыто\"]\nexport const SAME_NAMES = [\"одинаковая\", \"одинаковых\", \"одинаковых\"]\nexport const DIFFERENT_NAMES = [\"разная\", \"разных\", \"разных\"]\n\nexport const COLLAPSE_TEXT = \"свернуть ▴\"\nexport const EXPAND_TEXT = \"развернуть ▾\"\n\nexport const VERTICAL_CROSS_HOVER_MIN = 2","import React from \"react\"\nimport * as Constants from \"./CompareConstants\"\n\n// Компонент для отрисовки блока с выбранными фильтрами и кнопки возврата в исходное состояние\n// @param variants - глобальный объект комплектаций\n// @param searchParams - объект GET-параметров, тип URLSearchParams\n// @param setParamsHandler - функция, для изменения GET-параметров\nexport default function CompareFilter (props) {\n const overall_count = props.variants.list.length\n const hidden_count = props.variants.list.filter(v => v.hidden).length\n const visible_count = overall_count - hidden_count\n\n function resetFilterHandler(e) {\n e.preventDefault()\n props.setParamsHandler(prevParams => {\n [...prevParams.entries()].forEach(([key, value]) => prevParams.delete(key))\n return prevParams\n })\n }\n\n function filterClickHandler(event, item) {\n event.preventDefault()\n props.setParamsHandler(prevParams => {\n prevParams.delete(item.param)\n return prevParams\n })\n }\n\n function getFilterNames(key, value) {\n const value_name = Object.keys(props.variants.urlparams).find(k => props.variants.urlparams[k] === value)\n const key_name = Object.keys(props.variants.urlparams).find(k => props.variants.urlparams[k] === key)\n\n let name = value_name\n let full_name = key_name + ': ' + value_name\n\n if (key == 'filter_variants') {\n const hidden_variants_count = parseInt(value).toString(2).match(/1/g).length\n name = `- ${hidden_variants_count} ${russianPlural(hidden_count, ...Constants.COMPLETIONS_NAMES)}`\n full_name = 'Скрытые комплектации'\n }\n else if (value == 'yes') {\n // это чекбокс\n name = key_name\n full_name = key_name + ': есть'\n }\n else if (value == 'no') {\n // это чекбокс\n name = key_name\n full_name = key_name + ': нет'\n }\n\n return [name, full_name]\n }\n const base_url = location.href.split('?')[0]\n\n let filter_items = [...props.searchParams.entries()].map(([key, value]) => {\n if (key == 'hidesame' || key == 'collapse') return null\n const [name, full_name] = getFilterNames(key, value)\n // Для каждого элемента фильтра нужно сгенерировать ссылку, при открытии которой\n // будет такой же фильтр, но без параметра этого элемента\n const target_params = new URLSearchParams(props.searchParams.toString())\n target_params.delete(key)\n const target_params_string = target_params.toString()\n return {\n name: name,\n full_name: full_name,\n param: key,\n href: target_params_string.length > 0? '?' + target_params_string: base_url\n }\n }).filter(i => i)\n\n return (\n
\n
Всего: {overall_count} {\n hidden_count > 0\n ? <>\n  \n выбрано: {visible_count}\n   \n {russianPlural(hidden_count, ...Constants.HIDDEN_NAMES)}: {hidden_count}\n  \n {russianPlural(hidden_count, ...Constants.COMPLETIONS_NAMES)}\n \n : <>{russianPlural(overall_count, ...Constants.COMPLETIONS_NAMES)}\n }\n
\n {hidden_count > 0 && resetFilterHandler(e)}>вернуть скрытые}\n
\n { filter_items.length > 0 && Выбранные опции: }\n {\n filter_items.map(item => {\n return (\n filterClickHandler(e, item)}\n href={item.href}>\n {item.name}\n \n )\n })\n }\n
\n
\n )\n}","import * as Constants from \"./CompareConstants\"\nimport { useState } from \"react\"\n\n// Основная функция, помечает видимость комплектациям и отдельным характеристикам,\n// по которым затем реакт отрисовывает таблицу и производит манипуляции в DOM\n// @param variants - данные, полученные в JSON при отрисовке компонента CompareVehicle\n// @param searchParams - объект типа URLSearchParams, параметры текущего GET-запроса\nexport function updateVariantsData(variants, searchParams) {\n // Снимаем ограничение видимости со всех комплектаций\n variants.list.forEach(variant => {\n variant.hidden = false\n });\n\n // Скрытие комплектаций по битовой маске\n const filter_variants = searchParams.get(Constants.FILTER_VARIANTS_PARAM)\n if (filter_variants > 0) {\n variants.list.forEach((variant, index) => {\n if (filter_variants & Math.pow(2, index)) {\n variant.hidden = true\n }\n });\n }\n\n // Проходим по всем оставшимся значениям кроме \"специальных\"\n const rest_params = [...searchParams.entries()]\n .filter(item => [\n Constants.FILTER_VARIANTS_PARAM,\n Constants.HIDESAME_PARAM,\n Constants.COLLAPSE_PARAM].indexOf(item[0]) == -1\n )\n rest_params.map(([key, value]) => {\n variants.data.forEach(cat => {\n cat.children.forEach(cat_item => {\n if (variants.urlparams[cat_item.name] == key) {\n // Отфильтровываем все комплектации у которых значение отличается от выбранного в URL\n cat_item.children.forEach((item_value, variant_index) => {\n if (variants.urlparams[item_value] != value) {\n variants.list[variant_index].hidden = true\n }\n })\n }\n })\n })\n })\n\n if (searchParams.get(Constants.HIDESAME_PARAM)) {\n // Скрываем все характеристики где параметры одинаковые\n variants.data.forEach(cat => {\n cat.children.forEach(cat_item => {\n // Находим уникальные значения для всех видимых комплектаций\n if (_.unique(cat_item.children.filter((a, i) => !variants.list[i].hidden)).length == 1) {\n cat_item.hidden = true\n }\n else {\n cat_item.hidden = false\n }\n })\n })\n }\n else {\n // Возвращаем видимость всем характеристикам\n variants.data.forEach(cat => {\n cat.children.forEach(cat_item => {\n cat_item.hidden = false\n })\n })\n }\n\n return variants\n}\n\nexport function useControllerSearchParams(model_id, link) {\n let [searchParams, setSearchParams] = useState(() => new URLSearchParams(location.search))\n\n const stateMachineSetSearchParams = function(callback) {\n setSearchParams(prevParams => {\n // Необходимо создать новый объект URLSearchParams чтобы react видел что объект изменился\n const newParams = callback(new URLSearchParams(prevParams.toString()))\n\n if (window.stateMachine.compare) {\n let search = newParams.toString()\n window.stateMachine.pushState({model: model_id, compare: true}, link + (search.length > 0? '?' + search: ''))\n }\n return newParams\n })\n }\n if (!window.stateMachine.compare_set) {\n window.stateMachine.compare_set = setSearchParams\n }\n\n return [searchParams, stateMachineSetSearchParams]\n}","import React, { Suspense } from \"react\"\nimport { BrowserRouter as Router, Routes, Route } from \"react-router-dom\"\n\nconst CompareTable = React.lazy(() => import('./CompareTable'))\n\n// Базовый компонент для сравнения комплектаций\nexport default function CompareRoot (props) {\n return (\n \n \n {/*} />*/}\n
}>\n \n \n } />\n
\n
\n )\n}\n","import React, { useMemo, useState, useEffect } from \"react\"\nimport CompareFilter from './CompareFilter'\nimport CompareToggleDifferences from './CompareToggleDifferences'\nimport CompareVariantNames from './CompareVariantNames'\nimport CompareCategory from './CompareCategory'\nimport { updateVariantsData, useControllerSearchParams } from \"./CompareHelper\"\nimport classNames from \"classnames\"\nimport * as Constants from \"./CompareConstants\"\n\n// Компонент для прорисовки всей таблицы\n// @param variants - массив из комплектаций в виде {name: <название>, price: <цена>}\n// @param variants_data - массив из категорий характеристик в виде {name: <название>, children: <массив характеристик>}\n// @param urlparams - Hashmap из всех текстов (в ключах) и соответствие их SEO-написанию (в значениях)\n// @param model_id - ID модели в базе\n// @param model_name - название модели\nexport default function CompareTable (props) {\n // параметры из GET-запроса, а также callback для их дальнейшего изменения\n let [searchParams, setSearchParams] = useControllerSearchParams(props.model_id, props.link);\n\n // Состояние с текущими данными комплектаций и их характеристик, а также callback для их изменения\n let [variants, setVariants] = useState(\n // мы должны провести первоначальную обработку данных, чтобы текущий открытый URL\n // влиял на выводимые данные.\n // Далее состояние будет меняться при помощи setVariants(prev => ...)\n updateVariantsData(props, searchParams)\n )\n\n // Хука, которая следит за изменением состояния searchParams\n useEffect(() => {\n // здесь происходит \"магия\" - в зависимости от накликанных юзером параметров, мы меняем данные по комплектациям\n // и затем меняем состояние, в результате запускается рендер всего компонента и React меняет соответствующий HTML\n setVariants(prevVariants => updateVariantsData(prevVariants, searchParams));\n }, [searchParams])\n\n // Состояние для управления текущей подсвечиваемой строкой и столбцом, куда пользователь поставил курсор мыши\n let [crossHovered, setCrossHovered] = useState([null, null])\n\n const visible_variants = variants.list.filter((v) => !v.hidden)\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n {\n variants.list.map((variant, i) => {\n return (\n \n )\n })\n }\n \n \n\n \n {variants.data.map((category, category_index) => {\n return \n })}\n \n
\n

{props.model_name}

\n

{props.model_body}

\n
\n \n
\n \n Constants.VERTICAL_CROSS_HOVER_MIN && crossHovered[1] == i\n })}>\n {variant.price}\n
\n )\n}\n","import React from \"react\"\nimport classNames from \"classnames\"\n\n// Компонент для отрисовки ячеек таблицы со значениями характеристик\n// @param categoryKey - идентификатор категории и подкатегории\n// @param cells - список ячеек, массив\n// @param variants - глобальный объект комплектаций\n// @param visible_variants - видимые комплектации\n// @param propName - название характеристики, строка, например: \"Длина кузова\"\n// @param searchParams - объект GET-параметров, тип URLSearchParams\n// @param setParamsHandler - функция, для изменения GET-параметров\n// @param crossHovered - массив из двух элементов, ряд и номер ячейки на которую\n// наведён курсор мыши, для подстветки\n// @param setCrossHovered - функция, для изменения crossHovered\nexport default function CompareTableCells (props) {\n // Если есть различающиеся параметры у видимых комплектаций\n const may_click = _.unique(props.cells.filter((a, i) => !props.variants.list[i].hidden)).length > 1\n\n function onClickHandler(event, key, value) {\n event.stopPropagation()\n props.setParamsHandler(function(prevParams) {\n if (prevParams.get(key)) {\n prevParams.delete(key)\n }\n else {\n prevParams.set(key, value)\n }\n return prevParams\n })\n }\n\n function onMouseOverHandler(event, index) {\n props.setCrossHovered(prevHover => {\n return [props.categoryKey, index]\n })\n }\n\n return props.cells.map((item, i) => {\n const is_hidden = props.variants.list[i].hidden // эта комплектация скрыта\n const key = props.variants.urlparams[props.propName]\n const value = props.variants.urlparams[item]\n const is_checked = props.searchParams.get(key) == value\n return (\n 2\n })\n }\n key={i}\n title={may_click ? \"выбрать все с таким параметром\": \"\"}\n onClick={may_click? (e) => onClickHandler(e, key, value): null}\n onMouseOver={(e) => onMouseOverHandler(e, i)}\n >\n { may_click && \n // Чекбокс намеренно заведён под следующий элемент и некликабельный.\n // Отрисовка состояния чекбокса производится реактом.\n }\n
{item == ' '? '–': item}
\n \n )\n })\n}","import React from \"react\"\nimport {HIDESAME_PARAM} from './CompareConstants'\n\n// Компонент для отрисовки галочки \"Показать отличия\"\n// @param visible_variants - список всех выводимых комплектаций\n// @param value - текущее значение галочки, true/false\n// @param setParamsHandler - функция, для изменения GET-параметров\nexport default function CompareToggleDifferences (props) {\n function toggleHideSame(event) {\n props.setParamsHandler(function(prevParams) {\n if (event.target.checked) {\n prevParams.set(HIDESAME_PARAM, 1)\n }\n else {\n prevParams.delete(HIDESAME_PARAM)\n }\n return prevParams\n })\n return true\n }\n\n return (\n
\n
\n \n \n Показать отличия\n \n
\n
\n )\n}","import React from \"react\"\nimport * as Constants from \"./CompareConstants\"\nimport classNames from \"classnames\"\n\n// Компонент для отрисовки заголовка таблицы с названиями комплектаций\n// у каждой комплектации есть галочка, которая скроет эту комплектацию в таблице\n// @param visible_variants - видимые комплектации\n// @param variants - глобальный объект комплектаций\n// @param setParamsHandler - функция, для изменения GET-параметров\n// @param crossHovered - массив из двух элементов, ряд и номер ячейки на которую\n// наведён курсор мыши, для подстветки\nexport default function CompareVariantNames (props) {\n function optOutVariantHandler(event, variant) {\n event.preventDefault()\n const variant_index = props.variants.list.indexOf(variant)\n\n props.setParamsHandler(prevParams => {\n const current_value = prevParams.get(Constants.FILTER_VARIANTS_PARAM) || 0\n prevParams.set(Constants.FILTER_VARIANTS_PARAM, current_value | Math.pow(2, variant_index))\n return prevParams\n })\n }\n\n function onClickHandler(event, variant) {\n window.stateMachine.pushState({model: props.variants.model_id, variant: variant.id, tab: \"\"}, decodeURI(variant.link))\n event.preventDefault()\n }\n\n return props.variants.list.map((variant, i) => {\n return Constants.VERTICAL_CROSS_HOVER_MIN && props.crossHovered[1] == i\n })}>\n onClickHandler(e, variant)}>{variant.name}\n {props.visible_variants.length > 1 && optOutVariantHandler(e, variant)}>×}\n \n })\n}"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","CompareCategory","props","visible_children","category","children","filter","i","visible_variants","length","hidden","total_count","visible_count","hidden_count","expanded","searchParams","get","Constants","Math","pow","category_index","key","name","className","colSpan","variants","list","onClick","toggleCategoryHandler","setParamsHandler","prevParams","currentValue","new_value","set","delete","russianPlural","category_item","class_names","classNames","crossHovered","categoryKey","cells","propName","setCrossHovered","HIDESAME_PARAM","FILTER_VARIANTS_PARAM","COLLAPSE_PARAM","COMPLETIONS_NAMES","HIDDEN_NAMES","SAME_NAMES","DIFFERENT_NAMES","COLLAPSE_TEXT","EXPAND_TEXT","VERTICAL_CROSS_HOVER_MIN","CompareFilter","overall_count","v","base_url","location","href","split","filter_items","entries","value","full_name","value_name","urlparams","find","k","key_name","parseInt","toString","match","getFilterNames","target_params","URLSearchParams","target_params_string","param","preventDefault","forEach","resetFilterHandler","item","title","event","filterClickHandler","updateVariantsData","variant","filter_variants","index","indexOf","data","cat","cat_item","item_value","variant_index","_","unique","a","useControllerSearchParams","model_id","link","setSearchParams","useState","search","window","stateMachine","compare_set","callback","newParams","compare","pushState","model","CompareTable","React","CompareRoot","path","element","Suspense","fallback","setVariants","useEffect","prevVariants","rowSpan","width","model_name","model_body","price","CompareTableCells","may_click","is_hidden","is_checked","stopPropagation","onClickHandler","onMouseOver","onMouseOverHandler","prevHover","type","checked","readOnly","CompareToggleDifferences","disabled","onChange","target","htmlFor","CompareVariantNames","tab","decodeURI","current_value","optOutVariantHandler"],"sourceRoot":""}