Spaces:
Runtime error
Runtime error
| document.addEventListener('DOMContentLoaded', () => { | |
| const form = document.getElementById('patientForm'); | |
| const result = document.getElementById('result'); | |
| const cancelBtn = document.getElementById('cancelBtn'); | |
| const successModal = document.getElementById('patientSuccessModal'); | |
| const successClose = document.getElementById('patientSuccessClose'); | |
| const successReturn = document.getElementById('patientSuccessReturn'); | |
| const successEdit = document.getElementById('patientSuccessEdit'); | |
| const createdIdEl = document.getElementById('createdPatientId'); | |
| const submitBtn = form?.querySelector('button[type="submit"]'); | |
| const titleEl = document.querySelector('h1'); | |
| let isEditMode = false; | |
| let currentPatientId = null; | |
| function getPatientIdFromUrl() { | |
| const urlParams = new URLSearchParams(window.location.search); | |
| // The API uses a generic string 'id', but we'll keep the client-side validation for now. | |
| const pidFromUrl = urlParams.get('patient_id'); | |
| return pidFromUrl; | |
| } | |
| async function loadPatientIntoForm(patientId) { | |
| try { | |
| const resp = await fetch(`/patient/${patientId}`); | |
| if (!resp.ok) return; | |
| const data = await resp.json(); | |
| document.getElementById('name').value = data.name || ''; | |
| document.getElementById('age').value = data.age ?? ''; | |
| document.getElementById('sex').value = data.sex || 'Other'; | |
| document.getElementById('ethnicity').value = data.ethnicity || ''; | |
| document.getElementById('address').value = data.address || ''; | |
| document.getElementById('phone').value = data.phone || ''; | |
| document.getElementById('email').value = data.email || ''; | |
| document.getElementById('medications').value = Array.isArray(data.medications) ? data.medications.join('\n') : ''; | |
| document.getElementById('summary').value = data.past_assessment_summary || ''; | |
| } catch (e) { | |
| console.warn('Failed to load patient profile for editing', e); | |
| } | |
| } | |
| function enableEditMode(patientId) { | |
| isEditMode = true; | |
| currentPatientId = patientId; | |
| if (submitBtn) submitBtn.textContent = 'Update'; | |
| if (titleEl) titleEl.textContent = 'Edit Patient'; | |
| } | |
| // Initialize: only enter edit mode if patient_id is explicitly in URL | |
| const pidFromUrl = getPatientIdFromUrl(); | |
| if (pidFromUrl) { | |
| enableEditMode(pidFromUrl); | |
| loadPatientIntoForm(pidFromUrl); | |
| } | |
| cancelBtn.addEventListener('click', () => { | |
| window.location.href = '/'; | |
| }); | |
| form.addEventListener('submit', async (e) => { | |
| e.preventDefault(); | |
| result.textContent = ''; | |
| result.style.color = ''; | |
| const payload = { | |
| name: document.getElementById('name').value.trim(), | |
| age: parseInt(document.getElementById('age').value, 10), | |
| sex: document.getElementById('sex').value, | |
| ethnicity: document.getElementById('ethnicity').value, | |
| address: document.getElementById('address').value.trim() || null, | |
| phone: document.getElementById('phone').value.trim() || null, | |
| email: document.getElementById('email').value.trim() || null, | |
| medications: document.getElementById('medications').value.split('\n').map(s => s.trim()).filter(Boolean), | |
| past_assessment_summary: document.getElementById('summary').value.trim() || null | |
| }; | |
| try { | |
| if (isEditMode && currentPatientId) { | |
| const resp = await fetch(`/patient/${currentPatientId}`, { | |
| method: 'PATCH', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify(payload) | |
| }); | |
| if (!resp.ok) throw new Error(`HTTP ${resp.status}`); | |
| result.textContent = 'Patient updated successfully.'; | |
| result.style.color = 'green'; | |
| } else { | |
| const resp = await fetch('/patient', { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify(payload) | |
| }); | |
| if (!resp.ok) throw new Error(`HTTP ${resp.status}`); | |
| const data = await resp.json(); | |
| const pid = data.id; | |
| localStorage.setItem('medicalChatbotPatientId', pid); | |
| // Add to localStorage for future suggestions | |
| const existingPatients = JSON.parse(localStorage.getItem('medicalChatbotPatients') || '[]'); | |
| const newPatient = { | |
| id: pid, | |
| name: payload.name, | |
| age: payload.age, | |
| sex: payload.sex | |
| }; | |
| // Check if patient already exists to avoid duplicates | |
| const exists = existingPatients.some(p => p.id === pid); | |
| if (!exists) { | |
| existingPatients.push(newPatient); | |
| localStorage.setItem('medicalChatbotPatients', JSON.stringify(existingPatients)); | |
| } | |
| // Show success modal (stay in create view until user opts to edit) | |
| if (createdIdEl) createdIdEl.textContent = pid; | |
| successModal.classList.add('show'); | |
| } | |
| } catch (err) { | |
| console.error(err); | |
| result.textContent = isEditMode ? 'Failed to update patient. Please try again.' : 'Failed to create patient. Please try again.'; | |
| result.style.color = 'crimson'; | |
| } | |
| }); | |
| // Success modal wiring | |
| if (successClose) successClose.addEventListener('click', () => successModal.classList.remove('show')); | |
| if (successReturn) successReturn.addEventListener('click', () => { window.location.href = '/'; }); | |
| if (successEdit) successEdit.addEventListener('click', () => { | |
| successModal.classList.remove('show'); | |
| const pid = createdIdEl?.textContent?.trim() || localStorage.getItem('medicalChatbotPatientId'); | |
| if (pid) { | |
| // Update URL to reflect edit mode for clarity and reload safety | |
| const newUrl = new URL(window.location.href); | |
| newUrl.searchParams.set('patient_id', pid); | |
| window.history.pushState({ path: newUrl.href }, '', newUrl.href); | |
| enableEditMode(pid); | |
| loadPatientIntoForm(pid); | |
| } | |
| }); | |
| }); | |