Skip to content
Snippets Groups Projects
Select Git revision
  • 737c0b2ade4ea92ea85ad9c536553abfcbc96877
  • main default protected
  • step-3263
  • feature/plugins-cli
  • feature/vite
  • step-2484-peerreview
  • biest/issue-5051
  • tests/simplify-jsonapi-tests
  • fix/typo-in-1a70031
  • feature/broadcasting
  • database-seeders-and-factories
  • feature/peer-review-2
  • feature-feedback-jsonapi
  • feature/peerreview
  • feature/balloon-plus
  • feature/stock-images-unsplash
  • tic-2588
  • 5.0
  • 5.2
  • biest/unlock-blocks
  • biest-1514
21 results

search.js

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    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());
            }
        })
    });