return true;
// 3 is arbitrary, but a small tolerance is required (e.g. in Firefox)
return window.innerWidth >= screen.width-3 && window.innerHeight >= screen.height-3;
-};
+}
new Vue({
el: "#assessment",
},
mounted: function() {
$(".modal").modal();
- if (assessment.mode != "secure")
+ if (["exam","open"].includes(assessment.mode))
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);
window.addEventListener("blur", () => {
- this.trySendCurrentAnswer();
- document.location.href= "/noblur";
+ if (this.stage != 2)
+ return;
+ if (assessment.mode == "secure")
+ {
+ this.trySendCurrentAnswer();
+ document.location.href= "/noblur";
+ }
+ else //"watch" mode
+ socket.emit(message.studentBlur, {number:this.student.number});
}, false);
+ if (assessment.mode == "watch")
+ {
+ window.addEventListener("focus", () => {
+ if (this.stage != 2)
+ return;
+ socket.emit(message.studentFocus, {number:this.student.number});
+ }, false);
+ }
window.addEventListener("resize", e => {
- this.trySendCurrentAnswer();
- document.location.href= "/fullscreen";
+ if (this.stage != 2)
+ return;
+ if (assessment.mode == "secure")
+ {
+ this.trySendCurrentAnswer();
+ document.location.href = "/fullscreen";
+ }
+ else //"watch" mode
+ {
+ 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();
},
});
},
+
+
// stage 2
- runTimer: function() {
+ runGlobalTimer: function() {
if (assessment.time <= 0)
return;
let self = this;
}
}, 1000);
},
+ runQuestionTimer: function(idx) {
+ if (assessment.questions[idx].time <= 0)
+ return;
+ let self = this; //TODO: question remaining time
+ setInterval( function() {
+ self.remainingTime--;
+ if (self.remainingTime <= 0)
+ {
+ if (self.stage == 2)
+ self.endAssessment();
+ clearInterval(this);
+ }
+ }, 1000);
+ },
+
+//TODO: get question after sending answer
+
// stage 2
sendOneAnswer: function() {
const realIndex = this.answers.indices[this.answers.index];
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
},