Few UI fixes

This commit is contained in:
papi 2024-01-16 17:33:06 +03:00
parent a844a45935
commit 2531758ab5
16 changed files with 293 additions and 564 deletions

View File

@ -2,7 +2,9 @@
- **Add and Drop**:
- The add and drop page should only include courses offered by the department head.
- Add and drop should be restricted by the school calendar.
- Add and drop date should be restricted by the school calendar.
- **Auto generate username and password when adding students and lecturers**
- Instead of filling the username and password for the student/lecturer, the system should automatically generate them and send to the student's/lecturer's email.
- **Payment integration**:
- Integrating PayPal and Stripe for students to pay their fees.
- **Integrate the dashboard with dynamic/live data**:

View File

@ -15,46 +15,17 @@
<h4 class="fw-bold mb-3"><i class="fas fa-chalkboard-teacher me-2"></i>Lecturer Add Form</h4>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
<form action="" method="POST">{% csrf_token %}
<div class="row mb-3">
<div class="col-md-6">
<div class="card">
<p class="form-title">Login Info</p>
<div class="p-2">
<div class="form-group">
<b>ID No.</b>{{ form.username }}
<span class="danger">{{ form.username.errors }}</span>
<p class="text-muted-xs">Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.</p>
</div>
<div class="form-group">
<b>{{ form.password1.label }}</b>{{ form.password1 }}
<span class="danger">{{ form.password1.errors }}</span>
<p class="text-muted-xs">
The password can't be too similar to other personal information.<br>
The password must contain at least 8 characters.<br>
The password can't be a commonly used password.<br>
The password can't be entirely numeric.
</p>
</div>
<div class="form-group">
<b>{{ form.password2.label }}</b>{{ form.password2 }}
<span class="danger">{{ form.password2.errors }}</span>
<p class="text-muted-xs">Enter the same password as before, for verification.</p>
</div>
<div class="card-body">
{{ form.username|as_crispy_field }}
{{ form.password1|as_crispy_field }}
{{ form.password2|as_crispy_field }}
</div>
</div>
</div>
@ -62,26 +33,11 @@
<div class="card">
<p class="form-title">Personal Info</p>
<div class="p-2">
<div class="form-group">
<b>{{ form.first_name.label }}</b>{{ form.first_name }}
<span class="danger">{{ form.first_name.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.last_name.label }}</b>{{ form.last_name }}
<span class="danger">{{ form.last_name.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.email.label }}</b>{{ form.email }}
<span class="danger">{{ form.email.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.address.label }}</b>{{ form.address }}
<span class="danger">{{ form.address.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.phone.label }}</b>{{ form.phone }}
<span class="danger">{{ form.phone.errors }}</span>
</div>
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.address|as_crispy_field }}
{{ form.phone|as_crispy_field }}
</div>
</div>
</div>

View File

@ -15,97 +15,42 @@
<h4 class="mb-3 fw-bold"><i class="fas fa-user-graduate me-2"></i>Student Add Form</h4>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
<form action="" method="POST">{% csrf_token %}
<div class="row mb-3">
<div class="col-md-6">
<div class="card">
<p class="form-title">Login Info</p>
<p class="form-title">Login Info</p>
<div class="p-3">
<div class="form-group">
<b>ID No.</b>{{ form.username }}
<span class="danger">{{ form.username.errors }}</span>
<p class="text-muted-xs">Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.</p>
<div class="card-body">
{{ form.username|as_crispy_field }}
{{ form.password1|as_crispy_field }}
{{ form.password2|as_crispy_field }}
</div>
<div class="form-group">
<b>{{ form.password1.label }}</b>{{ form.password1 }}
<span class="danger">{{ form.password1.errors }}</span>
<p class="text-muted-xs">
The password can't be too similar to other personal information.<br>
The password must contain at least 8 characters.<br>
The password can't be a commonly used password.<br>
The password can't be entirely numeric.
</p>
</div>
<div class="form-group">
<b>{{ form.password2.label }}</b>{{ form.password2 }}
<span class="danger">{{ form.password2.errors }}</span>
<p class="text-muted-xs">Enter the same password as before, for verification.</p>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<p class="form-title">Personal Info</p>
<div class="container">
<div class="form-group">
<b>{{ form.first_name.label }}</b>{{ form.first_name }}
<span class="danger">{{ form.first_name.errors }}</span>
<p class="form-title">Personal Info</p>
<div class="card-body">
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.address|as_crispy_field }}
{{ form.phone|as_crispy_field }}
</div>
<div class="form-group">
<b>{{ form.last_name.label }}</b>{{ form.last_name }}
<span class="danger">{{ form.last_name.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.email.label }}</b>{{ form.email }}
<span class="danger">{{ form.email.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.address.label }}</b>{{ form.address }}
<span class="danger">{{ form.address.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.phone.label }}</b>{{ form.phone }}
<span class="danger">{{ form.phone.errors }}</span>
</div>
</div>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6 mr-auto">
<div class="card">
<p class="form-title">Others</p>
<div class="p-3">
<div class="form-group">
<b>{{ form.program.label }}</b>{{ form.program }}
<span class="danger">{{ form.program.errors }}</span>
<p class="form-title">Others</p>
<div class="card-body">
{{ form.program|as_crispy_field }}
{{ form.level|as_crispy_field }}
</div>
<div class="form-group">
<b>{{ form.level.label }}</b>{{ form.level }}
<span class="danger">{{ form.level.errors }}</span>
</div>
</div>
</div>
</div>
</div>

