@@ -40,23 +41,21 @@
{{ course.status }}
{% endif %}
- {% set student_count = get_students(course.name) | length %}
- {% set avg_rating = get_average_rating(course.name) %}
- {% if student_count %}
+ {% if course.enrollment_count %}
- {{ student_count }}
+ {{ course.enrollment_count }}
{% endif %}
- {% if avg_rating %}
+ {% if course.avg_rating %}
- {{ frappe.utils.flt(avg_rating, frappe.get_system_settings("float_precision") or 3) }}
+ {{ frappe.utils.flt(course.avg_rating, frappe.get_system_settings("float_precision") or 3) }}
{% endif %}
diff --git a/lms/overrides/user.py b/lms/overrides/user.py
index 6cfa186d..b561bc0e 100644
--- a/lms/overrides/user.py
+++ b/lms/overrides/user.py
@@ -5,7 +5,7 @@ from frappe import _
from frappe.core.doctype.user.user import User
from frappe.utils import cint, escape_html, random_string
from frappe.website.utils import is_signup_disabled
-from lms.lms.utils import validate_image
+from lms.lms.utils import validate_image, get_average_rating
from frappe.website.utils import cleanup_page_name
from frappe.model.naming import append_number_if_name_exists
from lms.widgets import Widgets
@@ -107,11 +107,16 @@ def get_enrolled_courses():
"price_certificate",
"currency",
"published",
+ "creation",
],
as_dict=True,
)
if not course.published:
continue
+ course.enrollment_count = frappe.db.count(
+ "LMS Batch Membership", {"course": course.name, "member_type": "Student"}
+ )
+ course.avg_rating = get_average_rating(course.name) or 0
progress = cint(membership.progress)
if progress < 100:
in_progress.append(course)
@@ -151,12 +156,17 @@ def get_authored_courses(member=None, only_published=True):
"enable_certification",
"status",
"published",
+ "creation",
],
as_dict=True,
)
if only_published and detail and not detail.published:
continue
+ detail.enrollment_count = frappe.db.count(
+ "LMS Batch Membership", {"course": detail.name, "member_type": "Student"}
+ )
+ detail.avg_rating = get_average_rating(detail.name) or 0
course_details.append(detail)
return course_details
@@ -265,7 +275,7 @@ def on_session_creation(login_manager):
@frappe.whitelist()
-def search_users(start: int = 0, text: str=""):
+def search_users(start: int = 0, text: str = ""):
start = cint(start)
search_text = frappe.db.escape(f"%{text}%")
diff --git a/lms/public/css/style.css b/lms/public/css/style.css
index 803fd9e0..803e2db5 100644
--- a/lms/public/css/style.css
+++ b/lms/public/css/style.css
@@ -1956,10 +1956,6 @@ select {
-webkit-appearance: none;
}
-.course-list-cta {
- float: right;
-}
-
.modal-title {
font-size: var(--text-lg) !important;
}
@@ -2027,15 +2023,24 @@ select {
}
.lms-menu {
+ background-color: var(--control-bg);
+ color: var(--text-color);
+ border: none;
+ border-radius: var(--border-radius);
+ padding: 0.15rem 0.5rem;
+ box-shadow: var(--btn-shadow);
background-image: url(/assets/lms/icons/down-arrow.svg);
background-position: right 0.5rem center;
background-repeat: no-repeat;
background-size: 0.75rem;
- padding-right: 2.5rem;
- text-align: left;
+ padding-right: 2rem;
-webkit-print-color-adjust: exact;
}
+.lms-menu:focus-visible {
+ outline: var(--gray-500);
+}
+
.clickable-row {
cursor: pointer;
}
@@ -2278,4 +2283,8 @@ select {
position: absolute;
top: 0;
left: 0;
+}
+
+.course-filter {
+
}
\ No newline at end of file
diff --git a/lms/public/js/common_functions.js b/lms/public/js/common_functions.js
index fc5cead8..c424f598 100644
--- a/lms/public/js/common_functions.js
+++ b/lms/public/js/common_functions.js
@@ -40,6 +40,10 @@ frappe.ready(() => {
$("#create-class").click((e) => {
open_class_dialog(e);
});
+
+ $("#course-filter").change((e) => {
+ filter_courses(e);
+ });
});
const pin_header = () => {
@@ -354,3 +358,17 @@ const save_class = (values) => {
},
});
};
+
+const filter_courses = (e) => {
+ const course_lists = $(".course-cards-parent");
+ const filter = $(e.currentTarget).val();
+ course_lists.each((i, list) => {
+ const course_cards = $(list).children(".course-card");
+ course_cards.sort((a, b) => {
+ var value1 = $(a).data(filter);
+ var value2 = $(b).data(filter);
+ return value1 > value2 ? -1 : value1 < value2 ? 1 : 0;
+ });
+ $(list).append(course_cards);
+ });
+};
diff --git a/lms/templates/course_list.html b/lms/templates/course_list.html
index d0bab41d..459eddb7 100644
--- a/lms/templates/course_list.html
+++ b/lms/templates/course_list.html
@@ -1,6 +1,6 @@
{% if courses | length %}
-
+
{% for course in courses %}
{{ widgets.CourseCard(course=course, read_only=False) }}
{% endfor %}
diff --git a/lms/www/courses/index.html b/lms/www/courses/index.html
index a9713a9d..98e69e88 100644
--- a/lms/www/courses/index.html
+++ b/lms/www/courses/index.html
@@ -24,9 +24,25 @@
{% include "lms/templates/search_course/search_course.html" %}
-
+
+
+
+
{% if frappe.session.user != "Guest" %}
-
+
{{ _("My Profile") }}
{% endif %}
diff --git a/lms/www/courses/index.py b/lms/www/courses/index.py
index 844d485f..6e1cafd2 100644
--- a/lms/www/courses/index.py
+++ b/lms/www/courses/index.py
@@ -6,6 +6,7 @@ from lms.lms.utils import (
get_restriction_details,
has_course_moderator_role,
get_courses_under_review,
+ get_average_rating,
)
from lms.overrides.user import get_enrolled_courses, get_authored_courses
@@ -49,13 +50,22 @@ def get_courses():
"paid_certificate",
"price_certificate",
"currency",
+ "creation",
],
)
live_courses, upcoming_courses = [], []
for course in courses:
+ course.enrollment_count = frappe.db.count(
+ "LMS Batch Membership", {"course": course.name, "member_type": "Student"}
+ )
+ course.avg_rating = get_average_rating(course.name) or 0
if course.upcoming:
upcoming_courses.append(course)
else:
live_courses.append(course)
+
+ live_courses.sort(key=lambda x: x.enrollment_count, reverse=True)
+ upcoming_courses.sort(key=lambda x: x.enrollment_count, reverse=True)
+
return live_courses, upcoming_courses