From 6d0567218eb3f584889d5b3fadc6fb6c8b5a7b56 Mon Sep 17 00:00:00 2001
From: David Siegfried <david.siegfried@uni-vechta.de>
Date: Thu, 12 May 2022 13:09:24 +0000
Subject: [PATCH] show more infos and cleanup, ref #196

Merge request studip/studip!66
---
 app/controllers/course/timesrooms.php         | 204 ++++++++++++------
 app/views/course/timesrooms/_cycleRow.php     |  42 ++--
 .../course/timesrooms/_irregularEvents.php    |  63 +++---
 .../course/timesrooms/_regularEvents.php      |  45 ++--
 app/views/course/timesrooms/_roomRequest.php  |  26 ++-
 .../timesrooms/_select_semester_range.php     |  31 +--
 app/views/course/timesrooms/cancelStack.php   |   2 +-
 app/views/course/timesrooms/createCycle.php   |  64 +++---
 .../course/timesrooms/createSingleDate.php    |  18 +-
 app/views/course/timesrooms/editDate.php      |  96 ++++-----
 app/views/course/timesrooms/editSemester.php  |  16 +-
 app/views/course/timesrooms/editStack.php     |  16 +-
 app/views/course/timesrooms/index.php         |  28 +--
 13 files changed, 392 insertions(+), 259 deletions(-)

