Ajout des fonctionnalités de gestion de progression des cours : vue dédiée pour le toggle des leçons, mise à jour des templates pour afficher la progression, intégration des routes Ajax, styles associés, et ajustements des vues et modèles pour gérer les données utilisateur.
This commit is contained in:
parent
609745a723
commit
ac8ef6894d
8 changed files with 261 additions and 9 deletions
|
|
@ -4,3 +4,22 @@
|
|||
Un cours proposé par <a href="{% url 'another_profile' course.author.id %}">{{ course.author }}</a>
|
||||
</p>
|
||||
<p>{{ course.content }}</p>
|
||||
<strong>Progression pour ce cours</strong>
|
||||
{% if user_progress.percent_completed == 100 %}
|
||||
<div class="course-completed">
|
||||
<div class="container">
|
||||
<div class="icon"><i class="fa-solid fa-check"></i></div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="title">Félicitation</div>
|
||||
<div class="content">Tu as terminé(e) ce cours ! Tu peux réellement être fier(e) de toi !!</div>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="progress-container">
|
||||
<div class="progress-bar" style="width: 100%;">
|
||||
<div id="progress-bar-fill" class="progress-bar-fill" style="width: {{ user_progress.percent_completed }}%; height: 100%; transition: width 0.3s;"></div>
|
||||
</div>
|
||||
<div id="progress-text" class="progress-text">{{ user_progress.percent_completed }}%</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@
|
|||
<li class="tocLesson{% if lesson and lesson.id == item.id %} current{% endif %}">
|
||||
<a class="tocLink {% if item.is_premium and user.profile.is_premium == False %}premium{% endif %}" href="{% url 'courses:lesson_detail' course.slug item.module.slug item.slug %}">
|
||||
{{ item.name }} {% if item.is_premium %}<span class="premium-tag">PREMIUM</span>{% endif %}
|
||||
{% if lesson and lesson.id == item.id %}<span class="tocCurrentTag">(cours actuel)</span>{% endif %}
|
||||
{% if lesson and lesson.id == item.id %}<span class="current-tag">(cours actuel)</span>{% endif %}
|
||||
{% if item.id in completed_lesson_ids %}<span class="completed-tag">Terminé</span>{% endif %}
|
||||
</a>
|
||||
{% if lesson and lesson.id == item.id %}
|
||||
<div class="lessonInline">
|
||||
|
|
@ -69,6 +70,12 @@
|
|||
<div class="content-lesson">
|
||||
<div class="lessonTitle">Ce que l'on voit durant ce cours : </div>
|
||||
{{ lesson.content|comment_markdown }}
|
||||
|
||||
{% if lesson.id in completed_lesson_ids %}
|
||||
<button id="btn-complete" data-lesson-id="{{ lesson.id }}" class="btn btn-success">✅ Terminée</button>
|
||||
{% else %}
|
||||
<button id="btn-complete" data-lesson-id="{{ lesson.id }}" class="btn btn-secondary">Marquer comme terminé</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
<h3 id="comments">Commentaires</h3>
|
||||
<div class="lessonComments">
|
||||
|
|
@ -251,6 +258,64 @@
|
|||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- Progression Bar -->
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const btn = document.getElementById('btn-complete');
|
||||
const progressBar = document.getElementById('progress-bar-fill');
|
||||
const progressText = document.getElementById('progress-text');
|
||||
|
||||
btn.addEventListener('click', function() {
|
||||
const lessonId = this.getAttribute('data-lesson-id');
|
||||
|
||||
// 1. On prépare la requête
|
||||
fetch("{% url 'progression:toggle_lesson' %}", { // Assure-toi que c'est le bon nom dans urls.py
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRFToken': getCookie('csrftoken') // Fonction indispensable pour Django
|
||||
},
|
||||
body: JSON.stringify({
|
||||
'lesson_id': lessonId
|
||||
})
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.status === 'success') {
|
||||
// 2. On met à jour le visuel de la barre
|
||||
progressBar.style.width = data.new_percent + '%';
|
||||
progressText.innerText = data.new_percent + '%';
|
||||
|
||||
// 3. On change l'aspect du bouton
|
||||
if (data.is_completed) {
|
||||
btn.innerText = "✅ Terminée";
|
||||
btn.style.backgroundColor = "green";
|
||||
} else {
|
||||
btn.innerText = "Marquer comme terminé";
|
||||
btn.style.backgroundColor = "gray";
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// --- Fonction Helper pour récupérer le cookie CSRF de Django ---
|
||||
function getCookie(name) {
|
||||
let cookieValue = null;
|
||||
if (document.cookie && document.cookie !== '') {
|
||||
const cookies = document.cookie.split(';');
|
||||
for (let i = 0; i < cookies.length; i++) {
|
||||
const cookie = cookies[i].trim();
|
||||
if (cookie.substring(0, name.length + 1) === (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</div> <!-- /.lessonComments -->
|
||||
</div> <!-- /.lesson -->
|
||||
</div> <!-- /.lessonInline -->
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue