diff --git a/VipsPlugin.php b/VipsPlugin.php index 7852f8ca8a5faae13c26e0250a8cb01d60d038c4..1ff8d7da36c30e316b00e5f55172fd779db9e797 100644 --- a/VipsPlugin.php +++ b/VipsPlugin.php @@ -42,6 +42,7 @@ StudipAutoloader::addClassLookups([ 'VipsGroup' => __DIR__ . '/lib/VipsGroup.php', 'VipsGroupMember' => __DIR__ . '/lib/VipsGroupMember.php', 'VipsLtiLink' => __DIR__ . '/lib/VipsLtiLink.php', + 'VipsSearchWidget' => __DIR__ . '/lib/VipsSearchWidget.php', 'VipsSolution' => __DIR__ . '/lib/VipsSolution.php', 'VipsSolutionArchive' => __DIR__ . '/lib/VipsSolutionArchive.php', 'VipsTest' => __DIR__ . '/lib/VipsTest.php' diff --git a/controllers/pool.php b/controllers/pool.php index 008ff507cb7fe1c74bea65c1963ed371a15ef120..f355f19a73f951f9f3199ddc7bf170b108a16949 100644 --- a/controllers/pool.php +++ b/controllers/pool.php @@ -66,7 +66,9 @@ class PoolController extends StudipController $page = Request::int('page', 1); $size = Config::get()->ENTRIES_PER_PAGE; - $search_filter = Request::getArray('search_filter'); + $search_filter = Request::getArray('search_filter') + ['search_string' => '', 'exercise_type' => '']; + $search_filter['search_string'] = Request::get('pool_search_parameter', $search_filter['search_string']); + $search_filter['exercise_type'] = Request::get('exercise_type', $search_filter['exercise_type']); if (Request::submitted('start_search') || Request::int('pool_search')) { $search_filter = [ @@ -94,6 +96,20 @@ class PoolController extends StudipController ORDER BY title"; $search = new SQLSearch($sql, _vips('Titel der Aufgabe')); + $widget = new VipsSearchWidget($this->url_for('pool/exercises', ['exercise_type' => $search_filter['exercise_type']])); + $widget->addNeedle(_vips('Suche'), 'pool_search', true, $search, 'function(id, name) { this.value = name; this.form.submit(); }', $search_filter['search_string']); + Sidebar::get()->addWidget($widget); + + $widget = new SelectWidget(_vips('Aufgabentyp'), $this->url_for('pool/exercises', ['pool_search_parameter' => $search_filter['search_string']]), 'exercise_type'); + $element = new SelectElement('', _vips('Alle Aufgabentypen')); + $widget->addElement($element); + Sidebar::get()->addWidget($widget); + + foreach (Exercise::getExerciseTypes() as $type => $entry) { + $element = new SelectElement($type, $entry['name'], $type === $search_filter['exercise_type']); + $widget->addElement($element); + } + $result = $this->getAllExercises($course_ids, $sort, $desc, $search_filter); $this->sort = $sort; @@ -101,10 +117,7 @@ class PoolController extends StudipController $this->page = $page; $this->count = count($result); $this->exercises = array_slice($result, $size * ($page - 1), $size); - - $this->search = $search; $this->search_filter = $search_filter; - $this->exercise_types = Exercise::getExerciseTypes(); } /** @@ -150,16 +163,9 @@ class PoolController extends StudipController $page = Request::int('page', 1); $size = Config::get()->ENTRIES_PER_PAGE; - $search_filter = Request::getArray('search_filter'); - - if (Request::submitted('start_search') || Request::int('pool_search')) { - $search_filter = [ - 'search_string' => Request::get('pool_search_parameter'), - 'assignment_type' => Request::get('assignment_type') - ]; - } else if (empty($search_filter) || Request::submitted('reset_search')) { - $search_filter = array_fill_keys(['search_string', 'assignment_type'], ''); - } + $search_filter = Request::getArray('search_filter') + ['search_string' => '', 'assignment_type' => '']; + $search_filter['search_string'] = Request::get('pool_search_parameter', $search_filter['search_string']); + $search_filter['assignment_type'] = Request::get('assignment_type', $search_filter['assignment_type']); // get assignments of this user and where he/she has permission if ($context === 'course') { @@ -177,18 +183,28 @@ class PoolController extends StudipController ORDER BY title"; $search = new SQLSearch($sql, _vips('Titel des Aufgabenblatts')); + $widget = new VipsSearchWidget($this->url_for('pool/assignments', ['assignment_type' => $search_filter['assignment_type']])); + $widget->addNeedle(_vips('Suche'), 'pool_search', true, $search, 'function(id, name) { this.value = name; this.form.submit(); }', $search_filter['search_string']); + Sidebar::get()->addWidget($widget); + + $widget = new SelectWidget(_vips('Modus'), $this->url_for('pool/assignments', ['pool_search_parameter' => $search_filter['search_string']]), 'assignment_type'); + $element = new SelectElement('', _vips('Beliebiger Modus')); + $widget->addElement($element); + Sidebar::get()->addWidget($widget); + + foreach (VipsAssignment::getAssignmentTypes() as $type => $entry) { + $element = new SelectElement($type, $entry['name'], $type === $search_filter['assignment_type']); + $widget->addElement($element); + } + $result = $this->getAllAssignments($course_ids, $sort, $desc, $search_filter); $this->sort = $sort; $this->desc = $desc; $this->page = $page; $this->count = count($result); - $this->assignments = array_slice($result, $size * ($page - 1), $size); - - $this->search = $search; $this->search_filter = $search_filter; - $this->assignment_types = VipsAssignment::getAssignmentTypes(); } diff --git a/lib/VipsSearchWidget.php b/lib/VipsSearchWidget.php new file mode 100644 index 0000000000000000000000000000000000000000..bd8ad333195b5c4ee96fa70c680d67d676a0636b --- /dev/null +++ b/lib/VipsSearchWidget.php @@ -0,0 +1,42 @@ +<?php +/* + * VipsSearchWidget.php - Sidebar SearchWidget for Vips + * Copyright (c) 2024 Elmar Ludwig + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +class VipsSearchWidget extends SearchWidget +{ + /** + * Renders the widget. + * + * @param Array $variables Unused variables parameter + * @return String containing the html output of the widget + */ + public function render($variables = []) + { + $needles = []; + + foreach ($this->needles as $index => $needle) { + if ($needle['quick_search']) { + $quick_search = QuickSearch::get($needle['name'], $needle['quick_search']); + $quick_search->noSelectbox(); + if (isset($needle['value'])) { + $quick_search->defaultValue(null, $needle['value']); + } + if (isset($needle['js_func'])) { + $quick_search->fireJSFunctionOnSelect($needle['js_func']); + } + + $needle['quick_search'] = $quick_search; + $needles[] = $needle; + } + } + + return parent::render($variables + compact('needles')); + } +} diff --git a/views/pool/assignments.php b/views/pool/assignments.php index 28e48ce3f5308117f026014fab9f533f9a95d602..04bf34700acfbce0b0feaa24d59bb85c5574fbde 100644 --- a/views/pool/assignments.php +++ b/views/pool/assignments.php @@ -2,40 +2,8 @@ <?= MessageBox::info(_vips('Es wurden noch keine Aufgabenblätter eingerichtet.'), [ _vips('Auf dieser Seite finden Sie eine Übersicht über alle Aufgabenblätter in Vips, auf die Sie Zugriff haben.') ]) ?> +<? elseif ($count): ?> + <?= $this->render_partial('pool/list_assignments') ?> <? else: ?> - <form class="default" action="<?= $controller->link_for('pool/assignments') ?>"> - <label class="col-2"> - <?= QuickSearch::get('pool_search', $search) - ->setAttributes(['autofocus' => '']) - ->defaultValue(null, $search_filter['search_string']) - ->fireJSFunctionOnSelect('function(id, name) { $(this).val(name); this.form.submit(); }') - ->noSelectbox() - ->render() - ?> - </label> - - <label class="col-2"> - <select name="assignment_type" class="inline_select" aria-label="<?= _vips('Modus auswählen') ?>"> - <option value=""> - <?= _vips('Beliebiger Modus') ?> - </option> - <? foreach ($assignment_types as $type => $entry): ?> - <option value="<?= $type ?>"<?= $search_filter['assignment_type'] == $type ? ' selected' : '' ?>> - <?= htmlReady($entry['name']) ?> - </option> - <? endforeach ?> - </select> - </label> - - <footer style="margin: 1em 0;"> - <?= Studip\Button::create(_vips('Suchen'), 'start_search', ['title' => _vips('Suche starten')]) ?> - <?= Studip\Button::create(_vips('Zurücksetzen'), 'reset_search', ['title' => _vips('Suche zurücksetzen')]) ?> - </footer> - </form> - - <? if ($count): ?> - <?= $this->render_partial('pool/list_assignments') ?> - <? else: ?> - <?= MessageBox::info(_vips('Mit den aktuellen Sucheinstellungen sind keine Aufgabenblätter mit Zugriffsberechtigung vorhanden.')) ?> - <? endif ?> + <?= MessageBox::info(_vips('Mit den aktuellen Sucheinstellungen sind keine Aufgabenblätter mit Zugriffsberechtigung vorhanden.')) ?> <? endif ?> diff --git a/views/pool/exercises.php b/views/pool/exercises.php index c00de4d0e7c8bbc820821385af37e29355ee81bc..f19786e4c172073207bd9cf620b3045fbfec4124 100644 --- a/views/pool/exercises.php +++ b/views/pool/exercises.php @@ -2,40 +2,8 @@ <?= MessageBox::info(_vips('Es wurden noch keine Aufgabenblätter eingerichtet.'), [ _vips('Auf dieser Seite finden Sie eine Übersicht über alle Aufgaben in Vips, auf die Sie Zugriff haben.') ]) ?> +<? elseif ($count): ?> + <?= $this->render_partial('pool/list_exercises') ?> <? else: ?> - <form class="default" action="<?= $controller->link_for('pool/exercises') ?>"> - <label class="col-2"> - <?= QuickSearch::get('pool_search', $search) - ->setAttributes(['autofocus' => '']) - ->defaultValue(null, $search_filter['search_string']) - ->fireJSFunctionOnSelect('function(id, name) { $(this).val(name); this.form.submit(); }') - ->noSelectbox() - ->render() - ?> - </label> - - <label class="col-2"> - <select name="exercise_type" class="inline_select" aria-label="<?= _vips('Aufgabentyp auswählen') ?>"> - <option value=""> - <?= _vips('Alle Aufgabentypen') ?> - </option> - <? foreach ($exercise_types as $type => $entry): ?> - <option value="<?= $type ?>"<?= $search_filter['exercise_type'] == $type ? ' selected' : '' ?>> - <?= htmlReady($entry['name']) ?> - </option> - <? endforeach ?> - </select> - </label> - - <footer style="margin: 1em 0;"> - <?= Studip\Button::create(_vips('Suchen'), 'start_search', ['title' => _vips('Suche starten')]) ?> - <?= Studip\Button::create(_vips('Zurücksetzen'), 'reset_search', ['title' => _vips('Suche zurücksetzen')]) ?> - </footer> - </form> - - <? if ($count): ?> - <?= $this->render_partial('pool/list_exercises') ?> - <? else: ?> - <?= MessageBox::info(_vips('Mit den aktuellen Sucheinstellungen sind keine Aufgaben mit Zugriffsberechtigung vorhanden.')) ?> - <? endif ?> + <?= MessageBox::info(_vips('Mit den aktuellen Sucheinstellungen sind keine Aufgaben mit Zugriffsberechtigung vorhanden.')) ?> <? endif ?>