Files
lms/lms/www/batch/learn.js
2023-06-21 20:11:30 +05:30

252 lines
6.2 KiB
JavaScript

frappe.ready(() => {
this.marked_as_complete = false;
let self = this;
frappe.telemetry.capture("on_lesson_page", "lms");
fetch_assignments();
save_current_lesson();
$(window).scroll(() => {
let self = this;
if (
!$("#status-indicator").length &&
!self.marked_as_complete &&
$(".title").hasClass("is-member")
) {
self.marked_as_complete = true;
mark_progress();
}
});
$("#certification").click((e) => {
create_certificate(e);
});
$(".submit-work").click((e) => {
attach_work(e);
});
$(".clear-work").click((e) => {
clear_work(e);
});
$(".btn-back").click((e) => {
window.location.href = window.location.href.split("?")[0];
});
$(document).on("click", ".copy-link", (e) => {
frappe.utils.copy_to_clipboard($(e.currentTarget).data("link"));
$(".attachments").collapse("hide");
});
});
const save_current_lesson = () => {
if ($(".title").hasClass("is-member")) {
frappe.call("lms.lms.api.save_current_lesson", {
course_name: $(".title").attr("data-course"),
lesson_name: $(".title").attr("data-lesson"),
});
}
};
const mark_progress = () => {
let status = "Complete";
frappe.call({
method: "lms.lms.doctype.course_lesson.course_lesson.save_progress",
args: {
lesson: $(".title").attr("data-lesson"),
course: $(".title").attr("data-course"),
status: status,
},
callback: (data) => {
change_progress_indicators();
show_certificate_if_course_completed(data);
},
});
};
const change_progress_indicators = () => {
$(".active-lesson .lesson-progress-tick").removeClass("hide");
};
const show_certificate_if_course_completed = (data) => {
if (
data.message == 100 &&
!$(".next").length &&
$("#certification").hasClass("hide")
) {
$("#certification").removeClass("hide");
}
};
const create_certificate = (e) => {
e.preventDefault();
course = $(".title").attr("data-course");
frappe.call({
method: "lms.lms.doctype.lms_certificate.lms_certificate.create_certificate",
args: {
course: course,
},
callback: (data) => {
window.location.href = `/courses/${course}/${data.message.name}`;
},
});
};
const attach_work = (e) => {
const target = $(e.currentTarget);
let files = target.siblings(".attach-file").prop("files");
if (files && files.length) {
files = add_files(files);
return_as_dataurl(files);
files.map((file) => {
upload_file(file, target);
});
}
};
const upload_file = (file, target) => {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status === 200) {
let response = JSON.parse(xhr.responseText);
create_lesson_work(response.message, target);
} else if (xhr.status === 403) {
let response = JSON.parse(xhr.responseText);
frappe.msgprint(
`Not permitted. ${response._error_message || ""}`
);
} else if (xhr.status === 413) {
frappe.msgprint(
__("Size exceeds the maximum allowed file size.")
);
} else {
frappe.msgprint(
xhr.status === 0
? "XMLHttpRequest Error"
: `${xhr.status} : ${xhr.statusText}`
);
}
}
};
xhr.open("POST", "/api/method/upload_file", true);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("X-Frappe-CSRF-Token", frappe.csrf_token);
let form_data = new FormData();
if (file.file_obj) {
form_data.append("file", file.file_obj, file.name);
}
xhr.send(form_data);
});
};
const create_lesson_work = (file, target) => {
frappe.call({
method: "lms.lms.doctype.lms_assignment_submission.lms_assignment_submission.upload_assignment",
args: {
assignment_attachment: file.file_url,
lesson: $(".title").attr("data-lesson"),
submission: $(".preview-work").data("submission") || "",
},
callback: (data) => {
target.siblings(".attach-file").addClass("hide");
target.siblings(".preview-work").removeClass("hide");
target
.siblings(".preview-work")
.find("a")
.attr("href", file.file_url)
.text(file.file_name);
target.addClass("hide");
},
});
};
const return_as_dataurl = (files) => {
let promises = files.map((file) =>
frappe.dom.file_to_base64(file.file_obj).then((dataurl) => {
file.dataurl = dataurl;
this.on_success && this.on_success(file);
})
);
return Promise.all(promises);
};
const add_files = (files) => {
files = Array.from(files).map((file) => {
let is_image = file.type.startsWith("image");
return {
file_obj: file,
cropper_file: file,
crop_box_data: null,
optimize: this.attach_doc_image ? true : false,
name: file.name,
doc: null,
progress: 0,
total: 0,
failed: false,
request_succeeded: false,
error_message: null,
uploading: false,
private: !is_image,
};
});
return files;
};
const clear_work = (e) => {
const target = $(e.currentTarget);
const parent = target.closest(".preview-work");
parent.addClass("hide");
parent.siblings(".attach-file").removeClass("hide").val(null);
parent.siblings(".submit-work").removeClass("hide");
};
const fetch_assignments = () => {
if ($(".attach-file").length <= 0) return;
frappe.call({
method: "lms.lms.doctype.lms_assignment_submission.lms_assignment_submission.get_assignment",
args: {
lesson: $(".title").attr("data-lesson"),
},
callback: (data) => {
if (data.message) {
const assignment = data.message;
const status = assignment.status;
let target = $(".attach-file");
target.addClass("hide");
target.siblings(".submit-work").addClass("hide");
target.siblings(".preview-work").removeClass("hide");
if (status != "Not Graded") {
let color = status == "Pass" ? "green" : "red";
$(".assignment-status")
.removeClass("hide")
.addClass(color)
.text(data.message.status);
target.siblings(".alert").addClass("hide");
$(".clear-work").addClass("hide");
if (assignment.comments) {
$(".comments").removeClass("hide");
$(".comment").text(assignment.comments);
}
}
target
.siblings(".preview-work")
.find("a")
.attr("href", assignment.assignment_attachment)
.text(assignment.file_name);
target
.siblings(".preview-work")
.attr("data-submission", assignment.name);
}
},
});
};