Spaces:
Running
Running
Update static/script.js
Browse files- static/script.js +272 -92
static/script.js
CHANGED
@@ -40,11 +40,11 @@ function loadResumerPage() {
|
|
40 |
</label>
|
41 |
<input type="file" id="fileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden>
|
42 |
</div>
|
43 |
-
<button
|
44 |
</div>
|
45 |
<div class="results-container">
|
46 |
<div class="results-placeholder">
|
47 |
-
<
|
48 |
</div>
|
49 |
</div>
|
50 |
</div>
|
@@ -54,6 +54,66 @@ function loadResumerPage() {
|
|
54 |
// Insérer la nouvelle interface sans écraser les scripts
|
55 |
document.body.innerHTML = "";
|
56 |
document.body.appendChild(appContainer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
|
58 |
|
59 |
document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
|
@@ -428,91 +488,138 @@ fileInput.addEventListener('change', function(event) {
|
|
428 |
}
|
429 |
}
|
430 |
function loadDocPage() {
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
<
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
<
|
450 |
-
|
|
|
|
|
|
|
451 |
</div>
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
<div class="
|
459 |
-
<
|
460 |
-
<
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
|
|
|
|
|
|
|
|
468 |
</div>
|
469 |
-
<button class="question-btn">Envoyer</button>
|
470 |
</div>
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
|
|
475 |
</div>
|
476 |
</div>
|
477 |
</div>
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
|
491 |
-
|
492 |
const fileInput = document.getElementById('fileInput');
|
493 |
const dropText = document.getElementById('dropText');
|
494 |
const uploadIcon = document.getElementById('uploadIcon');
|
495 |
+
|
496 |
|
497 |
dropText.addEventListener('click', function(event) {
|
498 |
-
event.preventDefault();
|
499 |
-
event.stopPropagation();
|
500 |
-
fileInput.click();
|
501 |
});
|
502 |
|
503 |
uploadIcon.addEventListener('click', function(event) {
|
504 |
-
event.preventDefault();
|
505 |
-
event.stopPropagation();
|
506 |
-
fileInput.click();
|
507 |
});
|
508 |
|
509 |
fileInput.addEventListener('change', function(event) {
|
510 |
-
let file = event.target.files[0];
|
511 |
-
if (file) {
|
512 |
-
|
513 |
-
|
514 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
515 |
});
|
|
|
516 |
}
|
517 |
|
518 |
//quand on clique sur visualisation ----------------------
|
@@ -687,8 +794,7 @@ if (file) {
|
|
687 |
|
688 |
|
689 |
//quand on clique sur interpretation ---------------------
|
690 |
-
|
691 |
-
function loadInterpretationPage() {
|
692 |
document.body.style.setProperty('--background-image', "url('interpreter.webp')");
|
693 |
|
694 |
// Créer une nouvelle structure pour ne pas écraser les événements
|
@@ -727,11 +833,11 @@ if (file) {
|
|
727 |
</label>
|
728 |
<input type="file" id="fileInput" class="file-input" accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" hidden>
|
729 |
</div>
|
730 |
-
<button class="summary-action-btn">INTERPRET</button>
|
731 |
</div>
|
732 |
|
733 |
<div class="results-container">
|
734 |
-
<div class="results-placeholder">
|
735 |
<p class="placeholder-text">Le résultat apparaîtra ici...</p>
|
736 |
</div>
|
737 |
</div>
|
@@ -749,10 +855,12 @@ if (file) {
|
|
749 |
document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
|
750 |
document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
|
751 |
document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
|
752 |
-
|
|
|
|
|
753 |
const fileInput = document.getElementById('fileInput');
|
754 |
-
const dropText = document.getElementById('dropText');
|
755 |
-
const uploadIcon = document.getElementById('uploadIcon');
|
756 |
+
|
757 |
|
758 |
dropText.addEventListener('click', function(event) {
|
@@ -774,7 +882,47 @@ fileInput.addEventListener('change', function(event) {
|
|
774 |
uploadIcon.style.display = "none";
|
775 |
}
|
776 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
777 |
}
|
|
|
|
|
|
|
778 |
|
779 |
//quand on clique sur quesion image ---------------
|
780 |
|
@@ -815,7 +963,7 @@ fileInput.addEventListener('change', function(event) {
|
|
815 |
<img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload">
|
816 |
<span class="drop-text" id="dropText">Déposez votre image ici ou cliquez pour parcourir</span>
|
817 |
</label>
|
818 |
-
<input type="file" id="
|
819 |
</div>
|
820 |
|
821 |
|
@@ -823,11 +971,11 @@ fileInput.addEventListener('change', function(event) {
|
|
823 |
<div class="question">
|
824 |
<input type="text" id="questionInput" placeholder="Tapez votre question ici...">
|
825 |
</div>
|
826 |
-
<button class="question-btn">Envoyer</button>
|
827 |
</div>
|
828 |
</div>
|
829 |
|
830 |
-
<div class="results-container">
|
831 |
<div class="results-placeholder">
|
832 |
<p class="placeholder-text">Le résultat apparaîtra ici...</p>
|
833 |
</div>
|
@@ -839,7 +987,7 @@ fileInput.addEventListener('change', function(event) {
|
|
839 |
// Insérer la nouvelle structure sans écraser les événements
|
840 |
document.body.innerHTML = "";
|
841 |
document.body.appendChild(appContainer);
|
842 |
-
|
843 |
// Réassocier les événements aux boutons
|
844 |
document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
|
845 |
document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
|
@@ -847,7 +995,7 @@ fileInput.addEventListener('change', function(event) {
|
|
847 |
document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
|
848 |
document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
|
849 |
|
850 |
-
const fileInput = document.getElementById('
|
851 |
const dropText = document.getElementById('dropText');
|
852 |
const uploadIcon = document.getElementById('uploadIcon');
|
853 |
+
|
@@ -871,16 +1019,48 @@ fileInput.addEventListener('change', function(event) {
|
|
871 |
uploadIcon.style.display = "none";
|
872 |
}
|
873 |
});
|
874 |
-
|
875 |
-
|
876 |
-
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
-
|
881 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
882 |
}
|
883 |
-
|
884 |
-
|
885 |
-
|
886 |
-
}
|
|
|
|
|
|
|
|
40 |
</label>
|
41 |
<input type="file" id="fileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden>
|
42 |
</div>
|
43 |
+
<button class="summary-action-btn">RÉSUMER</button>
|
44 |
</div>
|
45 |
<div class="results-container">
|
46 |
<div class="results-placeholder">
|
47 |
+
<div id="documentResult" class="placeholder-text">Le résultat apparaîtra ici...</div>
|
48 |
</div>
|
49 |
</div>
|
50 |
</div>
|
|
|
54 |
// Insérer la nouvelle interface sans écraser les scripts
|
55 |
document.body.innerHTML = "";
|
56 |
document.body.appendChild(appContainer);
|
57 |
+
// Ajouter l'événement de clic pour le bouton "RÉSUMER"
|
58 |
+
document.querySelector('.summary-action-btn').addEventListener('click', async () => {
|
59 |
+
await uploadDocument();
|
60 |
+
});
|
61 |
+
|
62 |
+
|
63 |
+
async function uploadDocument() {
|
64 |
+
let fileInput = document.getElementById("fileInput");
|
65 |
+
let resultElement = document.getElementById("documentResult");
|
66 |
+
|
67 |
+
// Vérifier si un fichier a été sélectionné
|
68 |
+
if (fileInput.files.length === 0) {
|
69 |
+
resultElement.innerText = "⚠️ Aucun fichier sélectionné !";
|
70 |
+
return; // Arrêter l'exécution si aucun fichier
|
71 |
+
}
|
72 |
+
|
73 |
+
// Afficher "Chargement..." pendant que le résumé est en cours de préparation
|
74 |
+
resultElement.innerText = "Chargement du résumé... 🕐";
|
75 |
+
|
76 |
+
let formData = new FormData();
|
77 |
+
formData.append("file", fileInput.files[0]);
|
78 |
+
|
79 |
+
try {
|
80 |
+
let response = await fetch("https://malaknihed-smartdocsai.hf.space/summarize/", {
|
81 |
+
method: "POST",
|
82 |
+
body: formData,
|
83 |
+
headers: { "Accept": "application/json" }
|
84 |
+
});
|
85 |
+
|
86 |
+
if (!response.ok) {
|
87 |
+
throw new Error("Erreur de requête !");
|
88 |
+
}
|
89 |
+
|
90 |
+
let data = await response.json();
|
91 |
+
console.log("📤 Réponse du serveur :", data);
|
92 |
+
|
93 |
+
// Vérification si le modèle est encore en cours de chargement
|
94 |
+
if (data.message && data.message.includes("Modèle en cours de chargement")) {
|
95 |
+
resultElement.innerText = "Le résumé est en cours de génération. Veuillez patienter... 🕐";
|
96 |
+
return; // Ne pas continuer tant que le modèle n'est pas prêt
|
97 |
+
}
|
98 |
+
|
99 |
+
// Afficher le résumé ou un message d'erreur
|
100 |
+
if (data.summary) {
|
101 |
+
resultElement.innerHTML = `
|
102 |
+
<h3 class="centered-title">📝 Résumé généré :</h3>
|
103 |
+
<br>
|
104 |
+
<p>${data.summary}</p>
|
105 |
+
`;
|
106 |
+
} else {
|
107 |
+
resultElement.innerText = "❌ Résumé non disponible.";
|
108 |
+
}
|
109 |
+
} catch (error) {
|
110 |
+
console.error("❌ Erreur : ", error);
|
111 |
+
resultElement.innerText = "Erreur lors de la demande !";
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
|
116 |
+
|
117 |
|
118 |
|
119 |
document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
|
|
|
488 |
}
|
489 |
}
|
490 |
function loadDocPage() {
|
491 |
+
document.body.style.setProperty('--background-image', "url('qstdoc2.webp')");
|
492 |
+
|
493 |
+
// Créer une nouvelle structure pour ne pas écraser les événements
|
494 |
+
let appContainer = document.createElement("div");
|
495 |
+
appContainer.classList.add("app-container");
|
496 |
+
appContainer.innerHTML = `
|
497 |
+
<div class="sidebar">
|
498 |
+
<div class="logo-container">
|
499 |
+
<div class="logo-top">SMARTDOCS</div>
|
500 |
+
<div class="logo-bottom">AI</div>
|
501 |
+
</div>
|
502 |
+
|
503 |
+
<div class="menu-section">
|
504 |
+
<button class="menu-btn" id="resumerButton">RESUME</button>
|
505 |
+
<button class="menu-btn" id="traductionbutton">TRANSLATE</button>
|
506 |
+
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
|
507 |
+
</div>
|
508 |
+
|
509 |
+
<div class="menu-section">
|
510 |
+
<div class="menu-title">IMAGES</div>
|
511 |
+
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
|
512 |
+
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
|
513 |
+
</div>
|
514 |
</div>
|
515 |
+
|
516 |
+
<div class="main-content-area">
|
517 |
+
<div class="document-container">
|
518 |
+
<h1 class="document-main-title">Opérations sur documents</h1>
|
519 |
+
<h2 class="document-subtitle">QUESTION DOCUMENTS 📄❓</h2>
|
520 |
+
|
521 |
+
<div class="upload-container">
|
522 |
+
<div class="file-drop-zone" id="fileDropZone">
|
523 |
+
<label for="fileInput" class="file-upload-label">
|
524 |
+
<img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload">
|
525 |
+
<span class="drop-text" id="dropText">Déposez votre fichier ici ou cliquez pour parcourir</span>
|
526 |
+
</label>
|
527 |
+
<input type="file" id="fileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden>
|
528 |
+
</div>
|
529 |
+
|
530 |
+
<div class="question-container">
|
531 |
+
<div class="question">
|
532 |
+
<input type="text" id="questionInput" placeholder="Tapez votre question ici...">
|
533 |
+
</div>
|
534 |
+
<button class="question-btn" id="askDocBtn">Envoyer</button>
|
535 |
</div>
|
|
|
536 |
</div>
|
537 |
+
|
538 |
+
<div class="results-container">
|
539 |
+
<div class="results-placeholder">
|
540 |
+
<p id="documentAnswer" class="placeholder-text">Le résultat apparaîtra ici...</p>
|
541 |
+
</div>
|
542 |
</div>
|
543 |
</div>
|
544 |
</div>
|
545 |
+
`;
|
546 |
+
|
547 |
+
// Insérer la nouvelle structure sans écraser les événements
|
548 |
+
document.body.innerHTML = "";
|
549 |
+
document.body.appendChild(appContainer);
|
550 |
+
// Réassocier les événements aux boutons
|
551 |
+
document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
|
552 |
+
document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
|
553 |
+
document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
|
554 |
+
document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
|
555 |
+
document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
|
556 |
+
|
|
|
|
|
557 |
const fileInput = document.getElementById('fileInput');
|
558 |
const dropText = document.getElementById('dropText');
|
559 |
const uploadIcon = document.getElementById('uploadIcon');
|
560 |
+
|
561 |
|
562 |
dropText.addEventListener('click', function(event) {
|
563 |
+
event.preventDefault();
|
564 |
+
event.stopPropagation();
|
565 |
+
fileInput.click();
|
566 |
});
|
567 |
|
568 |
uploadIcon.addEventListener('click', function(event) {
|
569 |
+
event.preventDefault();
|
570 |
+
event.stopPropagation();
|
571 |
+
fileInput.click();
|
572 |
});
|
573 |
|
574 |
fileInput.addEventListener('change', function(event) {
|
575 |
+
let file = event.target.files[0];
|
576 |
+
if (file) {
|
577 |
+
dropText.textContent = file.name;
|
578 |
+
uploadIcon.style.display = "none";
|
579 |
+
}
|
580 |
+
});
|
581 |
+
// 👉 Fonction d'envoi de la question/document
|
582 |
+
// 👉 Fonction d'envoi de la question/document
|
583 |
+
const askBtn = document.getElementById('askDocBtn');
|
584 |
+
askBtn.addEventListener('click', async () => {
|
585 |
+
const file = fileInput.files[0];
|
586 |
+
const question = document.getElementById('questionInput').value;
|
587 |
+
const answerDiv = document.getElementById('documentAnswer');
|
588 |
+
|
589 |
+
if (!file || !question) {
|
590 |
+
answerDiv.innerHTML = "⚠️ Veuillez ajouter un fichier et une question.";
|
591 |
+
return;
|
592 |
+
}
|
593 |
+
|
594 |
+
const formData = new FormData();
|
595 |
+
formData.append("file", file);
|
596 |
+
formData.append("question", question);
|
597 |
+
|
598 |
+
// Afficher "⏳ Analyse du document en cours..." pendant le traitement
|
599 |
+
answerDiv.innerHTML = "⏳ Analyse du document en cours...";
|
600 |
+
|
601 |
+
try {
|
602 |
+
const response = await fetch("/doc-qa/", {
|
603 |
+
method: "POST",
|
604 |
+
body: formData
|
605 |
+
});
|
606 |
+
|
607 |
+
const data = await response.json();
|
608 |
+
if (data.answer) {
|
609 |
+
|
610 |
+
answerDiv.innerHTML = `
|
611 |
+
<h3 class="centered-title">✅ La réponse :</h3>
|
612 |
+
<br>
|
613 |
+
<p>${data.answer}</p>
|
614 |
+
`;
|
615 |
+
} else {
|
616 |
+
answerDiv.innerHTML = `❌ ${data.error || "Erreur inconnue"}`;
|
617 |
+
}
|
618 |
+
} catch (error) {
|
619 |
+
answerDiv.innerHTML = "❌ Erreur lors de l'envoi de la requête.";
|
620 |
+
}
|
621 |
});
|
622 |
+
|
623 |
}
|
624 |
|
625 |
//quand on clique sur visualisation ----------------------
|
|
|
794 |
|
795 |
|
796 |
//quand on clique sur interpretation ---------------------
|
797 |
+
function loadInterpretationPage() {
|
|
|
798 |
document.body.style.setProperty('--background-image', "url('interpreter.webp')");
|
799 |
|
800 |
// Créer une nouvelle structure pour ne pas écraser les événements
|
|
|
833 |
</label>
|
834 |
<input type="file" id="fileInput" class="file-input" accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" hidden>
|
835 |
</div>
|
836 |
+
<button class="summary-action-btn" id="interpretButton">INTERPRET</button>
|
837 |
</div>
|
838 |
|
839 |
<div class="results-container">
|
840 |
+
<div class="results-placeholder" id="imageCaptionResult">
|
841 |
<p class="placeholder-text">Le résultat apparaîtra ici...</p>
|
842 |
</div>
|
843 |
</div>
|
|
|
855 |
document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
|
856 |
document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
|
857 |
document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
|
858 |
+
|
859 |
+
const interpretButton = document.getElementById('interpretButton');
|
860 |
+
const resultContainer = document.getElementById('imageCaptionResult');
|
861 |
const fileInput = document.getElementById('fileInput');
|
862 |
+
const dropText = document.getElementById('dropText');
|
863 |
+
const uploadIcon = document.getElementById('uploadIcon');
|
864 |
+
|
865 |
|
866 |
dropText.addEventListener('click', function(event) {
|
|
|
882 |
uploadIcon.style.display = "none";
|
883 |
}
|
884 |
});
|
885 |
+
|
886 |
+
// Appel API backend pour interprétation
|
887 |
+
interpretButton.addEventListener('click', async function () {
|
888 |
+
let file = fileInput.files[0];
|
889 |
+
|
890 |
+
|
891 |
+
if (!file) {
|
892 |
+
resultContainer.innerHTML = `<p class="placeholder-text">⚠️ Veuillez sélectionner une image.</p>`;
|
893 |
+
return;
|
894 |
+
}
|
895 |
+
|
896 |
+
let formData = new FormData();
|
897 |
+
formData.append("file", file);
|
898 |
+
|
899 |
+
// Afficher le message de chargement pendant l'analyse
|
900 |
+
resultContainer.innerHTML = `<p class="placeholder-text">⏳ Analyse en cours...</p>`;
|
901 |
+
|
902 |
+
try {
|
903 |
+
const response = await fetch("/image-caption/", {
|
904 |
+
method: "POST",
|
905 |
+
body: formData,
|
906 |
+
});
|
907 |
+
|
908 |
+
const data = await response.json();
|
909 |
+
|
910 |
+
if (data.caption) {
|
911 |
+
|
912 |
+
resultContainer.innerHTML = `
|
913 |
+
<h3 class="centered-title">📸 Légende générée :</h3>
|
914 |
+
<br>
|
915 |
+
<p class="result-text">${data.caption}</p>
|
916 |
+
`;
|
917 |
+
} else if (data.error) {
|
918 |
+
resultContainer.innerHTML = `<p class="error-text">❌ Erreur : ${data.error}</p>`;
|
919 |
+
}
|
920 |
+
} catch (error) {
|
921 |
+
resultContainer.innerHTML = `<p class="error-text">❌ Erreur lors de l'envoi de l'image.</p>`;
|
922 |
}
|
923 |
+
});
|
924 |
+
|
925 |
+
}
|
926 |
|
927 |
//quand on clique sur quesion image ---------------
|
928 |
|
|
|
963 |
<img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload">
|
964 |
<span class="drop-text" id="dropText">Déposez votre image ici ou cliquez pour parcourir</span>
|
965 |
</label>
|
966 |
+
<input type="file" id="imageInput" class="file-input" accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" hidden>
|
967 |
</div>
|
968 |
|
969 |
|
|
|
971 |
<div class="question">
|
972 |
<input type="text" id="questionInput" placeholder="Tapez votre question ici...">
|
973 |
</div>
|
974 |
+
<button class="question-btn" id="sendImageQuestionBtn">Envoyer</button>
|
975 |
</div>
|
976 |
</div>
|
977 |
|
978 |
+
<div id="imageAnswer" class="results-container">
|
979 |
<div class="results-placeholder">
|
980 |
<p class="placeholder-text">Le résultat apparaîtra ici...</p>
|
981 |
</div>
|
|
|
987 |
// Insérer la nouvelle structure sans écraser les événements
|
988 |
document.body.innerHTML = "";
|
989 |
document.body.appendChild(appContainer);
|
990 |
+
|
991 |
// Réassocier les événements aux boutons
|
992 |
document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
|
993 |
document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
|
|
|
995 |
document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
|
996 |
document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
|
997 |
|
998 |
+
const fileInput = document.getElementById('imageInput');
|
999 |
const dropText = document.getElementById('dropText');
|
1000 |
const uploadIcon = document.getElementById('uploadIcon');
|
1001 |
+
|
|
|
1019 |
uploadIcon.style.display = "none";
|
1020 |
}
|
1021 |
});
|
1022 |
+
|
1023 |
+
const sendBtn = document.getElementById("sendImageQuestionBtn");
|
1024 |
+
const questionInput = document.getElementById("questionInput");
|
1025 |
+
const resultContainer = document.getElementById("imageAnswer");
|
1026 |
+
|
1027 |
+
sendBtn.addEventListener("click", async function () {
|
1028 |
+
const file = fileInput.files[0];
|
1029 |
+
const question = questionInput.value.trim();
|
1030 |
+
|
1031 |
+
if (!file || !question) {
|
1032 |
+
resultContainer.innerHTML = "<p class='placeholder-text'>⚠️ Veuillez sélectionner une image et poser une question.</p>";
|
1033 |
+
return;
|
1034 |
+
}
|
1035 |
+
|
1036 |
+
const formData = new FormData();
|
1037 |
+
formData.append("file", file);
|
1038 |
+
formData.append("question", question);
|
1039 |
+
|
1040 |
+
// Afficher le message de chargement
|
1041 |
+
resultContainer.innerHTML = `<p class="placeholder-text">⏳ En attente de la réponse...</p>`;
|
1042 |
+
|
1043 |
+
try {
|
1044 |
+
const response = await fetch("/image-qa/", {
|
1045 |
+
method: "POST",
|
1046 |
+
body: formData
|
1047 |
+
});
|
1048 |
+
|
1049 |
+
const data = await response.json();
|
1050 |
+
if (data.answer) {
|
1051 |
+
|
1052 |
+
resultContainer.innerHTML = `
|
1053 |
+
<h3 class="centered-title">🧠 Réponse générée :</h3>
|
1054 |
+
<br>
|
1055 |
+
<p class="result-text">${data.answer}</p>
|
1056 |
+
`;
|
1057 |
+
} else {
|
1058 |
+
resultContainer.innerHTML = `<p class="placeholder-text">Erreur : ${data.error}</p>`;
|
1059 |
}
|
1060 |
+
} catch (error) {
|
1061 |
+
resultContainer.innerHTML = `<p class="placeholder-text">Erreur lors de l'envoi : ${error.message}</p>`;
|
1062 |
+
}
|
1063 |
+
});
|
1064 |
+
}
|
1065 |
+
|
1066 |
+
|