fix: tabs and learn page
This commit is contained in:
@@ -32,12 +32,12 @@ class LMSBatchMembership(Document):
|
|||||||
filters={
|
filters={
|
||||||
"member": self.member
|
"member": self.member
|
||||||
},
|
},
|
||||||
fields=["batch", "member_type"]
|
fields=["batch", "member_type", "name"]
|
||||||
)
|
)
|
||||||
|
|
||||||
for membership in previous_membership:
|
for membership in previous_membership:
|
||||||
batch_course = frappe.db.get_value("LMS Batch", membership.batch, "course")
|
batch_course = frappe.db.get_value("LMS Batch", membership.batch, "course")
|
||||||
if batch_course == course and (membership.member_type == "Student" or self.member_type == "Student"):
|
if self.name != membership.name and batch_course == course and (membership.member_type == "Student" or self.member_type == "Student"):
|
||||||
member_name = frappe.db.get_value("User", self.member, "full_name")
|
member_name = frappe.db.get_value("User", self.member, "full_name")
|
||||||
frappe.throw(_("{0} is already a {1} of {2} course through {3} batch").format(member_name, membership.member_type, course, membership.batch))
|
frappe.throw(_("{0} is already a {1} of {2} course through {3} batch").format(member_name, membership.member_type, course, membership.batch))
|
||||||
|
|
||||||
|
|||||||
4
community/lms/widgets/BatchHeader.html
Normal file
4
community/lms/widgets/BatchHeader.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<div class="mt-5">
|
||||||
|
<h3>{{course_name}}</h3>
|
||||||
|
<div class="text-muted">{{member_count}} members</div>
|
||||||
|
</div>
|
||||||
@@ -1,28 +1,36 @@
|
|||||||
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
<div class="mt-5">
|
||||||
|
<a class="font-weight-bold anchor_style" href="/courses">Courses</a> / <a class="font-weight-bold anchor_style" href="/courses/{{ course.name }}"> {{ course.title }}</a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav nav-tabs mt-4">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" id="home-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/learn"
|
<a class="nav-link" id="learn" href="/courses/{{course.name}}/{{batch.name}}/learn">Learn</a>
|
||||||
role="tab" aria-controls="home" aria-selected="true">Learn</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="schedule-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/schedule"
|
<a class="nav-link" id="schedule" href="/courses/{{course.name}}/{{batch.name}}/schedule">Schedule</a>
|
||||||
role="tab" aria-controls="schedule" aria-selected="false">Schedule</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="members-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/members"
|
<a class="nav-link" id="members" href="/courses/{{course.name}}/{{batch.name}}/members">Members</a>
|
||||||
role="tab" aria-controls="members" aria-selected="false">Members</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="discussion-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/discuss"
|
<a class="nav-link" id="discussion" href="/courses/{{course.name}}/{{batch.name}}/discuss">Discussion</a>
|
||||||
role="tab" aria-controls="discussion" aria-selected="false">Discussion</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="about-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/about" role="tab"
|
<a class="nav-link" id="about" href="/courses/{{course.name}}/{{batch.name}}/about">About</a>
|
||||||
aria-controls="about" aria-selected="false">About</a>
|
|
||||||
</li>
|
</li>
|
||||||
{% if batch.is_member(frappe.session.user, member_type="Mentor") %}
|
{% if batch.is_member(frappe.session.user, member_type="Mentor") %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="progress-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/progress"
|
<a class="nav-link" id="progress" href="/courses/{{course.name}}/{{batch.name}}/progress">Progress</a>
|
||||||
role="tab" aria-controls="progress" aria-selected="false">Progress</a>
|
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
<script>
|
||||||
|
frappe.ready(() => {
|
||||||
|
var selector = document.querySelector(`a[href="${decodeURIComponent(window.location.pathname)}"]`)
|
||||||
|
if (selector) {
|
||||||
|
selector.classList.add('active');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#learn").addClass('active')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
|
<div class="tab-content" id="about">
|
||||||
{{ CourseBasicDetail(course)}}
|
{{ CourseBasicDetail(course)}}
|
||||||
{{ InstructorsSection(course.get_instructor()) }}
|
{{ InstructorsSection(course.get_instructor()) }}
|
||||||
{{ BatchDetails(batch)}}
|
{{ BatchDetails(batch)}}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{% extends "templates/base.html" %}
|
{% extends "templates/base.html" %}
|
||||||
{% from "www/macros/common_macro.html" import BatchHearder %}
|
|
||||||
|
|
||||||
{% block title %}Discuss{% endblock %}
|
{% block title %}Discuss{% endblock %}
|
||||||
{% block head_include %}
|
{% block head_include %}
|
||||||
@@ -10,13 +9,10 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
|
||||||
|
|
||||||
<div class="">
|
<div class="container">
|
||||||
<div class="batch-header">
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
{{ BatchHearder(course.title, member_count) }}
|
{{ widgets.BatchHeader(course_name=course.title, member_count=member_count)}}
|
||||||
</div>
|
|
||||||
<div class="messages">
|
<div class="messages">
|
||||||
<div class="message-section">
|
<div class="message-section">
|
||||||
{{ Messages(messages) }}
|
{{ Messages(messages) }}
|
||||||
@@ -24,7 +20,6 @@
|
|||||||
{{ TextArea() }}
|
{{ TextArea() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% macro Messages(messages) %}
|
{% macro Messages(messages) %}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
<link rel="stylesheet" href="/assets/frappe/css/font-awesome.css">
|
<link rel="stylesheet" href="/assets/frappe/css/font-awesome.css">
|
||||||
<link rel="stylesheet" href="{{ livecode_url }}/static/codemirror/lib/codemirror.css">
|
<link rel="stylesheet" href="{{ livecode_url }}/static/codemirror/lib/codemirror.css">
|
||||||
<link rel="stylesheet" href="/assets/css/lms.css">
|
<link rel="stylesheet" href="/assets/css/lms.css">
|
||||||
|
<link rel="stylesheet" href="/assets/frappe/css/hljs-night-owl.css">
|
||||||
|
|
||||||
<script src="{{ livecode_url }}/static/codemirror/lib/codemirror.js"></script>
|
<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/mode/python/python.js"></script>
|
||||||
@@ -22,12 +23,10 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
<div class="lesson-page">
|
<div class="lesson-page">
|
||||||
{{ pagination(prev_url, next_url) }}
|
|
||||||
|
|
||||||
<h2>{{ lesson.title }}</h2>
|
<h2>{{ lesson.title }}</h2>
|
||||||
|
|
||||||
@@ -37,8 +36,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{{ pagination(prev_url, next_url) }}
|
{{ pagination(prev_chap, prev_url, next_chap, next_url) }}
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -68,13 +66,17 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro pagination(prev_url, next_url) %}
|
{% macro pagination(prev_chap, prev_url, next_chap, next_url) %}
|
||||||
<div class="lesson-pagination">
|
<div class="lesson-pagination">
|
||||||
{% if prev_url %}
|
{% if prev_url %}
|
||||||
<a href="{{prev_url}}" class="btn">← Prev</a>
|
<span>
|
||||||
|
Prev: <a href="{{prev_url}}">{{prev_chap}}</a>
|
||||||
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if next_url %}
|
{% if next_url %}
|
||||||
<a href="{{next_url}}" class="btn pull-right">Next →</a>
|
<span class="pull-right">
|
||||||
|
Next: <a href="{{next_url}}">{{next_chap}}</a>
|
||||||
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div style="clear: both;"></div>
|
<div style="clear: both;"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
from re import I
|
||||||
import frappe
|
import frappe
|
||||||
from . import utils
|
from . import utils
|
||||||
|
|
||||||
@@ -20,8 +21,10 @@ def get_context(context):
|
|||||||
context.chapter_index = chapter_index
|
context.chapter_index = chapter_index
|
||||||
print(context.lesson)
|
print(context.lesson)
|
||||||
outline = context.course.get_outline()
|
outline = context.course.get_outline()
|
||||||
next_ = outline.get_next(lesson_number)
|
|
||||||
prev_ = outline.get_prev(lesson_number)
|
prev_ = outline.get_prev(lesson_number)
|
||||||
|
next_ = outline.get_next(lesson_number)
|
||||||
|
context.prev_chap = get_chapter_title(course_name, prev_)
|
||||||
|
context.next_chap = get_chapter_title(course_name, next_)
|
||||||
context.next_url = get_learn_url(course_name, batch_name, next_)
|
context.next_url = get_learn_url(course_name, batch_name, next_)
|
||||||
context.prev_url = get_learn_url(course_name, batch_name, prev_)
|
context.prev_url = get_learn_url(course_name, batch_name, prev_)
|
||||||
|
|
||||||
@@ -29,3 +32,11 @@ def get_learn_url(course_name, batch_name, lesson_number):
|
|||||||
if not lesson_number:
|
if not lesson_number:
|
||||||
return
|
return
|
||||||
return f"/courses/{course_name}/{batch_name}/learn/{lesson_number}"
|
return f"/courses/{course_name}/{batch_name}/learn/{lesson_number}"
|
||||||
|
|
||||||
|
def get_chapter_title(course_name, lesson_number):
|
||||||
|
if not lesson_number:
|
||||||
|
return
|
||||||
|
chapter_index = lesson_number.split(".")[0]
|
||||||
|
lesson_index = lesson_number.split(".")[1]
|
||||||
|
chapter_name = frappe.db.get_value("Chapter", {"course": course_name, "index_": chapter_index}, "name")
|
||||||
|
return frappe.db.get_value("Lesson", {"chapter": chapter_name, "index_": lesson_index}, "title")
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{% extends "templates/base.html" %}
|
{% extends "templates/base.html" %}
|
||||||
{% from "www/macros/common_macro.html" import BatchHearder %}
|
|
||||||
|
|
||||||
{% block title %}Members{% endblock %}
|
{% block title %}Members{% endblock %}
|
||||||
{% block head_include %}
|
{% block head_include %}
|
||||||
@@ -9,32 +8,34 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{{ BatchHearder(course.title, member_count)}}
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
{{ MembersList(members)}}
|
{{ MembersList(members)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
{% macro MembersList(members) %}
|
{% macro MembersList(members) %}
|
||||||
<div class="mt-5">
|
<div class="mt-5 col">
|
||||||
{% for member in members %}
|
{% for member in members %}
|
||||||
<div class="d-flex align-items-center">
|
<div class="row">
|
||||||
<div>
|
<div>
|
||||||
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }}
|
{{ widgets.Avatar(member=member, avatar_class="avatar-large") }}
|
||||||
</div>
|
|
||||||
<div class="ml-5 mr-5">
|
|
||||||
<a href="/{{member.username}}">{{ member.full_name }}</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ml-5">
|
||||||
|
<a class="anchor_style" href="/{{member.username}}">
|
||||||
|
<h3>{{ member.full_name }}</h3>
|
||||||
|
</a>
|
||||||
{% if course.is_mentor(member.name) %}
|
{% if course.is_mentor(member.name) %}
|
||||||
<div class="badge badge-success">Mentor</div>
|
<div class="badge badge-success">Mentor</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if member.bio %}
|
||||||
|
<div class="mt-5">
|
||||||
|
<i>{{ member.bio }}</i>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|||||||
@@ -22,10 +22,9 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
<div class="mentor-dashboard">
|
<div class="mentor-dashboard">
|
||||||
<h1>Batch Progress</h1>
|
<h1>Batch Progress</h1>
|
||||||
{% for exercise in report.exercises %}
|
{% for exercise in report.exercises %}
|
||||||
@@ -43,7 +42,6 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,10 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
|
||||||
{{ widgetsBatchTabs(course=course, batch=batch) }}
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{ widgets.BatchTabs(course=course, batch=batch) }}
|
||||||
<h3>
|
<h3>
|
||||||
Schedule
|
Schedule
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -27,11 +27,3 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
|
||||||
{% macro BatchHearder(course_name, member_count) %}
|
|
||||||
<div class="border p-3">
|
|
||||||
<h3>{{course_name}}</h3>
|
|
||||||
<div class="text-muted">{{member_count}} members</div>
|
|
||||||
</div>
|
|
||||||
{% endmacro %}
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
{% macro BatchTabs(course, batch, is_mentor=False) %}
|
|
||||||
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" id="home-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/learn"
|
|
||||||
role="tab" aria-controls="home" aria-selected="true">Learn</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="schedule-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/schedule"
|
|
||||||
role="tab" aria-controls="schedule" aria-selected="false">Schedule</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="members-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/members"
|
|
||||||
role="tab" aria-controls="members" aria-selected="false">Members</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="discussion-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/discuss"
|
|
||||||
role="tab" aria-controls="discussion" aria-selected="false">Discussion</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="about-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/about" role="tab"
|
|
||||||
aria-controls="about" aria-selected="false">About</a>
|
|
||||||
</li>
|
|
||||||
{% if batch.is_member(frappe.session.user, member_type="Mentor") %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="progress-tab" data-toggle="tab" href="/courses/{{course.name}}/{{batch.name}}/progress"
|
|
||||||
role="tab" aria-controls="progress" aria-selected="false">Progress</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
{% endmacro %}
|
|
||||||
Reference in New Issue
Block a user