akozhomka

JS (redesign-dev/js-dev/models/pages/app_catalog-ui.js)

Feb 23rd, 2022
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. // =============================================================================
  4. // ui на странице каталога
  5. // dependencies:
  6. //  - jQuery
  7. //  - AppSendAJAX
  8. //  - AnalyticsFiltersSearch
  9. //  - modules/forms/jquery.select.js            - кастомный селект для сортировки
  10. // =============================================================================
  11.  
  12. const DESKTOP_MIN_WIDTH = 1024;
  13.  
  14. class AppCatalogUI {
  15.  
  16.     constructor() {
  17.  
  18.         this.cartPicUrl                 = document.querySelector('[data-api-pics]').data('api-pics');
  19.  
  20.         this.selectSort                 = document.querySelector('.select-sort');
  21.         this.selectSortCurrent          = document.querySelector('.select-sort-current');
  22.         this.selectSortMob              = document.querySelector('#catalog__sort-select-mob');
  23.         this.selectSortLi               = document.querySelector('.select-sort li');
  24.         this.selectSortLiMob            = document.querySelector('.select-sort-mobile li');
  25.  
  26.  
  27.         this.filterTitle                = document.querySelector('.filter__title');
  28.         this.filterSearch                = document.querySelector('.filter-search-input');
  29.         this.clearSearch                = document.querySelector('.filters .clear-button');
  30.  
  31.         this.filterGroupTitle           = document.querySelector('.filters-box__title');
  32.         this.filtersClose               = document.querySelector('#filters-close');
  33.         this.filtersOpen                =  document.querySelector('#mob-filter-open');
  34.         this.filtersWrap                = document.querySelector('.catalog__filter-column');
  35.  
  36.  
  37.         this.oilBtn                     = document.querySelector('.product-card-packaging__item');
  38.         this.oilMore                    = document.querySelector('.product-card-packaging__more');
  39.  
  40.         this.applicability              = document.querySelector('.product-card-applicability');
  41.  
  42.         this.filtersShowAll             = document.querySelector('.filter-show-all');
  43.         this.OUT_OF_STOCK               = 2;
  44.  
  45.         this._initModules();
  46.         this._eventHandlersInit();
  47.     }
  48.  
  49.     _initModules() {
  50.         this.selectSortMob.customSelect();
  51.         this._labelWithTooltip();
  52.         this.renderShowMoreButton();
  53.     }
  54.  
  55.     renderShowMoreButton(modifier = '+ показать еще') {
  56.         let selector = '.product-card__price-layout:not(.product-card__price-layout_more) .product-card-packaging';
  57.         document.querySelector(selector).each((index, element) => {
  58.             if (45 < element.scrollHeight) {
  59.                 document.querySelector(element).after(document.querySelector(`<div class="product-card-packaging__more">${modifier}</div>`))
  60.             }
  61.         })
  62.     }
  63.  
  64.     _labelWithTooltip() {
  65.         if(!globalUI.isMobile) {
  66.             document.querySelector(document).addEventListener('mouseover', '.label_with_tooltip', function() {
  67.                 catalogUI._createTooltip(document.querySelector(this));
  68.                 document.querySelector(this).parents('.product-card__layout-inside').querySelector('.tooltip__box').show();
  69.             }).addEventListener('mouseout', '.label_with_tooltip', function() {
  70.                 document.querySelector(this).parents('.product-card__layout-inside').querySelector('.tooltip__box').hide();
  71.             })
  72.         }
  73.     }
  74.  
  75.     _createTooltip(label) {
  76.         if (label.classList.contains('tooltip_created')) {
  77.             return;
  78.         }
  79.  
  80.         let tooltip = document.querySelector(`
  81.             <span class="tooltip__mob-wrap">
  82.                 <span class="tooltip__box tooltip__box_tile">
  83.                     <span>${label.data('tooltip')}</span>
  84.                     <span class="tooltip__box-close"></span>
  85.                 </span>
  86.             </span>
  87.         `);
  88.  
  89.         let tooltipBlock = label
  90.             .classList.add('tooltip_created')
  91.             .parents('.product-card__layout-inside')
  92.             .insertAdjacentHTML("beforeend",tooltip)
  93.             .querySelector('.tooltip__box.tooltip__box_tile');
  94.  
  95.         tooltipBlock.show();
  96.         tooltipBlock.css('top', -(tooltipBlock.height() + 25))
  97.         tooltipBlock.hide();
  98.     }
  99.  
  100.     changeOil(target) {
  101.         if(document.querySelector(target).classList.contains("product-card-packaging__item_current")) return;
  102.  
  103.         let productId = document.querySelector(target).data('product-id');
  104.         let customerCityId = document.querySelector(target).data('customer-city-id');
  105.         let available = parseInt(document.querySelector(target).data('available'));
  106.         let parent = document.querySelector(target).parents(".product-card");
  107.         let btnBuy = parent.querySelector(".product-card__button-buy");
  108.  
  109.         if (available === this.OUT_OF_STOCK) {
  110.             btnBuy.classList.add('button-buy__hidden');
  111.         } else {
  112.             btnBuy.removeClass('button-buy__hidden');
  113.         }
  114.  
  115.         parent.querySelector(".product-card-packaging__item").removeClass('product-card-packaging__item_current');
  116.         document.querySelector(target).classList.add('product-card-packaging__item_current');
  117.         parent.querySelector(".product-card__price").text(document.querySelector(target).data("price"));
  118.  
  119.         btnBuy.attr("data-id", document.querySelector(target).data("id"));
  120.  
  121.         this._changeLabel(parent, document.querySelector(target).attr('data-label'));
  122.         this._changeAvailableHtml(productId, customerCityId, document.querySelector(target));
  123.         this._loadPic(document.querySelector(target).data("id"), parent);
  124.         this._checkInCard(document.querySelector(target).data("id"));
  125.         this._changeLink(target, parent);
  126.         this._changeAnalytics(target, parent);
  127.         this._changeModificationFavorite(document.querySelector(target).data("id"), parent);
  128.     }
  129.  
  130.     _changeLabel(parent, label) {
  131.         document.querySelector(parent).querySelector('.label_with_tooltip').remove();
  132.         document.querySelector(parent).querySelector('.tooltip__mob-wrap').remove();
  133.         document.querySelector(parent).querySelector('.product-card__layout-inside').prepend(label);
  134.         document.querySelector(parent).querySelector('.slide_viewer').prepend(label);
  135.     }
  136.  
  137.     updateRubricator(filterBlock) {
  138.         let letterList = [];
  139.         filterBlock.querySelector('.rubricator-letter').remove();
  140.  
  141.         if (!filterBlock.querySelector('ul.filter-rubricator').length) {
  142.             return;
  143.         }
  144.  
  145.         let regex = /[A-zА-яёїd]/i;
  146.  
  147.         filterBlock.querySelector('.filter-checkbox').each((key, value) => {
  148.             let elem = document.querySelector(value);
  149.             if (elem.classList.contains('hidden-filter-value')) {
  150.                 return;
  151.             }
  152.  
  153.             let firstLetter = document.querySelector(value).querySelector('.filter-checkbox__text').text().match(regex)[0].toUpperCase();
  154.  
  155.             if ($.inArray(firstLetter, letterList) !== -1) {
  156.                 return;
  157.             }
  158.  
  159.             letterList.push(firstLetter);
  160.             let html = '<div class="rubricator-letter">' + firstLetter + '</div>'
  161.                 , elemToPrepend = filterBlock.classList.contains('.filter-search-enabled')
  162.                     ? elem.parent()
  163.                     : elem;
  164.             elemToPrepend.prepend(html);
  165.         });
  166.     }
  167.  
  168.     mobFiltersCloseClick() {
  169.         document.querySelector('body').removeClass('noscroll-mob');
  170.         setTimeout(() => {
  171.             if (this.filtersWrap.classList.contains('modified')) {
  172.                 setFilter(true);
  173.  
  174.                 return;
  175.             }
  176.  
  177.             this.filtersWrap.removeClass('opened');
  178.             ga('send', 'event', 'Products-Filter', 'filter-popup', 'close');
  179.  
  180.             this.filtersWrap.removeClass('modified');
  181.  
  182.             returnFilterState();
  183.             rollbackModifierFilters();
  184.             document.querySelector('.reset-all-btn').removeClass('reset-checkbox-btn');
  185.         }, 500);
  186.     }
  187.  
  188.     mobFiltersOpenClick() {
  189.         if (globalUI.isMobile) {
  190.             document.querySelector('body').classList.add('noscroll-mob');
  191.             returnFilterState();
  192.             setFilterState(true);
  193.         }
  194.  
  195.         this.filtersWrap.classList.add('anim-prepeare-opened');
  196.         setTimeout(() => {
  197.             this.filtersWrap.classList.add('opened');
  198.             //аналітика для відкриття фільтрів на мобайлі
  199.             ga('send', 'event', 'Products-Filter', 'filter-popup', 'open');
  200.         }, 1);
  201.     }
  202.  
  203.     // Подгрузка совместимых фильтров с сервера
  204.     reloadFilterFromServer() {
  205.         let mobileFilterData = JSON.parse(document.querySelector('.filters').attr('data-mobile-filter'));
  206.  
  207.         document.querySelector('.catalog__filter-column').classList.add('modified');
  208.  
  209.         let priceForm = document.querySelector('.filter').querySelector('.filter-price-form.price-range');
  210.         let from = +priceForm.querySelector('.from').value;
  211.         let to = +priceForm.querySelector('.to').value;
  212.         let min = +priceForm.querySelector('.from').attr('min');
  213.         let max = +priceForm.querySelector('.from').attr('max');
  214.  
  215.         let priceFrom = from !== 0 && from !== min ? from : 0;
  216.         let priceTo = to !== 0 && to !== max ? to : 0;
  217.  
  218.         let data = {
  219.             dokRazdelId: document.querySelector('#dokRazdelId_marker').value,
  220.             filterRaw: this.getFilterRawData(),
  221.             'dok-vitrina': document.querySelector('.dok-vitrina').is(':checked'),
  222.             'popular-filter': this.getPopularFilterData(),
  223.             priceFrom: priceFrom,
  224.             priceTo: priceTo,
  225.             forAllCars: document.querySelector('#for-all-car-radio').prop("checked") ? 1 : 0,
  226.             className: mobileFilterData.filter_class,
  227.             showAllCarsButton: mobileFilterData.is_show_all_cars_bnt
  228.                 ? parseInt(mobileFilterData.is_show_all_cars_bnt)
  229.                 : 0,
  230.             carData: mobileFilterData.car_data ? mobileFilterData.car_data : [],
  231.             carId: mobileFilterData.car_id ? mobileFilterData.car_id : ''
  232.         };
  233.  
  234.         $.ajax('/api/get-filters', {
  235.             method: 'POST',
  236.             data: data,
  237.             success: function (data) {
  238.                 if (data && data !== null && data !== undefined) {
  239.                     document.querySelector('.catalog__filter-column .filters').html(data);
  240.                 }
  241.             },
  242.             beforeSend: function () {
  243.                 document.querySelector('.filter-overlay').classList.add('filter-overlay_show');
  244.             },
  245.             complete: function () {
  246.                 document.querySelector('.catalog__filter-column .filter-overlay.filter-overlay_show').remove();
  247.                 document.querySelector('.catalog__filter-column .filters')
  248.                     .removeClass('filters-ajax-loader');
  249.  
  250.                 setTimeout(function () {
  251.                     setFilterState(true);
  252.                 }, 200)
  253.             }
  254.         });
  255.     }
  256.  
  257.     // Данные по всем выбраным фильтрам
  258.     getFilterRawData(keySeparator = '-', valueSeparator = ',') {
  259.         let listItem = document.querySelector('.filter').querySelector('input[type="checkbox"]:checked')
  260.             .not('.popular-checkbox')
  261.             .not('.dok-vitrina');
  262.         let filterData = {};
  263.         let filterGaData = '';
  264.         $.each(listItem, function (index, item) {
  265.             let charId = String(document.querySelector(item).attr('data-cat'));
  266.             let valueChar = String(document.querySelector(item).attr('data-id'));
  267.  
  268.             filterData[charId] = charId in filterData
  269.                 ? filterData[charId] + valueSeparator + valueChar
  270.                 : valueChar
  271.         });
  272.  
  273.         for (let key in filterData) {
  274.             filterGaData += key + keySeparator + filterData[key] + ';';
  275.         }
  276.  
  277.         return filterGaData;
  278.     }
  279.  
  280.     // Данные по всем выбранным фильтрам
  281.     getPopularFilterData(keySeparator = '-', valueSeparator = ',') {
  282.         let popularFilter = document.querySelector('.popular_filter_list');
  283.         let selectedPopularFilter = popularFilter.querySelector('input:checked');
  284.         let dataValue = '';
  285.         // Блок популярные фильтра в инсайде
  286.         if (selectedPopularFilter
  287.             && selectedPopularFilter.length > 0
  288.         ) {
  289.             $.each(selectedPopularFilter, function (index, data) {
  290.                 dataValue += document.querySelector(data).value + ',';
  291.             });
  292.  
  293.             dataValue = trimChar(dataValue, ',');
  294.         }
  295.  
  296.         return dataValue;
  297.     }
  298.  
  299.     // Очистить все выбранные фильтра
  300.     clearFiltersValue(visibleOnly = true) {
  301.         let items = visibleOnly
  302.             ? document.querySelector('.filter__list:visible')
  303.             : document.querySelector('.filter__list')
  304.         ;
  305.         let checkedElement = items.querySelector('input:checkbox');
  306.  
  307.         items.querySelector('input:radio#for-all-car-radio').prop('checked', true);
  308.  
  309.         let rangeFilterFrom = items.querySelector('.from');
  310.         let rangeFilterTo = items.querySelector('.to');
  311.  
  312.         rangeFilterFrom.val('');
  313.         rangeFilterTo.val('');
  314.  
  315.         $.each(checkedElement, function (index, item) {
  316.             document.querySelector(item).attr('checked', false);
  317.         });
  318.  
  319.         document.querySelector('.reset-all-btn').classList.add('filter-btn_clear_noactive');
  320.     }
  321.  
  322.     isDefaultMinPriceFilter() {
  323.         let inputForm = document.querySelector('#price-range_from');
  324.         let from = +inputForm.value;
  325.         let min = +inputForm.attr('min');
  326.  
  327.         return from === min;
  328.     }
  329.  
  330.     isDefaultMaxPriceFilter() {
  331.         let inputTo = document.querySelector('#price-range_to');
  332.         let to = +inputTo.value;
  333.         let max = +inputTo.attr('max');
  334.  
  335.         return to === max;
  336.     }
  337.  
  338.     _changeModificationFavorite(productId, parent) {
  339.         let favoriteIcon = parent.querySelector('.favorite-heart');
  340.         let advancedTileFavoriteTextItem = favoriteIcon.parent('.advanced-tile-favorite').querySelector('.favorite-heart-text');
  341.         let advancedTileFavoriteText = '';
  342.         favoriteIcon.attr('data-product-id', productId);
  343.  
  344.         if (globalUI.isFavoriteProduct(productId)) {
  345.             favoriteIcon
  346.                 .removeClass('favorite-heart_empty')
  347.                 .classList.add('favorite-heart_full');
  348.             advancedTileFavoriteText = Yii.t('app', 'card.favorites.product_added_to_favorites');
  349.         } else {
  350.             favoriteIcon
  351.                 .removeClass('favorite-heart_full')
  352.                 .classList.add('favorite-heart_empty')
  353.                 .attr("onclick", null)
  354.                 .removeEventListener('click')
  355.                 .removeAttr("data-location");
  356.             advancedTileFavoriteText = Yii.t('app', 'card.favorites.add_product_to_favorites');
  357.         }
  358.  
  359.         if (advancedTileFavoriteTextItem.length > 0) {
  360.             advancedTileFavoriteTextItem.attr('data-product-id', productId);
  361.             advancedTileFavoriteTextItem.text(advancedTileFavoriteText);
  362.         }
  363.  
  364.         this._initFavoriteObserver();
  365.     }
  366.  
  367.      _changeLink(target, parent)
  368.     {
  369.         let newLink = document.querySelector(target).data('link');
  370.  
  371.         parent.querySelector('.product-card__bottom-block>a').attr( 'href', newLink);
  372.         parent.querySelector('.product-card__layout-pic').attr( 'href', newLink);
  373.         parent.querySelector('.product-card__layout-name').attr( 'href', newLink);
  374.         parent.querySelector('.product-card-recom_link').attr( 'onclick', `window.location='${newLink}#recomended'`);
  375.     }
  376.  
  377.     _changeAnalytics(target, parent)
  378.     {
  379.         let fbHash = document.querySelector(target).attr('fb-hash');
  380.         let price = document.querySelector(target).attr('data-price');
  381.         let fbCode = "addToCartFacebookAnalytic('" + price +"', '" + fbHash + "')";
  382.         let buyBtn = document.querySelector(parent).querySelector('.product-card__button-buy');
  383.  
  384.         let onclick = buyBtn.attr('onclick');
  385.         let oldOnclick = buyBtn.attr('data-old-onclick');
  386.  
  387.         if (onclick === undefined || oldOnclick === undefined) {
  388.             return;
  389.         }
  390.  
  391.         onclick = onclick.replace(/addToCartFacebookAnalytic(.+)/, fbCode);
  392.         oldOnclick = oldOnclick.replace(/addToCartFacebookAnalytic(.+)/, fbCode);
  393.  
  394.         buyBtn.attr('onclick', onclick)
  395.             .attr('data-old-onclick', oldOnclick);
  396.     }
  397.  
  398.     _checkInCard(pid) {
  399.         this.ajax =  new AppSendAJAX({
  400.             serverScriptUrl : '/cart/check',
  401.             sendMethod  : 'post',
  402.             dataType: 'html'
  403.         });
  404.  
  405.         let data = {
  406.             'hash': Cookies.get('cart'),
  407.             'pid': pid
  408.         };
  409.  
  410.         this.ajax.sendData(data).then( responseJSON => {
  411.             let buyBtn = document.querySelector('[data-cart-add][data-id="' + pid + '"]');
  412.             if (responseJSON) {
  413.                 buyBtn
  414.                     .text(Yii.t('app', 'btn_buy.in_cart'))
  415.                     .classList.add('in-cart')
  416.                     .attr('onclick', "inCartButtonClick('catalog-button')");
  417.             } else {
  418.                 let dataHash = buyBtn.attr('data-hash'),
  419.                     replaceOnclickAttr = buyBtn.attr('data-old-onclick')
  420.                     ? 'data-old-onclick'
  421.                     : 'addOilToCart(' + pid + ',' ' + dataHash + '')';
  422.  
  423.                 buyBtn
  424.                     .text(Yii.t('app', 'btn_buy.buy'))
  425.                     .removeClass('in-cart')
  426.                     .attr('onclick', replaceOnclickAttr);
  427.             }
  428.         });
  429.     }
  430.  
  431.     _changeAvailableHtml(productId, customerCityId, elem) {
  432.         let parent = elem.parents(".product-card");
  433.  
  434.         let availableHtml = elem.data('available-text'),
  435.             availableElement = parent.querySelector(".product-card__note.product-card__note_not-available");
  436.  
  437.         availableElement.html(availableHtml);
  438.  
  439.         if (document.querySelector('.popup_search_block').is(':visible')) {
  440.             availableElement.querySelector(">:first-child").click();
  441.         }
  442.     }
  443.  
  444.     _loadPic(pid, parent) {
  445.         let url = `${this.cartPicUrl}?pid=${pid}`;
  446.  
  447.         this.ajax =  new AppSendAJAX({
  448.             serverScriptUrl : url,
  449.             sendMethod  : 'post'
  450.         });
  451.  
  452.         this.ajax.sendData(  ).then( responseJSON => {
  453.                 if (responseJSON.result)  {
  454.                     parent.querySelector(".product-card__pic, .without-lazy-load").attr("src", responseJSON.result);
  455.                 }
  456.             },
  457.             function ( error ) {
  458.                 console.log(error);
  459.             }
  460.         );
  461.     }
  462.  
  463.     _selectSortCange(target) {
  464.         document.querySelector('.select-sort-li-current').removeClass('select-sort-li-current');
  465.         document.querySelector(target).classList.add('select-sort-li-current');
  466.         document.querySelector('.select-sort_open').removeClass('select-sort_open');
  467.         this.selectSortCurrent.text(document.querySelector(target).text());
  468.  
  469.         document.querySelector('.custom-select-text').text(document.querySelector(target).text());
  470.         document.querySelector(`#catalog__sort-select-mob option[value="${document.querySelector(target).data('id')}"]`).prop('selected', true);
  471.     }
  472.  
  473.     _showMoreOil(target) {
  474.         document.querySelector(target).parent().classList.add('product-card__price-layout_more');
  475.     }
  476.  
  477.     _applicabilityShift(target) {
  478.         document.querySelector(target).classList.add('hover');
  479.  
  480.         let str = document.querySelector(target).querySelector('span'),
  481.             str_width = str.width(),
  482.             wrap = document.querySelector(target).querySelector('.product-card-applicability__wrap'),
  483.             wrap_width = wrap.width(),
  484.             delta = str_width - wrap_width;
  485.         if(delta>0) {
  486.             str.css({"transform": `translateX(-${delta+10}px)`})
  487.         }
  488.         else {
  489.             document.querySelector(target).removeClass('hover');
  490.         }
  491.     }
  492.     _applicabilityClearShift(target) {
  493.         let str = document.querySelector(target).querySelector('span');
  494.  
  495.         str.removeAttr("style");
  496.         setTimeout(()=> {
  497.             document.querySelector(target).removeClass('hover');
  498.         },200);
  499.     }
  500.  
  501.     // Отслеживание добавления товара в избранное
  502.     _initFavoriteObserver() {
  503.         document.querySelector('.catalog__product-list-row .favorite-heart_empty').click(function (e) {
  504.             e.preventDefault();
  505.             let location = document.querySelector(this).attr('data-location');
  506.  
  507.             if (location) {
  508.                 return;
  509.             }
  510.  
  511.             let productId = parseInt(document.querySelector(e.target).attr('data-product-id'));
  512.             globalUI.setProductAsFavorite(
  513.                 document.querySelector(e.target)
  514.                 .parents('.product-card')
  515.                 .querySelector('.product-card__layout-pic')
  516.                 .querySelector('.favorite-heart')
  517.             );
  518.             globalUI.addFavoriteProduct(productId);
  519.  
  520.             window.localStorage.removeItem('favoriteFilters');
  521.  
  522.             let product = globalUI.getAnalyticProductByPaId(productId);
  523.             gaWrapper.ga('ec:addProduct', product);
  524.             gaWrapper.ga('send', 'event', 'Favorite', 'add-to-favorite', 'catalog-buy');
  525.  
  526.             catalogUI._initFavoriteObserver();
  527.  
  528.             return false;
  529.         });
  530.  
  531.         document.querySelector('.catalog__product-list-row .favorite-heart_full').click(function (e) {
  532.             e.preventDefault();
  533.             let favoriteQuantity = globalUI.getCountFavoriteProductListFromLocalStorage();
  534.             gaWrapper.ga('send', 'event', 'Favorite', 'favorite-visit', 'catalog-button', favoriteQuantity);
  535.  
  536.             let location = document.querySelector(this).attr('data-location');
  537.  
  538.             if (location) {
  539.                 window.location = location;
  540.             }
  541.  
  542.             return false;
  543.         });
  544.     }
  545.  
  546.     /**
  547.      * перевіряє чи користувач
  548.      * знаходиться на сторінці пошуку
  549.      * @returns {*|boolean}
  550.      * @private
  551.      */
  552.     _isSearchPage() {
  553.         return /result2/.test(window.location.pathname);
  554.     }
  555.  
  556.      _eventHandlersInit() {
  557.          document.querySelector(document).addEventListener('ready', () => {
  558.              let favoriteProductList = document.querySelector('.favorite-heart_empty');
  559.  
  560.              $.each(favoriteProductList, function (index, item) {
  561.                  let productId = parseInt(document.querySelector(item).attr('data-product-id'));
  562.                  let isFavoriteProduct = globalUI.isFavoriteProduct(productId);
  563.  
  564.                  if (isFavoriteProduct) {
  565.                      globalUI.setProductAsFavorite(item);
  566.                  }
  567.              });
  568.  
  569.              this._initFavoriteObserver();
  570.          });
  571.  
  572.          document.querySelector('.filters-box.category-list .click-able').addEventListener('click', (e) => {
  573.              let razdelId = document.querySelector(e.target).data('razdel-id');
  574.              gaWrapper.ga('send', 'event', 'Products-cross', 'category-button', 'side', razdelId);
  575.          });
  576.  
  577.          document.querySelector(document).addEventListener('click', 'body', () => {
  578.              if (this.selectSort.classList.contains('select-sort_open')) {
  579.                  this.selectSortCurrent.trigger('click');
  580.              }
  581.          });
  582.  
  583.          document.querySelector(document).addEventListener(
  584.              'copy',
  585.              '.product-card .product-card__layout-name span.product-card__title,'
  586.                 + ' .product-card .product-card__layout-name span.product-card__serie',
  587.              (e) => {
  588.                  let elem = document.querySelector(e.target),
  589.                      event = COPYING_ANALYTICS_SOURCE_CATALOG_COMPACT;
  590.  
  591.                  if (elem.closest('.product-card__layout-inside-link').querySelector('.advanced-tile-on').length) {
  592.                      event = COPYING_ANALYTICS_SOURCE_CATALOG_EXTENDED;
  593.                  }
  594.  
  595.                  AnalyticsCopying.copyEvent(event);
  596.              }
  597.          );
  598.  
  599.          document.querySelector(document).addEventListener('copy', '.product-card .product-card__descr', () => {
  600.              AnalyticsCopying.copyEvent(COPYING_ANALYTICS_SOURCE_CHARS_EXTENDED);
  601.          });
  602.  
  603.          document.querySelector(document).addEventListener('click', '.favorite-heart-text' , (e) => {
  604.              setTimeout(function () {
  605.                  let productId = parseInt(document.querySelector(e.target).attr('data-product-id'));
  606.                  let favoriteIcon = document.querySelector(e.target).parents('.product-card').querySelector('.favorite-heart');
  607.                  globalUI.setProductAsFavorite(favoriteIcon);
  608.                  globalUI.addFavoriteProduct(productId);
  609.              }, 100)
  610.          });
  611.  
  612.          document.querySelector(document).addEventListener('click', this.selectSort.selector, (event) => {
  613.              event.stopImmediatePropagation();
  614.          });
  615.  
  616.          document.querySelector(document).addEventListener('click', this.selectSortCurrent.selector, () => {
  617.              this.selectSort.classList.toggle('select-sort_open');
  618.          });
  619.  
  620.          document.querySelector(document).addEventListener('click', this.selectSortLi.selector, (event) => {
  621.             this._selectSortCange(event.currentTarget);
  622.          });
  623.  
  624.          document.querySelector(document).addEventListener('click', this.selectSortLiMob.selector, (event) => {
  625.              this._selectSortCange(event.currentTarget);
  626.          });
  627.  
  628.          document.querySelector(document).addEventListener('click', this.filterTitle.selector, (event) => {
  629.             toggleFilterBox(event.currentTarget, true);
  630.          });
  631.  
  632.          document.querySelector(document).addEventListener('focus', this.filterSearch.selector, (event) => {
  633.              let filter = document.querySelector(event.currentTarget).closest('filter'),
  634.                 filterId = filter.attr('data-char-id');
  635.              AnalyticsFiltersSearch.filterSearch('focus', filterId);
  636.          });
  637.  
  638.          document.querySelector(document).addEventListener('focusout', this.filterSearch.selector, (event) => {
  639.              let filter = document.querySelector(event.currentTarget).closest('.filter'),
  640.                 filterId = filter.attr('data-char-id');
  641.              AnalyticsFiltersSearch.filterSearch('focusout', filterId);
  642.          });
  643.  
  644.          document.querySelector(document).addEventListener('input', this.filterSearch.selector, (event) => {
  645.              let target = document.querySelector(event.currentTarget),
  646.                  filter = target.closest('.filter'),
  647.                  filterId = filter.attr('data-char-id');
  648.              if (!target.classList.contains('changed')) {
  649.                  AnalyticsFiltersSearch.filterSearch('edit', filterId);
  650.                  target.classList.add('changed');
  651.              }
  652.              applySearchFilter(event.currentTarget);
  653.              this.updateRubricator(filter);
  654.          });
  655.  
  656.          document.querySelector(document).addEventListener('click', this.clearSearch.selector, (event) => {
  657.              let filter = document.querySelector(event.currentTarget).closest('.filter'),
  658.                  filterId = filter.attr('data-char-id');
  659.              AnalyticsFiltersSearch.filterSearch('clear', filterId);
  660.              filter.querySelector('.filter-search-input').val('');
  661.              applySearchFilter(event.currentTarget);
  662.              this.updateRubricator(filter);
  663.          });
  664.  
  665.          document.querySelector(document).addEventListener('click', this.filtersClose.selector, () => {
  666.              this.mobFiltersCloseClick();
  667.          });
  668.  
  669.          document.querySelector(document).addEventListener('click', this.filtersOpen.selector, () => {
  670.              this.mobFiltersOpenClick();
  671.          });
  672.  
  673.          document.querySelector(document).addEventListener('click', this.oilBtn.selector, (event) => {
  674.              this.changeOil(event.currentTarget);
  675.          });
  676.  
  677.          document.querySelector(document).addEventListener('click', this.filtersShowAll.selector, (event) => {
  678.              let target = event.currentTarget;
  679.              showAllFilters(target);
  680.              this.updateRubricator(document.querySelector(target).parent());
  681.          });
  682.  
  683.          document.querySelector(document).addEventListener('click', this.oilMore.selector, (event) => {
  684.              this._showMoreOil(event.currentTarget);
  685.          });
  686.  
  687.          document.querySelector(document).addEventListener('mouseover', this.applicability.selector, (event) => {
  688.              this._applicabilityShift(event.currentTarget);
  689.  
  690.          });
  691.  
  692.          document.querySelector(document).addEventListener('mouseleave', this.applicability.selector, (event) => {
  693.              this._applicabilityClearShift(event.currentTarget);
  694.          });
  695.  
  696.          document.querySelector(document).addEventListener('input', '#price-range_to', (event) => {
  697.              // Если цена была изменена
  698.              if (catalogUI.isDefaultMaxPriceFilter()) {
  699.                  document.querySelector('.reset-all-btn').classList.add('filter-btn_clear_noactive');
  700.              } else {
  701.                  document.querySelector('#filters-box_second_page_title').removeClass('is-show-only');
  702.                  document.querySelector('.reset-all-btn').removeClass('filter-btn_clear_noactive');
  703.              }
  704.          });
  705.  
  706.          document.querySelector(document).addEventListener('input', '.filter-price-form > input', () => {
  707.              document.querySelector('#filters-box_second_page_title').removeClass('is-show-only');
  708.              document.querySelector('.reset-all-btn').removeClass('filter-btn_clear_noactive');
  709.          });
  710.  
  711.          document.querySelector(document).addEventListener('change', '.filter-radio-form-line>input', () => {
  712.              document.querySelector('#filters-box_second_page_title').classList.toggle('is-show-only');
  713.              document.querySelector('.reset-all-btn').classList.toggle('filter-btn_clear_noactive');
  714.          });
  715.  
  716.          // Кнопка назад в мобильных фильтрах
  717.          document.querySelector(document).addEventListener('click', '#filters-box_second_page_title', (event) => {
  718.              document.querySelector('.reset-all-btn').removeClass('reset-checkbox-btn');
  719.  
  720.              let rangeFilter = document.querySelector('.filter-price-form:visible');
  721.              if (
  722.                  rangeFilter.length
  723.                  && !this._isSearchPage()
  724.              ) {
  725.                  validateInputNumber(rangeFilter.querySelector('.from'));
  726.                  validateInputNumber(rangeFilter.querySelector('.to'));
  727.              }
  728.  
  729.              // Если не выбрали новый фильтр не грузим данные с сервера
  730.              if (
  731.                  !document.querySelector(event.currentTarget).classList.contains('is-show-only')
  732.                  && !document.querySelector(event.currentTarget).classList.contains('no-reload')
  733.                  && !this._isSearchPage()
  734.              ) {
  735.                  this.reloadFilterFromServer();
  736.              }
  737.  
  738.              afterReturnAction(true);
  739.          });
  740.  
  741.          // Переход от мобильных фильтров к десктопным
  742.          let prevWidth = 0;
  743.          document.querySelector(document).ready(() => {
  744.              prevWidth = document.querySelector(window).width();
  745.          });
  746.  
  747.          document.querySelector(window).resize(() => {
  748.              if (this._isSearchPage()) {
  749.                  return;
  750.              }
  751.  
  752.              let currentWidth = document.querySelector(window).width();
  753.  
  754.              let filterPage = document.querySelector('.filter-overlay').length;
  755.  
  756.              if (currentWidth >= DESKTOP_MIN_WIDTH && prevWidth < DESKTOP_MIN_WIDTH && filterPage) {
  757.                  setFilter(true);
  758.              }
  759.  
  760.              prevWidth = currentWidth;
  761.          });
  762.     }
  763. }
  764.  
  765. let catalogUI = new AppCatalogUI();
Add Comment
Please, Sign In to add comment