document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); //quand on clique sur le boutton resumer ------------------------ function loadResumerPage() { document.body.style.setProperty('--background-image', "url('resumer2.webp')"); // Effacer uniquement le contenu de la page sans casser le script let appContainer = document.createElement("div"); appContainer.classList.add("app-container"); appContainer.innerHTML = `

Documents Operations

SUMMARIZE 📋

The result will appear here...

`; // InsĂ©rer la nouvelle interface sans Ă©craser les scripts document.body.innerHTML = ""; document.body.appendChild(appContainer); // Ajouter l'Ă©vĂ©nement de clic pour le bouton "RÉSUMER" document.querySelector('.summary-action-btn').addEventListener('click', async () => { await uploadDocument(); }); async function uploadDocument() { let fileInput = document.getElementById("fileInput"); let resultElement = document.getElementById("documentResult"); if (fileInput.files.length === 0) { resultElement.innerText = "⚠ No file selected !"; return; } resultElement.innerText = "Loading the summary... 🕐"; let formData = new FormData(); formData.append("file", fileInput.files[0]); try { let response = await fetch("https://aiwebdev-smartdocai.hf.space/summarize/", { method: "POST", body: formData, headers: { "Accept": "application/json" } }); if (!response.ok) { throw new Error("Erreur de requĂȘte !"); } let data = await response.json(); console.log("đŸ“€ RĂ©ponse du serveur :", data); if (data.message && data.message.includes("ModĂšle en cours de chargement")) { resultElement.innerText = "Le rĂ©sumĂ© est en cours de gĂ©nĂ©ration. Veuillez patienter... 🕐"; return; } if (data.summary) { resultElement.innerHTML = `

📝 Summary generated :


${data.summary}

`; document.getElementById("documentResult").dataset.summaryText = data.summary; document.getElementById("downloadSection").style.display = "block"; const playVoiceBtn = document.getElementById("playVoiceBtn"); let isSpeaking = false; let utterance = null; playVoiceBtn.addEventListener("click", function () { if (isSpeaking) { // Si la lecture est en cours, on l'arrĂȘte window.speechSynthesis.cancel(); isSpeaking = false; } else { // Sinon, on commence Ă  lire const textToRead = document.getElementById("summaryText").textContent; utterance = new SpeechSynthesisUtterance(textToRead); utterance.lang = "en-US"; // ou "fr-FR" utterance.onend = function () { // Lecture terminĂ©e isSpeaking = false; }; window.speechSynthesis.speak(utterance); isSpeaking = true; } }); } else { resultElement.innerText = "❌ Summary not available."; } } catch (error) { console.error("❌ Erreur : ", error); resultElement.innerText = "Erreur lors de la demande !"; } } document.addEventListener("click", (e) => { const text = document.getElementById("documentResult").dataset.summaryText; if (!text) return; if (e.target.id === "downloadPdf") { const { jsPDF } = window.jspdf; const doc = new jsPDF(); let lines = doc.splitTextToSize(text, 180); doc.text(lines, 10, 10); doc.save('resume.pdf'); } if (e.target.id === "downloadWord") { const { Document, Paragraph, TextRun, Packer } = window.docx; const doc = new Document({ sections: [{ children: [new Paragraph({ children: [new TextRun(text)] })] }] }); Packer.toBlob(doc).then(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'resume.docx'; a.click(); URL.revokeObjectURL(url); }); } if (e.target.id === "downloadPpt") { const pptx = new window.PptxGenJS(); const slide = pptx.addSlide(); slide.addText(text, { x: 1, y: 1, w: 8, h: 4 }); pptx.writeFile({ fileName: 'resume.pptx' }); } if (e.target.id === "downloadTxt") { const blob = new Blob([text], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'resume.txt'; a.click(); URL.revokeObjectURL(url); } }); // Reconnexion des boutons du menu latĂ©ral document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); // Gestion du dropzone const fileInput = document.getElementById('fileInput'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); dropText.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); uploadIcon.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); fileInput.addEventListener('change', function(event) { let file = event.target.files[0]; if (file) { dropText.textContent = file.name; uploadIcon.style.display = "none"; } }); } //Quand on clique sur le boutton traduction --------------- function loadTraductionPage() { document.body.style.setProperty('--background-image', "url('traduction.webp')"); let appContainer = document.createElement("div"); appContainer.classList.add("app-container"); appContainer.innerHTML = `

