const Stats = (() => {
async function init() {
await loadStats();
}
async function loadStats() {
const content = document.getElementById('stats-content');
content.innerHTML = '
Loading stats...
';
try {
const stats = await API.getStats();
renderStats(stats);
} catch (e) {
content.innerHTML = 'Error loading stats: ' + escHtml(e.message) + '
';
}
}
function renderStats(stats) {
const content = document.getElementById('stats-content');
let html = '';
// Summary totals
if (stats.total !== undefined || stats.totalDistance !== undefined) {
const totalDist = stats.total?.distance || stats.totalDistance || 0;
const totalTracks = stats.total?.count || stats.trackCount || 0;
html += `
Total
Distance
${formatDistance(totalDist)}
`;
}
// By year
if (stats.byYear && stats.byYear.length > 0) {
const maxDist = Math.max(...stats.byYear.map(s => s.distance || 0));
html += 'By Year
';
for (const s of stats.byYear) {
const pct = maxDist > 0 ? ((s.distance || 0) / maxDist * 100) : 0;
html += `
${s.year}
${formatDistance(s.distance)}
`;
}
html += '
';
}
// By month (last 24 months)
if (stats.byMonth && stats.byMonth.length > 0) {
const recent = stats.byMonth.slice(-24);
const maxDist = Math.max(...recent.map(s => s.distance || 0));
html += 'By Month (last 24)
';
for (const s of recent) {
const pct = maxDist > 0 ? ((s.distance || 0) / maxDist * 100) : 0;
const label = `${s.year}-${String(s.month).padStart(2, '0')}`;
html += `
${label}
${formatDistance(s.distance)}
`;
}
html += '
';
}
// By week (last 52 weeks)
if (stats.byWeek && stats.byWeek.length > 0) {
const recent = stats.byWeek.slice(-52);
const maxDist = Math.max(...recent.map(s => s.distance || 0));
html += 'By Week (last 52)
';
for (const s of recent) {
const pct = maxDist > 0 ? ((s.distance || 0) / maxDist * 100) : 0;
const label = `${s.year}-W${String(s.week).padStart(2, '0')}`;
html += `
${label}
${formatDistance(s.distance)}
`;
}
html += '
';
}
if (!html) {
html = 'No tracks yet. Upload some GPX files to see stats.
';
}
content.innerHTML = html;
}
return { init, loadStats };
})();