Select Git revision
Forked from
Stud.IP / Stud.IP
Source project has a limited visibility.
-
Jan-Hendrik Willms authored
Closes #968 Merge request studip/studip!558
Jan-Hendrik Willms authoredCloses #968 Merge request studip/studip!558
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
search.js 5.37 KiB
STUDIP.domReady(() => {
var cache = STUDIP.Search.getCache();
// initially hide all filters except for the semester filter
$('#reset-search').hide();
STUDIP.Search.hideAllFilters();
$('div#semester_filter').show();
STUDIP.Search.setActiveCategory('show_all_categories');
STUDIP.Search.showActiveFilters(STUDIP.Search.getFilter());
// searchterm and category can be passed by URL parameters (e.g. through the quicksearch)
var searchterm = $('#search-results').data('searchterm');
var category = $('#search-results').data('category') || location.hash.slice(1);
if(searchterm) {
cache.set('searchterm', searchterm);
if (category) {
STUDIP.Search.setActiveCategory(category);
}
}
// Clear search term
$('#reset-search').on('click', function () {
STUDIP.Search.resetSearch();
return false;
});
// Start search on Enter
$('#search-input').on('keypress', function (e) {
if (e.which === 13) {
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
return false;
}
});
// Delegate events on sidebar categories so we don't have to bind them
// one by one (probably needs some work...) TODO refactor
$('a[id^="search_category"]').on('click', function () {
var category = this.id.substr(this.id.lastIndexOf('_') + 1, this.id.length);
var old_category = cache.get('search_category');
STUDIP.Search.showAllCategories(old_category);
STUDIP.Search.toggleLinkText(old_category);
cache.set('search_category', category);
STUDIP.Search.showAllCategories(category);
STUDIP.Search.expandCategory(category);
STUDIP.Search.toggleLinkText(category);
STUDIP.Search.setActiveCategory(category);
STUDIP.Search.showActiveFilters(STUDIP.Search.getFilter());
return false;
});
// click on 'Alle Ergebnisse'
$('a#show_all_categories').on('click', function() {
var category = cache.get('search_category');
STUDIP.Search.toggleLinkText(category);
STUDIP.Search.showAllCategories(category);
if (!STUDIP.Search.resultsInCategory) {
STUDIP.Search.resetFilters();
}
});
// perform a new search when another filter is selected by the user
$('#globalsearch-page select[id$="_select"]').on('change', function () {
STUDIP.Search.showActiveFilters(STUDIP.Search.getFilter());
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
return false;
}).closest('form').on('submit', function(e) {
e.preventDefault();
});
// set main search bar if a searchterm was typed in before
$('#search-input').val(function() {
if (cache.get('searchterm')) {
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
if (cache.get('search_category')) {
STUDIP.Search.setActiveCategory(cache.get('search_category'));
}
}
return cache.get('searchterm');
});
// Delegate events on result container so we don't have to bind them
// one by one
$('#search-results').on('click', '.search-category a', function () {
var category = $(this).closest('.search-category').data('category');
STUDIP.Search.toggleLinkText(category);
STUDIP.Search.expandCategory(category);
STUDIP.Search.setActiveCategory(category);
return false;
});
// Start searching 500 ms after user stopped typing.
$('#search-input').keyup(_.debounce(function () {
if ($('#search-input').val().trim().length >= STUDIP.Search.searchTermLength) {
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
}
}, 500));
// Click on search button
$('#search-btn').click(function () {
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
return false;
});
// Event driven history changes
var history_timeout;
$(document).on('searched.studip search-category-change.studip', function (event, info) {
let url = location.href.split('#')[0];
if (info.category && info.category !== 'show_all_categories') {
url += `#${info.category}`;
}
url = STUDIP.URLHelper.getURL(url, {
q: info.needle || cache.get('searchterm')
});
// We need to put the history change on a timeout since category changes
// occur more than once in a short period of time
clearTimeout(history_timeout);
history_timeout = setTimeout(() => {
if (location.href !== url) {
history.pushState({
needle: info.needle || STUDIP.Search.getCache().get('searchterm'),
category: info.category
}, '', url)
}
}, 50);
});
$(window).on('popstate', function (event) {
if (!event.originalEvent.state) {
return;
}
let state = event.originalEvent.state;
if (state.category) {
if (state.category === 'show_all_categories') {
$('a#show_all_categories').click();
} else {
$(`a#search_category_${state.category}`).click();
}
}
if (state.needle && state.needle !== STUDIP.Search.getCache().get('searchterm')) {
$('#search-input').val(state.needle);
STUDIP.Search.doSearch(STUDIP.Search.getFilter());
}
})
});