Documents Operations

TRANSLATE 🌍

The result will appear here...

`; document.body.innerHTML = ""; document.body.appendChild(appContainer); // Chargement des librairies externes loadExternalLibs(); // Gestion des Ă©vĂ©nements setupEventListeners(); function loadExternalLibs() { if (!window.jspdf) { const script = document.createElement('script'); script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js'; document.head.appendChild(script); } if (!window.docx) { const script = document.createElement('script'); script.src = 'https://cdnjs.cloudflare.com/ajax/libs/docx/7.8.2/docx.min.js'; document.head.appendChild(script); } if (!window.PptxGenJS) { const script = document.createElement('script'); script.src = 'https://cdnjs.cloudflare.com/ajax/libs/PptxGenJS/3.11.0/pptxgen.min.js'; document.head.appendChild(script); } } function setupEventListeners() { // Navigation document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); // Gestion des fichiers const fileInput = document.getElementById('translateFile'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); dropText.addEventListener('click', (e) => { e.preventDefault(); fileInput.click(); }); uploadIcon.addEventListener('click', (e) => { e.preventDefault(); fileInput.click(); }); fileInput.addEventListener('change', (e) => { if (e.target.files[0]) { dropText.textContent = e.target.files[0].name; uploadIcon.style.display = "none"; } }); // Traduction document.getElementById('translateButton').addEventListener('click', uploadForTranslation); // TĂ©lĂ©chargements document.getElementById('downloadPdf').addEventListener('click', downloadAsPdf); document.getElementById('downloadWord').addEventListener('click', downloadAsWord); document.getElementById('downloadPpt').addEventListener('click', downloadAsPowerPoint); document.getElementById('downloadTxt').addEventListener('click', downloadAsText); } async function uploadForTranslation() { const fileInput = document.getElementById("translateFile"); const targetLang = document.getElementById("targetLanguageSelect").value; const resultElement = document.getElementById("translateResult"); if (!fileInput.files[0]) { resultElement.innerText = "No file selected"; return; } if (!targetLang) { resultElement.innerText = "Please select a language"; return; } const formData = new FormData(); formData.append("file", fileInput.files[0]); formData.append("target_lang", targetLang); try { resultElement.innerText = "Translation in progress...🕐"; const response = await fetch("https://aiwebdev-smartdocai.hf.space/translate/", { method: "POST", body: formData, headers: { "Accept": "application/json" } }); if (!response.ok) { throw new Error("Erreur de requĂȘte: " + await response.text()); } const data = await response.json(); if (data.translated_text) { resultElement.innerText = "📝 Translate :\n " + data.translated_text; // Stocker le texte traduit pour le tĂ©lĂ©chargement resultElement.dataset.translatedText = data.translated_text; // Afficher les options de tĂ©lĂ©chargement document.getElementById("downloadSection").style.display = "block"; } else { resultElement.innerText = "❌ Translation not available."; } } catch (error) { console.error("Erreur:", error); resultElement.innerText = "Échec de la traduction: " + error.message; } } function downloadAsPdf() { const text = document.getElementById("translateResult").dataset.translatedText; if (!text) return; const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.text(text, 10, 10); doc.save('traduction.pdf'); } async function downloadAsWord() { const text = document.getElementById("translateResult").dataset.translatedText; if (!text) return; const { Document, Paragraph, TextRun, Packer } = window.docx; const doc = new Document({ sections: [{ properties: {}, children: [ new Paragraph({ children: [ new TextRun(text) ] }) ] }] }); Packer.toBlob(doc).then(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'traduction.docx'; a.click(); URL.revokeObjectURL(url); }); } function downloadAsPowerPoint() { const text = document.getElementById("translateResult").dataset.translatedText; if (!text) return; const pptx = new window.PptxGenJS(); const slide = pptx.addSlide(); slide.addText(text, { x: 1, y: 1, w: 8, h: 4 }); pptx.writeFile({ fileName: 'traduction.pptx' }); } function downloadAsText() { const text = document.getElementById("translateResult").dataset.translatedText; if (!text) return; const blob = new Blob([text], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'traduction.txt'; a.click(); URL.revokeObjectURL(url); } } function loadDocPage() { document.body.style.setProperty('--background-image', "url('qstdoc2.webp')"); // CrĂ©er une nouvelle structure pour ne pas Ă©craser les Ă©vĂ©nements let appContainer = document.createElement("div"); appContainer.classList.add("app-container"); appContainer.innerHTML = `

