v1.2.0:5 — Gear (breathing, 1-5) replaces RPE as the effort field for cardio
Cardio exercises now log a breathing "Gear" (1-5, per Brian MacKenzie) instead of RPE (6-10) as their effort field; strength keeps RPE. An exercise counts as cardio when its equipment type is "cardio" or it carries the "cardio" muscle group (isCardioExercise in lib/exerciseOptions), so the Assault Bike (type "assault bike") qualifies. New nullable SetLog.gear column added by the boot-time guarded ALTER in docker_entrypoint.sh (additive, idempotent); plumbed through all 5 set-write paths, the summary/edit views, and CSV/JSON import-export. Existing rpe data is untouched and still displays. Program/AI target-RPE is unaffected.
This commit is contained in:
@@ -131,3 +131,19 @@ export function deriveTrackingFieldOptions(exercises: Exercise[]): Option[] {
|
||||
export function displayLabel(value: string): string {
|
||||
return titleCaseToken(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cardio exercises log breathing "Gear" (1-5) instead of RPE (6-10) as their
|
||||
* effort field. An exercise counts as cardio if its equipment type is "cardio"
|
||||
* or it carries the "cardio" muscle group (e.g. Assault Bike, type
|
||||
* "assault bike", is tagged cardio).
|
||||
*/
|
||||
export function isCardioExercise(exercise: {
|
||||
type?: string | null;
|
||||
muscleGroups?: string | null;
|
||||
}): boolean {
|
||||
if (normalizeValue(exercise.type || "") === "cardio") return true;
|
||||
return parseJsonArray(exercise.muscleGroups ?? null).some(
|
||||
(group) => normalizeValue(group) === "cardio"
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user