From 4a8756ddbceca8d9f1cbb09f4edffdbd7968c85a Mon Sep 17 00:00:00 2001
From: Thomas Hackl <hackl@data-quest.de>
Date: Fri, 3 Nov 2023 07:17:31 +0000
Subject: [PATCH] =?UTF-8?q?Resolve=20"Vorlesungsverzeichnis:=20Umstellen?=
 =?UTF-8?q?=20der=20Filter=20setzt=20die=20Suche=20zur=C3=BCck"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #3043

Merge request studip/studip!2171
---
 app/controllers/search/courses.php            | 18 +++++++++++++++--
 resources/vue/components/SearchWidget.vue     |  7 +++++++
 resources/vue/components/tree/StudipTree.vue  | 20 ++++++++++++++++++-
 .../vue/components/tree/TreeSearchResult.vue  |  8 +++++++-
 4 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/app/controllers/search/courses.php b/app/controllers/search/courses.php
index 71b7f7d689a..50a348066fa 100644
--- a/app/controllers/search/courses.php
+++ b/app/controllers/search/courses.php
@@ -30,6 +30,7 @@ class Search_CoursesController extends AuthenticatedController
         $this->type = Request::option('type', 'semtree');
         $this->semester = Request::option('semester', Semester::findCurrent()->id);
         $this->semClass = Request::int('semclass', 0);
+        $this->search = Request::get('search', '');
     }
 
     public function index_action()
@@ -69,17 +70,30 @@ class Search_CoursesController extends AuthenticatedController
     {
         $sidebar = Sidebar::Get();
 
-        $semWidget = new SemesterSelectorWidget($this->url_for(''), 'semester');
+        $semWidget = new SemesterSelectorWidget(URLHelper::getURL('', ['type' => $this->type, 'semclass' => $this->semClass]), 'semester');
         $semWidget->includeAll(false);
         $semWidget->setId('semester-selector');
         $semWidget->setSelection($this->semester);
         $sidebar->addWidget($semWidget);
 
+        $params = [
+            'type' => $this->type
+        ];
+        if ($this->semClass !== 0) {
+            $params['semclass'] = $this->semClass;
+        }
+        if ($this->semester !== '') {
+            $params['semester'] = $this->semester;
+        }
+        if ($this->search !== '') {
+            $params['search'] = $this->search;
+        }
         $classWidget = $sidebar->addWidget(new SelectWidget(
             _('Veranstaltungskategorie'),
-            URLHelper::getURL('', ['type' => $this->type, 'semester' => $this->semester]),
+            URLHelper::getURL('', $params),
             'semclass'
         ));
+        $classWidget->setId('semclass-selector');
         $classWidget->addElement(new SelectElement(0, _('Alle')));
         foreach (SemClass::getClasses() as $class) {
             if (!$class['studygroup_mode']) {
diff --git a/resources/vue/components/SearchWidget.vue b/resources/vue/components/SearchWidget.vue
index b583d834242..b2afcf23c60 100644
--- a/resources/vue/components/SearchWidget.vue
+++ b/resources/vue/components/SearchWidget.vue
@@ -71,6 +71,13 @@ export default {
             this.searchterm = '';
             STUDIP.eventBus.emit('cancel-search');
         }
+    },
+    mounted() {
+        const url = new URL(window.location.href);
+        if (url.searchParams.has('search')) {
+            this.searchterm = url.searchParams.get('search');
+            this.doSearch();
+        }
     }
 }
 </script>
diff --git a/resources/vue/components/tree/StudipTree.vue b/resources/vue/components/tree/StudipTree.vue
index be57f16ddf1..136fc954982 100644
--- a/resources/vue/components/tree/StudipTree.vue
+++ b/resources/vue/components/tree/StudipTree.vue
@@ -31,7 +31,7 @@
             <tree-search-result :search-config="searchConfig"></tree-search-result>
         </div>
         <MountingPortal v-if="withSearch" mountTo="#search-widget" name="sidebar-search">
-            <search-widget :min-length="3"></search-widget>
+            <search-widget v-if="currentNode" :min-length="3" ref="searchWidget"></search-widget>
         </MountingPortal>
     </div>
 </template>
@@ -175,6 +175,18 @@ export default {
         },
         exportUrl() {
             return STUDIP.URLHelper.getURL('dispatch.php/tree/export_csv');
+        },
+        injectSearchterm(targetId, searchterm) {
+            const form = document.getElementById(targetId).querySelector('form');
+            let input = form.querySelector('input[type="hidden"][name="search"]');
+            if (!input) {
+                input = document.createElement('input');
+                input.setAttribute('id', `${targetId}-searchterm`);
+                input.setAttribute('type', 'hidden');
+                input.setAttribute('name', 'search');
+                form.appendChild(input);
+            }
+            input.setAttribute('value', searchterm);
         }
     },
     mounted() {
@@ -202,14 +214,20 @@ export default {
             this.searchConfig = {
                 searchterm,
                 semester: this.semester,
+                semclass: this.semClass,
                 classname: this.startNode.attributes.classname,
                 startId: this.currentNode.id,
             };
+            this.injectSearchterm('semester-selector', searchterm);
+            this.injectSearchterm('semclass-selector', searchterm);
             this.isSearching = true;
         });
 
         this.globalOn('cancel-search', () => {
             this.searchConfig = {};
+            this.searchterm = '';
+            document.getElementById('semester-selector-searchterm')?.remove();
+            document.getElementById('semclass-selector-searchterm')?.remove();
             this.isSearching = false;
         });
     }
diff --git a/resources/vue/components/tree/TreeSearchResult.vue b/resources/vue/components/tree/TreeSearchResult.vue
index c4e0f415502..013c1ee9da3 100644
--- a/resources/vue/components/tree/TreeSearchResult.vue
+++ b/resources/vue/components/tree/TreeSearchResult.vue
@@ -101,7 +101,13 @@ export default {
                     );
 
                     this.getNode(this.searchConfig.startId).then(response => {
-                        return this.getNodeCourses(response.data.data, this.searchConfig.semester, 0, this.searchConfig.searchterm, true);
+                        return this.getNodeCourses(
+                            response.data.data,
+                            this.searchConfig.semester,
+                            this.searchConfig.semclass,
+                            this.searchConfig.searchterm,
+                            true
+                        );
                     }).then(courses => {
                         this.courses = courses.data.data;
 
-- 
GitLab