const $ = global.$; // Plain InfiniteScroll without jquery plugin to avoid overhead // If needed plase see https://v3.infinite-scroll.com/extras.html // $(elem).infiniteScroll does not work // For API Reference See Vanila js Section of docs const InfiniteScroll = require('infinite-scroll'); import {EtrackerUtils} from "./EtrackerUtils"; export class SearchUtils { static loadResults() { this.shouldPreloadSearchEnteries = false; this.initEventsScrollPreservance(); this.initialSearchRequest(); } static initialSearchRequest(){ const query = $('#query').val(); const querySource = $('#querySource').val(); const infiniteScrollInstance = InfiniteScroll.data(".search-results #dummy-wrapper"); $(".results-wrapper").detach(); $(".search-hits").empty(); if(infiniteScrollInstance instanceof InfiniteScroll){ infiniteScrollInstance.destroy(); } // ETracker-Event asynchron absetzen: if (query.length > 0) { const searchCategory = $("#query").data('search-category'), hasCategory = typeof searchCategory !== "undefined"; if (!window.isPbe) { window.setTimeout(EtrackerUtils.fireETrackerEvent, 250, (hasCategory ? searchCategory : 'Kombi-Suche'), query, 'Suche', ''); } } $('#infscr-initial-loading').show(); const ajaxUrl = $('.search-results').data("initialsearch-url") + "?preSearch=oidSearch&querySource=" + encodeURIComponent(querySource) + "&query=" + encodeURIComponent(query) + SearchUtils.getQueryParameter(); const resultWrapper = $("#dummy-wrapper"); $.ajax({ url: ajaxUrl, success: function (result) { $(resultWrapper).append(result); // oidSearch redirect: var rUrl = $("#oidmatch").data("redirect-url"); if (rUrl !== undefined && rUrl.trim().length > 0) { location.href = rUrl; } else { SearchUtils.initInfiniteScroll(); SearchUtils.initFeedbackToggle(); SearchUtils.fillSearchCategoryAddition(query); $('#infscr-initial-loading').hide(); } } }); } /** * Dient zum Ein/Ausblenden der Feedback Funktion von Einschub-Suchen. * (insbesondere dem Wegweiser) */ static initFeedbackToggle() { $('#feedbackToggle').click(function () { var feedbackBlock = $('#feedbackBlock'); if (feedbackBlock.is(':hidden')) { $.ajax({ url: $(this).data("feedback-url"), success: function (result) { // TODO: Feedback form prüfen $(feedbackBlock).append($(result)); console.log($(result).find("#feedbackBlock")); $(this).show('slow'); SearchUtils.initFeedback(); } }); } else { feedbackBlock.hide('slow'); } return false; }); } /** * Feedback Formular für Einschub-Suchen. */ static initFeedback() { $('#feedbackBlock').find('form').submit( function () { $ .post($('#feedbackToggle').data('feedback-url'), $( '#feedbackBlock').find('form').serialize(), function (msg) { $('#feedbackBlock').html(msg); if ($('#feedbackBlock').find('form') .size() > 0) { SearchUtils.initFeedback(); } else { $('#feedbackToggle').hide(); } }); return false; }); } static fillSearchCategoryAddition(queryP) { const buttonWrapper = $('#searchcategoryaddition'); const firstWrapper = $('.results-wrapper').first(); const btnAll = $(''); const isZeroResults = $('.search-results .results-wrapper').length === 0; const isKombiWrapper = $('.search-results').hasClass("kombi-wrapper"); const searchCategoryAdditionLink = buttonWrapper.attr('data-searchcategoryaddition-link'); // const searchCategoryAdditionTitle = buttonWrapper.attr('data-searchcategoryaddition-title'); const defaultSearchText = "Allgemeine Suche"; buttonWrapper.children().remove(); buttonWrapper.append(btnAll); // btnAll.text(searchCategoryAdditionTitle); btnAll.attr('href', searchCategoryAdditionLink + "?query=" + encodeURIComponent(queryP)); if (isKombiWrapper && !isZeroResults) { const defaultSearchTextAll = "Alle "; const ephasizedText = $('').text(`${firstWrapper.attr('data-totalresults')} Treffer`); btnAll.addClass('active').text(defaultSearchTextAll).append(ephasizedText); $('.results-wrapper').not('.no-border').each(function () { const rw = $(this); const btn = $('').addClass('btn-small').attr('href', rw.attr('data-searchcategoryaddition-link')).appendTo(buttonWrapper); let txt = rw.attr('data-searchcategoryaddition-title'); if (rw.attr('data-result-count') !== undefined) { txt = txt + ' (' + rw.attr('data-result-count') + ')'; } btn.text(txt); }) } else if(!isKombiWrapper){ buttonWrapper.insertAfter('.search-filter-form'); btnAll.text(defaultSearchText); btnAll.attr('href', buttonWrapper.attr('data-searchcategoryaddition-link') + "?query=" + encodeURIComponent(queryP)); } else { buttonWrapper.children().remove(); } } /** * Berechnet die Url-Parameter für die Suchfilter. */ static getQueryParameter() { var queryFields = $('#ev-search-filter-form').find('[data-queryparam]'); var queryParams = ""; if (queryFields.length) { var input = queryFields.filter('input[type!="checkbox"]'); if (input.length) { queryParams = queryParams + "&" + $.param(input); } var select = queryFields.filter('select'); if (select.length) { queryParams = queryParams + "&" + $.param(select); } var check = queryFields.filter('input[type="checkbox"]:checked'); if (check.length) { queryParams = queryParams + "&" + $.param(check); } } return queryParams; } /** * Berechnet die Url-Parameter für die Seitenpaginierung. */ static getPagingParameter() { var params = ""; var resultWrapper = $('.results-wrapper'); if (resultWrapper.length) { var total = resultWrapper.data("totalresults"); var itemsPerPage = resultWrapper.data("resultsperpage"); var numPages = resultWrapper.data("numpages"); if (!(total === undefined)) { params = params + "&totalResults=" + total; } if (!(itemsPerPage === undefined)) { params = params + "&resultsPerPage=" + itemsPerPage; } if (!(numPages === undefined)) { params = params + "&numPages=" + numPages; } } return params; } static initEventsScrollPreservance(){ $(document).on("click", "#search-results .results-wrapper .event-component",function(event){ const originalHistoryState = history.state ||{}; originalHistoryState.lastScrollPosition = $(window).scrollTop(); history.replaceState(originalHistoryState, document.title); }); } static scrollToLastViewedEvent(){ if(history.state && history.state.lastScrollPosition){ requestAnimationFrame(()=>{ $('html, body').animate( { scrollTop : history.state.lastScrollPosition }, 500); }); } } static updateSearchHistoryState(lastScrolledPage){ try{ const originalHistoryState = {}; originalHistoryState.lastScrolledSearchPage = lastScrolledPage; history.replaceState(originalHistoryState, document.title); } catch(e) { console.warn("Could not update history state", e); } } /** * Initialisiert das Endlosscrolling für Trefferlisten. */ static initInfiniteScroll() { ihk.resources = ihk.resources || {loadSpinner: ""}; const $infiniteScrollContainer = $('.search-results #dummy-wrapper'); if ($infiniteScrollContainer.length > 0) { const $pagingNav = $('.paging-nav'); $pagingNav.hide(); SearchUtils.updateSearchResultsMessage(); SearchUtils.highlightSearchTerm(); const infiniteScrollObj = new InfiniteScroll($infiniteScrollContainer[0],{ onInit: function(){ if(history.state && history.state.lastScrolledSearchPage ){ const lastScrolledPageFromHistory = history.state.lastScrolledSearchPage; // load the last scrolled page after leaving the page and returning if((lastScrolledPageFromHistory > 1) && (lastScrolledPageFromHistory >= this.pageIndex)){ SearchUtils.shouldPreloadSearchEnteries = true; requestAnimationFrame(()=>{ this.loadNextPage(); }); } } }, path: function () { // Load the second page because we do presearch const index = this.pageIndex + 1; const resultWrapper = $('.results-wrapper'); if (resultWrapper.length) { const numPages = resultWrapper .data("numpages"); if ((numPages === undefined) || (index <= numPages)) { return $('.search-results') .data( "infinitescroll-normal-return-url") + "?query=" + encodeURIComponent($( '#query').val()) + "¤tPage=" + index + SearchUtils.getQueryParameter() + SearchUtils.getPagingParameter(); } } return "";// damit nicht stumpf wiederholt // das letzte Ergebnis // angehangen wird! }, append: ".results-wrapper", responseBody: "html", history: false, // debug: true -> for developement }); infiniteScrollObj.on( 'append', function( response, path, items ) { if($(items).is(".results-wrapper")){ const pageIndex = this.pageIndex; if(SearchUtils.shouldPreloadSearchEnteries){ if(history.state && history.state.lastScrolledSearchPage > pageIndex){ this.loadNextPage(); } else { SearchUtils.shouldPreloadSearchEnteries = false; SearchUtils.scrollToLastViewedEvent(); } }else { SearchUtils.updateSearchHistoryState(pageIndex); SearchUtils.highlightSearchTerm(); } }else { // Destroy falls keine results mehr infiniteScrollObj.destroy(); } }); } } /** * Markiert nach erfolgter Suche den Suchbegriff innerhalb der Trefferliste. */ static highlightSearchTerm() { var $searchResults = $('.search-results .results-wrapper .result'), $searchField = $('#query'); // highlight search term if ($searchResults.length > 0 && $searchField.length > 0) { var searchTerm = $searchField.val(); if (typeof searchTerm !== 'undefined') { $searchResults.highlight(searchTerm); } } } /** * Liefert nach erfolgter Suche die korrekte Anzahl Treffer. und erzeugt * gegebenfalls für Etracker einen 0-Treffer Event. */ static updateSearchResultsMessage() { var searchHits = $('.search-hits'); var resultWrapper = $('.results-wrapper'); var resultVal = 0; if (typeof resultWrapper.val() !== "undefined") { resultVal = resultWrapper.data("totalresults"); } // IHK-2681: 0-Treffer-Suche if (resultVal === 0) { var searchCategoryE = $("#query").data('search-category'), hasCategoryE = typeof searchCategoryE !== "undefined"; var queryE = $('#query').val(); var actionE = '0-Treffer-Suche'; var querySource = $('#querySource').val(); if ('autocomplete' === querySource) { actionE = '0-Treffer-Vorschlag'; $('#querySource').val('manual'); } if (!window.isPbe) { //todo: etracker window.setTimeout(EtrackerUtils.fireETrackerEvent, 250, (hasCategoryE ? searchCategoryE : 'Kombi-Suche'), queryE, actionE, ''); } } searchHits.text(resultVal + " Treffer"); } static getAllUrlParams(url) { // get query string from url (optional) or window var queryString = url ? url.split('?')[1] : window.location.search.slice(1); // we'll store the parameters here var obj = {}; // if query string exists if (queryString) { // stuff after # is not part of query string, so get rid of it queryString = queryString.split('#')[0]; // split our query string into its component parts var arr = queryString.split('&'); for (var i=0; i