@@ -4,15 +4,30 @@
|
|||||||
<div class="text-lg text-ink-gray-9 font-semibold">
|
<div class="text-lg text-ink-gray-9 font-semibold">
|
||||||
{{ __('Upcoming Evaluations') }}
|
{{ __('Upcoming Evaluations') }}
|
||||||
</div>
|
</div>
|
||||||
<Button
|
<Button v-if="canScheduleEvals" @click="openEvalModal">
|
||||||
v-if="
|
|
||||||
upcoming_evals.data?.length != evaluationCourses.length && !forHome
|
|
||||||
"
|
|
||||||
@click="openEvalModal"
|
|
||||||
>
|
|
||||||
{{ __('Schedule Evaluation') }}
|
{{ __('Schedule Evaluation') }}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="endDate && !endDateHasPassed"
|
||||||
|
class="text-sm leading-5 bg-surface-amber-1 text-ink-amber-3 p-2 rounded-md mb-4"
|
||||||
|
>
|
||||||
|
{{ __('The last day to schedule your evaluations is ') }}
|
||||||
|
<span class="font-medium">
|
||||||
|
{{ dayjs(endDate).format('DD MMMM YYYY') }} </span
|
||||||
|
>.
|
||||||
|
{{ __('Please make sure to schedule your evaluation before this date.') }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-else-if="endDateHasPassed"
|
||||||
|
class="text-sm leading-5 bg-surface-red-1 text-ink-red-3 p-2 rounded-md mb-4"
|
||||||
|
>
|
||||||
|
{{
|
||||||
|
__(
|
||||||
|
'The deadline to schedule evaluations has passed. Please contact the Instructor for assistance.'
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
<div v-if="upcoming_evals.data?.length">
|
<div v-if="upcoming_evals.data?.length">
|
||||||
<div
|
<div
|
||||||
class="grid gap-4"
|
class="grid gap-4"
|
||||||
@@ -99,7 +114,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="text-ink-gray-5">
|
<div v-else-if="!endDateHasPassed" class="text-ink-gray-5">
|
||||||
{{ __('Schedule an evaluation to get certified.') }}
|
{{ __('Schedule an evaluation to get certified.') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -173,6 +188,18 @@ const evaluationCourses = computed(() => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const canScheduleEvals = computed(() => {
|
||||||
|
return (
|
||||||
|
upcoming_evals.data?.length != evaluationCourses.length &&
|
||||||
|
!props.forHome &&
|
||||||
|
!endDateHasPassed.value
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const endDateHasPassed = computed(() => {
|
||||||
|
return dayjs().isSameOrAfter(dayjs(props.endDate))
|
||||||
|
})
|
||||||
|
|
||||||
const cancelEvaluation = (evl) => {
|
const cancelEvaluation = (evl) => {
|
||||||
$dialog({
|
$dialog({
|
||||||
title: __('Cancel this evaluation?'),
|
title: __('Cancel this evaluation?'),
|
||||||
|
|||||||
@@ -144,20 +144,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
v-if="batch.data.evaluation_end_date && isStudent"
|
|
||||||
class="text-sm leading-5 bg-surface-amber-1 text-ink-amber-3 p-2 rounded-md mb-10"
|
|
||||||
>
|
|
||||||
{{ __('The last day to schedule your evaluations is ') }}
|
|
||||||
<span class="font-medium">
|
|
||||||
{{
|
|
||||||
dayjs(batch.data.evaluation_end_date).format('DD MMMM YYYY')
|
|
||||||
}} </span
|
|
||||||
>.
|
|
||||||
{{
|
|
||||||
__('Please make sure to schedule your evaluation before this date.')
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
<div v-if="dayjs().isSameOrAfter(dayjs(batch.data.start_date))">
|
<div v-if="dayjs().isSameOrAfter(dayjs(batch.data.start_date))">
|
||||||
<div class="text-ink-gray-7 font-semibold mb-2">
|
<div class="text-ink-gray-7 font-semibold mb-2">
|
||||||
{{ __('Feedback') }}
|
{{ __('Feedback') }}
|
||||||
|
|||||||
@@ -667,6 +667,15 @@ iframe {
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.codex-editor--narrow .ce-toolbox .ce-popover {
|
||||||
|
right: unset;
|
||||||
|
left: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ce-popover {
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.cdx-search-field {
|
.cdx-search-field {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1896,9 +1896,9 @@
|
|||||||
integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
|
integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*":
|
||||||
version "25.0.7"
|
version "25.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.7.tgz#afd2f0d34358631a287c6726dabe0c845abc2bae"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.8.tgz#e54e00f94fe1db2497b3e42d292b8376a2678c8d"
|
||||||
integrity sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w==
|
integrity sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types "~7.16.0"
|
undici-types "~7.16.0"
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-12-04 12:53:38.246250",
|
"modified": "2026-01-14 08:53:16.672825",
|
||||||
"modified_by": "sayali@frappe.io",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Batch Enrollment",
|
"name": "LMS Batch Enrollment",
|
||||||
@@ -108,6 +108,18 @@
|
|||||||
"if_owner": 1,
|
"if_owner": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"role": "LMS Student"
|
"role": "LMS Student"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Batch Evaluator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"row_format": "Dynamic",
|
"row_format": "Dynamic",
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
"grid_page_length": 50,
|
"grid_page_length": 50,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-05-21 15:58:51.667270",
|
"modified": "2026-01-14 08:53:38.088168",
|
||||||
"modified_by": "sayali@frappe.io",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Batch Feedback",
|
"name": "LMS Batch Feedback",
|
||||||
@@ -105,6 +105,30 @@
|
|||||||
"role": "LMS Student",
|
"role": "LMS Student",
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"write": 1
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Moderator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Batch Evaluator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"row_format": "Dynamic",
|
"row_format": "Dynamic",
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
"link_fieldname": "live_class"
|
"link_fieldname": "live_class"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2025-05-27 14:44:35.679712",
|
"modified": "2026-01-14 08:54:07.684781",
|
||||||
"modified_by": "sayali@frappe.io",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Live Class",
|
"name": "LMS Live Class",
|
||||||
@@ -215,6 +215,18 @@
|
|||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "LMS Student",
|
"role": "LMS Student",
|
||||||
"share": 1
|
"share": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Batch Evaluator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"row_format": "Dynamic",
|
"row_format": "Dynamic",
|
||||||
|
|||||||
@@ -155,11 +155,17 @@ def create_attendance(live_class, data):
|
|||||||
doc = frappe.new_doc("LMS Live Class Participant")
|
doc = frappe.new_doc("LMS Live Class Participant")
|
||||||
doc.live_class = live_class.name
|
doc.live_class = live_class.name
|
||||||
doc.member = participant.get("user_email")
|
doc.member = participant.get("user_email")
|
||||||
doc.joined_at = participant.get("join_time")
|
doc.joined_at = get_datetime(participant.get("join_time"))
|
||||||
doc.left_at = participant.get("leave_time")
|
doc.left_at = get_datetime(participant.get("leave_time"))
|
||||||
doc.duration = participant.get("duration")
|
doc.duration = get_minutes(participant.get("duration"))
|
||||||
doc.insert()
|
doc.insert()
|
||||||
|
|
||||||
|
|
||||||
def update_attendees_count(live_class, data):
|
def update_attendees_count(live_class, data):
|
||||||
frappe.db.set_value("LMS Live Class", live_class.name, "attendees", len(data))
|
frappe.db.set_value("LMS Live Class", live_class.name, "attendees", len(data))
|
||||||
|
|
||||||
|
|
||||||
|
def get_minutes(duration_in_seconds):
|
||||||
|
if duration_in_seconds:
|
||||||
|
return int(duration_in_seconds) // 60
|
||||||
|
return 0
|
||||||
|
|||||||
@@ -89,8 +89,8 @@
|
|||||||
"grid_page_length": 50,
|
"grid_page_length": 50,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-05-27 22:32:24.196643",
|
"modified": "2026-01-14 08:54:21.421321",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Live Class Participant",
|
"name": "LMS Live Class Participant",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
@@ -106,6 +106,30 @@
|
|||||||
"role": "System Manager",
|
"role": "System Manager",
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"write": 1
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Moderator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Batch Evaluator",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"row_format": "Dynamic",
|
"row_format": "Dynamic",
|
||||||
|
|||||||
+1
-1
@@ -66,4 +66,4 @@ indent-style = "tab"
|
|||||||
docstring-code-format = true
|
docstring-code-format = true
|
||||||
|
|
||||||
[tool.bench.frappe-dependencies]
|
[tool.bench.frappe-dependencies]
|
||||||
frappe = ">=15.0.0,<17.0.0"
|
frappe = ">=15.0.0,<17.0.0-dev"
|
||||||
Reference in New Issue
Block a user