// /public/js/medication.js /** * Full AJAX Medication Tracker - Refactored to use default.js */ let appData = { logs: {}, registry: [], members: [] }; document.addEventListener('DOMContentLoaded', () => { refreshData(); setInterval(updateAllIntervals, 60000); // Use global modal closing helper setupGlobalModalClosing(['modal-overlay', 'delete-modal-overlay'], [ closeDoseModal, closeEditModal, closeDeleteModal, closeRegistryModal, closeManageModal ]); }); /** * Core Data Management */ function refreshData() { fetch('/medication/api/data') .then(res => res.json()) .then(data => { appData = data; renderUI(); }) .catch(err => showToast("Failed to load data", "error")); } function submitForm(event, url, isRegistry = false) { event.preventDefault(); const form = event.target; const formData = new FormData(form); // Merge split time/date for medication logs (non-registry forms) if (!isRegistry && form.id !== 'deleteForm') { const mode = form.id === 'doseForm' ? 'add' : 'edit'; const time = document.getElementById(`${mode}_taken_at_time`).value; const date = document.getElementById(`${mode}_taken_at_date`).value; if (time && date) { formData.set('taken_at', `${date} ${time}`); } } // Refactored to use standard apiPost from default.js apiPost(url, Object.fromEntries(formData)).then(data => { if (data) { closeDoseModal(); closeEditModal(); closeDeleteModal(); if (isRegistry) closeManageModal(); refreshData(); } }); } /** * UI Rendering */ function renderUI() { renderGrid(); renderDropdowns(); renderRegistryTable(); updateAllIntervals(); } function renderGrid() { const grid = document.getElementById('medication-grid'); grid.innerHTML = ''; const members = Object.keys(appData.logs).sort(); const activeMembers = members.filter(m => appData.logs[m].length > 0); if (activeMembers.length === 0) { grid.innerHTML = `
ð No active medication logs found.