smartdocai / static /script.js
malaknihed's picture
Update static/script.js
53f7e47 verified
raw
history blame
50.1 kB
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">SMARTDOCS</div>
<div class="logo-bottom">AI</div>
</div>
<div class="menu-section">
<button class="menu-btn" id="traductionbutton">TRADUCTION</button>
<button class="menu-btn" id="qesdocButton">QUESTION</button>
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
</div>
<div class="menu-section">
<div class="menu-title">IMAGES</div>
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur documents</h1>
<h2 class="document-subtitle">RÉSUMER 📋</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">Déposez votre fichier ici ou cliquez pour parcourir</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">RÉSUMER</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="">
Le résultat apparaîtra ici...
</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;">Télécharger le résumé</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">Texte</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 = "⚠️ Aucun fichier sélectionné !";
return;
}
resultElement.innerText = "Chargement du résumé... 🕐";
let formData = new FormData();
formData.append("file", fileInput.files[0]);
try {
let response = await fetch("https://malaknihed-smartdocsai.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 = `
<h3 class="centered-title">📝 Résumé généré :</h3>
<br>
<p>${data.summary}</p>
`;
document.getElementById("documentResult").dataset.summaryText = data.summary;
document.getElementById("downloadSection").style.display = "block";
} else {
resultElement.innerText = "❌ Résumé non disponible.";
}
} 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>
<div class="menu-section">
<button class="menu-btn" id="resumerButton">RESUME</button>
<button class="menu-btn" id="qesdocButton">QUESTION</button>
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
</div>
<div class="menu-section">
<div class="menu-title">IMAGES</div>
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur documents</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">Déposez votre fichier ici ou cliquez pour parcourir</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">
<p class="placeholder-text" id="translateResult">Le résultat apparaîtra ici...</p>
<div id="downloadSection" style="display: none; margin-top: 20px;">
<h3 style="color: white; margin-bottom: 10px;">Télécharger la traduction</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>
`;
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 = "Veuillez sélectionner un fichier";
return;
}
if (!targetLang) {
resultElement.innerText = "Veuillez sélectionner une langue";
return;
}
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("target_lang", targetLang);
try {
resultElement.innerText = "Traduction en cours...";
const response = await fetch("/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 = "📝 Traduction : " + 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 = "❌ Traduction non disponible.";
}
} 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>
<div class="menu-section">
<button class="menu-btn" id="resumerButton">RESUME</button>
<button class="menu-btn" id="traductionbutton">TRANSLATE</button>
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
</div>
<div class="menu-section">
<div class="menu-title">IMAGES</div>
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur documents</h1>
<h2 class="document-subtitle">QUESTION DOCUMENTS 📄❓</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">Déposez votre fichier ici ou cliquez pour parcourir</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="Tapez votre question ici...">
</div>
<button class="question-btn" id="askDocBtn">Envoyer</button>
</div>
</div>
<div class="results-container">
<div class="results-placeholder">
<p id="documentAnswer" class="placeholder-text">Le résultat apparaîtra ici...</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";
}
});
// 👉 Fonction d'envoi de la question/document
// 👉 Fonction d'envoi de la question/document
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 = "⚠️ Veuillez ajouter un fichier et une question.";
return;
}
const formData = new FormData();
formData.append("file", file);
formData.append("question", question);
// Afficher "⏳ Analyse du document en cours..." pendant le traitement
answerDiv.innerHTML = "⏳ Analyse du document en cours...";
try {
const response = await fetch("/doc-qa/", {
method: "POST",
body: formData
});
const data = await response.json();
if (data.answer) {
answerDiv.innerHTML = `
<h3 class="centered-title">✅ La réponse :</h3>
<br>
<p>${data.answer}</p>
`;
} 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() {
// 1. Configuration de l'arrière-plan
document.body.style.setProperty('--background-image', "url('visualisation.webp')");
// 2. Création de la structure HTML
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>
<div class="menu-section">
<button class="menu-btn" id="resumerButton">RESUME</button>
<button class="menu-btn" id="traductionbutton">TRANSLATE</button>
<button class="menu-btn" id="qesdocButton">QUESTION</button>
</div>
<div class="menu-section">
<div class="menu-title">IMAGES</div>
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur documents</h1>
<h2 class="document-subtitle">VISUALISATION</h2>
<!-- Conteneur d'upload (pas un formulaire) -->
<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">Déposez votre fichier ici ou cliquez pour parcourir</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">Histogramme</option>
<option value="scatterplot">Nuage de points</option>
<option value="lineplot">Courbe</option>
<option value="barplot">Diagramme en barres</option>
<option value="boxplot">Boîte à moustaches</option>
</select>
<button type="button" id="generateGraphBtn" class="visualiser">Générer</button>
</div>
</div>
<!-- Zone de résultats -->
<div class="graph-results-container">
<div class="graph-results-placeholder">
<img id="graphResultImage" class="graph-result-img">
<p class="placeholder-text" id="graphPlaceholderText">Le résultat apparaîtra ici...</p>
</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";
}
});
// Génération du graphique
document.getElementById('generateGraphBtn').addEventListener('click', generateGraph);
};
// 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');
// Validation
if (!fileInput.files[0]) {
placeholderText.textContent = "Veuillez sélectionner un fichier";
return;
}
if (!graphTypeSelect.value) {
placeholderText.textContent = "Veuillez sélectionner un type de graphique";
return;
}
// Préparation de l'interface
resultImage.style.display = "none";
placeholderText.textContent = "Génération du graphique...";
try {
// Envoi des données
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("query", graphTypeSelect.value);
const response = await fetch("http://localhost:8000/generate_viz/", {
method: "POST",
body: formData,
headers: { 'Accept': 'image/*' }
});
// Vérification
if (!response.ok) {
throw new Error(`Erreur ${response.status}: ${await response.text()}`);
}
const contentType = response.headers.get('Content-Type');
if (!contentType?.includes('image')) {
throw new Error("Réponse non reconnue comme image");
}
// Affichage
const imageBlob = await response.blob();
resultImage.onload = () => URL.revokeObjectURL(resultImage.src);
resultImage.src = URL.createObjectURL(imageBlob);
resultImage.style.display = "block";
placeholderText.textContent = "";
} catch (error) {
console.error("Erreur:", error);
placeholderText.textContent = `Erreur: ${error.message}`;
resultImage.style.display = "none";
}
};
// 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>
<div class="menu-section">
<button class="menu-btn" id="qesimgButton">QUESTIONS</button>
</div>
<div class="menu-section">
<div class="menu-title">DOCUMENTS</div>
<button class="menu-btn" id="resumerButton">RESUMER</button>
<button class="menu-btn" id="traductionbutton">TRANSLATE</button>
<button class="menu-btn" id="qesdocButton">QUESTION</button>
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur images</h1>
<h2 class="document-subtitle">INTERPRÉTATION DES IMAGES 🏞️🤖</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">Déposez votre image ici ou cliquez pour parcourir</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">Le résultat apparaîtra ici...</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">⚠️ Veuillez sélectionner une image.</p>`;
return;
}
let formData = new FormData();
formData.append("file", file);
// Afficher le message de chargement pendant l'analyse
resultContainer.innerHTML = `<p class="placeholder-text">⏳ Analyse en cours...</p>`;
try {
const response = await fetch("/image-caption/", {
method: "POST",
body: formData,
});
const data = await response.json();
if (data.caption) {
resultContainer.innerHTML = `
<h3 class="centered-title">📸 Légende générée :</h3>
<br>
<p class="result-text">${data.caption}</p>
`;
} 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>
<div class="menu-section">
<button class="menu-btn" id="interpretationButton">INTERPRETER</button>
</div>
<div class="menu-section">
<div class="menu-title">DOCUMENTS</div>
<button class="menu-btn" id="resumerButton">RESUMER</button>
<button class="menu-btn" id="traductionbutton">TRANSLATE</button>
<button class="menu-btn" id="qesdocButton">QUESTION</button>
<button class="menu-btn" id="visualisationButton">VISUALISATION</button>
</div>
</div>
<div class="main-content-area">
<div class="document-container">
<h1 class="document-main-title">Opérations sur images</h1>
<h2 class="document-subtitle">QUESTION IMAGES 🖼️❓</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">Déposez votre image ici ou cliquez pour parcourir</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="Tapez votre question ici...">
</div>
<button class="question-btn" id="sendImageQuestionBtn">Envoyer</button>
</div>
</div>
<div id="imageAnswer" class="results-container">
<div class="results-placeholder">
<p class="placeholder-text">Le résultat apparaîtra ici...</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'>⚠️ Veuillez sélectionner une image et poser une question.</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">⏳ En attente de la réponse...</p>`;
try {
const response = await fetch("/image-qa/", {
method: "POST",
body: formData
});
const data = await response.json();
if (data.answer) {
resultContainer.innerHTML = `
<h3 class="centered-title">🧠 Réponse générée :</h3>
<br>
<p class="result-text">${data.answer}</p>
`;
} 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>`;
}
});
}