Documents Operations

DOCUMENTS QUESTIONS 📄❓

The result will appear here...

`; // InsĂ©rer la nouvelle structure sans Ă©craser les Ă©vĂ©nements document.body.innerHTML = ""; document.body.appendChild(appContainer); // RĂ©associer les Ă©vĂ©nements aux boutons document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); const fileInput = document.getElementById('fileInput'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); + dropText.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); uploadIcon.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); fileInput.addEventListener('change', function(event) { let file = event.target.files[0]; if (file) { dropText.textContent = file.name; uploadIcon.style.display = "none"; } }); const askBtn = document.getElementById('askDocBtn'); askBtn.addEventListener('click', async () => { const file = fileInput.files[0]; const question = document.getElementById('questionInput').value; const answerDiv = document.getElementById('documentAnswer'); if (!file || !question) { answerDiv.innerHTML = "⚠ No question or file selected."; return; } const formData = new FormData(); formData.append("file", file); formData.append("question", question); answerDiv.innerHTML = "⏳Document analysis in progress..."; try { const response = await fetch("/doc-qa/", { method: "POST", body: formData }); const data = await response.json(); if (data.answer) { answerDiv.innerHTML = `

✅ The result :


${data.answer}

`; const playVoiceBtn = document.getElementById("playAnswerVoiceBtn"); playVoiceBtn.addEventListener("click", function () { const textToRead = document.getElementById("answerText").textContent; const utterance = new SpeechSynthesisUtterance(textToRead); utterance.lang = "en-US"; // ou adapte ici si tu as des rĂ©ponses en français window.speechSynthesis.speak(utterance); }); } else { answerDiv.innerHTML = `❌ ${data.error || "Erreur inconnue"}`; } } catch (error) { answerDiv.innerHTML = "❌ Erreur lors de l'envoi de la requĂȘte."; } }); } //quand on clique sur visualisation ---------------------- function loadVisualisationPage() { document.body.style.setProperty('--background-image', "url('visualisation.webp')"); const appContainer = document.createElement("div"); appContainer.className = "app-container"; appContainer.innerHTML = `

Documents Operations

VISUALIZATION 📊

The result will appear here...

