akozhomka

JS (themes/redesign/custom-js/profile_filters.js)

Feb 23rd, 2022 (edited)
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. // Фильтры
  4. // dependencies:
  5. //  - jQuery
  6. // =============================================================================
  7. const CHECK_BOX_FILTER_LIMIT = 8;
  8.  
  9. class AppFilterUI {
  10.  
  11.     constructor() {
  12.         this._eventHandlersInit();
  13.     }
  14.  
  15.     _eventHandlersInit() {
  16.         document.querySelector('.catalog__mob-filter-btn').addEventListener('click', () => {
  17.             this._filtersOpenClick();
  18.         });
  19.  
  20.         document.querySelector('.n-profile-orders-filters__btn_filter').addEventListener('click', (event) => {
  21.             let name = document.querySelector(event.currentTarget).children('.select-sort-current').text();
  22.             let target = document.querySelector(`.filter__title[data-name=${name}]`);
  23.             if (target.length === 0){
  24.                 return;
  25.             }
  26.  
  27.             this._filtersOpenClick();
  28.             toggleFilterBox(target, false);
  29.         });
  30.  
  31.         document.querySelector(document).addEventListener('click', '#F-popup-overlay', () => {
  32.             if (document.querySelector('.catalog__filter-column').classList.contains('opened')) {
  33.                 document.querySelector('.filters-close').trigger('click');
  34.             }
  35.         });
  36.  
  37.         document.querySelector(document).addEventListener('click', '#filters-close', () => {
  38.             this._filtersCloseClick();
  39.         });
  40.  
  41.         document.querySelector(document).addEventListener('click', '.filter__title', (event) => {
  42.             toggleFilterBox(event.currentTarget, false);
  43.         });
  44.  
  45.         document.querySelector(document).addEventListener('click', '.filter-btn_show', () => {
  46.             this._filtersApplyClick();
  47.         });
  48.  
  49.         document.querySelector(document).addEventListener('click', '.filter-show-all', (event) => {
  50.             showAllFilters(event.currentTarget);
  51.         });
  52.  
  53.         document.querySelector(document).addEventListener('click', '#filters-box_second_page_title', (event) => {
  54.             this._return(event.currentTarget)
  55.         });
  56.  
  57.         document.querySelector(document).addEventListener('click', '.filter-btn_clear', () => {
  58.             this._resetFilter();
  59.         });
  60.  
  61.         document.querySelector(document).addEventListener('input', '.filter-search-input', (event) => {
  62.             applySearchFilter(event.currentTarget);
  63.         });
  64.  
  65.         document.querySelector(document).addEventListener('click', '.filters .clear-button', (event) => {
  66.             let filter = document.querySelector(event.currentTarget).closest('.filter');
  67.             filter.querySelector('.filter-search-input').val('');
  68.             applySearchFilter(event.currentTarget);
  69.         });
  70.  
  71.         document.querySelector('.n-profile-orders-chosen-filters__item').addEventListener('click', () => {
  72.             this._addPreloader();
  73.         });
  74.  
  75.         document.querySelector(document).addEventListener('click', 'input[type="checkbox"]', (event) => {
  76.             let catalogFilter = document.querySelector('.catalog__filter-column');
  77.             let maxPosition = Number(catalogFilter.attr('data-max-position')) + 1;
  78.             document.querySelector(event.currentTarget).attr('data-position', maxPosition);
  79.             catalogFilter.attr('data-max-position', maxPosition);
  80.         });
  81.     }
  82.  
  83.     _filtersOpenClick() {
  84.         this._addOverlay();
  85.         document.querySelector('html').classList.add('F-popup__window-no-scroll');
  86.         setHiddenClassToListItems();
  87.         returnFilterState();
  88.         setFilterState(false);
  89.  
  90.         document.querySelector('.catalog__filter-column').classList.add('anim-prepeare-opened_right');
  91.         setTimeout(() => {
  92.             document.querySelector('.catalog__filter-column').classList.add('opened');
  93.         }, 1);
  94.     }
  95.  
  96.     _filtersApplyClick() {
  97.         if (document.querySelector('input[type="checkbox"].modifier').length === 0
  98.             && !document.querySelector('.catalog__filter-column').classList.contains('modified')
  99.         ) {
  100.             this._filtersCloseClick();
  101.  
  102.             return;
  103.         }
  104.  
  105.         this._addPreloader();
  106.         document.location.href = this._getClearUrl() + this._buildURI();
  107.     }
  108.  
  109.     _filtersCloseClick() {
  110.         let filtersWrap = document.querySelector('.catalog__filter-column');
  111.         filtersWrap.removeClass('opened');
  112.         filtersWrap.removeClass('modified');
  113.  
  114.         returnFilterState();
  115.         rollbackModifierFilters();
  116.         document.querySelector('.reset-all-btn').removeClass('reset-checkbox-btn');
  117.         document.querySelector('html').removeClass('F-popup__window-no-scroll');
  118.         document.querySelector('#F-popup-overlay').removeClass('show');
  119.     }
  120.  
  121.     _getClearUrl()
  122.     {
  123.         let url = location.href;
  124.         let newUrl = url.replace(/?(.*)$/g, '');
  125.         return newUrl.replace(//$/g, '');
  126.     }
  127.  
  128.     _buildURI()
  129.     {
  130.         let queryURI = '';
  131.  
  132.         let checkedList = document.querySelector('input[type="checkbox"]:checked').sort(function (a, b) {
  133.             return +a.dataset.position - +b.dataset.position;
  134.         })
  135.  
  136.         $.each(checkedList, function (number, item) {
  137.             let key = document.querySelector(item).closest('.filter_list_checkbox').attr('data-key');
  138.             let value = document.querySelector(item).attr('data-value');
  139.             queryURI += `&filter[][${key}][]=${value}`;
  140.         });
  141.  
  142.         let sort = this._getSort();
  143.         if (sort !== '') {
  144.             queryURI += "&sort=" + sort;
  145.         }
  146.  
  147.         if (queryURI !== '') {
  148.             queryURI = '?' + queryURI.substring(1);
  149.         }
  150.  
  151.         return queryURI;
  152.     }
  153.  
  154.     _getSort() {
  155.         let url = new URL(window.location);
  156.         let params = new URLSearchParams(url.search);
  157.  
  158.         if(params.has('sort')) {
  159.             return params.get('sort')
  160.         }
  161.  
  162.         return '';
  163.     }
  164.  
  165.     _return(target) {
  166.         document.querySelector('.reset-all-btn').removeClass('reset-checkbox-btn');
  167.  
  168.         // Если не выбрали новый фильтр не грузим данные с сервера
  169.         if (
  170.             !document.querySelector(target).classList.contains('is-show-only')
  171.             && !document.querySelector(target).classList.contains('no-reload')
  172.         ) {
  173.             this._reloadFromServer();
  174.             setHiddenClassToListItems();
  175.         }
  176.  
  177.         afterReturnAction(false);
  178.     }
  179.  
  180.     _resetFilter() {
  181.         if (!document.querySelector('#filters-box_second_page_title').is(':visible')) {
  182.             this._resetAllFilters();
  183.  
  184.             return;
  185.         }
  186.  
  187.         $.each(document.querySelector('.filter__list:visible').querySelector('.filter-label>input:checked'), function () {
  188.             let disabled = document.querySelector(this).attr('disabled');
  189.             document.querySelector(this).attr('disabled', false);
  190.             document.querySelector(this).click();
  191.             document.querySelector(this).attr('disabled', disabled);
  192.         });
  193.     }
  194.  
  195.     _resetAllFilters() {
  196.         if (document.querySelector('#filters-box_second_page_title').is(':visible')) {
  197.             return;
  198.         }
  199.  
  200.         let href = document.querySelector('.n-profile-orders-chosen-filters__clear').attr('href');
  201.         if (!href) {
  202.             this._filtersApplyClick();
  203.  
  204.             return;
  205.         }
  206.  
  207.         this._addPreloader();
  208.         window.location.href = href;
  209.     }
  210.  
  211.     _getFilterRawData() {
  212.         let filters = [];
  213.         $.each(document.querySelector('.filter_list_checkbox'), function (number, filter) {
  214.             let key = document.querySelector(filter).attr('data-key');
  215.             let listItem = document.querySelector(filter).querySelector('input[type="checkbox"]:checked');
  216.             $.each(listItem, function (number, item) {
  217.                 let value = document.querySelector(item).attr('data-value');
  218.                 filters.push(key + '=' + value);
  219.             });
  220.         });
  221.  
  222.         return filters;
  223.     }
  224.  
  225.     _reloadFromServer() {
  226.         document.querySelector('.catalog__filter-column').classList.add('modified');
  227.         let url = this._getClearUrl();
  228.  
  229.         $.ajax(url, {
  230.             method: 'POST',
  231.             data: {
  232.                 'action' : 'reload_filters',
  233.                 'filterRaw' : this._getFilterRawData(),
  234.             },
  235.             dataType: 'json',
  236.             success: function (data) {
  237.                 if (data && data.filters !== undefined) {
  238.                     document.querySelector('.catalog__filter-column').html(data.filters);
  239.                     returnFilterState();
  240.                     setFilterState(false);
  241.                     setHiddenClassToListItems();
  242.                 }
  243.             },
  244.             beforeSend: function () {
  245.                 let container = document.querySelector('<div>')
  246.                     .classList.add('filter-overlay filter-overlay_show')
  247.                     .appendTo(document.querySelector('.catalog__filter-column'));
  248.                 document.querySelector('<div>').appendTo(container);
  249.             },
  250.         });
  251.     }
  252.  
  253.     _addPreloader() {
  254.         let container = document.querySelector('<div>')
  255.             .classList.add('filter-overlay filter-overlay_show')
  256.             .css({position: 'fixed'})
  257.             .appendTo(document.querySelector('.inner-page > .layout-main'));
  258.         document.querySelector('<div>').appendTo(container);
  259.     }
  260.  
  261.     _addOverlay() {
  262.         let popupOverlay = document.querySelector('#F-popup-overlay');
  263.         if (popupOverlay.length > 0) {
  264.             popupOverlay.classList.add('show');
  265.  
  266.             return;
  267.         }
  268.  
  269.         document.querySelector('<div id="F-popup-overlay">')
  270.             .classList.add('show')
  271.             .appendTo(document.querySelector('body'));
  272.     }
  273. }
  274.  
  275. document.querySelector(document).addEventListener('ready', function () {
  276.     new AppFilterUI();
  277. });
Add Comment
Please, Sign In to add comment