Advertisement
akozhomka

JS (themes/redesign/custom-js/filters-helper.js)

Feb 23rd, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. document.querySelector(document).addEventListener('ready', function () {
  2.     document.querySelector(document).addEventListener('change', '.filter-label>input', (event) => {
  3.         document.querySelector('#filters-box_second_page_title').removeClass('is-show-only');
  4.         let checkedElement = document.querySelector('.filter__list:visible').querySelector('input:checkbox:checked');
  5.  
  6.         if (checkedElement.length > 0) {
  7.             document.querySelector('.reset-all-btn').removeClass('filter-btn_clear_noactive');
  8.         } else {
  9.             document.querySelector('.reset-all-btn').classList.add('filter-btn_clear_noactive');
  10.         }
  11.  
  12.         document.querySelector(event.currentTarget).classList.toggle('modifier');
  13.     });
  14. });
  15.  
  16. function applySearchFilter(e) {
  17.     let block = document.querySelector(e).closest('.filter'),
  18.         searchQuery = block.querySelector('.filter-search-input').value,
  19.         values = block.querySelector('li.filter-checkbox'),
  20.         notFindBlock = block.querySelector('.search-not-find');
  21.  
  22.     block.classList.add('filter-search-enabled');
  23.     block.classList.add('filter_show-all');
  24.     notFindBlock.remove();
  25.  
  26.     if (!searchQuery) {
  27.         block.removeClass('filter-search-enabled');
  28.         block.querySelector('.hidden-filter-value').each((key, value) => {
  29.             document.querySelector(value).removeClass('hidden-filter-value');
  30.         });
  31.  
  32.         return;
  33.     }
  34.  
  35.     searchQuery = searchQuery.toLowerCase();
  36.     block.querySelector('.filter-show-all')
  37.         .classList.add('filter-show-all_active')
  38.         .text(Yii.t('app', 'filters.hide'));
  39.  
  40.     /** Функция проверки - начинается с query или содержит символ+query */
  41.     let checkCondition = (text, query) => {
  42.         return (new RegExp('^' + query + '|[^A-ZА-Я]' + query, 'ig')).test(text);
  43.     };
  44.  
  45.     if (checkElements(values, searchQuery, checkCondition)) {
  46.         return;
  47.     }
  48.  
  49.     /** Функция проверки - содержит запрос */
  50.     let partialCheckCondition = (text, query) => {
  51.         return text.toLowerCase().indexOf(query) !== -1;
  52.     };
  53.  
  54.     if (checkElements(values, searchQuery, partialCheckCondition)) {
  55.         return;
  56.     }
  57.  
  58.     let translitSearchQuery = changeFilterLayout(searchQuery);
  59.  
  60.     if (checkElements(values, translitSearchQuery, checkCondition, searchQuery)) {
  61.         return;
  62.     }
  63.  
  64.     if (checkElements(values, translitSearchQuery, partialCheckCondition, searchQuery)) {
  65.         return;
  66.     }
  67.  
  68.     if (checkElements(values, false, partialCheckCondition, translitSearchQuery)) {
  69.         return;
  70.     }
  71.  
  72.     notFindBlock = '<div class="search-not-find">' + Yii.t('app', 'filter_search.not_found') + '</div>'
  73.     block.querySelector('.filter__list').insertAdjacentHTML("beforeend",notFindBlock);
  74. }
  75.  
  76. function checkElements(elements, searchQuery, checkCondition, translitSearchQuery) {
  77.     let successSearch = false;
  78.     elements.each((key, elem) => {
  79.         let valueElement = document.querySelector(elem),
  80.             input = valueElement.querySelector('.filter-label input'),
  81.             text = input.attr('data-value-text'),
  82.             translit = input.attr('data-value-translit');
  83.         if (searchQuery && checkCondition(text, searchQuery)) {
  84.             successSearch = true;
  85.             valueElement.removeClass('hidden-filter-value');
  86.  
  87.             return;
  88.         }
  89.  
  90.         if (
  91.             translit
  92.             && translitSearchQuery
  93.             && checkCondition(translit, translitSearchQuery.toLowerCase())
  94.         ) {
  95.             successSearch = true;
  96.             valueElement.removeClass('hidden-filter-value');
  97.  
  98.             return;
  99.         }
  100.  
  101.         valueElement.classList.add('hidden-filter-value');
  102.     });
  103.  
  104.     return successSearch;
  105. }
  106.  
  107. function changeFilterLayout(searchQuery) {
  108.     let regexp = /[а-яёї]/i;
  109.  
  110.     return regexp.test(searchQuery)
  111.         ? HLang.cyrillicToLatin(searchQuery)
  112.         : HLang.latinToCyrillic(searchQuery);
  113. }
  114.  
  115. // Возвращаем фильтры в начальное состояние
  116. function returnFilterState() {
  117.     document.querySelector('#filters-box_second_page_title').hide();
  118.     document.querySelector('.filter-show-all').hide();
  119.     document.querySelector('.filter-search-block').hide();
  120.     document.querySelector('.filter__title').css('display', 'flex').show();
  121.     document.querySelector('.filter.filter_close').removeClass('filter_close');
  122.     document.querySelector('.mobile-filter-item').show();
  123.     document.querySelector('.mobile-filter-item.mobile-filter-item_active').removeClass('mobile-filter-item_active');
  124.     document.querySelector('.filter__list').hide();
  125.     document.querySelector('.article-box').show();
  126.     document.querySelector('.filter').querySelector('.filter_selected_title').text('');
  127. }
  128.  
  129. // Переход ко второй странице фильтра
  130. function toggleFilterBox(target, onlyMobile) {
  131.     if (onlyMobile && !globalUI.isMobile) {
  132.         document.querySelector(target).parent().classList.toggle('filter_close');
  133.  
  134.         return;
  135.     }
  136.  
  137.     document.querySelector('.filter__title').hide();
  138.  
  139.     $.each(document.querySelector('.filter-show-all'), function () {
  140.         if (document.querySelector(this).closest('.filter').querySelector('.filter-checkbox').length > 8)
  141.             document.querySelector(this).show();
  142.         else
  143.             document.querySelector(this).hide();
  144.     });
  145.  
  146.     $.each(document.querySelector('.filter-search-block'), function () {
  147.         if (document.querySelector(this).closest('.filter').querySelector('.filter-checkbox').length > 8) {
  148.             document.querySelector(this).show();
  149.         } else {
  150.             document.querySelector(this).hide();
  151.         }
  152.     });
  153.  
  154.     document.querySelector('#filters-box_second_page_title')
  155.         .text(document.querySelector(target).attr('data-name'))
  156.         .show()
  157.     ;
  158.     document.querySelector('.reset-all-btn').classList.add('reset-checkbox-btn');
  159.     document.querySelector(target).parents('.mobile-filter-item')
  160.         .classList.add('mobile-filter-item_active')
  161.         .querySelector('.filter__list')
  162.         .show();
  163.  
  164.     document.querySelector('.mobile-filter-item').not('.mobile-filter-item_active').hide();
  165.     document.querySelector('.filter-accessories').hide();
  166.     document.querySelector('.article-box').hide();
  167.  
  168.     let filterList = document.querySelector(target).parents('.mobile-filter-item').querySelector('input[type="checkbox"]:checked');
  169.     // Если есть активный выбранный фильтр
  170.     if (filterList.length > 0 || document.querySelector('.filter-price-form').is(':visible')) {
  171.         document.querySelector('.filter-btn_clear').removeClass('filter-btn_clear_noactive');
  172.     }
  173. }
  174.  
  175. // Откат фильтров которые были выбраны, но не применены
  176. function rollbackModifierFilters() {
  177.     let modifierFilters = document.querySelector('.filter').querySelector('input.modifier[type="checkbox"]');
  178.  
  179.     $.each(modifierFilters, function (index, item) {
  180.         let element = document.querySelector(item);
  181.         element.removeClass('modifier');
  182.  
  183.         element.is(':checked')
  184.             ? element.prop('checked', false)
  185.             : element.prop('checked', true);
  186.     });
  187. }
  188.  
  189. // Установка видимых значений в списке значений фильтра выбора нескольких значений
  190. function setHiddenClassToListItems() {
  191.     $.each(document.querySelector('ul.filter_list_checkbox'), function () {
  192.         let checkedCount = document.querySelector(this).querySelector('input[type="checkbox"]:checked').length;
  193.         let notDisabledCount = document.querySelector(this).querySelector('input[type="checkbox"]')
  194.             .not(':disabled')
  195.             .not(':checked')
  196.             .length;
  197.  
  198.         let limitToVisibleNotCheckedItems = CHECK_BOX_FILTER_LIMIT - checkedCount;
  199.         let limitToVisibleDisabledItems = limitToVisibleNotCheckedItems - notDisabledCount;
  200.  
  201.         let visibleItems = 0;
  202.         $.each(document.querySelector(this).querySelector('input[type="checkbox"]'), function () {
  203.             let li = document.querySelector(this).parent().parent();
  204.             let hiddenClass = 'filter-checkbox_hidden';
  205.  
  206.             if (document.querySelector(this).attr('disabled') && !document.querySelector(this).prop('checked')) {
  207.                 if (limitToVisibleDisabledItems > 0 && visibleItems < CHECK_BOX_FILTER_LIMIT) {
  208.                     li.removeClass(hiddenClass);
  209.                     limitToVisibleDisabledItems--;
  210.                     visibleItems++;
  211.                 } else {
  212.                     li.classList.add(hiddenClass);
  213.                 }
  214.             } else if (!document.querySelector(this).prop('checked')) {
  215.                 if (limitToVisibleNotCheckedItems > 0 && visibleItems < CHECK_BOX_FILTER_LIMIT) {
  216.                     li.removeClass(hiddenClass);
  217.                     limitToVisibleNotCheckedItems--;
  218.                     visibleItems++;
  219.                 } else {
  220.                     li.classList.add(hiddenClass);
  221.                 }
  222.             } else if (visibleItems < CHECK_BOX_FILTER_LIMIT) {
  223.                 li.removeClass(hiddenClass);
  224.                 visibleItems++;
  225.             } else {
  226.                 li.classList.add(hiddenClass);
  227.             }
  228.         });
  229.     });
  230. }
  231.  
  232. // Активация стилей и построение элементов для фильтров выезжающего меню
  233. function setFilterState(onlyMobile) {
  234.     if (onlyMobile && !globalUI.isMobile) {
  235.         return;
  236.     }
  237.  
  238.     let filter = document.querySelector('.filter');
  239.     let selectedFilters = document.querySelector('.filter-checkbox > label > input:checked, .filter-popular-checkbox > label > input:checked');
  240.     filter.classList.add('mobile-filter-item');
  241.  
  242.     $.each(selectedFilters, function (index, item) {
  243.         let filterValue = document.querySelector(item).attr('data-value-text');
  244.         let currentValue = document.querySelector(item).closest('.mobile-filter-item')
  245.             .querySelector('.filter_selected_title');
  246.  
  247.         currentValue.text(currentValue.text() + filterValue + ', ');
  248.     });
  249.  
  250.     $.each(document.querySelector('.filter_selected_title'), function (index, item) {
  251.         let itemValue = document.querySelector(item).text();
  252.         document.querySelector(item).text(itemValue.slice(0, -2))
  253.     });
  254.  
  255.     $.each(document.querySelector('.filter-price-form'), function (index, item) {
  256.         let filterMinValue = document.querySelector(item).querySelector('.from');
  257.         let filterMaxValue = document.querySelector(item).querySelector('.to');
  258.  
  259.         let currentValue = document.querySelector(item).closest('.mobile-filter-item')
  260.             .querySelector('.filter_selected_title');
  261.  
  262.         currentValue.text(filterMinValue.value + '-' + filterMaxValue.value);
  263.     });
  264.  
  265.     document.querySelector('.filter__list').hide();
  266.  
  267.     let listItem = filter.querySelector('input[type="checkbox"]:checked');
  268.  
  269.     if (listItem.length > 0) {
  270.         document.querySelector('.reset-all-btn').removeClass('filter-btn_clear_noactive');
  271.     } else {
  272.         document.querySelector('.reset-all-btn').classList.add('filter-btn_clear_noactive');
  273.     }
  274. }
  275.  
  276. function checkVisibleArea(element) {
  277.     let rect = element.get(0).getBoundingClientRect();
  278.     let viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);
  279.     return !(rect.bottom < 0 || rect.top - viewHeight >= 0);
  280. }
  281.  
  282. function showAllFilters(target) {
  283.     if (!document.querySelector(target).classList.contains('filter-show-all_active')) {
  284.         document.querySelector(target).parent().classList.add('filter_show-all');
  285.         document.querySelector(target).classList.add('filter-show-all_active').text(Yii.t('app', 'filters.hide'));
  286.  
  287.         return;
  288.     }
  289.  
  290.     document.querySelector(target).parent().removeClass('filter_show-all');
  291.     let search = document.querySelector(target).parent().querySelector('.filter-search-input');
  292.     if (search.length) {
  293.         search.val('');
  294.     }
  295.  
  296.     document.querySelector(target).removeClass('filter-show-all_active').text(Yii.t('app', 'filters.show_all'));
  297.     if (!checkVisibleArea(document.querySelector(target).parent().querySelector('.filter__title'))) {
  298.         let position = document.querySelector('.filters').position().top + document.querySelector(target).parent().position().top;
  299.         document.documentElement.animate({scrollTop: position}, 0);
  300.     }
  301. }
  302.  
  303. function afterReturnAction(onlyMobile) {
  304.     returnFilterState();
  305.     setFilterState(onlyMobile);
  306.     document.querySelector('#filters-box_second_page_title').classList.add('is-show-only');
  307.  
  308.     let listItem = document.querySelector('.filter').querySelector('input[type="checkbox"]:checked');
  309.  
  310.     let resetBtn = document.querySelector('.reset-all-btn');
  311.     if (listItem.length > 0) {
  312.         resetBtn.removeClass('filter-btn_clear_noactive');
  313.     } else {
  314.         resetBtn.classList.add('filter-btn_clear_noactive');
  315.     }
  316. }
  317.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement