Spaces:
Sleeping
Sleeping
// 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 = ` | |
<div class="loading-container"> | |
<div class="loading-spinner"></div> | |
<p>Traitement en cours...</p> | |
</div> | |
`; | |
} | |
// Gestion des erreurs | |
function showError(resultDiv, message) { | |
resultDiv.innerHTML = ` | |
<div class="error-message"> | |
<span class="error-icon">⚠️</span> | |
<p>${message}</p> | |
</div> | |
`; | |
} | |
// 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 = ` | |
<div class="warning-message"> | |
<h3>Problème détecté</h3> | |
<p>${data.summary}</p> | |
</div> | |
`; | |
} else { | |
// Afficher le résumé | |
resultDiv.innerHTML = ` | |
<div class="result-content"> | |
<h3>Résumé de: ${data.filename}</h3> | |
<div class="summary-text">${data.summary}</div> | |
<p class="text-meta">Longueur du texte original: ${data.text_length} caractères</p> | |
</div> | |
`; | |
} | |
} 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 = ` | |
<div class="warning-message"> | |
<h3>Problème détecté</h3> | |
<p>${data.answer}</p> | |
</div> | |
`; | |
} else { | |
// Afficher la réponse | |
resultDiv.innerHTML = ` | |
<div class="result-content"> | |
<h3>Réponse</h3> | |
<div class="question-text"><strong>Question:</strong> ${data.question}</div> | |
<div class="answer-text"><strong>Réponse:</strong> ${data.answer}</div> | |
</div> | |
`; | |
} | |
} 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}`); | |
} | |
} |