// Constante pour l'URL de base const BASE_URL = window.location.origin; // Utiliser l'URL complète pour éviter les erreurs CORS // Gestion des onglets function openTab(tabName) { // Liste des onglets disponibles const tabs = ['summarize', 'answer-question', 'interpret-image', 'generate-visualization', 'translate-document']; // Cacher/montrer les sections appropriées tabs.forEach(tab => { const element = document.getElementById(tab); if (element) { element.classList.toggle('hidden', tab !== tabName); } }); // Marquer l'onglet actif document.querySelectorAll('.tab-btn').forEach(btn => { btn.classList.toggle('active', btn.getAttribute('data-tab') === tabName); btn.setAttribute('aria-selected', btn.getAttribute('data-tab') === tabName); }); } // Gestion optimisée des uploads de fichiers function setupFileUpload(inputId) { const input = document.getElementById(inputId); if (!input) return; const filenameDisplay = document.getElementById(`${inputId}-filename`); input.addEventListener('change', function() { if (this.files && this.files[0]) { // Afficher le nom du fichier const fileName = this.files[0].name; if (filenameDisplay) { filenameDisplay.textContent = fileName; filenameDisplay.title = fileName; } // Changer le texte du label const label = this.nextElementSibling; const fileLabel = label?.querySelector('.file-label'); if (fileLabel) { fileLabel.textContent = "Fichier sélectionné"; } } else { // Réinitialiser if (filenameDisplay) { filenameDisplay.textContent = ""; } const label = this.nextElementSibling; const fileLabel = label?.querySelector('.file-label'); if (fileLabel) { fileLabel.textContent = "Sélectionner un fichier"; } } }); } // Indicateur de chargement function showLoading(resultDiv) { resultDiv.innerHTML = `

Traitement en cours...

`; } // Gestion des erreurs function showError(resultDiv, message) { resultDiv.innerHTML = `
⚠️

${message}

`; } // Initialisation du document document.addEventListener('DOMContentLoaded', () => { try { // Activer le premier onglet par défaut openTab('summarize'); // Configurer les uploads de fichiers setupFileUpload('summarize-file'); setupFileUpload('answer-question-file'); setupFileUpload('interpret-image-file'); setupFileUpload('visualization-file'); setupFileUpload('translate-file'); // Configurer les onglets document.querySelectorAll('.tab-btn').forEach(btn => { btn.addEventListener('click', () => { const tabName = btn.getAttribute('data-tab'); if (tabName) openTab(tabName); }); }); // Configurer le formulaire de résumé const summarizeForm = document.getElementById('summarize-form'); if (summarizeForm) { summarizeForm.addEventListener('submit', async (e) => { e.preventDefault(); handleSummarizeSubmit(); }); } // Configurer le formulaire de question-réponse const qaForm = document.getElementById('answer-question-form'); if (qaForm) { qaForm.addEventListener('submit', async (e) => { e.preventDefault(); handleQASubmit(); }); } // Désactiver temporairement les onglets non implémentés document.querySelectorAll('.tab-btn').forEach(btn => { const tabName = btn.getAttribute('data-tab'); if (tabName !== 'summarize' && tabName !== 'answer-question') { btn.addEventListener('click', (e) => { e.preventDefault(); alert("Cette fonctionnalité n'est pas encore implémentée."); // Ne pas changer d'onglet return false; }); } }); } catch (error) { console.error('Erreur d\'initialisation:', error); } }); // Gestion du formulaire de résumé async function handleSummarizeSubmit() { const fileInput = document.getElementById('summarize-file'); const resultDiv = document.getElementById('summarize-result'); if (!fileInput || !resultDiv) return; if (!fileInput.files || fileInput.files.length === 0) { showError(resultDiv, "Veuillez sélectionner un fichier à résumer."); return; } showLoading(resultDiv); try { const formData = new FormData(); formData.append('file', fileInput.files[0]); // Utiliser fetch avec timeout et gestion d'erreur améliorée const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 60000); // 60s timeout const response = await fetch(`${BASE_URL}/summarize`, { method: 'POST', body: formData, signal: controller.signal }).finally(() => clearTimeout(timeoutId)); if (!response.ok) { const errorText = await response.text(); throw new Error(`Erreur: ${response.status} ${response.statusText}\n${errorText}`); } const data = await response.json(); if (data.warning) { // Afficher l'avertissement resultDiv.innerHTML = `

Problème détecté

${data.summary}

`; } else { // Afficher le résumé resultDiv.innerHTML = `

Résumé de: ${data.filename}

${data.summary}

Longueur du texte original: ${data.text_length} caractères

`; } } catch (error) { console.error('Erreur lors du résumé:', error); // Message d'erreur plus descriptif let errorMessage = error.message; if (error.name === 'AbortError') { errorMessage = "La requête a pris trop de temps. Veuillez réessayer avec un fichier plus petit."; } else if (error.message.includes("Failed to fetch")) { errorMessage = "Impossible de contacter le serveur. Veuillez vérifier votre connexion ou contactez l'administrateur."; } showError(resultDiv, `Erreur: ${errorMessage}`); } } // Gestion du formulaire de question-réponse async function handleQASubmit() { const questionInput = document.getElementById('question-input'); const fileInput = document.getElementById('answer-question-file'); const resultDiv = document.getElementById('answer-question-result'); if (!questionInput || !resultDiv) return; if (!questionInput.value.trim()) { showError(resultDiv, "Veuillez entrer une question."); return; } showLoading(resultDiv); try { const formData = new FormData(); formData.append('question', questionInput.value); if (fileInput && fileInput.files && fileInput.files.length > 0) { formData.append('file', fileInput.files[0]); } // Utiliser fetch avec timeout et gestion d'erreur améliorée const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 60000); // 60s timeout const response = await fetch(`${BASE_URL}/answer-question`, { method: 'POST', body: formData, signal: controller.signal }).finally(() => clearTimeout(timeoutId)); if (!response.ok) { const errorText = await response.text(); throw new Error(`Erreur: ${response.status} ${response.statusText}\n${errorText}`); } const data = await response.json(); if (data.warning) { // Afficher l'avertissement resultDiv.innerHTML = `

Problème détecté

${data.answer}

`; } else { // Afficher la réponse resultDiv.innerHTML = `

Réponse

Question: ${data.question}
Réponse: ${data.answer}
`; } } catch (error) { console.error('Erreur de question-réponse:', error); // Message d'erreur plus descriptif let errorMessage = error.message; if (error.name === 'AbortError') { errorMessage = "La requête a pris trop de temps. Veuillez réessayer avec une question plus courte ou un fichier plus petit."; } else if (error.message.includes("Failed to fetch")) { errorMessage = "Impossible de contacter le serveur. Veuillez vérifier votre connexion ou contactez l'administrateur."; } showError(resultDiv, `Erreur: ${errorMessage}`); } }