Files
WeightTracker/app/templates/dashboard.html

160 lines
5.9 KiB
HTML

{% extends "base.html" %}
{% block title %}Dashboard — WeightTracker{% endblock %}
{% block content %}
<div class="page-header">
<h1>Hey, {{ user.display_name or user.username }}! 👋</h1>
<p>Here's your progress at a glance.</p>
</div>
<!-- Stats Cards -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-label">Current Weight</div>
<div class="stat-value">{{ '%.1f' % (latest.weight_kg | float) if latest else '—' }} <span
style="font-size: 0.9rem; font-weight: 400; color: var(--text-muted);">kg</span></div>
</div>
<div class="stat-card">
<div class="stat-label">Weight Change</div>
<div class="stat-value">
{% if weight_change is not none %}
{{ '%+.1f' % weight_change }} <span
style="font-size: 0.9rem; font-weight: 400; color: var(--text-muted);">kg</span>
{% else %}
{% endif %}
</div>
{% if weight_change_pct is not none %}
<div class="stat-change {{ 'positive' if weight_change < 0 else 'negative' }}">
{{ '%+.1f' % weight_change_pct }}% from start
</div>
{% endif %}
</div>
<div class="stat-card">
<div class="stat-label">Current BMI</div>
<div class="stat-value">{{ '%.1f' % (latest.bmi | float) if latest and latest.bmi else '—' }}</div>
</div>
<div class="stat-card {{ 'stat-card-streak' if streak.current >= 3 }}">
<div class="stat-label">Check-ins</div>
<div class="stat-value">{{ stats.total_checkins if stats else 0 }}</div>
<div class="stat-change" style="color: var(--warning);">🔥 {{ streak.current }}-day streak{% if streak.best >
streak.current %} · Best: {{ streak.best }}{% endif %}</div>
</div>
</div>
<!-- Charts -->
<div class="charts-grid">
<div class="card">
<div class="card-header">
<h2>📈 Weight Over Time</h2>
</div>
<div class="chart-container">
<canvas id="weightChart"></canvas>
</div>
</div>
<div class="card">
<div class="card-header">
<h2>📊 Weekly Change</h2>
</div>
<div class="chart-container">
<canvas id="weeklyChart"></canvas>
</div>
</div>
</div>
<div class="grid-3">
<!-- Recent Check-ins -->
<div class="card">
<div class="card-header">
<h2>🕐 Recent Check-ins</h2>
<a href="{{ url_for('checkin.index') }}" class="btn btn-ghost btn-sm">View All</a>
</div>
{% if recent_checkins %}
<div>
{% for c in recent_checkins %}
<div class="activity-item">
<div style="flex: 1;">
<div style="font-weight: 600; font-size: 1.1rem;">{{ '%.1f' % (c.weight_kg | float) }} kg</div>
<div class="activity-detail">
{% if c.bmi %}BMI {{ '%.1f' % (c.bmi | float) }} · {% endif %}
{{ c.checked_in_at | sydney }}
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="empty-state">
<div class="empty-state-icon">📝</div>
<h3>No check-ins yet</h3>
<p>Log your first weigh-in to start tracking!</p>
<a href="{{ url_for('checkin.index') }}" class="btn btn-primary btn-sm">Check In Now</a>
</div>
{% endif %}
</div>
<!-- Activity Feed & Milestones -->
<div>
{% if milestones %}
<div class="card" style="margin-bottom: 1rem;">
<div class="card-header">
<h2>🏅 Milestones</h2>
</div>
<div class="milestones-grid">
{% for m in milestones %}
<span class="milestone-badge {{ 'gold' if 'lost' in m.milestone_key else '' }}">
{{ MILESTONE_LABELS.get(m.milestone_key, m.milestone_key) }}
</span>
{% endfor %}
</div>
</div>
{% endif %}
<div class="card">
<div class="card-header">
<h2>🔔 Activity Feed</h2>
</div>
{% if activity %}
<div>
{% for a in activity %}
<div class="activity-item">
<div class="activity-avatar">{{ (a.display_name or a.username)[:1] | upper }}</div>
<div class="activity-content">
<div class="activity-name">{{ a.display_name or a.username }}</div>
<div class="activity-detail">Logged {{ '%.1f' % (a.weight_kg | float) }} kg · {{
a.checked_in_at | sydney('%d %b, %H:%M') }}</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="empty-state">
<div class="empty-state-icon">📢</div>
<p>No activity yet. Be the first to check in!</p>
</div>
{% endif %}
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/charts.js') }}"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const chartLabels = {{ chart_labels | tojson
}};
const chartWeights = {{ chart_weights | tojson }};
const weeklyLabels = {{ weekly_labels | tojson }};
const weeklyChanges = {{ weekly_changes | tojson }};
if (chartLabels.length > 0) {
createWeightChart('weightChart', chartLabels, chartWeights);
}
if (weeklyLabels.length > 0) {
createWeeklyChangeChart('weeklyChart', weeklyLabels, weeklyChanges);
}
});
</script>
{% endblock %}