diff --git a/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java b/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java index 6d90219..99a1e5f 100644 --- a/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java +++ b/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java @@ -27,9 +27,15 @@ public class ActivityMetrics { @JoinColumn(name = "activity_id", nullable = false) private Activity activity; + /** + * Average speed in km/h (converted from m/s in FitParser/GpxParser). + */ @Column(name = "average_speed", precision = 8, scale = 2) private BigDecimal averageSpeed; + /** + * Maximum speed in km/h (converted from m/s in FitParser/GpxParser). + */ @Column(name = "max_speed", precision = 8, scale = 2) private BigDecimal maxSpeed; diff --git a/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java b/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java index e5fa745..d4558ca 100644 --- a/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java +++ b/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java @@ -49,6 +49,7 @@ public class ParsedActivityData { private Integer heartRate; private Integer cadence; private Integer power; + /** Speed in km/h (converted from m/s in FitParser/GpxParser). */ private BigDecimal speed; private BigDecimal temperature; private BigDecimal distance; diff --git a/src/main/resources/static/js/fitpub.js b/src/main/resources/static/js/fitpub.js index 261db8e..89dfa8c 100644 --- a/src/main/resources/static/js/fitpub.js +++ b/src/main/resources/static/js/fitpub.js @@ -194,8 +194,8 @@ function createActivityMap(containerId, geoJsonData, options = {}) { popupContent += `Heart Rate: ${props.heartRate} bpm
`; } if (props.speed !== undefined) { - const speedKmh = props.speed * 3.6; - popupContent += `Speed: ${speedKmh.toFixed(2)} km/h
`; + // Speed is already in km/h from backend (converted in FitParser) + popupContent += `Speed: ${props.speed.toFixed(2)} km/h
`; } if (props.elevation !== undefined) { popupContent += `Elevation: ${props.elevation.toFixed(1)} m
`; diff --git a/src/main/resources/templates/activities/detail.html b/src/main/resources/templates/activities/detail.html index 8b3ab4e..7e7caa7 100644 --- a/src/main/resources/templates/activities/detail.html +++ b/src/main/resources/templates/activities/detail.html @@ -487,9 +487,10 @@ } // Additional Metrics (conditional) + // Note: averageSpeed is already in km/h from backend (converted in FitParser) if (activity.averageSpeed) { document.getElementById('metricAvgSpeedContainer').style.display = 'block'; - document.getElementById('metricAvgSpeed').textContent = (activity.averageSpeed * 3.6).toFixed(1) + ' km/h'; + document.getElementById('metricAvgSpeed').textContent = parseFloat(activity.averageSpeed).toFixed(1) + ' km/h'; } if (activity.averageHeartRate) { document.getElementById('metricAvgHRContainer').style.display = 'block';