Spaces:
Runtime error
Runtime error
Update templates/math.html
Browse files- templates/math.html +103 -39
templates/math.html
CHANGED
@@ -15,6 +15,9 @@
|
|
15 |
<!-- Font Awesome pour les icônes -->
|
16 |
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
17 |
|
|
|
|
|
|
|
18 |
<style>
|
19 |
/* Styles personnalisés */
|
20 |
.dropzone {
|
@@ -62,6 +65,25 @@
|
|
62 |
.math-hidden {
|
63 |
visibility: hidden;
|
64 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
</style>
|
66 |
|
67 |
<!-- Configuration de MathJax -->
|
@@ -125,6 +147,7 @@
|
|
125 |
|
126 |
<!-- localForage pour le stockage local -->
|
127 |
<script src="https://cdn.jsdelivr.net/npm/localforage@1.10.0/dist/localforage.min.js"></script>
|
|
|
128 |
</head>
|
129 |
|
130 |
<body class="min-h-screen bg-gradient-to-br from-blue-50 to-white">
|
@@ -181,13 +204,16 @@
|
|
181 |
|
182 |
<!-- Réponses sauvegardées -->
|
183 |
<div id="savedResponsesSection" class="mt-8">
|
184 |
-
<
|
185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
186 |
<!-- Les réponses sauvegardées seront affichées ici -->
|
187 |
</div>
|
188 |
-
<button id="clearSavedResponses" class="mt-4 px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-lg transition-colors duration-200">
|
189 |
-
Effacer les réponses sauvegardées
|
190 |
-
</button>
|
191 |
</div>
|
192 |
|
193 |
<!-- Message d'erreur -->
|
@@ -348,55 +374,93 @@
|
|
348 |
|
349 |
// Fonction pour effacer toutes les réponses sauvegardées
|
350 |
async function clearSavedResponses() {
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
360 |
}
|
361 |
|
362 |
// Fonction pour charger et afficher les réponses sauvegardées
|
363 |
async function loadSavedResponses() {
|
364 |
try {
|
365 |
-
savedResponsesContainer.innerHTML = '';
|
366 |
const keys = await localforage.keys();
|
367 |
keys.sort((a, b) => parseInt(b.replace('response-', '')) - parseInt(a.replace('response-', '')));
|
368 |
|
369 |
for (const key of keys) {
|
370 |
const response = await localforage.getItem(key);
|
371 |
-
const
|
372 |
-
|
373 |
-
|
374 |
-
const
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
384 |
try {
|
385 |
await localforage.removeItem(key);
|
386 |
console.log('Réponse supprimée:', key);
|
387 |
-
|
388 |
} catch (error) {
|
389 |
console.error('Erreur lors de la suppression de la réponse:', error);
|
390 |
showError('Erreur lors de la suppression de la réponse');
|
391 |
}
|
392 |
-
};
|
393 |
-
responseDiv.appendChild(deleteButton); // Ajouter le bouton de suppression à la réponse
|
394 |
-
|
395 |
-
await MathJax.typesetPromise([responseContent]);
|
396 |
-
responseContent.classList.remove('math-hidden');
|
397 |
-
|
398 |
-
savedResponsesContainer.appendChild(responseDiv);
|
399 |
|
|
|
|
|
400 |
}
|
401 |
} catch (error) {
|
402 |
console.error('Erreur lors du chargement des réponses sauvegardées:', error);
|
@@ -440,7 +504,7 @@
|
|
440 |
|
441 |
} catch (error) {
|
442 |
console.error('Erreur:', error);
|
443 |
-
|
444 |
} finally {
|
445 |
loading.classList.remove('active');
|
446 |
submitButton.disabled = false;
|
@@ -452,10 +516,10 @@
|
|
452 |
|
453 |
// Gestionnaire d'événement pour effacer les réponses sauvegardées
|
454 |
clearSavedResponsesButton.addEventListener('click', clearSavedResponses);
|
|
|
455 |
});
|
456 |
|
457 |
</script>
|
458 |
</body>
|
459 |
|
460 |
-
</html>
|
461 |
-
|
|
|
15 |
<!-- Font Awesome pour les icônes -->
|
16 |
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
17 |
|
18 |
+
<!-- SweetAlert2 -->
|
19 |
+
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
20 |
+
|
21 |
<style>
|
22 |
/* Styles personnalisés */
|
23 |
.dropzone {
|
|
|
65 |
.math-hidden {
|
66 |
visibility: hidden;
|
67 |
}
|
68 |
+
|
69 |
+
.saved-response-header {
|
70 |
+
cursor: pointer;
|
71 |
+
display: flex;
|
72 |
+
justify-content: space-between;
|
73 |
+
align-items: center;
|
74 |
+
padding: 0.75rem 1rem;
|
75 |
+
background-color: #f3f4f6;
|
76 |
+
border-bottom: 1px solid #e5e7eb;
|
77 |
+
}
|
78 |
+
|
79 |
+
.saved-response-content {
|
80 |
+
padding: 1rem;
|
81 |
+
display: none;
|
82 |
+
}
|
83 |
+
|
84 |
+
.saved-response-item.open .saved-response-content {
|
85 |
+
display: block;
|
86 |
+
}
|
87 |
</style>
|
88 |
|
89 |
<!-- Configuration de MathJax -->
|
|
|
147 |
|
148 |
<!-- localForage pour le stockage local -->
|
149 |
<script src="https://cdn.jsdelivr.net/npm/localforage@1.10.0/dist/localforage.min.js"></script>
|
150 |
+
|
151 |
</head>
|
152 |
|
153 |
<body class="min-h-screen bg-gradient-to-br from-blue-50 to-white">
|
|
|
204 |
|
205 |
<!-- Réponses sauvegardées -->
|
206 |
<div id="savedResponsesSection" class="mt-8">
|
207 |
+
<div class="flex justify-between items-center mb-4">
|
208 |
+
<h2 class="text-2xl font-semibold text-blue-800">Réponses Sauvegardées</h2>
|
209 |
+
<button id="clearSavedResponses"
|
210 |
+
class="px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-lg transition-colors duration-200">
|
211 |
+
<i class="fas fa-trash-alt"></i> Effacer Tout
|
212 |
+
</button>
|
213 |
+
</div>
|
214 |
+
<div id="savedResponses" class="space-y-2">
|
215 |
<!-- Les réponses sauvegardées seront affichées ici -->
|
216 |
</div>
|
|
|
|
|
|
|
217 |
</div>
|
218 |
|
219 |
<!-- Message d'erreur -->
|
|
|
374 |
|
375 |
// Fonction pour effacer toutes les réponses sauvegardées
|
376 |
async function clearSavedResponses() {
|
377 |
+
Swal.fire({
|
378 |
+
title: 'Êtes-vous sûr?',
|
379 |
+
text: "Vous ne pourrez pas revenir en arrière!",
|
380 |
+
icon: 'warning',
|
381 |
+
showCancelButton: true,
|
382 |
+
confirmButtonColor: '#d33',
|
383 |
+
cancelButtonColor: '#3085d6',
|
384 |
+
confirmButtonText: 'Oui, effacer!',
|
385 |
+
cancelButtonText: 'Annuler'
|
386 |
+
}).then(async (result) => {
|
387 |
+
if (result.isConfirmed) {
|
388 |
+
try {
|
389 |
+
await localforage.clear();
|
390 |
+
console.log('Réponses sauvegardées effacées');
|
391 |
+
loadSavedResponses();
|
392 |
+
Swal.fire(
|
393 |
+
'Effacé!',
|
394 |
+
'Les réponses ont été supprimées.',
|
395 |
+
'success'
|
396 |
+
);
|
397 |
+
} catch (error) {
|
398 |
+
console.error('Erreur lors de l\'effacement des réponses sauvegardées:', error);
|
399 |
+
showError('Erreur lors de l\'effacement des réponses sauvegardées');
|
400 |
+
Swal.fire(
|
401 |
+
'Erreur!',
|
402 |
+
'Une erreur est survenue lors de la suppression.',
|
403 |
+
'error'
|
404 |
+
);
|
405 |
+
}
|
406 |
+
}
|
407 |
+
});
|
408 |
}
|
409 |
|
410 |
// Fonction pour charger et afficher les réponses sauvegardées
|
411 |
async function loadSavedResponses() {
|
412 |
try {
|
413 |
+
savedResponsesContainer.innerHTML = '';
|
414 |
const keys = await localforage.keys();
|
415 |
keys.sort((a, b) => parseInt(b.replace('response-', '')) - parseInt(a.replace('response-', '')));
|
416 |
|
417 |
for (const key of keys) {
|
418 |
const response = await localforage.getItem(key);
|
419 |
+
const responseItem = document.createElement('div');
|
420 |
+
responseItem.className = 'saved-response-item bg-white rounded-lg shadow-md overflow-hidden';
|
421 |
+
|
422 |
+
const header = document.createElement('div');
|
423 |
+
header.className = 'saved-response-header';
|
424 |
+
header.innerHTML = `
|
425 |
+
<span class="text-blue-800 font-medium">Réponse du ${new Date(parseInt(key.replace('response-', ''))).toLocaleString()}</span>
|
426 |
+
<div>
|
427 |
+
<button class="toggle-content px-1 py-0.5 rounded-md text-xs bg-blue-500 hover:bg-blue-700 text-white mr-1"><i class="fas fa-chevron-down"></i></button>
|
428 |
+
<button class="delete-response px-1 py-0.5 rounded-md text-xs bg-red-500 hover:bg-red-700 text-white"><i class="fas fa-trash-alt"></i></button>
|
429 |
+
</div>
|
430 |
+
`;
|
431 |
+
responseItem.appendChild(header);
|
432 |
+
|
433 |
+
const content = document.createElement('div');
|
434 |
+
content.className = 'saved-response-content math-content math-hidden';
|
435 |
+
content.innerHTML = marked.parse(response);
|
436 |
+
responseItem.appendChild(content);
|
437 |
+
|
438 |
+
savedResponsesContainer.appendChild(responseItem);
|
439 |
+
|
440 |
+
// Gestionnaire d'événement pour afficher/masquer le contenu
|
441 |
+
header.querySelector('.toggle-content').addEventListener('click', () => {
|
442 |
+
responseItem.classList.toggle('open');
|
443 |
+
header.querySelector('i').classList.toggle('fa-chevron-down');
|
444 |
+
header.querySelector('i').classList.toggle('fa-chevron-up');
|
445 |
+
MathJax.typesetPromise([content]);
|
446 |
+
content.classList.remove('math-hidden');
|
447 |
+
|
448 |
+
});
|
449 |
+
|
450 |
+
// Gestionnaire d'événement pour supprimer la réponse
|
451 |
+
header.querySelector('.delete-response').addEventListener('click', async () => {
|
452 |
try {
|
453 |
await localforage.removeItem(key);
|
454 |
console.log('Réponse supprimée:', key);
|
455 |
+
responseItem.remove();
|
456 |
} catch (error) {
|
457 |
console.error('Erreur lors de la suppression de la réponse:', error);
|
458 |
showError('Erreur lors de la suppression de la réponse');
|
459 |
}
|
460 |
+
});
|
|
|
|
|
|
|
|
|
|
|
|
|
461 |
|
462 |
+
MathJax.typesetPromise([content]);
|
463 |
+
content.classList.remove('math-hidden');
|
464 |
}
|
465 |
} catch (error) {
|
466 |
console.error('Erreur lors du chargement des réponses sauvegardées:', error);
|
|
|
504 |
|
505 |
} catch (error) {
|
506 |
console.error('Erreur:', error);
|
507 |
+
showError(error.message || 'Une erreur est survenue lors du traitement');
|
508 |
} finally {
|
509 |
loading.classList.remove('active');
|
510 |
submitButton.disabled = false;
|
|
|
516 |
|
517 |
// Gestionnaire d'événement pour effacer les réponses sauvegardées
|
518 |
clearSavedResponsesButton.addEventListener('click', clearSavedResponses);
|
519 |
+
|
520 |
});
|
521 |
|
522 |
</script>
|
523 |
</body>
|
524 |
|
525 |
+
</html>
|
|