From 8b601a5f8c9abb66fb268a55c3aba5cf93090f1e Mon Sep 17 00:00:00 2001 From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de> Date: Tue, 10 May 2022 20:29:56 +0000 Subject: [PATCH] allow searching for courses in next semester, re #766 Merge request studip/studip!594 --- .../globalsearch/GlobalSearchCourses.php | 13 ++++++++++--- lib/classes/globalsearch/GlobalSearchForum.php | 11 +++++++++-- .../globalsearch/GlobalSearchMyCourses.php | 18 +++++++++++++----- .../assets/javascripts/lib/global_search.js | 3 +-- templates/globalsearch/searchbar.php | 1 - 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/lib/classes/globalsearch/GlobalSearchCourses.php b/lib/classes/globalsearch/GlobalSearchCourses.php index a966d97c477..4cc3c0f904b 100644 --- a/lib/classes/globalsearch/GlobalSearchCourses.php +++ b/lib/classes/globalsearch/GlobalSearchCourses.php @@ -62,12 +62,19 @@ class GlobalSearchCourses extends GlobalSearchModule implements GlobalSearchFull // generate SQL for the given sidebar filter (semester, institute, seminar_type) if ($filter['category'] === self::class || $filter['category'] === 'show_all_categories') { if ($filter['semester']) { - $semester = Semester::findByTimestamp($filter['semester']); + if ($filter['semester'] === 'future') { + $semester = Semester::findCurrent(); + $next_semester = Semester::findNext(); + $semester_ids = array_filter([$semester->id, $next_semester->id]); + } else { + $semester = Semester::findByTimestamp($filter['semester']); + $semester_ids = [$semester->id]; + } $semester_join = "LEFT JOIN semester_courses ON (courses.Seminar_id = semester_courses.course_id) "; $semester_condition = " AND ( - `courses`.start_time <= " . DBManager::get()->quote($filter['semester']) ." - AND (`semester_courses`.semester_id IS NULL OR semester_courses.semester_id = " . DBManager::get()->quote($semester->getId()).") + `courses`.start_time <= " . DBManager::get()->quote($semester->beginn) ." + AND (`semester_courses`.semester_id IS NULL OR semester_courses.semester_id IN (" . join(',', array_map([DBManager::get(), 'quote'], $semester_ids)) . ")) ) "; } if ($filter['institute']) { diff --git a/lib/classes/globalsearch/GlobalSearchForum.php b/lib/classes/globalsearch/GlobalSearchForum.php index 21287d45232..83558bdf296 100644 --- a/lib/classes/globalsearch/GlobalSearchForum.php +++ b/lib/classes/globalsearch/GlobalSearchForum.php @@ -56,9 +56,16 @@ class GlobalSearchForum extends GlobalSearchModule implements GlobalSearchFullte // generate SQL condition for the semester filter in the sidebar if ($filter['category'] == self::class || $filter['category'] == "show_all_categories") { if ($filter['semester'] != "") { - $semester = Semester::findByTimestamp($filter['semester']); + if ($filter['semester'] === 'future') { + $semester = Semester::findCurrent(); + $next_semester = Semester::findNext(); + $semester_end = $next_semester ? $next_semester->ende : $semester->ende; + } else { + $semester = Semester::findByTimestamp($filter['semester']); + $semester_end = $semester->ende; + } $semester_condition = " AND (`mkdate` >= " . DBManager::get()->quote($semester['beginn']) . - " AND `mkdate` <= " . DBManager::get()->quote($semester['ende']) . ") "; + " AND `mkdate` <= " . DBManager::get()->quote($semester_end) . ") "; } } diff --git a/lib/classes/globalsearch/GlobalSearchMyCourses.php b/lib/classes/globalsearch/GlobalSearchMyCourses.php index 715fda9fa4d..c761a102c20 100644 --- a/lib/classes/globalsearch/GlobalSearchMyCourses.php +++ b/lib/classes/globalsearch/GlobalSearchMyCourses.php @@ -48,12 +48,20 @@ class GlobalSearchMyCourses extends GlobalSearchModule // generate SQL for the given sidebar filter (semester, institute, seminar_type) if ($filter['category'] === self::class || $filter['category'] == 'show_all_categories') { if ($filter['semester']) { - $semester = Semester::findByTimestamp($filter['semester']); + if ($filter['semester'] === 'future') { + $semester = Semester::findCurrent(); + $next_semester = Semester::findNext(); + $semester_ids = array_filter([$semester->id, $next_semester->id]); + } else { + $semester = Semester::findByTimestamp($filter['semester']); + $semester_ids = [$semester->id]; + } $semester_join = "LEFT JOIN semester_courses ON (courses.Seminar_id = semester_courses.course_id) "; - $semester_condition = " AND ( - `courses`.start_time <= " .DBManager::get()->quote($filter['semester'])." - AND (`semester_courses`.semester_id IS NULL OR semester_courses.semester_id = " .DBManager::get()->quote($semester->getId()). " ) - ) "; + $semester_condition = " + AND ( + `courses`.start_time <= " . DBManager::get()->quote($semester->beginn) ." + AND (`semester_courses`.semester_id IS NULL OR semester_courses.semester_id IN (" . join(',', array_map([DBManager::get(), 'quote'], $semester_ids)) . ")) + ) "; } if ($filter['institute']) { $institutes = self::getInstituteIdsForSQL($filter['institute']); diff --git a/resources/assets/javascripts/lib/global_search.js b/resources/assets/javascripts/lib/global_search.js index 49b3e03cb3b..dbd045b274a 100644 --- a/resources/assets/javascripts/lib/global_search.js +++ b/resources/assets/javascripts/lib/global_search.js @@ -36,7 +36,6 @@ const GlobalSearch = { var resultsPerType = resultsDiv.data('results-per-type'); var moreResultsText = resultsDiv.data('more-results'); var limit = resultsPerType * 3; - var currentSemester = resultsDiv.data('current-semester'); var wrapper = $('#globalsearch-searchbar'); if (searchterm === '') { @@ -57,7 +56,7 @@ const GlobalSearch = { // Call AJAX endpoint and get search results. $.getJSON(STUDIP.URLHelper.getURL('dispatch.php/globalsearch/find/' + limit, {}, true), { search: searchterm, - filters: '{"category":"show_all_categories","semester":"' + currentSemester + '"}' + filters: '{"category":"show_all_categories","semester":"future"}' }).done(function(json) { resultsDiv.empty(); diff --git a/templates/globalsearch/searchbar.php b/templates/globalsearch/searchbar.php index ae3a79cf072..a06ba1bf5c8 100644 --- a/templates/globalsearch/searchbar.php +++ b/templates/globalsearch/searchbar.php @@ -18,7 +18,6 @@ </div> <div id="globalsearch-results" data-more-results="<?= _('alle anzeigen') ?>" data-no-result="<?= _('Keine Ergebnisse gefunden.') ?>" - data-current-semester="<?= htmlReady(GlobalSearchModule::getCurrentSemester()) ?>" data-results-per-type="<?= Config::get()->GLOBALSEARCH_MAX_RESULT_OF_TYPE ?>" ></div> </div> -- GitLab