diff --git a/app/controllers/course/timesrooms.php b/app/controllers/course/timesrooms.php
index 9e835ca64bc..d681a0926d9 100644
--- a/app/controllers/course/timesrooms.php
+++ b/app/controllers/course/timesrooms.php
@@ -40,8 +40,10 @@ class Course_TimesroomsController extends AuthenticatedController
         if (LockRules::Check($this->course->id, 'room_time')) {
             $this->locked     = true;
             $this->lock_rules = LockRules::getObjectRule($this->course->id);
-            PageLayout::postInfo(_('Diese Seite ist für die Bearbeitung gesperrt. Sie können die Daten einsehen, jedoch nicht verändern.')
-                                 . ($this->lock_rules['description'] ? '<br>' . formatLinks($this->lock_rules['description']) : ''));
+            PageLayout::postInfo(
+                _('Diese Seite ist für die Bearbeitung gesperrt. Sie können die Daten einsehen, jedoch nicht verändern.')
+                . ($this->lock_rules['description'] ? '<br>' . formatLinks($this->lock_rules['description']) : '')
+            );
         }
 
         $this->show = [
@@ -181,7 +183,7 @@ class Course_TimesroomsController extends AuthenticatedController
         $check_room_requests = Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS;
         $single_dates  = [];
         $this->single_date_room_request_c = 0;
-        foreach ($dates as $id => $val) {
+        foreach ($dates as $val) {
             foreach ($this->semester as $sem) {
                 if ($this->semester_filter !== 'all' && $this->semester_filter !== $sem->id) {
                     continue;
@@ -269,6 +271,7 @@ class Course_TimesroomsController extends AuthenticatedController
                 $this->semester_filter = $start_semester->semester_id;
 
                 $course->store();
+
                 if (!$course->isOpenEnded()) {
                     $new_start_weeks = $course->start_semester->getStartWeeks($course->end_semester);
                     SeminarCycleDate::removeOutRangedSingleDates($this->course->getStartSemester(), $this->course->getEndSemesterVorlesEnde(), $course->id);
@@ -367,9 +370,12 @@ class Course_TimesroomsController extends AuthenticatedController
             $termin_info   = $termin->getFullname();
 
             $termin->cancelDate();
-            PageLayout::postInfo(sprintf(_('Der Termin %s wurde aus der Liste der regelmäßigen Termine'
-                                           . ' gelöscht und als unregelmäßiger Termin eingetragen, da Sie die Zeiten des Termins verändert haben,'
-                                           . ' so dass dieser Termin nun nicht mehr regelmäßig ist.'), htmlReady($termin_info)));
+            PageLayout::postInfo(sprintf(
+                _('Der Termin %s wurde aus der Liste der regelmäßigen Termine'
+               . ' gelöscht und als unregelmäßiger Termin eingetragen, da Sie die Zeiten des Termins verändert haben,'
+               . ' so dass dieser Termin nun nicht mehr regelmäßig ist.'),
+                htmlReady($termin_info)
+            ));
 
             $termin = new CourseDate();
             unset($termin_values['metadate_id']);
@@ -380,10 +386,11 @@ class Course_TimesroomsController extends AuthenticatedController
 
         // Set assigned teachers
         $assigned_teachers = Request::optionArray('assigned_teachers');
-        $dozenten          = $this->course->getMembers('dozent');
-        $termin->dozenten  = count($dozenten) !== count($assigned_teachers)
-                          ? User::findMany($assigned_teachers)
-                          : [];
+        $dozenten          = $this->course->getMembers();
+        $this->dozenten = [];
+        if(count($dozenten) !== count($assigned_teachers)) {
+            $this->dozenten = User::findMany($assigned_teachers);
+        }
 
         // Set assigned groups
         $assigned_groups       = Request::optionArray('assigned_groups');
@@ -422,39 +429,52 @@ class Course_TimesroomsController extends AuthenticatedController
             }
             if ($room_id) {
                 if ($room_id != $singledate->resource_id) {
-                    if ($resObj = $singledate->bookRoom($room_id, $preparation_time ?: 0)) {
+                    if ($singledate->bookRoom($room_id, $preparation_time ?: 0)) {
                         $messages = $singledate->getMessages();
                         $this->course->appendMessages($messages);
                     } else if (!$singledate->ex_termin) {
                         $this->course->createError(
                             sprintf(
-                                _("Der angegebene Raum konnte für den Termin %s nicht gebucht werden!"),
-                                '<b>' . $singledate->toString() . '</b>')
+                                _('Der angegebene Raum konnte für den Termin %s nicht gebucht werden!'),
+                                '<strong>' . htmlReady($singledate->toString()) . '</strong>'
+                            )
                         );
                     }
                 } elseif ($termin->room_booking->preparation_time != ($preparation_time * 60)) {
                     $singledate->bookRoom($room_id, $preparation_time ?: 0);
                 }
             } else if ($old_room_id && !$singledate->resource_id) {
-                $this->course->createInfo(sprintf(_("Die Raumbuchung für den Termin %s wurde aufgehoben, da die neuen Zeiten außerhalb der alten liegen!"), '<b>'. $singledate->toString() .'</b>'));
+                $this->course->createInfo(
+                    sprintf(
+                        _('Die Raumbuchung für den Termin %s wurde aufgehoben, da die neuen Zeiten außerhalb der alten liegen!'),
+                        '<strong>'.htmlReady( $singledate->toString()) .'</strong>'
+                    ));
             } else if (Request::get('room_id_parameter')) {
-                $this->course->createInfo(_("Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!"));
+                $this->course->createInfo(
+                    _('Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!')
+                );
             }
         } elseif (Request::option('room') == 'freetext') {
             $singledate->setFreeRoomText(Request::get('freeRoomText_sd'));
             $singledate->killAssign();
             $singledate->store();
-            $this->course->createMessage(sprintf(_("Der Termin %s wurde geändert, etwaige Raumbuchung wurden entfernt und stattdessen der angegebene Freitext eingetragen!"), '<b>' . $singledate->toString() . '</b>'));
+            $this->course->createMessage(sprintf(
+                _('Der Termin %s wurde geändert, etwaige Raumbuchungen wurden entfernt und stattdessen der angegebene Freitext eingetragen!'),
+                '<strong>' . htmlReady($singledate->toString()) . '</strong>'
+            ));
         } elseif (Request::option('room') == 'noroom') {
             $singledate->setFreeRoomText('');
             $singledate->killAssign();
             $singledate->store();
-            $this->course->createMessage(sprintf(_("Der Termin %s wurde geändert, etwaige freie Ortsangaben und Raumbuchungen wurden entfernt."), '<b>' . $singledate->toString() . '</b>'));
+            $this->course->createMessage(sprintf(
+                _('Der Termin %s wurde geändert, etwaige freie Ortsangaben und Raumbuchungen wurden entfernt.'),
+                '<strong>' . htmlReady($singledate->toString()) . '</strong>'
+            ));
         }
         if ($singledate->messages['error']) {
             PageLayout::postError(
                 _('Die folgenden Fehler traten beim Bearbeiten des Termins auf:'),
-                $singledate->messages['error']
+                htmlReady($singledate->messages['error'])
             );
         }
 
@@ -469,7 +489,9 @@ class Course_TimesroomsController extends AuthenticatedController
     public function createSingleDate_action()
     {
         PageLayout::setTitle(Course::findCurrent()->getFullname() . " - " . _('Einzeltermin anlegen'));
-        $this->restoreRequest(words('date start_time end_time room related_teachers related_statusgruppen freeRoomText dateType fromDialog course_type'));
+        $this->restoreRequest(
+            words('date start_time end_time room related_teachers related_statusgruppen freeRoomText dateType fromDialog course_type')
+        );
 
         if (Config::get()->RESOURCES_ENABLE) {
             $this->setAvailableRooms(null);
@@ -529,7 +551,9 @@ class Course_TimesroomsController extends AuthenticatedController
             $this->course->appendMessages($singledate->getMessages());
         }
         if (Request::get('room_id_parameter')) {
-            $this->course->createInfo(_("Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!"));
+            $this->course->createInfo(
+                _('Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!')
+            );
         }
 
 
@@ -537,7 +561,7 @@ class Course_TimesroomsController extends AuthenticatedController
             $this->course->setFilter('all');
         }
 
-        $this->course->createMessage(sprintf(_('Der Termin %s wurde hinzugefügt!'), $termin->getFullname()));
+        $this->course->createMessage(sprintf(_('Der Termin %s wurde hinzugefügt!'), htmlReady($termin->getFullname())));
         $this->course->store();
         $this->displayMessages();
 
@@ -554,7 +578,10 @@ class Course_TimesroomsController extends AuthenticatedController
         $ex_termin = CourseExDate::find($termin_id);
         $termin    = $ex_termin->unCancelDate();
         if ($termin) {
-            $this->course->createMessage(sprintf(_('Der Termin %s wurde wiederhergestellt!'), $termin->getFullname()));
+            $this->course->createMessage(sprintf(
+                _('Der Termin %s wurde wiederhergestellt!'),
+                htmlReady($termin->getFullname())
+            ));
             $this->displayMessages();
         }
 
@@ -617,7 +644,7 @@ class Course_TimesroomsController extends AuthenticatedController
     private function editStack($cycle_id)
     {
         $this->cycle_id = $cycle_id;
-        $this->teachers = $this->course->getMembers('dozent');
+        $this->teachers = $this->course->getMembers();
         $this->gruppen  = Statusgruppen::findBySeminar_id($this->course->id);
         $checked_course_dates = CourseDate::findMany($_SESSION['_checked_dates']);
         $this->only_bookable_rooms = Request::submitted('only_bookable_rooms');
@@ -630,8 +657,7 @@ class Course_TimesroomsController extends AuthenticatedController
             }
             $db = DBManager::get();
             $stmt = $db->prepare(
-                "SELECT DISTINCT `id` FROM `resource_bookings`
-                WHERE `range_id` IN ( :date_ids )"
+                "SELECT DISTINCT `id` FROM `resource_bookings` WHERE `range_id` IN ( :date_ids )"
             );
             $stmt->execute(['date_ids' => $date_ids]);
             $date_booking_ids = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
@@ -714,7 +740,10 @@ class Course_TimesroomsController extends AuthenticatedController
             $ex_termin->content = '';
             $termin             = $ex_termin->unCancelDate();
             if ($termin !== null) {
-                $this->course->createMessage(sprintf(_('Der Termin %s wurde wiederhergestellt!'), $termin->getFullname()));
+                $this->course->createMessage(sprintf(
+                    _('Der Termin %s wurde wiederhergestellt!'),
+                    htmlReady($termin->getFullname())
+                ));
             }
         }
         $this->displayMessages();
@@ -804,7 +833,7 @@ class Course_TimesroomsController extends AuthenticatedController
 
         // Update related persons
         if (in_array($action, words('add delete'))) {
-            $course_lectures = $this->course->getMembers('dozent');
+            $course_lectures = $this->course->getMembers();
             $persons         = User::findMany($persons);
             foreach ($singledates as $singledate) {
                 if ($action === 'add') {
@@ -889,12 +918,14 @@ class Course_TimesroomsController extends AuthenticatedController
                     }
                     if (Request::option('room_id')) {
                         if (Request::option('room_id') != $singledate->room_booking->resource_id) {
-                            if ($resObj = $date->bookRoom(Request::option('room_id'), $preparation_time)) {
+                            if ($date->bookRoom(Request::option('room_id'), $preparation_time)) {
                                 $messages = $date->getMessages();
                                 $this->course->appendMessages($messages);
                             } else if (!$date->ex_termin) {
-                                $this->course->createError(sprintf(_("Der angegebene Raum konnte für den Termin %s nicht gebucht werden!"),
-                                    '<strong>' . $date->toString() . '</strong>'));
+                                $this->course->createError(sprintf(
+                                    _('Der angegebene Raum konnte für den Termin %s nicht gebucht werden!'),
+                                    '<strong>' . htmlReady($date->toString() ) . '</strong>')
+                                );
                             }
                         } elseif (($preparation_time * 60) != $singledate->room_booking->preparation_time) {
                             $date->bookRoom(Request::option('room_id'), $preparation_time);
@@ -902,26 +933,35 @@ class Course_TimesroomsController extends AuthenticatedController
                             $this->course->appendMessages($messages);
                         }
                     } else if (Request::get('room_id_parameter')) {
-                        $this->course->createInfo(_("Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!"));
+                        $this->course->createInfo(
+                            ('Um eine Raumbuchung durchzuführen, müssen Sie einen Raum aus dem Suchergebnis auswählen!')
+                        );
                     }
                 } elseif (Request::option('action') == 'freetext') {
                     $date->setFreeRoomText(Request::get('freeRoomText'));
                     $date->store();
                     $date->killAssign();
-                    $this->course->createMessage(sprintf(_("Der Termin %s wurde geändert, etwaige Raumbuchung wurden entfernt und stattdessen der angegebene Freitext eingetragen!"),
-                                                         '<strong>' . $date->toString() . '</strong>'));
+                    $this->course->createMessage(sprintf(
+                        _('Der Termin %s wurde geändert, etwaige Raumbuchungen wurden entfernt und stattdessen der angegebene Freitext eingetragen!'),
+                        '<strong>' . htmlReady($date->toString()) . '</strong>'
+                    ));
                 } elseif (Request::option('action') == 'noroom') {
                     $date->setFreeRoomText('');
                     $date->store();
                     $date->killAssign();
-                    $this->course->createMessage(sprintf(_("Der Termin %s wurde geändert, etwaige freie Ortsangaben und Raumbuchungen wurden entfernt."),
-                                                         '<strong>' . $date->toString() . '</strong>'));
+                    $this->course->createMessage(sprintf(
+                        _('Der Termin %s wurde geändert, etwaige freie Ortsangaben und Raumbuchungen wurden entfernt.'),
+                        '<strong>' . htmlReady($date->toString()) . '</strong>'
+                    ));
                 }
 
                 if (Request::get('course_type') != '') {
                     $date->setDateType(Request::get('course_type'));
                     $date->store();
-                    $this->course->createMessage(sprintf(_("Die Art des Termins %s wurde geändert."), '<strong>' . $date->toString() . '</strong>'));
+                    $this->course->createMessage(sprintf(
+                        _('Die Art des Termins %s wurde geändert.'),
+                        '<strong>' . htmlReady($date->toString()) . '</strong>'
+                    ));
                 }
             }
         }
@@ -932,7 +972,7 @@ class Course_TimesroomsController extends AuthenticatedController
      * The data saving part of the action to create one request
      * for multiple appointments.
      */
-    public function saveRequestStack($cycle_id = null)
+    public function saveRequestStack()
     {
         //The properties[] array is set by $rp->definition->toHtmlInput.
         //The default name for toHtmlInput input elements is:
@@ -985,8 +1025,7 @@ class Course_TimesroomsController extends AuthenticatedController
             }
         }
 
-        if (($successfully_stored < count($set_properties))
-            and count($set_properties)) {
+        if ($set_properties && $successfully_stored < count($set_properties)) {
             $this->course->createError(
                 _('Es wurden nicht alle zur Anfrage gehörenden Eigenschaften gespeichert!')
             );
@@ -1005,8 +1044,7 @@ class Course_TimesroomsController extends AuthenticatedController
             }
         }
 
-        if (($successfully_stored < count($appointments))
-            and count($appointments)) {
+        if (($successfully_stored < count($appointments)) && count($appointments)) {
             $this->course->createError(
                 _('Es wurden nicht alle zur Anfrage gehörenden Terminzuordnungen gespeichert!')
             );
@@ -1027,7 +1065,9 @@ class Course_TimesroomsController extends AuthenticatedController
     public function createCycle_action($cycle_id = null)
     {
         PageLayout::setTitle(Course::findCurrent()->getFullname() . " - " . _('Regelmäßige Termine anlegen'));
-        $this->restoreRequest(words('day start_time end_time description cycle startWeek teacher_sws fromDialog course_type'));
+        $this->restoreRequest(
+            words('day start_time end_time description cycle startWeek teacher_sws fromDialog course_type')
+        );
 
         $this->cycle = new SeminarCycleDate($cycle_id);
 
@@ -1061,10 +1101,16 @@ class Course_TimesroomsController extends AuthenticatedController
 
                 foreach ($this->start_weeks as $key => $week) {
                     if (mb_strpos($week, mb_substr($weeks[0], -15)) !== false) {
-                        $this->end_semester_weeks['start'][] = ['value' => $key, 'label' => sprintf(_('Anfang %s'), $sem->name)];
+                        $this->end_semester_weeks['start'][] = [
+                            'value' => $key,
+                            'label' => sprintf(_('Anfang %s'), $sem->name)
+                        ];
                     }
                     if (mb_strpos($week, mb_substr($weeks[count($weeks) - 1], -15)) !== false) {
-                        $this->end_semester_weeks['ende'][] = ['value' => $key, 'label' => sprintf(_('Ende %s'), $sem->name)];
+                        $this->end_semester_weeks['ende'][] = [
+                            'value' => $key,
+                            'label' => sprintf(_('Ende %s'), $sem->name)
+                        ];
                     }
                     foreach ($weeks as $val) {
                         if (mb_strpos($week, mb_substr($val, -15)) !== false) {
@@ -1086,8 +1132,6 @@ class Course_TimesroomsController extends AuthenticatedController
     public function saveCycle_action()
     {
         CSRFProtection::verifyRequest();
-
-
         $start = strtotime(Request::get('start_time'));
         $end   = strtotime(Request::get('end_time'));
 
@@ -1123,7 +1167,6 @@ class Course_TimesroomsController extends AuthenticatedController
         }
 
         if ($cycle->store()) {
-
             if(Request::int('course_type')) {
                 $cycle->setSingleDateType(Request::int('course_type'));
             }
@@ -1131,12 +1174,17 @@ class Course_TimesroomsController extends AuthenticatedController
             $cycle_info = $cycle->toString();
             NotificationCenter::postNotification('CourseDidChangeSchedule', $this->course);
 
-            $this->course->createMessage(sprintf(_('Die regelmäßige Veranstaltungszeit %s wurde hinzugefügt!'), $cycle_info));
+            $this->course->createMessage(sprintf(
+                _('Die regelmäßige Veranstaltungszeit %s wurde hinzugefügt!'),
+                htmlReady($cycle_info))
+            );
             $this->displayMessages();
             $this->relocate('course/timesrooms/index');
         } else {
             $this->storeRequest();
-            $this->course->createError(_('Die regelmäßige Veranstaltungszeit konnte nicht hinzugefügt werden! Bitte überprüfen Sie Ihre Eingabe.'));
+            $this->course->createError(
+                _('Die regelmäßige Veranstaltungszeit konnte nicht hinzugefügt werden! Bitte überprüfen Sie Ihre Eingabe.')
+            );
             $this->displayMessages();
             $this->redirect('course/timesrooms/createCycle');
         }
@@ -1150,7 +1198,6 @@ class Course_TimesroomsController extends AuthenticatedController
     public function editCycle_action($cycle_id)
     {
         $cycle = SeminarCycleDate::find($cycle_id);
-
         $start = strtotime(Request::get('start_time'));
         $end   = strtotime(Request::get('end_time'));
 
@@ -1212,9 +1259,10 @@ class Course_TimesroomsController extends AuthenticatedController
         } else {
             $cycle_string = $cycle->toString();
             if ($cycle->delete()) {
-                $message = sprintf(_('Der regelmäßige Eintrag "%s" wurde gelöscht.'),
-                                   '<strong>' . $cycle_string . '</strong>');
-                PageLayout::postSuccess($message);
+                PageLayout::postSuccess(sprintf(
+                    _('Der regelmäßige Eintrag "%s" wurde gelöscht.'),
+                    '<strong>' . htmlReady($cycle_string) . '</strong>'
+                ));
             }
         }
 
@@ -1247,12 +1295,21 @@ class Course_TimesroomsController extends AuthenticatedController
         if (Request::get('cancel_comment') != $termin->content) {
             $termin->content = Request::get('cancel_comment');
             if ($termin->store()) {
-                $this->course->createMessage(sprintf(_('Der Kommtentar des gelöschten Termins %s wurde geändert.'), $termin->getFullname()));
+                $this->course->createMessage(sprintf(
+                    _('Der Kommtentar des gelöschten Termins %s wurde geändert.'),
+                    htmlReady($termin->getFullname())
+                ));
             } else {
-                $this->course->createInfo(sprintf(_('Der gelöschte Termin %s wurde nicht verändert.'), $termin->getFullname()));
+                $this->course->createInfo(sprintf(
+                    _('Der gelöschte Termin %s wurde nicht verändert.'),
+                    htmlReady($termin->getFullname())
+                ));
             }
         } else {
-            $this->course->createInfo(sprintf(_('Der gelöschte Termin %s wurde nicht verändert.'), $termin->getFullname()));
+            $this->course->createInfo(sprintf(
+                _('Der gelöschte Termin %s wurde nicht verändert.'),
+                htmlReady($termin->getFullname())
+            ));
         }
         if (Request::int('cancel_send_message')) {
             $snd_messages = raumzeit_send_cancel_message(Request::get('cancel_comment'), $termin);
@@ -1277,22 +1334,28 @@ class Course_TimesroomsController extends AuthenticatedController
                     $this->course->getFullname('sem-duration-name')
                 ),
                 $this->url_for('course/timesrooms/editSemester'),
-                Icon::create('date', 'clickable')
+                Icon::create('date')
             )->asDialog('size=400');
             Sidebar::Get()->addWidget($actions);
         }
 
         $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('course/timesrooms/index'), 'semester_filter');
         foreach ($this->selectable_semesters as $item) {
-            $element = new SelectElement($item['semester_id'],
-                                         $item['name'],
-                                         $item['semester_id'] == $this->semester_filter);
+            $element = new SelectElement(
+                $item['semester_id'],
+                $item['name'],
+                $item['semester_id'] == $this->semester_filter
+            );
             $widget->addElement($element);
         }
         Sidebar::Get()->addWidget($widget);
 
         if ($GLOBALS['perm']->have_perm('admin')) {
-            $list = new SelectWidget(_('Veranstaltungen'), $this->url_for('course/timesrooms/index'), 'cid');
+            $list = new SelectWidget(
+                _('Veranstaltungen'),
+                $this->url_for('course/timesrooms/index'),
+                'cid'
+            );
 
             foreach (AdminCourseFilter::get()->getCoursesForAdminWidget() as $seminar) {
                 $list->addElement(new SelectElement(
@@ -1381,14 +1444,23 @@ class Course_TimesroomsController extends AuthenticatedController
         }
 
         if ($has_topics) {
-            $this->course->createMessage(sprintf(_('Dem Termin %s war ein Thema zugeordnet. Sie können das Thema im Ablaufplan einem anderen Termin (z.B. einem Ausweichtermin) zuordnen.'),
-                $termin_date, '<a href="' . URLHelper::getLink('dispatch.php/course/topics') . '">', '</a>'));
+            $this->course->createMessage(sprintf(
+                _('Dem Termin %s war ein Thema zugeordnet. Sie können das Thema im %sAblaufplan%s einem anderen Termin (z.B. einem Ausweichtermin) zuordnen.'),
+                htmlReady($termin_date),
+                '<a href="' . URLHelper::getLink('dispatch.php/course/topics') . '">', '</a>'
+            ));
         }
         if ($termin_room) {
-            $this->course->createMessage(sprintf(_('Der Termin %s wurde gelöscht! Die Buchung für den Raum %s wurde gelöscht.'),
-                $termin_date, $termin_room));
+            $this->course->createMessage(sprintf(
+                _('Der Termin %s wurde gelöscht! Die Buchung für den Raum %s wurde gelöscht.'),
+                htmlReady($termin_date),
+                htmlReady($termin_room)
+            ));
         } else {
-            $this->course->createMessage(sprintf(_('Der Termin %s wurde gelöscht!'), $termin_date));
+            $this->course->createMessage(sprintf(
+                _('Der Termin %s wurde gelöscht!'),
+                htmlReady($termin_date)
+            ));
         }
 
         return $termin;
diff --git a/app/views/course/timesrooms/_cycleRow.php b/app/views/course/timesrooms/_cycleRow.php
index cfb291ad3bf..d1adcdd6c8b 100644
--- a/app/views/course/timesrooms/_cycleRow.php
+++ b/app/views/course/timesrooms/_cycleRow.php
@@ -9,9 +9,9 @@ $is_exTermin = $termin instanceof CourseExDate;
             <input class="<?= $class_ids ?>" type="checkbox" id="<?= htmlReady($termin->termin_id) ?>"
                    value="<?= htmlReady($termin->termin_id) ?>"
                    <? if (is_array($checked_dates)): ?>
-                       <? if (in_array($termin->termin_id, $checked_dates)) echo 'checked'; ?>
+                       <? if (in_array($termin->termin_id, $checked_dates)) echo 'checked' ?>
                    <? else: ?>
-                       <? if (!$is_exTermin && $termin->date > time() && ($termin->date <= $current_semester->ende || $semester_filter !== 'all')) echo 'checked'; ?>
+                       <? if (!$is_exTermin && $termin->date > time() && ($termin->date <= $current_semester->ende || $semester_filter !== 'all')) echo 'checked' ?>
                    <? endif ?>
                    name="single_dates[]">
         </label>
@@ -35,22 +35,34 @@ $is_exTermin = $termin instanceof CourseExDate;
 
     <td>
     <? if (count($termin->dozenten) > 0): ?>
-        <ul class="list-unstyled list-csv <? if ($is_exTermin) echo 'is_ex_termin'; ?>">
+        <ul class="list-unstyled list-csv <? if ($is_exTermin) echo 'is_ex_termin' ?>">
         <? foreach ($termin->dozenten as $dozent) : ?>
             <li><?= $dozent instanceof User ? htmlReady($dozent->getFullname()) : '' ?></li>
         <? endforeach ?>
         </ul>
-    <? endif; ?>
+    <? endif ?>
+    </td>
+    <td>
+        <ul class="list-unstyled list-csv">
+            <? if (count($termin->statusgruppen)) : ?>
+                <? foreach ($termin->statusgruppen as $group) : ?>
+                    <li><?= htmlReady($group->name)?></li>
+                <? endforeach ?>
+            <? endif ?>
+        </ul>
     </td>
     <td>
     <? if ($room_holiday = SemesterHoliday::isHoliday($termin->date, false)): ?>
-        <? $room_holiday = '<span' . ($is_exTermin ? ' class="is_ex_termin"' : '') . '>(' .
-                           htmlReady($room_holiday['name']) . ')</span>' ?>
-    <? endif; ?>
+        <? $room_holiday = sprintf(
+            '<span %s>(%s)</span>',
+            ($is_exTermin ? ' class="is_ex_termin"' : ''),
+            htmlReady($room_holiday['name'])
+        )?>
+    <? endif ?>
 
     <? if ($is_exTermin && ($comment = $termin->content)) : ?>
         <span class="is_ex_termin" style="font-style: italic"><?= _('(fällt aus)') ?></span>
-        <?= tooltipIcon($termin->content, false) ?>
+        <?= tooltipIcon($termin->content) ?>
     <? elseif ($name = SemesterHoliday::isHoliday($termin->date, false) && $is_exTermin): ?>
         <?= $room_holiday ?>
     <? elseif ($room = $termin->getRoom()) : ?>
@@ -86,7 +98,7 @@ $is_exTermin = $termin instanceof CourseExDate;
                 $linkAttributes
             ),
             _('Kommentare bearbeiten'),
-            Icon::create('edit', 'clickable', ['title' => _('Kommentar für diesen Termin bearbeiten')]),
+            Icon::create('edit', Icon::ROLE_CLICKABLE, ['title' => _('Kommentar für diesen Termin bearbeiten')]),
             ['data-dialog' => 'size=50%']
         ) ?>
 
@@ -96,7 +108,7 @@ $is_exTermin = $termin instanceof CourseExDate;
             'name'         => 'delete_single_date',
             'data-confirm' => _('Diesen Termin wiederherstellen?'),
             'formaction'   => $controller->url_for('course/timesrooms/undeleteSingle/' . $termin->id),
-        ]; ?>
+        ] ?>
         <? if (Request::isXhr()) : ?>
             <? $params['data-dialog'] = 'size=auto' ?>
         <? endif ?>
@@ -104,14 +116,14 @@ $is_exTermin = $termin instanceof CourseExDate;
         <? $actionMenu->addButton(
             'delete_part',
             _('Termin wiederherstellen'),
-            Icon::create('trash+decline', 'clickable', $params)
+            Icon::create('trash+decline', Icon::ROLE_CLICKABLE, $params)
         ) ?>
 
     <? elseif (!$locked) : ?>
         <? $actionMenu->addLink(
             $controller->url_for('course/timesrooms/editDate/' . $termin->id, $linkAttributes),
             _('Termin bearbeiten'),
-            Icon::create('edit', 'clickable', ['title' => _('Diesen Termin bearbeiten')]),
+            Icon::create('edit', Icon::ROLE_CLICKABLE, ['title' => _('Diesen Termin bearbeiten')]),
             ['data-dialog' => '']
         ) ?>
 
@@ -125,7 +137,7 @@ $is_exTermin = $termin instanceof CourseExDate;
                 'course/timesrooms/deleteSingle/' . $termin->id,
                 ['cycle_id' => $termin->metadate_id] + $linkAttributes
             ),
-        ]; ?>
+        ] ?>
         <? if (Request::isXhr()) : ?>
             <? $params['data-dialog'] = 'size=big' ?>
         <? endif ?>
@@ -139,10 +151,10 @@ $is_exTermin = $termin instanceof CourseExDate;
                 ]
             ),
             _('Termin löschen'),
