return window.innerWidth >= screen.width-3 && window.innerHeight >= screen.height-3;
};
-let V = new Vue({
+new Vue({
el: "#assessment",
data: {
assessment: assessment,
},
mounted: function() {
$(".modal").modal();
- if (assessment.mode != "secure")
- return;
- window.addEventListener("keydown", e => {
- // Ignore F12 (avoid accidental window resize due to devtools)
- // NOTE: in Chromium at least, fullscreen mode exit with F11 cannot be prevented.
- // Workaround: disable key at higher level. Possible xbindkey config:
- // "false"
- // m:0x10 + c:95
- // Mod2 + F11
- if (e.keyCode == 123)
- e.preventDefault();
- }, false);
+ if (assessment.mode != "open")
+ {
+ window.addEventListener("keydown", e => {
+ // Ignore F12 (avoid accidental window resize due to devtools)
+ // NOTE: in Chromium at least, fullscreen mode exit with F11 cannot be prevented.
+ // Workaround: disable key at higher level. Possible xbindkey config:
+ // "false"
+ // m:0x10 + c:95
+ // Mod2 + F11
+ if (e.keyCode == 123)
+ e.preventDefault();
+ }, false);
+ }
window.addEventListener("blur", () => {
- this.trySendCurrentAnswer();
- document.location.href= "/noblur";
+ if (!socket)
+ return;
+ if (assessment.mode == "secure")
+ {
+ this.trySendCurrentAnswer();
+ document.location.href= "/noblur";
+ }
+ else if (assessment.mode == "exam")
+ socket.emit(message.studentBlur, {number:this.student.number});
}, false);
+ if (assessment.mode == "exam")
+ {
+ window.addEventListener("focus", () => {
+ if (!socket)
+ return;
+ socket.emit(message.studentFocus, {number:this.student.number});
+ }, false);
+ }
window.addEventListener("resize", e => {
- this.trySendCurrentAnswer();
- document.location.href= "/fullscreen";
+ if (!socket)
+ return;
+ if (assessment.mode == "secure")
+ {
+ this.trySendCurrentAnswer();
+ document.location.href= "/fullscreen";
+ }
+ else if (assessment.mode == "exam")
+ {
+ if (checkWindowSize())
+ socket.emit(message.studentFullscreen, {number:this.student.number});
+ else
+ socket.emit(message.studentResize, {number:this.student.number});
+ }
}, false);
},
methods: {
$("#leftButton, #rightButton").hide();
if (assessment.time > 0)
{
+
+// TODO: distinguish total exam time AND question time
+
const deltaTime = !!paper ? Date.now() - paper.startTime : 0;
this.remainingTime = assessment.time * 60 - Math.round(deltaTime / 1000);
this.runTimer();
// Got password: students answers locked to this page until potential teacher
// action (power failure, computer down, ...)
}
- socket = io.connect("/" + assessment.name, {
+ socket = io.connect("/", {
query: "aid=" + assessment._id + "&number=" + this.student.number + "&password=" + this.student.password
});
socket.on(message.allAnswers, this.setAnswers);
}, 1000);
},
// stage 2
- sendAnswer: function() {
+ sendOneAnswer: function() {
const realIndex = this.answers.indices[this.answers.index];
let gotoNext = () => {
if (this.answers.index == assessment.questions.length - 1)
},
});
},
+ // TODO: I don't like that + sending should not be definitive in exam mode with display = all
+ sendAnswer: function() {
+ if (assessment.display == "one")
+ this.sendOneAnswer();
+ else
+ assessment.questions.forEach(this.sendOneAnswer);
+ },
// stage 2 --> 3 (or 4)
// from a message by statements component, or time over
endAssessment: function() {
{
this.stage = 4;
this.answers.showSolution = true;
+ this.answers.displayAll = true;
return;
}
$.ajax("/end/assessment", {
success: ret => {
if (!!ret.errmsg)
return this.showWarning(ret.errmsg);
- assessment.conclusion = ret.conclusion;
this.stage = 3;
delete this.student["password"]; //unable to send new answers now
- socket.disconnect();
- socket = null;
},
});
},
// stage 3 --> 4 (on socket message "feedback")
setAnswers: function(m) {
- for (let i=0; i<m.answers.length; i++)
- assessment.questions[i].answer = m.answers[i];
+ const answers = JSON.parse(m.answers);
+ for (let i=0; i<answers.length; i++)
+ assessment.questions[i].answer = answers[i];
this.answers.showSolution = true;
+ this.answers.displayAll = true;
this.stage = 4;
+ socket.disconnect();
+ socket = null;
},
},
});