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>
|