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