View File

@ -15,19 +15,7 @@
</ol>
</nav>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
<div class="row">

View File

@ -1,9 +1,13 @@
{% extends 'base.html' %}
{% block title %} {{ title }} | Learning management system{% endblock title %}
{% load static %}
{% load i18n %}
{% block content %}
{% if user.is_authenticated %}
<nav style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/">Home</a></li>
@ -11,104 +15,111 @@
</ol>
</nav>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
{% if request.user.is_superuser %}
<div class="btn-flex">
{% if user.is_student %}
<a class="edit-btn" href="{% url 'student_edit' pk=user.id %}">
<i class="fas fa-user-edit"></i><span class="mobile-hide">Edit Profile</span>
</a>
{% endif %}
{% if user.is_lecturer %}
<a class="edit-btn" href="{% url 'staff_edit' pk=user.id %}">
<i class="fas fa-user-edit"></i><span class="mobile-hide">Edit Profile</span>
</a>
{% endif %}
<!-- <a class="edit-btn" href="{% url 'change_password' %}"><i class="fas fa-lock"></i><span class="mobile-hide">
Change password</span>
</a> -->
</div>
{% endif %}
<div class="row justify-content-between">
<div class="row">
<div class="col-md-3 mx-auto">
<div class="card">
<img src="{{ user.get_picture }}" class="dashboard-img">
<div class="program-description">
<p><strong>Last login: </strong>{{ user.last_login|date }}</p>
<p><strong>Full Name: </strong>{{ user.get_full_name|title }}</p>
<p><strong>Role: </strong>{{ user_type }}
</p>
<div class="card p-2">
<div class="text-center">
<img src="{{ user.picture.url }}" class="w-100">
<ul class="px-2 list-unstyled">
<li>{{ user.get_full_name|title }}</li>
<li><strong>Last login: </strong>{{ user.last_login|date }}</li>
<li><strong>Role: </strong>
{{ user.get_user_role }}
</li>
</ul>
</div>
<hr>
{% if request.user.is_superuser %}
<div class="btn-flex">
{% if user.is_student %}
<a class="edit-btn" href="{% url 'student_edit' pk=user.id %}">
<i class="fas fa-user-edit"></i><span class="mobile-hide">Edit Profile</span>
</a>
{% endif %}
{% if user.is_lecturer %}
<a class="edit-btn" href="{% url 'staff_edit' pk=user.id %}">
<i class="fas fa-user-edit"></i><span class="mobile-hide">Edit Profile</span>
</a>
{% endif %}
</div>
{% endif %}
</div>
</div>
<div class="col-md-6">
<div class="col-md-9 mx-auto">
<div class="card">
{% if user.is_lecturer %}
<p class="form-title"><i class="fas fa-book-open"></i>My Courses</p>
<div class="dashboard-description">
{% if courses %}
<div class="flex">
{% for course in courses %}
<div class="flex"><a class="edit-btn" href="{{ course.get_absolute_url }}">{{ course }}</a></div>
{% endfor %}
<div class="card-body">
<!-- {% if user.is_student %}
<p class="form-title"><i class="fas fa-book-open"></i>Enrolled Courses</p>
<div class="dashboard-description">
{% if courses %}
<div class="flex">
{% for course in courses %}
<div class="flex"><a class="edit-btn" href="{{ course.get_absolute_url }}">{{ course }}</a></div>
{% endfor %}
</div>
{% else %}
<div class="text-danger"><i class="far fa-frown"></i>No courses!</div>
{% endif %}
</div>
{% endif %} -->
{% if user.is_lecturer %}
<p class="fw-bold"><i class="fas fa-book-open"></i> My Courses</p>
{% if courses %}
<ul>
{% for course in courses %}
<li><a href="{{ course.get_absolute_url }}">{{ course }}</a></li>
{% endfor %}
</ul>
{% else %}
<div class="text-danger">No courses!</div>
<div class="text-danger">No courses assigned!</div>
{% endif %}
</div>
{% endif %}
<p class="title-info"><i class="fas fa-user"></i>Personal Info</p>
<div class="dashboard-description">
<p><strong>First Name:</strong> {{ user.first_name|title }}</p>
<p><strong>Last Name:</strong> {{ user.last_name|title }}</p>
<p><strong>ID No.:</strong> {{ user.username }}</p>
</div>
{% if user.is_student %}
<p class="title-info"><i class="fas fa-graduation-cap"></i>Applicant Info</p>
<div class="dashboard-description">
<p><strong>School: </strong>{{ student.get_student_school }}</p>
<p><strong>Program: </strong>{{ student.program }}</p>
<p><strong>Level: </strong>{{ student.level }}</p>
</div>
{% endif %}
<p class="title-info"><i class="fas fa-phone-square-alt"></i>Contact Info</p>
<div class="dashboard-description">
<p><strong>Email:</strong> {{ user.email }}</p>
<p><strong>Tel No.:</strong> {{ user.phone }}</p>
<p><strong>Address/city:</strong> {{ user.address }}</p>
</div>
<p class="title-info"><i class="fa fa-calendar-day"></i>Important Dates</p>
<div class="dashboard-description">
<p><strong>Last login:</strong> {{ user.last_login }}</p>
{% if current_semester and current_session %}
<p><strong>Academic Year:</strong> {{ current_semester }} Semester {{ current_session }}</p>
<hr>
{% endif %}
<p><strong>Registered Date:</strong> {{ user.date_joined|date }}</p>
</div>
<p class="fw-bold"><i class="fas fa-user"></i> Personal Info</p>
<div class="dashboard-description">
<p><strong>First Name:</strong> {{ user.first_name|title }}</p>
<p><strong>Last Name:</strong> {{ user.last_name|title }}</p>
<p><strong>ID No.:</strong> {{ user.username }}</p>
</div>
{% if user.is_student %}
<hr>
<p class="fw-bold"><i class="fas fa-graduation-cap"></i> Applicant Info</p>
<div class="dashboard-description">
<p><strong>School: </strong>Hawas Preparatory School</p>
<p><strong>Level: </strong>{{ level.level }}</p>
</div>
{% endif %}
<hr>
<p class="fw-bold"><i class="fas fa-phone-square-alt"></i> Contact Info</p>
<div class="dashboard-description">
<p><strong>Email:</strong> {{ user.email }}</p>
<p><strong>Tel No.:</strong> {{ user.phone }}</p>
<p><strong>Address/city:</strong> {{ user.address }}</p>
</div>
<hr>
<p class="fw-bold"><i class="fa fa-calendar-day"></i> Important Dates</p>
<div class="dashboard-description">
<p><strong>Last login:</strong> {{ user.last_login }}</p>
{% if current_semester and current_session %}
<p><strong>Academic Year:</strong> {{ current_semester }} Semester {{ current_session }}</p>
{% endif %}
<p><strong>Registered Date:</strong> {{ user.date_joined|date }}</p>
</div>
</div>
</div>
</div>
<div class="col-md-3 mx-auto"></div>
</div>
{% endif %}
{% endblock content %}

View File

@ -13,82 +13,39 @@
</ol>
</nav>
<div class="title-1">Course Add &amp; Update Form</div>
<div class="title-1">Course Form</div>
<br>
<br>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
<form action="" method="POST">{% csrf_token %}
<div class="row">
<div class="col-md-6">
<div class="card">
<p class="form-title">Course Info</p>
<p class="form-title">Course Detail</p>
<div class="p-3">
<div class="form-group">
<b>{{ form.title.label }}</b>{{ form.title }}
<span class="danger">{{ form.title.errors }}</span>
<p class="text-muted-xs">Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.</p>
</div>
<div class="form-group">
<b>{{ form.code.label }}</b>{{ form.code }}
<span class="danger">{{ form.code.errors }}</span>
<p class="text-muted-xs">The course code must be similar to only the pre requests.</p>
</div>
<div class="form-group">
<b>{{ form.summary.label }}</b>(optional){{ form.summary }}
<span class="danger">{{ form.summary.errors }}</span>
<p class="text-muted-xs">Enter some description about the course.</p>
</div>
{{ form.title|as_crispy_field }}
{{ form.code|as_crispy_field }}
{{ form.summary|as_crispy_field }}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<p class="form-title">Applicant Info</p>
<p class="form-title">Other Info</p>
<div class="p-3">
<div class="form-group">
<b>{{ form.program.label }}</b>{{ form.program }}
<span class="danger">{{ form.program.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.credit.label }}</b>{{ form.credit }}
<span class="danger">{{ form.credit.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.year.label }}</b>{{ form.year }}
<span class="danger">{{ form.year.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.semester.label }}</b>{{ form.semester }}
<span class="danger">{{ form.semester.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.level.label }}</b>{{ form.level }}
<span class="danger">{{ form.level.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.is_elective.label }}</b>{{ form.is_elective }}
<span class="danger">{{ form.is_elective.errors }}</span>
</div>
{{ form.program|as_crispy_field }}
{{ form.credit|as_crispy_field }}
{{ form.year|as_crispy_field }}
{{ form.semester|as_crispy_field }}
{{ form.level|as_crispy_field }}
{{ form.is_elective|as_crispy_field }}
</div>
</div>
</div>
</div>
<center><input class="btn btn-outline-primary mt-3" type="submit" value="Save"></center>
<input class="btn btn-primary mt-3" type="submit" value="Save">
</form>
{% endblock content %}

View File

@ -13,19 +13,7 @@
</ol>
</nav>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
<div class="row">
<div class="col-md-6 mx-auto">
@ -33,18 +21,8 @@
<p class="form-title">Program Add Form</p>
<div class="p-3"><br>
<form action="" method="POST">{% csrf_token %}
<!-- {{ form|crispy }} -->
<div class="form-group">
<b>{{ form.title.label }}</b>{{ form.title }}
<span class="danger">{{ form.title.errors }}</span>
</div>
<div class="form-group">
<b>{{ form.summary.label }}</b>{{ form.summary }}
<span class="danger">{{ form.summary.errors }}</span>
</div>
<input class="btn btn-outline-primary" type="submit" value="Save">
{{ form|crispy }}
<input class="btn btn-primary" type="submit" value="Save">
</form>
</div>
</div>

View File

@ -17,53 +17,12 @@
{% endif %}
<div class="title-1"><i class="fas fa-book-open"></i>Program List</div>
<br><br>
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% include 'snippets/messages.html' %}
{% include 'snippets/filter_form.html' %}
<div class="content-center">
<form class="search-form mx-auto" action="" method="GET">
{{ filter.form }}
<button class="btn btn-light" type="submit">
<i class="fas fa-search"></i> Filter
</button>
</form>
</div>
<!-- <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
Launch demo modal
</button> -->
<!-- Modal -->
{% for program in programs %}
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<p class="p-4">
Are you sure you want to delete this item?
</p>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<a class="btn btn-danger" href="{% url 'program_delete' pk=program.pk %}">Delete</a>
</div>
</div>
</div>
</div>
{% endfor %}
<div class="table-responsive table-shadow table-light table-striped m-0 mt-5">
<div class="table-responsive table-shadow table-light table-striped m-0 mt-4">
<div class="table-shadow">
<table class="table table-light">
<thead>
@ -80,41 +39,23 @@
{% for program in filter.qs %}
<tr>
<td>{{ forloop.counter }}.</td>
<td><a class="a-list" href="{{ program.get_absolute_url }}">
{{ program.title}}</a></td>
<td>
<a class="a-list" href="{{ program.get_absolute_url }}">
{{ program.title}}
</a>
</td>
<td>{{ program.summary }} </td>
{% if request.user.is_superuser %}
<td>
<div class="update-delete">
<a href="{% url 'edit_program' pk=program.pk %}" class="update"><i
class="fas fa-edit"></i></a>
<button type="button" class="btn btn-sm" data-toggle="modal" data-target="#exampleModal">
<i class="fas fa-trash-alt"></i>
<div class="dropdown">
<button class="btn btn-sm" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa fa-ellipsis-vertical"></i>
</button>
<ul class="dropdown-menu position-fixed">
<li><a class="dropdown-item" href="{% url 'edit_program' pk=program.pk %}"><i class="fas fa-edit"></i> Update</a></li>
<li><a class="dropdown-item text-danger" href="{% url 'program_delete' pk=program.pk %}"><i class="fas fa-trash-alt"></i> Delete</a></li>
</ul>
</div>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<p class="p-4">
Are you sure you want to delete this program?
</p>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-dismiss="modal">Close</button>
<a class="btn btn-danger"
href="{% url 'program_delete' pk=program.pk %}">Delete</a>
</div>
</div>
</div>
</div>
<!-- <td> <div class="update-delete">
<a href="{% url 'edit_program' pk=program.pk %}" class="update"><i class="fas fa-edit"></i></a>
<a href="{% url 'program_delete' pk=program.pk %}" class="delete"><i class="fas fa-trash-alt"></i></a>
</div> -->
</td>
{% endif %}
</tr>

View File

@ -27,30 +27,8 @@
{% endif %}
{% endif %}
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
</div>
{% endif %}
{% endfor %}
{% endif %}
<div class="content-center">
<form class="search-form" action="." method="GET">
<input class="au-input" type="text" name="name" placeholder="Course Name" value="{{ request.GET.name }}" />
<input class="au-input" type="text" name="code" placeholder="Course Code" value="{{ request.GET.code }}" />
<input class="au-input" type="number" name="year" placeholder="Course Year" value="{{ request.GET.year }}" />
<button class="btn btn-light" type="submit">
<i class="fas fa-search"></i> filter
</button>
</form>
</div>
{% include 'snippets/messages.html' %}
{% include 'snippets/filter_form.html' %}
<div class="table-responsive p-0 px-2 mt-5">
<div class="table-shadow">
@ -95,7 +73,7 @@
data-bs-boundary="window" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v m-0"></i>
</button>
<div class="dropdown-menu">
<div class="dropdown-menu position-fixed">
<a class="dropdown-item" href="{% url 'edit_course' slug=course.slug %}">
<i class="fas fa-pencil-alt"></i> Edit
</a>

View File

@ -18,10 +18,10 @@
</ol>
</nav>
<div class="container">
<div class="title-1">{{ quiz.title|title|truncatechars:25 }}</div>
<br>
<div class="header-title-xl text-center">{{ quiz.title|title }}</div>
<div class="title-line mb-2"></div>
<div class="container">
{% if previous.answers %}
@ -58,6 +58,7 @@
<tr class="success">
<td>{{ answer }}</td>
<td><strong>{% trans "This is the correct answer" %}</strong></td>
</tr>
{% else %}
<tr>
<td>{{ answer }}</td>
@ -100,23 +101,27 @@
{% if progress.0|add:1 == 1 %}
<div id="popup-box-messages">
<div class="box-messages">
<a id="popup-btn-messages" class="btn btn-light"><i class="fas fa-times"></i></a>
<div class="lead">Quiz instractions</div>
<div class="alert alert-warning">
<p>
You can't go back to the previous question after you submit it,
so double check your answer before proceeding to the next one!
</p>
<div class="modal fade show" id="instractionModal" tabindex="-1" aria-labelledby="instractionModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="instractionModalLabel">Quiz instractions</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<button id="popup-btn-messages" type="button" class="btn btn-primary" data-dismiss="modal">Understood</button>
</div>
</div>
<div class="modal-body">
You can't go back to the previous question after you submit it,
so double check your answer before proceeding to the next one!
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Understood</button>
</div>
</div>
</div>
</div>
{% endif %}
{% if progress %}
<div class="info-text bg-danger" style="float: right;">
<div class="text-light rounded small px-2 bg-danger" style="float: right;">
{% trans "Question" %} {{ progress.0|add:1 }} {% trans "of" %} {{ progress.1 }}
</div>
{% endif %}
@ -127,7 +132,7 @@
</p>
<div class="card">
<div class="card-title lead bg-light p-2">{{ question.content }}</div>
<div class="lead p-2">{{ question.content }}</div>
{% if question.figure %}
<div class="col-md-8 mx-auto">
@ -136,7 +141,7 @@
{% endif %}
<div class="card-subtitle p-4">
<form action="" method="POST">{% csrf_token %}
<input type=hidden name="question_id" value="{{ question.id }}">
<input type="hidden" name="question_id" value="{{ question.id }}">
<ul class="list-group">
@ -147,7 +152,8 @@
{% endfor %}
</ul>
<input type="submit" value={% trans "Check" %} class="btn btn-large btn-block btn-primary" >
<br>
<input type="submit" value={% trans "Check" %} class="btn btn-large btn-block btn-primary" />
<!-- <input type="submit" value={% trans "Previous" %} class="btn btn-large btn-block btn-outline-primary" > -->
</form>
</div>
@ -157,18 +163,13 @@
</div>
{% endblock %}
{% block js %}
<script>
const popupMessagesButtons = document.querySelectorAll('#popup-btn-messages');
for (const button of popupMessagesButtons) {
button.addEventListener('click', () => {
document.getElementById('popup-box-messages').style.display = 'none';
})
}
const instractionModal = new bootstrap.Modal('#instractionModal', {
keyboard: false
})
instractionModal.show();
</script>
{% endblock js %}

