malaknihed commited on
Commit
ef753ef
·
verified ·
1 Parent(s): 163316b

Update static/script.js

Browse files
Files changed (1) hide show
  1. static/script.js +57 -32
static/script.js CHANGED
@@ -8,7 +8,7 @@ document.getElementById('qesimgButton').addEventListener('click', loadImagePage)
8
  function loadResumerPage() {
9
  document.body.style.setProperty('--background-image', "url('resumer2.webp')");
10
 
11
-
12
  let appContainer = document.createElement("div");
13
  appContainer.classList.add("app-container");
14
  appContainer.innerHTML = `
@@ -73,9 +73,11 @@ function loadResumerPage() {
73
  </div>
74
  `;
75
 
 
76
  document.body.innerHTML = "";
77
  document.body.appendChild(appContainer);
78
 
 
79
  document.querySelector('.summary-action-btn').addEventListener('click', async () => {
80
  await uploadDocument();
81
  });
@@ -113,16 +115,15 @@ function loadResumerPage() {
113
  return;
114
  }
115
 
116
- if (data.summary) {
117
- resultElement.innerHTML =
118
  <h3 class="centered-title">📝 Summary generated :</h3>
119
  <br>
120
  <p>${data.summary}</p>
121
- ;
122
  document.getElementById("documentResult").dataset.summaryText = data.summary;
123
  document.getElementById("downloadSection").style.display = "block";
124
- }
125
- else {
126
  resultElement.innerText = "❌ Summary not available.";
127
  }
128
  } catch (error) {
@@ -179,14 +180,14 @@ function loadResumerPage() {
179
  }
180
  });
181
 
182
-
183
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
184
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
185
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
186
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
187
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
188
 
189
-
190
  const fileInput = document.getElementById('fileInput');
191
  const dropText = document.getElementById('dropText');
192
  const uploadIcon = document.getElementById('uploadIcon');
@@ -217,8 +218,7 @@ function loadResumerPage() {
217
  //Quand on clique sur le boutton traduction ---------------
218
 
219
 
220
- ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElement.innerText = "📝 Traduction :\n " + data.translated_text;
221
- function loadTraductionPage() {
222
  document.body.style.setProperty('--background-image', "url('traduction.webp')");
223
  let appContainer = document.createElement("div");
224
  appContainer.classList.add("app-container");
@@ -385,9 +385,10 @@ ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElemen
385
  document.body.innerHTML = "";
386
  document.body.appendChild(appContainer);
387
 
 
388
  loadExternalLibs();
389
 
390
-
391
  setupEventListeners();
392
 
393
  function loadExternalLibs() {
@@ -409,13 +410,14 @@ ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElemen
409
  }
410
 
411
  function setupEventListeners() {
412
-
413
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
414
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
415
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
416
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
417
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
418
 
 
419
  const fileInput = document.getElementById('translateFile');
420
  const dropText = document.getElementById('dropText');
421
  const uploadIcon = document.getElementById('uploadIcon');
@@ -437,8 +439,10 @@ ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElemen
437
  }
438
  });
439
 
 
440
  document.getElementById('translateButton').addEventListener('click', uploadForTranslation);
441
 
 
442
  document.getElementById('downloadPdf').addEventListener('click', downloadAsPdf);
443
  document.getElementById('downloadWord').addEventListener('click', downloadAsWord);
444
  document.getElementById('downloadPpt').addEventListener('click', downloadAsPowerPoint);
@@ -480,8 +484,9 @@ ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElemen
480
 
481
  if (data.translated_text) {
482
  resultElement.innerText = "📝 Traduction :\n " + data.translated_text;
483
-
484
  resultElement.dataset.translatedText = data.translated_text;
 
485
  document.getElementById("downloadSection").style.display = "block";
486
  } else {
487
  resultElement.innerText = "❌ Translation not available.";
@@ -553,11 +558,10 @@ ici aussi je veuxque leffet vocale lit le resultat de traduction : resultElemen
553
  URL.revokeObjectURL(url);
554
  }
555
  }
