Advertisement
valeraplusplus

shop_folder_select

Nov 23rd, 2023
922
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. lpc_template.createCardsShop = {
  2.  
  3.     changeFolder: function( $self, folderId  ){
  4.  
  5.         $self.find('.block-id-folder').text(folderId).addClass('modified modified-text');
  6.  
  7.         lpc_template.createCardsShop.getProducts( $self[0] );
  8.     },
  9.     createSelect: function($self){
  10.         /*parent wraper */
  11.         let containerFolder = $self.find(`.lpc-select-folder-container`); // mainContainer
  12.  
  13.  
  14.         let queryFolder = containerFolder.find(`.lpc-query-folder`); // Logic query
  15.         let selectFolder = queryFolder.find('.lpc-query-folder__select');
  16.         /*parent wraper */
  17.  
  18.         let folderInputSelected = queryFolder.find('.lpc-query-folder__input'); /* preview BTN */
  19.  
  20.         let folderId = queryFolder.attr('data-folder_id');
  21.  
  22.         let selectFolderBody = queryFolder.find('.lpc-query-folder__body'); /* option BOdy */
  23.  
  24.         let flagLoadFolder = 0;
  25.  
  26.         async function fetchAndCreateSelect() {
  27.             try {
  28.                 // Создаем параметры запроса
  29.                 let params = new URLSearchParams();
  30.                 params.append('param[type]', 'shop2');
  31.                 params.append('param[depth]', '6');
  32.    
  33.                 // Формируем URL для GET-запроса
  34.                 let url = '/my/s3/xapi/public/?method=folder/getTree&' + params.toString();
  35.    
  36.                 // Отправляем GET-запрос с использованием fetch
  37.                 let response = await fetch(url, {
  38.                     method: 'GET',
  39.                     headers: {
  40.                         'Content-Type': 'application/json'
  41.                     }
  42.                 });
  43.    
  44.                 if (!response.ok) {
  45.                     throw new Error('Ошибка при выполнении запроса');
  46.                 }
  47.    
  48.                 let data = await response.json();
  49.    
  50.                 if ( data.result.success ) {
  51.                     let items = data.result.items;
  52.    
  53.                     // Нет категории магазина
  54.                     if( !items.length ){
  55.                         queryFolder.addClass('lpc-shop-not-found');
  56.                         return false;
  57.                     }
  58.  
  59.                     items.shift(); // удаляет первую категорию
  60.                     // Создаем варианты (option) выпадающего списка и добавляем их к существующему select
  61.  
  62.                     function createSelector(data) {
  63.                         var rootUL = document.createElement('ul');
  64.                         var levelObject = {};
  65.                         var parentLi = null;
  66.                    
  67.                         data.forEach(item => {
  68.                             var li = document.createElement('li');
  69.                             var div = document.createElement('div');
  70.                             div.className = 'lpc-query-folder__option lpc-query__option';
  71.                             div.setAttribute('data-folder_id', item.folder_id);
  72.                    
  73.                             var span = document.createElement('span');
  74.                            
  75.                             function decodeHtmlEntities(input) {
  76.                                 var doc = new DOMParser().parseFromString(input, "text/html");
  77.                                 return doc.documentElement.textContent;
  78.                             }
  79.                             span.textContent = decodeHtmlEntities( item.folder_name );
  80.                             div.title = decodeHtmlEntities( item.folder_name );
  81.  
  82.                             var i = document.createElement('i');
  83.                             i.textContent = `(${item.items})`;
  84.                    
  85.                             div.appendChild(span);
  86.                             div.appendChild(i);
  87.                             li.appendChild(div);
  88.                    
  89.                             let level = Number(item._level);
  90.                    
  91.                             if (level == 1) {
  92.                                 rootUL.appendChild(li);
  93.                                 parentLi = li;
  94.                                 levelObject = {};
  95.                             } else {
  96.                                 if (!levelObject[level]) {
  97.                                     levelObject[level] = document.createElement('ul');
  98.                                     parentLi.appendChild(levelObject[level]);
  99.                                 }
  100.                                 levelObject[level].appendChild(li);
  101.                                 parentLi = li;
  102.                             }
  103.                    
  104.                             if( folderId && folderId == item.folder_id ){
  105.                                 folderInputSelected.find('span').text(
  106.                                     $( div )
  107.                                         .addClass('selected active')
  108.                                         .find('span')
  109.                                         .text()
  110.                                 );
  111.                                 //$( div ).addClass('active');
  112.                             }
  113.                         });
  114.                    
  115.                         return rootUL;
  116.                     }
  117.                     selectFolderBody.append( createSelector( items ) );
  118.  
  119.                     return true;
  120.                 }
  121.             } catch (error) {
  122.                 console.error('Ошибка при выполнении запроса:', error);
  123.                 return false;
  124.             }
  125.         }
  126.  
  127.         async function loadSelectedOption() {
  128.             let awaitCreateSelect = await fetchAndCreateSelect(); // Ждем выполнения
  129.  
  130.             if( awaitCreateSelect ){
  131.                 queryFolder
  132.                 .removeClass('load')
  133.                 .addClass('loaded');
  134.  
  135.                 folderInputSelected.on('click', function (e) {
  136.                     selectFolder.toggleClass("open");
  137.                 });
  138.                 let queryFolderOption = queryFolder.find('.lpc-query-folder__option'); /* option select */
  139.  
  140.                 queryFolderOption.on('click', function (e) {
  141.                     let $this = $(this);
  142.                     let folderId = $this.data('folder_id');
  143.                     queryFolderOption.removeClass('active');
  144.                     $this
  145.                         .addClass('active')
  146.                         .siblings()
  147.                         .removeClass('active');
  148.                     folderInputSelected.find('span').text($this.find('span').text());
  149.                     selectFolder.toggleClass("open");
  150.  
  151.                     lpc_template.createCardsShop.changeFolder( $self, folderId );
  152.  
  153.                     if(!flagLoadFolder){
  154.                         queryFolder.addClass('folder-selected')
  155.                     }
  156.  
  157.                 });
  158.             }
  159.         }
  160.        
  161.         loadSelectedOption();
  162.     },
  163.     watchLoadBlock: function (block) {
  164.         var elem = '.lpc_lazy_load';
  165.  
  166.  
  167.         let options = {
  168.             rootMargin: '0px 0px 0px 0px'
  169.         };
  170.         let imageObserver = new IntersectionObserver((entries, imgObserver) => {
  171.             entries.forEach((entry) => {
  172.                 if (entry.isIntersecting) {
  173.                     const lazyBox = entry.target // Текущий элемент
  174.  
  175.                     if (lazyBox.tagName == 'IMG') {
  176.                         lazyBox.src = lazyBox.dataset.src // Адрес картинки data-src=""
  177.                         lazyBox.classList.remove(elem);
  178.                         imgObserver.unobserve(lazyBox);
  179.                        
  180.                     }if (lazyBox.dataset.func) { // Если элемент содержит data-func
  181.                         lpc_template.createCardsShop.getProducts(lazyBox); // Вызов функции
  182.                         lazyBox.classList.remove(elem);
  183.                         imgObserver.unobserve(lazyBox);
  184.                     } else {
  185.                         lazyBox.classList.remove(elem);
  186.                         imgObserver.unobserve(lazyBox);
  187.                     }
  188.                 }
  189.             })
  190.         }, options);
  191.  
  192.         var arr = document.querySelectorAll(elem);
  193.  
  194.         if(typeof block != 'undefined'){
  195.             arr = block.querySelectorAll(elem);
  196.         }
  197.         arr.forEach((v) => {
  198.             imageObserver.observe(v);
  199.         });
  200.     },
  201.     flagStartScript: 0
  202. };
  203.  
  204. lpc_template.queue.folderBlock = function($self) {
  205.    
  206.     let $blocks = $self.find('.lpc-folder-block');
  207.    
  208.     if ($blocks.length) {
  209.         if( lpc_template.createCardsShop.flagStartScript == 0 ){
  210.             lpc_template.createCardsShop.flagStartScript = 1;
  211.             lpc_template.createCardsShop.watchLoadBlock();
  212.         }
  213.        
  214.         $blocks.each(function () {
  215.             let $block = $(this);
  216.  
  217.             if(s3LP.is_cms){
  218.                
  219.                 lpc_template.createCardsShop.createSelect( $block.parent() );
  220.  
  221.                 if( $self.is('div') ){
  222.                     lpc_template.createCardsShop.getProducts( $self );
  223.                 }
  224.             }
  225.  
  226.         })
  227.     }
  228. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement