diff --git a/db/integrations/komoot/komoot.go b/db/integrations/komoot/komoot.go index f9d6d376..b350f9e6 100644 --- a/db/integrations/komoot/komoot.go +++ b/db/integrations/komoot/komoot.go @@ -274,7 +274,7 @@ func createTrailFromTour(app core.App, k *KomootApi, detailedTour *DetailedKomoo "distance": detailedTour.Distance, "elevation_gain": detailedTour.ElevationUp, "elevation_loss": detailedTour.ElevationDown, - "duration": detailedTour.Duration / 60, + "duration": detailedTour.Duration, "date": detailedTour.Date, "external_provider": "komoot", "external_id": strconv.Itoa(detailedTour.ID), diff --git a/db/integrations/strava/strava.go b/db/integrations/strava/strava.go index 8c4545ca..77bdd7d4 100644 --- a/db/integrations/strava/strava.go +++ b/db/integrations/strava/strava.go @@ -342,7 +342,7 @@ func createTrailFromRoute(app core.App, route StravaRoute, gpx *filesystem.File, "public": !route.Private, "distance": route.Distance, "elevation_gain": route.ElevationGain, - "duration": route.EstimatedMovingTime / 60, + "duration": route.EstimatedMovingTime, "date": time.Unix(int64(route.Timestamp), 0), "external_provider": "strava", "external_id": route.IDStr, @@ -523,7 +523,7 @@ func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx "public": !activity.Private, "distance": activity.Distance, "elevation_gain": activity.TotalElevationGain, - "duration": activity.ElapsedTime / 60, + "duration": activity.ElapsedTime, "date": activity.StartDate, "external_provider": "strava", "external_id": activity.ID, diff --git a/db/migrations/1750859597_trail_duration_seconds.go b/db/migrations/1750859597_trail_duration_seconds.go new file mode 100644 index 00000000..37178991 --- /dev/null +++ b/db/migrations/1750859597_trail_duration_seconds.go @@ -0,0 +1,42 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + trails, err := app.FindAllRecords("trails") + if err != nil { + return err + } + + for _, t := range trails { + duration := t.GetFloat("duration") + t.Set("duration", duration*60) + err = app.Save(t) + if err != nil { + return err + } + } + + return nil + }, func(app core.App) error { + trails, err := app.FindAllRecords("trails") + if err != nil { + return err + } + + for _, t := range trails { + duration := t.GetFloat("duration") + t.Set("duration", duration/60) + err = app.Save(t) + if err != nil { + return err + } + } + + return nil + }) +} diff --git a/web/src/lib/components/summit_log/summit_log_card.svelte b/web/src/lib/components/summit_log/summit_log_card.svelte index a490292d..fd2b40ab 100644 --- a/web/src/lib/components/summit_log/summit_log_card.svelte +++ b/web/src/lib/components/summit_log/summit_log_card.svelte @@ -120,7 +120,7 @@ > {formatTimeHHMM( - log.duration ? log.duration / 60 : undefined, + log.duration ? log.duration : undefined, )} - {formatTimeHHMM(log.duration ? log.duration / 60 : undefined)} + {formatTimeHHMM(log.duration ? log.duration : undefined)} {#if showCategory} diff --git a/web/src/lib/util/format_util.ts b/web/src/lib/util/format_util.ts index 12289980..2947ae9e 100644 --- a/web/src/lib/util/format_util.ts +++ b/web/src/lib/util/format_util.ts @@ -1,16 +1,16 @@ import { browser } from "$app/environment"; import { page } from "$app/state"; -import { get } from "svelte/store"; -export function formatTimeHHMM(minutes?: number) { - if (!minutes) { +export function formatTimeHHMM(seconds?: number) { + if (seconds == null || isNaN(seconds)) { return "-"; } - const m = minutes % 60; - const h = (minutes - m) / 60; + const totalMinutes = Math.floor(seconds / 60); + const m = totalMinutes % 60; + const h = Math.floor(totalMinutes / 60); - return (h < 10 ? "0" : "") + h.toString() + "h " + (Math.round(m) < 10 ? "0" : "") + Math.round(m).toString() + "m"; + return (h < 10 ? "0" : "") + h.toString() + "h " + (m < 10 ? "0" : "") + m.toString() + "m"; } export function formatDistance(meters?: number) { diff --git a/web/src/lib/util/gpx_util.ts b/web/src/lib/util/gpx_util.ts index 0f9052c1..c1b02eb1 100644 --- a/web/src/lib/util/gpx_util.ts +++ b/web/src/lib/util/gpx_util.ts @@ -62,7 +62,7 @@ export async function gpx2trail(gpxString: string, fallbackName?: string, f: (ur .substring(0, 10); } - trail.duration = totals.duration / 1000 / 60 + trail.duration = totals.duration / 1000 trail.elevation_gain = totals.elevationGain; trail.elevation_loss = totals.elevationLoss; trail.distance = totals.distance diff --git a/web/src/lib/vendor/maplibre-elevation-profile/elevationprofile.ts b/web/src/lib/vendor/maplibre-elevation-profile/elevationprofile.ts index 9e0500e0..a09e6bdc 100644 --- a/web/src/lib/vendor/maplibre-elevation-profile/elevationprofile.ts +++ b/web/src/lib/vendor/maplibre-elevation-profile/elevationprofile.ts @@ -959,7 +959,7 @@ export class ElevationProfile { if (time) { const timePrevious = this.times[i - 1]; - const timeDelta = (time.getTime() - timePrevious.getTime()) / (1000 * 60); + const timeDelta = (time.getTime() - timePrevious.getTime()) / (1000); cumulatedTime += timeDelta; this.cumulatedTime.push(cumulatedTime) } diff --git a/web/src/routes/profile/[handle]/stats/+page.svelte b/web/src/routes/profile/[handle]/stats/+page.svelte index 9674613f..0d5f5ade 100644 --- a/web/src/routes/profile/[handle]/stats/+page.svelte +++ b/web/src/routes/profile/[handle]/stats/+page.svelte @@ -316,7 +316,7 @@ >{$_("duration")}

- {formatTimeHHMM(totalDuration / 60)} + {formatTimeHHMM(totalDuration)}