feat: data in course fields
This commit is contained in:
@@ -58,8 +58,14 @@
|
|||||||
|
|
||||||
.field-input {
|
.field-input {
|
||||||
border: 1px solid var(--gray-300);
|
border: 1px solid var(--gray-300);
|
||||||
border-radius: var(--border-radius-sm);
|
border-radius: var(--border-radius-md);
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
|
width: 75%;
|
||||||
|
margin: 0.25rem 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-input:focus-visible {
|
||||||
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.field-description {
|
.field-description {
|
||||||
@@ -82,6 +88,10 @@
|
|||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
textarea.field-input {
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #FFFFFF;
|
background-color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,14 @@ import EditorJS from "@editorjs/editorjs";
|
|||||||
import Header from "@editorjs/header";
|
import Header from "@editorjs/header";
|
||||||
import List from "@editorjs/list";
|
import List from "@editorjs/list";
|
||||||
|
|
||||||
create_editor_for_short_description = () => {
|
const create_editor_for_short_description = () => {
|
||||||
let editor = new EditorJS({
|
let editor = new EditorJS({
|
||||||
holder: "course-description",
|
holder: "course-description",
|
||||||
|
tools: {
|
||||||
|
header: {
|
||||||
|
class: Header,
|
||||||
|
},
|
||||||
|
list: List,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="page-title"> {{ _("Course Details") }} </div>
|
<div class="page-title"> {{ _("Course Details") }} </div>
|
||||||
<div class="mt-10">
|
<div class="mt-10">
|
||||||
<div>
|
<div>
|
||||||
<div class="course-title">
|
<div>
|
||||||
<div class="field-label">
|
<div class="field-label">
|
||||||
{{ _("Title") }}
|
{{ _("Title") }}
|
||||||
</div>
|
</div>
|
||||||
@@ -18,11 +18,26 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="">
|
<div class="">
|
||||||
<input type="text" class="field-input">
|
<input type="text" class="field-input" value="{{ course.title }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="course-title">
|
<div>
|
||||||
|
<div class="field-label">
|
||||||
|
{{ _("Preview Video") }}
|
||||||
|
</div>
|
||||||
|
<div class="field-description">
|
||||||
|
{{ _("A feature video that provides a preview of the course") }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="">
|
||||||
|
<input type="text" class="field-input" value="{{ course.video_link }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
<div class="field-label">
|
<div class="field-label">
|
||||||
{{ _("Short Introduction") }}
|
{{ _("Short Introduction") }}
|
||||||
</div>
|
</div>
|
||||||
@@ -31,11 +46,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="">
|
<div class="">
|
||||||
<div type="text" class="field-input"></div>
|
<input type="text" class="field-input" value="{{ course.short_introduction }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="course-title">
|
<div>
|
||||||
<div class="field-label">
|
<div class="field-label">
|
||||||
{{ _("Tags") }}
|
{{ _("Tags") }}
|
||||||
</div>
|
</div>
|
||||||
@@ -44,11 +60,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tags field-input">
|
<div class="tags field-input">
|
||||||
|
{% for tag in get_tags(course.name) %}
|
||||||
|
<button class="btn btn-secondary btn-sm mr-2 text-uppercase">
|
||||||
|
{{ tag }}
|
||||||
|
<span class="btn-remove">
|
||||||
|
<svg class="icon icon-sm">
|
||||||
|
<use class="" href="#icon-close"></use>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
{% endfor %}
|
||||||
<input type="text" class="invisible-input" id="tags-input">
|
<input type="text" class="invisible-input" id="tags-input">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="course-title">
|
<div>
|
||||||
<div class="field-label">
|
<div class="field-label">
|
||||||
{{ _("Course Image") }}
|
{{ _("Course Image") }}
|
||||||
</div>
|
</div>
|
||||||
@@ -59,11 +86,11 @@
|
|||||||
<div class="">
|
<div class="">
|
||||||
<input type="file" class="field-input" id="image">
|
<input type="file" class="field-input" id="image">
|
||||||
</div>
|
</div>
|
||||||
<img>
|
<img {% if course.image %} class="image-preview" src="{{ course.image }}" {% endif %}>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="course-title">
|
<div>
|
||||||
<div class="field-label">
|
<div class="field-label">
|
||||||
{{ _("Course Description") }}
|
{{ _("Course Description") }}
|
||||||
</div>
|
</div>
|
||||||
@@ -71,9 +98,33 @@
|
|||||||
{{ _("Add a detailed description") }}
|
{{ _("Add a detailed description") }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input id="course-description" class="field-input">
|
<textarea id="course-description" class="field-input">{{ course.description }}</textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="published" class="mb-0">
|
||||||
|
<input type="checkbox" id="published" {% if course.published %} checked {% endif %}>
|
||||||
|
{{ _("Published") }}
|
||||||
|
</label>
|
||||||
|
<label for="upcoming" class="mb-0 ml-20">
|
||||||
|
<input type="checkbox" id="upcoming" {% if course.upcoming %} checked {% endif %}>
|
||||||
|
{{ _("Upcoming") }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="field-label">
|
||||||
|
{{ _("Instructor") }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-primary btn-sm btn-save-course">
|
||||||
|
{{ _("Save") }}
|
||||||
|
</button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ frappe.ready(() => {
|
|||||||
.addClass("image-preview")
|
.addClass("image-preview")
|
||||||
.attr("src", URL.createObjectURL(e.target.files[0]));
|
.attr("src", URL.createObjectURL(e.target.files[0]));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(".btn-save-course").click((e) => {
|
||||||
|
save_course(e);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const create_tag = (e) => {
|
const create_tag = (e) => {
|
||||||
@@ -28,7 +32,7 @@ const create_tag = (e) => {
|
|||||||
let tag = `<button class="btn btn-secondary btn-sm mr-2 text-uppercase">
|
let tag = `<button class="btn btn-secondary btn-sm mr-2 text-uppercase">
|
||||||
${$(e.target).val()}
|
${$(e.target).val()}
|
||||||
<span class="btn-remove">
|
<span class="btn-remove">
|
||||||
<svg class="icon icon-sm" style="">
|
<svg class="icon icon-sm">
|
||||||
<use class="" href="#icon-close"></use>
|
<use class="" href="#icon-close"></use>
|
||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
@@ -36,3 +40,35 @@ const create_tag = (e) => {
|
|||||||
$(tag).insertBefore("#tags-input");
|
$(tag).insertBefore("#tags-input");
|
||||||
$(e.target).val("");
|
$(e.target).val("");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const save_course = (e) => {
|
||||||
|
let tags = $(".tags button")
|
||||||
|
.map((i, el) => $(el).text().trim())
|
||||||
|
.get();
|
||||||
|
|
||||||
|
frappe.call({
|
||||||
|
method: "lms.lms.doctype.lms_course.lms_course.save_course",
|
||||||
|
args: {
|
||||||
|
tags: tags.join(", "),
|
||||||
|
title: $("#title").text(),
|
||||||
|
short_introduction: $("#intro").text(),
|
||||||
|
video_link: $("#video-link").text(),
|
||||||
|
image: $("#image").attr("href"),
|
||||||
|
description: this.code_field_group.fields_dict["code_md"].value,
|
||||||
|
course: $("#title").data("course")
|
||||||
|
? $("#title").data("course")
|
||||||
|
: "",
|
||||||
|
published: $("#published").prop("checked") ? 1 : 0,
|
||||||
|
upcoming: $("#upcoming").prop("checked") ? 1 : 0,
|
||||||
|
},
|
||||||
|
callback: (data) => {
|
||||||
|
frappe.show_alert({
|
||||||
|
message: __("Saved"),
|
||||||
|
indicator: "green",
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = `/courses/${data.message}?edit=1`;
|
||||||
|
}, 1000);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,5 +1,50 @@
|
|||||||
import frappe
|
import frappe
|
||||||
|
from lms.lms.utils import redirect_to_courses_list, can_create_courses
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
|
try:
|
||||||
|
course_name = frappe.form_dict["course"]
|
||||||
|
except KeyError:
|
||||||
|
redirect_to_courses_list()
|
||||||
|
|
||||||
|
if course_name == "new-course":
|
||||||
|
if not can_create_courses():
|
||||||
|
message = "You do not have permission to access this page."
|
||||||
|
if frappe.session.user == "Guest":
|
||||||
|
message = "Please login to access this page."
|
||||||
|
|
||||||
|
raise frappe.PermissionError(_(message))
|
||||||
|
|
||||||
|
context.course = frappe._dict()
|
||||||
|
context.course.edit_mode = True
|
||||||
|
context.membership = None
|
||||||
|
else:
|
||||||
|
set_course_context(context, course_name)
|
||||||
|
context.member = frappe.db.get_value(
|
||||||
|
"User", frappe.session.user, ["full_name", "username"], as_dict=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def set_course_context(context, course_name):
|
||||||
|
fields = [
|
||||||
|
"name",
|
||||||
|
"title",
|
||||||
|
"short_introduction",
|
||||||
|
"description",
|
||||||
|
"image",
|
||||||
|
"published",
|
||||||
|
"upcoming",
|
||||||
|
"disable_self_learning",
|
||||||
|
"status",
|
||||||
|
"video_link",
|
||||||
|
"enable_certification",
|
||||||
|
"grant_certificate_after",
|
||||||
|
"paid_certificate",
|
||||||
|
"price_certificate",
|
||||||
|
"currency",
|
||||||
|
"max_attempts",
|
||||||
|
]
|
||||||
|
context.course = frappe.db.get_value("LMS Course", course_name, fields, as_dict=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user