1/* 2код Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ° Ñ Ð¿Ð¾Ð¸Ñком 3 */ 4 5let searchRequests = []; 6let catalog = []; 7let recipes = []; 8let news = []; 9 10const showHideSearchSection = () => { 11 let searchToggleButton = document.querySelector('button.search-toggler'); 12 let searchSection = document.querySelector('.search-section'); 13 14 searchToggleButton.addEventListener('click', (e) => { 15 e.preventDefault(); 16 searchToggleButton.classList.toggle('active'); 17 18 if(searchToggleButton.classList.contains('active')) { 19 searchSection.classList.add('active'); 20 document.body.classList.add('with-search'); 21 document.getElementById('searchInput').focus({ focusVisible: true }) 22 } else { 23 searchSection.classList.remove('active'); 24 document.body.classList.remove('with-search'); 25 loadInitialSearchBlock(); 26 } 27 }) 28} 29 30/* 31 ÐÑпÑавка запÑÑа на ÑеÑвеÑи полÑÑение даннÑÑ Ð¿Ð¾Ñле введение запÑÑа в поле поиÑка 32 */ 33const submitSearchForm = () => { 34 let form = document.getElementById('searchForm'); 35 let input = form.querySelector('input#searchInput'); 36 37 if(input.value !== '') { 38 if(localStorage.getItem('requests')) { 39 searchRequests = JSON.parse(localStorage.getItem('requests')); 40 searchRequests.forEach((el) => { 41 if(searchRequests.includes(input.value)) { 42 return false; 43 } else { 44 searchRequests.unshift(input.value); 45 } 46 }) 47 } else { 48 searchRequests.unshift(input.value) 49 } 50 51 localStorage.setItem('requests', JSON.stringify(searchRequests)); 52 53 let searchRequest = ''; 54 const regex = /[a-zA-Zа-ÑÐ-Я]/g; 55 if(input.value.toLowerCase().includes('коллекÑ') && input.value.trim().length > 9) { 56 let collectionName = input.value.trim().split(" "); 57 collectionName.forEach((el) => { 58 if(!el.includes('коллекÑ')) { 59 searchRequest = el.toString().toLowerCase(); 60 } 61 }) 62 } else if(/\S+и$/.test(input.value.trim()) || /\S+Ñ$/.test(input.value.trim())) { 63 searchRequest = input.value.slice(0, input.value.length-1).trim().toLowerCase() 64 } else if(input.value.trim().includes('-')) { 65 searchRequest = input.value.trim().replace('-', '-') 66 } else { 67 searchRequest = input.value.trim(); 68 } 69 70 let formData = new FormData; 71 formData.append('search', searchRequest); 72 73 try { 74 fetch('/main/getsearchresults', { 75 method: "POST", 76 body: formData, 77 }) 78 .then((response) => response.json()) 79 .then((json) => { 80 catalog = []; 81 recipes = []; 82 news = []; 83 let notEmptyElems = []; 84 let emptyElems = []; 85 let itemsOffset = 16; 86 let newsOffset = 14; 87 let recipesOffset = 4; 88 89 for(let key in json) { 90 if(json[key].length === 0) { 91 emptyElems.push(json[key]); 92 } else { 93 notEmptyElems.push(key); 94 95 if(key ==='catalog') { 96 catalog.push(json[key]); 97 } 98 99 if(key ==='recipes') { 100 recipes.push(json[key]); 101 } 102 103 if(key ==='news') { 104 news.push(json[key]); 105 } 106 } 107 } 108 109 if(emptyElems.length === Object.keys(json).length) { 110 renderNothingFoundBlock(input.value); 111 } else { 112 renderSearchResultsBlock(input.value); 113 renderSearchTabs(notEmptyElems); 114 document.querySelector('.search-tabs li').classList.add('active'); 115 document.querySelectorAll('.search-tabs li').forEach((li) => li.addEventListener('click', (e) => clickOnSearchTabs(e.target,itemsOffset, newsOffset, recipesOffset))); 116 let activeTabType = document.querySelector('.search-tabs li.active').getAttribute('data-content'); 117 renderSearchTabContent(activeTabType, itemsOffset, newsOffset, recipesOffset); 118 /*loadItemsOnScroll(itemsOffset, newsOffset, recipesOffset);*/ 119 } 120 121 }) 122 } catch (e) { 123 console.log(e.message) 124 } 125 } else { 126 input.setAttribute('placeholder', 'ÐведиÑе запÑоÑ') 127 } 128} 129 130/* 131 ÐеÑконеÑнÑй ÑкÑолл 132 */ 133const loadItemsOnScroll = (itemsOffset, newsOffset, recipesOffset) => { 134 let tabContentData = document.querySelector('.search-tab-content').getAttribute('data-content'); 135 let searchSection = document.querySelector('.search-section'); 136 let scrollableBlock = searchSection.querySelector('.search-results')
137 let catalogArray = []; 138 let newsArray = []; 139 let recipesArray = []; 140 141 switch (tabContentData) { 142 case 'catalog': 143 let itemsOnPage = document.querySelectorAll('.items-row .item-block'); 144 let itemsCounter = itemsOnPage.length 145 146 searchSection.addEventListener('scroll', () => { 147 catalogArray = catalog[0]; 148 itemsOnPage = document.querySelectorAll('.items-row .item-block'); 149 if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) { 150 if(itemsCounter < catalogArray.length) { 151 catalogArray.forEach((item, index) => { 152 if (index >= itemsOnPage.length && index < itemsOnPage.length+itemsOffset) { 153 renderCatalogItem(item, document.querySelector('.tab-content .items-row')); 154 } 155 }) 156 itemsCounter += itemsOffset; 157 } else { 158 itemsCounter = catalogArray.length-1; 159 160 catalogArray.forEach((item, index) => { 161 if (index >= itemsOnPage.length && index <= itemsCounter) { 162 renderCatalogItem(item, document.querySelector('.tab-content .items-row')); 163 } 164 }) 165 166 } 167 } 168 return itemsCounter; 169 }) 170 break; 171 case 'news': 172 let newsOnPage = document.querySelectorAll('.news-row .news-block'); 173 let newsCounter = newsOnPage.length 174 newsArray = news[0]; 175 176 searchSection.addEventListener('scroll', () => { 177 newsOnPage = document.querySelectorAll('.news-row .news-block'); 178 179 if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) { 180 if(newsCounter < newsArray.length) { 181 if (newsOnPage.length <= newsArray.length) { 182 newsArray.forEach((item, index) => { 183 if (index >= newsOnPage.length && index < newsOnPage.length+newsOffset) { 184 renderNewsItem(item, index); 185 } 186 }) 187 188 newsCounter += newsOffset; 189 } else { 190 newsCounter = newsArray.length-1; 191 newsArray.forEach((item, index) => { 192 if (index >= newsOnPage.length && index <= newsCounter) { 193 renderNewsItem(item, index); 194 } 195 }) 196 } 197 } 198 } 199 200 }) 201 break; 202 case 'recipes': 203 let recipesOnPage = document.querySelectorAll('.recipes-row .recipe'); 204 let recipesCounter = recipesOnPage; 205 recipesArray = recipes[0]; 206 207 searchSection.addEventListener('scroll', () => { 208 recipesOnPage = document.querySelectorAll('.recipes-row .recipe'); 209 210 if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) { 211 if(recipesCounter < recipesArray.length) { 212 if (recipesOnPage.length <= recipesArray.length) { 213 recipesArray.forEach((item, index) => { 214 if (index >= recipesOnPage.length && index < recipesOnPage.length+recipesOffset) { 215 renderRecipesItem(item); 216 } 217 }) 218 219 recipesCounter += recipesOffset; 220 } 221 } else { 222 recipesCounter = recipesArray.length-1; 223 recipesArray.forEach((item, index) => { 224 if (index >= recipesOnPage.length && index <= recipesCounter) { 225 renderRecipesItem(item); 226 } 227 }) 228 } 229 } 230 231 }) 232 break; 233 } 234} 235 236 237const renderCatalogItem = (elem, parentBlock) => { 238 const item = { 239 item_id: elem.item_id, 240 category_alias: elem.level1_alias, 241 prodgroup_alias: elem.leve2_alias, 242 product_alias: elem.product_alias, 243 short_name: elem.short_name, 244 } 245 const renderSwiperSlide = (el, slider, itemName) => { 246 let slide = document.createElement('div'); 247 slide.classList.add('swiper-slide'); 248 slide.innerHTML=`<img src="//static.rondell.ru/catalog-photos/${el["cat"]}/${el["item_id"]}/${el["file_name"]}" alt="${itemName}">`; 249 slider.append(slide); 250 } 251 252 let block = document.createElement('a'); 253 block.setAttribute('href', `/catalog/${item.category_alias}/${item.prodgroup_alias}
253/${item.item_id}/${item.product_alias}/`) 254 block.classList.add('item-block', 'with-info'); 255 256 let swiper = document.createElement('div'); 257 swiper.classList.add('swiper', 'preview-swiper'); 258 let swiperWrapper = document.createElement('div'); 259 swiperWrapper.classList.add('swiper-wrapper'); 260 let swiperPagination = document.createElement('div'); 261 swiperPagination.classList.add('swiper-pagination'); 262 263 if(elem["photos"]) { 264 elem["photos"].forEach((el) => { 265 renderSwiperSlide(el, swiperWrapper, elem['short_name']) 266 }) 267 } else { 268 let slide = document.createElement('div'); 269 slide.classList.add('swiper-slide'); 270 slide.innerHTML='ÐÐµÑ ÑоÑо'; 271 swiperWrapper.append(slide); 272 } 273 274 275 swiper.append(swiperWrapper); 276 swiper.append(swiperPagination); 277 block.append(swiper); 278 279 let infoBlock = document.createElement('div'); 280 infoBlock.classList.add('info'); 281 infoBlock.innerHTML = `<div class="item-name">${item['short_name']}</div> 282 <div>ID ${item['item_id']}</div>`; 283 block.append(infoBlock); 284 parentBlock.append(block) 285 286 let photosSlider = block.querySelector('.preview-swiper'); 287 288 const blockSwiper = new Swiper(photosSlider, { 289 slidesPerView: 1, 290 spaceBetween: 30, 291 loop: true, 292 pagination: { 293 el: '.swiper-pagination', 294 clickable: false, 295 dynamicBullets: true, 296 }, 297 speed: 1500, 298 autoplay: { 299 delay: 500, 300 disableOnInteraction: true, 301 }, 302 }); 303 blockSwiper.autoplay.stop(); 304 photosSlider.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()}); 305 photosSlider.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()}); 306 photosSlider.addEventListener('click', () => {blockSwiper.autoplay.stop()}); 307 308} 309 310const renderNewsItem = (elem, index) => { 311 const item = { 312 id: elem.id, 313 alias: elem.alias, 314 title: elem.title, 315 date: elem.newsdate, 316 day: elem.day, 317 month: elem.month, 318 year: elem.year, 319 preview: elem.preview_img, 320 } 321 322 let block = document.createElement('a'); 323 block.classList.add('news-block'); 324 block.setAttribute('href', `/news/${item.alias}/`); 325 if(index !== 0 && (index+1)%7 === 0) { 326 block.classList.add('large'); 327 } 328 if(index !== 0 && (index+1)%14 === 0) { 329 block.classList.add('left-text'); 330 } 331 332 block.innerHTML = `<div class="preview"> 333 <img src="${item.preview}" alt="${item.title}"> 334 </div> 335 <div class="info"> 336 <div class="title">${item.title}</div> 337 <time datetime="${item.date}" class="date">${item.day} ${item.month} ${item.year}</time> 338 </div>`; 339 340 document.querySelector('.tab-content .news-row').append(block); 341} 342 343const renderRecipesItem = (elem) => { 344 const item = { 345 id: elem.id, 346 title: elem.title, 347 anons: elem.anons, 348 alias: elem.alias, 349 } 350 351 let block = document.createElement('a'); 352 block.setAttribute('href', `/retsepty/${item.alias}/`) 353 block.classList.add('recipe'); 354 block.innerHTML = `<div class="brief"> 355 <div class="title">${item.title}</div> 356 <div class="anons">${item.anons}</div> 357 </div> 358 <div class="preview"> 359 <img src="//static.rondell.ru/data/recipes/previews/${item.id}.jpg" alt="${item.title}"> 360 </div>`; 361 362 document.querySelector('.tab-content .recipes-row').append(block); 363} 364 365 366 367/* 368 ÐолÑÑение даннÑÑ Ñ ÑеÑвеÑа Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ° Ñ Ð½Ð¾Ð²Ð¸Ð½ÐºÐ°Ð¼Ð¸ ÑоваÑов, Ñлева в блоке без поиÑковой вÑдаÑи 369 */ 370const getNewItems = async () => { 371 const response = await fetch('/main/getnewitemsforsearch'); 372 if (!response.ok) { 373 const message = `An error has occured: ${response.status}`; 374 throw new Error(message); 375 } 376 const data = await response.json(); 377 return data; 378} 379 380 381/* 382 Ð ÐµÐ½Ð´ÐµÑ Ð±Ð»Ð¾ÐºÐ° Ñ Ð¿Ð¾Ð¸Ñком без ÑезÑлÑаÑов поиÑка 383 */ 384const renderInitialSearchBlock = (newItems, searchTags) => { 385 let section = document.querySelector('.search-section'); 386 section.innerHTML = ''; 387 388 let parentBlock = document.createElement('div'); 389 parentBlock.classList.add('wrapper'); 390 parentBlock.innerHTML = `<div class="search-block"></div>`; 391 392 section.append(parentBlock); 393 394 395 /*ÑÐµÐ½Ð´ÐµÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ блока Ñ Ð½Ð¾Ð²Ð¸Ð½ÐºÐ°Ð¼Ð¸*/ 396 let newItemsBlock = document.createElement('div'); 397 newItemsBlock.classList.add('new-items'); 398 parentBlock.querySelector('.search-block').append(newItemsBlock);
399 newItems.forEach((item) => { 400 renderCatalogItem(item, parentBlock.querySelector('.new-items')); 401 }) 402 403 404 /*ÑÐµÐ½Ð´ÐµÑ Ð¿Ñавого блока Ñ ÑоÑмой поиÑка*/ 405 let formBlock = document.createElement('div'); 406 formBlock.classList.add('search-form-block'); 407 formBlock.innerHTML = `<form class="search-form" id="searchForm"> 408 <label for="searchInput"> 409 <input type="text" id="searchInput" placeholder="ХоÑÑ Ð½Ð°Ð¹Ñи" autocomplete="off"> 410 </label> 411 <button type="submit"></button> 412 </form> 413 <ul class="hints"></ul> 414 <ul class="recent-requests"></ul> 415 <ul class="tags"></ul>`; 416 417 parentBlock.querySelector('.search-block').append(newItemsBlock); 418 parentBlock.querySelector('.search-block').append(formBlock); 419 420 421 searchTags.forEach((tag) => { 422 let li = document.createElement('li'); 423 li.innerText = tag; 424 formBlock.querySelector('.tags').append(li); 425 li.addEventListener('click', () => clickOnSearchingTags(li)); 426 }) 427 428 if(localStorage.getItem('requests')) { 429 let recentRequests = JSON.parse(localStorage.getItem('requests')); 430 431 if(recentRequests.length > 0) { 432 recentRequests.forEach((el, index) => { 433 if(index < 6) { 434 let li = document.createElement('li'); 435 li.innerText = el; 436 formBlock.querySelector('.recent-requests').append(li); 437 li.addEventListener('click', () => clickOnSearchingTags(li)); 438 } 439 }) 440 } 441 } 442 443 document.querySelector('input#searchInput').addEventListener('change', filledInputAnimation); 444} 445 446 447/* 448 Ð ÐµÐ½Ð´ÐµÑ Ð¸ обÑабоÑка ÑобÑÑий в блоке Ñ Ð¿Ð¾Ð¸Ñком без ÑезÑлÑÑаÑов поиÑка 449 */ 450const loadInitialSearchBlock = async () => { 451 let items = []; 452 let tags = []; 453 454 455 await getNewItems().then(data => { 456 items=data; 457 return items; 458 }); 459 460 await getSearchTags().then(data => { 461 tags=data; 462 return tags; 463 }); 464 465 renderInitialSearchBlock(items, tags); 466 467 if(document.querySelector('.preview-swiper')) { 468 document.querySelectorAll('.preview-swiper').forEach((block) => { 469 let blockSwiper = new Swiper(block, { 470 slidesPerView: 1, 471 spaceBetween: 30, 472 loop: true, 473 pagination: { 474 el: block.querySelector('.swiper-pagination'), 475 clickable: false, 476 dynamicBullets: true, 477 }, 478 speed: 1500, 479 autoplay: { 480 delay: 500, 481 disableOnInteraction: true, 482 }, 483 }); 484 blockSwiper.autoplay.stop(); 485 block.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()}); 486 block.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()}); 487 block.addEventListener('click', () => {blockSwiper.autoplay.stop()}); 488 }) 489 } 490 491 /*document.getElementById('searchInput').focus({ focusVisible: true })*/ 492 showSearchHints(); 493 document.querySelector('#searchForm button[type=submit]').addEventListener('click', (e) => { 494 e.preventDefault(); 495 496 catalog = []; 497 recipes = []; 498 news = []; 499 submitSearchForm(); 500 }); 501} 502 503 504/* 505 Ð ÐµÐ½Ð´ÐµÑ Ð±Ð»Ð¾ÐºÐ° Ñ Ð¿Ð¾Ð¸Ñком Ñ ÑезÑлÑÑаÑами поиÑка 506 */ 507const renderSearchResultsBlock = (request) => { 508 let section = document.querySelector('.search-section'); 509 section.innerHTML = ''; 510 511 let parentBlock = document.createElement('div'); 512 parentBlock.classList.add('search-results'); 513 514 let upperBlock = document.createElement('div'); 515 upperBlock.classList.add('wrapper'); 516 upperBlock.innerHTML = `<!--<button type="button" class="go-back">Ðазад</button>--> 517 <div class="search-request"> 518 <form class="search-form" id="searchForm"> 519 <label for="searchInput"> 520 <input type="text" id="searchInput" placeholder="${request}" autocomplete="off" class="filled"> 521 </label> 522 <button type="submit"></button> 523 </form> 524 <div>ÑезÑлÑÑаÑÑ Ð¿Ð¾ запÑоÑÑ</div> 525 <div class="hints"></div> 526 </div>`; 527 528 let tabsBlock = document.createElement('div'); 529 tabsBlock.classList.add('tabs', 'search-tabs'); 530 tabsBlock.innerHTML = `<div class="wrapper"> 531 <ul></ul> 532 </div>`; 533 534 let tabContentBlock = document.createElement('div'); 535 tabContentBlock.classList.add('tab-content', 'search-tab-content', 'active'); 536 537 parentBlock.append(upperBlock); 538 parentBlock.append(tabsBlock); 539 parentBlock.append(tabContentBlock); 540 section.append(parentBlock); 541 542 showSearchHints(); 543 document.getElementById('searchInput').addEventListener('focus', (e) => { 544 e.target.setAttribute('placeholder', '') 545 }) 546 document.querySelector('#searchForm button[type=submit]').addEventListener('click', (e) => { 547 e.preventDefault(); 548 549 catalog = []; 550 recipes = []; 551 news = []; 552 submitSearchForm(); 553 }) 554} 555 556 557/* 558 Ð ÐµÐ½Ð´ÐµÑ Ñабов, еÑли ÑÑо-Ñо найдено 559 */ 560const renderSearchTabs = (json) => { 561 let tabsNames = { 562 'catalog': 'ÐаÑалог', 563 'recipes': 'РеÑепÑÑ', 564 'news': 'ÐовоÑÑи' 565 } 566 567 json.forEach((el) => { 568 for(let key in tabsNames) { 569 if(el === key) { 570 let li = document.createElement('li'); 571 li.innerText = tabsNames[key]; 572 li.setAttribute('data-content', key); 573 document.querySelector('.search-tabs ul').append(li); 574 } 575 } 576 }) 577} 578 579 580/* 581 Ðлик по Ñабам в блоке Ñ ÑезÑлÑÑаÑами поиÑка, еÑли ÑÑо-Ñо найдено 582 */ 583const clickOnSearchTabs = (el, itemsOffset, newsOffset, recipesOffset) => { 584 document.querySelectorAll('.search-tabs li').forEach((li) => li.classList.remove('active')); 585 el.classList.add('active'); 586 let activeTabType= document.querySelector('.search-tabs li.active').getAttribute('data-content'); 587 renderSearchTabContent(activeTabType, itemsOffset, newsOffset, recipesOffset); 588} 589 590 591/* 592 Ð ÐµÐ½Ð´ÐµÑ ÐºÐ¾Ð½ÑенÑа в завиÑимоÑÑи Ð¾Ñ Ð²ÑбÑанной вкладки, в блоке Ñ ÑезÑлÑÑаÑми поиÑка 593 */ 594const renderSearchTabContent = (dataType, itemsOffset, newsOffset, recipesOffset) => { 595 let tabContentBlock = document.querySelector('.search-tab-content'); 596 tabContentBlock.setAttribute('data-content', dataType); 597 tabContentBlock.innerHTML = ''; 598 599 switch (dataType) { 600 case 'catalog': 601 let itemsBlock = document.createElement('div'); 602 itemsBlock.classList.add('wrapper'); 603 itemsBlock.innerHTML=`<div class="items-row"></div>`; 604 605 let briefBlock = document.createElement('div'); 606 briefBlock.classList.add('items-info'); 607 briefBlock.innerHTML = `<div class="wrapper"> 608 <div class="items-info-inner"> 609 <div class="quantity">ÐÑего ÑоваÑов ${catalog[0].length}</div> 610 <!--<div class="sorting-items select-block"> 611 <button type="button" data-sorting="new">Ðовинки</button> 612 <ul> 613 <li data-sorting="popular">ÐопÑлÑÑнÑе</li> 614 <li data-sorting="new" class="active">Ðовинки</li> 615 </ul> 616 </div>--> 617 </div> 618 </div>`; 619 620 tabContentBlock.append(briefBlock);
621 tabContentBlock.append(itemsBlock); 622 623 catalog[0].forEach((item, index) => { 624 if(index <= itemsOffset-1) { 625 renderCatalogItem(item, document.querySelector('.tab-content .items-row')); 626 } 627 }); 628 629 break; 630 case 'news': 631 let newsBlock = document.createElement('div'); 632 newsBlock.classList.add('wrapper'); 633 newsBlock.innerHTML=`<div class="news-row"></div>`; 634 tabContentBlock.append(newsBlock); 635 636 news[0].forEach((item, index) => { 637 if(index <= newsOffset-1) { 638 renderNewsItem(item, index); 639 } 640 }); 641 break; 642 case 'recipes': 643 let recipesBlock = document.createElement('div'); 644 recipesBlock.classList.add('wrapper'); 645 recipesBlock.innerHTML=`<div class="recipes-row"></div>`; 646 tabContentBlock.append(recipesBlock); 647 648 recipes[0].forEach((item, index) => { 649 if(index <= recipesOffset-1) { 650 renderRecipesItem(item); 651 } 652 }); 653 break; 654 } 655 656 loadItemsOnScroll(itemsOffset, newsOffset, recipesOffset); 657 658} 659 660 661/* 662 Ð ÐµÐ½Ð´ÐµÑ Ð±Ð»Ð¾ÐºÐ° еÑли ниÑего не найдено 663 */ 664const renderNothingFoundBlock = (request) => { 665 let section = document.querySelector('.search-section'); 666 section.innerHTML = ''; 667 668 let parentBlock = document.createElement('div'); 669 parentBlock.classList.add('search-results'); 670 671 let upperBlock = document.createElement('div'); 672 upperBlock.classList.add('wrapper'); 673 upperBlock.innerHTML = `<button type="button" class="go-back">Ðазад</button> 674 <div class="search-request"> 675 <div class="text-center">ÑезÑлÑÑаÑÑ Ð¿Ð¾ запÑоÑÑ</div> 676 <div class="h2">${request}</div> 677 <div class="text-center">ÐиÑего не найдено. <br>ÐопÑобÑйÑе измениÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¸ Ð¼Ñ Ð¿Ð¾Ð¸Ñем еÑÑ Ñаз.</div> 678 </div> 679`; 680 681 parentBlock.append(upperBlock); 682 section.append(parentBlock); 683 684 document.querySelector('.search-results button').addEventListener('click', (e) => { 685 e.preventDefault(); 686 loadInitialSearchBlock(); 687 }); 688} 689 690/* 691 вÑделение ÑвеÑом Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° запÑоÑа еÑли заполнен или ÑокÑÑ 692 */ 693const filledInputAnimation = () => { 694 let input = document.querySelector('input#searchInput'); 695 if(input.value.length > 0) { 696 input.classList.add('filled'); 697 } else { 698 input.classList.remove('filled'); 699 } 700} 701 702/* 703 ÐоказÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð´Ñказки из каÑлога пÑи вводе запÑоÑа в поле поиÑка 704 */ 705const showSearchHints = () => { 706 let input = document.getElementById('searchInput'); 707 let hintsBlock = document.querySelector('.hints'); 708 try { 709 fetch('/main/getsearchhints',) 710 .then((response) => response.json()) 711 .then((json) => { 712 input.addEventListener('input', () => { 713 if(input.value.length >= 2) { 714 hintsBlock.innerHTML = ''; 715 [...json].filter((el) => { 716 if(el !== null && el.toLowerCase().includes(input.value.toLowerCase().trim())) { 717 let li = document.createElement('li'); 718 li.innerText = el; 719 hintsBlock.append(li); 720 li.addEventListener('click', () => { 721 clickOnSearchingTags(li) 722 }); 723 } 724 }); 725 } else { 726 hintsBlock.innerHTML = ''; 727 } 728 }) 729 }) 730 } catch (e) { 731 console.log(e.message) 732 } 733} 734 735 736/* 737 ÐолÑÑение Ñ ÑеÑвеÑа блока Ñо ÑÑаÑиÑнÑми запÑоÑами Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка 738 */ 739const getSearchTags = async () => { 740 const response = await fetch('/main/getsearchtags'); 741 if (!response.ok) { 742 const message = `An error has occured: ${response.status}`; 743 throw new Error(message); 744 } 745 const data = await response.json(); 746 return data; 747} 748 749 750/* 751 Ðаполнение Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° и оÑпÑавка запÑоÑа на ÑеÑÐ²ÐµÑ Ð¿Ð¾ ÐºÐ»Ð¸ÐºÑ Ð½Ð° блок Ñо ÑÑаÑиÑнÑми запÑоÑами 752 */ 753const clickOnSearchingTags = (el) => { 754 let input = document.querySelector('input#searchInput'); 755 input.value = el.innerText; 756 filledInputAnimation(); 757 catalog = []; 758 recipes = []; 759 news = []; 760 submitSearchForm() 761} 762 763 764////////////////////////////////////////////////////////////////////// 765 766/* 767код Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ навеÑÑ 768 */ 769 770const goUpButtonAction = () => { 771 let btn = document.querySelector('.go-up'); 772 let searchSection = document.querySelector('.search-section'); 773 774 window.addEventListener('scroll', () => { 775 if(document.documentElement.scrollTop > screen.height/1.7 || searchSection.scrollTop > screen.height/1.7) { 776 btn.classList.add('active'); 777 778 } else { 779 btn.classList.remove('active'); 780 } 781 }) 782 783 searchSection.addEventListener('scroll', () => { 784 if(searchSection.scrollTop > screen.height/1.7) { 785 btn.classList.add('active'); 786 787 } else { 788 btn.classList.remove('active'); 789 } 790 }) 791 792 btn.addEventListener('click', () => { 793 if(searchSection.classList.contains('active')) { 794 searchSection.scrollTo({ 795 top: 0, 796 behavior: 'smooth' 797 }); 798 } else { 799 window.scrollTo({ 800 top: 0, 801 behavior: 'smooth' 802 }); 803 } 804 805 }) 806 807} 808 809 810/* 811поменÑÑÑ ÑиÑе на неÑазÑÑвное ÑиÑе в аÑÑикÑÐ»Ð°Ñ Ð² названиÑÑ ÑоваÑов, ÑÑÐ¾Ð±Ñ Ð°ÑÑикÑл пеÑеноÑилÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ 812 */ 813const setMdashToItemsTitles = (el) => { 814 if(el.innerText.includes('-')) { 815 el.innerHTML = el.innerText.replace('-', '‑') 816 } 817} 818 819 820document.addEventListener("DOMContentLoaded", () => { 821 if(document.querySelector('.preview-swiper')) { 822 document.querySelectorAll('.preview-swiper').forEach((block) => { 823 let blockSwiper = new Swiper(block, { 824 slidesPerView: 1, 825 spaceBetween: 30, 826 loop: true, 827 pagination: { 828 el: block.querySelector('.swiper-pagination'), 829 clickable: false, 830 dynamicBullets: true, 831 }, 832 speed: 1500, 833 autoplay: { 834 delay: 500, 835 disableOnInteraction: true, 836 }, 837 }); 838 blockSwiper.autoplay.stop(); 839 block.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()}); 840 block.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()}); 841 block.addEventListener('click', () => {blockSwiper.autoplay.stop()}); 842 }) 843 } 844 845 if(document.querySelector('.item-block')) { 846 document.querySelectorAll('.item-block .item-name').forEach(el => setMdashToItemsTitles(el)) 847 } 848 849 850 showHideSearchSection(); 851 loadInitialSearchBlock(); 852 853 goUpButtonAction(); 854}) 855 856/*document.addEventListener('readystatechange', () => { 857 858 if (document.readyState === "complete") { 859 setTimeout(() => { 860 document.querySelector('.preloader').remove(); 861 }, 1000) 862 863 } 864});*/ 865 866
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.