Hadiil commited on
Commit
68d28d7
·
verified ·
1 Parent(s): d149bae

Update static/scripts.js

Browse files
Files changed (1) hide show
  1. static/scripts.js +247 -166
static/scripts.js CHANGED
@@ -1,207 +1,288 @@
1
-
2
  document.addEventListener('DOMContentLoaded', () => {
3
- const functionBoxes = document.querySelectorAll('.function-box');
4
- const modals = document.querySelectorAll('.modal');
5
- const closeModalButtons = document.querySelectorAll('.close-modal');
6
- const tabButtons = document.querySelectorAll('.tab-btn');
7
- const chatbotIcon = document.querySelector('.chatbot-icon');
8
- const chatbotModal = document.querySelector('.chatbot-modal');
9
- const chatForm = document.querySelector('#chat-form');
10
- const chatInput = document.querySelector('#chat-input');
11
- const conversation = document.querySelector('.chatbot-conversation');
12
-
13
- // Toggle modal and apply shadowed effect
14
- functionBoxes.forEach(box => {
15
- box.addEventListener('click', () => {
16
- const modalId = box.getAttribute('data-modal');
17
- const modal = document.getElementById(modalId);
18
-
19
- // Ajouter la classe .active à la boîte cliquée et la retirer des autres
20
- functionBoxes.forEach(b => b.classList.remove('active'));
21
- box.classList.add('active');
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- if (modal) {
24
- modal.classList.remove('hidden');
25
- functionBoxes.forEach(b => {
26
- if (b !== box) {
27
- b.classList.add('shadowed');
28
- }
29
- });
 
 
 
 
 
30
  }
31
  });
32
  });
33
 
34
- // Close modal
35
- closeModalButtons.forEach(button => {
36
- button.addEventListener('click', () => {
37
- modals.forEach(modal => modal.classList.add('hidden'));
38
- functionBoxes.forEach(box => {
39
- box.classList.remove('shadowed');
40
- box.classList.remove('active'); // Retirer .active lors de la fermeture
 
 
 
 
41
  });
42
- });
43
  });
44
 
45
- // Tab switching
46
- tabButtons.forEach(button => {
47
- button.addEventListener('click', () => {
48
- const modalContent = button.closest('.modal-content');
49
- const targetId = button.getAttribute('data-tab');
50
-
51
- // Toggle active class on buttons
52
- modalContent.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
53
- button.classList.add('active');
54
-
55
- // Toggle tab content
56
- modalContent.querySelectorAll('.tab-content').forEach(content => {
57
- content.classList.add('hidden');
58
- if (content.id === targetId) {
59
- content.classList.remove('hidden');
60
  }
61
  });
62
  });
63
  });
64
 
65
- // Toggle chatbot modal
66
- if (chatbotIcon && chatbotModal) {
67
- chatbotIcon.addEventListener('click', () => {
68
- chatbotModal.classList.toggle('hidden');
69
- functionBoxes.forEach(box => {
70
- box.classList.toggle('shadowed', !chatbotModal.classList.contains('hidden'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  });
72
  });
73
- }
74
 
75
- // Handle chat form submission
76
- if (chatForm) {
77
- chatForm.addEventListener('submit', async (e) => {
78
- e.preventDefault();
79
- const message = chatInput.value.trim();
80
- if (!message) return;
 
 
 
 
 
 
81
 
82
- // Add user message
83
- const userMessage = document.createElement('p');
84
- userMessage.classList.add('user-message');
85
- userMessage.textContent = message;
86
- conversation.appendChild(userMessage);
 
 
 
 
 
87
 
88
- // Show loading state
89
- const submitButton = chatForm.querySelector('.cosmic-btn');
90
- submitButton.classList.add('loading');
91
- submitButton.innerHTML = '<span class="spinner"></span>Loading...';
92
- submitButton.disabled = true;
 
 
93
 
94
- try {
95
- const response = await fetch('/chat', {
96
- method: 'POST',
97
- headers: { 'Content-Type': 'application/json' },
98
- body: JSON.stringify({ message })
99
- });
100
- const data = await response.json();
101
 
102
- // Add bot response
103
- const botMessage = document.createElement('p');
104
- botMessage.classList.add('bot-message');
105
- botMessage.textContent = data.response;
106
- conversation.appendChild(botMessage);
107
- } catch (error) {
108
- console.error('Error:', error);
109
- const errorMessage = document.createElement('p');
110
- errorMessage.classList.add('bot-message');
111
- errorMessage.textContent = 'Sorry, something went wrong.';
112
- conversation.appendChild(errorMessage);
 
113
  }
114
-
115
- // Reset form
116
- chatInput.value = '';
117
- submitButton.classList.remove('loading');
118
- submitButton.innerHTML = 'Send';
119
- submitButton.disabled = false;
120
-
121
- // Scroll to bottom
122
  conversation.scrollTop = conversation.scrollHeight;
123
- });
124
- }
 
 
 
 
125
 
126
- // Handle form submissions for other modals
127
- document.querySelectorAll('.process-form').forEach(form => {
 
 
 
 
 
 
 
 
 
 
 
 
128
  form.addEventListener('submit', async (e) => {
129
  e.preventDefault();
130
- const formData = new FormData(form);
131
- const responseCard = form.querySelector('.response-card');
132
- const submitButton = form.querySelector('.cosmic-btn');
 
 
 
133
 
134
- // Show loading state
135
- submitButton.classList.add('loading');
136
- submitButton.innerHTML = '<span class="spinner"></span>Loading...';
137
- submitButton.disabled = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
  try {
140
- const response = await fetch('/process', {
141
  method: 'POST',
142
  body: formData
143
  });
144
  const data = await response.json();
145
-
146
- // Display response
147
- responseCard.classList.remove('hidden');
148
- responseCard.innerHTML = '';
149
-
150
- if (data.type === 'caption' && data.additional_data && data.additional_data.image_url) {
151
- const img = document.createElement('img');
152
- img.src = data.additional_data.image_url;
153
- img.classList.add('response-image');
154
- responseCard.appendChild(img);
155
- const caption = document.createElement('p');
156
- caption.textContent = data.response;
157
- responseCard.appendChild(caption);
158
- } else if (data.type === 'visual_qa' && data.additional_data) {
159
- const img = document.createElement('img');
160
- img.src = data.additional_data.image_url;
161
- img.classList.add('response-image');
162
- responseCard.appendChild(img);
163
- const question = document.createElement('p');
164
- question.innerHTML = `<strong>Question:</strong> ${data.additional_data.question}`;
165
- responseCard.appendChild(question);
166
- const answer = document.createElement('p');
167
- answer.innerHTML = `<strong>Answer:</strong> ${data.response}`;
168
- responseCard.appendChild(answer);
169
- } else if (data.type === 'file_qa' && data.additional_data) {
170
- const question = document.createElement('p');
171
- question.innerHTML = `<strong>Question:</strong> ${data.additional_data.question}`;
172
- responseCard.appendChild(question);
173
- const fileInfo = document.createElement('p');
174
- fileInfo.innerHTML = `<strong>File:</strong> ${data.additional_data.file_name}`;
175
- responseCard.appendChild(fileInfo);
176
- const answer = document.createElement('p');
177
- answer.innerHTML = `<strong>Answer:</strong> ${data.response}`;
178
- responseCard.appendChild(answer);
179
- } else if (data.type === 'file_translation' && data.additional_data) {
180
- const fileInfo = document.createElement('p');
181
- fileInfo.innerHTML = `<strong>File:</strong> ${data.additional_data.file_name}`;
182
- responseCard.appendChild(fileInfo);
183
- const langInfo = document.createElement('p');
184
- langInfo.innerHTML = `<strong>Translated to:</strong> ${data.additional_data.target_language}`;
185
- responseCard.appendChild(langInfo);
186
- const translation = document.createElement('p');
187
- translation.innerHTML = `<strong>Translation:</strong> ${data.response}`;
188
- responseCard.appendChild(translation);
189
- } else {
190
  responseCard.innerHTML = `<p>${data.response}</p>`;
191
- if (data.message) {
192
- responseCard.innerHTML += `<p><em>${data.message}</em></p>`;
 
 
193
  }
 
 
 
 
194
  }
195
  } catch (error) {
196
- console.error('Error:', error);
 
197
  responseCard.classList.remove('hidden');
198
- responseCard.innerHTML = '<p>Sorry, something went wrong.</p>';
199
  }
200
-
201
- // Reset form
202
- submitButton.classList.remove('loading');
203
- submitButton.innerHTML = 'Submit';
204
- submitButton.disabled = false;
205
  });
206
  });
207
- });
 
 
1
  document.addEventListener('DOMContentLoaded', () => {
2
+ // Starry Background Animation
3
+ const stars = document.createElement('canvas');
4
+ stars.className = 'stars';
5
+ document.body.appendChild(stars);
6
+ const ctx = stars.getContext('2d');
7
+ stars.width = window.innerWidth;
8
+ stars.height = window.innerHeight;
9
+ const starArray = [];
10
+ for (let i = 0; i < 100; i++) {
11
+ starArray.push({
12
+ x: Math.random() * stars.width,
13
+ y: Math.random() * stars.height,
14
+ radius: Math.random() * 2,
15
+ opacity: Math.random()
16
+ });
17
+ }
18
+ function animateStars() {
19
+ ctx.clearRect(0, 0, stars.width, stars.height);
20
+ starArray.forEach(star => {
21
+ ctx.beginPath();
22
+ ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);
23
+ ctx.fillStyle = `rgba(255, 255, 255, ${star.opacity})`;
24
+ ctx.fill();
25
+ star.opacity += (Math.random() - 0.5) * 0.05;
26
+ if (star.opacity > 1) star.opacity = 1;
27
+ if (star.opacity < 0) star.opacity = 0;
28
+ });
29
+ requestAnimationFrame(animateStars);
30
+ }
31
+ animateStars();
32
 
33
+ // Card Hover Effects
34
+ const cards = document.querySelectorAll(".card");
35
+ cards.forEach(card => {
36
+ card.addEventListener("mouseenter", () => {
37
+ if (!card.classList.contains('shadowed')) {
38
+ card.style.transition = "transform 0.4s ease-in-out";
39
+ card.style.transform = "scale(1.05) rotate(0.5deg)";
40
+ }
41
+ });
42
+ card.addEventListener("mouseleave", () => {
43
+ if (!card.classList.contains('shadowed')) {
44
+ card.style.transform = "scale(1) rotate(0deg)";
45
  }
46
  });
47
  });
48
 
49
+ // Window Resize Handler for Canvas
50
+ window.addEventListener('resize', () => {
51
+ stars.width = window.innerWidth;
52
+ stars.height = window.innerHeight;
53
+ starArray.length = 0;
54
+ for (let i = 0; i < 100; i++) {
55
+ starArray.push({
56
+ x: Math.random() * stars.width,
57
+ y: Math.random() * stars.height,
58
+ radius: Math.random() * 2,
59
+ opacity: Math.random()
60
  });
61
+ }
62
  });
63
 
64
+ // Box Click to Open Modal
65
+ document.querySelectorAll('.function-box').forEach(box => {
66
+ box.addEventListener('click', () => {
67
+ const modalId = box.dataset.modal;
68
+ document.getElementById(modalId).classList.remove('hidden');
69
+ // Dim other function-box elements
70
+ document.querySelectorAll('.function-box').forEach(otherBox => {
71
+ if (otherBox !== box) {
72
+ otherBox.classList.add('shadowed');
 
 
 
 
 
 
73
  }
74
  });
75
  });
76
  });
77
 
78
+ // Chatbot Icon Click
79
+ document.querySelector('.chatbot-icon').addEventListener('click', () => {
80
+ document.getElementById('chatbot-modal').classList.remove('hidden');
81
+ });
82
+
83
+ // Close Modal
84
+ document.querySelectorAll('.close-modal').forEach(closeBtn => {
85
+ closeBtn.addEventListener('click', () => {
86
+ closeBtn.closest('.modal').classList.add('hidden');
87
+ // Reset forms and responses
88
+ const forms = closeBtn.closest('.modal').querySelectorAll('form');
89
+ forms.forEach(form => form.reset());
90
+ const responseCards = closeBtn.closest('.modal').querySelectorAll('.response-card');
91
+ responseCards.forEach(card => {
92
+ card.classList.add('hidden');
93
+ card.innerHTML = '';
94
+ });
95
+ const spinners = closeBtn.closest('.modal').querySelectorAll('.loading-spinner');
96
+ spinners.forEach(spinner => spinner.classList.add('hidden'));
97
+ const dropAreas = closeBtn.closest('.modal').querySelectorAll('.drop-area p');
98
+ dropAreas.forEach(p => p.textContent = 'Drop File Here or Click to Choose');
99
+ // Clear chatbot conversation
100
+ if (closeBtn.closest('.modal').id === 'chatbot-modal') {
101
+ document.getElementById('chatbot-conversation').innerHTML = '';
102
+ }
103
+ // Remove dimming from all function-box elements
104
+ document.querySelectorAll('.function-box').forEach(box => {
105
+ box.classList.remove('shadowed');
106
  });
107
  });
108
+ });
109
 
110
+ // Tab Switching for Summarize and Translate
111
+ document.querySelectorAll('.tab-btn').forEach(btn => {
112
+ btn.addEventListener('click', () => {
113
+ const tab = btn.dataset.tab;
114
+ btn.closest('.modal').querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
115
+ btn.classList.add('active');
116
+ btn.closest('.modal').querySelectorAll('.tab-content').forEach(content => {
117
+ content.classList.add('hidden');
118
+ if (content.dataset.tab === tab) content.classList.remove('hidden');
119
+ });
120
+ });
121
+ });
122
 
123
+ // File Drop Handler
124
+ window.handleDrop = function(event, dropArea) {
125
+ event.preventDefault();
126
+ const fileInput = dropArea.querySelector('input[type="file"]');
127
+ const files = event.dataTransfer.files;
128
+ if (files.length > 0) {
129
+ fileInput.files = files;
130
+ dropArea.querySelector('p').textContent = `Selected: ${files[0].name}`;
131
+ }
132
+ };
133
 
134
+ // Chatbot Form Submission
135
+ document.getElementById('chatbot-form').addEventListener('submit', async (e) => {
136
+ e.preventDefault();
137
+ const input = e.target.querySelector('input');
138
+ const message = input.value.trim();
139
+ const spinner = e.target.querySelector('.loading-spinner');
140
+ if (!message) return;
141
 
142
+ spinner.classList.remove('hidden');
143
+ const conversation = document.getElementById('chatbot-conversation');
144
+ conversation.innerHTML += `<p class="user-message">You: ${message}</p>`;
145
+ conversation.scrollTop = conversation.scrollHeight;
146
+ input.value = '';
 
 
147
 
148
+ try {
149
+ const response = await fetch('/chat', {
150
+ method: 'POST',
151
+ headers: { 'Content-Type': 'application/json' },
152
+ body: JSON.stringify({ message })
153
+ });
154
+ const data = await response.json();
155
+ spinner.classList.add('hidden');
156
+ if (response.ok) {
157
+ conversation.innerHTML += `<p class="bot-message">Gemini: ${data.response}</p>`;
158
+ } else {
159
+ conversation.innerHTML += `<p class="bot-message">Error: ${data.detail}</p>`;
160
  }
 
 
 
 
 
 
 
 
161
  conversation.scrollTop = conversation.scrollHeight;
162
+ } catch (error) {
163
+ spinner.classList.add('hidden');
164
+ conversation.innerHTML += `<p class="bot-message">Error: ${error.message}</p>`;
165
+ conversation.scrollTop = conversation.scrollHeight;
166
+ }
167
+ });
168
 
169
+ // Form Submissions for Other Functionalities
170
+ const forms = {
171
+ 'summarize-form': { endpoint: '/process', intent: 'summarize' },
172
+ 'summarize-file-form': { endpoint: '/process', intent: 'summarize' },
173
+ 'translate-text-form': { endpoint: '/process', intent: 'translate' },
174
+ 'translate-file-form': { endpoint: '/process', intent: 'file-translate' },
175
+ 'file-qa-form': { endpoint: '/process', intent: 'file-qa' },
176
+ 'image-caption-form': { endpoint: '/process', intent: 'image-to-text' },
177
+ 'visual-qa-form': { endpoint: '/process', intent: 'visual-qa' },
178
+ 'visualize-form': { endpoint: '/process', intent: 'visualize' }
179
+ };
180
+
181
+ Object.keys(forms).forEach(formId => {
182
+ const form = document.getElementById(formId);
183
  form.addEventListener('submit', async (e) => {
184
  e.preventDefault();
185
+ const formData = new FormData();
186
+ const responseCard = form.nextElementSibling;
187
+ const spinner = form.querySelector('.loading-spinner');
188
+ responseCard.classList.add('hidden');
189
+ responseCard.innerHTML = '';
190
+ spinner.classList.remove('hidden');
191
 
192
+ if (formId === 'summarize-form') {
193
+ formData.append('text', form.querySelector('input[type="text"]').value);
194
+ } else if (formId === 'summarize-file-form') {
195
+ const file = form.querySelector('input[type="file"]').files[0];
196
+ if (!file) {
197
+ responseCard.innerHTML = `<p class="text-red-500">Please select a file.</p>`;
198
+ responseCard.classList.remove('hidden');
199
+ spinner.classList.add('hidden');
200
+ return;
201
+ }
202
+ formData.append('file', file);
203
+ } else if (formId === 'translate-text-form') {
204
+ const text = form.querySelector('input[type="text"]').value;
205
+ const lang = form.querySelector('select[name="language"]').value;
206
+ formData.append('text', `Translate to ${lang}: ${text}`);
207
+ } else if (formId === 'translate-file-form') {
208
+ const file = form.querySelector('input[type="file"]').files[0];
209
+ const lang = form.querySelector('select[name="language"]').value;
210
+ if (!file) {
211
+ responseCard.innerHTML = `<p class="text-red-500">Please select a file.</p>`;
212
+ responseCard.classList.remove('hidden');
213
+ spinner.classList.add('hidden');
214
+ return;
215
+ }
216
+ formData.append('file', file);
217
+ formData.append('text', `Translate to ${lang}`);
218
+ } else if (formId === 'file-qa-form') {
219
+ const file = form.querySelector('input[type="file"]').files[0];
220
+ const text = form.querySelector('input[type="text"]').value;
221
+ if (!file) {
222
+ responseCard.innerHTML = `<p class="text-red-500">Please select a file.</p>`;
223
+ responseCard.classList.remove('hidden');
224
+ spinner.classList.add('hidden');
225
+ return;
226
+ }
227
+ formData.append('file', file);
228
+ formData.append('text', text);
229
+ } else if (formId === 'image-caption-form') {
230
+ const file = form.querySelector('input[type="file"]').files[0];
231
+ if (!file) {
232
+ responseCard.innerHTML = `<p class="text-red-500">Please select an image.</p>`;
233
+ responseCard.classList.remove('hidden');
234
+ spinner.classList.add('hidden');
235
+ return;
236
+ }
237
+ formData.append('file', file);
238
+ } else if (formId === 'visual-qa-form') {
239
+ const file = form.querySelector('input[type="file"]').files[0];
240
+ const text = form.querySelector('input[type="text"]').value;
241
+ if (!file) {
242
+ responseCard.innerHTML = `<p class="text-red-500">Please select an image.</p>`;
243
+ responseCard.classList.remove('hidden');
244
+ spinner.classList.add('hidden');
245
+ return;
246
+ }
247
+ formData.append('file', file);
248
+ formData.append('text', text);
249
+ } else if (formId === 'visualize-form') {
250
+ const file = form.querySelector('input[type="file"]').files[0];
251
+ const visualizationType = form.querySelector('select[name="visualization-type"]').value;
252
+ if (!file) {
253
+ responseCard.innerHTML = `<p class="text-red-500">Please select a file.</p>`;
254
+ responseCard.classList.remove('hidden');
255
+ spinner.classList.add('hidden');
256
+ return;
257
+ }
258
+ formData.append('file', file);
259
+ formData.append('text', visualizationType);
260
+ }
261
 
262
  try {
263
+ const response = await fetch(forms[formId].endpoint, {
264
  method: 'POST',
265
  body: formData
266
  });
267
  const data = await response.json();
268
+ spinner.classList.add('hidden');
269
+ if (response.ok) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  responseCard.innerHTML = `<p>${data.response}</p>`;
271
+ if (data.additional_data) {
272
+ Object.entries(data.additional_data).forEach(([key, value]) => {
273
+ responseCard.innerHTML += `<p><strong>${key.replace('_', ' ').replace(/\b\w/g, char => char.toUpperCase())}:</strong> ${value}</p>`;
274
+ });
275
  }
276
+ responseCard.classList.remove('hidden');
277
+ } else {
278
+ responseCard.innerHTML = `<p class="text-red-500">Error: ${data.detail}</p>`;
279
+ responseCard.classList.remove('hidden');
280
  }
281
  } catch (error) {
282
+ spinner.classList.add('hidden');
283
+ responseCard.innerHTML = `<p class="text-red-500">Error: ${error.message}</p>`;
284
  responseCard.classList.remove('hidden');
 
285
  }
 
 
 
 
 
286
  });
287
  });
288
+ });