View File

@ -14,11 +14,10 @@
</ol>
</nav>
<div class="title-1">Add questions [{{ quiz_obj|truncatechars:15 }}]</div>
<br><br>
<div class="container">
<div class="header-title-md text-center mt-4">Add questions [{{ quiz_obj }}]</div>
<div class="title-line mb-5"></div>
<div class="info-text bg-orange mb-3">{{ quizQuestions }} question added</div>
<form action="#" method="POST">{% csrf_token %}
@ -28,20 +27,12 @@
<div class="mb-2" hidden>
{{ form.quiz }}
</div>
<div class="mb-2">
{{ form.content|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.figure|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.explanation|as_crispy_field }}
</div>
{{ form.content|as_crispy_field }}
{{ form.figure|as_crispy_field }}
{{ form.explanation|as_crispy_field }}
</div>
<div class="col mx-3 py-4 border bg-white">
<div class="mb-2">
{{ form.choice_order|as_crispy_field }}
</div>
{{ form.choice_order|as_crispy_field }}
<div class="border p-2">
<label class="lead">Choices</label>
{{ formset.management_form }}
@ -60,12 +51,10 @@
</div>
</div>
</div>
<center>
<button type="submit" formnovalidate name="another" class="btn btn-lg btn-outline-primary">
Save and add another
</button>
<button class="btn btn-lg btn-primary my-4" type="submit">Save</button>
</center>
<button type="submit" formnovalidate name="another" class="btn btn-outline-primary">
Save and add another
</button>
<button class="btn btn-primary my-4" type="submit">Save</button>
</form>
</div>

View File

@ -14,71 +14,55 @@
</ol>
</nav>
<div class="title-1">Quiz form for {{ course|truncatechars:15 }}</div>
<br><br>
<div class="container">
<div class="header-title-xl text-center">Quiz form for {{ course }}</div>
<div class="title-line mb-5"></div>
<form action="" method="POST">{% csrf_token %}
<div class="row">
<div class="col-md-6">
<div class="card p-2">
<!-- <div class="container"> -->
<div class="mb-2" hidden>
<label for="course">{{ form.course.label }}</label><br> {{ form.course }}
<span class="danger">{{ form.course.errors }}</span>
<span class="danger">{{ form.course.errors }}</span>
<div class="card">
<div class="card-body">
<!-- <div class="container"> -->
<div hidden>
<label for="course">{{ form.course.label }}</label><br> {{ form.course }}
<span class="danger">{{ form.course.errors }}</span>
<span class="danger">{{ form.course.errors }}</span>
</div>
{{ form.category|as_crispy_field }}
{{ form.title|as_crispy_field }}
<!-- <div class="mb-2">
<label for="max_questions">{{ form.max_questions.label }}</label>
<input class="form-control" type="number" name="max_questions" min="0" id="id_max_questions">
<span class="danger">{{ form.max_questions.errors }}</span>
<small class="d-block text-muted">Number of questions to be answered on each attempt.</small>
</div> -->
{{ form.pass_mark|as_crispy_field }}
{{ form.description|as_crispy_field }}
<!-- </div> -->
</div>
<div class="mb-2">
{{ form.category|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.title|as_crispy_field }}
</div>
<!-- <div class="mb-2">
<label for="max_questions">{{ form.max_questions.label }}</label>
<input class="form-control" type="number" name="max_questions" min="0" id="id_max_questions">
<span class="danger">{{ form.max_questions.errors }}</span>
<small class="d-block text-muted">Number of questions to be answered on each attempt.</small>
</div> -->
<div class="mb-2">
{{ form.pass_mark|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.description|as_crispy_field }}
</div>
<!-- </div> -->
</div>
</div>
<div class="col-md-6">
<div class="card p-3">
<!-- <div class="container"> -->
<div class="mb-2" hidden>
<label for="questions">{{ form.questions.label }}</label><br> {{ form.questions }}
<span class="danger">{{ form.questions.errors }}</span>
<small class="d-block text-muted">Hold down "Control", or "Command" on a Mac, to select more than one.</small>
</div>
<div class="mb-2">
<div class="card">
<div class="card-body">
<!-- <div class="container"> -->
<div hidden>
<label for="questions">{{ form.questions.label }}</label><br> {{ form.questions }}
<span class="danger">{{ form.questions.errors }}</span>
<small class="d-block text-muted">Hold down "Control", or "Command" on a Mac, to select more than one.</small>
</div>
{{ form.random_order|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.answers_at_end|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.exam_paper|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.single_attempt|as_crispy_field }}
</div>
<div class="mb-2">
{{ form.draft|as_crispy_field }}
</div>
<!-- </div> -->
</div>
</div>
</div>
<center>
<button class="btn btn-lg btn-primary my-4" id="{% if form.is_valid %}btn-transition{% endif %}" type="submit">Save &amp; Continue</button>
</center>
<button class="btn btn-primary my-4" id="{% if form.is_valid %}btn-transition{% endif %}" type="submit">Save &amp; Continue</button>
</form>
</div>

