+
{{ 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()