dylanglenister
Updating patient js file
1faabaf
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);
}
});
});