From 67a0551f8fb94f0089d27fc7259a713f1bed7a63 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 6 Aug 2020 13:23:03 +0200 Subject: [exams] Make warnings for locations work with trees --- modules-available/exams/page.inc.php | 18 +++++++++++++----- .../exams/templates/page-add-edit-exam.html | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/modules-available/exams/page.inc.php b/modules-available/exams/page.inc.php index 3937e108..868f5927 100644 --- a/modules-available/exams/page.inc.php +++ b/modules-available/exams/page.inc.php @@ -458,6 +458,12 @@ class Page_Exams extends Page } } + private function getLocationLookupJson() + { + $locs = Location::getLocationsAssoc(); // Add key x so we get an object, not array + return json_encode(['x' => 0] + array_map(function ($item) { return $item['children']; }, $locs)); + } + protected function doRender() { if ($this->action === "show") { @@ -495,7 +501,7 @@ class Page_Exams extends Page } elseif ($this->action === "add") { Render::setTitle(Dictionary::translate('title_add-exam')); - $data = []; + $data = ['locmap' => $this->getLocationLookupJson()]; $baseLecture = Request::any('lectureid', false, 'string'); $locations = null; if ($baseLecture !== false) { @@ -533,10 +539,12 @@ class Page_Exams extends Page } } - $data = []; - $data['exam'] = $exam; - $data['locations'] = $this->locations; - $data['lectures'] = $this->lectures; + $data = [ + 'locmap' => $this->getLocationLookupJson(), + 'exam' => $exam, + 'locations' => $this->locations, + 'lectures' => $this->lectures, + ]; // if user has no permission to edit for this location, disable the location in the select foreach ($data['locations'] as &$loc) { diff --git a/modules-available/exams/templates/page-add-edit-exam.html b/modules-available/exams/templates/page-add-edit-exam.html index 5946874c..43ac46dc 100644 --- a/modules-available/exams/templates/page-add-edit-exam.html +++ b/modules-available/exams/templates/page-add-edit-exam.html @@ -170,6 +170,7 @@ document.addEventListener("DOMContentLoaded", function () { moment.locale(LANG); var slxMoment = moment; + var locmap = {{{locmap}}}; var dateSettings = { format: 'yyyy-mm-dd', @@ -277,6 +278,17 @@ document.addEventListener("DOMContentLoaded", function () { })(); showHeading(); }; + + var expandLocs = function(locs) { + var ret = locs.map(function(n) { return parseInt(n) }); + for (var i = 0; i < locs.length; ++i) { + if ($.isArray(locmap[locs[i]])) { + ret.push(...locmap[locs[i]].filter(function (v, i, s) { return ret.indexOf(v) === -1 })); + } + } + return ret; + }; + var updateLocationsInfo = function() { (function() { var selectedLocs = $locations.val(); @@ -289,6 +301,8 @@ document.addEventListener("DOMContentLoaded", function () { if (!$.isArray(selectedLocs)) { selectedLocs = [selectedLocs]; } + selectedLocs = expandLocs(selectedLocs); + lecLocs = expandLocs(lecLocs); for (var i = 0; i < selectedLocs.length; ++i) { if (lecLocs.indexOf(selectedLocs[i]) === -1) { $locationWarning.find('.locname').text($locations.find('option[value="' + selectedLocs[i] + '"]').text()); -- cgit v1.2.3-55-g7522