Daily Activity & Step Count Dashboard

Daily Activity & Step Count Dashboard

Overall Activity Summary

Total Steps

0

Total Distance (Miles)

0

Total Calories Burned

0

Average Steps per Day

0

Steps by Activity Type

Calories Burned by Activity Type

Daily Steps Trend

Detailed Activity Records

ID Date Activity Type Steps Distance (Miles) Calories Burned Duration (Mins)

No data to display.

'; return; } // Sort data by value descending for general charts const sortedData = Object.entries(data).sort(([, valA], [, valB]) => valB - valA); // Determine the maximum value for scaling bars const maxValue = Math.max(...Object.values(data), 1); // Avoid division by zero if all values are 0 sortedData.forEach(([label, value]) => { const barWidth = (value / maxValue) * 100; // Scale based on max value for visual representation const percentageOfTotal = totalValue > 0 ? ((value / totalValue) * 100).toFixed(1) : 0; let displayValue; if (valueType === 'steps') { displayValue = `${value.toLocaleString('en-US')} Steps`; } else if (valueType === 'calories') { displayValue = `${value.toLocaleString('en-US')} Cals`; } else if (valueType === 'distance') { displayValue = `${value.toFixed(1)} Miles`; } else { // 'count' displayValue = `${value}`; } const barWrapper = document.createElement('div'); barWrapper.classList.add('chart-bar-wrapper'); barWrapper.innerHTML = ` ${label}:
${displayValue} (${percentageOfTotal}%)
`; targetElement.appendChild(barWrapper); }); } /** * Calculates and renders all distribution charts. */ function renderDistributionCharts() { // Steps by Activity Type const stepsByActivityType = activityRecords.reduce((acc, record) => { acc[record.activityType] = (acc[record.activityType] || 0) + record.steps; return acc; }, {}); renderBarChart(stepsByActivityTypeChartElem, stepsByActivityType, 'steps'); // Calories Burned by Activity Type const caloriesByActivityType = activityRecords.reduce((acc, record) => { acc[record.activityType] = (acc[record.activityType] || 0) + record.caloriesBurned; return acc; }, {}); renderBarChart(caloriesByActivityTypeChartElem, caloriesByActivityType, 'calories'); // Daily Steps Trend (using dates as labels) const dailySteps = {}; activityRecords.forEach(record => { dailySteps[record.activityDate] = (dailySteps[record.activityDate] || 0) + record.steps; }); // Sort by date for trend const sortedDailySteps = Object.entries(dailySteps).sort(([dateA], [dateB]) => new Date(dateA) - new Date(dateB)); const dailyStepsChartData = Object.fromEntries(sortedDailySteps); // Convert back to object for renderBarChart renderBarChart(dailyStepsTrendChartElem, dailyStepsChartData, 'steps'); } /** * Generates a PDF of the dashboard content. * Excludes non-essential UI elements like buttons and input forms. */ function generatePdf() { // Create a temporary div to hold only the content for PDF const pdfContentWrapper = document.createElement('div'); pdfContentWrapper.classList.add('pdf-content-wrapper'); // Apply PDF-specific styles // Add title const title = document.createElement('h2'); title.textContent = 'Daily Activity & Step Count Report'; title.classList.add('text-2xl', 'font-bold', 'mb-4'); pdfContentWrapper.appendChild(title); // Add summary cards const summarySection = document.createElement('div'); summarySection.classList.add('grid', 'grid-cols-4', 'gap-4', 'mb-6'); summarySection.innerHTML = `

Total Steps

${totalStepsElem.textContent}

Total Distance (Miles)

${totalDistanceElem.textContent}

Total Calories Burned

${totalCaloriesBurnedElem.textContent}

Average Steps per Day

${averageStepsPerDayElem.textContent}

`; pdfContentWrapper.appendChild(summarySection); // Add distribution charts const chartsSection = document.createElement('div'); chartsSection.classList.add('grid', 'grid-cols-2', 'gap-6', 'mb-6'); chartsSection.innerHTML = `

Steps by Activity Type

Calories Burned by Activity Type

Daily Steps Trend

`; pdfContentWrapper.appendChild(chartsSection); // Populate PDF charts (re-use logic but target PDF elements) const stepsByActivityType = activityRecords.reduce((acc, record) => { acc[record.activityType] = (acc[record.activityType] || 0) + record.steps; return acc; }, {}); renderBarChart(chartsSection.querySelector('#pdfStepsByActivityTypeChart'), stepsByActivityType, 'steps'); const caloriesByActivityType = activityRecords.reduce((acc, record) => { acc[record.activityType] = (acc[record.activityType] || 0) + record.caloriesBurned; return acc; }, {}); renderBarChart(chartsSection.querySelector('#pdfCaloriesByActivityTypeChart'), caloriesByActivityType, 'calories'); const dailySteps = {}; activityRecords.forEach(record => { dailySteps[record.activityDate] = (dailySteps[record.activityDate] || 0) + record.steps; }); const sortedDailySteps = Object.entries(dailySteps).sort(([dateA], [dateB]) => new Date(dateA) - new Date(dateB)); const dailyStepsChartData = Object.fromEntries(sortedDailySteps); renderBarChart(chartsSection.querySelector('#pdfDailyStepsTrendChart'), dailyStepsChartData, 'steps'); // Add detailed activity list table const activityListSection = document.createElement('div'); activityListSection.innerHTML = `

Detailed Activity Records

${dashboardActivityTableBody.innerHTML}
ID Date Activity Type Steps Distance (Miles) Calories Burned Duration (Mins)
`; pdfContentWrapper.appendChild(activityListSection); // Options for html2pdf const options = { margin: 10, filename: 'Daily_Activity_Dashboard.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, logging: true, dpi: 192, letterRendering: true }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }, pagebreak: { mode: ['avoid-all', 'css', 'legacy'] } }; // Generate PDF from the temporary content wrapper html2pdf().from(pdfContentWrapper).set(options).save(); // Clean up the temporary div (optional, as it's not appended to the DOM) pdfContentWrapper.remove(); } /** * Loads initial sample data for the dashboard. * Relevant to USA context. */ function loadSampleData() { activityRecords = [ { id: 'ACT001', activityDate: '2024-07-01', activityType: 'Walking', steps: 10500, distance: 5.2, caloriesBurned: 450, duration: 90 }, { id: 'ACT002', activityDate: '2024-07-01', activityType: 'Running', steps: 5000, distance: 2.5, caloriesBurned: 300, duration: 30 }, { id: 'ACT003', activityDate: '2024-07-02', activityType: 'Walking', steps: 8000, distance: 4.0, caloriesBurned: 350, duration: 75 }, { id: 'ACT004', activityDate: '2024-07-03', activityType: 'Cycling', steps: 0, distance: 10.0, caloriesBurned: 600, duration: 45 }, { id: 'ACT005', activityDate: '2024-07-04', activityType: 'Walking', steps: 12000, distance: 6.0, caloriesBurned: 550, duration: 110 }, { id: 'ACT006', activityDate: '2024-07-05', activityType: 'Running', steps: 7500, distance: 3.8, caloriesBurned: 400, duration: 40 }, { id: 'ACT007', activityDate: '2024-07-05', activityType: 'Walking', steps: 2000, distance: 1.0, caloriesBurned: 100, duration: 20 } ]; }
Scroll to Top