Add multi-sport tracking with configurable recovery bonuses
This commit is contained in:
@@ -17,6 +17,16 @@
|
||||
<div>
|
||||
<strong><?= e(format_display_date($entry['date'], false)) ?></strong>
|
||||
<span><?= e($entry['evaluation']['label']) ?></span>
|
||||
<?php if ((int) $entry['sport_minutes'] > 0 && !empty($entry['sport_type_meta'])): ?>
|
||||
<span class="sport-pill-group">
|
||||
<?php foreach ($entry['sport_type_meta'] as $sportType): ?>
|
||||
<span class="sport-pill">
|
||||
<img src="<?= e(sport_icon_path($sportType['icon'])) ?>" alt="">
|
||||
<span><?= e($sportType['label']) ?></span>
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="archive-item__meta">
|
||||
<span><?= e(format_points((float) $entry['evaluation']['total'])) ?></span>
|
||||
@@ -47,6 +57,24 @@
|
||||
<div><dt>Schlaf</dt><dd><?= e((string) $selectedEntry['sleep_hours']) ?> h</dd></div>
|
||||
<div><dt>Schlafgefühl</dt><dd><?= e((string) $selectedEntry['sleep_feeling']) ?>/5</dd></div>
|
||||
<div><dt>Sport</dt><dd><?= e((string) $selectedEntry['sport_minutes']) ?> min</dd></div>
|
||||
<div>
|
||||
<dt>Sportarten</dt>
|
||||
<dd>
|
||||
<?php if ((int) $selectedEntry['sport_minutes'] > 0 && !empty($selectedEntry['sport_type_meta'])): ?>
|
||||
<span class="sport-pill-group sport-pill-group--inline">
|
||||
<?php foreach ($selectedEntry['sport_type_meta'] as $sportType): ?>
|
||||
<span class="sport-pill sport-pill--inline">
|
||||
<img src="<?= e(sport_icon_path($sportType['icon'])) ?>" alt="">
|
||||
<span><?= e($sportType['label']) ?></span>
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</span>
|
||||
<?php else: ?>
|
||||
keine
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
</div>
|
||||
<div><dt>Sportbonus</dt><dd><?= e(format_points((float) ($selectedEntry['evaluation']['components']['sport_bonus'] ?? 0))) ?></dd></div>
|
||||
<div><dt>Spaziergang</dt><dd><?= e((string) $selectedEntry['walk_minutes']) ?> min</dd></div>
|
||||
</dl>
|
||||
|
||||
|
||||
@@ -60,6 +60,108 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-section">
|
||||
<div class="section-head section-head--compact">
|
||||
<div>
|
||||
<h4>Sportarten und Bonuspunkte</h4>
|
||||
<p class="helper-text">Lege fest, welche Sportarten im Tracking auswählbar sind. Der Bonus gilt nur, wenn am Vortag keine gleiche Erholungsgruppe trainiert wurde.</p>
|
||||
</div>
|
||||
<button class="ghost-button" type="button" data-add-sport-type>Sportart hinzufügen</button>
|
||||
</div>
|
||||
|
||||
<div class="sport-type-list" data-sport-type-list>
|
||||
<?php foreach ($settings['sport_types'] as $index => $sportType): ?>
|
||||
<div class="sport-type-card band-card" data-sport-type-row>
|
||||
<input type="hidden" name="settings[sport_types][<?= e((string) $index) ?>][id]" value="<?= e($sportType['id']) ?>" data-name-template="settings[sport_types][__INDEX__][id]">
|
||||
|
||||
<div class="field-grid field-grid--four">
|
||||
<label>
|
||||
<span>Bezeichnung</span>
|
||||
<input type="text" name="settings[sport_types][<?= e((string) $index) ?>][label]" value="<?= e($sportType['label']) ?>" data-name-template="settings[sport_types][__INDEX__][label]">
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Icon</span>
|
||||
<select name="settings[sport_types][<?= e((string) $index) ?>][icon]" data-name-template="settings[sport_types][__INDEX__][icon]">
|
||||
<?php foreach (sport_icon_options() as $iconValue => $iconLabel): ?>
|
||||
<option value="<?= e($iconValue) ?>" <?= $sportType['icon'] === $iconValue ? 'selected' : '' ?>><?= e($iconLabel) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Erholungsgruppe</span>
|
||||
<input type="text" name="settings[sport_types][<?= e((string) $index) ?>][recovery_group]" value="<?= e($sportType['recovery_group']) ?>" data-name-template="settings[sport_types][__INDEX__][recovery_group]">
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Bonuspunkte</span>
|
||||
<input type="number" name="settings[sport_types][<?= e((string) $index) ?>][bonus_points]" value="<?= e((string) $sportType['bonus_points']) ?>" min="0" max="20" data-name-template="settings[sport_types][__INDEX__][bonus_points]">
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<label class="checkbox-row">
|
||||
<input type="checkbox" name="settings[sport_types][<?= e((string) $index) ?>][allow_consecutive]" value="1" <?= !empty($sportType['allow_consecutive']) ? 'checked' : '' ?> data-name-template="settings[sport_types][__INDEX__][allow_consecutive]">
|
||||
<span>Darf an aufeinanderfolgenden Tagen Bonus geben</span>
|
||||
</label>
|
||||
|
||||
<div class="sport-type-card__actions">
|
||||
<span class="sport-pill sport-pill--soft">
|
||||
<img src="<?= e(sport_icon_path($sportType['icon'])) ?>" alt="">
|
||||
<span><?= e($sportType['label']) ?></span>
|
||||
</span>
|
||||
<button class="ghost-button ghost-button--small" type="button" data-remove-sport-type>Entfernen</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<template id="sport-type-row-template">
|
||||
<div class="sport-type-card band-card" data-sport-type-row>
|
||||
<input type="hidden" value="" data-name-template="settings[sport_types][__INDEX__][id]">
|
||||
|
||||
<div class="field-grid field-grid--four">
|
||||
<label>
|
||||
<span>Bezeichnung</span>
|
||||
<input type="text" value="" placeholder="z. B. Mobility" data-name-template="settings[sport_types][__INDEX__][label]">
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Icon</span>
|
||||
<select data-name-template="settings[sport_types][__INDEX__][icon]">
|
||||
<?php foreach (sport_icon_options() as $iconValue => $iconLabel): ?>
|
||||
<option value="<?= e($iconValue) ?>"><?= e($iconLabel) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Erholungsgruppe</span>
|
||||
<input type="text" value="" placeholder="z. B. kraftsport" data-name-template="settings[sport_types][__INDEX__][recovery_group]">
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Bonuspunkte</span>
|
||||
<input type="number" value="2" min="0" max="20" data-name-template="settings[sport_types][__INDEX__][bonus_points]">
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<label class="checkbox-row">
|
||||
<input type="checkbox" value="1" data-name-template="settings[sport_types][__INDEX__][allow_consecutive]">
|
||||
<span>Darf an aufeinanderfolgenden Tagen Bonus geben</span>
|
||||
</label>
|
||||
|
||||
<div class="sport-type-card__actions">
|
||||
<span class="sport-pill sport-pill--soft">
|
||||
<img src="<?= e(sport_icon_path('run')) ?>" alt="">
|
||||
<span>Neue Sportart</span>
|
||||
</span>
|
||||
<button class="ghost-button ghost-button--small" type="button" data-remove-sport-type>Entfernen</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<div class="settings-section">
|
||||
<h4>Bewertungsskala</h4>
|
||||
<div class="band-grid">
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" action="/track" class="tracker-form" id="tracker-form">
|
||||
<form method="post" action="/track" class="tracker-form" id="tracker-form" autocomplete="off">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="date" value="<?= e($entry['date']) ?>">
|
||||
|
||||
@@ -65,6 +65,24 @@
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="field-grid field-grid--single">
|
||||
<fieldset class="sport-choice-field">
|
||||
<legend>Sportarten</legend>
|
||||
<div class="sport-choice-list">
|
||||
<?php foreach ($sportTypes as $sportType): ?>
|
||||
<?php $isChecked = in_array($sportType['id'], $entry['sport_types'], true); ?>
|
||||
<label class="sport-choice">
|
||||
<input type="checkbox" name="sport_types[]" value="<?= e($sportType['id']) ?>" <?= $isChecked ? 'checked' : '' ?>>
|
||||
<span class="sport-choice__card">
|
||||
<img src="<?= e(sport_icon_path($sportType['icon'])) ?>" alt="">
|
||||
<strong><?= e($sportType['label']) ?></strong>
|
||||
</span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<label>
|
||||
<span>Tagebuchnotiz</span>
|
||||
<textarea name="note" rows="8" placeholder="Was war heute wichtig, schwer oder schön?"><?= e($entry['note']) ?></textarea>
|
||||
@@ -99,6 +117,7 @@
|
||||
'sleep_hours' => 'Schlafdauer',
|
||||
'sleep_feeling' => 'Schlafgefühl',
|
||||
'sport_minutes' => 'Sport',
|
||||
'sport_bonus' => 'Sportbonus',
|
||||
'walk_minutes' => 'Spaziergang',
|
||||
'note' => 'Notiz',
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user