`; // 3. Nettoyage et insertion document.body.innerHTML = ""; document.body.appendChild(appContainer); // 4. Gestion des Ă©vĂ©nements const setupEventListeners = () => { // Navigation document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); // Gestion des fichiers const fileInput = document.getElementById('graphFileInput'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); dropText.addEventListener('click', (e) => { e.preventDefault(); fileInput.click(); }); uploadIcon.addEventListener('click', (e) => { e.preventDefault(); fileInput.click(); }); fileInput.addEventListener('change', (e) => { if (e.target.files[0]) { dropText.textContent = e.target.files[0].name; uploadIcon.style.display = "none"; // RĂ©initialiser l'affichage quand un nouveau fichier est sĂ©lectionnĂ© document.getElementById("downloadSection").style.display = "none"; document.getElementById("graphResultImage").style.display = "none"; document.getElementById("graphPlaceholderText").textContent = "Ready to generate the chart"; } }); // GĂ©nĂ©ration du graphique document.getElementById('generateGraphBtn').addEventListener('click', generateGraph); // TĂ©lĂ©chargement du graphique document.getElementById('downloadPng').addEventListener('click', () => downloadGraph('png')); document.getElementById('downloadJpg').addEventListener('click', () => downloadGraph('jpg')); }; // 5. Fonction de gĂ©nĂ©ration du graphique const generateGraph = async () => { const fileInput = document.getElementById('graphFileInput'); const graphTypeSelect = document.getElementById('graphTypeSelect'); const resultImage = document.getElementById('graphResultImage'); const placeholderText = document.getElementById('graphPlaceholderText'); const downloadSection = document.getElementById("downloadSection"); // Validation if (!fileInput.files[0]) { placeholderText.textContent = "⚠No file selected"; downloadSection.style.display = "none"; return; } if (!graphTypeSelect.value) { placeholderText.textContent = "⚠No a chart type selected"; downloadSection.style.display = "none"; return; } // PrĂ©paration de l'interface resultImage.style.display = "none"; downloadSection.style.display = "none"; placeholderText.textContent = "⏳ Graph generation in progress..."; try { // Envoi des donnĂ©es const formData = new FormData(); formData.append("file", fileInput.files[0]); formData.append("query", graphTypeSelect.value); const response = await fetch("/generate_viz/", { method: "POST", body: formData, headers: { 'Accept': 'application/json' } }); if (!response.ok) { throw new Error(`Erreur ${response.status}: ${await response.text()}`); } const result = await response.json(); if (result.error) { throw new Error(result.error); } // CrĂ©er une URL de l'image Ă  partir de la chaĂźne base64 const imageUrl = `data:image/png;base64,${result.image_base64}`; // Afficher l'image resultImage.onload = () => { // Afficher les options de tĂ©lĂ©chargement une fois l'image chargĂ©e document.getElementById("downloadSection").style.display = "block"; placeholderText.textContent = ""; }; resultImage.src = imageUrl; resultImage.style.display = "block"; } catch (error) { console.error("Erreur:", error); placeholderText.textContent = `Erreur: ${error.message}`; resultImage.style.display = "none"; downloadSection.style.display = "none"; } }; // 6. Fonction de tĂ©lĂ©chargement du graphique const downloadGraph = (format) => { const resultImage = document.getElementById('graphResultImage'); if (!resultImage.src || resultImage.style.display === "none") { alert("Please generate a shart first"); return; } // CrĂ©er un canvas pour la conversion const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = resultImage.naturalWidth; canvas.height = resultImage.naturalHeight; ctx.drawImage(resultImage, 0, 0); let mimeType, extension; switch(format) { case 'jpg': mimeType = 'image/jpeg'; extension = 'jpg'; break; default: // PNG par dĂ©faut mimeType = 'image/png'; extension = 'png'; } // Conversion et tĂ©lĂ©chargement canvas.toBlob((blob) => { downloadFile(blob, `graphique.${extension}`); }, mimeType, format === 'jpg' ? 0.92 : 1); // QualitĂ© Ă  92% pour JPG, 100% pour PNG }; // 7. Fonction utilitaire pour le tĂ©lĂ©chargement const downloadFile = (blob, filename) => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(() => URL.revokeObjectURL(url), 100); }; // Initialisation setupEventListeners(); } //quand on clique sur interpretation --------------------- function loadInterpretationPage() { document.body.style.setProperty('--background-image', "url('interpreter.webp')"); // CrĂ©er une nouvelle structure pour ne pas Ă©craser les Ă©vĂ©nements let appContainer = document.createElement("div"); appContainer.classList.add("app-container"); appContainer.innerHTML = `

Images Operations

IMAGES INTERPRETATION đŸžïžđŸ€–

The result will appear here...

`; // Insérer la nouvelle structure sans écraser les événements document.body.innerHTML = ""; document.body.appendChild(appContainer); // Réassocier les événements aux boutons document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('qesimgButton').addEventListener('click', loadImagePage); const interpretButton = document.getElementById('interpretButton'); const resultContainer = document.getElementById('imageCaptionResult'); const fileInput = document.getElementById('fileInput'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); + dropText.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); uploadIcon.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); fileInput.addEventListener('change', function(event) { let file = event.target.files[0]; if (file) { dropText.textContent = file.name; uploadIcon.style.display = "none"; } }); // Appel API backend pour interprétation interpretButton.addEventListener('click', async function () { let file = fileInput.files[0]; if (!file) { resultContainer.innerHTML = `