View File

@ -4,6 +4,7 @@
{% load static %}
{% block content %}
<style>.bg-light-warning{background-color: rgb(252, 217, 111) !important;}</style>
<nav style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb">
<ol class="breadcrumb">
@ -15,70 +16,62 @@
</ol>
</nav>
{% if request.user.is_superuser or request.user.is_lecturer %}
<div class="manage-wrap">
<a class="btn btn-primary" href="{% url 'quiz_create' course.slug %}"><i class="fas fa-plus"></i> Add Quiz</a>
</div>
{% endif %}
<div class="title-1">Quizzes [{{ course|truncatechars:25 }}]</div>
<br>
<br>
{% include 'snippets/messages.html' %}
<div class="container">
{% if messages %}
<div id="popup-box-messages">
<div class="box-messages">
<a id="popup-btn-messages" class="btn btn-light"><i class="fas fa-times"></i></a><br><br>
{% for message in messages %}
<div class="alert alert-{{message.tags}}">
{{ message }}
</div>
{% endfor %}
</div>
</div>
{% endif %}
<style>.bg-light-warning{background-color: rgb(252, 217, 111) !important;}</style>
<div class="header-title-md text-center">Quizzes [{{ course }}]</div>
<div class="title-line mb-5"></div>
{% if request.user.is_superuser or request.user.is_lecturer %}
<a class="btn btn-outline-primary br-2 mb-4" href="{% url 'quiz_create' course.slug %}">&plus; Add Quiz</a>
{% endif %}
<div class="row">
{% for quiz in quizzes %}
<div class="col-md-4 mb-4 mx-auto text-center">
<div class="col-md-4 mb-2">
<div class="card p-2 quiz-wrapper">
<div class="d-flex justify-content-between align-items-center text-success mb-4">
<em class="text-left">{{ quiz.category|title }} Quiz</em>
<div class="text-right info-text bg-danger" style="border-bottom-right-radius: 1px; border-top-right-radius: 1px;">
<div class="text-right text-light bg-danger px-2 small rounded">
{{ quiz.get_questions.count }} Questions
</div>
</div>
<!-- <p>{{ quiz.category|title }} Quiz</p> -->
<div class="card-title header-title-md">{{ quiz.title|title }}</div>
<!-- <div class="col-md-4 info-text bg-danger" style="float: right; width: auto;">
{{ quiz.get_questions.count }} Questions
</div> -->
{% if quiz.single_attempt %}
<p class="p-2 bg-light-warning">{% trans "You will only get one attempt at this quiz" %}.</p>
<h6>{{ quiz.title|title }}</h6>
{% if quiz.description %}
<p class="text-muted small">{{ quiz.description }}</p>
{% else %}
<p class="text-muted small">No description set.</p>
{% endif %}
<p class="text-muted">{{ quiz.description }} here is the description of this quiz...</p>
<!-- <p class="lead">{{ quiz.get_questions.count }} Questions</p> -->
<!-- <div class="row text-success mb-4">
<small class="col-6 text-left">{% trans "Category" %}: <b>{{ quiz.category }}</b></small>
<small class="col-6 text-right">Time set: <b>1:30</b></small>
</div> -->
<div class="d-flex">
{% if quiz.single_attempt %}
<p class="p-2 bg-light-warning small">{% trans "You will only get one attempt at this quiz" %}.</p>
{% endif %}
<div class="d-flex align-items-center">
<a class="btn btn-block btn-secondary w-100" href="{% url 'quiz_take' pk=course.pk slug=quiz.slug %}">{% trans "Start quiz" %} &raquo;</a>
{% if request.user.is_superuser or request.user.is_lecturer %}
<li class="dropup">
<button class="btn btn-default bg-light ms-2" type="button" data-bs-toggle="dropdown"><i class="fas fa-ellipsis-v m-0"></i></button>
<div class="dropdown-menu dropdown-menu-top-left" aria-labelledby="dropdown01">
<a href="{% url 'quiz_update' slug=course.slug pk=quiz.id %}" class="update"><i class="fas fa-pencil-alt"></i> Edit</a>
<a href="{% url 'quiz_delete' slug=course.slug pk=quiz.id %}" class="delete"><i class="fas fa-trash-alt"></i> Delete</a>
<div class="dropup">
<button class="btn btn-sm p-0 ms-2" type="button" data-bs-toggle="dropdown"><i class="fas fa-ellipsis-v m-0"></i></button>
<div class="dropdown-menu" aria-labelledby="dropdown01">
<div class="dropdown-item">
<a href="{% url 'quiz_update' slug=course.slug pk=quiz.id %}" class="update"><i class="fas fa-pencil-alt"></i> Edit</a>
</div>
<div class="dropdown-item">
<a href="{% url 'quiz_delete' slug=course.slug pk=quiz.id %}" class="delete"><i class="fas fa-trash-alt"></i> Delete</a>
</div>
</div>
</li>
</div>
{% endif %}
</div>
</div>
</div>
{% if forloop.counter|divisibleby:3 %}</div><div class="row">{% endif %}
{% endfor %}
</div>