-            Icon::create('trash', 'clickable'),
+            Icon::create('trash'),
             ['data-dialog' => '1']
         ) ?>
-    <? endif; ?>
+    <? endif ?>
         <?= $actionMenu->render() ?>
     </td>
 </tr>
diff --git a/app/views/course/timesrooms/_irregularEvents.php b/app/views/course/timesrooms/_irregularEvents.php
index f85b18ba124..4fa06bbcff4 100644
--- a/app/views/course/timesrooms/_irregularEvents.php
+++ b/app/views/course/timesrooms/_irregularEvents.php
@@ -18,14 +18,14 @@ $room_request_filter = function ($date) {
             <? $actionMenu->addLink(
                 $controller->url_for('course/timesrooms/createSingleDate/' . $course->id, $linkAttributes),
                 _('Einzeltermin hinzufügen'),
-                Icon::create('date+add', 'clickable', ['title' => _('Einzeltermin hinzufügen')]),
+                Icon::create('date+add', Icon::ROLE_CLICKABLE, ['title' => _('Einzeltermin hinzufügen')]),
                 ['data-dialog' => 'size=600']
             ) ?>
 
             <? $actionMenu->addLink(
                 $controller->url_for('course/block_appointments/index/' . $course->id, $linkAttributes),
                 _('Blocktermin hinzufügen'),
-                Icon::create('timetable+add', 'clickable', ['title' => _('Blocktermin hinzufügen')]),
+                Icon::create('timetable+add', Icon::ROLE_CLICKABLE, ['title' => _('Blocktermin hinzufügen')]),
                 ['data-dialog' => 'size=600']
             ) ?>
             <?= $actionMenu->render() ?>
@@ -54,53 +54,56 @@ $room_request_filter = function ($date) {
                 </h1>
                 <section>
                     <span>
-                        <?= sprintf(ngettext('%u Termin', '%u Termine', count($termine)),
-                                     count($termine)) ?>
+                        <?= sprintf(ngettext('%u Termin', '%u Termine', count($termine)), count($termine)) ?>
                     </span>
                 <? if (Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS): ?>
-                    <span>
-                        | <strong><?= _('Einzel-Raumanfrage') ?></strong>:
+                    <span>| <strong><?= _('Einzel-Raumanfrage') ?></strong>:
                     <? if ($single_date_room_request_c > 0): ?>
                         <?= sprintf(_('%u noch offen'), $single_date_room_request_c) ?>
                     <? else: ?>
                         <?= _('keine offen') ?>
-                    <? endif; ?>
+                    <? endif ?>
                     </span>
-                <? endif; ?>
+                <? endif ?>
                 </section>
             </header>
             <section>
                 <table class="default">
                     <colgroup>
                     <? if (!$locked) :?>
-                        <col width="30px">
+                        <col style="width: 30px">
                     <? endif ?>
-                        <col width="30%">
+                        <col style="width: 30%">
                         <col>
-                        <col width="20%">
-                        <col width="50px">
+                        <col>
+                        <col style="width: 20%">
+                        <col style="width: 50px">
                     </colgroup>
 
                     <tbody>
                     <? foreach ($termine as $termin): ?>
-                        <?= $this->render_partial('course/timesrooms/_cycleRow.php', [
-                            'termin'    => $termin,
-                            'class_ids' => 'ids-irregular',
-                        ]) ?>
-                    <? endforeach; ?>
+                        <?= $this->render_partial(
+                            'course/timesrooms/_cycleRow.php',
+                            [
+                                'termin'    => $termin,
+                                'class_ids' => 'ids-irregular',
+                            ]
+                        ) ?>
+                    <? endforeach ?>
                     </tbody>
                 </table>
             </section>
         </article>
-    <? endforeach; ?>
+    <? endforeach ?>
     <? if(!$locked) : ?>
         <table class="default nohover">
             <colgroup>
-                <col width="30px">
-                <col width="30%">
+                <col style="width: 30px">
+                <col style="width: 30%">
+                <col>
                 <col>
-                <col width="20%">
-                <col width="50px">
+                <col style="width: 20%">
+                <col style="width: 50px">
             </colgroup>
 
             <tfoot>
@@ -112,14 +115,18 @@ $room_request_filter = function ($date) {
                             <?= _('Alle auswählen') ?>
                         </label>
                     </td>
-                    <td colspan="3" class="actions">
+                    <td colspan="5" class="actions">
                         <select name="method" class="datesBulkActions actionForAllIrregular">
                             <?= $this->render_partial('course/timesrooms/_stack_actions.php') ?>
                         </select>
-                        <?= Studip\Button::create( _('Ausführen'), 'run', [
-                            'class' => 'actionForAllIrregular',
-                            'data-dialog' => 'size=big',
-                        ]) ?>
+                        <?= Studip\Button::create(
+                            _('Ausführen'),
+                            'run',
+                            [
+                                'class' => 'actionForAllIrregular',
+                                'data-dialog' => 'size=big',
+                            ]
+                        ) ?>
                     </td>
                 </tr>
             </tfoot>
@@ -134,5 +141,5 @@ $room_request_filter = function ($date) {
             </strong>
         </p>
     </section>
-<? endif; ?>
+<? endif ?>
 </section>
diff --git a/app/views/course/timesrooms/_regularEvents.php b/app/views/course/timesrooms/_regularEvents.php
index d813254d697..075c4bf5c1f 100644
--- a/app/views/course/timesrooms/_regularEvents.php
+++ b/app/views/course/timesrooms/_regularEvents.php
@@ -31,7 +31,7 @@
                         <?= tooltipIcon(_('Keine Raumbuchungen vorhanden')) ?>
                     <? else: ?>
                         <?= tooltipIcon(_('Keine offenen Raumbuchungen')) ?>
-                    <? endif; ?>
+                    <? endif ?>
                         <a href="<?= ContentBoxHelper::href($metadate_id) ?>">
                             <?= htmlReady($cycle['cycle']->toString('long')) ?>
                         </a>
@@ -62,7 +62,7 @@
                         </span>
                     <? if (Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS) : ?>
                         <? $metadate = SeminarCycleDate::find($metadate_id) ?>
-                        <? $open_requests = $metadate->countOpenRequestsForDates(); ?>
+                        <? $open_requests = $metadate->countOpenRequestsForDates() ?>
                         <span>
                             <strong><?= _('Einzel-Raumanfrage') ?></strong>:
                             <?= htmlReady(
@@ -79,7 +79,11 @@
                         <? $actionMenu->addLink(
                             $controller->url_for('course/timesrooms/createCycle/' . $metadate_id, $linkAttributes),
                             _('Diesen Zeitraum bearbeiten'),
-                            Icon::create('edit', 'clickable', ['title' => _('Diesen Zeitraum bearbeiten'), 'style' => 'vertical-align: middle;']),
+                            Icon::create(
+                                'edit',
+                                Icon::ROLE_CLICKABLE,
+                                ['title' => _('Diesen Zeitraum bearbeiten'), 'style' => 'vertical-align: middle;']
+                            ),
                             ['data-dialog' => 'size=600']
                         ) ?>
                         <? if (Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS) : ?>
@@ -94,7 +98,7 @@
                                 _('Raumanfrage erstellen'),
                                 Icon::create(
                                     'room-request',
-                                    'clickable',
+                                    Icon::ROLE_CLICKABLE,
                                     [
                                         'title' => _('Raumanfrage erstellen'),
                                         'style' => 'vertical-align: middle;'
@@ -106,7 +110,7 @@
                         <? $actionMenu->addButton(
                             'delete_cycle',
                             _('Diesen Zeitraum löschen'),
-                            Icon::create('trash', 'clickable', ['title' => _('Diesen Zeitraum löschen')]),
+                            Icon::create('trash', Icon::ROLE_CLICKABLE, ['title' => _('Diesen Zeitraum löschen')]),
                             [
                                 'formaction'   => $controller->url_for('course/timesrooms/deleteCycle/' . $metadate_id, $linkAttributes),
                                 'data-confirm' => _('Soll dieser Zeitraum wirklich gelöscht werden?')
@@ -121,17 +125,18 @@
                     <table class="default">
                         <colgroup>
                             <? if (!$locked) : ?>
-                                <col width="30px">
+                                <col style="width: 30px">
                             <? endif ?>
-                            <col width="30%">
+                            <col style="width: 30%">
+                            <col>
                             <col>
-                            <col width="20%">
-                            <col width="50px">
+                            <col style="width: 20%">
+                            <col style="width: 50px">
                         </colgroup>
                     <? foreach ($cycle['dates'] as $semester_id => $termine) : ?>
                         <thead>
                             <tr>
-                                <th colspan="<?= !$locked ? 5 : 4?>">
+                                <th colspan="<?= !$locked ? 6 : 5?>">
                                     <label>
                                         <? if(!$locked) : ?>
                                             <input type="checkbox" class="date-proxy_<?= $metadate_id ?>"
@@ -144,8 +149,10 @@
                         </thead>
                         <tbody id="<?= $metadate_id ?>-<?= $semester_id ?>">
                         <? foreach ($termine as $termin) : ?>
-                            <?= $this->render_partial('course/timesrooms/_cycleRow.php',
-                                    ['termin' => $termin, 'class_ids' => 'ids-regular']) ?>
+                            <?= $this->render_partial(
+                                'course/timesrooms/_cycleRow.php',
+                                ['termin' => $termin, 'class_ids' => 'ids-regular']
+                            ) ?>
                         <? endforeach ?>
                         </tbody>
                     <? endforeach ?>
@@ -160,14 +167,18 @@
                                             <?= _('Alle auswählen') ?>
                                         </label>
                                     </td>
-                                    <td colspan="3" class="actions">
+                                    <td colspan="4" class="actions">
                                         <select name="method" class="datesBulkActions actionForAllRegular_<?= $metadate_id ?>">
                                             <?= $this->render_partial('course/timesrooms/_stack_actions.php') ?>
                                         </select>
-                                        <?= Studip\Button::create(_('Ausführen'), 'run', [
+                                        <?= Studip\Button::create(
+                                            _('Ausführen'),
+                                            'run',
+                                            [
                                                 'class' => 'actionForAllRegular_' . $metadate_id,
                                                 'data-dialog' => 'size=big'
-                                        ]) ?>
+                                            ]
+                                        ) ?>
                                     </td>
                                 </tr>
                             </tfoot>
@@ -177,7 +188,7 @@
                 </section>
             </article>
         </form>
-    <? endforeach; ?>
+    <? endforeach ?>
 
 <? else: ?>
     <section>
@@ -185,5 +196,5 @@
             <strong><?= _('Keine regelmäßigen Termine vorhanden') ?></strong>
         </p>
     </section>
-<? endif; ?>
+<? endif ?>
 </section>
diff --git a/app/views/course/timesrooms/_roomRequest.php b/app/views/course/timesrooms/_roomRequest.php
index 1244f55f2f3..3eecb3c46b1 100644
--- a/app/views/course/timesrooms/_roomRequest.php
+++ b/app/views/course/timesrooms/_roomRequest.php
@@ -10,10 +10,18 @@ $global_requests = $course->room_requests->filter(function (RoomRequest $request
         </h1>
 
         <nav>
-            <?= tooltipIcon(_('Hier können Sie für die gesamte Veranstaltung, also für alle regelmäßigen und unregelmäßigen Termine, '
-                              . 'eine Raumanfrage erstellen.')) ?>
+            <?= tooltipIcon(
+                _('Hier können Sie für die gesamte Veranstaltung, also für alle regelmäßigen und unregelmäßigen Termine, '
+                    . 'eine Raumanfrage erstellen.')
+            ) ?>
             <a class="link-add" href="<?= $controller->url_for('course/room_requests/request_start',
-                    array('cid' => $course->id, 'range_str' => 'course', 'origin' => 'course_timesrooms', 'create_room_request' => 1)) ?>"
+                [
+                    'cid'                 => $course->id,
+                    'range_str'           => 'course',
+                    'origin'              => 'course_timesrooms',
+                    'create_room_request' => 1
+                ]
+            ) ?>"
                data-dialog="size=big"
                title="<?= _('Neue Raumanfrage für die Veranstaltung erstellen') ?>">
                 <?= _('Neue Raumanfrage') ?>
@@ -22,12 +30,12 @@ $global_requests = $course->room_requests->filter(function (RoomRequest $request
     </header>
 
     <section>
-    <? if (count($global_requests) > 0): ?>
-        <p><?= _('Für diese Veranstaltung liegt eine offene Raumanfrage vor') ?></p>
-        <?= Studip\LinkButton::create(_('Raumanfragen anzeigen'),
+        <? if (count($global_requests) > 0): ?>
+            <p><?= _('Für diese Veranstaltung liegt eine offene Raumanfrage vor') ?></p>
+            <?= Studip\LinkButton::create(_('Raumanfragen anzeigen'),
                 URLHelper::getURL('dispatch.php/course/room_requests/index/' . $course->getId())) ?>
-    <? else: ?>
-        <p><?= _('Keine Raumanfrage vorhanden') ?></p>
-    <? endif; ?>
+        <? else: ?>
+            <p><?= _('Keine Raumanfrage vorhanden') ?></p>
+        <? endif ?>
     </section>
 </section>
diff --git a/app/views/course/timesrooms/_select_semester_range.php b/app/views/course/timesrooms/_select_semester_range.php
index 7b87b232972..bb9ddd4e963 100644
--- a/app/views/course/timesrooms/_select_semester_range.php
+++ b/app/views/course/timesrooms/_select_semester_range.php
@@ -1,14 +1,17 @@
-<form action="<?= $controller->url_for('course/timesrooms/index')?>" method="post" class="default" data-dialog="size=big">
-    <section>
-        <label class="undecorated">
-            <?= _('Semester auswählen') ?>
-            <select name="semester_filter" class="size-m">
-                <? foreach ($selectable_semesters as $item) : ?>
-                    <option value="<?= $item['semester_id']?>" <?= $item['semester_id'] == $semester_filter ? 'selected' : ''?>><?= htmlReady($item['name'])?></option>
-                <? endforeach ?>
-            </select>
-        </label>
-
-        <?= Studip\Button::createAccept(_('Auswählen'), 'select_sem')?>
-    </section>
-</form>
\ No newline at end of file
+<form action="<?= $controller->link_for('course/timesrooms/index')?>" method="post" class="default" data-dialog="size=big">
+    <section>
+        <label class="undecorated">
+            <?= _('Semester auswählen') ?>
+            <select name="semester_filter" class="size-m">
+                <? foreach ($selectable_semesters as $item) : ?>
+                    <option value="<?= $item['semester_id']?>"
+                        <?= $item['semester_id'] === $semester_filter ? 'selected' : ''?>>
+                        <?= htmlReady($item['name'])?>
+                    </option>
+                <? endforeach ?>
+            </select>
+        </label>
+
+        <?= Studip\Button::createAccept(_('Auswählen'), 'select_sem')?>
+    </section>
+</form>
diff --git a/app/views/course/timesrooms/cancelStack.php b/app/views/course/timesrooms/cancelStack.php
index a5aca01a38d..742c16c86fa 100644
--- a/app/views/course/timesrooms/cancelStack.php
+++ b/app/views/course/timesrooms/cancelStack.php
@@ -10,6 +10,6 @@
         <?= Studip\LinkButton::create(_('Zurück zur Übersicht'),
               $controller->url_for('course/timesrooms/index'),
               ['data-dialog' => 'size=big']) ?>
-    <? endif; ?>
+    <? endif ?>
     </footer>
 </form>
diff --git a/app/views/course/timesrooms/createCycle.php b/app/views/course/timesrooms/createCycle.php
index 5e3717561ec..c226ab164db 100644
--- a/app/views/course/timesrooms/createCycle.php
+++ b/app/views/course/timesrooms/createCycle.php
@@ -15,7 +15,7 @@
                         value="<?= $d ?>" <?= (Request::int('day') === $d) || (!is_null($cycle->start_time) && $cycle->weekday == $d) || ($d == 1) ? 'selected' : ''?>>
                         <?= getWeekday($d, false) ?>
                     </option>
-                <? endforeach; ?>
+                <? endforeach ?>
             </select>
         </label>
 
@@ -42,7 +42,7 @@
             <select name="course_type" id="course_type" class="size-s">
                 <? foreach ($GLOBALS['TERMIN_TYP'] as $id => $value) : ?>
                     <option value="<?= $id ?>" <? if(Request::get('course_type') && Request::get('course_type') == $id) :?>selected="selected"<? endif?>><?= htmlReady($value['name']) ?></option>
-                <? endforeach; ?>
+                <? endforeach ?>
             </select>
         </label>
 
@@ -76,20 +76,22 @@
                         <option value="<?= $end_sem_week['value'] ?>"
                             <?= (Request::get('startWeek', $cycle->week_offset) == $end_sem_week['value']) ? 'selected' : '' ?>>
                                 <?= htmlReady($end_sem_week['label']) ?></option>
-                    <? endforeach; ?>
-                <? endif; ?>
+                    <? endforeach ?>
+                <? endif ?>
 
                 <!-- write down all weeks for all Semesters -->
-                <? foreach ($clean_weeks as $semester => $weeks) : ?>
-                    <optgroup label="<?= htmlReady($semester) ?>">
-                        <? foreach ($weeks as $value => $label) : ?>
-                            <option value="<?= $value ?>"
-                                <?= (Request::get('startWeek', $cycle->week_offset) == $value) ? 'selected' : '' ?>>
-                                    <?= htmlReady($label) ?>
-                            </option>
-                        <? endforeach; ?>
-                    </optgroup>
-                <? endforeach; ?>
+                <? if (!empty($clean_weeks)) : ?>
+                    <? foreach ($clean_weeks as $semester => $weeks) : ?>
+                        <optgroup label="<?= htmlReady($semester) ?>">
+                            <? foreach ($weeks as $value => $label) : ?>
+                                <option value="<?= $value ?>"
+                                    <?= (Request::get('startWeek', $cycle->week_offset) == $value) ? 'selected' : '' ?>>
+                                        <?= htmlReady($label) ?>
+                                </option>
+                            <? endforeach ?>
+                        </optgroup>
+                    <? endforeach ?>
+                <? endif ?>
             </select>
         </label>
 
@@ -103,19 +105,21 @@
                             <?= (Request::get('endWeek', $selected) == $end_sem_week['value']) ? 'selected' : '' ?>>
                                 <?= htmlReady($end_sem_week['label']) ?>
                         </option>
-                    <? endforeach; ?>
-                <? endif; ?>
+                    <? endforeach ?>
+                <? endif ?>
 
-                <? foreach ($clean_weeks as $semester => $weeks) : ?>
-                    <optgroup label="<?= htmlReady($semester) ?>">
-                        <? foreach ($weeks as $value => $label) : ?>
-                            <option value="<?= $value  ?>"
-                                <?= (Request::get('endWeek', $selected) == $value) ? 'selected' : '' ?>>
-                                    <?= htmlReady($label) ?>
-                            </option>
-                        <? endforeach; ?>
-                    </optgroup>
-                <? endforeach; ?>
+                <? if (!empty($clean_weeks)) : ?>
+                    <? foreach ($clean_weeks as $semester => $weeks) : ?>
+                        <optgroup label="<?= htmlReady($semester) ?>">
+                            <? foreach ($weeks as $value => $label) : ?>
+                                <option value="<?= $value  ?>"
+                                    <?= (Request::get('endWeek', $selected) == $value) ? 'selected' : '' ?>>
+                                        <?= htmlReady($label) ?>
+                                </option>
+                            <? endforeach ?>
+                        </optgroup>
+                    <? endforeach ?>
+                <? endif ?>
             </select>
         </label>
 
@@ -129,7 +133,11 @@
     <footer data-dialog-button>
         <?= Studip\Button::createAccept(_('Speichern'), 'save', ['data-dialog' => 'size=600']) ?>
         <? if (Request::int('fromDialog')): ?>
-            <?= Studip\LinkButton::create(_('Zurück zur Übersicht'), $controller->url_for('course/timesrooms/index'), ['data-dialog' => 'size=big']) ?>
-        <? endif; ?>
+            <?= Studip\LinkButton::create(
+                _('Zurück zur Übersicht'),
+                $controller->url_for('course/timesrooms/index'),
+                ['data-dialog' => 'size=big']
+            ) ?>
+        <? endif ?>
     </footer>
 </form>
diff --git a/app/views/course/timesrooms/createSingleDate.php b/app/views/course/timesrooms/createSingleDate.php
index f5dafe3e2fe..4364feb074e 100644
--- a/app/views/course/timesrooms/createSingleDate.php
+++ b/app/views/course/timesrooms/createSingleDate.php
@@ -21,7 +21,7 @@
         </label>
 
         <label for="dateType">
-            <?= _('Art'); ?>
+            <?= _('Art') ?>
             <select id="dateType" name="dateType">
                 <? foreach ($GLOBALS['TERMIN_TYP'] as $key => $val) : ?>
                     <option <?= Request::get('dateType') == $key ? 'selected' : '' ?>
@@ -68,16 +68,16 @@
                         <? foreach ($teachers as $dozent) : ?>
                             <option <?= in_array($dozent['user_id'], Request::getArray('related_teachers')) ? 'selected' : '' ?>
                                 value="<?= $dozent['user_id'] ?>"><?= htmlReady($dozent['fullname']) ?></option>
-                        <? endforeach; ?>
+                        <? endforeach ?>
                     </select>
                 <? else : ?>
                     <p style="margin-left: 15px">
                         <? $dozent = array_pop($teachers) ?>
                         <?= htmlReady($dozent['fullname']) ?>
                     </p>
-                <? endif; ?>
+                <? endif ?>
             </label>
-        <? endif; ?>
+        <? endif ?>
 
 
         <? if (count($groups) > 0) : ?>
@@ -86,16 +86,20 @@
                     <? foreach ($groups as $group) : ?>
                         <option <?= in_array($group->getId(), Request::getArray('related_statusgruppen')) ? 'selected' : '' ?>
                             value="<?= $group->getId() ?>"><?= htmlReady($group['name']) ?></option>
-                    <? endforeach; ?>
+                    <? endforeach ?>
                 </select>
             </label>
-        <? endif; ?>
+        <? endif ?>
     </fieldset>
 
     <footer data-dialog-button>
         <?= Studip\Button::createAccept(_('Speichern'), 'save', ['data-dialog' => 'size=600']) ?>
         <? if (Request::get('fromDialog')) : ?>
-            <?= Studip\LinkButton::create(_('Zurück zur Übersicht'), $controller->url_for('course/timesrooms/index'), ['data-dialog' => 'size=big']) ?>
+            <?= Studip\LinkButton::create(
+                _('Zurück zur Übersicht'),
+                $controller->url_for('course/timesrooms/index'),
+                ['data-dialog' => 'size=big']
+            ) ?>
         <? endif ?>
     </footer>
 </form>
diff --git a/app/views/course/timesrooms/editDate.php b/app/views/course/timesrooms/editDate.php
index c5e3bf737e8..cff54b5a1c7 100644
--- a/app/views/course/timesrooms/editDate.php
+++ b/app/views/course/timesrooms/editDate.php
@@ -11,7 +11,7 @@
                         <?= $date->date_typ == $id ? 'selected' : '' ?>>
                         <?= htmlReady($value['name']) ?>
                     </option>
-                <? endforeach; ?>
+                <? endforeach ?>
             </select>
         </label>
         <label class="col-2">
@@ -45,7 +45,7 @@
                             ->setAttributes(['onFocus' => "jQuery('input[type=radio][name=room][value=room]').prop('checked', 'checked')"])
                             ->render() ?>
                     <? else: ?>
-                        <? $selected_room_id = $date->room_booking->resource_id; ?>
+                        <? $selected_room_id = $date->room_booking->resource_id ?>
                         <select name="room_id" onFocus="jQuery('input[type=radio][name=room][value=room]').prop('checked', 'checked')">
                             <? foreach ($selectable_rooms as $room): ?>
                                 <option value="<?= htmlReady($room->id) ?>"
@@ -84,7 +84,7 @@
                        value="<?= htmlReady($preparation_time) ?>"
                        min="0" max="<?= htmlReady($max_preparation_time) ?>">
             </label>
-        <? endif; ?>
+        <? endif ?>
         <label class="horizontal">
             <input type="radio" name="room" value="freetext" <?= $date->raum ? 'checked' : '' ?>
                    data-deactivates="input.preparation-time[name='preparation_time']">
@@ -117,8 +117,7 @@
         <legend><?= _('Durchführende Lehrende') ?></legend>
 
         <section class="studip-selection-selected">
-            <h2><?= _('Zugewiesene Lehrende') ?></h2>
-
+            <p><strong><?= _('Zugewiesene Lehrende') ?></strong></p>
             <ul>
             <? foreach ($assigned_teachers as $teacher): ?>
                 <li data-selection-id="<?= htmlReady($teacher->user_id) ?>">
@@ -132,7 +131,7 @@
                         <?= htmlReady($teacher->getFullname()) ?>
                     </span>
                 </li>
-            <? endforeach; ?>
+            <? endforeach ?>
                 <li class="empty-placeholder">
                     <?= _('Kein spezieller Lehrender zugewiesen') ?>
                 </li>
@@ -140,21 +139,20 @@
         </section>
 
         <section class="studip-selection-selectable">
-            <h2><?= _('Lehrende der Veranstaltung') ?></h2>
-
+            <p><strong><?= _('Lehrende der Veranstaltung') ?></strong></p>
             <ul>
-        <? foreach ($teachers as $teacher): ?>
-            <? if (!$assigned_teachers->find($teacher->user_id)): ?>
-                <li data-selection-id="<?= htmlReady($teacher->user_id) ?>" >
-                    <span class="studip-selection-image">
-                        <?= Avatar::getAvatar($teacher->user_id)->getImageTag(Avatar::SMALL) ?>
-                    </span>
-                    <span class="studip-selection-label">
-                        <?= htmlReady($teacher->getUserFullname()) ?>
-                    </span>
-                </li>
-            <? endif; ?>
-        <? endforeach; ?>
+            <? foreach ($teachers as $teacher): ?>
+                <? if (!$assigned_teachers->find($teacher->user_id)): ?>
+                    <li data-selection-id="<?= htmlReady($teacher->user_id) ?>" >
+                        <span class="studip-selection-image">
+                            <?= Avatar::getAvatar($teacher->user_id)->getImageTag(Avatar::SMALL) ?>
+                        </span>
+                        <span class="studip-selection-label">
+                            <?= htmlReady($teacher->getUserFullname()) ?>
+                        </span>
+                    </li>
+                <? endif ?>
+            <? endforeach ?>
                 <li class="empty-placeholder">
                     <?= sprintf(
                             _('Ihre Auswahl entspricht dem Zustand "%s" und wird beim Speichern zurückgesetzt'),
@@ -164,26 +162,24 @@
             </ul>
         </section>
     </fieldset>
-<? endif; ?>
+<? endif ?>
 
 <? if (count($groups) > 0): ?>
     <fieldset class="collapsed studip-selection" data-attribute-name="assigned_groups">
         <legend><?= _('Beteiligte Gruppen') ?></legend>
-
         <section class="studip-selection-selected">
-            <h2><?= _('Zugewiesene Gruppen') ?></h2>
-
+            <p><strong><?= _('Zugewiesene Gruppen') ?></strong></p>
             <ul>
-            <? foreach ($assigned_groups as $group) : ?>
-                <li data-selection-id="<?= htmlReady($group->id) ?>">
-                    <input type="hidden" name="assigned_groups[]"
-                           value="<?= htmlReady($group->id) ?>">
+                <? foreach ($assigned_groups as $group) : ?>
+                    <li data-selection-id="<?= htmlReady($group->id) ?>">
+                        <input type="hidden" name="assigned_groups[]"
+                               value="<?= htmlReady($group->id) ?>">
 
-                    <span class="studip-selection-label">
-                        <?= htmlReady($group->name) ?>
-                    </span>
-                </li>
-            <? endforeach ?>
+                        <span class="studip-selection-label">
+                            <?= htmlReady($group->name) ?>
+                        </span>
+                    </li>
+                <? endforeach ?>
                 <li class="empty-placeholder">
                     <?= _('Keine spezielle Gruppe zugewiesen') ?>
                 </li>
@@ -191,33 +187,35 @@
         </section>
 
         <section class="studip-selection-selectable">
-            <h2><?= _('Gruppen der Veranstaltung') ?></h2>
-
+            <p><strong><?= _('Gruppen der Veranstaltung') ?></strong></p>
             <ul>
-        <? foreach ($groups as $group): ?>
-            <? if (!$assigned_groups->find($group->id)): ?>
-                <li data-selection-id="<?= htmlReady($group->id) ?>" >
-                    <span class="studip-selection-label">
-                        <?= htmlReady($group->name) ?>
-                    </span>
-                </li>
-            <? endif; ?>
-        <? endforeach; ?>
+                <? foreach ($groups as $group): ?>
+                    <? if (!$assigned_groups->find($group->id)): ?>
+                        <li data-selection-id="<?= htmlReady($group->id) ?>" >
+                            <span class="studip-selection-label">
+                                <?= htmlReady($group->name) ?>
+                            </span>
+                        </li>
+                    <? endif ?>
+                <? endforeach ?>
                 <li class="empty-placeholder">
                     <?= _('Alle Gruppen wurden dem Termin zugewiesen') ?>
                 </li>
             </ul>
         </section>
     </fieldset>
-<? endif; ?>
+<? endif ?>
 
     <footer data-dialog-button>
         <?= Studip\Button::createAccept(_('Speichern'), 'save_dates') ?>
         <? if (Request::int('fromDialog')) : ?>
-            <?= Studip\LinkButton::create(_('Zurück zur Übersicht'),
-                                          $controller->url_for('course/timesrooms',
-                                                               ['fromDialog' => 1, 'contentbox_open' => $date->metadate_id]),
-                                          ['data-dialog' => 'size=big']) ?>
+            <?= Studip\LinkButton::create(
+                _('Zurück zur Übersicht'),
+                $controller->url_for(
+                    'course/timesrooms',
+                    ['fromDialog' => 1, 'contentbox_open' => $date->metadate_id]
+                ),
+              ['data-dialog' => 'size=big']) ?>
         <? endif ?>
         <? if (Request::isXhr() && !$locked && Config::get()->RESOURCES_ENABLE && Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS): ?>
             <?  ?>
diff --git a/app/views/course/timesrooms/editSemester.php b/app/views/course/timesrooms/editSemester.php
index 2ea0963085c..66bda13a44d 100644
--- a/app/views/course/timesrooms/editSemester.php
+++ b/app/views/course/timesrooms/editSemester.php
@@ -8,11 +8,11 @@
             <?= _('Startsemester') ?>
             <select name="startSemester" id="startSemester">
                 <? foreach ($semester as $sem) : ?>
-                    <option
-                        value="<?= $sem->semester_id ?>" <?= $sem->semester_id == $course->start_semester->semester_id ? 'selected' : '' ?>>
+                    <option value="<?= $sem->semester_id ?>"
+                        <?= $sem->semester_id === $course->start_semester->semester_id ? 'selected' : '' ?>>
                         <?= htmlReady($sem->name) ?>
                     </option>
-                <? endforeach; ?>
+                <? endforeach ?>
             </select>
         </label>
 
@@ -28,11 +28,11 @@
                             <?= (count($course->semesters) > 1) && $course->end_semester->id == $sem->id ? 'selected' : '' ?>>
                             <?= htmlReady($sem->name) ?>
                         </option>
-                    <? endif; ?>
-                <? endforeach; ?>
-                <option value="-1"
-                    <?= $course->isOpenEnded() ? 'selected' : '' ?>>
-                    <?= _('Unbegrenzt') ?></option>
+                    <? endif ?>
+                <? endforeach ?>
+                <option value="-1"<?= $course->isOpenEnded() ? 'selected' : '' ?>>
+                    <?= _('Unbegrenzt') ?>
+                </option>
             </select>
         </label>
     </fieldset>
diff --git a/app/views/course/timesrooms/editStack.php b/app/views/course/timesrooms/editStack.php
index c3ed18cde4e..bd1a5cabcb6 100644
--- a/app/views/course/timesrooms/editStack.php
+++ b/app/views/course/timesrooms/editStack.php
@@ -98,11 +98,15 @@
             </select>
         </label>
 
-        <select name="related_persons[]" id="related_persons" multiple>
+        <? if (!empty($teachers)) : ?>
+            <select name="related_persons[]" id="related_persons" multiple>
             <? foreach ($teachers as $teacher) : ?>
-                <option value="<?= htmlReady($teacher['user_id']) ?>"><?= htmlReady($teacher['fullname']) ?></option>
+                <option value="<?= htmlReady($teacher['user_id']) ?>">
+                    <?= htmlReady($teacher['fullname']) ?>
+                </option>
             <? endforeach ?>
-        </select>
+            </select>
+        <? endif ?>
     </fieldset>
 
     <? if (count($gruppen)) : ?>
@@ -128,7 +132,11 @@
     <footer data-dialog-button>
         <?= Studip\Button::createAccept(_('Änderungen speichern'), 'save') ?>
         <? if (Request::int('fromDialog')) : ?>
-            <?= Studip\LinkButton::create(_('Zurück zur Übersicht'), $controller->url_for('course/timesrooms/index'), ['data-dialog' => 'size=big']) ?>
+            <?= Studip\LinkButton::create(
+                _('Zurück zur Übersicht'),
+                $controller->url_for('course/timesrooms/index'),
+                ['data-dialog' => 'size=big']
+            ) ?>
         <? endif ?>
     </footer>
 </form>
diff --git a/app/views/course/timesrooms/index.php b/app/views/course/timesrooms/index.php
index 48c8315e981..8636ebbd658 100644
--- a/app/views/course/timesrooms/index.php
+++ b/app/views/course/timesrooms/index.php
@@ -1,32 +1,34 @@
-<? if ($show['roomRequest']) : ?>
+<? if (!empty($show['roomRequest'])) : ?>
     <!--Raumanfragen-->
     <?= $this->render_partial('course/timesrooms/_roomRequestInfo.php') ?>
-<? endif; ?>
+<? endif ?>
 
 <? if (Request::isXhr()): ?>
     <?= $this->render_partial('course/timesrooms/_select_semester_range.php') ?>
 <? endif ?>
 
-<? if ($show['regular']) : ?>
+<? if (!empty($show['regular'])) : ?>
     <!--Regelmäßige Termine-->
     <?= $this->render_partial('course/timesrooms/_regularEvents.php') ?>
-<? endif; ?>
+<? endif ?>
 
-<? if ($show['irregular']) : ?>
+<? if (!empty($show['irregular'])) : ?>
     <!--Unregelmäßige Termine-->
     <?= $this->render_partial('course/timesrooms/_irregularEvents') ?>
-<? endif; ?>
+<? endif ?>
 
-<? if ($show['roomRequest']) : ?>
+<? if (!empty($show['roomRequest'])) : ?>
     <!--Raumanfrage-->
     <?= $this->render_partial('course/timesrooms/_roomRequest.php') ?>
-<? endif; ?>
+<? endif ?>
 
 <? if (Request::isXhr() && !$locked && Config::get()->RESOURCES_ENABLE && Config::get()->RESOURCES_ALLOW_ROOM_REQUESTS): ?>
     <div data-dialog-button>
-    <?= Studip\LinkButton::create(_('Raumanfrage erstellen'),
-            $controller->url_for('course/room_requests/request_start',
-            ['cid' => $course->id, 'range_str' => 'course', 'origin' => 'admin_courses']),
-            ['data-dialog' => 'size=big']) ?>
+    <?= Studip\LinkButton::create(
+        _('Raumanfrage erstellen'),
+        $controller->url_for('course/room_requests/request_start',
+        ['cid' => $course->id, 'range_str' => 'course', 'origin' => 'admin_courses']),
+        ['data-dialog' => 'size=big']
+    ) ?>
     </div>
-<? endif; ?>
+<? endif ?>
-- 
GitLab