1(function(jQuery){jQuery(function($){if(window.elementorFrontend&&window.elementorFrontend.hooks){window.elementorFrontend.hooks.addAction('frontend/element_ready/widget',function($scope){if($scope.hasClass('elementor-widget-ghd-job-list-component')){initJobList();window.elementor.listenTo(window.elementor.channels.deviceMode,'change',function(){setTimeout(function(){initJobList()},500);})}});} 2$(window).on('elementor/frontend/init',function(){initJobList();}) 3function initJobList(itemsToDisplayAtOnce){$('.ghd-job-list-component').each(function(){if(undefined===itemsToDisplayAtOnce){itemsToDisplayAtOnce=getComputedStyle(this).getPropertyValue('--items-to-display')} 4itemsToDisplayAtOnce=parseInt(itemsToDisplayAtOnce) 5var $jobComponent=$(this) 6var $showMoreButton=$jobComponent.find('.actions .elementor-button') 7var $searchInput=$jobComponent.find('.search input[type="search"]') 8var $filterButton=$jobComponent.find('.search .filter-button') 9var $sortButton=$jobComponent.find('.sort .sort-button') 10var $jobList=$jobComponent.find('.ghd-job-list') 11var $countVisible=$jobComponent.find('.count .current') 12var $countResults=$jobComponent.find('.count .sum') 13var $jobItems=$jobList.find('.ghd-job') 14$jobList.empty() 15var itemsToDisplay=itemsToDisplayAtOnce 16var searchTerm='' 17var sortBy='title-asc' 18var filterCompany=false 19$searchInput.off('keyup.search-job').on('keyup.search-job',function(){searchTerm=$(this).val().trim() 20updateList()}) 21$showMoreButton.off('click.show-more-items').on('click.show-more-items',function(e){e.preventDefault() 22itemsToDisplay+=itemsToDisplayAtOnce 23updateList()}) 24$sortButton.find('select').off('change.sort-job').on('change.sort-job',function(e){e.preventDefault() 25sortBy=$(this).val() 26$sortButton.find('.selected').text($(this).find('option:selected').text()) 27updateList()}) 28$filterButton.find('select').off('change.filter-job').on('change.filter-job',function(e){e.preventDefault() 29filterCompany='off'!==$(this).val()?$(this).val():false 30$filterButton.find('.selected').text($(this).find('option:selected').data('label')) 31updateList()}) 32restoreSession() 33updateList(true) 34$jobComponent.show() 35function updateList(init=false){var searchTerms=searchTerm.replace(/[.*+?^${}()|[\]\\]/g,'\\$&').trim().split(/ /).filter(function(str){return str.trim().length>0}) 36var $filteredItems=$jobItems.filter(function(){var searchText=$(this).find('.title').text()+' '+ 37$(this).find('.location .city').text()+' '+ 38$(this).find('.bottom .company').text() 39var search=true 40var filter=true 41if(Array.isArray(searchTerms)&&searchTerms.length>0){search=false!==searchInString(searchTerms,searchText)} 42if(search&&false!==filterCompany){filter=$(this).find('.company').text().trim()===filterCompany} 43return search&&filter}) 44$filteredItems=sortElements($filteredItems,sortBy,init) 45$jobList.empty().append($filteredItems.slice(0,itemsToDisplay)) 46$countVisible.text(Math.min(itemsToDisplay,$filteredItems.length)) 47$countResults.text($filteredItems.length) 48if(itemsToDisplay<$filteredItems.length){$showMoreButton.show()}else{$showMoreButton.hide()} 49saveSession()} 50function searchInString(searchTerms,searchString){return searchTerms.reduce(function(str,searchTerm){if(false===str){return false;} 51if(searchTerm.trim().length===0){return str} 52var regex=new RegExp(searchTerm,'i') 53if(regex.test(str)){return str}else{return false}},searchString)} 54function sortElements($elements,sortBy,init){var query='.title' 55var sortOrder='asc' 56if(typeof sortBy==='string'&&sortBy.length>0){var sortParams=sortBy.split('-') 57switch(sortParams[0]){case'title':query='.title' 58break;case'location':query='.location > .city' 59break;default:query='.title'} 60if(sortParams.length>1){sortOrder=sortParams[1]}} 61if(init){var $elements_sticky=$elements.filter(function(index,elem){if($(elem).hasClass('sticky')) 62return elem;});$elements=$elements.filter(function(index,elem){if(!$(elem).hasClass('sticky')) 63return elem;});} 64var $items=$elements.sort(function(a,b){var an=$(a).find(query).text() 65var bn=$(b).find(query).text() 66if(an>bn){return 1;} 67if(an<bn){return-1;} 68return 0;}).get() 69if('desc'===sortOrder){$items.reverse()} 70if(init){$items=$.merge($elements_sticky,$items)} 71return $items} 72function restoreSession(){var data=sessionStorage.getItem('job-filter-'+btoa(window.location));if(data){data=JSON.parse(data) 73if(data.searchTerm){searchTerm=data.searchTerm 74$searchInput.val(searchTerm)} 75if(data.filterCompany){filterCompany=data.filterCompany 76$filterButton.find('select').val(filterCompany).trigger('change.filter-job')} 77if(data.sortBy){sortBy=data.sortBy 78$sortButton.find('select').val(sortBy).trigger('change.sort-job')} 79if(data.itemsToDisplay){itemsToDisplay=data.itemsToDisplay}}} 80function saveSession(){var data={searchTerm:searchTerm,filterCompany:filterCompany,sortBy:sortBy,itemsToDisplay:itemsToDisplay,};sessionStorage.setItem('job-filter-'+btoa(window.location),JSON.stringify(data));}})}})})(window.jQuery)
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.