View File

@ -59,6 +59,7 @@
<tr class="success">
<td>{{ answer }}</td>
<td><strong>{% trans "This is the correct answer" %}</strong></td>
</tr>
{% else %}
<tr>
<td>{{ answer }}</td>
@ -112,14 +113,14 @@
<div class="card p-1" style="border: 1px solid #fd7e14;">
<p class="lead bg-light p-3 text-orange"><span class="fa-1x">&CircleDot;</span> {{ sitting.result_message }}</p>
{% endif %}
<p><span class="fa-2x text-orange">&LongRightArrow;</span> {% trans "Review the questions below and try the quiz again in the future"%}.</p>
<p>
<span class="fa-2x text-orange">&LongRightArrow;</span>
<ul>
<li>{% trans "Review the questions below and try the quiz again in the future"%}.</li>
<li>
{% trans "The result of this quiz will be stored in your progress section" %}
<a class="text-primary" href="{% url 'quiz_progress' %}">Here</a>
{% trans "so you can review and monitor your progression" %}.
</p>
</li>
</ul>
</div>

View File

@ -1,4 +1,4 @@
{% if filter.form %}
<form action="" method="get">
<div class="d-flex flex-wrap align-items-center">
{% for field in filter.form %}
@ -11,3 +11,4 @@
</button>
</div>
</form>
{% endif %}

View File

@ -2,12 +2,16 @@
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">
<i class="fas fa-exclamation-circle"></i>{{ message }}
<div class="alert py-2 alert-danger">
<i class="fas fa-exclamation-circle me-2"></i>{{ message }}
</div>
{% elif message.tags == 'warning' %}
<div class="alert py-2 alert-warning">
<i class="fas fa-exclamation-circle me-2"></i>{{ message }}
</div>
{% else %}
<div class="alert alert-success">
<i class="fas fa-check-circle"></i>{{ message }}
<div class="alert py-2 alert-success">
<i class="fas fa-check-circle me-2"></i>{{ message }}
</div>
{% endif %}
{% endfor %}