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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOC</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="traductionbutton">TRANSLATE</button> <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button> <button class="menu-btn" id="visualisationButton">VISUALIZATION</button> </div> <div class="menu-section"> <div class="menu-title">IMAGES</div> <button class="menu-btn" id="interpretationButton">INTERPRETATION</button> <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Documents Operations</h1> <h2 class="document-subtitle">SUMMARIZE đ</h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="fileInput" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your file here or click to browse</span> </label> <input type="file" id="fileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden> </div> <button class="summary-action-btn">SUMMARIZE</button> </div> <div class="results-container"> <div class="results-placeholder"> <div id="scrollableResult" class="scrollable-text"> <p id="documentResult" class="placeholder-text" data-summary-text=""> The result will appear here... </p> <!-- Boutons de tĂ©lĂ©chargement visibles en bas --> <div id="downloadSection" style="display: none; margin-top: 20px;"> <h3 style="color: black; margin-bottom: 10px;">Download the summary</h3> <div style="display: flex; gap: 10px; flex-wrap: wrap; justify-content: center;"> <button id="downloadPdf" class="download-btn">PDF</button> <button id="downloadWord" class="download-btn">Word</button> <button id="downloadPpt" class="download-btn">PowerPoint</button> <button id="downloadTxt" class="download-btn">Text</button> </div> </div> </div> </div> </div> </div> </div> `; // 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 = ` <div style="display: flex; align-items: center; justify-content: flex-end; margin-bottom: 10px;"> <button id="playVoiceBtn" style=" background: linear-gradient(125deg, rgba(163, 94, 237, 0.9) 0%, rgba(65, 159, 232, 0.9) 75%); color: white; border: none; padding: 10px 16px; border-radius: 12px; cursor: pointer; font-size: 14px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; "> đ Listen to Summary </button> </div> <h3 class="centered-title">đ Summary generated :</h3> <br> <p id="summaryText">${data.summary}</p> `; 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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOCS</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="resumerButton">SUMMARIZE</button> <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button> <button class="menu-btn" id="visualisationButton">VISUALIZATION</button> </div> <div class="menu-section"> <div class="menu-title">IMAGES</div> <button class="menu-btn" id="interpretationButton">INTERPRETATION</button> <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Documents Operations</h1> <h2 class="document-subtitle">TRANSLATE đ </h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="translateFile" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your file here or click to browse</span> </label> <input type="file" id="translateFile" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden> </div> <div class="action-container"> <select id="targetLanguageSelect" class="language-dropdown"> <option value="">Select language</option> <option value="af">Afrikaans</option> <option value="am">Amharic</option> <option value="ar">Arabic</option> <option value="ast">Asturian</option> <option value="az">Azerbaijani</option> <option value="ba">Bashkir</option> <option value="be">Belarusian</option> <option value="bg">Bulgarian</option> <option value="bn">Bengali</option> <option value="br">Breton</option> <option value="bs">Bosnian</option> <option value="ca">Catalan; Valencian</option> <option value="ceb">Cebuano</option> <option value="cs">Czech</option> <option value="cy">Welsh</option> <option value="da">Danish</option> <option value="de">German</option> <option value="el">Greek</option> <option value="en">English</option> <option value="es">Spanish</option> <option value="et">Estonian</option> <option value="fa">Persian</option> <option value="ff">Fulah</option> <option value="fi">Finnish</option> <option value="fr">French</option> <option value="fy">Western Frisian</option> <option value="ga">Irish</option> <option value="gd">Gaelic; Scottish Gaelic</option> <option value="gl">Galician</option> <option value="gu">Gujarati</option> <option value="ha">Hausa</option> <option value="he">Hebrew</option> <option value="hi">Hindi</option> <option value="hr">Croatian</option> <option value="ht">Haitian; Haitian Creole</option> <option value="hu">Hungarian</option> <option value="hy">Armenian</option> <option value="id">Indonesian</option> <option value="ig">Igbo</option> <option value="ilo">Iloko</option> <option value="is">Icelandic</option> <option value="it">Italian</option> <option value="ja">Japanese</option> <option value="jv">Javanese</option> <option value="ka">Georgian</option> <option value="kk">Kazakh</option> <option value="km">Central Khmer</option> <option value="kn">Kannada</option> <option value="ko">Korean</option> <option value="lb">Luxembourgish</option> <option value="lg">Ganda</option> <option value="ln">Lingala</option> <option value="lo">Lao</option> <option value="lt">Lithuanian</option> <option value="lv">Latvian</option> <option value="mg">Malagasy</option> <option value="mk">Macedonian</option> <option value="ml">Malayalam</option> <option value="mn">Mongolian</option> <option value="mr">Marathi</option> <option value="ms">Malay</option> <option value="my">Burmese</option> <option value="ne">Nepali</option> <option value="nl">Dutch; Flemish</option> <option value="no">Norwegian</option> <option value="ns">Northern Sotho</option> <option value="oc">Occitan (post 1500)</option> <option value="or">Oriya</option> <option value="pa">Panjabi; Punjabi</option> <option value="pl">Polish</option> <option value="ps">Pushto; Pashto</option> <option value="pt">Portuguese</option> <option value="ro">Romanian; Moldavian</option> <option value="ru">Russian</option> <option value="sd">Sindhi</option> <option value="si">Sinhala; Sinhalese</option> <option value="sk">Slovak</option> <option value="sl">Slovenian</option> <option value="so">Somali</option> <option value="sq">Albanian</option> <option value="sr">Serbian</option> <option value="ss">Swati</option> <option value="su">Sundanese</option> <option value="sv">Swedish</option> <option value="sw">Swahili</option> <option value="ta">Tamil</option> <option value="th">Thai</option> <option value="tl">Tagalog</option> <option value="tn">Tswana</option> <option value="tr">Turkish</option> <option value="uk">Ukrainian</option> <option value="ur">Urdu</option> <option value="uz">Uzbek</option> <option value="vi">Vietnamese</option> <option value="wo">Wolof</option> <option value="xh">Xhosa</option> <option value="yi">Yiddish</option> <option value="yo">Yoruba</option> <option value="zh">Chinese</option> <option value="zu">Zulu</option> </select> <button class="translate" id="translateButton">Translate</button> </div> </div> <div class="results-container"> <div class="results-placeholder"> <div id="scrollableResult" class="scrollable-text"> <p class="placeholder-text" id="translateResult">The result will appear here...</p> <div id="downloadSection" style="display: none; margin-top: 20px;"> <h3 style="color: white; margin-bottom: 10px;">Download the translation</h3> <div style="display: flex; gap: 10px;"> <button id="downloadPdf" class="download-btn">PDF</button> <button id="downloadWord" class="download-btn">Word</button> <button id="downloadPpt" class="download-btn">PowerPoint</button> <button id="downloadTxt" class="download-btn">Texte</button> </div> </div> </div> </div> </div> </div> </div> `; 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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOCS</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="resumerButton">SUMMARIZE</button> <button class="menu-btn" id="traductionbutton">TRANSLATE</button> <button class="menu-btn" id="visualisationButton">VISUALIZATION</button> </div> <div class="menu-section"> <div class="menu-title">IMAGES</div> <button class="menu-btn" id="interpretationButton">INTERPRETATION</button> <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Documents Operations</h1> <h2 class="document-subtitle">DOCUMENTS QUESTIONS đâ</h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="fileInput" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your file here or click to browse</span> </label> <input type="file" id="fileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden> </div> <div class="question-container"> <div class="question"> <input type="text" id="questionInput" placeholder="Enter your question here..."> </div> <button class="question-btn" id="askDocBtn">Send</button> </div> </div> <div class="results-container"> <div class="results-placeholder"> <p id="documentAnswer" class="placeholder-text">The result will appear here...</p> </div> </div> </div> </div> `; // 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 = ` <div style="display: flex; align-items: center; justify-content: flex-end; margin-bottom: 10px;"> <button id="playAnswerVoiceBtn" style=" background: linear-gradient(125deg, rgba(163, 94, 237, 0.9) 0%, rgba(65, 159, 232, 0.9) 75%); color: white; border: none; padding: 10px 16px; border-radius: 12px; cursor: pointer; font-size: 14px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; "> đ Listen to Answer </button> </div> <h3 class="centered-title">â The result :</h3> <br> <p id="answerText">${data.answer}</p> `; 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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOCS</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="resumerButton">SUMMARIZE</button> <button class="menu-btn" id="traductionbutton">TRANSLATE</button> <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button> </div> <div class="menu-section"> <div class="menu-title">IMAGES</div> <button class="menu-btn" id="interpretationButton">INTERPRETATION</button> <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Documents Operations</h1> <h2 class="document-subtitle">VISUALIZATION đ</h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="graphFileInput" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your file here or click to browse</span> </label> <input type="file" id="graphFileInput" class="file-input" accept=".doc,.docx,.xls,.xlsx,.pdf,.ppt,.pptx" hidden> </div> <div class="graph-action-container"> <select id="graphTypeSelect" class="language-dropdown"> <option value="">Select type</option> <option value="histplot">Histogram</option> <option value="scatterplot">Point cloud</option> <option value="lineplot">Curve</option> <option value="barplot">Bar chart</option> <option value="boxplot">Boxplot</option> </select> <button type="button" id="generateGraphBtn" class="graph-generate-btn">Generate</button> </div> </div> <div class="graph-results-container"> <div class="graph-results-placeholder"> <img id="graphResultImage" class="graph-result-img"> <p class="placeholder-text" id="graphPlaceholderText">The result will appear here...</p> </div> <div id="downloadSection" style="display: none; margin-top: 20px; text-align: center;"> <h3 style="color: white; margin-bottom: 10px;">Download the graph</h3> <div style="display: flex; justify-content: center; gap: 10px;"> <button id="downloadPng" class="download-btn">PNG</button> <button id="downloadJpg" class="download-btn">JPG</button> </div> </div> </div> </div> </div> `; // 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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOCS</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="qesimgButton">IMAGES-QUESTIONS</button> </div> <div class="menu-section"> <div class="menu-title">DOCUMENTS</div> <button class="menu-btn" id="resumerButton">SUMMARIZE</button> <button class="menu-btn" id="traductionbutton">TRANSLATE</button> <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button> <button class="menu-btn" id="visualisationButton">VISUALIZATION</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Images Operations</h1> <h2 class="document-subtitle">IMAGES INTERPRETATION đïžđ€</h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="fileInput" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your image here or click to browse</span> </label> <input type="file" id="fileInput" class="file-input" accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" hidden> </div> <button class="summary-action-btn" id="interpretButton">INTERPRET</button> </div> <div class="results-container"> <div class="results-placeholder" id="imageCaptionResult"> <p class="placeholder-text">The result will appear here...</p> </div> </div> </div> </div> `; // 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 = `<p class="placeholder-text">â ïž No image selected.</p>`; return; } let formData = new FormData(); formData.append("file", file); // Afficher le message de chargement pendant l'analyse resultContainer.innerHTML = `<p class="placeholder-text">âł Image analysis in progress...</p>`; try { const response = await fetch("/image-caption/", { method: "POST", body: formData, }); const data = await response.json(); if (data.caption) { resultContainer.innerHTML = ` <div style="display: flex; align-items: center; justify-content: flex-end; margin-bottom: 10px;"> <button id="playVoiceBtn" style=" background: linear-gradient(125deg, rgba(163, 94, 237, 0.9) 0%, rgba(65, 159, 232, 0.9) 75%); color: white; border: none; padding: 10px 16px; border-radius: 12px; cursor: pointer; font-size: 14px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; "> đ Listen to Interpretation </button> </div> <h3 style="text-align: center; font-size: 1.5rem; font-weight: bold; color: black;">đž Generated caption :</h3> <br> <p id="interpretationText" style="text-align: center; font-size: 1.2rem; font-weight: bold; color: black;">${data.caption}</p> `; // đ€ 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 = `<p class="error-text">â Erreur : ${data.error}</p>`; } } catch (error) { resultContainer.innerHTML = `<p class="error-text">â Erreur lors de l'envoi de l'image.</p>`; } }); } //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 = ` <div class="sidebar"> <div class="logo-container"> <div class="logo-top">SMARTDOCS</div> <div class="logo-bottom">AI</div> </div> <a href="principal.html" class="home-link"> <img src="https://cdn-icons-png.flaticon.com/512/1946/1946436.png" alt="Accueil" class="home-icon" style="filter: brightness(0) saturate(100%) invert(71%) sepia(16%) saturate(4251%) hue-rotate(180deg) brightness(104%) contrast(91%);"> </a> <div class="menu-section"> <button class="menu-btn" id="interpretationButton">INTERPRETATION</button> </div> <div class="menu-section"> <div class="menu-title">DOCUMENTS</div> <button class="menu-btn" id="resumerButton">SUMMARIZE</button> <button class="menu-btn" id="traductionbutton">TRANSLATE</button> <button class="menu-btn" id="qesdocButton">DOC-QUESTIONS</button> <button class="menu-btn" id="visualisationButton">VISUALIZATION</button> </div> </div> <div class="main-content-area"> <div class="document-container"> <h1 class="document-main-title">Images Operations</h1> <h2 class="document-subtitle">IMAGES QUESTIONS đŒïžâ</h2> <div class="upload-container"> <div class="file-drop-zone" id="fileDropZone"> <label for="fileInput" class="file-upload-label"> <img src="up.png" id="uploadIcon" class="upload-icon" alt="Upload"> <span class="drop-text" id="dropText">Drop your image here or click to browse</span> </label> <input type="file" id="imageInput" class="file-input" accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" hidden> </div> <div class="question-container"> <div class="question"> <input type="text" id="questionInput" placeholder="Enter your question here..."> </div> <button class="question-btn" id="sendImageQuestionBtn">Send</button> </div> </div> <div id="imageAnswer" class="results-container"> <div class="results-placeholder"> <p class="placeholder-text">The result will appear here...</p> </div> </div> </div> </div> `; // 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 = "<p class='placeholder-text'>â ïž No question or image selected.</p>"; return; } const formData = new FormData(); formData.append("file", file); formData.append("question", question); // Afficher le message de chargement resultContainer.innerHTML = `<p class="placeholder-text" style="text-align: center; color: black; font-weight: bold;">âł Waiting for the answer...</p>`; try { const response = await fetch("/image-qa/", { method: "POST", body: formData }); const data = await response.json(); if (data.answer) { resultContainer.innerHTML = ` <div style="display: flex; align-items: center; justify-content: flex-end; margin-bottom: 10px;"> <button id="playVoiceBtn" style=" background: linear-gradient(125deg, rgba(163, 94, 237, 0.9) 0%, rgba(65, 159, 232, 0.9) 75%); color: white; border: none; padding: 10px 16px; border-radius: 12px; cursor: pointer; font-size: 14px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; "> đ Listen to Answer </button> </div> <h3 style="text-align: center; font-size: 1.5rem; font-weight: bold; color: black">đ§ Generated answer :</h3> <br> <p style="text-align: center; font-size: 1.2rem; font-weight: bold; color: black;">${data.answer}</p> `; // đ€ 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 = `<p class="placeholder-text">Erreur : ${data.error}</p>`; } } catch (error) { resultContainer.innerHTML = `<p class="placeholder-text">Erreur lors de l'envoi : ${error.message}</p>`; } }); }