diff --git a/lms/lms/doctype/lms_batch/lms_batch.js b/lms/lms/doctype/lms_batch/lms_batch.js index 45f9d0b5..a4277bd2 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.js +++ b/lms/lms/doctype/lms_batch/lms_batch.js @@ -10,10 +10,23 @@ frappe.ui.form.on("LMS Batch", { }, }; }); + + frm.set_query("reference_doctype", "timetable", function () { + let doctypes = [ + "Course Lesson", + "LMS Quiz", + "LMS Assignment", + "LMS Live Class", + ]; + return { + filters: { + name: ["in", doctypes], + }, + }; + }); }, fetch_lessons: (frm) => { - frm.clear_table("scheduled_flow"); frappe.call({ method: "lms.lms.doctype.lms_batch.lms_batch.fetch_lessons", args: { @@ -22,7 +35,7 @@ frappe.ui.form.on("LMS Batch", { callback: (r) => { if (r.message) { r.message.forEach((lesson) => { - let row = frm.add_child("scheduled_flow"); + let row = frm.add_child("timetable"); row.lesson = lesson.name; row.lesson_title = lesson.title; }); diff --git a/lms/lms/doctype/lms_batch/lms_batch.json b/lms/lms/doctype/lms_batch/lms_batch.json index a7949ce3..958cbb47 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.json +++ b/lms/lms/doctype/lms_batch/lms_batch.json @@ -36,7 +36,7 @@ "assessment", "schedule_tab", "fetch_lessons", - "scheduled_flow" + "timetable" ], "fields": [ { @@ -146,12 +146,6 @@ "fieldtype": "Autocomplete", "label": "Category" }, - { - "fieldname": "scheduled_flow", - "fieldtype": "Table", - "label": "Scheduled Flow", - "options": "Scheduled Flow" - }, { "fieldname": "section_break_ubxi", "fieldtype": "Section Break" @@ -164,7 +158,7 @@ { "fieldname": "schedule_tab", "fieldtype": "Tab Break", - "label": "Schedule" + "label": "Timetable" }, { "fieldname": "section_break_gsac", @@ -199,11 +193,17 @@ "fieldname": "published", "fieldtype": "Check", "label": "Published" + }, + { + "fieldname": "timetable", + "fieldtype": "Table", + "label": "Timetable", + "options": "LMS Batch Timetable" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-09-12 12:30:06.565104", + "modified": "2023-09-14 12:51:11.847853", "modified_by": "Administrator", "module": "LMS", "name": "LMS Batch", diff --git a/lms/lms/doctype/lms_batch/lms_batch.py b/lms/lms/doctype/lms_batch/lms_batch.py index 3c6e034f..10664dd6 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.py +++ b/lms/lms/doctype/lms_batch/lms_batch.py @@ -8,7 +8,8 @@ import json from frappe import _ from frappe.model.document import Document from frappe.utils import cint, format_date, format_datetime -from lms.lms.utils import get_lessons +from lms.lms.utils import get_lessons, get_lesson_index, get_lesson_url +from lms.www.utils import get_quiz_details, get_assignment_details class LMSBatch(Document): @@ -19,7 +20,7 @@ class LMSBatch(Document): self.validate_duplicate_students() self.validate_duplicate_assessments() self.validate_membership() - self.validate_schedule() + self.validate_timetable() def validate_duplicate_students(self): students = [row.student for row in self.students] @@ -68,8 +69,8 @@ class LMSBatch(Document): if cint(self.seat_count) < len(self.students): frappe.throw(_("There are no seats available in this batch.")) - def validate_schedule(self): - for schedule in self.scheduled_flow: + def validate_timetable(self): + for schedule in self.timetable: if schedule.start_time and schedule.end_time: if ( schedule.start_time > schedule.end_time or schedule.start_time == schedule.end_time @@ -262,3 +263,45 @@ def add_course(course, parent, name=None, evaluator=None): doc.save() return doc.name + + +@frappe.whitelist() +def get_batch_timetable(batch): + timetable = frappe.get_all( + "LMS Batch Timetable", + filters={"parent": batch}, + fields=["reference_doctype", "reference_docname", "date", "start_time", "end_time"], + order_by="date", + ) + + for entry in timetable: + entry.title = frappe.db.get_value( + entry.reference_doctype, entry.reference_docname, "title" + ) + assessment = frappe._dict({"assessment_name": entry.reference_docname}) + + if entry.reference_doctype == "Course Lesson": + entry.icon = "icon-list" + course = frappe.db.get_value( + entry.reference_doctype, entry.reference_docname, "course" + ) + entry.url = get_lesson_url(course, get_lesson_index(entry.reference_docname)) + + elif entry.reference_doctype == "LMS Quiz": + entry.icon = "icon-quiz" + entry.url = "/quizzes" + details = get_quiz_details(assessment, frappe.session.user) + entry.update(details) + + elif entry.reference_doctype == "LMS Assignment": + entry.icon = "icon-quiz" + details = get_assignment_details(assessment, frappe.session.user) + entry.update(details) + + elif entry.reference_doctype == "LMS Live Class": + entry.icon = "icon-call" + entry.url = frappe.db.get_value( + entry.reference_doctype, entry.reference_docname, "join_url" + ) + + return timetable diff --git a/lms/lms/doctype/lms_batch_timetable/__init__.py b/lms/lms/doctype/lms_batch_timetable/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.js b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.js new file mode 100644 index 00000000..4cecd9c3 --- /dev/null +++ b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.js @@ -0,0 +1,8 @@ +// Copyright (c) 2023, Frappe and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("LMS Batch Timetable", { +// refresh(frm) { + +// }, +// }); diff --git a/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.json b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.json new file mode 100644 index 00000000..1eacc738 --- /dev/null +++ b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.json @@ -0,0 +1,81 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "hash", + "creation": "2023-09-14 12:44:51.098956", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "column_break_htdc", + "reference_doctype", + "reference_docname", + "date", + "column_break_merq", + "start_time", + "end_time", + "duration" + ], + "fields": [ + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Reference DocType", + "options": "DocType" + }, + { + "fieldname": "reference_docname", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Reference DocName", + "options": "reference_doctype" + }, + { + "fieldname": "column_break_merq", + "fieldtype": "Column Break" + }, + { + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date" + }, + { + "fieldname": "start_time", + "fieldtype": "Time", + "in_list_view": 1, + "label": "Start Time" + }, + { + "fieldname": "duration", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Duration" + }, + { + "fieldname": "column_break_htdc", + "fieldtype": "Column Break" + }, + { + "fieldname": "end_time", + "fieldtype": "Time", + "in_list_view": 1, + "label": "End Time" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2023-09-15 10:35:40.642660", + "modified_by": "Administrator", + "module": "LMS", + "name": "LMS Batch Timetable", + "naming_rule": "Random", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.py b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.py new file mode 100644 index 00000000..257896a6 --- /dev/null +++ b/lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class LMSBatchTimetable(Document): + pass diff --git a/lms/lms/doctype/lms_batch_timetable/test_lms_batch_timetable.py b/lms/lms/doctype/lms_batch_timetable/test_lms_batch_timetable.py new file mode 100644 index 00000000..68754a5f --- /dev/null +++ b/lms/lms/doctype/lms_batch_timetable/test_lms_batch_timetable.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestLMSBatchTimetable(FrappeTestCase): + pass diff --git a/lms/lms/doctype/lms_live_class/lms_live_class.json b/lms/lms/doctype/lms_live_class/lms_live_class.json index 1e68dbfc..af87c823 100644 --- a/lms/lms/doctype/lms_live_class/lms_live_class.json +++ b/lms/lms/doctype/lms_live_class/lms_live_class.json @@ -126,7 +126,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-03-14 18:44:48.813103", + "modified": "2023-09-14 15:02:44.081474", "modified_by": "Administrator", "module": "LMS", "name": "LMS Live Class", @@ -157,8 +157,10 @@ "write": 1 } ], + "show_title_field_in_link": 1, "sort_field": "modified", "sort_order": "DESC", "states": [], + "title_field": "title", "track_changes": 1 } \ No newline at end of file diff --git a/lms/public/css/style.css b/lms/public/css/style.css index e414f449..ada6eb38 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -2352,4 +2352,69 @@ select { left: 80%; z-index: 10; width: fit-content; +} + +.toastui-calendar-milestone { + display: none; +} + +.toastui-calendar-task { + display: none; +} + +.toastui-calendar-panel-resizer { + display: none; +} + +.toastui-calendar-day-name__date { + font-size: var(--text-base) !important; +} + +.toastui-calendar-day-name__name { + font-size: var(--text-base) !important; +} + +.toastui-calendar-day-view-day-names, .toastui-calendar-week-view-day-names { + border-bottom: none !important; +} + +.toastui-calendar-layout { + border: 1px solid var(--gray-200) !important; + border-radius: var(--border-radius-md) !important; + background-color: var(--gray-100) !important; +} + +.toastui-calendar-panel .toastui-calendar-day-names.toastui-calendar-week { + border-top: none !important; +} + +.toastui-calendar-panel.toastui-calendar-time { + height: 80% !important; +} + +.toastui-calendar-panel.toastui-calendar-week-view-day-names { + background-color: var(--gray-50) !important; +} + +.toastui-calendar-allday { + border-bottom: 1px solid var(--gray-200) !important; +} + +.calendar-navigation { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 1rem; +} + +.calendar-range { + margin: 0 2rem; + font-weight: 500; + color: var(--text-color); +} + +.calendar-event-title { + font-size: var(--text-base); + font-weight: 500; + margin-top: 0.25rem; } \ No newline at end of file diff --git a/lms/www/batches/batch.html b/lms/www/batches/batch.html index b6398a26..2cf378d0 100644 --- a/lms/www/batches/batch.html +++ b/lms/www/batches/batch.html @@ -88,7 +88,7 @@