556
-
557
- //Quand on clique sur le boutton QSTDOC---------------
558
  function loadDocPage() {
559
  document.body.style.setProperty('--background-image', "url('qstdoc2.webp')");
560
 
 
561
  let appContainer = document.createElement("div");
562
  appContainer.classList.add("app-container");
563
  appContainer.innerHTML = `
@@ -617,9 +621,10 @@ function loadDocPage() {
617
  </div>
618
  `;
619
 
620
-
621
  document.body.innerHTML = "";
622
  document.body.appendChild(appContainer);
 
623
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
624
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
625
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
@@ -650,7 +655,8 @@ fileInput.addEventListener('change', function(event) {
650
  uploadIcon.style.display = "none";
651
  }
652
  });
653
-
 
654
  const askBtn = document.getElementById('askDocBtn');
655
  askBtn.addEventListener('click', async () => {
656
  const file = fileInput.files[0];
@@ -666,6 +672,7 @@ askBtn.addEventListener('click', async () => {
666
  formData.append("file", file);
667
  formData.append("question", question);
668
 
 
669
  answerDiv.innerHTML = "⏳Document analysis in progress...";
670
 
671
  try {
@@ -695,9 +702,10 @@ askBtn.addEventListener('click', async () => {
695
 
696
  //quand on clique sur visualisation ----------------------
697
  function loadVisualisationPage() {
698
-
699
  document.body.style.setProperty('--background-image', "url('visualisation.webp')");
700
-
 
701
  const appContainer = document.createElement("div");
702
  appContainer.className = "app-container";
703
  appContainer.innerHTML = `
@@ -712,25 +720,21 @@ askBtn.addEventListener('click', async () => {
712
  class="home-icon"
713
  style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);">
714
  </a>
715
-
716
  <div class="menu-section">
717
  <button class="menu-btn" id="resumerButton">SUMMARIZE</button>
718
  <button class="menu-btn" id="traductionbutton">TRANSLATE</button>
719
  <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button>
720
  </div>
721
-
722
  <div class="menu-section">
723
  <div class="menu-title">IMAGES</div>
724
  <button class="menu-btn" id="interpretationButton">INTERPRETATION</button>
725
  <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button>
726
  </div>
727
  </div>
728
-
729
  <div class="main-content-area">
730
  <div class="document-container">
731
  <h1 class="document-main-title">Documents Operations</h1>
732
  <h2 class="document-subtitle">VISUALIZATION 📊</h2>
733
-
734
  <div class="upload-container">
735
  <div class="file-drop-zone" id="fileDropZone">
736
  <label for="graphFileInput" class="file-upload-label">
@@ -753,7 +757,6 @@ askBtn.addEventListener('click', async () => {
753
  <button type="button" id="generateGraphBtn" class="graph-generate-btn">Generate</button>
754
  </div>
755
  </div>
756
-
757
  <div class="graph-results-container">
758
  <div class="graph-results-placeholder">
759
  <img id="graphResultImage" class="graph-result-img">
@@ -771,16 +774,20 @@ askBtn.addEventListener('click', async () => {
771
  </div>
772
  `;
773
 
 
774
  document.body.innerHTML = "";
775
  document.body.appendChild(appContainer);
776
 
 
777
  const setupEventListeners = () => {
 
778
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
779
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
780
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
781
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
782
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
783
 
 
784
  const fileInput = document.getElementById('graphFileInput');
785
  const dropText = document.getElementById('dropText');
786
  const uploadIcon = document.getElementById('uploadIcon');
@@ -799,18 +806,22 @@ askBtn.addEventListener('click', async () => {
799
  if (e.target.files[0]) {
800
  dropText.textContent = e.target.files[0].name;
801
  uploadIcon.style.display = "none";
 
802
  document.getElementById("downloadSection").style.display = "none";
803
  document.getElementById("graphResultImage").style.display = "none";
804
  document.getElementById("graphPlaceholderText").textContent = "Ready to generate the chart";
805
  }
806
  });
807
 
 
808
  document.getElementById('generateGraphBtn').addEventListener('click', generateGraph);
809
 
 
810
  document.getElementById('downloadPng').addEventListener('click', () => downloadGraph('png'));
811
  document.getElementById('downloadJpg').addEventListener('click', () => downloadGraph('jpg'));
812
  };
813
 
 
814
  const generateGraph = async () => {
815
  const fileInput = document.getElementById('graphFileInput');
816
  const graphTypeSelect = document.getElementById('graphTypeSelect');
@@ -818,6 +829,7 @@ askBtn.addEventListener('click', async () => {
818
  const placeholderText = document.getElementById('graphPlaceholderText');
819
  const downloadSection = document.getElementById("downloadSection");
820
 
 
821
  if (!fileInput.files[0]) {
822
  placeholderText.textContent = "⚠️No file selected";
823
  downloadSection.style.display = "none";
@@ -830,12 +842,13 @@ askBtn.addEventListener('click', async () => {
830
  return;
831
  }
832
 
 
833
  resultImage.style.display = "none";
834
  downloadSection.style.display = "none";
835
  placeholderText.textContent = "⏳ Graph generation in progress...";
836
 
837
  try {
838
-
839
  const formData = new FormData();
840
  formData.append("file", fileInput.files[0]);
841
  formData.append("query", graphTypeSelect.value);
@@ -855,9 +868,12 @@ if (result.error) {
855
  throw new Error(result.error);
856
  }
857
 
 
858
  const imageUrl = `data:image/png;base64,${result.image_base64}`;
859
 
 
860
  resultImage.onload = () => {
 
861
  document.getElementById("downloadSection").style.display = "block";
862
  placeholderText.textContent = "";
863
  };
@@ -873,6 +889,7 @@ resultImage.style.display = "block";
873
  }
874
  };
875
 
 
876
  const downloadGraph = (format) => {
877
  const resultImage = document.getElementById('graphResultImage');
878
  if (!resultImage.src || resultImage.style.display === "none") {
@@ -880,6 +897,7 @@ resultImage.style.display = "block";
880
  return;
881
  }
882
 
 
883
  const canvas = document.createElement('canvas');
884
  const ctx = canvas.getContext('2d');
885
  canvas.width = resultImage.naturalWidth;
@@ -893,17 +911,18 @@ resultImage.style.display = "block";
893
  extension = 'jpg';
894
  break;
895
 
896
- default:
897
  mimeType = 'image/png';
898
  extension = 'png';
899
  }
900
 
901
-
902
  canvas.toBlob((blob) => {
903
  downloadFile(blob, `graphique.${extension}`);
904
- }, mimeType, format === 'jpg' ? 0.92 : 1);
905
  };
906
 
 
907
  const downloadFile = (blob, filename) => {
908
  const url = URL.createObjectURL(blob);
909
  const a = document.createElement('a');
@@ -915,6 +934,7 @@ resultImage.style.display = "block";
915
  setTimeout(() => URL.revokeObjectURL(url), 100);
916
  };
917
 
 
918
  setupEventListeners();
919
  }
920
 
@@ -924,7 +944,7 @@ resultImage.style.display = "block";
924
  function loadInterpretationPage() {
925
  document.body.style.setProperty('--background-image', "url('interpreter.webp')");
926
 
927
-
928
  let appContainer = document.createElement("div");
929
  appContainer.classList.add("app-container");
930
  appContainer.innerHTML = `
@@ -977,11 +997,12 @@ function loadInterpretationPage() {
977
  </div>
978
  </div>
979
  `;
980
-
 
981
  document.body.innerHTML = "";
982
  document.body.appendChild(appContainer);
983
 
984
-
985
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
986
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
987
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
@@ -1015,7 +1036,7 @@ fileInput.addEventListener('change', function(event) {
1015
  }
1016
  });
1017
 
1018
-
1019
  interpretButton.addEventListener('click', async function () {
1020
  let file = fileInput.files[0];
1021
 
@@ -1061,6 +1082,7 @@ interpretButton.addEventListener('click', async function () {
1061
  function loadImagePage() {
1062
  document.body.style.setProperty('--background-image', "url('qstimage.webp')");
1063
 
 
1064
  let appContainer = document.createElement("div");
1065
  appContainer.classList.add("app-container");
1066
  appContainer.innerHTML = `
@@ -1121,9 +1143,11 @@ interpretButton.addEventListener('click', async function () {
1121
  </div>
1122
  `;
1123
 
 
1124
  document.body.innerHTML = "";
1125
  document.body.appendChild(appContainer);
1126
 
 
1127
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
1128
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
1129
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
@@ -1172,6 +1196,7 @@ sendBtn.addEventListener("click", async function () {
1172
  formData.append("file", file);
1173
  formData.append("question", question);
1174
 
 
1175
  resultContainer.innerHTML = `<p class="placeholder-text" style="text-align: center; color: black; font-weight: bold;">⏳ Waiting for the answer...</p>`;
1176
 
1177
  try {
 
8
  function loadResumerPage() {
9
  document.body.style.setProperty('--background-image', "url('resumer2.webp')");
10
 
11
+ // Effacer uniquement le contenu de la page sans casser le script
12
  let appContainer = document.createElement("div");
13
  appContainer.classList.add("app-container");
14
  appContainer.innerHTML = `
 
73
  </div>
74
  `;
75
 
76
+ // Insérer la nouvelle interface sans écraser les scripts
77
  document.body.innerHTML = "";
78
  document.body.appendChild(appContainer);
79
 
80
+ // Ajouter l'événement de clic pour le bouton "RÉSUMER"
81
  document.querySelector('.summary-action-btn').addEventListener('click', async () => {
82
  await uploadDocument();
83
  });
 
115
  return;
116
  }
117
 
118
+ if (data.summary) {
119
+ resultElement.innerHTML = `
120
  <h3 class="centered-title">📝 Summary generated :</h3>
121
  <br>
122
  <p>${data.summary}</p>
123
+ `;
124
  document.getElementById("documentResult").dataset.summaryText = data.summary;
125
  document.getElementById("downloadSection").style.display = "block";
126
+ } else {
 
127
  resultElement.innerText = "❌ Summary not available.";
128
  }
129
  } catch (error) {
 
180
  }
181
  });
182
 
183
+ // Reconnexion des boutons du menu latéral
184
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
185
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
186
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
187
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
188
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
189
 
190
+ // Gestion du dropzone
191
  const fileInput = document.getElementById('fileInput');
192
  const dropText = document.getElementById('dropText');
193
  const uploadIcon = document.getElementById('uploadIcon');
 
218
  //Quand on clique sur le boutton traduction ---------------
219
 
220
 
221
+ function loadTraductionPage() {
 
222
  document.body.style.setProperty('--background-image', "url('traduction.webp')");
223
  let appContainer = document.createElement("div");
224
  appContainer.classList.add("app-container");
 
385
  document.body.innerHTML = "";
386
  document.body.appendChild(appContainer);
387
 
388
+ // Chargement des librairies externes
389
  loadExternalLibs();
390
 
391
+ // Gestion des événements
392
  setupEventListeners();
393
 
394
  function loadExternalLibs() {
 
410
  }
411
 
412
  function setupEventListeners() {
413
+ // Navigation
414
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
415
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
416
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
417
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
418
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
419
 
420
+ // Gestion des fichiers
421
  const fileInput = document.getElementById('translateFile');
422
  const dropText = document.getElementById('dropText');
423
  const uploadIcon = document.getElementById('uploadIcon');
 
439
  }
440
  });
441
 
442
+ // Traduction
443
  document.getElementById('translateButton').addEventListener('click', uploadForTranslation);
444
 
445
+ // Téléchargements
446
  document.getElementById('downloadPdf').addEventListener('click', downloadAsPdf);
447
  document.getElementById('downloadWord').addEventListener('click', downloadAsWord);
448
  document.getElementById('downloadPpt').addEventListener('click', downloadAsPowerPoint);
 
484
 
485
  if (data.translated_text) {
486
  resultElement.innerText = "📝 Traduction :\n " + data.translated_text;
487
+ // Stocker le texte traduit pour le téléchargement
488
  resultElement.dataset.translatedText = data.translated_text;
489
+ // Afficher les options de téléchargement
490
  document.getElementById("downloadSection").style.display = "block";
491
  } else {
492
  resultElement.innerText = "❌ Translation not available.";
 
558
  URL.revokeObjectURL(url);
559
  }
560
  }
 
 
561
  function loadDocPage() {
562
  document.body.style.setProperty('--background-image', "url('qstdoc2.webp')");
563
 
564
+ // Créer une nouvelle structure pour ne pas écraser les événements
565
  let appContainer = document.createElement("div");
566
  appContainer.classList.add("app-container");
567
  appContainer.innerHTML = `
 
621
  </div>
622
  `;
623
 
624
+ // Insérer la nouvelle structure sans écraser les événements
625
  document.body.innerHTML = "";
626
  document.body.appendChild(appContainer);
627
+ // Réassocier les événements aux boutons
628
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
629
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
630
  document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage);
 
655
  uploadIcon.style.display = "none";
656
  }
657
  });
658
+ // 👉 Fonction d'envoi de la question/document
659
+ // 👉 Fonction d'envoi de la question/document
660
  const askBtn = document.getElementById('askDocBtn');
661
  askBtn.addEventListener('click', async () => {
662
  const file = fileInput.files[0];
 
672
  formData.append("file", file);
673
  formData.append("question", question);
674
 
675
+ // Afficher "⏳ Analyse du document en cours..." pendant le traitement
676
  answerDiv.innerHTML = "⏳Document analysis in progress...";
677
 
678
  try {
 
702
 
703
  //quand on clique sur visualisation ----------------------
704
  function loadVisualisationPage() {
705
+ // 1. Configuration de l'arrière-plan
706
  document.body.style.setProperty('--background-image', "url('visualisation.webp')");
707
+
708
+ // 2. Création de la structure HTML
709
  const appContainer = document.createElement("div");
710
  appContainer.className = "app-container";
711
  appContainer.innerHTML = `
 
720
  class="home-icon"
721
  style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);">
722
  </a>
 
723
  <div class="menu-section">
724
  <button class="menu-btn" id="resumerButton">SUMMARIZE</button>
725
  <button class="menu-btn" id="traductionbutton">TRANSLATE</button>
726
  <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button>
727
  </div>
 
728
  <div class="menu-section">
729
  <div class="menu-title">IMAGES</div>
730
  <button class="menu-btn" id="interpretationButton">INTERPRETATION</button>
731
  <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button>
732
  </div>
733
  </div>
 
734
  <div class="main-content-area">
735
  <div class="document-container">
736
  <h1 class="document-main-title">Documents Operations</h1>
737
  <h2 class="document-subtitle">VISUALIZATION 📊</h2>
 
738
  <div class="upload-container">
739
  <div class="file-drop-zone" id="fileDropZone">
740
  <label for="graphFileInput" class="file-upload-label">
 
757
  <button type="button" id="generateGraphBtn" class="graph-generate-btn">Generate</button>
758
  </div>
759
  </div>
 
760
  <div class="graph-results-container">
761
  <div class="graph-results-placeholder">
762
  <img id="graphResultImage" class="graph-result-img">
 
774
  </div>
775
  `;
776
 
777
+ // 3. Nettoyage et insertion
778
  document.body.innerHTML = "";
779
  document.body.appendChild(appContainer);
780
 
781
+ // 4. Gestion des événements
782
  const setupEventListeners = () => {
783
+ // Navigation
784
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
785
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
786
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
787
  document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage);
788
  document.getElementById('qesimgButton').addEventListener('click', loadImagePage);
789
 
790
+ // Gestion des fichiers
791
  const fileInput = document.getElementById('graphFileInput');
792
  const dropText = document.getElementById('dropText');
793
  const uploadIcon = document.getElementById('uploadIcon');
 
806
  if (e.target.files[0]) {
807
  dropText.textContent = e.target.files[0].name;
808
  uploadIcon.style.display = "none";
809
+ // Réinitialiser l'affichage quand un nouveau fichier est sélectionné
810
  document.getElementById("downloadSection").style.display = "none";
811
  document.getElementById("graphResultImage").style.display = "none";
812
  document.getElementById("graphPlaceholderText").textContent = "Ready to generate the chart";
813
  }
814
  });
815
 
816
+ // Génération du graphique
817
  document.getElementById('generateGraphBtn').addEventListener('click', generateGraph);
818
 
819
+ // Téléchargement du graphique
820
  document.getElementById('downloadPng').addEventListener('click', () => downloadGraph('png'));
821
  document.getElementById('downloadJpg').addEventListener('click', () => downloadGraph('jpg'));
822
  };
823
 
824
+ // 5. Fonction de génération du graphique
825
  const generateGraph = async () => {
826
  const fileInput = document.getElementById('graphFileInput');
827
  const graphTypeSelect = document.getElementById('graphTypeSelect');
 
829
  const placeholderText = document.getElementById('graphPlaceholderText');
830
  const downloadSection = document.getElementById("downloadSection");
831
 
832
+ // Validation
833
  if (!fileInput.files[0]) {
834
  placeholderText.textContent = "⚠️No file selected";
835
  downloadSection.style.display = "none";
 
842
  return;
843
  }
844
 
845
+ // Préparation de l'interface
846
  resultImage.style.display = "none";
847
  downloadSection.style.display = "none";
848
  placeholderText.textContent = "⏳ Graph generation in progress...";
849
 
850
  try {
851
+ // Envoi des données
852
  const formData = new FormData();
853
  formData.append("file", fileInput.files[0]);
854
  formData.append("query", graphTypeSelect.value);
 
868
  throw new Error(result.error);
869
  }
870
 
871
+ // Créer une URL de l'image à partir de la chaîne base64
872
  const imageUrl = `data:image/png;base64,${result.image_base64}`;
873
 
874
+ // Afficher l'image
875
  resultImage.onload = () => {
876
+ // Afficher les options de téléchargement une fois l'image chargée
877
  document.getElementById("downloadSection").style.display = "block";
878
  placeholderText.textContent = "";
879
  };
 
889
  }
890
  };
891
 
892
+ // 6. Fonction de téléchargement du graphique
893
  const downloadGraph = (format) => {
894
  const resultImage = document.getElementById('graphResultImage');
895
  if (!resultImage.src || resultImage.style.display === "none") {
 
897
  return;
898
  }
899
 
900
+ // Créer un canvas pour la conversion
901
  const canvas = document.createElement('canvas');
902
  const ctx = canvas.getContext('2d');
903
  canvas.width = resultImage.naturalWidth;
 
911
  extension = 'jpg';
912
  break;
913
 
914
+ default: // PNG par défaut
915
  mimeType = 'image/png';
916
  extension = 'png';
917
  }
918
 
919
+ // Conversion et téléchargement
920
  canvas.toBlob((blob) => {
921
  downloadFile(blob, `graphique.${extension}`);
922
+ }, mimeType, format === 'jpg' ? 0.92 : 1); // Qualité à 92% pour JPG, 100% pour PNG
923
  };
924
 
925
+ // 7. Fonction utilitaire pour le téléchargement
926
  const downloadFile = (blob, filename) => {
927
  const url = URL.createObjectURL(blob);
928
  const a = document.createElement('a');
 
934
  setTimeout(() => URL.revokeObjectURL(url), 100);
935
  };
936
 
937
+ // Initialisation
938
  setupEventListeners();
939
  }
940
 
 
944
  function loadInterpretationPage() {
945
  document.body.style.setProperty('--background-image', "url('interpreter.webp')");
946
 
947
+ // Créer une nouvelle structure pour ne pas écraser les événements
948
  let appContainer = document.createElement("div");
949
  appContainer.classList.add("app-container");
950
  appContainer.innerHTML = `
 
997
  </div>
998
  </div>
999
  `;
1000
+
1001
+ // Insérer la nouvelle structure sans écraser les événements
1002
  document.body.innerHTML = "";
1003
  document.body.appendChild(appContainer);
1004
 
1005
+ // Réassocier les événements aux boutons
1006
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
1007
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
1008
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
 
1036
  }
1037
  });
1038
 
1039
+ // Appel API backend pour interprétation
1040
  interpretButton.addEventListener('click', async function () {
1041
  let file = fileInput.files[0];
1042
 
 
1082
  function loadImagePage() {
1083
  document.body.style.setProperty('--background-image', "url('qstimage.webp')");
1084
 
1085
+ // Créer une nouvelle structure pour éviter d’écraser les événements
1086
  let appContainer = document.createElement("div");
1087
  appContainer.classList.add("app-container");
1088
  appContainer.innerHTML = `
 
1143
  </div>
1144
  `;
1145
 
1146
+ // Insérer la nouvelle structure sans écraser les événements
1147
  document.body.innerHTML = "";
1148
  document.body.appendChild(appContainer);
1149
 
1150
+ // Réassocier les événements aux boutons
1151
  document.getElementById('resumerButton').addEventListener('click', loadResumerPage);
1152
  document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage);
1153
  document.getElementById('qesdocButton').addEventListener('click', loadDocPage);
 
1196
  formData.append("file", file);
1197
  formData.append("question", question);
1198
 
1199
+ // Afficher le message de chargement
1200
  resultContainer.innerHTML = `<p class="placeholder-text" style="text-align: center; color: black; font-weight: bold;">⏳ Waiting for the answer...</p>`;
1201
 
1202
  try {