Hanan-Alnakhal commited on
Commit
3462c1d
Β·
verified Β·
1 Parent(s): 5678343

Update static/script.js

Browse files
Files changed (1) hide show
  1. static/script.js +76 -21
static/script.js CHANGED
@@ -100,7 +100,6 @@ function handleFileSelect(e) {
100
  uploadFile(file);
101
  }
102
  }
103
-
104
  async function uploadFile(file) {
105
  const formData = new FormData();
106
  formData.append('file', file);
@@ -110,12 +109,15 @@ async function uploadFile(file) {
110
  document.getElementById('uploadProgress').classList.remove('hidden');
111
 
112
  try {
 
 
113
  const response = await fetch('/api/upload', {
114
  method: 'POST',
115
  body: formData
116
  });
117
 
118
  const data = await response.json();
 
119
 
120
  if (!response.ok) {
121
  throw new Error(data.error || 'Upload failed');
@@ -125,30 +127,42 @@ async function uploadFile(file) {
125
  sessionId = data.session_id;
126
  currentResults = data.results;
127
 
128
- console.log('Session ID:', sessionId);
129
- console.log('Results:', currentResults);
130
 
131
  showToast(`βœ“ Found ${data.count} lab results!`, 'success');
132
 
133
- // Generate explanations
134
- await generateExplanations();
135
-
136
- // Display results
137
  displayResults();
138
 
139
  // Scroll to results
140
  setTimeout(() => {
141
- document.getElementById('results').scrollIntoView({
142
- behavior: 'smooth'
143
- });
 
 
144
  }, 500);
145
 
 
 
 
 
 
 
 
 
 
 
146
  } catch (error) {
 
147
  showToast(error.message, 'error');
148
  resetUploadArea();
149
  }
150
  }
151
 
 
152
  async function generateExplanations() {
153
  showLoading('Generating AI explanations... (10-20 seconds)');
154
 
@@ -190,16 +204,22 @@ async function generateExplanations() {
190
  hideLoading();
191
  }
192
  }
193
-
194
  function displayResults() {
195
  const resultsSection = document.getElementById('results');
196
  const container = document.getElementById('resultsContainer');
197
 
 
 
 
 
198
  if (!currentResults || currentResults.length === 0) {
199
- container.innerHTML = '<p class="empty-message">No results found</p>';
 
200
  return;
201
  }
202
 
 
 
203
  // Show results section
204
  resultsSection.classList.remove('hidden');
205
 
@@ -211,12 +231,20 @@ function displayResults() {
211
 
212
  // Create result cards
213
  currentResults.forEach((result, index) => {
214
- const card = createResultCard(result, index);
215
- container.appendChild(card);
 
 
 
 
 
 
216
  });
217
 
218
  // Reset upload area
219
  resetUploadArea();
 
 
220
  }
221
 
222
  function updateSummaryStats() {
@@ -238,15 +266,40 @@ function updateSummaryStats() {
238
  }
239
 
240
  function createResultCard(result, index) {
 
 
241
  const card = document.createElement('div');
242
  card.className = 'result-card';
243
  card.style.setProperty('--i', index + 1);
244
 
245
- const statusClass = `status-${result.status}`;
246
- const explanation = explanations && explanations[result.test_name]
247
- ? explanations[result.test_name]
248
- : 'Explanation is being generated. Click "Ask Questions" to learn more about this result.';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
 
 
250
  card.innerHTML = `
251
  <div class="result-header">
252
  <div>
@@ -255,15 +308,16 @@ function createResultCard(result, index) {
255
  </div>
256
  <div class="result-value-container">
257
  <div class="result-value">${escapeHtml(result.value)} ${escapeHtml(result.unit)}</div>
258
- <span class="result-status ${statusClass}">${result.status}</span>
259
  </div>
260
  </div>
261
  <div class="result-explanation">
262
- <strong>πŸ’‘ What does this mean?</strong>
263
- <p>${escapeHtml(explanation)}</p>
264
  </div>
265
  `;
266
 
 
267
  return card;
268
  }
269
 
@@ -460,6 +514,7 @@ function showToast(message, type = 'info') {
460
 
461
  // ===== UTILITY FUNCTIONS =====
462
  function escapeHtml(text) {
 
463
  const div = document.createElement('div');
464
  div.textContent = text;
465
  return div.innerHTML;
 
100
  uploadFile(file);
101
  }
102
  }
 
103
  async function uploadFile(file) {
104
  const formData = new FormData();
105
  formData.append('file', file);
 
109
  document.getElementById('uploadProgress').classList.remove('hidden');
110
 
111
  try {
112
+ console.log('πŸ“€ Uploading file...');
113
+
114
  const response = await fetch('/api/upload', {
115
  method: 'POST',
116
  body: formData
117
  });
118
 
119
  const data = await response.json();
120
+ console.log('πŸ“₯ Upload response:', data);
121
 
122
  if (!response.ok) {
123
  throw new Error(data.error || 'Upload failed');
 
127
  sessionId = data.session_id;
128
  currentResults = data.results;
129
 
130
+ console.log('βœ… Session ID:', sessionId);
131
+ console.log('βœ… Results count:', currentResults.length);
132
 
133
  showToast(`βœ“ Found ${data.count} lab results!`, 'success');
134
 
135
+ // IMPORTANT: Show results immediately with template explanations
136
+ console.log('🎨 Displaying results with template explanations...');
 
 
137
  displayResults();
138
 
139
  // Scroll to results
140
  setTimeout(() => {
141
+ const resultsEl = document.getElementById('results');
142
+ if (resultsEl) {
143
+ resultsEl.scrollIntoView({ behavior: 'smooth' });
144
+ console.log('πŸ“ Scrolled to results section');
145
+ }
146
  }, 500);
147
 
148
+ // Then fetch AI explanations in background
149
+ console.log('πŸ€– Fetching AI explanations...');
150
+ await generateExplanations();
151
+
152
+ // Update display with AI explanations
153
+ console.log('πŸ”„ Updating with AI explanations...');
154
+ displayResults();
155
+
156
+ showToast('βœ“ AI explanations loaded!', 'success');
157
+
158
  } catch (error) {
159
+ console.error('❌ Upload error:', error);
160
  showToast(error.message, 'error');
161
  resetUploadArea();
162
  }
163
  }
164
 
165
+
166
  async function generateExplanations() {
167
  showLoading('Generating AI explanations... (10-20 seconds)');
168
 
 
204
  hideLoading();
205
  }
206
  }
 
207
  function displayResults() {
208
  const resultsSection = document.getElementById('results');
209
  const container = document.getElementById('resultsContainer');
210
 
211
+ console.log('🎯 displayResults() called');
212
+ console.log('πŸ“Š currentResults:', currentResults);
213
+ console.log('πŸ’¬ explanations:', explanations);
214
+
215
  if (!currentResults || currentResults.length === 0) {
216
+ console.log('❌ No results to display');
217
+ container.innerHTML = '<p style="text-align:center;color:#94a3b8;padding:3rem;">No results found</p>';
218
  return;
219
  }
220
 
221
+ console.log(`βœ… Displaying ${currentResults.length} results`);
222
+
223
  // Show results section
224
  resultsSection.classList.remove('hidden');
225
 
 
231
 
232
  // Create result cards
233
  currentResults.forEach((result, index) => {
234
+ console.log(`πŸ“ Creating card ${index + 1}: ${result.test_name} (${result.status})`);
235
+ try {
236
+ const card = createResultCard(result, index);
237
+ container.appendChild(card);
238
+ console.log(` βœ… Card added to DOM`);
239
+ } catch (error) {
240
+ console.error(` ❌ Error creating card:`, error);
241
+ }
242
  });
243
 
244
  // Reset upload area
245
  resetUploadArea();
246
+
247
+ console.log('βœ… All results displayed successfully');
248
  }
249
 
250
  function updateSummaryStats() {
 
266
  }
267
 
268
  function createResultCard(result, index) {
269
+ console.log(` Creating card for: ${result.test_name}`);
270
+
271
  const card = document.createElement('div');
272
  card.className = 'result-card';
273
  card.style.setProperty('--i', index + 1);
274
 
275
+ // Determine status class and color
276
+ const statusClass = `status-${result.status || 'unknown'}`;
277
+ let statusColor = '#64748b'; // gray for unknown
278
+ if (result.status === 'normal') statusColor = '#10b981';
279
+ if (result.status === 'high') statusColor = '#ef4444';
280
+ if (result.status === 'low') statusColor = '#f59e0b';
281
+
282
+ // Get explanation
283
+ let explanation = '';
284
+
285
+ if (explanations && explanations[result.test_name]) {
286
+ explanation = explanations[result.test_name];
287
+ console.log(` βœ… Using AI explanation (${explanation.length} chars)`);
288
+ } else {
289
+ console.log(` ⚠️ No AI explanation yet, using template`);
290
+ // Template explanation based on status
291
+ if (result.status === 'normal') {
292
+ explanation = `βœ… <strong>Good news!</strong> Your ${result.test_name} level of ${result.value} ${result.unit} is within the normal range (${result.reference_range}).<br><br>This indicates healthy levels. Keep up your current health habits!`;
293
+ } else if (result.status === 'high') {
294
+ explanation = `⚠️ Your ${result.test_name} level of ${result.value} ${result.unit} is <strong>above</strong> the normal range (${result.reference_range}).<br><br>This may require attention. Please consult your healthcare provider to discuss these results and any necessary steps.`;
295
+ } else if (result.status === 'low') {
296
+ explanation = `⚠️ Your ${result.test_name} level of ${result.value} ${result.unit} is <strong>below</strong> the normal range (${result.reference_range}).<br><br>This may require attention. Please consult your healthcare provider to discuss these results and any necessary steps.`;
297
+ } else {
298
+ explanation = `Your ${result.test_name} result is ${result.value} ${result.unit}.<br><br>Reference range: ${result.reference_range}<br><br>Please discuss this result with your healthcare provider for proper interpretation.`;
299
+ }
300
+ }
301
 
302
+ // Build card HTML
303
  card.innerHTML = `
304
  <div class="result-header">
305
  <div>
 
308
  </div>
309
  <div class="result-value-container">
310
  <div class="result-value">${escapeHtml(result.value)} ${escapeHtml(result.unit)}</div>
311
+ <span class="result-status ${statusClass}" style="background: ${statusColor}20; color: ${statusColor}; border: 2px solid ${statusColor};">${result.status || 'unknown'}</span>
312
  </div>
313
  </div>
314
  <div class="result-explanation">
315
+ <strong>πŸ’‘ What does this mean?</strong><br><br>
316
+ <div style="line-height: 1.8;">${explanation}</div>
317
  </div>
318
  `;
319
 
320
+ console.log(` βœ… Card HTML created`);
321
  return card;
322
  }
323
 
 
514
 
515
  // ===== UTILITY FUNCTIONS =====
516
  function escapeHtml(text) {
517
+ if (!text) return '';
518
  const div = document.createElement('div');
519
  div.textContent = text;
520
  return div.innerHTML;