SamiKLN commited on
Commit
5dfef6f
·
verified ·
1 Parent(s): aac0749

Update frontend/script.js

Browse files
Files changed (1) hide show
  1. frontend/script.js +99 -119
frontend/script.js CHANGED
@@ -1,75 +1,99 @@
1
- const BASE_URL = window.location.origin; // Utilise l'URL actuelle
2
 
3
- // Gestion des onglets
4
  function openTab(tabName) {
5
- document.querySelectorAll('.tab-content').forEach(tab => tab.classList.add('hidden'));
6
- document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
7
- document.getElementById(tabName).classList.remove('hidden');
8
- document.querySelector(`[data-tab="${tabName}"]`).classList.add('active');
 
 
 
 
 
 
 
9
  }
10
 
11
- // Fonction générique pour gérer les uploads de fichiers
12
  function setupFileUpload(inputId) {
13
  const input = document.getElementById(inputId);
14
- if (!input) {
15
- console.warn(`Element ${inputId} not found`);
16
- return;
17
- }
18
-
19
  const label = input.nextElementSibling;
20
- if (!label) {
21
- console.warn(`Label not found for ${inputId}`);
22
- return;
23
- }
24
-
25
- const fileLabel = label.querySelector('.file-label');
26
- if (!fileLabel) {
27
- console.warn(`File label not found for ${inputId}`);
28
- return;
29
- }
30
-
31
  input.addEventListener('change', function() {
32
- fileLabel.textContent = this.files[0]?.name || 'Select file';
 
 
 
 
 
33
  });
34
  }
35
 
36
- // Initialisation
37
  document.addEventListener('DOMContentLoaded', () => {
38
- openTab('summarize');
39
-
40
- // Configuration des uploads de fichiers
41
- ['summarize-file', 'interpret-image-file', 'answer-question-file', 'visualization-file'].forEach(setupFileUpload);
42
-
43
- // Configuration des gestionnaires de formulaires
44
- setupFormHandlers();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  });
46
 
47
- // Gestion des erreurs
48
  function handleError(error, resultDiv) {
49
- console.error('API Error:', error);
50
- const errorMessage = error.message.includes('Failed to fetch')
51
- ? 'Could not connect to server. Please try again later.'
52
- : error.message;
 
 
 
 
53
 
54
  resultDiv.innerHTML = `
55
- <div class="error-alert">
56
- <strong>Error:</strong> ${errorMessage}
57
- ${error.status ? `<br><small>Status: ${error.status}</small>` : ''}
 
 
 
 
58
  </div>
59
  `;
60
  }
61
 
62
- // Fonction pour afficher le chargement
63
  function showLoading(resultDiv) {
64
  resultDiv.innerHTML = `
65
- <div class="loading-indicator">
66
- <div class="spinner"></div>
67
- <p>Processing your request...</p>
68
  </div>
69
  `;
70
  }
71
 
72
- // Fonction générique pour les requêtes API
73
  async function makeApiRequest(endpoint, formData) {
74
  try {
75
  const response = await fetch(`${BASE_URL}${endpoint}`, {
@@ -85,112 +109,68 @@ async function makeApiRequest(endpoint, formData) {
85
  errorData = { detail: await response.text() };
86
  }
87
 
88
- const error = new Error(errorData.detail || `HTTP Error ${response.status}`);
89
  error.status = response.status;
90
  throw error;
91
  }
92
 
93
  return await response.json();
94
  } catch (error) {
95
- console.error('Request failed:', error);
96
  throw error;
97
  }
98
  }
99
 
100
  // Configuration des gestionnaires de formulaires
101
  function setupFormHandlers() {
102
- const forms = {
103
  'summarize-form': {
104
  endpoint: '/summarize',
 
105
  prepare: (formData) => {
106
  formData.append('file', document.getElementById('summarize-file').files[0]);
107
  },
108
  handleSuccess: (data, resultDiv) => {
109
- resultDiv.innerHTML = `
110
- <h3>${data.filename}</h3>
111
- <div class="summary-result">
112
- <p>${data.summary}</p>
113
- <p class="file-meta">Original text length: ${data.text_length} characters</p>
114
- </div>
115
- `;
116
- }
117
- },
118
- 'interpret-image-form': {
119
- endpoint: '/interpret_image',
120
- prepare: (formData) => {
121
- formData.append('file', document.getElementById('interpret-image-file').files[0]);
122
- },
123
- handleSuccess: (data, resultDiv) => {
124
- resultDiv.innerHTML = `
125
- <h3>${data.filename}</h3>
126
- <div class="image-caption">
127
- <p>${data.caption}</p>
128
- </div>
129
- `;
130
- }
131
- },
132
- 'answer-question-form': {
133
- endpoint: '/answer_question',
134
- prepare: (formData) => {
135
- formData.append('question', document.getElementById('question-input').value);
136
- const file = document.getElementById('answer-question-file').files[0];
137
- if (file) formData.append('file', file);
138
- },
139
- handleSuccess: (data, resultDiv) => {
140
- resultDiv.innerHTML = `
141
- <h3>Question Answer</h3>
142
- <div class="answer-result">
143
- <p class="answer-text">${data.answer}</p>
144
- ${data.score ? `<p class="confidence">Confidence: ${Math.round(data.score * 100)}%</p>` : ''}
145
- ${data.filename ? `<p class="file-meta">Source: ${data.filename}</p>` : ''}
146
- </div>
147
- `;
148
- }
149
- },
150
- 'generate-visualization-form': {
151
- endpoint: '/generate_visualization',
152
- prepare: (formData) => {
153
- formData.append('file', document.getElementById('visualization-file').files[0]);
154
- formData.append('request', document.getElementById('visualization-request').value);
155
- },
156
- handleSuccess: (data, resultDiv) => {
157
- resultDiv.innerHTML = `
158
- <h3>${data.filename}</h3>
159
- <p class="visualization-message">${data.message}</p>
160
- ${data.image ? `
161
- <div class="visualization-container">
162
- <img src="${data.image}" alt="Generated visualization">
163
  </div>
164
- ` : ''}
165
- `;
166
  }
167
- }
 
168
  };
169
 
170
- // Configuration de chaque formulaire
171
- Object.entries(forms).forEach(([formId, config]) => {
172
  const form = document.getElementById(formId);
173
- if (!form) {
174
- console.warn(`Form ${formId} not found`);
175
- return;
176
- }
177
 
178
  form.addEventListener('submit', async (e) => {
179
  e.preventDefault();
180
  const resultDiv = document.getElementById(`${formId.replace('-form', '')}-result`);
181
- if (!resultDiv) {
182
- console.error(`Result div for ${formId} not found`);
183
- return;
184
- }
185
 
186
  showLoading(resultDiv);
187
 
188
  try {
189
- // Validation des fichiers requis
190
- const requiredFileInputs = form.querySelectorAll('input[type="file"][required]');
191
- for (const input of requiredFileInputs) {
192
  if (!input.files || input.files.length === 0) {
193
- throw new Error('Please select a file');
194
  }
195
  }
196
 
 
1
+ const BASE_URL = window.location.origin;
2
 
3
+ // Gestion améliorée des onglets
4
  function openTab(tabName) {
5
+ const tabs = ['summarize', 'interpret-image', 'answer-question', 'generate-visualization'];
6
+ tabs.forEach(tab => {
7
+ const element = document.getElementById(tab);
8
+ if (element) {
9
+ element.classList.toggle('hidden', tab !== tabName);
10
+ }
11
+ });
12
+
13
+ document.querySelectorAll('.tab-btn').forEach(btn => {
14
+ btn.classList.toggle('active', btn.getAttribute('data-tab') === tabName);
15
+ });
16
  }
17
 
18
+ // Configuration améliorée des uploads de fichiers
19
  function setupFileUpload(inputId) {
20
  const input = document.getElementById(inputId);
21
+ if (!input) return;
22
+
 
 
 
23
  const label = input.nextElementSibling;
24
+ const fileLabel = label?.querySelector('.file-label');
25
+ if (!fileLabel) return;
26
+
 
 
 
 
 
 
 
 
27
  input.addEventListener('change', function() {
28
+ if (this.files && this.files[0]) {
29
+ fileLabel.textContent = this.files[0].name;
30
+ fileLabel.title = this.files[0].name;
31
+ } else {
32
+ fileLabel.textContent = 'Sélectionner un fichier';
33
+ }
34
  });
35
  }
36
 
37
+ // Initialisation complète
38
  document.addEventListener('DOMContentLoaded', () => {
39
+ try {
40
+ // Activer le premier onglet par défaut
41
+ openTab('summarize');
42
+
43
+ // Configurer tous les uploads de fichiers
44
+ ['summarize-file', 'interpret-image-file', 'answer-question-file', 'visualization-file']
45
+ .forEach(setupFileUpload);
46
+
47
+ // Configurer les gestionnaires de formulaires
48
+ setupFormHandlers();
49
+
50
+ // Ajouter des écouteurs d'événements pour les onglets
51
+ document.querySelectorAll('.tab-btn').forEach(btn => {
52
+ btn.addEventListener('click', () => {
53
+ const tabName = btn.getAttribute('data-tab');
54
+ if (tabName) openTab(tabName);
55
+ });
56
+ });
57
+
58
+ } catch (error) {
59
+ console.error('Initialisation error:', error);
60
+ }
61
  });
62
 
63
+ // Affichage des erreurs amélioré
64
  function handleError(error, resultDiv) {
65
+ console.error('Error:', error);
66
+
67
+ let errorMessage = error.message;
68
+ if (error.message.includes('Failed to fetch')) {
69
+ errorMessage = 'Impossible de se connecter au serveur. Veuillez réessayer.';
70
+ } else if (error.message.includes('500')) {
71
+ errorMessage = 'Erreur interne du serveur. Veuillez réessayer plus tard.';
72
+ }
73
 
74
  resultDiv.innerHTML = `
75
+ <div class="error-message">
76
+ <span class="error-icon">⚠️</span>
77
+ <div>
78
+ <h4>Erreur</h4>
79
+ <p>${errorMessage}</p>
80
+ ${error.status ? `<small>Code: ${error.status}</small>` : ''}
81
+ </div>
82
  </div>
83
  `;
84
  }
85
 
86
+ // Indicateur de chargement amélioré
87
  function showLoading(resultDiv) {
88
  resultDiv.innerHTML = `
89
+ <div class="loading-container">
90
+ <div class="loading-spinner"></div>
91
+ <p>Analyse en cours...</p>
92
  </div>
93
  `;
94
  }
95
 
96
+ // Requête API robuste
97
  async function makeApiRequest(endpoint, formData) {
98
  try {
99
  const response = await fetch(`${BASE_URL}${endpoint}`, {
 
109
  errorData = { detail: await response.text() };
110
  }
111
 
112
+ const error = new Error(errorData.detail || `Erreur ${response.status}`);
113
  error.status = response.status;
114
  throw error;
115
  }
116
 
117
  return await response.json();
118
  } catch (error) {
119
+ console.error('API Request Failed:', error);
120
  throw error;
121
  }
122
  }
123
 
124
  // Configuration des gestionnaires de formulaires
125
  function setupFormHandlers() {
126
+ const formConfigs = {
127
  'summarize-form': {
128
  endpoint: '/summarize',
129
+ requiredFiles: ['summarize-file'],
130
  prepare: (formData) => {
131
  formData.append('file', document.getElementById('summarize-file').files[0]);
132
  },
133
  handleSuccess: (data, resultDiv) => {
134
+ if (data.warning) {
135
+ resultDiv.innerHTML = `
136
+ <div class="warning-message">
137
+ <h3>${data.filename}</h3>
138
+ <p>${data.summary}</p>
139
+ <p class="info">Le résumé n'a pas pu être généré en raison du problème ci-dessus.</p>
140
+ </div>
141
+ `;
142
+ } else {
143
+ resultDiv.innerHTML = `
144
+ <div class="success-result">
145
+ <h3>${data.filename}</h3>
146
+ <div class="summary-content">${data.summary}</div>
147
+ <p class="file-meta">Longueur du texte original: ${data.text_length} caractères</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  </div>
149
+ `;
150
+ }
151
  }
152
+ },
153
+ // ... [Configurations similaires pour les autres formulaires] ...
154
  };
155
 
156
+ // Appliquer la configuration à chaque formulaire
157
+ Object.entries(formConfigs).forEach(([formId, config]) => {
158
  const form = document.getElementById(formId);
159
+ if (!form) return;
 
 
 
160
 
161
  form.addEventListener('submit', async (e) => {
162
  e.preventDefault();
163
  const resultDiv = document.getElementById(`${formId.replace('-form', '')}-result`);
164
+ if (!resultDiv) return;
 
 
 
165
 
166
  showLoading(resultDiv);
167
 
168
  try {
169
+ // Vérification des fichiers requis
170
+ for (const fileId of config.requiredFiles) {
171
+ const input = document.getElementById(fileId);
172
  if (!input.files || input.files.length === 0) {
173
+ throw new Error(`Veuillez sélectionner un fichier (${fileId})`);
174
  }
175
  }
176