Update templates/index.html
Browse files- templates/index.html +23 -37
templates/index.html
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
<!-- Inclusion de Tailwind CSS via CDN -->
|
| 8 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
<style>
|
| 10 |
-
/* Styles personnalisés additionnels si nécessaire
|
| 11 |
-
/* Par exemple, pour la transition de la flashcard si non couverte par Tailwind */
|
| 12 |
.flashcard-transform {
|
| 13 |
transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
|
| 14 |
}
|
|
@@ -91,7 +90,7 @@
|
|
| 91 |
loadingIndicator.classList.remove('hidden');
|
| 92 |
flashcardsContainer.innerHTML = '';
|
| 93 |
quizContainer.innerHTML = '';
|
| 94 |
-
flashcardsContainer.classList.add('hidden');
|
| 95 |
quizContainer.classList.add('hidden');
|
| 96 |
|
| 97 |
// Envoi de la requête
|
|
@@ -109,7 +108,7 @@
|
|
| 109 |
return response.json();
|
| 110 |
})
|
| 111 |
.then(data => {
|
| 112 |
-
loadingIndicator.classList.add('hidden');
|
| 113 |
|
| 114 |
if (data.error) {
|
| 115 |
alert('Erreur: ' + data.error);
|
|
@@ -148,7 +147,7 @@
|
|
| 148 |
flashcards.forEach((card, index) => {
|
| 149 |
const cardElement = document.createElement('div');
|
| 150 |
cardElement.className = 'bg-white rounded-lg shadow p-4 cursor-pointer flashcard-transform hover:shadow-lg';
|
| 151 |
-
cardElement.setAttribute('onclick', `toggleAnswer(${index})`);
|
| 152 |
cardElement.innerHTML = `
|
| 153 |
<div class="font-semibold text-gray-800">${card.question}</div>
|
| 154 |
<div id="answer-${index}" class="hidden mt-3 pt-3 border-t border-dashed border-gray-300 text-sm text-gray-700">
|
|
@@ -161,7 +160,6 @@
|
|
| 161 |
|
| 162 |
function toggleAnswer(index) {
|
| 163 |
const answerElement = document.getElementById(`answer-${index}`);
|
| 164 |
-
// Utilisation de classList.toggle pour gérer l'affichage avec Tailwind
|
| 165 |
answerElement.classList.toggle('hidden');
|
| 166 |
}
|
| 167 |
|
|
@@ -171,19 +169,16 @@
|
|
| 171 |
<h2 class="text-2xl font-semibold text-center text-gray-700 mb-1">Quiz généré (${quizQuestions.length} questions)</h2>
|
| 172 |
<p class="text-center text-gray-500 text-sm">Sélectionnez une réponse pour chaque question</p>
|
| 173 |
</div>
|
| 174 |
-
`;
|
| 175 |
|
| 176 |
quizQuestions.forEach((question, qIndex) => {
|
| 177 |
const questionElement = document.createElement('div');
|
| 178 |
-
// Ajout de classes Tailwind pour le conteneur de question
|
| 179 |
questionElement.className = 'bg-white rounded-lg shadow p-5 mb-5';
|
| 180 |
|
| 181 |
let optionsHtml = '';
|
| 182 |
-
|
| 183 |
-
const safeCorrectAnswer = question.correctAnswer.replace(/"/g, '"');
|
| 184 |
|
| 185 |
question.options.forEach((option, oIndex) => {
|
| 186 |
-
// Utilisation des data attributes et passage de 'this'
|
| 187 |
optionsHtml += `
|
| 188 |
<div class="option block p-3 my-2 border border-gray-200 rounded-md cursor-pointer transition duration-150 ease-in-out hover:bg-gray-100 text-gray-800"
|
| 189 |
id="q${qIndex}-o${oIndex}"
|
|
@@ -208,45 +203,38 @@
|
|
| 208 |
}
|
| 209 |
|
| 210 |
function selectOption(element, questionIndex, optionIndex) {
|
| 211 |
-
const correctAnswer = element.dataset.correct;
|
| 212 |
-
const questionOptions = quizContainer.querySelectorAll(`#q${
|
| 213 |
-
const explanationElement = document.getElementById(`explanation-${
|
| 214 |
|
| 215 |
-
//
|
| 216 |
let alreadyAnswered = false;
|
| 217 |
questionOptions.forEach(opt => {
|
| 218 |
-
if (opt.classList.contains('
|
| 219 |
alreadyAnswered = true;
|
| 220 |
}
|
| 221 |
});
|
|
|
|
| 222 |
|
| 223 |
-
|
| 224 |
-
return; // Ne rien faire si déjà répondu
|
| 225 |
-
}
|
| 226 |
-
|
| 227 |
-
// Retirer les classes de sélection/hover précédentes (au cas où)
|
| 228 |
questionOptions.forEach(option => {
|
| 229 |
option.classList.remove('bg-indigo-100', 'border-indigo-300', 'bg-green-100', 'border-green-300', 'text-green-800', 'bg-red-100', 'border-red-300', 'text-red-800');
|
| 230 |
-
// Rétablir le style de survol standard
|
| 231 |
option.classList.add('hover:bg-gray-100');
|
| 232 |
});
|
| 233 |
|
| 234 |
-
//
|
| 235 |
element.classList.add('bg-indigo-100', 'border-indigo-300');
|
| 236 |
-
element.classList.remove('hover:bg-gray-100');
|
| 237 |
|
| 238 |
-
// Vérifier la réponse
|
| 239 |
const selectedText = element.textContent.trim();
|
| 240 |
if (selectedText === correctAnswer) {
|
| 241 |
-
|
| 242 |
-
element.classList.remove('bg-indigo-100', 'border-indigo-300'); // Retirer le style sélectionné
|
| 243 |
element.classList.add('bg-green-100', 'border-green-300', 'text-green-800');
|
| 244 |
} else {
|
| 245 |
-
// Mauvaise réponse: rouge
|
| 246 |
element.classList.remove('bg-indigo-100', 'border-indigo-300');
|
| 247 |
element.classList.add('bg-red-100', 'border-red-300', 'text-red-800');
|
| 248 |
|
| 249 |
-
// Mettre en évidence la bonne réponse
|
| 250 |
questionOptions.forEach(option => {
|
| 251 |
if (option.textContent.trim() === correctAnswer) {
|
| 252 |
option.classList.add('bg-green-100', 'border-green-300', 'text-green-800');
|
|
@@ -255,18 +243,16 @@
|
|
| 255 |
});
|
| 256 |
}
|
| 257 |
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
option.onclick = null;
|
| 261 |
-
option.classList.remove('cursor-pointer', 'hover:bg-gray-100');
|
| 262 |
option.style.cursor = 'default';
|
| 263 |
});
|
| 264 |
|
| 265 |
-
|
| 266 |
-
// Afficher l'explication (retirer 'hidden')
|
| 267 |
explanationElement.classList.remove('hidden');
|
| 268 |
}
|
| 269 |
-
|
| 270 |
</script>
|
| 271 |
</body>
|
| 272 |
-
</html>
|
|
|
|
| 7 |
<!-- Inclusion de Tailwind CSS via CDN -->
|
| 8 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
<style>
|
| 10 |
+
/* Styles personnalisés additionnels si nécessaire */
|
|
|
|
| 11 |
.flashcard-transform {
|
| 12 |
transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
|
| 13 |
}
|
|
|
|
| 90 |
loadingIndicator.classList.remove('hidden');
|
| 91 |
flashcardsContainer.innerHTML = '';
|
| 92 |
quizContainer.innerHTML = '';
|
| 93 |
+
flashcardsContainer.classList.add('hidden');
|
| 94 |
quizContainer.classList.add('hidden');
|
| 95 |
|
| 96 |
// Envoi de la requête
|
|
|
|
| 108 |
return response.json();
|
| 109 |
})
|
| 110 |
.then(data => {
|
| 111 |
+
loadingIndicator.classList.add('hidden');
|
| 112 |
|
| 113 |
if (data.error) {
|
| 114 |
alert('Erreur: ' + data.error);
|
|
|
|
| 147 |
flashcards.forEach((card, index) => {
|
| 148 |
const cardElement = document.createElement('div');
|
| 149 |
cardElement.className = 'bg-white rounded-lg shadow p-4 cursor-pointer flashcard-transform hover:shadow-lg';
|
| 150 |
+
cardElement.setAttribute('onclick', `toggleAnswer(${index})`);
|
| 151 |
cardElement.innerHTML = `
|
| 152 |
<div class="font-semibold text-gray-800">${card.question}</div>
|
| 153 |
<div id="answer-${index}" class="hidden mt-3 pt-3 border-t border-dashed border-gray-300 text-sm text-gray-700">
|
|
|
|
| 160 |
|
| 161 |
function toggleAnswer(index) {
|
| 162 |
const answerElement = document.getElementById(`answer-${index}`);
|
|
|
|
| 163 |
answerElement.classList.toggle('hidden');
|
| 164 |
}
|
| 165 |
|
|
|
|
| 169 |
<h2 class="text-2xl font-semibold text-center text-gray-700 mb-1">Quiz généré (${quizQuestions.length} questions)</h2>
|
| 170 |
<p class="text-center text-gray-500 text-sm">Sélectionnez une réponse pour chaque question</p>
|
| 171 |
</div>
|
| 172 |
+
`;
|
| 173 |
|
| 174 |
quizQuestions.forEach((question, qIndex) => {
|
| 175 |
const questionElement = document.createElement('div');
|
|
|
|
| 176 |
questionElement.className = 'bg-white rounded-lg shadow p-5 mb-5';
|
| 177 |
|
| 178 |
let optionsHtml = '';
|
| 179 |
+
const safeCorrectAnswer = question.correctAnswer.replace(/"/g, '"');
|
|
|
|
| 180 |
|
| 181 |
question.options.forEach((option, oIndex) => {
|
|
|
|
| 182 |
optionsHtml += `
|
| 183 |
<div class="option block p-3 my-2 border border-gray-200 rounded-md cursor-pointer transition duration-150 ease-in-out hover:bg-gray-100 text-gray-800"
|
| 184 |
id="q${qIndex}-o${oIndex}"
|
|
|
|
| 203 |
}
|
| 204 |
|
| 205 |
function selectOption(element, questionIndex, optionIndex) {
|
| 206 |
+
const correctAnswer = element.dataset.correct;
|
| 207 |
+
const questionOptions = quizContainer.querySelectorAll(`#q${questionIndex}-o0`)[0].parentElement.querySelectorAll('.option');
|
| 208 |
+
const explanationElement = document.getElementById(`explanation-${questionIndex}`);
|
| 209 |
|
| 210 |
+
// Vérifier si la question a déjà été répondue
|
| 211 |
let alreadyAnswered = false;
|
| 212 |
questionOptions.forEach(opt => {
|
| 213 |
+
if (opt.classList.contains('bg-green-100') || opt.classList.contains('bg-red-100')) {
|
| 214 |
alreadyAnswered = true;
|
| 215 |
}
|
| 216 |
});
|
| 217 |
+
if (alreadyAnswered) return;
|
| 218 |
|
| 219 |
+
// Réinitialiser les styles des options
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
questionOptions.forEach(option => {
|
| 221 |
option.classList.remove('bg-indigo-100', 'border-indigo-300', 'bg-green-100', 'border-green-300', 'text-green-800', 'bg-red-100', 'border-red-300', 'text-red-800');
|
|
|
|
| 222 |
option.classList.add('hover:bg-gray-100');
|
| 223 |
});
|
| 224 |
|
| 225 |
+
// Marquer l'option cliquée
|
| 226 |
element.classList.add('bg-indigo-100', 'border-indigo-300');
|
| 227 |
+
element.classList.remove('hover:bg-gray-100');
|
| 228 |
|
|
|
|
| 229 |
const selectedText = element.textContent.trim();
|
| 230 |
if (selectedText === correctAnswer) {
|
| 231 |
+
element.classList.remove('bg-indigo-100', 'border-indigo-300');
|
|
|
|
| 232 |
element.classList.add('bg-green-100', 'border-green-300', 'text-green-800');
|
| 233 |
} else {
|
|
|
|
| 234 |
element.classList.remove('bg-indigo-100', 'border-indigo-300');
|
| 235 |
element.classList.add('bg-red-100', 'border-red-300', 'text-red-800');
|
| 236 |
|
| 237 |
+
// Mettre en évidence la bonne réponse
|
| 238 |
questionOptions.forEach(option => {
|
| 239 |
if (option.textContent.trim() === correctAnswer) {
|
| 240 |
option.classList.add('bg-green-100', 'border-green-300', 'text-green-800');
|
|
|
|
| 243 |
});
|
| 244 |
}
|
| 245 |
|
| 246 |
+
// Désactiver les clics pour toutes les options de cette question
|
| 247 |
+
questionOptions.forEach(option => {
|
| 248 |
+
option.onclick = null;
|
| 249 |
+
option.classList.remove('cursor-pointer', 'hover:bg-gray-100');
|
| 250 |
option.style.cursor = 'default';
|
| 251 |
});
|
| 252 |
|
| 253 |
+
// Afficher l'explication
|
|
|
|
| 254 |
explanationElement.classList.remove('hidden');
|
| 255 |
}
|
|
|
|
| 256 |
</script>
|
| 257 |
</body>
|
| 258 |
+
</html>
|