Electrolyte Balance Tracker

Electrolyte Balance Tracker

Client Details
Daily Electrolyte Intake
Hydration & Activity

${item.recommendation}

`; } resultsDisplay.innerHTML = resultsHTML; resultsSection.style.display = 'block'; resultsSection.scrollIntoView({ behavior: 'smooth' }); } /** * Generates and downloads a PDF report. */ async function generatePdf() { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const analysis = analyzeBalance(); const clientName = clientNameInput.value || 'N/A'; const trackingDate = trackingDateInput.value ? new Date(trackingDateInput.value).toLocaleDateString() : 'N/A'; const pageHeight = doc.internal.pageSize.height; const pageWidth = doc.internal.pageSize.width; const margin = 15; let y = margin; // 1. HEADER doc.setFont('helvetica', 'bold'); doc.setFontSize(20); doc.setTextColor(30, 41, 59); doc.text('Electrolyte Balance Report', margin, y); y += 15; // 2. CLIENT INFO doc.setFont('helvetica', 'bold'); doc.setFontSize(11); doc.setTextColor(51, 65, 85); doc.text('Client Name:', margin, y); doc.setFont('helvetica', 'normal'); doc.text(clientName, margin + 30, y); doc.setFont('helvetica', 'bold'); doc.text('Date:', pageWidth / 2 + 20, y); doc.setFont('helvetica', 'normal'); doc.text(trackingDate, pageWidth / 2 + 35, y); y += 10; doc.setDrawColor(226, 232, 240); doc.line(margin, y, pageWidth - margin, y); y += 10; // 3. RESULTS TABLE const tableHeaders = ['Electrolyte', 'Your Intake', 'Recommended Range', 'Status']; const colWidths = [30, 40, 50, 40]; // Draw table header doc.setFillColor(243, 244, 246); doc.rect(margin, y, pageWidth - 2 * margin, 10, 'F'); doc.setFont('helvetica', 'bold'); doc.setTextColor(55, 65, 81); doc.setFontSize(10); let currentX = margin + 5; tableHeaders.forEach((header, i) => { doc.text(header, currentX, y + 7); currentX += colWidths[i]; }); y += 10; // Draw table rows doc.setFont('helvetica', 'normal'); doc.setFontSize(9); for (const key in analysis) { const item = analysis[key]; const rowData = [ key.charAt(0).toUpperCase() + key.slice(1), `${item.value.toFixed(0)} ${item.rda.unit}`, `${item.rda.min} - ${item.rda.max} ${item.rda.unit}`, item.status ]; currentX = margin + 5; rowData.forEach((text, i) => { if (i === 3) { // Status column if (item.status === 'Balanced') doc.setTextColor(22, 163, 74); else if (item.status.includes('Low')) doc.setTextColor(217, 119, 6); else doc.setTextColor(220, 38, 38); } else { doc.setTextColor(40, 40, 40); } doc.text(text, currentX, y + 7); currentX += colWidths[i]; }); y += 10; doc.setFont('helvetica', 'italic'); doc.setTextColor(107, 114, 128); const recLines = doc.splitTextToSize(`Recommendation: ${item.recommendation}`, pageWidth - (margin * 2) - 10); doc.text(recLines, margin + 5, y + 2); y += recLines.length * 4 + 8; if (y > pageHeight - 25) { doc.addPage(); y = margin; } } // 4. FOOTER doc.setFontSize(8); doc.setTextColor(148, 163, 184); doc.text(`This report is for informational purposes only and is not a substitute for medical advice.`, margin, pageHeight - 15); doc.text(`Consult a healthcare professional for personalized health guidance.`, margin, pageHeight - 10); doc.save(`Electrolyte_Report_${clientName.replace(/ /g, '_')}.pdf`); } // --- EVENT LISTENERS --- if(analyzeBtn) analyzeBtn.addEventListener('click', displayResults); if(downloadPdfBtn) downloadPdfBtn.addEventListener('click', generatePdf); // --- INITIALIZATION --- trackingDateInput.valueAsDate = new Date(); // Set today's date });
Scroll to Top