refactor: renamed app to lms
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
<div class="form-group">
|
||||
<div class="d-flex">
|
||||
<input class="btn btn-default btn-sm mr-3 attach-file" type="file" id="{{ id }}" accept="{{ accept }}" />
|
||||
<div class="button is-secondary submit-work">Submit Work</div>
|
||||
<div class="preview-work button is-default hide">
|
||||
<a target="_blank"></a>
|
||||
<div class="button is-secondary clear-work">Change</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
<div class="common-card-style">
|
||||
<div class="certificate-content">
|
||||
<img src="{{ logo }}" class="certificate-logo">
|
||||
<div class="text-muted mt-18">
|
||||
Completion Certificate
|
||||
</div>
|
||||
<div class="certificate-heading"> {{ course.title }} </div>
|
||||
<div class="text-muted mt-18"> Awarded To </div>
|
||||
<div class="certificate-heading"> {{ student.full_name }} </div>
|
||||
|
||||
<div class="certificate-footer">
|
||||
{% if certificate.issue_date %}
|
||||
<div class="certificate-footer-item">
|
||||
<div class="font-weight-bold">
|
||||
{{ frappe.utils.format_date(certificate.issue_date, "medium") }}
|
||||
</div>
|
||||
<div>
|
||||
Issue date
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if certificate.expiry_date %}
|
||||
<div class="certificate-footer-item">
|
||||
<div class="font-weight-bold">
|
||||
{{ frappe.utils.format_date(certificate.expiry_date, "medium") }}
|
||||
</div>
|
||||
<div>
|
||||
Expiry date
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if instructor.full_name %}
|
||||
<div class="certificate-footer-item">
|
||||
<div class="font-weight-bold">
|
||||
{{ instructor.full_name }}
|
||||
</div>
|
||||
<div>
|
||||
Instructor
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="certificate-ribbon"></div>
|
||||
</div>
|
||||
<script src="/assets/lms/js/html2canvas.js"></script>
|
||||
@@ -0,0 +1,12 @@
|
||||
<div class="{{ classes }}">
|
||||
{% if courses | length %}
|
||||
<div class="course-home-headings">
|
||||
{{ title }}
|
||||
</div>
|
||||
<div class="cards-parent">
|
||||
{% for course in courses %}
|
||||
{{ widgets.CourseCard(course=course, read_only=False) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -0,0 +1,23 @@
|
||||
{% set courses = get_authored_courses(frappe.session.user, only_published=False) %}
|
||||
{% if courses | length %}
|
||||
<div class="cards-parent">
|
||||
{% for course in courses %}
|
||||
{{ widgets.CourseCard(course=course) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<div>
|
||||
<img class="icon icon-xl" src="/assets/lms/icons/comment.svg">
|
||||
</div>
|
||||
<div class="empty-state-text">
|
||||
<div class="empty-state-heading">{{ _("No courses created") }}</div>
|
||||
<div class="course-meta">{{ _("Help others learn something new.") }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<a class="button is-secondary button-links" href="/course?new=1">
|
||||
{{ _("Create a Course") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -0,0 +1,18 @@
|
||||
<h4>{{_("Set your Password")}}</h4>
|
||||
<p>Dear {{ full_name }},</p>
|
||||
<p>{{ _("") }}</p>
|
||||
|
||||
{% if update_password_link %}
|
||||
|
||||
<p>{{_("Please click on the following button to set your new password")}}:</p>
|
||||
<p>
|
||||
<button style="border: 1px solid #15c; padding: 4px; border-radius: 5px; background-color: white;">
|
||||
<a href="{{ update_password_link }}" style="color: #15c; font-size: 12px; text-decoration:none;"
|
||||
target="_blank">{{_("Update Password") }}</a>
|
||||
</button>
|
||||
</p>
|
||||
|
||||
{% endif %}
|
||||
|
||||
<p>{{_("Regards")}},<br>
|
||||
{{ _("Team School") }}</p><br>
|
||||
@@ -0,0 +1,6 @@
|
||||
{% set job_link = "<a href='" + job_url + "'>" + job + "</a>" %}
|
||||
|
||||
<p>{{ _("Hey,") }}</p>
|
||||
<p>{{ _("{0} has reported a job post for the following reason.").format(user) }}</p>
|
||||
<p>" {{ reason }} "</p>
|
||||
<p>{{ _("Please take appropriate action at {0}").format(job_url) }}</p>
|
||||
@@ -0,0 +1,19 @@
|
||||
<div>
|
||||
{% set site_link = "<a href='" + site_url + "'>" + app_name + "</a>" %}
|
||||
<p>{{ _("Hi {0},").format(first_name) }}</p>
|
||||
<br>
|
||||
<p>{{ _("The course {0} is now available on {1}.").format(frappe.bold(title), app_name) }}</p>
|
||||
<br>
|
||||
<p>Click on the link below to start learning.</p>
|
||||
<p style="margin: 15px 0px;">
|
||||
<a href="{{ course_link }}" rel="nofollow" class="btn btn-primary">{{ _("Start Learning") }}</a>
|
||||
</p>
|
||||
<br>
|
||||
<p>
|
||||
{{ _("You can also copy-paste following link in your browser") }}<br>
|
||||
<a href="{{ course_link }}">{{ site_url }}{{ course_link }}</a>
|
||||
</p>
|
||||
<br>
|
||||
<p>Thanks and Regards,</p>
|
||||
<p>{{ app_name }}</p>
|
||||
</div>
|
||||
@@ -0,0 +1,12 @@
|
||||
{% for batch in batches %}
|
||||
<h3> {{ batch }}</h3>
|
||||
<div>
|
||||
{% for message in batches[batch] %}
|
||||
<div style="border: 1px solid #DBDBDB;padding: 10px; margin: 10px;">
|
||||
<p> {{ frappe.utils.md_to_html(message.message) }} </p>
|
||||
<p class="text-right">By {{message.author}}</p>
|
||||
<div class="small text-muted text-right">{{ frappe.utils.format_datetime(message.creation, "medium") }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,17 @@
|
||||
<div>
|
||||
{% set site_link = "<a href='" + site_url + "'>" + site_name + "</a>" %}
|
||||
<p>{{_("Hi,")}}</p>
|
||||
<p>{{_("Welcome to {0}!").format(site_name)}}</p>
|
||||
<p>Click on the link below to complete your sign up and set a new password</p>
|
||||
<p style="margin: 15px 0px;">
|
||||
<a href="{{ signup_form_link }}" rel="nofollow" class="btn btn-primary">{{ _("Complete Sign Up") }}</a>
|
||||
</p>
|
||||
<br>
|
||||
<p>
|
||||
{{_("You can also copy-paste following link in your browser")}}<br>
|
||||
<a href="{{ signup_form_link }}">{{ site_url }}{{ signup_form_link }}</a>
|
||||
</p>
|
||||
<br>
|
||||
<p>Thanks and Regards,</p>
|
||||
<p>{{site_name}}</p>
|
||||
</div>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!-- <div style="border: 1px solid #DBDBDB; padding-bottom: 10px;">
|
||||
<h6 style="padding-left: 10px;">{{ author }}</h6>
|
||||
<hr style="border: 1px solid #DBDBDB;">
|
||||
<div style="padding: 10px;">
|
||||
{{ message }}
|
||||
<div class="small text-muted text-right">{{ creation }}</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<p> {{ message }} </p>
|
||||
<p class="text-right">By {{author}}</p>
|
||||
<div class="small text-muted text-right">{{ creation }}</div>
|
||||
<a href="courses/course?course={{course}}">Open Course</a>
|
||||
@@ -0,0 +1,9 @@
|
||||
<div>
|
||||
<p>Dear {{ member_name }},</p>
|
||||
<br>
|
||||
<p>You've applied to become a mentor for this course. Your request is currently under review.</p>
|
||||
<p>If you are not any more interested to mentor the course {{ course }}, you can <a href="{{ course_url }}">cancel your application</a>.</p>
|
||||
<br>
|
||||
<p>Thanks and Regards,</p>
|
||||
<p>Team School.</p>
|
||||
</div>
|
||||
@@ -0,0 +1,8 @@
|
||||
<div>
|
||||
<p>Dear {{ member_name }},</p>
|
||||
<br>
|
||||
<p>Your request to join us as a mentor for the course {{ course }} has been {{ status }}.</p>
|
||||
<br>
|
||||
<p>Thanks and Regards,</p>
|
||||
<p>Team School.</p>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="exercise">
|
||||
<h3><a name="E{{exercise.index_label}}">Exercise {{exercise.index_label}}: {{ exercise.title }}</a></h3>
|
||||
<div class="exercise-description">{{frappe.utils.md_to_html(exercise.description)}}</div>
|
||||
|
||||
{% set submission = exercise.get_user_submission() %}
|
||||
|
||||
<pre class="exercise" id="exercise-{{exercise.name}}"
|
||||
data-last-submitted="{{ submission and submission.creation or '' }}" data-name="{{ exercise.name }}"
|
||||
data-image='{{ (submission and submission.image or "") | tojson }}'><code class="language-joy">{{ submission.solution if submission else exercise.code }}</code></pre>
|
||||
</div>
|
||||
@@ -0,0 +1,168 @@
|
||||
<script type="text/javascript" src="/assets/frappe/node_modules/moment/min/moment-with-locales.min.js"></script>
|
||||
<script type="text/javascript" src="/assets/frappe/node_modules/moment-timezone/builds/moment-timezone-with-data.min.js"></script>
|
||||
<script type="text/javascript" src="/assets/frappe/js/frappe/utils/datetime.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
// comment_when is failing because of this
|
||||
if (!frappe.sys_defaults) {
|
||||
frappe.sys_defaults = {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="{{ livecode_url }}/static/livecode.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/assets/mon_school/js/livecode-files.js"></script>
|
||||
|
||||
<template id="livecode-template">
|
||||
<div class="livecode-editor livecode-editor-inline">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-md-6">
|
||||
<div class="controls">
|
||||
<button class="run">Run</button>
|
||||
|
||||
<div class="exercise-controls pull-right">
|
||||
<span style="padding-right: 10px;"><span class="last-submitted human-time" data-timestamp=""></span></span>
|
||||
<button class="submit btn-primary">Submit</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="code-editor">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-md-6">
|
||||
<div class="code-wrapper">
|
||||
<textarea class="code"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6 canvas-wrapper">
|
||||
<div class="svg-image" width="300" height="300"></div>
|
||||
<pre class="output"></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
function getLiveCodeOptions() {
|
||||
return {
|
||||
base_url: "{{ livecode_url }}",
|
||||
runtime: "python",
|
||||
files: LIVECODE_FILES, // loaded from livecode-files.js
|
||||
command: ["python", "start.py"],
|
||||
codemirror: true,
|
||||
onMessage: {
|
||||
image: function(editor, msg) {
|
||||
const element = editor.parent.querySelector(".svg-image");
|
||||
element.innerHTML = msg.image;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
var editorLookup = {};
|
||||
|
||||
$("pre.example, pre.exercise").each((i, e) => {
|
||||
var code = $(e).text();
|
||||
var template = document.querySelector('#livecode-template');
|
||||
var clone = template.content.cloneNode(true);
|
||||
|
||||
$(e)
|
||||
.wrap('<div></div>')
|
||||
.hide()
|
||||
.parent()
|
||||
.append(clone)
|
||||
.find("textarea.code")
|
||||
.val(code);
|
||||
|
||||
if ($(e).hasClass("exercise")) {
|
||||
var last_submitted = $(e).data("last-submitted");
|
||||
if (last_submitted) {
|
||||
$(e).parent().find(".last-submitted")
|
||||
.data("timestamp", last_submitted)
|
||||
.html(__("Submitted {0}", [comment_when(last_submitted)]));
|
||||
}
|
||||
}
|
||||
else {
|
||||
$(e).parent().find(".exercise-controls").remove();
|
||||
}
|
||||
|
||||
var editor = new LiveCodeEditor(e.parentElement, {
|
||||
...getLiveCodeOptions(),
|
||||
codemirror: true,
|
||||
onMessage: {
|
||||
image: function(editor, msg) {
|
||||
const canvasElement = editor.parent.querySelector("div.svg-image");
|
||||
canvasElement.innerHTML = msg.image;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(e).parent().find(".submit").on('click', function() {
|
||||
var name = $(e).data("name");
|
||||
let code = editor.codemirror.doc.getValue();
|
||||
|
||||
frappe.call("lms.lms.api.submit_solution", {
|
||||
"exercise": name,
|
||||
"code": code
|
||||
}).then(r => {
|
||||
if (r.message.name) {
|
||||
frappe.msgprint("Submitted successfully!");
|
||||
|
||||
let d = r.message.creation;
|
||||
$(e).parent().find(".human-time").html(__("Submitted {0}", [comment_when(d)]));
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$(".exercise-image").each((i, e) => {
|
||||
var svg = JSON.parse($(e).data("image"));
|
||||
$(e).html(svg);
|
||||
});
|
||||
|
||||
$("pre.exercise").each((i, e) => {
|
||||
var svg = JSON.parse($(e).data("image"));
|
||||
$(e).parent().find(".svg-image").html(svg);
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
.svg-image {
|
||||
border: 5px solid #ddd;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
width: 310px;
|
||||
height: 310px;
|
||||
}
|
||||
.livecode-editor {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.livecode-editor-small .svg-image {
|
||||
border: 5px solid #ddd;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
width: 210px;
|
||||
height: 210px;
|
||||
}
|
||||
|
||||
/* work-in-progress styles for showing admonition */
|
||||
.admonition {
|
||||
border: 1px solid #aaa;
|
||||
border-left: .5rem solid #888;
|
||||
border-radius: .3em;
|
||||
font-size: 0.9em;
|
||||
margin: 1.5em 0;
|
||||
padding: 0 0.5em;
|
||||
}
|
||||
.admonition-title {
|
||||
padding: 0.5em 0px;
|
||||
font-weight: bold;
|
||||
padding-top:
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,8 @@
|
||||
<link rel="stylesheet" href="{{ livecode_url }}/static/codemirror/lib/codemirror.css">
|
||||
|
||||
<script src="{{ livecode_url }}/static/codemirror/lib/codemirror.js"></script>
|
||||
<script src="{{ livecode_url }}/static/codemirror/mode/python/python.js"></script>
|
||||
<script src="{{ livecode_url }}/static/codemirror/keymap/sublime.js"></script>
|
||||
|
||||
<script src="{{ livecode_url }}/static/codemirror/addon/edit/matchbrackets.js"></script>
|
||||
<script src="{{ livecode_url }}/static/codemirror/addon/comment/comment.js"></script>
|
||||
@@ -0,0 +1,54 @@
|
||||
<div id="quiz-title" class="hide">{{ quiz.title }}</div>
|
||||
|
||||
<div class="common-card-style question-card">
|
||||
<form id="quiz-form">
|
||||
<div class="questions">
|
||||
{% for question in quiz.questions %}
|
||||
{% set instruction = _("Choose all answers that apply") if question.multiple else _("Choose 1 answer") %}
|
||||
<div class="question {% if loop.index == 1 %} active-question {% else %} hide {% endif %}"
|
||||
data-question="{{ question.question }}" data-multi="{{ question.multiple}}" data-qt-index="{{ loop.index }}">
|
||||
<div class="question-header">
|
||||
<div class="question-number">{{ loop.index }}</div>
|
||||
<div class="question-text">
|
||||
<div class="course-meta pull-right ml-2"> {{ instruction }} </div>
|
||||
{{ frappe.utils.md_to_html(question.question) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% set options = [question.option_1, question.option_2, question.option_3, question.option_4] %}
|
||||
{% for option in options %}
|
||||
{% if option %}
|
||||
<div class="mb-2">
|
||||
<div class="custom-checkbox">
|
||||
<label class="quiz-label">
|
||||
<div class="course-meta font-weight-bold ml-3"> {{ convert_number_to_character(loop.index - 1) }}</div>
|
||||
<input class="option" value="{{ option | urlencode }}"
|
||||
data-correct="{{ question['is_correct_' + loop.index | string] }}" {% if question.multiple %}
|
||||
type="checkbox" {% else %} type="radio" name="{{ question.question | urlencode }}" {% endif %}>
|
||||
<div class="option-text">{{ frappe.utils.md_to_html(option) }}</div>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{% set explanation = question['explanation_' + loop.index | string] %}
|
||||
{% if explanation %}
|
||||
<small class="explanation ml-3 hide">{{ explanation }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="quiz-footer">
|
||||
<span class="font-weight-bold"> <span class="current-question">1</span> of {{ quiz.questions | length }}</span>
|
||||
<button class="button pull-right is-default" id="check" disabled>{{ _("Check") }}</button>
|
||||
<div class="button is-secondary hide" id="next">{{ _("Next Question") }}</div>
|
||||
<div class="button is-secondary is-default hide" id="summary">{{ _("Summary") }}</div>
|
||||
<small id="submission-message" class="font-weight-bold hide"> {{ _("Please join the course to submit the Quiz.") }} </small>
|
||||
<div class="button is-secondary hide" id="try-again">{{ _("Try Again") }}</div>
|
||||
</div>
|
||||
<h4 class="success-message"></h4>
|
||||
<h5 class="score text-muted"></h5>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,19 @@
|
||||
{% set show_search = frappe.db.get_single_value("LMS Settings", "show_search") %}
|
||||
{% set search_placeholder = frappe.db.get_single_value("LMS Settings", "search_placeholder") %}
|
||||
|
||||
{% if show_search %}
|
||||
<input class="search" id="search-course" placeholder="{{ _(search_placeholder) }}">
|
||||
|
||||
<div class="empty-state alert alert-dismissible search-empty-state hide">
|
||||
<a href="#" class="close-search-empty-state" aria-label="close">×</a>
|
||||
<div>
|
||||
<img class="icon icon-xl" src="/assets/frappe/images/ui-states/search-empty-state.svg">
|
||||
</div>
|
||||
<div class="empty-state-text">
|
||||
<div class="empty-state-heading">{{ _("No results found") }}</div>
|
||||
<div class="course-meta">{{ _("Try some other keyword or explore our list of courses.") }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script> {% include "lms/templates/search_course/search_course.js" %} </script>
|
||||
{% endif %}
|
||||
@@ -0,0 +1,74 @@
|
||||
frappe.ready(() => {
|
||||
$("#search-course").keyup((e) => {
|
||||
search_course(e);
|
||||
});
|
||||
|
||||
$(".close-search-empty-state").click((e) => {
|
||||
close_search_empty_state(e);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
const search_course = (e) => {
|
||||
let input = $(e.currentTarget).val();
|
||||
|
||||
if (input == window.input)
|
||||
return;
|
||||
|
||||
window.input = input;
|
||||
|
||||
if (input.length < 3 || input.trim() == "") {
|
||||
$(".course-card").removeClass("hide");
|
||||
$(".search-empty-state").addClass("hide");
|
||||
fix_heading_styles();
|
||||
return;
|
||||
}
|
||||
|
||||
frappe.call({
|
||||
method: "lms.lms.doctype.lms_course.lms_course.search_course",
|
||||
args: {
|
||||
"text": input
|
||||
},
|
||||
callback: (data) => {
|
||||
render_course_list(data.message);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const render_course_list = (courses) => {
|
||||
fix_heading_styles();
|
||||
$(".search-empty-state").addClass("hide");
|
||||
|
||||
if (!courses.length) {
|
||||
$(".course-card").removeClass("hide");
|
||||
$(".search-empty-state").removeClass("hide");
|
||||
return;
|
||||
}
|
||||
|
||||
$(".course-card").addClass("hide");
|
||||
for (course in courses) {
|
||||
$("[data-course=" + courses[course].name + "]").removeClass("hide");
|
||||
}
|
||||
|
||||
const visible_live_courses = $(".live-courses .course-card").not(".hide");
|
||||
const visible_upcoming_courses = $(".upcoming-courses .course-card").not(".hide");
|
||||
|
||||
if (!visible_live_courses.length) {
|
||||
$(".live-courses .course-home-headings").addClass("hide");
|
||||
$(".upcoming-courses").removeClass("mt-10");
|
||||
}
|
||||
|
||||
if (!visible_upcoming_courses.length) {
|
||||
$(".upcoming-courses .course-home-headings").addClass("hide");
|
||||
}
|
||||
}
|
||||
|
||||
const fix_heading_styles = () => {
|
||||
$(".course-home-headings").removeClass("hide");
|
||||
$(".upcoming-courses").addClass("mt-10");
|
||||
}
|
||||
|
||||
const close_search_empty_state = (e) => {
|
||||
$(".search-empty-state").addClass("hide");
|
||||
$("#search-course").val("");
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<form class="signup-form" role="form">
|
||||
<div class="page-card-body">
|
||||
<div class="form-group">
|
||||
<label class="form-label sr-only" for="signup_fullname">Full Name</label>
|
||||
<input type="text" id="signup_fullname" class="form-control" placeholder="{{ _('Jane Doe') }}"
|
||||
required autofocus>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label sr-only" for="signup_email">Email</label>
|
||||
<input type="email" id="signup_email" class="form-control"
|
||||
placeholder="{{ _('jane@example.com') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<span class="input-area">
|
||||
<input type="checkbox" autocomplete="off" class="input-with-feedback"
|
||||
data-fieldtype="Check" data-fieldname="terms" id="signup-terms" required>
|
||||
</span>
|
||||
<span class="label-area">
|
||||
{{ _("I have read and agree to your {0}").format(get_signup_optin_checks()) }}
|
||||
</span>
|
||||
</label>
|
||||
<p class="help-box small text-muted"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-card-actions">
|
||||
<button class="btn btn-sm btn-primary btn-block btn-signup"
|
||||
type="submit">{{ _("Sign up") }}</button>
|
||||
|
||||
<p class="text-center sign-up-message">
|
||||
<a href="#login" class="blue">{{ _("Have an account? Login") }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
frappe.ready(function () {
|
||||
$(".signup-form").on("submit", function (e) {
|
||||
e.preventDefault();
|
||||
const email = ($("#signup_email").val() || "").trim();
|
||||
const full_name = frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim());
|
||||
|
||||
if (!email || !validate_email(email) || !full_name) {
|
||||
login.set_status('{{ _("Valid email and name required") }}', 'red');
|
||||
return false;
|
||||
}
|
||||
|
||||
frappe.call({
|
||||
method: "lms.overrides.user.sign_up",
|
||||
args: {
|
||||
"email": ($("#signup_email").val() || "").trim(),
|
||||
"full_name": frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim()),
|
||||
"verify_terms": $("#signup-terms").prop("checked") ? 1 : 0
|
||||
},
|
||||
statusCode: login.login_handlers
|
||||
})
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user