diff --git a/app/controllers/course/admission.php b/app/controllers/course/admission.php index 1e8832e38040f5aa8e2535b6d6dddc42358fc464..78f1c1d6bdca8f2f049db986b289f34ebbf58eda 100644 --- a/app/controllers/course/admission.php +++ b/app/controllers/course/admission.php @@ -18,10 +18,8 @@ class Course_AdmissionController extends AuthenticatedController /** * common tasks for all actions */ - function before_filter (&$action, &$args) + public function before_filter (&$action, &$args) { - global $perm; - parent::before_filter($action, $args); $course_id = $args[0] ?? ''; @@ -32,7 +30,7 @@ class Course_AdmissionController extends AuthenticatedController if (!get_object_type($this->course_id, ['sem']) || SeminarCategories::GetBySeminarId($this->course_id)->studygroup_mode || - !$perm->have_studip_perm("tutor", $this->course_id)) { + !$GLOBALS['perm']->have_studip_perm('tutor', $this->course_id)) { throw new Trails_Exception(403); } @@ -56,24 +54,14 @@ class Course_AdmissionController extends AuthenticatedController /** * Shows the current restrictions for course participation. */ - function index_action() + public function index_action() { URLHelper::addLinkParam('return_to_dialog', Request::isDialog()); $this->sidebar = Sidebar::get(); - if ($GLOBALS['perm']->have_perm('admin')) { - $list = new SelectWidget(_('Veranstaltungen'), '?#admin_top_links', 'cid'); - - foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === Context::getId(), - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = 8; - $this->sidebar->addWidget($list); + if ($GLOBALS['perm']->have_studip_perm('admin', $this->course_id)) { + $widget = new CourseManagementSelectWidget(); + $this->sidebar->addWidget($widget); } $this->all_domains = UserDomain::getUserDomains(); @@ -85,41 +73,49 @@ class Course_AdmissionController extends AuthenticatedController foreach (CourseSet::getCoursesetsByInstituteId($this->course->institut_id) as $cs) { $cs = new CourseSet($cs['set_id']); if ($cs->isUserAllowedToAssignCourse($this->user_id, $this->course_id)) { - $available_coursesets[] = ['id' => $cs->getId(), - 'name' => $cs->getName(), - 'chdate' => $cs->getChdate(), - 'my_own' => $cs->getUserId() === $GLOBALS['user']->id]; + $available_coursesets[] = [ + 'id' => $cs->getId(), + 'name' => $cs->getName(), + 'chdate' => $cs->getChdate(), + 'my_own' => $cs->getUserId() === $GLOBALS['user']->id + ]; } } foreach (CourseSet::getglobalCoursesets() as $cs) { $cs = new CourseSet($cs['set_id']); if ($cs->isUserAllowedToAssignCourse($this->user_id, $this->course_id)) { - $available_coursesets[] = ['id' => $cs->getId(), - 'name' => $cs->getName(), - 'chdate' => $cs->getChdate(), - 'my_own' => $cs->getUserId() === $GLOBALS['user']->id]; + $available_coursesets[] = [ + 'id' => $cs->getId(), + 'name' => $cs->getName(), + 'chdate' => $cs->getChdate(), + 'my_own' => $cs->getUserId() === $GLOBALS['user']->id + ]; } } $available_coursesets = $available_coursesets->findBy('chdate', strtotime('-1 year'), '>'); $available_coursesets->orderBy('name'); $this->available_coursesets = $available_coursesets; - PageLayout::postMessage(MessageBox::info(_("Für diese Veranstaltung sind keine Anmelderegeln festgelegt. Die Veranstaltung ist damit für alle Nutzer zugänglich."))); + PageLayout::postInfo( + _('Für diese Veranstaltung sind keine Anmelderegeln festgelegt. Die Veranstaltung ist damit für alle Nutzer zugänglich.') + ); } else { if ($this->current_courseset->isSeatDistributionEnabled() && !$this->course->admission_turnout) { - PageLayout::postMessage(MessageBox::info(_("Diese Veranstaltung ist teilnahmebeschränkt, aber die maximale Teilnehmendenanzahl ist nicht gesetzt."))); + PageLayout::postInfo( + _('Diese Veranstaltung ist teilnahmebeschränkt, aber die maximale Teilnehmendenanzahl ist nicht gesetzt.') + ); } } $lockdata = LockRules::getObjectRule($this->course_id); - if (!empty($lockdata['description']) && LockRules::CheckLockRulePermission($this->course_id)) { - PageLayout::postMessage(MessageBox::info(formatLinks($lockdata['description']))); + if ($lockdata['description'] && LockRules::CheckLockRulePermission($this->course_id)) { + PageLayout::postInfo(formatLinks($lockdata['description'])); } } /** * Change preliminary admission settings. */ - function change_admission_prelim_action() + public function change_admission_prelim_action() { CSRFProtection::verifyUnsafeRequest(); PageLayout::setTitle(_('Anmeldemodus ändern')); @@ -151,7 +147,10 @@ class Course_AdmissionController extends AuthenticatedController restoreLanguage(); } if ($num_moved) { - PageLayout::postMessage(MessageBox::success(sprintf(_("%s Teilnehmende wurden auf vorläufigen Eintrag gesetzt."), $num_moved))); + PageLayout::postSuccess(sprintf( + _('%s Teilnehmende wurden auf vorläufigen Eintrag gesetzt.'), + $num_moved + )); } } if ($this->course->admission_prelim == 0 && $this->course->getNumPrelimParticipants()) { @@ -167,7 +166,10 @@ class Course_AdmissionController extends AuthenticatedController restoreLanguage(); } if ($num_moved) { - PageLayout::postMessage(MessageBox::success(sprintf(_("%s Teilnehmende wurden in die Veranstaltung übernommen."), $num_moved))); + PageLayout::postSuccess(sprintf( + _('%s Teilnehmende wurden in die Veranstaltung übernommen.'), + $num_moved + )); } } if (Request::submitted('change_admission_prelim_no')) { @@ -181,13 +183,16 @@ class Course_AdmissionController extends AuthenticatedController $num_moved += $applicant->delete(); } if ($num_moved) { - PageLayout::postMessage(MessageBox::success(sprintf(_("%s vorläufige Teilnehmende wurden entfernt."), $num_moved))); + PageLayout::postSuccess(sprintf( + _('%s vorläufige Teilnehmende wurden entfernt.'), + $num_moved + )); $this->course->resetRelation('admission_applicants'); } } } if ($this->course->store()) { - PageLayout::postMessage(MessageBox::success(_("Der Anmeldemodus wurde geändert."))); + PageLayout::postSuccess(_("Der Anmeldemodus wurde geändert.")); } unset($question); } @@ -206,7 +211,7 @@ class Course_AdmissionController extends AuthenticatedController /** * Change free access settings. */ - function change_free_access_action() + public function change_free_access_action() { CSRFProtection::verifyUnsafeRequest(); if (Request::submitted('change_free_access')) { @@ -284,12 +289,15 @@ class Course_AdmissionController extends AuthenticatedController } if ($num_moved) { $this->course->resetRelation('admission_applicants'); - PageLayout::postMessage(MessageBox::success(sprintf(_("%s Wartende wurden entfernt."), $num_moved))); + PageLayout::postSuccess(sprintf( + _('%s Wartende wurden entfernt.'), + $num_moved + )); } } if ($this->course->store()) { - PageLayout::postMessage(MessageBox::success(_("Die Teilnehmendenanzahl wurde geändert."))); + PageLayout::postSuccess(_('Die Teilnehmendenanzahl wurde geändert.')); } unset($question); } @@ -299,12 +307,12 @@ class Course_AdmissionController extends AuthenticatedController } else { $this->request = $request; $this->button_yes = 'change_admission_turnout_yes'; - PageLayout::postMessage(MessageBox::info($question)); + PageLayout::postInfo($question); $this->render_template('course/admission/_change_admission.php'); } } - function change_domains_action() + public function change_domains_action() { CSRFProtection::verifyUnsafeRequest(); if (Request::submitted('change_domains') && !LockRules::Check($this->course_id, 'user_domain')) { @@ -331,7 +339,10 @@ class Course_AdmissionController extends AuthenticatedController CourseSet::addCourseToSet($cs->getId(), $this->course_id); $cs->load(); if (in_array($this->course_id, $cs->getCourses())) { - PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde durchgeführt."), htmlReady($cs->getName())))); + PageLayout::postSuccess(sprintf( + _('Die Zuordnung zum Anmeldeset %s wurde durchgeführt.'), + htmlReady($cs->getName()) + )); } } } @@ -352,11 +363,12 @@ class Course_AdmissionController extends AuthenticatedController CourseSet::removeCourseFromSet($cs->getId(), $this->course_id); $cs->load(); if (!in_array($this->course_id, $cs->getCourses())) { - PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde aufgehoben."), htmlReady($cs->getName())))); + PageLayout::postSuccess(sprintf( + _('Die Zuordnung zum Anmeldeset %s wurde aufgehoben.'), + htmlReady($cs->getName()) + )); } - if (!count($cs->getCourses()) - && $cs->isGlobal() - && $cs->getUserid() != '') { + if (!count($cs->getCourses()) && $cs->isGlobal() && $cs->getUserid() != '') { $cs->delete(); } if ($this->course->getNumWaiting()) { @@ -371,7 +383,9 @@ class Course_AdmissionController extends AuthenticatedController } if ($num_moved) { $this->course->resetRelation('admission_applicants'); - PageLayout::postMessage(MessageBox::success(sprintf(_("%s Wartende wurden entfernt."), $num_moved))); + PageLayout::postSuccess(sprintf( + _('%s Wartende wurden entfernt.'), $num_moved + )); } } } @@ -381,12 +395,12 @@ class Course_AdmissionController extends AuthenticatedController } else { $this->request = ['change_course_set_unassign' => 1]; $this->button_yes = 'change_course_set_unassign_yes'; - PageLayout::postMessage(MessageBox::info($question)); + PageLayout::postInfo($question); $this->render_template('course/admission/_change_admission.php'); } } - function explain_course_set_action() + public function explain_course_set_action() { $cs = new CourseSet(Request::option('set_id')); if ($cs->getId()) { @@ -420,7 +434,7 @@ class Course_AdmissionController extends AuthenticatedController if ($rule instanceof LockedAdmission) { $course_set_id = CourseSet::getGlobalLockedAdmissionSetId(); CourseSet::addCourseToSet($course_set_id, $this->course_id); - PageLayout::postMessage(MessageBox::success(_("Die Veranstaltung wurde gesperrt."))); + PageLayout::postSuccess(_('Die Veranstaltung wurde gesperrt.')); $this->redirect($this->action_url('index')); return; } else { @@ -442,7 +456,7 @@ class Course_AdmissionController extends AuthenticatedController $course_set->setName(trim(Request::get('instant_course_set_name'))); } if (count($errors)) { - PageLayout::postMessage(MessageBox::error(_("Speichern fehlgeschlagen"), array_map('htmlready', $errors))); + PageLayout::postError(_('Speichern fehlgeschlagen'), array_map('htmlready', $errors)); } else { $rule->store(); $course_set->setPrivate(true); @@ -453,7 +467,7 @@ class Course_AdmissionController extends AuthenticatedController $course_set->addAdmissionRule($another_rule); } $course_set->store(); - PageLayout::postMessage(MessageBox::success(_("Die Anmelderegel wurde erzeugt und der Veranstaltung zugewiesen."))); + PageLayout::postSuccess(_("Die Anmelderegel wurde erzeugt und der Veranstaltung zugewiesen.")); $this->redirect($this->action_url('index')); return; } @@ -476,7 +490,7 @@ class Course_AdmissionController extends AuthenticatedController } } - function edit_courseset_action($cs_id) + public function edit_courseset_action($cs_id) { $cs = new CourseSet($cs_id); if ($cs->isUserAllowedToEdit($this->user_id)) { @@ -491,7 +505,7 @@ class Course_AdmissionController extends AuthenticatedController } } - function save_courseset_action($cs_id) + public function save_courseset_action($cs_id) { $cs = new CourseSet($cs_id); if ($cs->isUserAllowedToEdit($this->user_id)) { @@ -506,7 +520,7 @@ class Course_AdmissionController extends AuthenticatedController } } - function after_filter($action, $args) + public function after_filter($action, $args) { if (Request::isXhr() && !Request::get('return_to_dialog')) { foreach ($this->response->headers as $k => $v) { diff --git a/app/controllers/course/basicdata.php b/app/controllers/course/basicdata.php index efff19264a363a42ae37179559035ebc74095970..74758138bfc1b8fd95cbf5394b4252b45d546af2 100644 --- a/app/controllers/course/basicdata.php +++ b/app/controllers/course/basicdata.php @@ -14,6 +14,7 @@ * @since 2.0 */ + class Course_BasicdataController extends AuthenticatedController { public $msg = []; @@ -262,8 +263,6 @@ class Course_BasicdataController extends AuthenticatedController */ public function view_action($course_id = null) { - global $user, $perm, $_fullname_sql; - $deputies_enabled = Config::get()->DEPUTIES_ENABLE; //damit QuickSearch funktioniert: @@ -278,7 +277,7 @@ class Course_BasicdataController extends AuthenticatedController Navigation::activateItem('/course/admin/details'); //Berechtigungscheck: - if (!$perm->have_studip_perm("tutor",$this->course_id)) { + if (!$GLOBALS['perm']->have_studip_perm('tutor', $this->course_id)) { throw new AccessDeniedException(_("Sie haben keine Berechtigung diese " . "Veranstaltung zu verändern.")); } @@ -313,47 +312,48 @@ class Course_BasicdataController extends AuthenticatedController } $this->dozentUserSearch = new PermissionSearch( - $search_template, - sprintf(_("%s suchen"), get_title_for_status('dozent', 1, $sem->status)), - "user_id", - ['permission' => 'dozent', - 'seminar_id' => $this->course_id, - 'sem_perm' => 'dozent', - 'institute' => $sem_institutes - ] - ); + $search_template, + sprintf(_("%s suchen"), get_title_for_status('dozent', 1, $sem->status)), + "user_id", + [ + 'permission' => 'dozent', + 'seminar_id' => $this->course_id, + 'sem_perm' => 'dozent', + 'institute' => $sem_institutes + ] + ); $this->dozenten_title = get_title_for_status('dozent', 1, $sem->status); $this->deputies_enabled = $deputies_enabled; if ($this->deputies_enabled) { $this->deputies = Deputy::findDeputies($this->course_id); $this->deputySearch = new PermissionSearch( - "user_not_already_in_sem_or_deputy", - sprintf(_("%s suchen"), get_title_for_status('deputy', 1, $sem->status)), - "user_id", - ['permission' => Deputy::getValidPerms(), 'seminar_id' => $this->course_id] - ); + "user_not_already_in_sem_or_deputy", + sprintf(_("%s suchen"), get_title_for_status('deputy', 1, $sem->status)), + "user_id", + ['permission' => Deputy::getValidPerms(), 'seminar_id' => $this->course_id] + ); $this->deputy_title = get_title_for_status('deputy', 1, $sem->status); } $this->tutoren = $sem->getMembers('tutor'); $this->tutorUserSearch = new PermissionSearch( - $search_template, - sprintf(_("%s suchen"), get_title_for_status('tutor', 1, $sem->status)), - "user_id", - ['permission' => ['dozent','tutor'], - 'seminar_id' => $this->course_id, - 'sem_perm' => ['dozent','tutor'], - 'institute' => $sem_institutes - ] - ); + $search_template, + sprintf(_("%s suchen"), get_title_for_status('tutor', 1, $sem->status)), + "user_id", + ['permission' => ['dozent','tutor'], + 'seminar_id' => $this->course_id, + 'sem_perm' => ['dozent','tutor'], + 'institute' => $sem_institutes + ] + ); $this->tutor_title = get_title_for_status('tutor', 1, $sem->status); $instUsers = new SimpleCollection(InstituteMember::findByInstituteAndStatus($sem->getInstitutId(), 'tutor')); $this->tutorsOfInstitute = $instUsers->pluck('user_id'); unset($instUsers); - $this->perm_dozent = $perm->have_studip_perm("dozent", $this->course_id); + $this->perm_dozent = $GLOBALS['perm']->have_studip_perm("dozent", $this->course_id); $this->mkstring = $data['mkdate'] ? date("d.m.Y, H:i", $data['mkdate']) : _("unbekannt"); $this->chstring = $data['chdate'] ? date("d.m.Y, H:i", $data['chdate']) : _("unbekannt"); $lockdata = LockRules::getObjectRule($this->course_id); @@ -364,46 +364,28 @@ class Course_BasicdataController extends AuthenticatedController $sidebar = Sidebar::get(); $widget = new ActionsWidget(); - $widget->addLink( - _('Bild ändern'), - $this->url_for('avatar/update/course', $course_id), - Icon::create('edit') + + $widget->addLink(_('Bild ändern'), + $this->url_for('avatar/update/course', $course_id), + Icon::create('edit') ); if ($this->deputies_enabled) { - $newstatus = null; - $text = null; - - if (Deputy::isDeputy($user->id, $this->course_id)) { + if (Deputy::isDeputy($GLOBALS['user']->id, $this->course_id)) { $newstatus = 'dozent'; $text = _('Lehrende werden'); - } else if (in_array($user->id, array_keys($this->dozenten)) && count($this->dozenten) > 1) { + } else if (in_array($GLOBALS['user']->id, array_keys($this->dozenten)) && count($this->dozenten) > 1) { $newstatus = 'deputy'; $text = _('Vertretung werden'); } - - if ($text) { - $widget->addLink( - $text, - $this->url_for('course/basicdata/switchdeputy', $this->course_id, $newstatus), - Icon::create('persons') - ); - } + $widget->addLink($text, + $this->url_for('course/basicdata/switchdeputy', $this->course_id, $newstatus), + Icon::create('persons') + ); } $sidebar->addWidget($widget); - // Entry list for admin upwards. - if ($perm->have_studip_perm('admin', $this->course_id)) { - $list = new SelectWidget(_('Veranstaltungen'), '?#admin_top_links', 'cid'); - - foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === Context::getId(), - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = 8; - $sidebar->addWidget($list); + if ($GLOBALS['perm']->have_studip_perm('admin', $this->course->id)) { + $widget = new CourseManagementSelectWidget(); + $sidebar->addWidget($widget); } } diff --git a/app/controllers/course/management.php b/app/controllers/course/management.php index 1753919c213ee266238dc9475b2d55b491f5ced6..2738a12ca100b02192e21ed2f684f79c28b84ec9 100644 --- a/app/controllers/course/management.php +++ b/app/controllers/course/management.php @@ -27,6 +27,7 @@ class Course_ManagementController extends AuthenticatedController if (!$GLOBALS['perm']->have_studip_perm("tutor", $GLOBALS['SessionSeminar'])) { throw new AccessDeniedException(); } + if (Context::isCourse()) { $sem_class = $GLOBALS['SEM_CLASS'][$GLOBALS['SEM_TYPE'][Context::get()->status]['class']] ?: SemClass::getDefaultSemClass(); } else { @@ -35,7 +36,6 @@ class Course_ManagementController extends AuthenticatedController if (!$sem_class->isModuleAllowed("CoreAdmin")) { throw new Exception(_('Dies ist eine Studiengruppe und kein Seminar!')); } - PageLayout::setTitle(sprintf(_("%s - Verwaltung"), Context::getHeaderLine())); PageLayout::setHelpKeyword('Basis.InVeranstaltungVerwaltung'); } @@ -45,7 +45,7 @@ class Course_ManagementController extends AuthenticatedController * * @return void */ - function index_action() + public function index_action() { Navigation::activateItem('course/admin/main'); @@ -89,7 +89,7 @@ class Course_ManagementController extends AuthenticatedController } } if ($GLOBALS['perm']->have_perm('admin')) { - $is_locked =$course->lock_rule; + $is_locked = $course->lock_rule; $actions->addLink( _('Sperrebene ändern') . ' (' . ($is_locked ? _('gesperrt') : _('nicht gesperrt')) . ')', URLHelper::getURL($this->url_for('course/management/lock'), ['studip_ticket' => Seminar_Session::get_ticket()]), @@ -103,33 +103,37 @@ class Course_ManagementController extends AuthenticatedController URLHelper::getURL('dispatch.php/course/change_view/set_changed_view'), Icon::create('visibility-invisible') ); - $sidebar->addWidget($actions); - // Entry list for admin upwards. if ($GLOBALS['perm']->have_studip_perm('admin', $course->id)) { - $list = new SelectWidget(_('Veranstaltungen'), '?#admin_top_links', 'cid'); - $seminars = AdminCourseFilter::get()->getCoursesForAdminWidget(); - foreach ($seminars as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === $course->id, - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = min(8, count($seminars)); - $sidebar->addWidget($list); + $widget = new CourseManagementSelectWidget(); + $sidebar->addWidget($widget); } } } + public function order_settings_action() + { + PageLayout::setTitle(_('Sortiereinstellungen')); + $this->order_by_field = UserConfig::get($GLOBALS['user']->id)->COURSE_MANAGEMENT_SELECTOR_ORDER_BY ?? 'name'; + $this->render_template('course/shared/order_settings'); + } + + public function store_order_settings_action() + { + CSRFProtection::verifyUnsafeRequest(); + UserConfig::get($GLOBALS['user']->id)->store('COURSE_MANAGEMENT_SELECTOR_ORDER_BY', Request::get('order_by', 'name')); + PageLayout::postSuccess(_('Die Sortiereinstellungen wurden erfolgreich gespeichert.')); + + $this->redirect(URLHelper::getURL(Request::get('from'))); + } + /** * change the visibility of a course * * @return void */ - function change_visibility_action() + public function change_visibility_action() { if ((Config::get()->ALLOW_DOZENT_VISIBILITY || $GLOBALS['perm']->have_perm('admin')) && !LockRules::Check($GLOBALS['SessionSeminar'], 'seminar_visibility') @@ -198,7 +202,7 @@ class Course_ManagementController extends AuthenticatedController } else { $msg = _('Die Sperrebene wurde erfolgreich zurückgesetzt!'); } - PageLayout::postMessage(MessageBox::success($msg)); + PageLayout::postSuccess($msg); } } $this->relocate($this->action_url('index')); diff --git a/app/controllers/course/room_requests.php b/app/controllers/course/room_requests.php index d23b5c72aec5e2ccf3602d29183137eafadc5fb0..1cc379673b2f843e45669ff175821ec4782ae841 100644 --- a/app/controllers/course/room_requests.php +++ b/app/controllers/course/room_requests.php @@ -14,6 +14,7 @@ * @category Stud.IP * @package admin */ + class Course_RoomRequestsController extends AuthenticatedController { /** @@ -81,19 +82,9 @@ class Course_RoomRequestsController extends AuthenticatedController ); Sidebar::get()->addWidget($actions); - if ($GLOBALS['perm']->have_perm('admin')) { - $list = new SelectWidget(_('Veranstaltungen'), '?#admin_top_links', 'cid'); - - foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === Context::getId(), - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = 8; - Sidebar::get()->addWidget($list); + if ($GLOBALS['perm']->have_studip_perm('admin', $this->course_id)) { + $widget = new CourseManagementSelectWidget(); + Sidebar::Get()->addWidget($widget); } } @@ -121,28 +112,29 @@ class Course_RoomRequestsController extends AuthenticatedController _('Das Erstellen von Raumanfragen ist nicht erlaubt!') ); } - $options = array(); - $this->url_params = array(); + $options = []; + $this->url_params = []; if (Request::get('origin') !== null) { $this->url_params['origin'] = Request::get('origin'); } if (!RoomRequest::existsByCourse($this->course_id)) { - $options[] = array('value' => 'course', - 'name' => _('alle regelmäßigen und unregelmäßigen Termine der Veranstaltung') - ); + $options[] = [ + 'value' => 'course', + 'name' => _('alle regelmäßigen und unregelmäßigen Termine der Veranstaltung') + ]; } foreach (SeminarCycleDate::findBySeminar($this->course_id) as $cycle) { if (!RoomRequest::existsByMetadate($cycle->getId())) { $name = _("alle Termine einer regelmäßigen Zeit"); $name .= ' (' . $cycle->toString('full') . ')'; - $options[] = array('value' => 'cycle_' . $cycle->getId(), 'name' => $name); + $options[] = ['value' => 'cycle_' . $cycle->getId(), 'name' => $name]; } } foreach (CourseDate::findBySeminar_id($this->course_id) as $date) { if (!RoomRequest::existsByDate($date['termin_id'])) { $name = _("Einzeltermin der Veranstaltung"); $name .= ' (' . $date->getFullname() . ')'; - $options[] = array('value' => 'date_' . $date['termin_id'], 'name' => $name); + $options[] = ['value' => 'date_' . $date['termin_id'], 'name' => $name]; } } $this->options = $options; @@ -455,9 +447,8 @@ class Course_RoomRequestsController extends AuthenticatedController if (empty($session_data['selected_properties']['seats'])) { $this->course = Course::find($this->course_id); $admission_turnout = $this->course->admission_turnout; - $this->selected_properties['seats'] = $admission_turnout - ? $admission_turnout - : Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS; + $this->selected_properties['seats'] = + $admission_turnout ?: Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS; } if (Request::isPost()) { @@ -537,7 +528,6 @@ class Course_RoomRequestsController extends AuthenticatedController $this->request->reply_recipients = 'requester'; } - $storing_successful = false; if ($this->request->isDirty()) { $storing_successful = $this->request->store(); } else { @@ -756,9 +746,7 @@ class Course_RoomRequestsController extends AuthenticatedController $this->request->category_id = $session_data['category_id']; $this->request->updateProperties($session_data['selected_properties']); $this->request->resource_id = ( - $this->selected_room_id - ? $this->selected_room_id - : '' + $this->selected_room_id ?: '' ); $this->request->comment = Request::get('comment'); if (Request::get('reply_lecturers')) { @@ -772,7 +760,6 @@ class Course_RoomRequestsController extends AuthenticatedController $this->request->user_id = $this->current_user->id; } - $storing_successful = false; if ($this->request->isDirty()) { $storing_successful = $this->request->store(); } else { @@ -859,9 +846,7 @@ class Course_RoomRequestsController extends AuthenticatedController if (!$this->seats) { $admission_turnout = $this->course->admission_turnout; - $this->seats = $admission_turnout - ? $admission_turnout - : Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS; + $this->seats = $admission_turnout ?: Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS; } if (Request::isPost()) { @@ -947,7 +932,6 @@ class Course_RoomRequestsController extends AuthenticatedController $this->request->closed = 0; } - $storing_successful = false; if ($this->request->isDirty()) { $storing_successful = $this->request->store(); } else { diff --git a/app/controllers/course/study_areas.php b/app/controllers/course/study_areas.php index fcb64401fcd45e2f7c1104677d46eaec73e015d4..e7365f1cb63f2cf798ebb239e1bf826feee70066 100644 --- a/app/controllers/course/study_areas.php +++ b/app/controllers/course/study_areas.php @@ -15,18 +15,12 @@ */ require_once 'lib/webservices/api/studip_lecture_tree.php'; -//require_once 'lib/classes/coursewizardsteps/StudyAreasWizardStep.php'; class Course_StudyAreasController extends AuthenticatedController { - - // see Trails_Controller#before_filter - function before_filter(&$action, &$args) + public function before_filter(&$action, &$args) { - - global $perm; - parent::before_filter($action, $args); // Search for course object @@ -34,11 +28,9 @@ class Course_StudyAreasController extends AuthenticatedController $this->locked = LockRules::Check($this->course->id, 'sem_tree'); // check course object and perms - if (!is_null($this->course) - && !$perm->have_studip_perm("tutor", $this->course->id) - ) { + if (isset($this->course) && !$GLOBALS['perm']->have_studip_perm('tutor', $this->course->id)) { $this->set_status(403); - return FALSE; + return false; } // Init Studyareas-Step for @@ -59,8 +51,9 @@ class Course_StudyAreasController extends AuthenticatedController } - function show_action() + public function show_action() { + Navigation::activateItem('course/admin/study_areas'); $this->url_params = []; if (Request::get('from')) { $this->url_params['from'] = Request::get('from'); @@ -68,27 +61,11 @@ class Course_StudyAreasController extends AuthenticatedController if (Request::get('open_node')) { $this->url_params['open_node'] = Request::get('open_node'); } - if (!Request::isXhr()) { - - Navigation::activateItem('course/admin/study_areas'); - $sidebar = Sidebar::get(); - - if ($this->course) { - // Entry list for admin upwards. - if ($GLOBALS['perm']->have_studip_perm('admin', $GLOBALS['SessionSeminar'])) { - $list = new SelectWidget(_('Veranstaltungen'), '?#admin_top_links', 'cid'); - - foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === Context::getId(), - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = 8; - $sidebar->addWidget($list); - } + + if ($this->course) { + if ($GLOBALS['perm']->have_studip_perm('admin', $this->course->id)) { + $widget = new CourseManagementSelectWidget(); + Sidebar::Get()->addWidget($widget); } } if (Request::get('open_node')) { @@ -100,7 +77,7 @@ class Course_StudyAreasController extends AuthenticatedController $this->tree = $this->step->getStepTemplate($this->values, 0, 0); } - function ajax_action() + public function ajax_action() { $parameter = Request::getArray('parameter'); $method = Request::get('method'); @@ -112,9 +89,6 @@ class Course_StudyAreasController extends AuthenticatedController case 'getSemTreeLevel': $json = $this->step->getSemTreeLevel($parameter[0]); break; - case 'getAncestorTree': - $json = $this->step->getAncestorTree($parameter[0]); - break; default: $json = $this->step->getAncestorTree($parameter[0]); break; @@ -123,7 +97,7 @@ class Course_StudyAreasController extends AuthenticatedController $this->render_json($json); } - function save_action() + public function save_action() { if($this->locked) { throw new Trails_Exception(403); @@ -153,12 +127,12 @@ class Course_StudyAreasController extends AuthenticatedController $studyareas = Request::getArray('studyareas'); if (empty($studyareas) && $this->is_required()) { - PageLayout::postMessage(MessageBox::error(_('Sie müssen mindestens einen Studienbereich auswählen'))); + PageLayout::postError(_('Sie müssen mindestens einen Studienbereich auswählen')); $this->redirect($url); return; } if (!empty($studyareas) && !$this->is_required()) { - PageLayout::postMessage(MessageBox::error(_('Sie dürfen keine Studienbereiche zuweisen.'))); + PageLayout::postError(_('Sie dürfen keine Studienbereiche zuweisen.')); $this->redirect($url); return; } @@ -172,9 +146,9 @@ class Course_StudyAreasController extends AuthenticatedController } if (!$msg) { - PageLayout::postMessage(MessageBox::success(_('Die Studienbereichszuordnung wurde übernommen.'))); + PageLayout::postSuccess(_('Die Studienbereichszuordnung wurde übernommen.')); } else { - PageLayout::postMessage(MessageBox::error($msg)); + PageLayout::postError($msg); } $this->redirect($url); } diff --git a/app/controllers/course/timesrooms.php b/app/controllers/course/timesrooms.php index 4ae955fd67333daeab80614328be1846afb567ce..6b483854f647d81caff41f6e07a6eb3ca79d1262 100644 --- a/app/controllers/course/timesrooms.php +++ b/app/controllers/course/timesrooms.php @@ -5,6 +5,7 @@ * @license GPL2 or any later version * @since 3.4 */ + class Course_TimesroomsController extends AuthenticatedController { /** @@ -304,8 +305,7 @@ class Course_TimesroomsController extends AuthenticatedController /** * Primary function to edit date-informations * - * @param $termin_id - * @param null $metadate_id + * @param string $termin_id */ public function editDate_action($termin_id) { @@ -1431,23 +1431,9 @@ class Course_TimesroomsController extends AuthenticatedController } Sidebar::Get()->addWidget($widget); - if ($GLOBALS['perm']->have_perm('admin')) { - $list = new SelectWidget( - _('Veranstaltungen'), - $this->url_for('course/timesrooms/index'), - 'cid' - ); - - foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) { - $list->addElement(new SelectElement( - $seminar['Seminar_id'], - $seminar['Name'], - $seminar['Seminar_id'] === Context::getId(), - $seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name'] - )); - } - $list->size = 8; - Sidebar::Get()->addWidget($list); + if ($GLOBALS['perm']->have_studip_perm('admin', $this->course->id)) { + $widget = new CourseManagementSelectWidget(); + Sidebar::Get()->addWidget($widget); } } diff --git a/app/views/course/shared/order_settings.php b/app/views/course/shared/order_settings.php new file mode 100644 index 0000000000000000000000000000000000000000..714e29f81b519b48c5749d38afc53dcc288ddfab --- /dev/null +++ b/app/views/course/shared/order_settings.php @@ -0,0 +1,14 @@ +<form method="post" action="<?= $controller->store_order_settings() ?>" class="default"> + <input type="hidden" name="from" value="<?= Request::get('from')?>"> + <?= CSRFProtection::tokenTag() ?> + <label> + <?= _('Letzte Veranstaltungsliste sortieren nach') ?> + <select name="order_by"> + <option value="name" <? if ($order_by_field === 'name') echo 'selected'; ?>><?= _('Veranstaltungsname') ?></option> + <option value="number" <? if ($order_by_field === 'number') echo 'selected'; ?>><?= _('Veranstaltungsnummer') ?></option> + </select> + </label> + <footer data-dialog-button> + <?= \Studip\Button::createAccept(_('Speichern')) ?> + </footer> +</form> diff --git a/db/migrations/5.3.3_tic_1583_course_selector.php b/db/migrations/5.3.3_tic_1583_course_selector.php new file mode 100644 index 0000000000000000000000000000000000000000..0b3f27b10dadaa9eca2517f860c0a76f5b7670ee --- /dev/null +++ b/db/migrations/5.3.3_tic_1583_course_selector.php @@ -0,0 +1,31 @@ +<?php + +final class Tic1583CourseSelector extends Migration +{ + public function description() + { + return 'adds the sorting option for the quick course selection'; + } + + public function up() + { + $query = 'INSERT INTO `config` (`field`, `value`, `type`, `range`, `mkdate`, `chdate`, `description`) + VALUES (:name, :value, :type, :range, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)'; + $statement = DBManager::get()->prepare($query); + $statement->execute([ + 'name' => 'COURSE_MANAGEMENT_SELECTOR_ORDER_BY', + 'description' => 'Gibt an, nach welchem Kriterium die Veranstaltungsschnellwauswahl innerhalb der Veranstaltungsverwaltung sortiert werden soll', + 'range' => 'user', + 'type' => 'string', + 'value' => 'name' + ]); + } + + public function down() + { + DBManager::get()->exec("DELETE `config`, `config_values` + FROM `config` LEFT JOIN `config_values` USING (`field`) + WHERE `field` = 'COURSE_MANAGEMENT_SELECTOR_ORDER_BY'"); + } + +} diff --git a/lib/classes/AdminCourseFilter.class.php b/lib/classes/AdminCourseFilter.class.php index 2324ff2a64a3a6c690c58ced89a22a8b4439408c..7ec1c7bf6db189c8aa6aed3c9c50bdb6607fa882 100644 --- a/lib/classes/AdminCourseFilter.class.php +++ b/lib/classes/AdminCourseFilter.class.php @@ -158,7 +158,7 @@ class AdminCourseFilter /** * Adds a filter for all courses of the given semester. * @param string $semester_id : ID of the given semester. - * @return $this + * @return AdminCourseFilter * @throws Exception if semester_id does not exist */ public function filterBySemester($semester_id) @@ -180,7 +180,7 @@ class AdminCourseFilter /** * Adds a filter for a sem_type or many sem_types if the parameter is an array. * @param array|integer $type : id or ids of sem_types - * @return $this + * @return AdminCourseFilter */ public function filterByType($type) { @@ -197,7 +197,7 @@ class AdminCourseFilter /** * Adds a filter for an institut_id or many institut_ids if the parameter is an array. * @param array|integer $institut_ids : id or ids of institutes - * @return $this + * @return AdminCourseFilter */ public function filterByInstitute($institut_ids) { @@ -220,7 +220,7 @@ class AdminCourseFilter /** * Adds a filter for an stgteil_id or many stgteil_ids if the parameter is an array. * @param array|integer $stgteil_ids : id or ids of stgteile - * @return $this + * @return AdminCourseFilter */ public function filterByStgTeil($stgteil_ids) { @@ -265,6 +265,10 @@ class AdminCourseFilter return $this; } + /** + * @param array|string $user_ids + * @return AdminCourseFilter + */ public function filterByDozent($user_ids) { $this->settings['query']['joins']['dozenten'] = [ @@ -285,8 +289,8 @@ class AdminCourseFilter /** * Adds a filter for a textstring, that can be the coursenumber, the name of the course * or the last name of one of the dozenten. - * @param string $text : the searchstring - * @return $this + * @param string $text the searchstring + * @return AdminCourseFilter */ public function filterBySearchstring($text) { @@ -314,7 +318,7 @@ class AdminCourseFilter /** * @param string $attribute : column, name of the column, yb whcih we should order the results * @param string $flag : "ASC" or "DESC for ascending order or descending order, - * @return $this + * @return AdminCourseFilter * @throws Exception if $flag does not exist */ public function orderBy($attribute, $flag = 'ASC') @@ -331,12 +335,12 @@ class AdminCourseFilter /** * Adds a where filter. - * @param string $where : any where condition like "sem_classes.overview = 'CoreOverview'" - * @param array $parameter : an array of parameter that appear in the $where query. - * @param null|string $id : an id of the where-query. Use this to possibly + * @param string $where any where condition like "sem_classes.overview = 'CoreOverview'" + * @param array $parameter an array of parameter that appear in the $where query. + * @param null|string $id an id of the where-query. Use this to possibly * avoid double where conditions or allow deleting the condition * by plugins if necessary. Can be omitted. - * @return $this + * @return AdminCourseFilter */ public function where($where, $parameter = [], $id = null) { @@ -353,7 +357,7 @@ class AdminCourseFilter * Also saves the settings in the session. * Note that a notification AdminCourseFilterWillQuery will be posted, before the result is computed. * Plugins may register at this event to fully alter this AdminCourseFilter-object and so the resultset. - * @return array : associative array with seminar_ids as keys and seminar-data-arrays as values. + * @return array associative array with seminar_ids as keys and seminar-data-arrays as values. */ public function getCourses($grouped = true) { @@ -368,7 +372,7 @@ class AdminCourseFilter } /** - * @return number of courses that this filter would return + * @return integer number of courses that this filter would return */ public function countCourses() { @@ -376,23 +380,29 @@ class AdminCourseFilter if (empty($this->settings['query']['where'])) { return 0; } - return DBManager::get()->fetchColumn($this->createQuery(true), $this->settings['parameter']); + return (int)DBManager::get()->fetchColumn($this->createQuery(true), $this->settings['parameter']); } /** * Returns the data of the resultset of the AdminCourseFilter. * + * @param string $order_by possible values name or number + * * Note that a notification AdminCourseFilterWillQuery will be posted, before the result is computed. * Plugins may register at this event to fully alter this AdminCourseFilter-object and so the resultset. - * @return array : associative array with seminar_ids as keys and seminar-data-arrays as values. + * @return array associative array with seminar_ids as keys and seminar-data-arrays as values. */ - public function getCoursesForAdminWidget() + public function getCoursesForAdminWidget(string $order_by = 'name') { $count_courses = $this->countCourses(); + $order = 'seminare.name'; + if ($order_by === 'number') { + $order = 'seminare.veranstaltungsnummer, seminare.name'; + } if ($count_courses && $count_courses <= $this->max_show_courses) { $settings = $this->settings; $this->settings['query']['select'] = []; - $this->settings['query']['orderby'] = 'seminare.name'; + $this->settings['query']['orderby'] = $order; $ret = $this->getCourses(false); $this->settings = $settings; return $ret; @@ -402,8 +412,8 @@ class AdminCourseFilter /** * Creates the sql-query from the $this->settings['query'] - * @only_count : boolean - * @return string : the big query + * @param boolean $only_count : boolean + * @return string the big query */ public function createQuery($only_count = false) { diff --git a/lib/classes/sidebar/CourseManagementSelectWidget.php b/lib/classes/sidebar/CourseManagementSelectWidget.php new file mode 100644 index 0000000000000000000000000000000000000000..39735027cbb6ca9adb9211ea6c27a8bb9efe1be2 --- /dev/null +++ b/lib/classes/sidebar/CourseManagementSelectWidget.php @@ -0,0 +1,47 @@ +<?php + +class CourseManagementSelectWidget extends SelectWidget +{ + public $course = null; + public $order_by_field; + + public function __construct() + { + parent::__construct(_('Veranstaltungen'), '?#admin_top_links', 'cid'); + + $this->course = Course::findCurrent(); + $this->order_by_field = UserConfig::get($GLOBALS['user']->id)->COURSE_MANAGEMENT_SELECTOR_ORDER_BY ?? 'name'; + } + + public function render($variables = []) + { + $extra = sprintf( + '<a href="%s" title="%s" data-dialog="size=auto">%s</a>', + URLHelper::getURL('dispatch.php/course/management/order_settings', ['cid' => $this->course->id, 'from' => Request::url()]), + _('Sortiereinstellungen'), + Icon::create('settings') + ); + $this->setExtra($extra); + $this->class = 'nested-select'; + $this->setDropdownAutoWidth(true); + $seminars = AdminCourseFilter::get()->getCoursesForAdminWidget($this->order_by_field); + foreach ($seminars as $seminar) { + if ($this->order_by_field === 'number') { + $seminar_name = trim($seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name']); + } else { + $seminar_name = $seminar['Name']; + + if ($seminar['VeranstaltungsNummer']) { + $seminar_name .= sprintf(' (%s)', trim($seminar['VeranstaltungsNummer'])); + } + } + $this->addElement(new SelectElement( + $seminar['Seminar_id'], + $seminar_name, + $seminar['Seminar_id'] === $this->course->id, + trim($seminar['VeranstaltungsNummer'] . ' ' . $seminar['Name']) + )); + } + return parent::render($variables); + } +} diff --git a/lib/classes/sidebar/SelectWidget.php b/lib/classes/sidebar/SelectWidget.php index ce311f698d970804c0c86a06bdedffd95f94fe8d..73971757b8a70a466cfa5dafc64ba1d36fe6db1e 100644 --- a/lib/classes/sidebar/SelectWidget.php +++ b/lib/classes/sidebar/SelectWidget.php @@ -19,15 +19,15 @@ class SelectWidget extends SidebarWidget */ public function __construct($title, $url, $name, $method = 'get', $multiple = false) { + parent::__construct(); $this->template = 'sidebar/select-widget'; - $this->setTitle($title); $this->setUrl($url); $this->setSelectParameterName($name); $this->setRequestMethod($method); $this->setMultiple($multiple); - $this->template_variables['max_length'] = 30; + $this->template_variables['dropdownAutoWidth'] = false; } /** @@ -87,6 +87,16 @@ class SelectWidget extends SidebarWidget $this->template_variables['method'] = $method; } + /** + * set the dropdown auto width (default: false) + * @param $dropdownAutoWidth + * @return void + */ + public function setDropdownAutoWidth($dropdownAutoWidth) + { + $this->template_variables['dropdownAutoWidth'] = $dropdownAutoWidth; + } + /** * Sets whether selecting multiple values is allowed or not * @param bool $multiple true if selection multiple values should be allowed diff --git a/lib/classes/sidebar/SidebarWidget.php b/lib/classes/sidebar/SidebarWidget.php index 7075b8ab46012913535f763fd04d2a44d8b4165f..6feb153a7751c806dfef7ac2e443ccc0facfe419 100644 --- a/lib/classes/sidebar/SidebarWidget.php +++ b/lib/classes/sidebar/SidebarWidget.php @@ -19,7 +19,7 @@ class SidebarWidget extends Widget /** * Sets the ID of the HTML element that represents the widget. * - * @param $id The element-ID to be used for the widget. + * @param string $id The element-ID to be used for the widget. * */ public function setId(string $id) @@ -40,7 +40,7 @@ class SidebarWidget extends Widget /** * Sets the title of the widget. * - * @param String $title The title of the widget + * @param string $title The title of the widget */ public function setTitle($title) { @@ -50,7 +50,7 @@ class SidebarWidget extends Widget /** * Returns the title of the widget * - * @return mixed The title of the widget of false if no title has been set + * @return string The title of the widget of false if no title has been set */ public function getTitle() { @@ -101,7 +101,7 @@ class SidebarWidget extends Widget * Renders the widget. * The widget will only be rendered if it contains at least one element. * - * @return String The THML code of the rendered sidebar widget + * @return string The THML code of the rendered sidebar widget */ public function render($variables = []) { diff --git a/resources/assets/javascripts/bootstrap/forms.js b/resources/assets/javascripts/bootstrap/forms.js index 3bf5026ef4290bfae89f9b4863c9c7d27aae821f..a70af54ea7ea02966c9e9bac719b10594a7b8136 100644 --- a/resources/assets/javascripts/bootstrap/forms.js +++ b/resources/assets/javascripts/bootstrap/forms.js @@ -175,7 +175,7 @@ function createSelect2(element) { return; } - var select_classes = $(element) + let select_classes = $(element) .removeClass('select2-awaiting') .attr('class'), option = $('<option>'), @@ -185,7 +185,9 @@ function createSelect2(element) { .css('opacity', 0) .appendTo('body'), wrapper = $('<div class="select2-wrapper">').css('display', cloned.css('display')), - placeholder; + placeholder, + dropdownAutoWidth = $(element).data('dropdown-auto-width') + ; cloned.remove(); $(wrapper) @@ -208,10 +210,11 @@ function createSelect2(element) { allowClear: placeholder !== undefined, minimumResultsForSearch: $(element).closest('.sidebar').length > 0 ? 15 : 10, placeholder: placeholder, + dropdownAutoWidth: dropdownAutoWidth, dropdownParent: $(element).closest('.ui-dialog,.sidebar,body'), templateResult: function(data, container) { if (data.element) { - var option_classes = $(data.element).attr('class'), + let option_classes = $(data.element).attr('class'), element_data = $(data.element).data(); $(container).addClass(option_classes); @@ -223,7 +226,7 @@ function createSelect2(element) { return data.text; }, templateSelection: function(data, container) { - var result = $('<span class="select2-selection__content">').text(data.text), + let result = $('<span class="select2-selection__content">').text(data.text), element_data = $(data.element).data(); if (element_data && element_data.textColor) { result.css('color', element_data.textColor); diff --git a/resources/assets/stylesheets/scss/i18n.scss b/resources/assets/stylesheets/scss/i18n.scss index 70136a109b1e72eb5822db04207c69d62efd6b73..7239879bec1b25835476485d4a053512382b02bb 100644 --- a/resources/assets/stylesheets/scss/i18n.scss +++ b/resources/assets/stylesheets/scss/i18n.scss @@ -15,7 +15,6 @@ div.i18n_group { height: 31px; overflow: hidden; max-width: $max-width; - z-index: 2; appearance: none; diff --git a/templates/sidebar/select-widget.php b/templates/sidebar/select-widget.php index cadd2773267d3b6318dc6882a4d15892cb028a1f..7c7b039f60ec29e2041cf8cb9ed1eb17f14ac707 100644 --- a/templates/sidebar/select-widget.php +++ b/templates/sidebar/select-widget.php @@ -3,7 +3,7 @@ <?= (strtolower($method) == 'post') ? CSRFProtection::tokenTag() : ''; ?> <select class="sidebar-selectlist <?= $class ?> <? if ($__is_nested): ?>nested-select<? endif; ?>" <? !empty($size) ? printf('size="%u"', $size) : '' ?> <?= !empty($attributes) ? arrayToHtmlAttributes($attributes) : '' ?> name="<?= sprintf('%s%s', htmlReady($name), $multiple ? '[]' : '') ?>" <? if ($multiple) echo 'multiple'; ?> - aria-label="<?= htmlReady($title) ?>"> + aria-label="<?= htmlReady($title) ?>" <?= $dropdownAutoWidth ? 'data-dropdown-auto-width="1"' : '' ?>> <? foreach ($elements as $element): ?> <? if ($element instanceof SelectGroupElement && count($element->getElements()) > 0): ?>