+
+
+
+
+
+
+
+
+
+
+
+
- {{ __("New Course") }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ __("No {0} courses found").format(tab.label.toLowerCase()) }}
+
+
+
+
+
+
+
+
+
+ {{ __("No {0} courses found").format(tab.label.toLowerCase()) }}
+
-
-
-
+
+
+
diff --git a/frontend/src/utils/dialogs.js b/frontend/src/utils/dialogs.js
new file mode 100644
index 00000000..9750e6cf
--- /dev/null
+++ b/frontend/src/utils/dialogs.js
@@ -0,0 +1,35 @@
+import { Dialog, ErrorMessage } from 'frappe-ui'
+import { h, reactive, ref } from 'vue'
+
+let dialogs = ref([])
+
+export let Dialogs = {
+ name: 'Dialogs',
+ render() {
+ return dialogs.value.map((dialog) => {
+ return h(
+ Dialog,
+ {
+ options: dialog,
+ modelValue: dialog.show,
+ 'onUpdate:modelValue': (val) => (dialog.show = val),
+ },
+ () => [
+ h(
+ 'p',
+ { class: 'text-p-base text-gray-700' },
+ dialog.message
+ ),
+ h(ErrorMessage, { class: 'mt-2', message: dialog.error }),
+ ]
+ )
+ })
+ },
+}
+
+export function createDialog(options) {
+ let dialog = reactive(options)
+ dialog.key = `dialog-${Math.random().toString(36).slice(2, 9)}`
+ dialogs.value.push(dialog)
+ dialog.show = true
+}
diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js
new file mode 100644
index 00000000..a5f6b104
--- /dev/null
+++ b/frontend/src/utils/index.js
@@ -0,0 +1,8 @@
+import { toast } from 'frappe-ui'
+
+export function createToast(options) {
+ toast({
+ position: 'bottom-right',
+ ...options,
+ })
+}
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index b4a7c19d..2fe3fca7 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -5,7 +5,15 @@ import frappeui from 'frappe-ui/vite'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [frappeui(), vue()],
+ plugins: [
+ frappeui(),
+ vue({
+ script: {
+ defineModel: true,
+ propsDestructure: true,
+ },
+ }),
+ ],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
diff --git a/lms/lms/utils.py b/lms/lms/utils.py
index bf62643f..37ab6286 100644
--- a/lms/lms/utils.py
+++ b/lms/lms/utils.py
@@ -1169,7 +1169,7 @@ def get_courses():
@frappe.whitelist(allow_guest=True)
def get_course_details(course):
- course = frappe.db.get_value(
+ course_details = frappe.db.get_value(
"LMS Course",
course,
[
@@ -1185,38 +1185,46 @@ def get_course_details(course):
],
as_dict=1,
)
- course.tags = get_tags(course.name)
- course.lesson_count = get_lesson_count(course.name)
+ course_details.tags = get_tags(course_details.name)
+ course_details.lesson_count = get_lesson_count(course_details.name)
- course.enrollment_count = frappe.db.count(
- "LMS Enrollment", {"course": course.name, "member_type": "Student"}
+ course_details.enrollment_count = frappe.db.count(
+ "LMS Enrollment", {"course": course_details.name, "member_type": "Student"}
+ )
+ course_details.enrollment_count_formatted = format_number(
+ course_details.enrollment_count
)
- course.enrollment_count_formatted = format_number(course.enrollment_count)
- avg_rating = get_average_rating(course.name) or 0
- course.avg_rating = flt(avg_rating, frappe.get_system_settings("float_precision") or 3)
+ avg_rating = get_average_rating(course_details.name) or 0
+ course_details.avg_rating = flt(
+ avg_rating, frappe.get_system_settings("float_precision") or 3
+ )
- course.instructors = get_instructors(course.name)
- if course.paid_course:
- course.price = fmt_money(course.course_price, 0, course.currency)
+ course_details.instructors = get_instructors(course_details.name)
+ if course_details.paid_course:
+ course_details.price = fmt_money(
+ course_details.course_price, 0, course_details.currency
+ )
else:
- course.price = _("Free")
+ course_details.price = _("Free")
if frappe.session.user == "Guest":
- course.membership = None
- course.is_instructor = False
+ course_details.membership = None
+ course_details.is_instructor = False
else:
- course.membership = frappe.db.get_value(
+ course_details.membership = frappe.db.get_value(
"LMS Enrollment",
- {"member": frappe.session.user, "course": course.name},
+ {"member": frappe.session.user, "course": course_details.name},
["name", "course", "current_lesson", "progress"],
as_dict=1,
)
- course.is_instructor = is_instructor(course.name)
+ course_details.is_instructor = is_instructor(course_details.name)
- if course.membership and course.membership.current_lesson:
- course.current_lesson = get_lesson_index(course.membership.current_lesson)
- return course
+ if course_details.membership and course_details.membership.current_lesson:
+ course_details.current_lesson = get_lesson_index(
+ course_details.membership.current_lesson
+ )
+ return course_details
def get_categorized_courses(courses):