Refactor code structure for improved readability and maintainability

This commit is contained in:
bolade
2025-11-26 11:23:04 +01:00
parent 47e6e69eb7
commit 100b47e947
12 changed files with 1335 additions and 641 deletions
+2
View File
@@ -110,6 +110,7 @@ async def upload_files(
fat_percentage: float = Form(...),
focus: str = Form(default="Endurance"),
session_id: str = Form(default="default"),
next_testing_date: str = Form(...),
spirometry_pdf: UploadFile = File(...),
pnoe_csv: UploadFile = File(...),
oxygenation_csv: UploadFile = File(None),
@@ -187,6 +188,7 @@ async def upload_files(
"fat_percentage": fat_percentage,
"focus": focus,
"session_id": session_id,
"next_testing_date": next_testing_date,
}
# Generate report
+40 -44
View File
@@ -27,55 +27,53 @@
</div>
<!-- Metrics Summary Grid -->
<div class="grid grid-cols-2 gap-6 mb-6">
<div class="grid grid-cols-2 gap-4 mb-4">
<!-- Left Leg Metrics -->
<div class="bg-blue-50 p-4 rounded-lg border-2 border-blue-200">
<h3 class="text-lg font-bold text-gray-900 mb-4 text-center">
<div class="bg-blue-50 p-3 rounded-lg border-l-4 border-blue-300">
<h3 class="text-base font-bold text-gray-900 mb-3 text-center">
Left Leg Analysis
</h3>
<div class="space-y-3">
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="space-y-2">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Baseline SmO₂
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ left_baseline_smo2 | default('75.4%') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Minimum SmO₂
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ left_minimum_smo2 | default('69.3%') }}
</div>
<div class="text-xs text-gray-600 mt-1">
<div class="text-xs text-gray-500">
{{ left_minimum_lap | default('Lap 6') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Oxygen Drop
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ left_oxygen_drop | default('6.0%') }}
</div>
<div class="text-xs text-gray-600 mt-1">
<div class="text-xs text-gray-500">
{{ left_drop_percentage | default('8% decrease') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Recovery
</div>
<div class="text-xs text-gray-600 mb-1">
"Optimal >100%"
</div>
<div class="text-lg font-bold text-green-600">
<div class="text-xs text-gray-500">"Optimal >100%"</div>
<div class="text-base font-bold text-green-600">
{{ left_recovery_percentage | default('109%') }}
</div>
</div>
@@ -83,53 +81,51 @@
</div>
<!-- Right Leg Metrics -->
<div class="bg-purple-50 p-4 rounded-lg border-2 border-purple-200">
<h3 class="text-lg font-bold text-gray-900 mb-4 text-center">
<div class="bg-purple-50 p-3 rounded-lg border-l-4 border-purple-300">
<h3 class="text-base font-bold text-gray-900 mb-3 text-center">
Right Leg Analysis
</h3>
<div class="space-y-3">
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="space-y-2">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Baseline SmO₂
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ right_baseline_smo2 | default('82.9%') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Minimum SmO₂
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ right_minimum_smo2 | default('73.7%') }}
</div>
<div class="text-xs text-gray-600 mt-1">
<div class="text-xs text-gray-500">
{{ right_minimum_lap | default('Lap 6') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Oxygen Drop
</div>
<div class="text-lg font-bold text-gray-900">
<div class="text-base font-bold text-gray-900">
{{ right_oxygen_drop | default('9.3%') }}
</div>
<div class="text-xs text-gray-600 mt-1">
<div class="text-xs text-gray-500">
{{ right_drop_percentage | default('11% decrease') }}
</div>
</div>
<div class="bg-white p-3 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700 mb-1">
<div class="bg-white p-2 rounded shadow-sm">
<div class="text-xs font-semibold text-gray-700">
Recovery
</div>
<div class="text-xs text-gray-600 mb-1">
"Optimal >100%"
</div>
<div class="text-lg font-bold text-blue-600">
<div class="text-xs text-gray-500">"Optimal >100%"</div>
<div class="text-base font-bold text-blue-600">
{{ right_recovery_percentage | default('97%') }}
</div>
</div>
@@ -138,9 +134,9 @@
</div>
<!-- Key Findings Summary -->
<div class="bg-gray-100 p-4 rounded-lg">
<h3 class="text-base font-bold text-gray-900 mb-3">Key Findings</h3>
<div class="text-sm text-gray-700 space-y-2">
<div class="bg-gray-100 p-3 rounded-lg">
<h3 class="text-sm font-bold text-gray-900 mb-2">Key Findings</h3>
<div class="text-xs text-gray-700 space-y-1">
<p>
<strong>Left leg</strong> showed better oxygen maintenance
during high-intensity work
+524 -211
View File
@@ -1,216 +1,529 @@
<div class="w-full page bg-white">
<!-- Header Section -->
<!-- Main Content -->
<div class="px-8 py-6">
<!-- Page Title -->
<h1 class="text-3xl font-bold text-black mb-8 text-center">Training Recommendations</h1>
<!-- Training Recommendations Section -->
<div class="grid grid-cols-2 gap-8 mb-8">
<!-- Left Side: Zone Recommendations -->
<div class="bg-gray-200 p-6 rounded-lg">
<!-- Zone 2 Recommendations -->
<div class="mb-6">
<h3 class="text-lg font-bold text-black mb-3">Zone 2 {{ zone2_frequency | default('3-4x/week') }}:</h3>
<ul class="text-sm text-black space-y-1 list-disc list-inside">
<li>{{ zone2_duration | default('40+ minutes') }} of Steady State Cardio (HR {{ zone2_hr_range | default('____') }} bpm)</li>
<li>{{ zone2_speed | default('____ mph') }} at {{ zone2_incline | default('2% Incline') }}</li>
</ul>
</div>
<!-- Zone 3 Recommendations -->
<div class="mb-6">
<h3 class="text-lg font-bold text-black mb-3">Zone 3 {{ zone3_frequency | default('1-2x/week') }}:</h3>
<ul class="text-sm text-black space-y-1 list-disc list-inside">
<li>{{ zone3_duration | default('10-20 minutes') }} in zone 3 (HR {{ zone3_hr_range | default('____ bpm') }})</li>
<li>{{ zone3_speed | default('____mph') }} + at {{ zone3_incline | default('2% Incline') }}</li>
<li>Slow down cadence until HR reaches {{ zone3_target_hr | default('___ bpm') }}</li>
<li>{{ zone3_recovery_speed | default('____mph') }} at {{ zone3_recovery_incline | default('2% Incline') }}</li>
<li>Maintain HR in zone 1 ({{ zone1_hr_range | default('____bpm') }}) for {{ zone1_duration | default('4-8 minutes') }}</li>
<li>Repeat {{ zone3_repeats | default('2-3 times') }}</li>
</ul>
</div>
</div>
<!-- Header Section -->
<!-- Main Content -->
<div class="px-8 py-6">
<!-- Page Title -->
<h1 class="text-3xl font-bold text-black mb-8 text-center">
Training Recommendations
</h1>
<!-- Right Side: Training Table -->
<div>
<table class="w-full border-collapse text-sm">
<thead>
<tr>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">Type</th>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">Sets</th>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">Effort Duration</th>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">Zone</th>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">RPE</th>
<th class="bg-cyan-300 border border-gray-400 p-2 text-black font-bold">Recovery Duration</th>
</tr>
</thead>
<tbody>
<!-- Short Row -->
<tr>
<td class="border border-gray-400 p-2 text-center text-black font-semibold">Short</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ short_sets | default('8-10') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ short_duration | default('10-30 seconds') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ short_zone | default('5') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ short_rpe | default('10') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ short_recovery | default('20-60 seconds') }}</td>
</tr>
<!-- Medium Row -->
<tr>
<td class="border border-gray-400 p-2 text-center text-black font-semibold">Medium</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ medium_sets | default('6-8') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ medium_duration | default('30-90 seconds') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ medium_zone | default('4') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ medium_rpe | default('8-9') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ medium_recovery | default('30-90 seconds') }}</td>
</tr>
<!-- Long Row -->
<tr>
<td class="border border-gray-400 p-2 text-center text-black font-semibold">Long</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ long_sets | default('4-6') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ long_duration | default('5-10 minutes') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ long_zone | default('3/4') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ long_rpe | default('7-8') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ long_recovery | default('2.5-5 minutes') }}</td>
</tr>
<!-- Tempo Row -->
<tr>
<td class="border border-gray-400 p-2 text-center text-black font-semibold">Tempo</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ tempo_sets | default('2-3') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ tempo_duration | default('10-20 minutes') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ tempo_zone | default('3') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ tempo_rpe | default('6-7') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ tempo_recovery | default('4-8 minutes') }}</td>
</tr>
<!-- Cardio Row -->
<tr>
<td class="border border-gray-400 p-2 text-center text-black font-semibold">Cardio</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ cardio_sets | default('1') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ cardio_duration | default('>40 minutes') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ cardio_zone | default('2') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ cardio_rpe | default('4-5') }}</td>
<td class="border border-gray-400 p-2 text-center text-black">{{ cardio_recovery | default('N/A') }}</td>
</tr>
</tbody>
</table>
</div>
<!-- Training Recommendations Section -->
<div class="grid grid-cols-2 gap-8 mb-8">
<!-- Left Side: Zone Recommendations -->
<div class="bg-gray-200 p-4 rounded-lg border-2 border-gray-300">
<!-- Zone 2 Recommendations -->
<div class="mb-4">
<h3 class="text-sm font-bold text-black mb-2">
Zone 2 {{ zone2_frequency | default('3-4x/week') }}:
</h3>
<ul
class="text-xs text-black space-y-0.5 list-disc list-inside ml-2"
>
<li>
{{ zone2_duration | default('40+ minutes') }} of
Steady State Cardio (HR
<span class="border-b border-black"
>{{ zone2_hr_range | default('____') }}</span
>
bpm)
</li>
<li>
<span class="border-b border-black"
>{{ zone2_speed | default('___') }}</span
>
mph at {{ zone2_incline | default('2% Incline') }}
</li>
</ul>
</div>
<!-- Zone 3 Recommendations -->
<div>
<h3 class="text-sm font-bold text-black mb-2">
Zone 3: {{ zone3_frequency | default('1-2x/week') }}:
</h3>
<ul
class="text-xs text-black space-y-0.5 list-disc list-inside ml-2"
>
<li>
{{ zone3_duration | default('10-20 minutes') }} in
zone 3 (HR
<span class="border-b border-black"
>{{ zone3_hr_range | default('____') }}</span
>
bpm)
</li>
<li>
<span class="border-b border-black"
>{{ zone3_speed | default('____') }}</span
>mph + at {{ zone3_incline | default('2% Incline')
}}
</li>
<li class="text-orange-500">
Slow down cadence until HR reaches
<span class="border-b border-orange-500"
>{{ zone3_target_hr | default('___') }}</span
>bpm
</li>
<li>
<span class="border-b border-black"
>{{ zone3_recovery_speed | default('____')
}}</span
>mph at {{ zone3_recovery_incline | default('2%
Incline') }}
</li>
<li class="text-orange-500">
Maintain HR in zone 1 (<span
class="border-b border-orange-500"
>{{ zone1_hr_range | default('____') }}</span
>bpm) for {{ zone1_duration | default('4-8 minutes')
}}
</li>
<li>
Repeat {{ zone3_repeats | default('2-3 times') }}
</li>
</ul>
</div>
</div>
<!-- Right Side: Training Table -->
<div>
<table class="w-full border-collapse text-xs">
<thead>
<tr>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
Type
</th>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
Sets
</th>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
Effort Duration
</th>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
Zone
</th>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
RPE
</th>
<th
class="bg-cyan-300 border border-gray-400 px-2 py-1.5 text-black font-bold text-xs"
>
Recovery Duration
</th>
</tr>
</thead>
<tbody>
<!-- Short Row -->
<tr>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black font-medium text-xs"
>
Short
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ short_sets | default('8-10') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ short_duration | default('10-30 seconds') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ short_zone | default('5') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ short_rpe | default('10') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ short_recovery | default('20-60 seconds') }}
</td>
</tr>
<!-- Medium Row -->
<tr>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black font-medium text-xs"
>
Medium
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ medium_sets | default('6-8') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ medium_duration | default('30-90 seconds') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ medium_zone | default('4') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ medium_rpe | default('8-9') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ medium_recovery | default('30-90 seconds') }}
</td>
</tr>
<!-- Long Row -->
<tr>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black font-medium text-xs"
>
Long
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ long_sets | default('4-6') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ long_duration | default('5-10 minutes') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ long_zone | default('3/4') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ long_rpe | default('7-8') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ long_recovery | default('2.5-5 minutes') }}
</td>
</tr>
<!-- Tempo Row -->
<tr>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black font-medium text-xs"
>
Tempo
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ tempo_sets | default('2-3') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ tempo_duration | default('10-20 minutes') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ tempo_zone | default('3') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ tempo_rpe | default('6-7') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ tempo_recovery | default('4-8 minutes') }}
</td>
</tr>
<!-- Cardio Row -->
<tr>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black font-medium text-xs"
>
Cardio
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ cardio_sets | default('1') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ cardio_duration | default('>40 minutes') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ cardio_zone | default('2') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ cardio_rpe | default('4-5') }}
</td>
<td
class="bg-gray-100 border border-gray-400 px-2 py-1.5 text-center text-black text-xs"
>
{{ cardio_recovery | default('N/A') }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Training Week Example Section -->
<div class="mb-8">
<h2 class="text-2xl font-bold text-black mb-6 text-center">
Training Week Example with Progression
</h2>
<!-- Week 1 -->
<div class="mb-4">
<div class="grid grid-cols-7 gap-1">
<!-- Monday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Monday
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Tuesday
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Wednesday
</div>
</div>
<!-- Thursday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Thursday
</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Friday
</div>
</div>
<!-- Saturday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Saturday
</div>
</div>
<!-- Sunday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Sunday
</div>
</div>
</div>
<div class="grid grid-cols-7 gap-1 mt-1">
<!-- Monday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_mon_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week1_mon_duration | default('45 mins') }}
</div>
</div>
<!-- Tuesday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_tue_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week1_tue_duration | default('45 mins') }}
</div>
</div>
<!-- Wednesday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_wed_zone | default('Zone 3') }}
</div>
<div class="text-xs text-black">
{{ week1_wed_duration1 | default('10mins On') }}
</div>
<div class="text-xs text-black">
{{ week1_wed_duration2 | default('8mins Rest') }}
</div>
<div class="text-xs text-black">
{{ week1_wed_sets | default('x2') }}
</div>
</div>
<!-- Thursday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_thu_content | default('') }}
</div>
</div>
<!-- Friday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_fri_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week1_fri_duration | default('45 mins') }}
</div>
</div>
<!-- Saturday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_sat_content | default('') }}
</div>
</div>
<!-- Sunday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week1_sun_content | default('') }}
</div>
</div>
</div>
</div>
<!-- Week 2 -->
<div class="mb-4">
<div class="grid grid-cols-7 gap-1">
<!-- Monday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Monday
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Tuesday
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Wednesday
</div>
</div>
<!-- Thursday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Thursday
</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Friday
</div>
</div>
<!-- Saturday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Saturday
</div>
</div>
<!-- Sunday -->
<div class="bg-cyan-300 p-2 text-center">
<div class="font-bold text-black text-sm mb-1">
Sunday
</div>
</div>
</div>
<div class="grid grid-cols-7 gap-1 mt-1">
<!-- Monday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_mon_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week2_mon_duration | default('50 mins') }}
</div>
</div>
<!-- Tuesday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_tue_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week2_tue_duration | default('50 mins') }}
</div>
</div>
<!-- Wednesday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_wed_zone | default('Zone 3') }}
</div>
<div class="text-xs text-black">
{{ week2_wed_duration1 | default('10mins On') }}
</div>
<div class="text-xs text-black">
{{ week2_wed_duration2 | default('6mins Rest') }}
</div>
<div class="text-xs text-black">
{{ week2_wed_sets | default('x2') }}
</div>
</div>
<!-- Thursday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_thu_content | default('') }}
</div>
</div>
<!-- Friday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_fri_zone | default('Zone 2') }}
</div>
<div class="text-xs text-black">
{{ week2_fri_duration | default('50 mins') }}
</div>
</div>
<!-- Saturday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_sat_content | default('') }}
</div>
</div>
<!-- Sunday Content -->
<div class="bg-gray-200 p-2 text-center min-h-[60px]">
<div class="text-xs text-black">
{{ week2_sun_content | default('') }}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Training Week Example Section -->
<div class="mb-8">
<h2 class="text-2xl font-bold text-black mb-6 text-center">Training Week Example with Progression</h2>
<!-- Week 1 -->
<div class="mb-6">
<div class="grid grid-cols-7 gap-2">
<!-- Monday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Monday</div>
<div class="text-sm text-black">{{ week1_mon_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week1_mon_duration | default('45 mins') }}</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Tuesday</div>
<div class="text-sm text-black">{{ week1_tue_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week1_tue_duration | default('45 mins') }}</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Wednesday</div>
<div class="text-sm text-black">{{ week1_wed_zone | default('Zone 3') }}</div>
<div class="text-sm text-black">{{ week1_wed_duration1 | default('10mins On') }}</div>
<div class="text-sm text-black">{{ week1_wed_duration2 | default('8mins Rest') }}</div>
<div class="text-sm text-black">{{ week1_wed_sets | default('x2') }}</div>
</div>
<!-- Thursday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Thursday</div>
<div class="text-sm text-black">{{ week1_thu_content | default('') }}</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Friday</div>
<div class="text-sm text-black">{{ week1_fri_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week1_fri_duration | default('45 mins') }}</div>
</div>
<!-- Saturday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Saturday</div>
<div class="text-sm text-black">{{ week1_sat_content | default('') }}</div>
</div>
<!-- Sunday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Sunday</div>
<div class="text-sm text-black">{{ week1_sun_content | default('') }}</div>
</div>
</div>
</div>
<!-- Week 2 -->
<div class="mb-6">
<div class="grid grid-cols-7 gap-2">
<!-- Monday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Monday</div>
<div class="text-sm text-black">{{ week2_mon_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week2_mon_duration | default('50 mins') }}</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Tuesday</div>
<div class="text-sm text-black">{{ week2_tue_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week2_tue_duration | default('50 mins') }}</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Wednesday</div>
<div class="text-sm text-black">{{ week2_wed_zone | default('Zone 3') }}</div>
<div class="text-sm text-black">{{ week2_wed_duration1 | default('10mins On') }}</div>
<div class="text-sm text-black">{{ week2_wed_duration2 | default('6mins Rest') }}</div>
<div class="text-sm text-black">{{ week2_wed_sets | default('x2') }}</div>
</div>
<!-- Thursday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Thursday</div>
<div class="text-sm text-black">{{ week2_thu_content | default('') }}</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Friday</div>
<div class="text-sm text-black">{{ week2_fri_zone | default('Zone 2') }}</div>
<div class="text-sm text-black">{{ week2_fri_duration | default('50 mins') }}</div>
</div>
<!-- Saturday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Saturday</div>
<div class="text-sm text-black">{{ week2_sat_content | default('') }}</div>
</div>
<!-- Sunday -->
<div class="bg-gray-200 p-3 text-center rounded-lg">
<div class="font-bold text-black mb-1">Sunday</div>
<div class="text-sm text-black">{{ week2_sun_content | default('') }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer Section -->
<!-- Footer Section -->
</div>
+105 -66
View File
@@ -1,70 +1,109 @@
<div class="w-full page bg-white">
<!-- Main Content -->
<div class="px-8 py-6">
<!-- Page Title -->
<h1 class="text-3xl font-bold text-black mb-8">Next Steps:</h1>
<!-- Main Content -->
<div class="px-8 py-6">
<!-- Page Title -->
<h1 class="text-3xl font-bold text-black mb-8">Next Steps:</h1>
<!-- Calorie Tracking Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">Calorie Tracking</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>Download and create an account with My Fitness Pal (or preferred nutrition tracker)</li>
<li>Fill out the "My Profile" section with your goals (ie: height, weight, target weight)
<ul class="mt-2 ml-6 space-y-1 list-disc list-inside">
<li>Input your Macros</li>
<li>Click the three dots on the bottom right corner</li>
<li>Click "Goals"</li>
<li>Click "Calorie, Carbs, Protein and Fat Goals" under the Nutrition Goals</li>
<li>Set the Calories, Carbs, Protein, and Fat to the recommended macro outlined above.</li>
</ul>
</li>
<li>Once completed fill out your food intake from each meal on the main page</li>
</ul>
<!-- Recommendation Note -->
<div class="mt-6 text-center">
<p class="text-black italic font-semibold">It's highly recommended to purchase a weight and food scale for more accurate results.</p>
</div>
<!-- Calorie Tracking Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">Calorie Tracking</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>
Download and create an account with My Fitness Pal (or
preferred nutrition tracker)
</li>
<li>
Fill out the "My Profile" section with your goals (ie:
height, weight, target weight)
<ul class="mt-2 ml-6 space-y-1 list-disc list-inside">
<li>Input your Macros</li>
<li>Click the three dots on the bottom right corner</li>
<li>Click "Goals"</li>
<li>
Click "Calorie, Carbs, Protein and Fat Goals" under
the Nutrition Goals
</li>
<li>
Set the Calories, Carbs, Protein, and Fat to the
recommended macro outlined above.
</li>
</ul>
</li>
<li>
Once completed fill out your food intake from each meal on
the main page
</li>
</ul>
<!-- Recommendation Note -->
<div class="mt-6 text-center">
<p class="text-black italic font-semibold">
It's highly recommended to purchase a weight and food scale
for more accurate results.
</p>
</div>
</div>
<!-- Daily Tasks Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">Daily Tasks</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>
Weigh yourself in the morning, after your first bowel
movement, and naked
</li>
<li>Log your weight into your my fitness pal app</li>
<li>
Track calories in grams - FOLLOW YOUR PERSONAL
RECOMMENDATIONS.
</li>
<li>
Log in a diary:
<ul class="mt-2 ml-6 space-y-1 list-disc list-inside">
<li>
Log any additional prescribed recommendation (i.e
breath work)
</li>
<li>
Complete the prescribed training recommendations
(i.e Zone 2 Training)
</li>
<li>
Log additional physical activity (i.e Monday -
Strength Training 1 hour)
</li>
</ul>
</li>
</ul>
</div>
<!-- Two weeks after Appointment Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">
Two weeks after Appointment
</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>
Should you find the macronutrient breakdown difficult to
follow, reach out to us to discuss a change within your
caloric parameters
</li>
</ul>
</div>
<!-- Contact Information -->
<div class="mb-12 text-center">
<p class="text-lg font-bold text-black">
Should you have any questions or concerns please contact us!
</p>
</div>
<!-- Recommended Next Testing Date -->
<div class="mb-8 text-center">
<h2 class="text-2xl font-bold text-black">
<span class="underline">Recommended Next Testing Date:</span>
<span class="ml-2">{{ next_testing_date }}</span>
</h2>
</div>
</div>
<!-- Daily Tasks Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">Daily Tasks</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>Weigh yourself in the morning, after your first bowel movement, and naked</li>
<li>Log your weight into your my fitness pal app</li>
<li>Track calories in grams - FOLLOW YOUR PERSONAL RECOMMENDATIONS.</li>
<li>Log in a diary:
<ul class="mt-2 ml-6 space-y-1 list-disc list-inside">
<li>Log any additional prescribed recommendation (i.e breath work)</li>
<li>Complete the prescribed training recommendations (i.e Zone 2 Training)</li>
<li>Log additional physical activity (i.e Monday - Strength Training 1 hour)</li>
</ul>
</li>
</ul>
</div>
<!-- Two weeks after Appointment Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4">Two weeks after Appointment</h2>
<ul class="text-black space-y-2 list-disc list-inside ml-4">
<li>Should you find the macronutrient breakdown difficult to follow, reach out to us to discuss a change within your caloric parameters</li>
</ul>
</div>
<!-- Contact Information -->
<div class="mb-12 text-center">
<p class="text-lg font-bold text-black">Should you have any questions or concerns please contact us!</p>
</div>
<!-- Recommended Next Testing Date -->
<div class="mb-8 text-center">
<h2 class="text-2xl font-bold text-black">
<span class="underline">Recommended Next Testing Date:</span>
<span class="ml-2">October 2025</span>
</h2>
</div>
</div>
</div>
+346 -214
View File
@@ -1,219 +1,351 @@
<div class="w-full page bg-white">
<!-- Header Section -->
<!-- main content -->
<div class="px-8 py-6">
<!-- Page Title -->
<h1 class="text-3xl font-bold text-black mb-8 text-center">Weekly Meal Plan Breakdown</h1>
<!-- Caloric Deficit Example Section -->
<div class="mb-12">
<h2 class="text-2xl font-bold text-black mb-6 text-center">Caloric Deficit Example</h2>
<!-- Weekly Grid -->
<div class="grid grid-cols-7 gap-3 mb-8">
<!-- Monday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Monday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Tuesday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div class="text-xs text-black">{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Wednesday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Thursday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Thursday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Friday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Saturday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Saturday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Sunday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Sunday</div>
<div class="text-lg font-bold text-black mb-2">{{ deficit_calories | default('1725KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ deficit_protein | default('120g Protein') }}</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
</div>
</div>
<!-- Header Section -->
<!-- main content -->
<div class="px-2 py-6">
<!-- Page Title -->
<h1 class="text-2xl font-bold text-black mb-6 text-center">
Weekly Meal Plan Breakdown
</h1>
<!-- Caloric Deficit with Maintenance/Refeed Example Section -->
<div class="mb-12">
<h2 class="text-2xl font-bold text-black mb-6 text-center">Caloric Deficit with Maintenance/Refeed Example</h2>
<!-- Weekly Grid -->
<div class="grid grid-cols-7 gap-2 mb-8">
<!-- Monday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Monday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekday_calories | default('1615KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekday_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekday_carbs | default('142g Carbs') }}</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>{{ refeed_weekday_fiber | default('24g Fibre') }}</div>
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Tuesday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekday_calories | default('1615KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekday_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekday_carbs | default('142g Carbs') }}</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>{{ refeed_weekday_fiber | default('24g Fibre') }}</div>
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Wednesday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekday_calories | default('1615KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekday_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekday_carbs | default('142g Carbs') }}</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>{{ refeed_weekday_fiber | default('24g Fibre') }}</div>
</div>
</div>
<!-- Thursday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Thursday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekday_calories | default('1615KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekday_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekday_carbs | default('142g Carbs') }}</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>{{ refeed_weekday_fiber | default('24g Fibre') }}</div>
</div>
</div>
<!-- Friday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Friday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekday_calories | default('1615KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekday_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekday_carbs | default('142g Carbs') }}</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>{{ refeed_weekday_fiber | default('24g Fibre') }}</div>
</div>
</div>
<!-- Saturday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Saturday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekend_calories | default('2000KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekend_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekend_carbs | default('190g Carbs') }}</div>
<div>{{ refeed_weekend_fat | default('84g Fat') }}</div>
<div>{{ refeed_weekend_fiber | default('30g Fibre') }}</div>
</div>
</div>
<!-- Sunday -->
<div class="p-3 text-left rounded-lg">
<div class="font-bold text-black mb-2">Sunday</div>
<div class="text-lg font-bold text-black mb-2">{{ refeed_weekend_calories | default('2000KCals') }}</div>
<div class="text-xs text-black space-y-1">
<div>{{ refeed_weekend_protein | default('120g Protein') }}</div>
<div>{{ refeed_weekend_carbs | default('190g Carbs') }}</div>
<div>{{ refeed_weekend_fat | default('84g Fat') }}</div>
<div>{{ refeed_weekend_fiber | default('30g Fibre') }}</div>
</div>
</div>
</div>
</div>
<!-- Caloric Deficit Example Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4 text-center">
Caloric Deficit Example
</h2>
<!-- Macronutrients Recommendations Section -->
<div class="mb-8">
<h2 class="text-2xl font-bold text-black mb-8 text-center">Macronutrients Recommendations</h2>
<!-- Macronutrient Boxes -->
<div class="flex justify-center space-x-12">
<!-- Protein -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">{{ protein_percentage | default('28%') }}</div>
<div class="text-lg font-semibold text-black">Protein</div>
</div>
<!-- Carbs -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">{{ carbs_percentage | default('36%') }}</div>
<div class="text-lg font-semibold text-black">Carbs</div>
</div>
<!-- Fats -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">{{ fats_percentage | default('36%') }}</div>
<div class="text-lg font-semibold text-black">Fats</div>
</div>
</div>
</div>
</div>
<!-- Weekly Grid -->
<div class="grid grid-cols-7 gap-0 mb-6">
<!-- Monday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Monday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Tuesday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Wednesday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Thursday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Thursday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Friday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Saturday -->
<div class="bg-white p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Saturday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
<!-- Sunday -->
<div class="bg-white p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Sunday
</div>
<div class="font-bold text-black mb-1">
{{ deficit_calories | default('1725KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ deficit_protein | default('120g Protein') }}
</div>
<div>{{ deficit_carbs | default('155g Carbs') }}</div>
<div>{{ deficit_fat | default('69g Fat') }}</div>
<div>{{ deficit_fiber | default('25g Fibre') }}</div>
</div>
</div>
</div>
</div>
<!-- Caloric Deficit with Maintenance/Refeed Example Section -->
<div class="mb-8">
<h2 class="text-xl font-bold text-black mb-4 text-center">
Caloric Deficit with Maintenance/Refeed Example
</h2>
<!-- Weekly Grid -->
<div class="grid grid-cols-7 gap-0 mb-6">
<!-- Monday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Monday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekday_calories | default('1615KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ refeed_weekday_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekday_carbs | default('142g Carbs') }}
</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>
{{ refeed_weekday_fiber | default('24g Fibre') }}
</div>
</div>
</div>
<!-- Tuesday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Tuesday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekday_calories | default('1615KCals') }}
</div>
<div class="text-xs text-black leading-tight text-left">
<div>
{{ refeed_weekday_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekday_carbs | default('142g Carbs') }}
</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>
{{ refeed_weekday_fiber | default('24g Fibre') }}
</div>
</div>
</div>
<!-- Wednesday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Wednesday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekday_calories | default('1615KCals') }}
</div>
<div class="text-xs text-black leading-tight">
<div>
{{ refeed_weekday_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekday_carbs | default('142g Carbs') }}
</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>
{{ refeed_weekday_fiber | default('24g Fibre') }}
</div>
</div>
</div>
<!-- Thursday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Thursday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekday_calories | default('1615KCals') }}
</div>
<div class="text-xs text-black leading-tight">
<div>
{{ refeed_weekday_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekday_carbs | default('142g Carbs') }}
</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>
{{ refeed_weekday_fiber | default('24g Fibre') }}
</div>
</div>
</div>
<!-- Friday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Friday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekday_calories | default('1615KCals') }}
</div>
<div class="text-xs text-black leading-tight">
<div>
{{ refeed_weekday_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekday_carbs | default('142g Carbs') }}
</div>
<div>{{ refeed_weekday_fat | default('63g Fat') }}</div>
<div>
{{ refeed_weekday_fiber | default('24g Fibre') }}
</div>
</div>
</div>
<!-- Saturday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Saturday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekend_calories | default('2000KCals') }}
</div>
<div class="text-xs text-black leading-tight">
<div>
{{ refeed_weekend_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekend_carbs | default('190g Carbs') }}
</div>
<div>{{ refeed_weekend_fat | default('84g Fat') }}</div>
<div>
{{ refeed_weekend_fiber | default('30g Fibre') }}
</div>
</div>
</div>
<!-- Sunday -->
<div class="bg-cyan-300 p-2 text-center border border-gray-300">
<div class="text-[10px] font-bold text-black mb-1 bg-blue-300">
Sunday
</div>
<div class="font-bold text-black mb-1">
{{ refeed_weekend_calories | default('2000KCals') }}
</div>
<div class="text-xs text-black leading-tight">
<div>
{{ refeed_weekend_protein | default('120g Protein')
}}
</div>
<div>
{{ refeed_weekend_carbs | default('190g Carbs') }}
</div>
<div>{{ refeed_weekend_fat | default('84g Fat') }}</div>
<div>
{{ refeed_weekend_fiber | default('30g Fibre') }}
</div>
</div>
</div>
</div>
</div>
<!-- Macronutrients Recommendations Section -->
<div class="mb-8">
<h2 class="text-2xl font-bold text-black mb-8 text-center">
Macronutrients Recommendations
</h2>
<!-- Macronutrient Boxes -->
<div class="flex justify-center space-x-12">
<!-- Protein -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">
{{ protein_percentage | default('28%') }}
</div>
<div class="text-lg font-semibold text-black">Protein</div>
</div>
<!-- Carbs -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">
{{ carbs_percentage | default('36%') }}
</div>
<div class="text-lg font-semibold text-black">Carbs</div>
</div>
<!-- Fats -->
<div class="bg-gray-200 p-6 rounded-lg text-center">
<div class="text-3xl font-bold text-black mb-2">
{{ fats_percentage | default('36%') }}
</div>
<div class="text-lg font-semibold text-black">Fats</div>
</div>
</div>
</div>
</div>
</div>
+8 -2
View File
@@ -1,6 +1,12 @@
<div class="w-full page bg-white">
<!-- Main Content -->
<div class="flex flex-col items-center justify-center h-full">
<!-- Title -->
<h1 class="text-2xl font-bold text-center text-gray-800 mb-6">
Fuel Utilization Report - Institute of Science, Health and
Performance
</h1>
<!-- Fuel Utilization Chart -->
<div class="w-full max-w-5xl">
<img
@@ -13,8 +19,8 @@
<!-- Chart Information -->
<div class="mt-8 text-center">
<p class="text-gray-700 text-sm">
Client: {{ client_name | default('Keirstyn Moran') }} |
Assessment Date: {{ assessment_date | default('July 29 2025') }}
Client: {{ client_name }} | Assessment Date: {{ assessment_date
}}
</p>
</div>
</div>
+10 -2
View File
@@ -1297,6 +1297,8 @@ class ContextGenerator:
# Page 9
contexts["page_9"] = {
"client_name": self.patient_info["name"],
"assessment_date": datetime.now().strftime("%B %d %Y"),
"fat_max_value": f"{pnoe_metrics['fat_max_value']:.2f}",
"fat_max_hr": f"{int(pnoe_metrics['fat_max_hr'])}",
"fuel_utilization_chart": graphs.get("fuel_utilization", ""),
@@ -1410,10 +1412,16 @@ class ContextGenerator:
# Pages 14-18 (previously 13-17)
for i in range(1, 6):
contexts[f"page_{i + 13}"] = {
page_num = i + 13
contexts[f"page_{page_num}"] = {
"patient_name": self.patient_info["name"],
"page_number": i + 13,
"page_number": page_num,
}
# Add next_testing_date to page 16
if page_num == 16:
contexts["page_16"]["next_testing_date"] = self.patient_info.get(
"next_testing_date", "Contact us for scheduling"
)
# Page 19 - Glossary with Body Fat Percentage Master Chart (previously page 18)
contexts["page_19"] = {
+13 -7
View File
@@ -1141,15 +1141,20 @@ class GraphGenerator:
fig, ax = plt.subplots(figsize=(10, 2.5))
# Chart data and positions
# Use normalized positions (0-100 scale) for uniform bar length
categories = ["Very Slow", "Slow", "Average", "Fast", "Very Fast"]
positions = [1500, 3000, 4500, 6000, 7500]
indicator_pos = rmr_kcal
highlight_end = rmr_kcal
positions = [10, 30, 50, 70, 90] # Normalized positions on 0-100 scale
# Main Bar (Background)
# Normalize the kcal value to 0-100 scale (assuming range 0-9000 kcal)
max_kcal = 9000
normalized_value = (rmr_kcal / max_kcal) * 100
indicator_pos = normalized_value
highlight_end = normalized_value
# Main Bar (Background) - using 0-100 scale
main_bar = FancyBboxPatch(
(0, 0.4),
9000,
100,
0.2,
boxstyle="round,pad=0,rounding_size=0.1",
ec="none",
@@ -1168,7 +1173,7 @@ class GraphGenerator:
)
ax.add_patch(highlight_bar)
# Text and Labels
# Text and Labels (show actual kcal value)
ax.text(
highlight_end / 2,
0.5,
@@ -1192,7 +1197,7 @@ class GraphGenerator:
# Chart Styling
ax.set_title("Slow vs Fast Metabolism", fontsize=18, weight="bold", loc="left")
ax.set_xlim(0, 9000)
ax.set_xlim(0, 100) # Normalized scale for uniformity
ax.set_ylim(0, 1)
ax.axis("off")
@@ -1296,6 +1301,7 @@ class GraphGenerator:
# Chart Styling
ax.set_title("Fuel Source", fontsize=18, weight="bold", loc="left")
ax.set_xlim(0, 100) # Normalized scale for uniformity
ax.set_ylim(0, 1)
ax.axis("off")
+198 -57
View File
@@ -1,55 +1,116 @@
{% extends "base.html" %}
{% block title %}Upload Patient Data - Report Generator{% endblock %}
{% block content %}
{% extends "base.html" %} {% block title %}Upload Patient Data - Report
Generator{% endblock %} {% block content %}
<div class="px-4 py-6 sm:px-0">
<div class="bg-white shadow rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Upload Patient Data and Files</h2>
<h2 class="text-2xl font-bold text-gray-900 mb-6">
Upload Patient Data and Files
</h2>
{% if error %}
<div class="bg-red-50 border border-red-200 rounded-lg p-4 mb-6">
<p class="text-red-800">{{ error }}</p>
</div>
{% endif %}
<form action="/upload" method="post" enctype="multipart/form-data" class="space-y-6">
<form
action="/upload"
method="post"
enctype="multipart/form-data"
class="space-y-6"
>
<!-- Patient Information Section -->
<div class="border-b border-gray-200 pb-6">
<h3 class="text-lg font-medium text-gray-900 mb-4">Patient Information</h3>
<h3 class="text-lg font-medium text-gray-900 mb-4">
Patient Information
</h3>
<div class="grid grid-cols-1 gap-6 sm:grid-cols-2">
<div>
<label for="first_name" class="block text-sm font-medium text-gray-700">First Name</label>
<input type="text" name="first_name" id="first_name" required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
</div>
<div>
<label for="last_name" class="block text-sm font-medium text-gray-700">Last Name</label>
<input type="text" name="last_name" id="last_name" required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
</div>
<div>
<label for="age" class="block text-sm font-medium text-gray-700">Age</label>
<input type="number" name="age" id="age" required min="1" max="120"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
</div>
<div>
<label for="height" class="block text-sm font-medium text-gray-700">Height (e.g., 5'4" or 165cm)</label>
<input type="text" name="height" id="height" required
<label
for="first_name"
class="block text-sm font-medium text-gray-700"
>First Name</label
>
<input
type="text"
name="first_name"
id="first_name"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="5'4&quot;">
/>
</div>
<div>
<label for="weight" class="block text-sm font-medium text-gray-700">Weight (e.g., 123lbs or 56kg)</label>
<input type="text" name="weight" id="weight" required
<label
for="last_name"
class="block text-sm font-medium text-gray-700"
>Last Name</label
>
<input
type="text"
name="last_name"
id="last_name"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="123lbs">
/>
</div>
<div>
<label for="gender" class="block text-sm font-medium text-gray-700">Gender</label>
<select name="gender" id="gender" required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
<label
for="age"
class="block text-sm font-medium text-gray-700"
>Age</label
>
<input
type="number"
name="age"
id="age"
required
min="1"
max="120"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
/>
</div>
<div>
<label
for="height"
class="block text-sm font-medium text-gray-700"
>Height (e.g., 5'4" or 165cm)</label
>
<input
type="text"
name="height"
id="height"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="5'4&quot;"
/>
</div>
<div>
<label
for="weight"
class="block text-sm font-medium text-gray-700"
>Weight (e.g., 123lbs or 56kg)</label
>
<input
type="text"
name="weight"
id="weight"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="123lbs"
/>
</div>
<div>
<label
for="gender"
class="block text-sm font-medium text-gray-700"
>Gender</label
>
<select
name="gender"
id="gender"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
>
<option value="">Select...</option>
<option value="male">Male</option>
<option value="female">Female</option>
@@ -57,51 +118,132 @@
</select>
</div>
<div>
<label for="focus" class="block text-sm font-medium text-gray-700">Training Focus</label>
<input type="text" name="focus" id="focus" value="Endurance"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
<label
for="focus"
class="block text-sm font-medium text-gray-700"
>Training Focus</label
>
<input
type="text"
name="focus"
id="focus"
value="Endurance"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
/>
</div>
<div>
<label for="session_id" class="block text-sm font-medium text-gray-700">Session ID</label>
<input type="text" name="session_id" id="session_id" value="default"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border">
<label
for="session_id"
class="block text-sm font-medium text-gray-700"
>Session ID</label
>
<input
type="text"
name="session_id"
id="session_id"
value="default"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
/>
</div>
<div>
<label
for="next_testing_date"
class="block text-sm font-medium text-gray-700"
>Recommended Next Testing Date</label
>
<input
type="text"
name="next_testing_date"
id="next_testing_date"
required
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="e.g., October 2025"
/>
</div>
</div>
</div>
<!-- File Upload Section -->
<div class="border-b border-gray-200 pb-6">
<h3 class="text-lg font-medium text-gray-900 mb-4">Upload Files</h3>
<h3 class="text-lg font-medium text-gray-900 mb-4">
Upload Files
</h3>
<div class="space-y-4">
<div>
<label for="spirometry_pdf" class="block text-sm font-medium text-gray-700">Spirometry PDF</label>
<input type="file" name="spirometry_pdf" id="spirometry_pdf" accept=".pdf" required
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
<label
for="spirometry_pdf"
class="block text-sm font-medium text-gray-700"
>Spirometry PDF</label
>
<input
type="file"
name="spirometry_pdf"
id="spirometry_pdf"
accept=".pdf"
required
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100"
/>
</div>
<div>
<label for="pnoe_csv" class="block text-sm font-medium text-gray-700">Pnoe CSV</label>
<input type="file" name="pnoe_csv" id="pnoe_csv" accept=".csv" required
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
<label
for="pnoe_csv"
class="block text-sm font-medium text-gray-700"
>Pnoe CSV</label
>
<input
type="file"
name="pnoe_csv"
id="pnoe_csv"
accept=".csv"
required
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100"
/>
</div>
<div>
<label for="fat_percentage" class="block text-sm font-medium text-gray-700">Body Fat Percentage (%)</label>
<input type="number" step="0.1" name="fat_percentage" id="fat_percentage" required min="0" max="100"
<label
for="fat_percentage"
class="block text-sm font-medium text-gray-700"
>Body Fat Percentage (%)</label
>
<input
type="number"
step="0.1"
name="fat_percentage"
id="fat_percentage"
required
min="0"
max="100"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
placeholder="22.5">
placeholder="22.5"
/>
</div>
<div>
<label for="oxygenation_csv" class="block text-sm font-medium text-gray-700">Muscle Oxygenation CSV (Optional)</label>
<input type="file" name="oxygenation_csv" id="oxygenation_csv" accept=".csv"
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
<p class="mt-1 text-xs text-gray-500">Upload NIRS muscle oxygen CSV file to generate TSI graph</p>
<label
for="oxygenation_csv"
class="block text-sm font-medium text-gray-700"
>Muscle Oxygenation CSV (Optional)</label
>
<input
type="file"
name="oxygenation_csv"
id="oxygenation_csv"
accept=".csv"
class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100"
/>
<p class="mt-1 text-xs text-gray-500">
Upload NIRS muscle oxygen CSV file to generate
TSI graph
</p>
</div>
</div>
</div>
<!-- Submit Button -->
<div class="flex justify-end">
<button type="submit"
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
<button
type="submit"
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
>
Generate Report
</button>
</div>
@@ -110,4 +252,3 @@
</div>
</div>
{% endblock %}
+89 -38
View File
File diff suppressed because one or more lines are too long