1jQuery(document).ready(function ($) { 2 3 // Config object is required 4 if (typeof premmerceSearch === 'undefined') { 5 return; 6 } 7 8 var searchSelector = '[id^="woocommerce-product-search-field-"]'; 9 10 if (typeof premmerceSearch.searchField !== 'undefined' && premmerceSearch.searchField) { 11 searchSelector += ',' + premmerceSearch.searchField; 12 } 13 14 var search = $(searchSelector); 15 16 var autocompleteItemTemplate = $('[data-autocomplete-template="item"]').clone(); 17 var autocompleteAllResultTemplate = $('[data-autocomplete-template="allResult"]').clone(); 18 19 20 if (premmerceSearch.forceProductSearch) { 21 22 search.each(function () { 23 var searchForm = $(this).parent('form'); 24 25 $(document).on('submit', searchForm, function () { 26 var el = $('<input/>', 27 {'type': 'hidden', 'name': 'post_type', 'value': 'product'}); 28 29 searchForm.append(el); 30 }); 31 }); 32 } 33 34 35 search.each(function () { 36 var search = $(this); 37 38 search.autocomplete({ 39 source: function (name, response) { 40 showSpinner(search); 41 42 $.ajax( { 43 url: premmerceSearch.url, 44 headers: {"X-WP-Nonce": premmerceSearch.nonce}, 45 dataType: 'json', 46 data: name, 47 success: function (data) { 48 hideSpinner(); 49 response(data); 50 } 51 }); 52 }, 53 messages: { 54 noResults: '', 55 results: function () {} 56 }, 57 delay: 500, 58 minLength: parseInt(premmerceSearch.minLength), 59 open: function () { 60 let form = $(this).closest('form'); 61 62 // Show all result handler 63 $(autocompleteAllResultTemplate, '[data-autocomplete-show-all-result]').on('click', function (event) { 64 event.preventDefault(); 65 form.submit(); 66 }); 67 68 $('.ui-autocomplete').css('width', search.css('width')); 69 $('.ui-autocomplete').append(autocompleteAllResultTemplate); 70 71 } 72 }); 73 74 search.autocomplete('instance')._renderItem = function (ul, item) { 75 76 ul.addClass('autocomplete autocomplete__frame'); 77 78 let li = autocompleteItemTemplate.clone(); 79 80 li.find('[data-autocomplete-product-name]').html(item.label); 81 li.find('[data-autocomplete-product-price]').html(item.price); 82 li.find('[data-autocomplete-product-link]').attr('href', item.link); 83 li.find('[data-autocomplete-product-add-to-cart]').attr('href', `?add-to-cart=${item.id}`); 84 85 if( ! item.isPurchasable ) { 86 li.find('[data-autocomplete-product-add-to-cart]').css({'display':'none'}); 87 } 88 89 if (item.image) { 90 li.find('[data-autocomplete-product-img]').attr({'src': item.image, 'alt': item.label}); 91 li.find('[data-autocomplete-product-photo]').show(); 92 } 93 94 return li.appendTo(ul); 95 }; 96 }); 97 98 function showSpinner(field) { 99 100 var fieldPosition = field.offset(); 101 var verticalPadding = (field.innerHeight() - field.height()) / 2; 102 var size = field.height(); 103 104 var wrapper = $('<div>', { 105 class: 'premmerce-search-spinner', 106 css: { 107 top: fieldPosition.top + verticalPadding, 108 left: fieldPosition.left + field.outerWidth() - size - verticalPadding, 109 width: size, 110 height: size 111 } 112 }); 113 114 $('body').prepend(wrapper); 115 } 116 117 function hideSpinner() { 118 $('.premmerce-search-spinner').remove(); 119 } 120});
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.