var cache = null; const Search = { lastSearch: null, lastSearchFilter: null, resultsInCategory: false, searchTermLength: 3, getCache: function () { if (cache === null) { let prefix = ''; if ($('meta[name="studip-cache-prefix"]').length > 0) { prefix = $('meta[name="studip-cache-prefix"]').attr('content'); } cache = STUDIP.Cache.getInstance(prefix); } return cache; }, /** * This function starts the actual search via AJAX call. * * @param {Object} filter object with filter information (e.g. 'category', 'semester', etc.) * that is set by the filter selects in the sidebar. */ doSearch: function (filter) { var cache = STUDIP.Search.getCache(); var searchterm = $('#search-input').val().trim() || cache.get('searchterm'); var hasValue = searchterm && searchterm.length >= STUDIP.Search.searchTermLength; var resultsDiv = $('#search-results'); var wrapper = $('#search'); const data = resultsDiv.data(); const limit = 100; if (searchterm === '') { return; } if (!hasValue) { $('#search-term-invalid .searchtermlen').text(STUDIP.Search.searchTermLength); $('#search-term-invalid').show(); } else { $('#search-term-invalid').hide(); } if (!hasValue || STUDIP.Search.lastSearch === searchterm && JSON.stringify(STUDIP.Search.lastSearchFilter) === JSON.stringify(filter)) { return; } STUDIP.Search.resultsInCategory = false; $('#search-no-result').hide(); $('#reset-search').show(); STUDIP.Search.resetSearchCategories(); STUDIP.Search.greyOutSearchCategories(); cache.set('searchterm', searchterm); STUDIP.Search.lastSearch = searchterm; STUDIP.Search.lastSearchFilter = filter; // Display spinner symbol, user should always see something is happening. wrapper.addClass('is-searching'); // Call AJAX endpoint and get search results. $.getJSON(STUDIP.URLHelper.getURL('dispatch.php/globalsearch/find/' + limit), { search: searchterm, filters: JSON.stringify(filter) }).done(function (json) { // Trigger searched event (regardless of successful or not) $(document).trigger('searched.studip', { needle: searchterm, category: STUDIP.Search.getActiveCategory() }); resultsDiv.empty(); // No results found... if (!$.isPlainObject(json) || $.isEmptyObject(json)) { wrapper.removeClass('is-searching'); $('#search-no-result .searchterm').text(searchterm); $('#search-no-result').show(); STUDIP.Search.setActiveCategory('show_all_categories'); return; } // Iterate over each result category. $.each(json, function (name, value) { var category = STUDIP.Search.printCategory(name, value, data); resultsDiv.append(category); }); if (STUDIP.Search.getActiveCategory() && STUDIP.Search.getActiveCategory() !== 'show_all_categories') { STUDIP.Search.expandCategory(STUDIP.Search.getActiveCategory()); if (!STUDIP.Search.resultsInCategory) { $('#search-no-result .searchterm').text(searchterm); $('#search-no-result').show(); } } wrapper.removeClass('is-searching'); }).fail(function (xhr, status, error) { if (error) { window.alert(error); } }); }, printCategory: function (name, value, data) { // Create an
for category. var allResultsText = data.allResults; var category = $(`
`); var header = $('
').appendTo(category); var categoryBodyDiv = $(`
`).appendTo(category); var counter = 0; var isActive = STUDIP.Search.getActiveCategory() === name; if (isActive) { STUDIP.Search.resultsInCategory = true; } // Create header name $(`

`) .append(`${value.name}`) .appendTo(header); if (value.more) { $(`
`) .append(`${allResultsText}`) .toggle(isActive) .appendTo(header); } // Process results and create corresponding entries. $.each(value.content, function (index, result) { STUDIP.Search.printSingleResult(name, data, result, counter, value.fullsearch, categoryBodyDiv); counter += 1; }); $(`a#search_category_${name}`) .removeClass('no-result') .text(`${value.name} (${counter}${value.plus ? '+' : ''})`) .attr('tabindex', '0'); // We have more search results than shown, provide link to // full search if available. if (value.more) { var footer = $('