feat: quiz with user input

This commit is contained in:
Jannat Patel
2023-03-23 22:22:57 +05:30
parent 3b1b375d5b
commit 3150cf2510
6 changed files with 200 additions and 35 deletions

View File

@@ -2,6 +2,8 @@ frappe.ready(() => {
this.marked_as_complete = false;
this.quiz_submitted = false;
this.file_type;
this.answer = [];
this.is_correct = [];
let self = this;
localStorage.removeItem($("#quiz-title").data("name"));
@@ -16,6 +18,10 @@ frappe.ready(() => {
enable_check(e);
});
$(".possibility").keyup((e) => {
enable_check(e);
});
$(window).scroll(() => {
let self = this;
if (
@@ -37,6 +43,7 @@ frappe.ready(() => {
});
$("#next").click((e) => {
add_to_local_storage();
mark_active_question(e);
});
@@ -224,29 +231,56 @@ const check_answer = (e = undefined) => {
} else {
$("#next").removeClass("hide");
}
let [answer, is_correct] = parse_options();
add_to_local_storage(current_index, answer, is_correct);
parse_options();
};
const parse_options = () => {
let answer = [];
let is_correct = [];
let type = $(".active-question").data("type");
$(".active-question input").each((i, element) => {
let correct = parseInt($(element).attr("data-correct"));
if ($(element).prop("checked")) {
answer.push(decodeURIComponent($(element).val()));
correct && is_correct.push(1);
correct ? add_icon(element, "check") : add_icon(element, "wrong");
} else {
correct && is_correct.push(0);
correct
? add_icon(element, "minus-circle-green")
: add_icon(element, "minus-circle");
}
if (type == "Choices") {
$(".active-question input").each((i, element) => {
is_answer_correct(type, element);
});
} else {
is_answer_correct(type, $(".active-question textarea"));
}
};
const is_answer_correct = (type, element) => {
let answer = type == "Choices" ? decodeURIComponent($(element).val()) : "";
frappe.call({
async: false,
method: "lms.lms.doctype.lms_quiz.lms_quiz.check_answer",
args: {
question: $(".active-question").data("name"),
type: type,
answer: answer,
},
callback: (data) => {
type == "Choices"
? parse_choices(element, data.message)
: parse_possible_answers(e);
},
});
};
return [answer, is_correct];
const parse_choices = (element, correct) => {
if ($(element).prop("checked")) {
self.answer.push(decodeURIComponent($(element).val()));
correct && self.is_correct.push(1);
correct ? add_icon(element, "check") : add_icon(element, "wrong");
} else {
correct && self.is_correct.push(0);
correct
? add_icon(element, "minus-circle-green")
: add_icon(element, "minus-circle");
}
};
const parse_possible_answers = () => {
self.answer.push(decodeURIComponent($(element).val()));
correct ? self.is_correct.push(1) : self.is_correct.push(0);
};
const add_icon = (element, icon) => {
@@ -261,14 +295,15 @@ const add_icon = (element, icon) => {
//$(element).parent().empty().html(`<div class="option-text"><img class="mr-3" src="/assets/lms/icons/${icon}.svg"> ${label}</div>`);
};
const add_to_local_storage = (current_index, answer, is_correct) => {
const add_to_local_storage = () => {
let current_index = $(".active-question").attr("data-qt-index");
let quiz_name = $("#quiz-title").data("name");
let quiz_stored = JSON.parse(localStorage.getItem(quiz_name));
let quiz_obj = {
question_index: current_index,
answer: answer.join(),
is_correct: is_correct,
answer: self.answer.join(),
is_correct: self.is_correct,
};
quiz_stored ? quiz_stored.push(quiz_obj) : (quiz_stored = [quiz_obj]);