Hadiil commited on
Commit
17eed71
·
verified ·
1 Parent(s): 7943973

Update static/scripts.js

Browse files
Files changed (1) hide show
  1. static/scripts.js +133 -145
static/scripts.js CHANGED
@@ -65,55 +65,42 @@ document.addEventListener('DOMContentLoaded', () => {
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,10 +111,9 @@ document.addEventListener('DOMContentLoaded', () => {
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,70 +131,40 @@ document.addEventListener('DOMContentLoaded', () => {
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,76 +180,108 @@ document.addEventListener('DOMContentLoaded', () => {
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
  });
 
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
  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
  }
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
 
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
  });