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