diff options
Diffstat (limited to 'modules-available/exams/page.inc.php')
-rw-r--r-- | modules-available/exams/page.inc.php | 115 |
1 files changed, 95 insertions, 20 deletions
diff --git a/modules-available/exams/page.inc.php b/modules-available/exams/page.inc.php index 8c82f50e..20101229 100644 --- a/modules-available/exams/page.inc.php +++ b/modules-available/exams/page.inc.php @@ -8,9 +8,15 @@ class Page_Exams extends Page var $lectures; - protected function readLocations() + /** if examid is set, also add a column 'selected' **/ + protected function readLocations($examid = NULL) { - $tmp = Database::simpleQuery("select * from location;", []); + if ($examid == NULL) { + $tmp = Database::simpleQuery("SELECT locationid, locationname FROM location;", []); + } else { + $tmp = Database::simpleQuery("SELECT locationid, locationname, " . + "EXISTS(SELECT * FROM exams NATURAL JOIN exams_x_locations WHERE locationid = x.locationid AND examid= :examid) AS selected FROM location x", compact('examid')); + } while ($loc = $tmp->fetch(PDO::FETCH_ASSOC)) { $this->locations[] = $loc; } @@ -18,9 +24,9 @@ class Page_Exams extends Page protected function readExams() { - $tmp = Database::simpleQuery("select examid, starttime, endtime, GROUP_CONCAT(locationid) AS locationids," - . " GROUP_CONCAT(locationname) AS locationnames from " - . "exams NATURAL JOIN exams_x_locations NATURAL JOIN location GROUP BY examid;", []); + $tmp = Database::simpleQuery("select examid, starttime, endtime, description, GROUP_CONCAT(locationid) AS locationids, " + . "GROUP_CONCAT(locationname) AS locationnames FROM " + . "exams NATURAL LEFT JOIN exams_x_locations NATURAL LEFT JOIN location GROUP BY examid", []); while ($exam = $tmp->fetch(PDO::FETCH_ASSOC)) { $this->exams[] = $exam; } @@ -28,7 +34,10 @@ class Page_Exams extends Page protected function readLectures() { - $tmp = Database::simpleQuery("select * from sat.lecture NATURAL JOIN sat.lecture_x_location"); + $tmp = Database::simpleQuery( + "SELECT lectureid, locationid, displayname, starttime, endtime, isenabled ". + "FROM sat.lecture NATURAL JOIN sat.lecture_x_location " . + "WHERE isexam <> 0"); while ($lecture = $tmp->fetch(PDO::FETCH_ASSOC)) { $this->lectures[] = $lecture; } @@ -50,12 +59,13 @@ class Page_Exams extends Page } $unique_ids = 1; + /* add the red shadows */ foreach ($this->exams as $e) { foreach(explode(',', $e['locationids']) as $locationid) { $out[] = [ 'id' => 'shadow_' . $unique_ids++, 'content' => '', - 'start' => $e['starttime'], - 'end' => $e['endtime'], + 'start' => intval($e['starttime']) * 1000, + 'end' => intval($e['endtime']) * 1000, 'type' => 'background', 'group' => $locationid, ]; @@ -64,12 +74,16 @@ class Page_Exams extends Page /* add the lectures */ $i = 2; foreach ($this->lectures as $l) { + $mark = '<span class="' . ($l['isenabled'] ? '' : 'glyphicon glyphicon-exclamation-sign') . '"></span>'; $out[] = [ 'id' => $l['lectureid'], - 'content' => $l['displayname'], - 'start' => date(DATE_ISO8601, $l['starttime']), - 'end' => date(DATE_ISO8601, $l['endtime']), + 'content' => htmlspecialchars($l['displayname']) . $mark , + 'title' => $l['isenabled'] ? '' : Dictionary::translate('warning_lecture_is_not_enabled'), + 'start' => intval($l['starttime']) * 1000, + 'end' => intval($l['endtime']) * 1000, 'group' => $l['locationid'], + 'className' => $l['isenabled'] ? '' : 'disabled', + 'editable' => false, 'subgroup' => $i++ ]; @@ -90,12 +104,22 @@ class Page_Exams extends Page return json_encode($out); } + protected function makeExamsForTemplate() { + $out = []; + foreach ($this->exams as $exam) { + $tmp = $exam; + $tmp['starttime'] = date('Y-m-d H:i', $tmp['starttime']); + $tmp['endtime'] = date('Y-m-d H:i', $tmp['endtime']); + $out[] = $tmp; + } + return $out; + } protected function doPreprocess() { User::load(); $req_action = Request::get('action', 'show'); - if (in_array($req_action, ['show', 'add', 'delete'])) { + if (in_array($req_action, ['show', 'add', 'delete', 'edit'])) { $this->action = $req_action; } @@ -109,8 +133,13 @@ class Page_Exams extends Page /* process form-data */ $locationids = Request::post('locations', [], "ARRAY"); - $starttime = Request::post('starttime_date') . " " . Request::post('starttime_time'); - $endtime = Request::post('endtime_date') . " " . Request::post('endtime_time'); + /* global room has id 0 */ + if(empty($locationids)) { + $locationids[] = 0; + } + + $starttime = strtotime(Request::post('starttime_date') . " " . Request::post('starttime_time')); + $endtime = strtotime(Request::post('endtime_date') . " " . Request::post('endtime_time')); $description = Request::post('description'); $res = Database::exec("INSERT INTO exams(starttime, endtime, description) VALUES(:starttime, :endtime, :description);", @@ -141,8 +170,41 @@ class Page_Exams extends Page Message::addInfo('exam-deleted-success'); } Util::redirect('?do=exams'); + } elseif ($this->action === 'edit') { + $examid = Request::get('examid', -1, 'int'); + $this->readLocations($examid); + $this->currentExam = Database::queryFirst("SELECT * FROM exams WHERE examid = :examid", array('examid' => $examid)); + + if (Request::isPost()) { + $locationids = Request::post('locations', [], "ARRAY"); + + /* global room has id 0 */ + if(empty($locationids)) { + $locationids[] = 0; + } + + $starttime = strtotime(Request::post('starttime_date') . " " . Request::post('starttime_time')); + $endtime = strtotime(Request::post('endtime_date') . " " . Request::post('endtime_time')); + $description = Request::post('description'); + /* update fields */ + $res = Database::exec("UPDATE exams SET starttime = :starttime, endtime = :endtime, description = :description WHERE examid = :examid", + compact('starttime', 'endtime', 'description', 'examid')); + /* drop all connections and reconnect to rooms */ + $res = $res !== FALSE && Database::exec("DELETE FROM exams_x_locations WHERE examid = :examid", compact('examid')); + /* reconnect */ + foreach ($locationids as $lid) { + $res = $res !== FALSE && Database::exec("INSERT INTO exams_x_locations(examid, locationid) VALUES(:examid, :lid)", compact('examid', 'lid')); + } + if ($res !== FALSE) { + Message::addInfo("changes-successfully-saved"); + } else { + Message::addError("error-while-saving-changes"); + } + Util::redirect('?do=exams'); + } + } else { - Util::traceError("unknown action"); + Util::traceError("action not implemented"); } } @@ -154,15 +216,28 @@ class Page_Exams extends Page if ($this->action === "show") { Render::setTitle("All Exams"); Render::addTemplate('page-exams', - [ 'exams' => $this->exams, - 'exams_json' => $this->makeItemsForVis(), - 'rooms_json' => $this->makeGroupsForVis(), - 'vis_begin' => date('Y-m-d'), - 'vis_end' => date('Y-m-d', strtotime("+2 day")) + [ 'exams' => $this->makeExamsForTemplate(), + 'exams_json' => $this->makeItemsForVis(), + 'rooms_json' => $this->makeGroupsForVis(), + 'vis_begin' => time() * 1000, + 'vis_end' => strtotime('+2 day') * 1000, + 'vis_min_date' => strtotime('-1 day') * 1000, + 'vis_max_date' => strtotime('+3 month') * 1000 ]); } elseif ($this->action === "add") { Render::setTitle("Add Exam"); Render::addTemplate('page-add-exam', ['locations' => $this->locations]); + } elseif ($this->action === 'edit') { + Render::setTitle("Edit Exam"); + $exam = [ + 'examid' => $this->currentExam['examid'], + 'starttime_date' => date('Y-m-d', $this->currentExam['starttime']), + 'starttime_time' => date('H:i', $this->currentExam['starttime']), + 'endtime_date' => date('Y-m-d', $this->currentExam['endtime']), + 'endtime_time' => date('H:i', $this->currentExam['endtime']), + 'description' => $this->currentExam['description'] + ]; + Render::addTemplate('page-edit-exam', ['exam' => $exam, 'locations' => $this->locations]); } // Render::output('hi'); } |