⚠ No image selected.

`; return; } let formData = new FormData(); formData.append("file", file); // Afficher le message de chargement pendant l'analyse resultContainer.innerHTML = `

⏳ Image analysis in progress...

`; try { const response = await fetch("/image-caption/", { method: "POST", body: formData, }); const data = await response.json(); if (data.caption) { resultContainer.innerHTML = `

📾 Generated caption :


${data.caption}

`; // đŸŽ€ Ajouter l'effet vocal const playVoiceBtn = document.getElementById("playVoiceBtn"); playVoiceBtn.addEventListener("click", function () { const textToRead = document.getElementById("interpretationText").textContent; const utterance = new SpeechSynthesisUtterance(textToRead); utterance.lang = "en-US"; // adapte ici selon la langue de l'interprĂ©tation window.speechSynthesis.speak(utterance); }); } else if (data.error) { resultContainer.innerHTML = `

❌ Erreur : ${data.error}

`; } } catch (error) { resultContainer.innerHTML = `

❌ Erreur lors de l'envoi de l'image.

`; } }); } //quand on clique sur quesion image --------------- function loadImagePage() { document.body.style.setProperty('--background-image', "url('qstimage.webp')"); // CrĂ©er une nouvelle structure pour Ă©viter d’écraser les Ă©vĂ©nements let appContainer = document.createElement("div"); appContainer.classList.add("app-container"); appContainer.innerHTML = `

Images Operations

IMAGES QUESTIONS đŸ–Œïžâ“

The result will appear here...

`; // Insérer la nouvelle structure sans écraser les événements document.body.innerHTML = ""; document.body.appendChild(appContainer); // Réassocier les événements aux boutons document.getElementById('resumerButton').addEventListener('click', loadResumerPage); document.getElementById('traductionbutton').addEventListener('click', loadTraductionPage); document.getElementById('qesdocButton').addEventListener('click', loadDocPage); document.getElementById('visualisationButton').addEventListener('click', loadVisualisationPage); document.getElementById('interpretationButton').addEventListener('click', loadInterpretationPage); const fileInput = document.getElementById('imageInput'); const dropText = document.getElementById('dropText'); const uploadIcon = document.getElementById('uploadIcon'); + dropText.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); uploadIcon.addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); fileInput.click(); }); fileInput.addEventListener('change', function(event) { let file = event.target.files[0]; if (file) { dropText.textContent = file.name; uploadIcon.style.display = "none"; } }); const sendBtn = document.getElementById("sendImageQuestionBtn"); const questionInput = document.getElementById("questionInput"); const resultContainer = document.getElementById("imageAnswer"); sendBtn.addEventListener("click", async function () { const file = fileInput.files[0]; const question = questionInput.value.trim(); if (!file || !question) { resultContainer.innerHTML = "

⚠ No question or image selected.

"; return; } const formData = new FormData(); formData.append("file", file); formData.append("question", question); // Afficher le message de chargement resultContainer.innerHTML = `

⏳ Waiting for the answer...

`; try { const response = await fetch("/image-qa/", { method: "POST", body: formData }); const data = await response.json(); if (data.answer) { resultContainer.innerHTML = `

🧠 Generated answer :


${data.answer}

`; // đŸŽ€ Ajouter l'effet vocal const playVoiceBtn = document.getElementById("playVoiceBtn"); playVoiceBtn.addEventListener("click", function () { const textToRead = data.answer; const utterance = new SpeechSynthesisUtterance(textToRead); utterance.lang = "en-US"; // adapte ici selon la langue de la rĂ©ponse window.speechSynthesis.speak(utterance); }); } else { resultContainer.innerHTML = `

Erreur : ${data.error}

`; } } catch (error) { resultContainer.innerHTML = `

Erreur lors de l'envoi : ${error.message}

`; } }); }