Refactor code structure for improved readability and maintainability
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
+437
-124
@@ -3,97 +3,294 @@
|
||||
<!-- 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>
|
||||
<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">
|
||||
<div class="bg-gray-200 p-4 rounded-lg border-2 border-gray-300">
|
||||
<!-- 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>
|
||||
<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 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>
|
||||
<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-sm">
|
||||
<table class="w-full border-collapse text-xs">
|
||||
<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>
|
||||
<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="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>
|
||||
<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="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>
|
||||
<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="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>
|
||||
<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="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>
|
||||
<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="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>
|
||||
<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>
|
||||
@@ -102,110 +299,226 @@
|
||||
|
||||
<!-- 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>
|
||||
<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">
|
||||
<div class="mb-4">
|
||||
<div class="grid grid-cols-7 gap-1">
|
||||
<!-- 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 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-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 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-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 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-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 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-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 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-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 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-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 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-6">
|
||||
<div class="grid grid-cols-7 gap-2">
|
||||
<div class="mb-4">
|
||||
<div class="grid grid-cols-7 gap-1">
|
||||
<!-- 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 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-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 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-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 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-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 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-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 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-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 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-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 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>
|
||||
|
||||
+57
-18
@@ -1,5 +1,4 @@
|
||||
<div class="w-full page bg-white">
|
||||
|
||||
<!-- Main Content -->
|
||||
<div class="px-8 py-6">
|
||||
<!-- Page Title -->
|
||||
@@ -9,22 +8,39 @@
|
||||
<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)
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
@@ -32,14 +48,30 @@
|
||||
<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>
|
||||
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:
|
||||
<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>
|
||||
<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>
|
||||
@@ -47,24 +79,31 @@
|
||||
|
||||
<!-- Two weeks after Appointment Section -->
|
||||
<div class="mb-8">
|
||||
<h2 class="text-xl font-bold text-black mb-4">Two weeks after Appointment</h2>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span class="ml-2">{{ next_testing_date }}</span>
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
+230
-98
@@ -1,22 +1,32 @@
|
||||
<div class="w-full page bg-white">
|
||||
<!-- Header Section -->
|
||||
<!-- main content -->
|
||||
<div class="px-8 py-6">
|
||||
<div class="px-2 py-6">
|
||||
<!-- Page Title -->
|
||||
<h1 class="text-3xl font-bold text-black mb-8 text-center">Weekly Meal Plan Breakdown</h1>
|
||||
<h1 class="text-2xl font-bold text-black mb-6 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>
|
||||
<div class="mb-8">
|
||||
<h2 class="text-xl font-bold text-black mb-4 text-center">
|
||||
Caloric Deficit Example
|
||||
</h2>
|
||||
|
||||
<!-- Weekly Grid -->
|
||||
<div class="grid grid-cols-7 gap-3 mb-8">
|
||||
<div class="grid grid-cols-7 gap-0 mb-6">
|
||||
<!-- 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 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>
|
||||
@@ -24,23 +34,35 @@
|
||||
</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 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-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 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>
|
||||
@@ -48,11 +70,17 @@
|
||||
</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 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>
|
||||
@@ -60,11 +88,17 @@
|
||||
</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 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>
|
||||
@@ -72,11 +106,17 @@
|
||||
</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 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>
|
||||
@@ -84,11 +124,17 @@
|
||||
</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 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>
|
||||
@@ -98,92 +144,171 @@
|
||||
</div>
|
||||
|
||||
<!-- 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>
|
||||
<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-2 mb-8">
|
||||
<div class="grid grid-cols-7 gap-0 mb-6">
|
||||
<!-- 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 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>
|
||||
{{ 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 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>
|
||||
{{ 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 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>
|
||||
{{ 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 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>
|
||||
{{ 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 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>
|
||||
{{ 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 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>
|
||||
{{ 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 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>
|
||||
{{ refeed_weekend_fiber | default('30g Fibre') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -191,29 +316,36 @@
|
||||
|
||||
<!-- Macronutrients Recommendations Section -->
|
||||
<div class="mb-8">
|
||||
<h2 class="text-2xl font-bold text-black mb-8 text-center">Macronutrients Recommendations</h2>
|
||||
<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-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-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-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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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"] = {
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
+196
-55
@@ -1,12 +1,11 @@
|
||||
{% 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">
|
||||
@@ -14,42 +13,104 @@
|
||||
</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"">
|
||||
/>
|
||||
</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""
|
||||
/>
|
||||
</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
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user