diff --git a/frontend/src/components/Modals/LiveClassModal.vue b/frontend/src/components/Modals/LiveClassModal.vue index ac2ee3fe..74a3fc74 100644 --- a/frontend/src/components/Modals/LiveClassModal.vue +++ b/frontend/src/components/Modals/LiveClassModal.vue @@ -29,14 +29,12 @@ :label="__('Date')" :required="true" /> - - - +
{ }, onError(err) { toast.error(err.messages?.[0] || err) + console.error(err) }, }) } diff --git a/frontend/src/components/UpcomingEvaluations.vue b/frontend/src/components/UpcomingEvaluations.vue index 86385b50..973340b6 100644 --- a/frontend/src/components/UpcomingEvaluations.vue +++ b/frontend/src/components/UpcomingEvaluations.vue @@ -64,13 +64,13 @@
-
+
{{ dayjs(evl.date).format('DD MMMM YYYY') }}
-
+
{{ formatTime(evl.start_time) }} diff --git a/frontend/src/pages/Batches/BatchForm.vue b/frontend/src/pages/Batches/BatchForm.vue index d10424e9..aa71bedb 100644 --- a/frontend/src/pages/Batches/BatchForm.vue +++ b/frontend/src/pages/Batches/BatchForm.vue @@ -419,9 +419,16 @@ watch( () => batchDetail.doc, () => { if (!batchDetail.doc) return - getMetaInfo('batches', batchDetail.doc?.name, meta) + + if (originalDoc.value) { + isDirty.value = + JSON.stringify(batchDetail.doc) !== JSON.stringify(originalDoc.value) + } + updateBatchData() - } + getMetaInfo('batches', batchDetail.doc?.name, meta) + }, + { deep: true } ) const updateBatchData = () => { @@ -499,17 +506,6 @@ const updateBatch = () => { ) } -watch( - () => batchDetail.doc, - () => { - if (originalDoc.value) { - isDirty.value = - JSON.stringify(batchDetail.doc) !== JSON.stringify(originalDoc.value) - } - }, - { deep: true } -) - const deleteBatch = () => { $dialog({ title: __('Confirm your action to delete'), diff --git a/frontend/src/pages/Batches/components/NewBatchModal.vue b/frontend/src/pages/Batches/components/NewBatchModal.vue index 9402a1ca..2b331cae 100644 --- a/frontend/src/pages/Batches/components/NewBatchModal.vue +++ b/frontend/src/pages/Batches/components/NewBatchModal.vue @@ -180,10 +180,12 @@ const onInstructorCreated = (user: any) => { const validateFields = () => { batch.value.description = sanitizeHTML(batch.value.description) + batch.value.batch_details = sanitizeHTML(batch.value.batch_details) Object.keys(batch.value).forEach((key) => { if ( key != 'description' && + key != 'batch_details' && typeof batch.value[key as keyof Batch] === 'string' ) { batch.value[key as keyof Batch] = escapeHTML( diff --git a/frontend/src/pages/Profile.vue b/frontend/src/pages/Profile.vue index 608e0ae2..303f6853 100644 --- a/frontend/src/pages/Profile.vue +++ b/frontend/src/pages/Profile.vue @@ -149,6 +149,7 @@ import { createResource, TabButtons, Tooltip, + toast, usePageMeta, } from 'frappe-ui' import { computed, inject, watch, ref, onMounted, watchEffect } from 'vue' @@ -279,11 +280,17 @@ const getTabButtons = () => { } const reloadUser = () => { - call('frappe.sessions.clear').then(() => { - $user.reload().then(() => { - profile.reload() + call('frappe.sessions.clear') + .then(() => { + $user.reload().then(() => { + profile.reload() + toast.success(__('Session refreshed successfully')) + }) + }) + .catch((err) => { + toast.error(__('Failed to refresh session')) + console.error(err) }) - }) } const navigateTo = (url) => { diff --git a/lms/install.py b/lms/install.py index 31ce9318..bd172e32 100644 --- a/lms/install.py +++ b/lms/install.py @@ -7,6 +7,7 @@ def after_install(): create_batch_source() give_discussions_permission() give_user_list_permission() + give_event_permission() def after_sync(): @@ -189,8 +190,22 @@ def give_user_list_permission(): create_role(doctype, "System Manager", 1) -def create_role(doctype, role, permlevel): +def give_event_permission(): + doctype = "Event" + roles = ["Moderator", "Batch Evaluator"] + for role in roles: + permlevel = 0 + create_role(doctype, role, permlevel, 1, 1) + create_role(doctype, "System Manager", 0, 1, 1) + + +def create_role(doctype, role, permlevel, write=0, create=0): if not frappe.db.exists("Custom DocPerm", {"parent": doctype, "role": role, "permlevel": permlevel}): + if not write and not create: + if role in ["Moderator", "System Manager"]: + write = 1 + if role == "Moderator": + create = 1 doc = frappe.new_doc("Custom DocPerm") doc.update( { @@ -198,8 +213,9 @@ def create_role(doctype, role, permlevel): "parent": doctype, "role": role, "read": 1, - "write": 1 if role in ["Moderator", "System Manager"] else 0, - "create": 1 if role == "Moderator" else 0, + "select": 1, + "write": write, + "create": create, "permlevel": permlevel, } ) diff --git a/lms/lms/doctype/lms_settings/lms_settings.json b/lms/lms/doctype/lms_settings/lms_settings.json index 3bdce8ee..fd1136cd 100644 --- a/lms/lms/doctype/lms_settings/lms_settings.json +++ b/lms/lms/doctype/lms_settings/lms_settings.json @@ -445,7 +445,7 @@ "label": "Contact Us URL" }, { - "default": "0", + "default": "1", "fieldname": "certifications", "fieldtype": "Check", "label": "Certifications" @@ -512,7 +512,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-03-10 18:18:51.733955", + "modified": "2026-03-18 15:32:56.259783", "modified_by": "sayali@frappe.io", "module": "LMS", "name": "LMS Settings", diff --git a/lms/patches.txt b/lms/patches.txt index 4ce25b76..9f73a032 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -121,4 +121,5 @@ lms.patches.v2_0.give_user_list_permission #11-02-2026 lms.patches.v2_0.rename_badge_assignment_event lms.patches.v2_0.enable_allow_job_posting lms.patches.v2_0.set_conferencing_provider_for_zoom -lms.patches.v2_0.sync_evaluator_roles \ No newline at end of file +lms.patches.v2_0.sync_evaluator_roles +lms.patches.v2_0.give_event_permission #10-03-2026 \ No newline at end of file diff --git a/lms/patches/v2_0/give_event_permission.py b/lms/patches/v2_0/give_event_permission.py new file mode 100644 index 00000000..18198552 --- /dev/null +++ b/lms/patches/v2_0/give_event_permission.py @@ -0,0 +1,5 @@ +from lms.install import give_event_permission + + +def execute(): + give_event_permission()