summaryrefslogtreecommitdiffstats
path: root/modules-available/exams/templates/page-add-edit-exam.html
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/exams/templates/page-add-edit-exam.html')
-rw-r--r--modules-available/exams/templates/page-add-edit-exam.html209
1 files changed, 147 insertions, 62 deletions
diff --git a/modules-available/exams/templates/page-add-edit-exam.html b/modules-available/exams/templates/page-add-edit-exam.html
index a45cbac2..eb77e751 100644
--- a/modules-available/exams/templates/page-add-edit-exam.html
+++ b/modules-available/exams/templates/page-add-edit-exam.html
@@ -10,6 +10,8 @@
<form class="form" method="POST" action="?do=exams" id="tolleform">
+ <!-- fake button to prevent return from messing things up -->
+ <button type="submit" hidden onclick="return false"></button>
<div class="panel panel-default">
<div class="panel-heading"><label for="locations">{{lang_location}}</label></div>
<div class="panel-body">
@@ -23,6 +25,7 @@
{{/locations}}
</select>
</div>
+ {{lang_checkLocationSelectionHint}}
</div>
</div>
@@ -77,10 +80,10 @@
</div>
</div>
- <div class="panel">
- <div class="panel-body">
- {{lang_duration}}: <span id="exam-duration">-</span>
- </div>
+ <div>
+ {{lang_duration}}: <span id="exam-duration">-</span>
+ <span class="hidden" id="txt-invalid">{{lang_startOrEndInvalid}}</span>
+ <span class="hidden" id="txt-reverse">{{lang_startAfterEnd}}</span>
</div>
</div>
</div>
@@ -88,29 +91,43 @@
<div class="panel panel-default">
<div class="panel-heading"><label for="lecturelist">{{lang_autoStartLecture}}</label></div>
<div class="panel-body">
- <div class="row form-group">
- <div class="form-group col-xs-12">
- <p><i>{{lang_autoStartInfo}}</i></p>
- <div class="input-group">
- <span class="input-group-addon">
- <span class="glyphicon glyphicon-pencil"></span>
- </span>
- <select class="form-control" id="lecturelist" name="lectureid">
- <option value="">{{lang_none}}</option>
- {{#lectures}}
- <option data-from="{{starttime}}" data-to="{{endtime}}" value="{{lectureid}}" {{selected}} >{{displayname}}</option>
- {{/lectures}}
- </select>
- </div>
+ <div class="form-group">
+ <p><i>{{lang_autoStartInfo}}</i></p>
+ <div class="input-group">
+ <span class="input-group-addon">
+ <span class="glyphicon glyphicon-pencil"></span>
+ </span>
+ <select class="form-control" id="lecturelist" name="lectureid">
+ <option value="">{{lang_none}}</option>
+ {{#lectures}}
+ <option data-from="{{starttime}}" data-to="{{endtime}}"
+ {{#islocationprivate}}data-locations="{{lids}}"{{/islocationprivate}}
+ value="{{lectureid}}" {{selected}} >{{displayname}}</option>
+ {{/lectures}}
+ </select>
</div>
- <div class="form-group col-xs-12">
- <div class="checkbox"><input id="autologin" type="checkbox" name="autologin" value="demo" class="form-control" {{#exam.autologin}}checked{{/exam.autologin}}><label for="autologin">{{lang_autoLogin}}</label></div>
- <p><i>{{lang_autoLoginInfo}}</i></p>
+ <b id="sanity-check" class="slx-smallspace collapse">{{lang_sanityCheck}}</b>
+ <div id="warn-range" class="collapse">
+ <div class="text-warning">
+ <div class="item start-before-lecture-start text-danger">{{lang_examStartBeforeLectureStart}}</div>
+ <div class="item start-after-lecture-start">{{lang_examStartAfterLectureStart}}</div>
+ <div class="item start-after-lecture-end text-danger">{{lang_examStartAfterLectureEnd}}</div>
+ <div class="item end-before-lecture-end">{{lang_examEndBeforeLectureEnd}}</div>
+ <div class="item end-after-lecture-end">{{lang_examEndAfterLectureEnd}}</div>
+ </div>
+ {{lang_lectureTimespan}}:
+ <span class="lecture-range"></span>
</div>
- <div class="col-xs-12" id="lecture-info">
- -
+ <div id="warn-locations" class="text-danger collapse">
+ {{lang_lectureNotForLocation}}:
+ <span class="locname"></span>
</div>
</div>
+ <div class="slx-space"></div>
+ <div class="form-group">
+ <div class="checkbox"><input id="autologin" type="checkbox" name="autologin" value="demo" class="form-control" {{#exam.autologin}}checked{{/exam.autologin}}><label for="autologin">{{lang_autoLogin}}</label></div>
+ <p><i>{{lang_autoLoginInfo}}</i></p>
+ </div>
</div>
</div>
@@ -126,7 +143,7 @@
<input type="hidden" name="examid" value="{{exam.examid}}">
<div class="text-right" style="margin-bottom: 20px">
<button type="button" id="cancelButton" class="btn btn-default" style="margin-right: 10px">{{lang_cancel}}</button>
- <button type="button" onclick="checkGlobalExam()" id="saveButton" class="btn btn-primary"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
+ <button type="button" id="saveButton" class="btn btn-primary"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
</div>
<div class ="modal fade" id="confirmGlobalModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
@@ -149,14 +166,6 @@
<script type="application/javascript"><!--
-function checkGlobalExam() {
- if ($('#locations option:selected').length === 0 && $('#locations option').length > 1) {
- $("#confirmGlobalModal").modal();
- } else {
- $('#tolleform').submit();
- }
-}
-
document.addEventListener("DOMContentLoaded", function () {
moment.locale(LANG);
@@ -175,7 +184,8 @@ document.addEventListener("DOMContentLoaded", function () {
$('.datepicker').datepicker(dateSettings);
$('.timepicker2').timepicker(timeSettings);
- $('#locations').multiselect({numberDisplayed: 1});
+ var $locations = $('#locations');
+ $locations.multiselect({numberDisplayed: 1});
var start_date = $('#starttime_date');
var start_time = $('#starttime_time');
@@ -197,54 +207,129 @@ document.addEventListener("DOMContentLoaded", function () {
}
});
+ var examStart, examEnd;
+
var startEndChanged = function () {
- var sd = slxMoment(start_date.val() + ' ' + start_time.val(), 'YYYY-MM-DD H:mm');
- var ed = slxMoment(end_date.val() + ' ' + end_time.val(), 'YYYY-MM-DD H:mm');
- if (!sd.isValid() || !ed.isValid()) {
- rspan.text('-');
+ examStart = slxMoment(start_date.val() + ' ' + start_time.val(), 'YYYY-MM-DD H:mm');
+ examEnd = slxMoment(end_date.val() + ' ' + end_time.val(), 'YYYY-MM-DD H:mm');
+ if (!examStart.isValid() || !examEnd.isValid()) {
+ rspan.text($('#txt-invalid').text()).addClass('text-danger');
return;
}
- rspan.text(slxMoment.duration(ed.diff(sd)).humanize());
- // Lecture selection
- $('#lecturelist option').each(function (idx, elem) {
- var e = $(elem);
- var from = e.data('from');
- var to = e.data('to');
- if (!from || !to)
+ var diff = examEnd.diff(examStart);
+ if (diff <= 0) {
+ rspan.text($('#txt-reverse').text()).addClass('text-danger');
+ return;
+ }
+ rspan.text(slxMoment.duration(diff).humanize()).removeClass('text-danger');
+ updateLectureInfo();
+ };
+
+ var $timespanWarning = $('#warn-range');
+ var $locationWarning = $('#warn-locations');
+ var updateLectureInfo = function() {
+ (function() {
+ var $sel = $('#lecturelist option:selected');
+ var lectureStart = $sel.data('from');
+ var lectureEnd = $sel.data('to');
+ if (!lectureStart || !lectureEnd) {
+ $timespanWarning.hide();
return;
- from = slxMoment.unix(from);
- to = slxMoment.unix(to);
- if (from.isBefore(sd) || to.isAfter(ed)) {
- e.css('color', '#999');
- e.data('inrange', false)
+ }
+ lectureStart = slxMoment.unix(lectureStart);
+ lectureEnd = slxMoment.unix(lectureEnd);
+ var diff;
+ var warnings = [];
+ if (examStart.isBefore(lectureStart)) {
+ warnings.push('.start-before-lecture-start');
+ }
+ if (lectureEnd.diff(lectureStart, 'hours') >= 12) {
+ // Lecture is longer than 12 hours -- only consider exam start/end date outside range
+ if (lectureEnd.diff(examStart, 'minutes') < 15) { // Start after end, or very close to end
+ warnings.push('.start-after-lecture-end');
+ }
+ if (examEnd.diff(lectureEnd, 'minutes') > 15) {
+ warnings.push('.end-after-lecture-end');
+ }
} else {
- e.css('color', '');
- e.data('inrange', true);
+ // Lecture is shorter than 12 hours -- assume it's the actual timespan of the exam
+ if (examStart.diff(lectureStart, 'minutes') > 30) {
+ warnings.push('.start-after-lecture-start');
+ }
+ diff = examEnd.diff(lectureEnd, 'minutes');
+ if (diff > 15) {
+ warnings.push('.end-after-lecture-end');
+ } else if (diff < -30) {
+ warnings.push('.end-before-lecture-end');
+ }
}
- });
- updateLectureInfo();
+ if (warnings.length === 0) {
+ $timespanWarning.hide();
+ return;
+ }
+ $timespanWarning.find('.item').hide();
+ for (var i = 0; i < warnings.length; ++i) {
+ $timespanWarning.find(warnings[i]).show();
+ }
+ $timespanWarning.find('.lecture-range').text(slxMoment.unix($sel.data('from'))
+ .format('LLL') + ' – ' + slxMoment.unix($sel.data('to')).format('LLL'));
+ $timespanWarning.show();
+ })();
+ showHeading();
+ };
+ var updateLocationsInfo = function() {
+ (function() {
+ var selectedLocs = $locations.val();
+ var lecLocs = $('#lecturelist option:selected').data('locations');
+ if (!lecLocs || lecLocs.length === 0 || !selectedLocs) {
+ $locationWarning.hide();
+ return;
+ }
+ lecLocs = lecLocs.split(',');
+ if (!$.isArray(selectedLocs)) {
+ selectedLocs = [selectedLocs];
+ }
+ 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());
+ $locationWarning.show();
+ return;
+ }
+ }
+ $locationWarning.hide();
+ })();
+ showHeading();
};
- var updateLectureInfo = function() {
- var sel = $('#lecturelist option:selected');
- if (sel.val() === '' || sel.data('inrange')) {
- $('#lecture-info').text('-');
+ $('#saveButton').click(function () {
+ if ($('#locations option:selected').length === 0 && $('#locations option').length > 1) {
+ $("#confirmGlobalModal").modal();
} else {
- $('#lecture-info').text('{{lang_lectureOutOfRange}} (' + slxMoment.unix(sel.data('from')).format('YYYY-MM-DD H:mm') + ' - ' + slxMoment.unix(sel.data('to')).format('YYYY-MM-DD H:mm') + ')');
+ $('#tolleform').submit();
+ }
+ });
+
+ var $sanity = $('#sanity-check');
+ var showHeading = function() {
+ if ($locationWarning.is(':visible') || $timespanWarning.is(':visible')) {
+ $sanity.show();
+ } else {
+ $sanity.hide();
}
};
+ startEndChanged();
+ updateLocationsInfo();
start_date.change(startEndChanged);
start_time.change(startEndChanged);
end_date.change(startEndChanged);
end_time.change(startEndChanged);
- $('#lecturelist').change(updateLectureInfo);
+ $('#lecturelist').change(updateLectureInfo).change(updateLocationsInfo);
+ $locations.change(updateLocationsInfo);
$("#cancelButton").click(function () {
- window.location.replace("?do=exams");
+ window.history.back();
});
- startEndChanged();
-
}, false);
// --></script>