Hadiil commited on
Commit
b76a4d9
·
verified ·
1 Parent(s): e41fc66

Update static/scripts.js

Browse files
Files changed (1) hide show
  1. static/scripts.js +145 -133
static/scripts.js CHANGED
@@ -65,42 +65,55 @@ document.addEventListener('DOMContentLoaded', () => {
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
  });
@@ -111,9 +124,10 @@ document.addEventListener('DOMContentLoaded', () => {
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
  });
@@ -131,40 +145,70 @@ document.addEventListener('DOMContentLoaded', () => {
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 = {
@@ -180,108 +224,76 @@ document.addEventListener('DOMContentLoaded', () => {
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
  });
 
65
  document.querySelectorAll('.function-box').forEach(box => {
66
  box.addEventListener('click', () => {
67
  const modalId = box.dataset.modal;
68
+ const modal = document.getElementById(modalId);
69
+ if (modal) {
70
+ modal.classList.remove('hidden');
71
+ document.querySelectorAll('.function-box').forEach(otherBox => {
72
+ if (otherBox !== box) {
73
+ otherBox.classList.add('shadowed');
74
+ }
75
+ });
76
+ } else {
77
+ console.error(`Modal with ID ${modalId} not found`);
78
+ }
79
  });
80
  });
81
 
82
  // Chatbot Icon Click
83
+ const chatbotIcon = document.querySelector('.chatbot-icon');
84
+ if (chatbotIcon) {
85
+ chatbotIcon.addEventListener('click', () => {
86
+ const chatbotModal = document.getElementById('chatbot-modal');
87
+ if (chatbotModal) {
88
+ chatbotModal.classList.remove('hidden');
89
+ } else {
90
+ console.error('Chatbot modal not found');
91
+ }
92
+ });
93
+ }
94
 
95
  // Close Modal
96
  document.querySelectorAll('.close-modal').forEach(closeBtn => {
97
  closeBtn.addEventListener('click', () => {
98
+ const modal = closeBtn.closest('.modal');
99
+ modal.classList.add('hidden');
100
+ const forms = modal.querySelectorAll('form');
101
  forms.forEach(form => form.reset());
102
+ const responseCards = modal.querySelectorAll('.response-card');
103
  responseCards.forEach(card => {
104
  card.classList.add('hidden');
105
  card.innerHTML = '';
106
  });
107
+ const spinners = modal.querySelectorAll('.loading-spinner');
108
  spinners.forEach(spinner => spinner.classList.add('hidden'));
109
+ const dropAreas = modal.querySelectorAll('.drop-area p');
110
  dropAreas.forEach(p => p.textContent = 'Drop File Here or Click to Choose');
111
+ if (modal.id === 'chatbot-modal') {
112
+ const conversation = document.getElementById('chatbot-conversation');
113
+ if (conversation) {
114
+ conversation.innerHTML = '';
115
+ }
116
  }
 
117
  document.querySelectorAll('.function-box').forEach(box => {
118
  box.classList.remove('shadowed');
119
  });
 
124
  document.querySelectorAll('.tab-btn').forEach(btn => {
125
  btn.addEventListener('click', () => {
126
  const tab = btn.dataset.tab;
127
+ const modal = btn.closest('.modal');
128
+ modal.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
129
  btn.classList.add('active');
130
+ modal.querySelectorAll('.tab-content').forEach(content => {
131
  content.classList.add('hidden');
132
  if (content.dataset.tab === tab) content.classList.remove('hidden');
133
  });
 
145
  }
146
  };
147
 
148
+ // File Input Click Handler
149
+ document.querySelectorAll('.drop-area').forEach(dropArea => {
150
+ const fileInput = dropArea.querySelector('input[type="file"]');
151
+ dropArea.addEventListener('click', () => {
152
+ fileInput.click();
153
+ });
154
+ fileInput.addEventListener('change', () => {
155
+ if (fileInput.files.length > 0) {
156
+ dropArea.querySelector('p').textContent = `Selected: ${fileInput.files[0].name}`;
157
+ }
158
+ });
159
+ });
160
+
161
  // Chatbot Form Submission
162
+ const chatbotForm = document.getElementById('chatbot-form');
163
+ if (chatbotForm) {
164
+ chatbotForm.addEventListener('submit', async (e) => {
165
+ e.preventDefault();
166
+ console.log('Chatbot form submitted'); // Debug
167
+ const input = e.target.querySelector('input');
168
+ const message = input.value.trim();
169
+ const spinner = e.target.querySelector('.loading-spinner') || document.createElement('div');
170
+ if (!spinner.classList.contains('loading-spinner')) {
171
+ spinner.className = 'loading-spinner';
172
+ e.target.appendChild(spinner);
173
+ }
174
+ if (!message) {
175
+ console.log('No message provided'); // Debug
176
+ return;
177
+ }
178
 
179
+ spinner.classList.remove('hidden');
180
+ const conversation = document.getElementById('chatbot-conversation');
181
+ conversation.innerHTML += `<p class="user-message">You: ${message}</p>`;
182
+ conversation.scrollTop = conversation.scrollHeight;
183
+ input.value = '';
184
 
185
+ try {
186
+ console.log('Sending request to /chat:', { message }); // Debug
187
+ const response = await fetch('/chat', {
188
+ method: 'POST',
189
+ headers: { 'Content-Type': 'application/json' },
190
+ body: JSON.stringify({ message })
191
+ });
192
+ console.log('Chat response status:', response.status); // Debug
193
+ const data = await response.json();
194
+ console.log('Chat response data:', data); // Debug
195
+ spinner.classList.add('hidden');
196
+ if (response.ok) {
197
+ conversation.innerHTML += `<p class="bot-message">Gemini: ${data.response}</p>`;
198
+ } else {
199
+ conversation.innerHTML += `<p class="bot-message">Error: ${data.detail || 'Unknown error'}</p>`;
200
+ }
201
+ conversation.scrollTop = conversation.scrollHeight;
202
+ } catch (error) {
203
+ console.error('Chat fetch error:', error); // Debug
204
+ spinner.classList.add('hidden');
205
+ conversation.innerHTML += `<p class="bot-message">Error: ${error.message}</p>`;
206
+ conversation.scrollTop = conversation.scrollHeight;
207
  }
208
+ });
209
+ } else {
210
+ console.error('Chatbot form not found');
211
+ }
 
 
 
212
 
213
  // Form Submissions for Other Functionalities
214
  const forms = {
 
224
 
225
  Object.keys(forms).forEach(formId => {
226
  const form = document.getElementById(formId);
227
+ if (!form) {
228
+ console.error(`Form with ID ${formId} not found`);
229
+ return;
230
+ }
231
  form.addEventListener('submit', async (e) => {
232
  e.preventDefault();
233
+ console.log(`Submitting form: ${formId}`); // Debug
234
  const formData = new FormData();
235
  const responseCard = form.nextElementSibling;
236
+ let spinner = form.querySelector('.loading-spinner');
237
+ if (!spinner) {
238
+ spinner = document.createElement('div');
239
+ spinner.className = 'loading-spinner hidden';
240
+ form.appendChild(spinner);
241
+ }
242
 
243
+ // Collect form data
244
+ const textInput = form.querySelector('textarea, input[type="text"]');
245
+ const fileInput = form.querySelector('input[type="file"]');
246
+ if (textInput && textInput.value.trim()) {
247
+ formData.append('text', textInput.value.trim());
248
+ }
249
+ if (fileInput && fileInput.files.length > 0) {
250
+ formData.append('file', fileInput.files[0]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  }
252
 
253
+ // Validate input
254
+ if (!textInput.value.trim() && (!fileInput || fileInput.files.length === 0)) {
255
+ console.log(`No input provided for ${formId}`); // Debug
256
+ responseCard.classList.remove('hidden');
257
+ responseCard.innerHTML = '<p class="error">Please provide text or a file.</p>';
258
+ return;
259
+ }
260
+
261
+ spinner.classList.remove('hidden');
262
+ responseCard.classList.add('hidden');
263
+ responseCard.innerHTML = '';
264
+
265
  try {
266
+ console.log(`Sending request to ${forms[formId].endpoint} for ${formId}:`, Array.from(formData.entries())); // Debug
267
  const response = await fetch(forms[formId].endpoint, {
268
  method: 'POST',
269
  body: formData
270
  });
271
+ console.log(`Response status for ${formId}:`, response.status); // Debug
272
  const data = await response.json();
273
+ console.log(`Response data for ${formId}:`, data); // Debug
274
  spinner.classList.add('hidden');
275
+ responseCard.classList.remove('hidden');
276
  if (response.ok) {
277
+ let responseText = data.response;
278
+ if (data.type === 'visualization_code') {
279
+ responseText = `<pre>${responseText}</pre>`;
280
+ } else if (data.type === 'caption' || data.type === 'visual_qa') {
281
+ responseText = `${responseText}<br><img src="${data.additional_data.image_url}" alt="Processed Image" style="max-width: 100%; margin-top: 10px;">`;
282
+ } else if (data.type === 'file_qa' || data.type === 'file_translation') {
283
+ responseText = `${responseText}<br><small>File: ${data.additional_data.file_name}</small>`;
284
+ }
285
+ responseCard.innerHTML = `<p>${responseText}</p>`;
286
+ if (data.message) {
287
+ responseCard.innerHTML += `<p><small>${data.message}</small></p>`;
288
  }
 
289
  } else {
290
+ responseCard.innerHTML = `<p class="error">Error: ${data.detail || 'Unknown error'}</p>`;
 
291
  }
292
  } catch (error) {
293
+ console.error(`Fetch error for ${formId}:`, error); // Debug
294
  spinner.classList.add('hidden');
 
295
  responseCard.classList.remove('hidden');
296
+ responseCard.innerHTML = `<p class="error">Error: ${error.message}</p>`;
297
  }
298
  });
299
  });