648 lines
17 KiB
HTML
648 lines
17 KiB
HTML
{% extends "lms/templates/lms_base.html" %}
|
|
{% block title %}
|
|
{{ _(batch_info.title) }}
|
|
{% endblock %}
|
|
|
|
|
|
{% block page_content %}
|
|
<div class="common-page-style lms-page-style">
|
|
<div class="container">
|
|
{{ BreadCrumb(batch_info) }}
|
|
<div class="">
|
|
{{ BatchDetails(batch_info) }}
|
|
{{ BatchSections(batch_info, batch_courses, batch_students, flow) }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
|
|
<!-- BreadCrumb -->
|
|
{% macro BreadCrumb(batch_info) %}
|
|
<div class="breadcrumb">
|
|
<a class="dark-links" href="/batches">{{ _("All Batches") }}</a>
|
|
<img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg">
|
|
<a class="dark-links" href="/batches/details/{{ batch_info.name }}">{{ _("Batch Details") }}</a>
|
|
<img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg">
|
|
<span class="breadcrumb-destination">{{ batch_info.title }}</span>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
|
|
<!-- Batch Details -->
|
|
{% macro BatchDetails(batch_info) %}
|
|
<div class="class-details" data-batch="{{ batch_info.name }}">
|
|
|
|
<div class="page-title">
|
|
{{ batch_info.title }}
|
|
</div>
|
|
|
|
{% if batch_info.description %}
|
|
<div class="mb-4">
|
|
{{ batch_info.description }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="vertically-center">
|
|
<div class="">
|
|
<svg class="icon icon-sm">
|
|
<use href="#icon-calendar"></use>
|
|
</svg>
|
|
<span>
|
|
{{ frappe.utils.format_date(batch_info.start_date, "long") }} -
|
|
</span>
|
|
<span>
|
|
{{ frappe.utils.format_date(batch_info.end_date, "long") }}
|
|
</span>
|
|
</div>
|
|
|
|
<span class="seperator"></span>
|
|
|
|
<div class="">
|
|
<svg class="icon icon-md">
|
|
<use href="#icon-education"></use>
|
|
</svg>
|
|
{{ batch_courses | length }} {{ _("Courses") }}
|
|
</div>
|
|
|
|
<span class="seperator"></span>
|
|
|
|
<div class="">
|
|
<svg class="icon icon-md">
|
|
<use href="#icon-users"></use>
|
|
</svg>
|
|
{{ batch_students | length }} {{ _("Students") }}
|
|
</div>
|
|
</div>
|
|
|
|
{% if batch_info.custom_component %}
|
|
<div class="mt-4">
|
|
{{ batch_info.custom_component }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro BatchSections(batch_info, batch_courses, batch_students, flow) %}
|
|
<div class="mt-4">
|
|
|
|
<ul class="nav lms-nav" id="batches-tab">
|
|
{% if settings.show_dashboard and is_student %}
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if is_student %} active {% endif %}" data-toggle="tab" href="#dashboard">
|
|
{{ _("Dashboard") }}
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if settings.show_courses %}
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if not is_student %} active {% endif %}" data-toggle="tab" href="#courses">
|
|
{{ _("Courses") }}
|
|
<span class="course-list-count">
|
|
{{ batch_courses | length }}
|
|
</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if show_timetable %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#timetable">
|
|
{{ _("Timetable") }}
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if is_moderator %}
|
|
{% if settings.show_students %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#students">
|
|
{{ _("Students") }}
|
|
<span class="course-list-count">
|
|
{{ batch_students | length }}
|
|
</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if settings.show_assessments %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#assessments">
|
|
{{ _("Assessments") }}
|
|
<span class="course-list-count">
|
|
{{ assessments | length }}
|
|
</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if settings.show_emails %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#emails">
|
|
{{ _("Emails") }}
|
|
<span class="course-list-count">
|
|
{{ batch_emails | length }}
|
|
</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if batch_students | length and (is_moderator or is_student) %}
|
|
{% if settings.show_discussions %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#discussions">
|
|
{{ _("Discussions") }}
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if settings.show_live_class %}
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#live-class">
|
|
{{ _("Live Class") }}
|
|
<span class="course-list-count">
|
|
{{ live_classes | length }}
|
|
</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if custom_tabs_header %}
|
|
{% include custom_tabs_header %}
|
|
{% endif %}
|
|
</ul>
|
|
|
|
<div class="border-bottom mb-4"></div>
|
|
|
|
<div class="tab-content">
|
|
|
|
{% if settings.show_dashboard and is_student %}
|
|
<div class="tab-pane {% if is_student %} active {% endif %}" id="dashboard" role="tabpanel" aria-labelledby="dashboard">
|
|
{{ Dashboard(batch_info, batch_courses, current_student) }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if settings.show_courses %}
|
|
<div class="tab-pane {% if not is_student %} active {% endif %}" id="courses" role="tabpanel" aria-labelledby="courses">
|
|
{{ CoursesSection(batch_info, batch_courses) }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if show_timetable %}
|
|
<div class="tab-pane" id="timetable" role="tabpanel" aria-labelledby="timetable">
|
|
{{ Timetable() }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if is_moderator %}
|
|
{% if settings.show_students %}
|
|
<div class="tab-pane" id="students" role="tabpanel" aria-labelledby="students">
|
|
{{ StudentsSection(batch_info, batch_students) }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if settings.show_assessments %}
|
|
<div class="tab-pane" id="assessments" role="tabpanel" aria-labelledby="assessments">
|
|
{{ AssessmentsSection(batch_info) }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if settings.show_emails %}
|
|
<div class="tab-pane" id="emails" role="tabpanel" aria-labelledby="emails">
|
|
{{ EmailsSection() }}
|
|
</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if batch_students | length and (is_moderator or is_student or is_evaluator) %}
|
|
{% if settings.show_discussions %}
|
|
<div class="tab-pane" id="discussions" role="tabpanel" aria-labelledby="discussions">
|
|
{{ Discussions(batch_info) }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if settings.show_live_class %}
|
|
<div class="tab-pane" id="live-class" role="tabpanel" aria-labelledby="live-class">
|
|
{{ LiveClassSection(batch_info, live_classes) }}
|
|
</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if custom_tabs_content %}
|
|
{% include custom_tabs_content %}
|
|
{% endif %}
|
|
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro Dashboard(batch_info, batch_courses, current_student) %}
|
|
|
|
{% set upcoming_evals = current_student.upcoming_evals %}
|
|
{% set assessments = current_student.assessments %}
|
|
{% set student = current_student %}
|
|
|
|
<div>
|
|
{% if student.name == frappe.session.user %}
|
|
<button class="btn btn-default btn-sm btn-schedule-eval ml-2 pull-right">
|
|
{{ _("Schedule Evaluation") }}
|
|
</button>
|
|
{% endif %}
|
|
|
|
<div class="mb-8">
|
|
{% include "lms/templates/upcoming_evals.html" %}
|
|
</div>
|
|
<div class="mb-8">
|
|
{% include "lms/templates/assessments.html" %}
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro Discussions(batch_info) %}
|
|
<article class="class-discussion">
|
|
{% set condition = is_moderator or is_student or is_evaluator %}
|
|
{% set doctype, docname = _("LMS Batch"), batch_info.name %}
|
|
{% set single_thread = True %}
|
|
{% set title = "Discussions" %}
|
|
{% set cta_title = "Post" %}
|
|
{% set button_name = _("Start Learning") %}
|
|
{% set redirect_to = "/batches/" + batch_info.name %}
|
|
{% set empty_state_title = _("Have a doubt?") %}
|
|
{% set empty_state_subtitle = _("Post it here, our mentors will help you out.") %}
|
|
{% include "frappe/templates/discussions/discussions_section.html" %}
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
{% macro CoursesSection(batch_info, batch_courses) %}
|
|
<article>
|
|
<header class="mb-5">
|
|
<div class="edit-header">
|
|
<div class="bold-heading">
|
|
{{ _("Courses") }}
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
{% if batch_courses | length %}
|
|
<div class="cards-parent">
|
|
{% for course in batch_courses %}
|
|
<div class="h-100">
|
|
{{ widgets.CourseCard(course=course, read_only=False) }}
|
|
</div>
|
|
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<div class="">
|
|
{{ _("No courses") }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro StudentsSection(batch_info, batch_students) %}
|
|
<article>
|
|
<header>
|
|
<div class="edit-header mb-5">
|
|
<div class="bold-heading">
|
|
{{ _("Students") }}
|
|
</div>
|
|
{% if is_moderator %}
|
|
<button class="btn btn-default btn-sm btn-add-student">
|
|
{{ _("Add Students") }}
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</header>
|
|
|
|
{% if batch_students | length %}
|
|
<div class="form-grid">
|
|
<div class="grid-heading-row">
|
|
<div class="grid-row">
|
|
<div class="data-row row">
|
|
<div class="col grid-static-col">
|
|
{{ _("Full Name") }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ _("Courses Completed") }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ _("Assessments Completed") }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ _("Assessments Graded") }}
|
|
</div>
|
|
<div class="col grid-static-col">
|
|
{{ _("Last Active") }}
|
|
</div>
|
|
{% if is_moderator %}
|
|
<div class="col grid-static-col col-xs-1">
|
|
<svg class="icon icon-sm" style="filter: opacity(0.5)">
|
|
<use class="" href="#icon-setting-gear"></use>
|
|
</svg>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% for student in batch_students %}
|
|
{% set allow_progress = is_moderator or is_evaluator %}
|
|
<div class="grid-row">
|
|
<div class="data-row row">
|
|
<a class="col grid-static-col button-links {% if allow_progress %} clickable {% endif %}" {% if allow_progress %} href="/batches/{{ batch_info.name }}/students/{{ student.username }}" {% endif %}>
|
|
{{ student.student_name }}
|
|
</a>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ student.courses_completed }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ student.assessments_completed }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-2 text-right">
|
|
{{ student.assessments_graded }}
|
|
</div>
|
|
<div class="col grid-static-col">
|
|
{{ frappe.utils.pretty_date(student.last_active) }}
|
|
</div>
|
|
{% if is_moderator %}
|
|
<div type="button" class="col grid-static-col col-xs-1 btn-remove-student" data-student="{{ student.student }}">
|
|
<svg class="icon icon-sm">
|
|
<use href="#icon-delete"></use>
|
|
</svg>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted mt-3"> {{ _("No Students") }} </p>
|
|
{% endif %}
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro AssessmentsSection(batch_info) %}
|
|
<article>
|
|
<header class="edit-header mb-5">
|
|
<div class="bold-heading">
|
|
{{ _("Assessments") }}
|
|
</div>
|
|
{% if is_moderator %}
|
|
<button class="btn btn-default btn-sm" id="open-assessment-modal">
|
|
{{ _("Manage Assessments") }}
|
|
</button>
|
|
{% endif %}
|
|
</header>
|
|
{{ AssessmentList(assessments) }}
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro EmailsSection() %}
|
|
<div class="my-4">
|
|
<button class="btn btn-secondary btn-sm btn-email">
|
|
{{ _("Email to Students") }}
|
|
</button>
|
|
</div>
|
|
<div>
|
|
{% for email in batch_emails %}
|
|
<div class="frappe-card mb-5">
|
|
<div class="flex justify-between m-1">
|
|
<span class="text-color flex">
|
|
<span class="margin-right">
|
|
{% set member = frappe.db.get_value("User", email.sender, ["full_name", "username", "name", "user_image"], as_dict=1) %}
|
|
{{ widgets.Avatar(member=member, avatar_class="avatar-small") }}
|
|
</span>
|
|
<span>
|
|
{{ member.full_name }}
|
|
<div class="text-muted">
|
|
<span class="frappe-timestamp" data-timestamp="{{ email.communication_date }}" title="{{ communication_date }}">
|
|
{{ frappe.utils.pretty_date(email.communication_date) }}
|
|
</span>
|
|
</div>
|
|
</span>
|
|
</span>
|
|
</div>
|
|
<div class="ml-10">
|
|
{{ email.content }}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro AssessmentList(assessments) %}
|
|
{% if assessments | length %}
|
|
<div class="form-grid">
|
|
<div class="grid-heading-row">
|
|
<div class="grid-row">
|
|
<div class="row data-row">
|
|
<div class="col grid-static-col">
|
|
{{ _("Title") }}
|
|
</div>
|
|
<div class="col grid-static-col">
|
|
{{ _("Type") }}
|
|
</div>
|
|
<div class="col grid-static-col col-xs-1">
|
|
<svg class="icon icon-sm" style="filter: opacity(0.5)">
|
|
<use href="#icon-setting-gear"></use>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid-body">
|
|
<div class="rows">
|
|
{% for assessment in assessments %}
|
|
<div class="grid-row">
|
|
<div class="row data-row">
|
|
<a class="col grid-static-col clickable" href="{{ assessment.edit_url }}">
|
|
{{ assessment.title }}
|
|
</a>
|
|
<div class="col grid-static-col">
|
|
{{ assessment.assessment_type.split("LMS ")[1] }}
|
|
</div>
|
|
<div type="button" class="col grid-static-col col-xs-1 btn-remove-assessment" data-assessment="{{ assessment.assessment_name }}">
|
|
<svg class="icon icon-sm">
|
|
<use href="#icon-delete"></use>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted mt-3"> {{ _("No Assessments") }} </p>
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro LiveClassSection(batch_info, live_classes) %}
|
|
<article>
|
|
<header class="edit-header">
|
|
<div class="bold-heading">
|
|
{{ _("Live Class") }}
|
|
</div>
|
|
{% if is_moderator %}
|
|
<button class="btn btn-default btn-sm" id="open-class-modal">
|
|
{{ _("Create a Live Class") }}
|
|
</button>
|
|
{% endif %}
|
|
</header>
|
|
{{ CreateLiveClass(batch_info) }}
|
|
{{ LiveClassList(batch_info, live_classes) }}
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro CreateLiveClass(batch_info) %}
|
|
{% if is_moderator %}
|
|
<div class="modal fade live-class-modal" id="live-class-modal" tabindex="-1" role="dialog">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<div class="modal-title">{{ _("Live Class Details") }}</div>
|
|
</div>
|
|
|
|
|
|
<div class="modal-body">
|
|
<form class="live-class-form" id="live-class-form"></form>
|
|
</div>
|
|
|
|
|
|
<div class="modal-footer">
|
|
<button class="btn btn-secondary btn-sm mr-2" data-dismiss="modal" aria-label="Close">
|
|
{{ _("Discard") }}
|
|
</button>
|
|
|
|
<button class="btn btn-primary btn-sm" id="create-live-class">
|
|
{{ _("Submit") }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro LiveClassList(batch_info, live_classes) %}
|
|
<div class="lms-card-parent mt-5">
|
|
{% if live_classes | length %}
|
|
{% for class in live_classes %}
|
|
<div class="common-card-style column-card">
|
|
|
|
<div class="mb-0">
|
|
<div class="dropdown pull-right">
|
|
<svg class="icon icon-sm dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
<use href="#icon-dot-horizontal"></use>
|
|
</svg>
|
|
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
|
{% if class.owner == frappe.session.user %}
|
|
<li>
|
|
<a class="dropdown-item small" href="{{ class.start_url }}"> {{ _("Start") }} </a>
|
|
</li>
|
|
{% endif %}
|
|
{% if is_student %}
|
|
<li>
|
|
<a class="dropdown-item small" href="{{ class.join_url }}"> {{ _("Join") }} </a>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
<div class="bold-heading mb-4">
|
|
{{ class.title }}
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<svg class="icon icon-sm">
|
|
<use href="#icon-calendar"></use>
|
|
</svg>
|
|
{{ frappe.utils.format_date(class.date, "full") }}
|
|
</div>
|
|
<div>
|
|
<svg class="icon icon-sm">
|
|
<use href="#icon-clock"></use>
|
|
</svg>
|
|
{{ frappe.utils.format_time(class.time, "hh:mm a") }}
|
|
</div>
|
|
|
|
<div class="mt-4">
|
|
{{ class.description }}
|
|
</div>
|
|
|
|
</div>
|
|
{% endfor %}
|
|
{% else %}
|
|
<p class=""> {{ _("No Live Classes") }} </p>
|
|
{% endif %}
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro Timetable() %}
|
|
<article>
|
|
<header class="edit-header mb-5">
|
|
<div class="bold-heading">
|
|
{{ _("Timetable") }}
|
|
</div>
|
|
</header>
|
|
<div class="calendar-navigation">
|
|
<button class="btn icon-btn btn-default" id="prev-week">
|
|
<svg class="icon icon-md">
|
|
<use href="#icon-left"></use>
|
|
</svg>
|
|
</button>
|
|
<span class="calendar-range"></span>
|
|
<button class="btn icon-btn btn-default" id="next-week">
|
|
<svg class="icon icon-md">
|
|
<use href="#icon-right"></use>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
<div class="calendar-legends">
|
|
{% for legend in legends %}
|
|
<div class="legend-item">
|
|
<div class="legend-color" style="background-color: {{ legend.color }}"></div>
|
|
<div class="legend-text">{{ legend.label }}</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
<div id="calendar" class="timetable-calendar" style="height: 700px"
|
|
data-start="{{ batch_info.start_time }}" data-end="{{ batch_info.end_time }}">
|
|
</div>
|
|
|
|
</article>
|
|
{% endmacro %}
|
|
|
|
{%- block script %}
|
|
{{ super() }}
|
|
{% if batch_info.custom_script %}
|
|
<script>
|
|
{{ batch_info.custom_script }}
|
|
</script>
|
|
{% endif %}
|
|
|
|
<script>
|
|
frappe.boot.single_types = []
|
|
let courses = {{ course_list | json }};
|
|
const legends = {{ legends | json }};
|
|
const allow_future = {{ batch_info.allow_future }};
|
|
const is_student = "{{ is_student or '' }}";
|
|
const evaluation_end_date = "{{ batch_info.evaluation_end_date if batch_info.evaluation_end_date else '' }}"
|
|
</script>
|
|
|
|
<link rel="stylesheet" href="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.css" />
|
|
<script src="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.js"></script>
|
|
{% endblock %} |