Docfile commited on
Commit
13ae48e
·
verified ·
1 Parent(s): cca0295

Update templates/index.html

Browse files
Files changed (1) hide show
  1. 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 (peuvent être évités avec Tailwind) */
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'); // Cacher explicitement les conteneurs
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'); // Masquer le chargement
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})`); // Utilisation directe d'onclick pour simplicité ici
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
- `; // Titre ajouté
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
- // Encoder la bonne réponse pour l'attribut data-correct (échapper les guillemets doubles)
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; // Récupérer la réponse correcte
212
- const questionOptions = quizContainer.querySelectorAll(`#q${qIndex}-o0`)[0].parentElement.querySelectorAll('.option'); // Sélectionne toutes les options de CETTE question
213
- const explanationElement = document.getElementById(`explanation-${qIndex}`);
214
 
215
- // Indicateur si la question a déjà été répondue (pour éviter les re-clics)
216
  let alreadyAnswered = false;
217
  questionOptions.forEach(opt => {
218
- if (opt.classList.contains('correct') || opt.classList.contains('incorrect')) {
219
  alreadyAnswered = true;
220
  }
221
  });
 
222
 
223
- if (alreadyAnswered) {
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
- // Ajouter la classe 'sélectionnée' (style visuel temporaire ou permanent)
235
  element.classList.add('bg-indigo-100', 'border-indigo-300');
236
- element.classList.remove('hover:bg-gray-100'); // Retirer hover sur l'élément sélectionné
237
 
238
- // Vérifier la réponse
239
  const selectedText = element.textContent.trim();
240
  if (selectedText === correctAnswer) {
241
- // Bonne réponse: vert
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 en vert
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
- // Désactiver les clics pour cette question après la réponse
259
- questionOptions.forEach(option => {
260
- option.onclick = null; // Supprime l'attribut onclick
261
- option.classList.remove('cursor-pointer', 'hover:bg-gray-100'); // Rend visuellement non cliquable
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, '&quot;');
 
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>