start local storage of questions
This commit is contained in:
@@ -1012,4 +1012,38 @@ display: block
|
||||
.packet-list-title {
|
||||
text-transform: capitalize;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
|
||||
.lds-ripple {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
.lds-ripple div {
|
||||
position: absolute;
|
||||
border: 4px solid #4527A0;
|
||||
opacity: 1;
|
||||
border-radius: 50%;
|
||||
animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
||||
}
|
||||
.lds-ripple div:nth-child(2) {
|
||||
animation-delay: -0.5s;
|
||||
}
|
||||
@keyframes lds-ripple {
|
||||
0% {
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@@ -163,6 +163,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="question-loading" class="fullscreen-overlay">
|
||||
<div class="progress-block">
|
||||
<div class="lds-ripple"><div></div><div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="pause" class="fullscreen-overlay">
|
||||
</div>
|
||||
|
||||
@@ -128,6 +128,7 @@ export function getQuestion(url, question_number, question_total) {
|
||||
);
|
||||
}
|
||||
},
|
||||
error: (jqXHR, textStatus, errorThrown) => { console.log("error downlading", jqXHR, textStatus, errorThrown) },
|
||||
//success: function (data) {
|
||||
// strReturn = data;
|
||||
//},
|
||||
|
||||
+189
-151
@@ -23,7 +23,8 @@ window.packet_list = [];
|
||||
window.exams = [];
|
||||
|
||||
window.packet_name = null;
|
||||
window.questions = null;
|
||||
//window.questions = null;
|
||||
let questions = null;
|
||||
window.question_order = [];
|
||||
window.questions_correct = {};
|
||||
window.number_of_questions = null;
|
||||
@@ -36,7 +37,7 @@ window.score = 0;
|
||||
|
||||
window.allow_self_marking = true;
|
||||
|
||||
window.timer = null;
|
||||
let timer = null;
|
||||
|
||||
//window.dfile = null;
|
||||
|
||||
@@ -54,7 +55,7 @@ retrievePacketList();
|
||||
function retrievePacketList() {
|
||||
let url = "packets/";
|
||||
|
||||
console.log(window.config.exam_query_url);
|
||||
//console.log(window.config.exam_query_url);
|
||||
|
||||
if (window.config.exam_query_url != undefined) {
|
||||
url = window.config.exam_query_url;
|
||||
@@ -81,9 +82,9 @@ function retrievePacketList() {
|
||||
loadPacketList(data);
|
||||
}
|
||||
}).fail(function (jqXHR, textStatus, errorThrown) {
|
||||
console.log(jqXHR);
|
||||
console.log(textStatus);
|
||||
console.log(errorThrown);
|
||||
//console.log(jqXHR);
|
||||
//console.log(textStatus);
|
||||
//console.log(errorThrown);
|
||||
console.log("No packet list available");
|
||||
showLoginDialog();
|
||||
});
|
||||
@@ -98,7 +99,7 @@ function retrievePacketList() {
|
||||
* @param {JSON} data - json containing available exams
|
||||
*/
|
||||
async function loadExamList(data) {
|
||||
let sessions = await window.db.session.toArray().catch(function (error) {
|
||||
let sessions = await db.session.toArray().catch(function (error) {
|
||||
console.log("Error loading session", error);
|
||||
$("#database-error").text(
|
||||
"Error loading the database, schema has probably changed and needs updating. You will probably need to delete the local database."
|
||||
@@ -179,7 +180,7 @@ async function loadExamList(data) {
|
||||
* @param {JSON} data - json containing available packets
|
||||
*/
|
||||
async function loadPacketList(data) {
|
||||
let sessions = await window.db.session.toArray().catch(function (error) {
|
||||
let sessions = await db.session.toArray().catch(function (error) {
|
||||
console.log("Error loading session", error);
|
||||
$("#database-error").text(
|
||||
"Error loading the database, schema has probably changed and needs updating. You will probably need to delete the local database."
|
||||
@@ -244,7 +245,7 @@ async function loadPacketList(data) {
|
||||
$(
|
||||
`<div class='save-button' title='Download packet for offline use (or to save bandwidth)'><a href='packets/${packet}' download='${packet}'>💾</a></div>`
|
||||
).click(function (evt) {
|
||||
console.log("packets/" + packet);
|
||||
//console.log("packets/" + packet);
|
||||
evt.stopPropagation();
|
||||
})
|
||||
)
|
||||
@@ -258,7 +259,7 @@ async function loadPacketList(data) {
|
||||
* @param {string} path - relative path to the packet json file
|
||||
*/
|
||||
function loadPacketFromAjax(path) {
|
||||
console.log("loading packet from " + path);
|
||||
//console.log("loading packet from " + path);
|
||||
$("#progress").html(`Requesting packet: ${path}`);
|
||||
|
||||
$.ajax({
|
||||
@@ -278,13 +279,13 @@ function loadPacketFromAjax(path) {
|
||||
.done(function (data) {
|
||||
//setUpPacket(data, path.split("/").pop());
|
||||
if (data.hasOwnProperty("cached") && data["cached"]) {
|
||||
console.log("loading cached packet");
|
||||
//console.log("loading cached packet");
|
||||
}
|
||||
setUpPacket(data, path);
|
||||
$("#options-panel").hide();
|
||||
})
|
||||
.fail(function () {
|
||||
console.log("Unable to load packet at: " + path);
|
||||
//console.log("Unable to load packet at: " + path);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -292,19 +293,31 @@ function loadPacketFromAjax(path) {
|
||||
* Build the currently loaded quiz
|
||||
*/
|
||||
function setUpQuestions(load_previous) {
|
||||
if (window.questions == undefined) {
|
||||
if (questions == undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
Object.keys(questions).forEach(function (e) {
|
||||
// Store question data into dexie
|
||||
let d = {
|
||||
eid: window.exam_details.eid,
|
||||
qid: e,
|
||||
data: questions[e],
|
||||
};
|
||||
|
||||
question_db.question_data.put(d);
|
||||
});
|
||||
|
||||
// Set an order for the questions
|
||||
if (!load_previous) {
|
||||
if (window.question_order.length < 1) {
|
||||
window.question_order = [];
|
||||
Object.keys(window.questions).forEach(function (e) {
|
||||
Object.keys(questions).forEach(function (e) {
|
||||
window.question_order.push(e);
|
||||
|
||||
// Make sure answers are arrays
|
||||
if (!Array.isArray(window.questions[e]["answers"])) {
|
||||
window.questions[e]["answers"] = [window.questions[e]["answers"]];
|
||||
if (!Array.isArray(questions[e]["answers"])) {
|
||||
questions[e]["answers"] = [questions[e]["answers"]];
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -317,13 +330,13 @@ function setUpQuestions(load_previous) {
|
||||
window.question_order = helper.shuffleArray(window.question_order);
|
||||
}
|
||||
}
|
||||
window.number_of_questions = Object.keys(window.questions).length;
|
||||
window.number_of_questions = Object.keys(questions).length;
|
||||
window.review = false;
|
||||
|
||||
// Horrible way to get type of questions
|
||||
// We assume they are all of the same type....
|
||||
window.question_type =
|
||||
window.questions[Object.keys(window.questions)[0]].type;
|
||||
questions[Object.keys(questions)[0]].type;
|
||||
|
||||
if (window.exam_details.exam_mode) {
|
||||
$("#options-button, #review-overlay-button").hide();
|
||||
@@ -331,10 +344,10 @@ function setUpQuestions(load_previous) {
|
||||
$("#submit-button").hide();
|
||||
}
|
||||
|
||||
loadQuestion(0, 1, true);
|
||||
createQuestionListPanel();
|
||||
questions = null;
|
||||
|
||||
console.log(window.question_type);
|
||||
|
||||
//console.log(window.question_type);
|
||||
|
||||
// exam_time can be defined in packets
|
||||
if (!load_previous && window.exam_time == null) {
|
||||
@@ -374,8 +387,13 @@ function setUpQuestions(load_previous) {
|
||||
} else {
|
||||
$("#start-dialog").modal();
|
||||
}
|
||||
|
||||
loadQuestion(0, 1, true);
|
||||
createQuestionListPanel();
|
||||
}
|
||||
|
||||
cornerstone.imageCache.setMaximumSizeBytes(5128800);
|
||||
|
||||
// Set up cornerstone (the dicom viewer)
|
||||
cornerstoneBase64ImageLoader.external.cornerstone = cornerstone;
|
||||
cornerstoneWebImageLoader.external.cornerstone = cornerstone;
|
||||
@@ -388,8 +406,6 @@ cornerstoneWebImageLoader.external.cornerstone = cornerstone;
|
||||
|
||||
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
|
||||
|
||||
cornerstone.imageCache.setMaximumSizeBytes(22428800);
|
||||
|
||||
// cornerstoneWADOImageLoader.configure({
|
||||
// beforeSend: function(xhr) {
|
||||
// // Add custom headers here (e.g. auth tokens)
|
||||
@@ -409,7 +425,12 @@ db.version(1).stores({
|
||||
"[packet+aid], packet, aid, status, date, score, max_score, exam_time, time_left, question_order, questions_answered, total_questions",
|
||||
});
|
||||
|
||||
window.db = db;
|
||||
const question_db = new Dexie("question_database");
|
||||
question_db.version(1).stores({
|
||||
question_data: "[eid+qid], eid, data",
|
||||
});
|
||||
|
||||
//db = db;
|
||||
|
||||
/**
|
||||
* Parse the packet and extract metadata (if it exists)
|
||||
@@ -438,9 +459,9 @@ function setUpPacket(data, path) {
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("questions")) {
|
||||
window.questions = data.questions;
|
||||
questions = data.questions;
|
||||
} else {
|
||||
window.questions = data;
|
||||
questions = data;
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("exam_order")) {
|
||||
@@ -465,13 +486,13 @@ function setUpPacket(data, path) {
|
||||
const question_url = `${path}/${n}`;
|
||||
question_number++;
|
||||
|
||||
console.log("Creating ", question_url, question_number, question_total);
|
||||
//console.log("Creating ", question_url, question_number, question_total);
|
||||
//$("#progress").html(`Downloading [${question_number}/${question_total}]`);
|
||||
let question_json = {};
|
||||
question_json = await interact
|
||||
.getQuestion(question_url, question_number, question_total)
|
||||
.fail((jqXHR, textStatus, errorThrown) => {
|
||||
console.log(jqXHR, textStatus, errorThrown);
|
||||
//console.log(jqXHR, textStatus, errorThrown);
|
||||
console.log("error loading question");
|
||||
data["questions"][n] = {};
|
||||
});
|
||||
@@ -500,9 +521,9 @@ function setUpPacket(data, path) {
|
||||
}
|
||||
|
||||
function loadSession() {
|
||||
console.log("load session");
|
||||
//console.log("load session");
|
||||
// Either continue session or create a new one
|
||||
window.db.session
|
||||
db.session
|
||||
// .where("status")
|
||||
// .equals("active")
|
||||
.where("[packet+aid]")
|
||||
@@ -512,7 +533,7 @@ function loadSession() {
|
||||
)
|
||||
.toArray()
|
||||
.then((sessions) => {
|
||||
console.log("sessions", sessions);
|
||||
//console.log("sessions", sessions);
|
||||
|
||||
// let active_sessions = [];
|
||||
|
||||
@@ -533,7 +554,7 @@ function loadSession() {
|
||||
if (window.exam_details.exam_mode) {
|
||||
text = "Session will be continued";
|
||||
}
|
||||
console.log(sessions.date);
|
||||
//console.log(sessions.date);
|
||||
|
||||
for (let i = 0; i < sessions.length; i++) {
|
||||
let d = new Date(sessions[i].date);
|
||||
@@ -588,7 +609,7 @@ function loadSession() {
|
||||
// If cancel is pressed or input is blank
|
||||
window.exam_details.aid = uuidv4();
|
||||
window.date_started = Date.now();
|
||||
console.log("new date", window.date_started);
|
||||
//console.log("new date", window.date_started);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -602,18 +623,27 @@ function loadSession() {
|
||||
* @param {number} section - Question section to focus
|
||||
* @param {boolean} force_reload - Force question to be reloaded if already loaded
|
||||
*/
|
||||
function loadQuestion(n, section = 1, force_reload = false) {
|
||||
async function loadQuestion(n, section = 1, force_reload = false) {
|
||||
|
||||
$("#question-loading").show();
|
||||
const aid = window.exam_details.aid;
|
||||
const cid = window.exam_details.cid;
|
||||
const eid = window.exam_details.eid;
|
||||
|
||||
|
||||
// Make sure we have an integer
|
||||
n = parseInt(n);
|
||||
console.log("loading question (n)", n);
|
||||
//console.log("loading question (n)", n);
|
||||
|
||||
const qid = window.question_order[n];
|
||||
console.log("qid", qid);
|
||||
const current_question = window.questions[qid];
|
||||
|
||||
let q = {qid: qid.toString(), eid: eid};
|
||||
|
||||
let return_data = await question_db.question_data.get(q);
|
||||
const question_data = return_data.data;
|
||||
return_data = null;
|
||||
|
||||
//const current_question = window.questions[qid];
|
||||
|
||||
if (n == window.loaded_question && force_reload == false) {
|
||||
// Question already loaded
|
||||
@@ -648,32 +678,33 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
|
||||
const display_n = n + 1;
|
||||
|
||||
if (current_question.title) {
|
||||
if (question_data.title) {
|
||||
$(".question .title").get(0).innerHTML =
|
||||
'<span style="font-weight:700;">' +
|
||||
display_n +
|
||||
"</span> " +
|
||||
current_question.title;
|
||||
question_data.title;
|
||||
} else {
|
||||
$(".question .title").get(0).innerHTML =
|
||||
'<span style="font-weight:700;">' + display_n + "</span>";
|
||||
}
|
||||
|
||||
// Close any open figures
|
||||
let el = document.getElementById("dicom-image");
|
||||
if (el != undefined) {
|
||||
cornerstone.disable(el);
|
||||
$(".canvas-panel").remove();
|
||||
}
|
||||
//let el = document.getElementById("dicom-image");
|
||||
//if (el != undefined) {
|
||||
// cornerstone.disable(el);
|
||||
//}
|
||||
|
||||
// disable any further enabled elements
|
||||
let enabled_elements = cornerstone.getEnabledElements();
|
||||
for (var i = enabled_elements.length - 1; i >= 0; i--) {
|
||||
console.log("disable, ", enabled_elements[i]);
|
||||
//console.log("disable, ", enabled_elements[i]);
|
||||
cornerstone.disable(enabled_elements[i].element);
|
||||
}
|
||||
$(".canvas-panel").remove();
|
||||
|
||||
cornerstone.imageCache.purgeCache();
|
||||
cornerstoneWADOImageLoader.default.wadouri.dataSetCacheManager.purge();
|
||||
|
||||
// Remove feedback images
|
||||
$(".feedback-image").remove();
|
||||
@@ -681,86 +712,94 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
// Set up thumbnails
|
||||
const thumbnails = $(".thumbs");
|
||||
// Why are we checking this?
|
||||
if (thumbnails) {
|
||||
thumbnails.empty();
|
||||
thumbnails.empty();
|
||||
|
||||
// TODO: figure captions (need to extend base json)
|
||||
// TODO: figure captions (need to extend base json)
|
||||
function createThumbnail(image, id, caption, thumbnails) {
|
||||
//console.log("create thumb", image);
|
||||
// For thumbnails we only want a single image
|
||||
|
||||
current_question.images.forEach(function createThumbnail(image, id) {
|
||||
//console.log("create thumb", image);
|
||||
// For thumbnails we only want a single image
|
||||
if (Array.isArray(image)) {
|
||||
image = image[0]; // Do we want the middle image?
|
||||
}
|
||||
thumbnails.append(
|
||||
`<div class="figure" id="figure-${id}"><div class="figcaption">${caption}</div></div>`
|
||||
);
|
||||
|
||||
let caption = "...";
|
||||
if (current_question.image_titles != undefined) {
|
||||
caption = current_question.image_titles[id];
|
||||
}
|
||||
// const thumbnail = $(".figure .thumbnail").get(id);
|
||||
// cornerstone.enable(thumbnail)
|
||||
// based_img = current_question.images[id];
|
||||
const based_img = image;
|
||||
|
||||
thumbnails.append(
|
||||
`<div class="figure" id="figure-${id}"><div class="figcaption">${caption}</div></div>`
|
||||
);
|
||||
// based (image) data url, just load the image directly
|
||||
if (based_img.startsWith("data:image/")) {
|
||||
const img = $("<img />", {
|
||||
src: based_img,
|
||||
id: "thumb-" + id,
|
||||
class: "thumbnail",
|
||||
title: "Click on the thumbnail to view and manipulate the image.",
|
||||
draggable: "false",
|
||||
style: "height: 100px;",
|
||||
});
|
||||
|
||||
// const thumbnail = $(".figure .thumbnail").get(id);
|
||||
// cornerstone.enable(thumbnail)
|
||||
// based_img = current_question.images[id];
|
||||
const based_img = image;
|
||||
$("#figure-" + id).append(img);
|
||||
|
||||
// based (image) data url, just load the image directly
|
||||
if (based_img.startsWith("data:image/")) {
|
||||
const img = $("<img />", {
|
||||
src: based_img,
|
||||
id: "thumb-" + id,
|
||||
class: "thumbnail",
|
||||
title: "Click on the thumbnail to view and manipulate the image.",
|
||||
draggable: "false",
|
||||
style: "height: 100px;",
|
||||
// otherwise try to load it as a dicom
|
||||
} else {
|
||||
// convert the data url to a file
|
||||
viewer
|
||||
.urltoFile(based_img, "dicom", "application/dicom")
|
||||
.then(function (dfile) {
|
||||
// load the file using cornerstoneWADO file loader
|
||||
const imageId = cornerstoneWADOImageLoader.wadouri.fileManager.add(
|
||||
dfile
|
||||
);
|
||||
const img = $("<div></div>").get(0);
|
||||
img.id = "thumb-" + id;
|
||||
img.class = "thumbnail";
|
||||
img.title =
|
||||
//"Click on the thumbnail to view and manipulate the image.";
|
||||
img.draggable = "false";
|
||||
img.style = "height: 100px; width: 100px";
|
||||
$("#figure-" + id).append(img);
|
||||
const element = document.getElementById("thumb-" + id);
|
||||
cornerstone.enable(element);
|
||||
//cornerstone.loadImage(imageId).then(function (image) {
|
||||
cornerstone.loadAndCacheImage(imageId).then(function (image) {
|
||||
cornerstone.displayImage(element, image);
|
||||
cornerstone.resize(element);
|
||||
}); // .catch( function(error) {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$("#figure-" + id).append(img);
|
||||
question_data.images.forEach((images, n) => {
|
||||
let image;
|
||||
if (Array.isArray(images)) {
|
||||
image = images[0]; // Do we want the middle image?
|
||||
} else {
|
||||
image = images;
|
||||
}
|
||||
let caption = "...";
|
||||
if (question_data.image_titles != undefined) {
|
||||
caption = question_data.image_titles[n];
|
||||
}
|
||||
|
||||
// otherwise try to load it as a dicom
|
||||
} else {
|
||||
// convert the data url to a file
|
||||
viewer
|
||||
.urltoFile(based_img, "dicom", "application/dicom")
|
||||
.then(function (dfile) {
|
||||
// load the file using cornerstoneWADO file loader
|
||||
const imageId = cornerstoneWADOImageLoader.wadouri.fileManager.add(
|
||||
dfile
|
||||
);
|
||||
cornerstone.loadAndCacheImage(imageId).then(function (image) {
|
||||
const img = $("<div></div>").get(0);
|
||||
img.id = "thumb-" + id;
|
||||
img.class = "thumbnail";
|
||||
img.title =
|
||||
"Click on the thumbnail to view and manipulate the image.";
|
||||
img.draggable = "false";
|
||||
img.style = "height: 100px; width: 100px";
|
||||
$("#figure-" + id).append(img);
|
||||
createThumbnail(image, n, caption, thumbnails);
|
||||
});
|
||||
|
||||
const element = document.getElementById("thumb-" + id);
|
||||
cornerstone.enable(element);
|
||||
cornerstone.displayImage(element, image);
|
||||
cornerstone.resize(element);
|
||||
}); // .catch( function(error) {
|
||||
});
|
||||
}
|
||||
function handleThumbnailClicks(id, thumbnail) {
|
||||
$(thumbnail).click(function (event) {
|
||||
viewer.openMainImage(question_data, event, this);
|
||||
});
|
||||
}
|
||||
|
||||
$(".thumbs .figure").each(function handleThumbnailClicks(id, thumbnail) {
|
||||
thumbnail.onclick = function (event) {
|
||||
viewer.openMainImage(current_question, event, this);
|
||||
};
|
||||
$(".thumbs .figure").each((id, thumbnail) => {
|
||||
handleThumbnailClicks(id, thumbnail);
|
||||
});
|
||||
|
||||
// Answer setup
|
||||
const ap = $(".answer-panel");
|
||||
ap.empty();
|
||||
|
||||
switch (current_question.type) {
|
||||
switch (question_data.type) {
|
||||
case "rapid": {
|
||||
ap.append(
|
||||
'<div class="answer-item"><div class="answer-label-outer"><p class="answer-label-inner"><span class="answer-label-number">' +
|
||||
@@ -793,7 +832,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
ans: evt.target.value,
|
||||
};
|
||||
|
||||
window.db.answers.put(answer);
|
||||
db.answers.put(answer);
|
||||
saveSession();
|
||||
updateQuestionListPanel(answer);
|
||||
});
|
||||
@@ -802,7 +841,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
$(".long-answer").change(function (evt) {
|
||||
// ignore blank text and delete any stored value
|
||||
if (evt.target.value.length < 1) {
|
||||
window.db.answers.delete([aid, cid, eid, qid, "2"]);
|
||||
db.answers.delete([aid, cid, eid, qid, "2"]);
|
||||
$(
|
||||
"#question-list-item-" + window.question_order.indexOf(qid) + "-2"
|
||||
).removeClass("question-saved-localdb");
|
||||
@@ -818,7 +857,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
ans: evt.target.value,
|
||||
};
|
||||
// db.answers.put({aid: [cid, eid, qidn], ans: evt.target.value});
|
||||
window.db.answers.put(answer);
|
||||
db.answers.put(answer);
|
||||
|
||||
$(
|
||||
"#question-list-item-" + window.question_order.indexOf(qid) + "-2"
|
||||
@@ -831,7 +870,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
// We chain our db requests as we can only check answers once
|
||||
// they have been loaded (should probably use then or after)
|
||||
|
||||
window.db.answers
|
||||
db.answers
|
||||
.get({ aid: aid, cid: cid, eid: eid, qid: qid, qidn: "1" })
|
||||
.then(function (answer) {
|
||||
if (answer != undefined) {
|
||||
@@ -851,14 +890,13 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
console.log("error-", error);
|
||||
})
|
||||
.then(
|
||||
window.db.answers
|
||||
db.answers
|
||||
.get({ aid: aid, cid: cid, eid: eid, qid: qid, qidn: "2" })
|
||||
.then(function (answer) {
|
||||
if (answer != undefined) {
|
||||
console.log(answer);
|
||||
$(".long-answer").text(answer.ans);
|
||||
}
|
||||
markAnswer(qid, current_question);
|
||||
markAnswer(qid, question_data);
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.log("error-", error);
|
||||
@@ -876,7 +914,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
'<div class="answer-item" id="anatomy-text"><div class="answer-label-outer"><p class="answer-label-inner"><span class="answer-label-number">' +
|
||||
display_n +
|
||||
'.1</span><span style="flex:1">' +
|
||||
current_question.question +
|
||||
question_data.question +
|
||||
'</span><button class="flag" data-qid="' +
|
||||
n +
|
||||
'" data-qidn=1 style="margin-right:0">⚐</button></p></div><textarea class="long-answer" name="Reason" data-answer-section-qidn=1 style="overflow: hidden scroll; overflow-wrap: break-word;"></textarea></div>'
|
||||
@@ -885,7 +923,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
$(".long-answer").change(function (evt) {
|
||||
// ignore blank text and delete any stored value
|
||||
if (evt.target.value.length < 1) {
|
||||
window.db.answers.delete([aid, cid, eid, qid, "1"]);
|
||||
db.answers.delete([aid, cid, eid, qid, "1"]);
|
||||
$(
|
||||
"#question-list-item-" + window.question_order.indexOf(qid) + "-1"
|
||||
).removeClass("question-saved-localdb");
|
||||
@@ -901,7 +939,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
ans: evt.target.value,
|
||||
};
|
||||
// db.answers.put({aid: [cid, eid, qidn], ans: evt.target.value});
|
||||
window.db.answers.put(answer);
|
||||
db.answers.put(answer);
|
||||
|
||||
$(
|
||||
"#question-list-item-" + window.question_order.indexOf(qid) + "-1"
|
||||
@@ -910,13 +948,13 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
updateQuestionListPanel(answer);
|
||||
});
|
||||
|
||||
window.db.answers
|
||||
db.answers
|
||||
.get({ aid: aid, cid: cid, eid: eid, qid: qid, qidn: "1" })
|
||||
.then(function (answer) {
|
||||
if (answer != undefined) {
|
||||
$(".long-answer").text(answer.ans);
|
||||
}
|
||||
markAnswer(qid, current_question);
|
||||
markAnswer(qid, question_data);
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.log(error);
|
||||
@@ -971,7 +1009,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
|
||||
// ignore blank text and delete any stored value
|
||||
if (evt.target.value.length < 1) {
|
||||
window.db.answers.delete([aid, cid, eid, qid, qidn]);
|
||||
db.answers.delete([aid, cid, eid, qid, qidn]);
|
||||
$(
|
||||
"#question-list-item-" +
|
||||
window.question_order.indexOf(qid) +
|
||||
@@ -990,7 +1028,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
ans: evt.target.value,
|
||||
};
|
||||
|
||||
window.db.answers.put(answer);
|
||||
db.answers.put(answer);
|
||||
console.log("SAVE", qid, qidn, evt.target.value);
|
||||
|
||||
$(
|
||||
@@ -1008,7 +1046,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
//
|
||||
|
||||
for (let qidn_count = 1; qidn_count < 6; qidn_count++) {
|
||||
window.db.answers
|
||||
db.answers
|
||||
.get({
|
||||
aid: aid,
|
||||
cid: cid,
|
||||
@@ -1024,7 +1062,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
}
|
||||
// We only want to mark once...
|
||||
if (qidn_count == 5) {
|
||||
markAnswer(qid, current_question);
|
||||
markAnswer(qid, question_data);
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
@@ -1046,6 +1084,7 @@ function loadQuestion(n, section = 1, force_reload = false) {
|
||||
//rebuildQuestionListPanel();
|
||||
setTimeout(() => {
|
||||
setFocus(section);
|
||||
$("#question-loading").hide();
|
||||
}, 200);
|
||||
}
|
||||
|
||||
@@ -1129,8 +1168,8 @@ function rebuildQuestionListPanel() {
|
||||
const cid = window.exam_details.cid;
|
||||
const eid = window.exam_details.eid;
|
||||
|
||||
console.log("UP");
|
||||
window.db.answers
|
||||
//console.log("UP");
|
||||
db.answers
|
||||
.where({ aid: aid, cid: cid, eid: eid })
|
||||
.toArray()
|
||||
.then(function (answers) {
|
||||
@@ -1149,7 +1188,7 @@ function rebuildQuestionListPanel() {
|
||||
console.log("error - ", error);
|
||||
});
|
||||
|
||||
window.db.flags
|
||||
db.flags
|
||||
.where({ aid: aid, cid: cid, eid: eid })
|
||||
.toArray()
|
||||
.then(function (answers) {
|
||||
@@ -1348,8 +1387,8 @@ function loadLocalQuestionSet() {
|
||||
*/
|
||||
function reviewQuestions() {
|
||||
// Stop timer (if it's running)
|
||||
if (window.timer != null) {
|
||||
window.timer.stop();
|
||||
if (timer != null) {
|
||||
timer.stop();
|
||||
}
|
||||
|
||||
const cid = window.exam_details.cid;
|
||||
@@ -1362,7 +1401,7 @@ function reviewQuestions() {
|
||||
|
||||
loadQuestion(0, 0, true);
|
||||
|
||||
window.db.answers
|
||||
db.answers
|
||||
.where({ aid: aid, cid: cid, eid: eid })
|
||||
.toArray()
|
||||
.then(function (answers) {
|
||||
@@ -1424,7 +1463,7 @@ function reviewQuestions() {
|
||||
|
||||
titles.forEach((title, n) => {
|
||||
let user_answer = current_answers[`${qid},${n + 1}`];
|
||||
console.log(`${qid},${n}`, user_answer);
|
||||
//console.log(`${qid},${n}`, user_answer);
|
||||
if (user_answer == undefined) {
|
||||
user_answer = "Not answered";
|
||||
}
|
||||
@@ -1458,7 +1497,7 @@ function reviewQuestions() {
|
||||
$("#review-overlay").hide();
|
||||
});
|
||||
|
||||
window.db.user_answers
|
||||
db.user_answers
|
||||
.get({ qid: qid })
|
||||
.then(function (answers) {
|
||||
// Merge the question answers with the user saved answers
|
||||
@@ -1707,7 +1746,7 @@ function markAnswer(qid, current_question) {
|
||||
let user_answer = textarea.val();
|
||||
|
||||
// Load user saved answers
|
||||
window.db.user_answers
|
||||
db.user_answers
|
||||
.get({ qid: qid })
|
||||
.then(function (saved_user_answers) {
|
||||
// check if given answer matches a user saved answer
|
||||
@@ -1788,7 +1827,7 @@ function markCorrect(qid, user_answer) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.db.user_answers
|
||||
db.user_answers
|
||||
.get({ qid: qid })
|
||||
.then(function (answers) {
|
||||
let new_answers = [];
|
||||
@@ -1797,7 +1836,7 @@ function markCorrect(qid, user_answer) {
|
||||
}
|
||||
|
||||
new_answers.push(user_answer);
|
||||
window.db.user_answers.put({ qid: qid, ans: new_answers });
|
||||
db.user_answers.put({ qid: qid, ans: new_answers });
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.log("error-", error);
|
||||
@@ -1845,14 +1884,14 @@ function addFlagEvents() {
|
||||
"visibility",
|
||||
"hidden"
|
||||
);
|
||||
window.db.flags.delete([aid, cid, eid, qid, qidn]);
|
||||
db.flags.delete([aid, cid, eid, qid, qidn]);
|
||||
deleteQuestionListPanelFlags(flag_db_data);
|
||||
} else {
|
||||
$("#question-list-item-" + nqid + "-" + qidn + " span").css(
|
||||
"visibility",
|
||||
"visible"
|
||||
);
|
||||
window.db.flags.put(flag_db_data);
|
||||
db.flags.put(flag_db_data);
|
||||
updateQuestionListPanelFlags(flag_db_data);
|
||||
}
|
||||
});
|
||||
@@ -1863,7 +1902,7 @@ function loadFlagsFromDb(qid, n) {
|
||||
const aid = window.exam_details.aid;
|
||||
const cid = window.exam_details.cid;
|
||||
const eid = window.exam_details.eid;
|
||||
window.db.flags
|
||||
db.flags
|
||||
.get({ aid: aid, cid: cid, eid: eid, qid: qid, qidn: n })
|
||||
.then(function (answer) {
|
||||
if (answer != undefined) {
|
||||
@@ -1894,12 +1933,12 @@ $(".start-packet-button").click(function (evt) {
|
||||
}
|
||||
}
|
||||
|
||||
if (window.timer != null) {
|
||||
window.timer.stop();
|
||||
if (timer != null) {
|
||||
timer.stop();
|
||||
}
|
||||
window.timer = null;
|
||||
timer = null;
|
||||
|
||||
let timer = new easytimer.Timer();
|
||||
timer = new easytimer.Timer();
|
||||
//window.exam_time = 2;
|
||||
timer.start({ countdown: true, startValues: { seconds: window.exam_time } });
|
||||
timer.addEventListener("secondsUpdated", function (e) {
|
||||
@@ -1917,14 +1956,14 @@ $(".start-packet-button").click(function (evt) {
|
||||
$("#time-up-dialog").modal();
|
||||
});
|
||||
|
||||
window.timer = timer;
|
||||
//window.timer = timer;
|
||||
|
||||
// If we are not in an exam we can pause the session
|
||||
if (!window.exam_mode) {
|
||||
$("#timer").click(() => {
|
||||
window.timer.pause();
|
||||
timer.pause();
|
||||
|
||||
let time_remaining = window.timer.getTimeValues().toString();
|
||||
let time_remaining = timer.getTimeValues().toString();
|
||||
|
||||
$("#pause").empty();
|
||||
$("#pause").append(
|
||||
@@ -1970,8 +2009,7 @@ $("#btn-delete-databases").click(function (evt) {
|
||||
"This will delete ALL saved answers (including saved correct answers)!"
|
||||
);
|
||||
if (r == true) {
|
||||
window.db
|
||||
.delete()
|
||||
db.delete()
|
||||
.then(() => {
|
||||
$.notify("Database successfully deleted", "success");
|
||||
$.notify("The page will now reload", "warn");
|
||||
@@ -1997,7 +2035,7 @@ $("#btn-delete-current").click(function (evt) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.db.flags
|
||||
db.flags
|
||||
.where("qid")
|
||||
.anyOf(window.question_order)
|
||||
.delete()
|
||||
@@ -2009,7 +2047,7 @@ $("#btn-delete-current").click(function (evt) {
|
||||
$.notify("You may have to delete all answers this time", "info");
|
||||
});
|
||||
|
||||
window.db.answers
|
||||
db.answers
|
||||
.where("qid")
|
||||
.anyOf(window.question_order)
|
||||
.delete()
|
||||
@@ -2035,7 +2073,7 @@ $("#btn-delete-current-saved-answers").click(function (evt) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.db.user_answers
|
||||
db.user_answers
|
||||
.where("qid")
|
||||
.anyOf(window.question_order)
|
||||
.delete()
|
||||
@@ -2062,14 +2100,14 @@ function saveSession() {
|
||||
status = "complete";
|
||||
}
|
||||
|
||||
console.log("save session", window.score);
|
||||
//console.log("save session", window.score);
|
||||
|
||||
let time_values = window.timer.getTimeValues();
|
||||
let time_values = timer.getTimeValues();
|
||||
let time_remaining =
|
||||
time_values.hours * 60 * 60 +
|
||||
time_values.minutes * 60 +
|
||||
time_values.seconds;
|
||||
window.db.session.put({
|
||||
db.session.put({
|
||||
packet: window.packet_name,
|
||||
aid: window.exam_details.aid,
|
||||
cid: window.exam_details.cid,
|
||||
|
||||
+1
-1
@@ -357,7 +357,7 @@ export function changeControlSelection() {
|
||||
* @param {*} event - KeyEvent
|
||||
*/
|
||||
export function keydown_handler(event) {
|
||||
console.log(event);
|
||||
//console.log(event);
|
||||
const target_element = event.target.tagName;
|
||||
|
||||
// Cancel if no active element
|
||||
|
||||
Reference in New Issue
Block a user