From 72cc720e91e531fda3da073a8231951e0cccb696 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Fri, 21 Aug 2026 19:19:45 +0200 Subject: Componentize and isolate the ride range filter --- web/ride-filters.go | 70 +++++++++++++++++++++++++++++++++++++++++++++ web/ride-range-filter.templ | 13 +++++++++ web/templates.templ | 30 ++----------------- 3 files changed, 86 insertions(+), 27 deletions(-) create mode 100644 web/ride-range-filter.templ (limited to 'web') diff --git a/web/ride-filters.go b/web/ride-filters.go index 888d6bc..1fb647b 100644 --- a/web/ride-filters.go +++ b/web/ride-filters.go @@ -65,6 +65,76 @@ type RideFilterView struct { ResetURL string } +type RangeFilterConfig struct { + Legend string + IDPrefix string + Format string + ParamMin string + ParamMax string + BoundMin int + BoundMax int + Step int + ValueMin int + ValueMax int + LabelMin string + LabelMax string + FormatValue func(int) string +} + +func rideDistanceFilterConfig(view RideFilterView) RangeFilterConfig { + return RangeFilterConfig{ + Legend: "Distance", + IDPrefix: "distance", + Format: "distance", + ParamMin: rideFilterDistanceMinParam, + ParamMax: rideFilterDistanceMaxParam, + BoundMin: rideFilterDistanceMinKm, + BoundMax: rideFilterDistanceMaxKm, + Step: rideFilterDistanceStepKm, + ValueMin: view.DistanceMinKm, + ValueMax: view.DistanceMaxKm, + LabelMin: "Minimum distance", + LabelMax: "Maximum distance", + FormatValue: formatRideFilterDistance, + } +} + +func rideDurationFilterConfig(view RideFilterView) RangeFilterConfig { + return RangeFilterConfig{ + Legend: "Moving duration", + IDPrefix: "duration", + Format: "duration", + ParamMin: rideFilterDurationMinParam, + ParamMax: rideFilterDurationMaxParam, + BoundMin: rideFilterDurationMinMinutes, + BoundMax: rideFilterDurationMaxMinutes, + Step: rideFilterDurationStepMinutes, + ValueMin: view.DurationMinMinutes, + ValueMax: view.DurationMaxMinutes, + LabelMin: "Minimum moving duration", + LabelMax: "Maximum moving duration", + FormatValue: formatRideFilterDuration, + } +} + +func rideCotacolFilterConfig(view RideFilterView) RangeFilterConfig { + return RangeFilterConfig{ + Legend: "Cotacol", + IDPrefix: "cotacol", + Format: "cotacol", + ParamMin: rideFilterCotacolMinParam, + ParamMax: rideFilterCotacolMaxParam, + BoundMin: rideFilterCotacolMinPoints, + BoundMax: rideFilterCotacolMaxPoints, + Step: rideFilterCotacolStepPoints, + ValueMin: view.CotacolMinPoints, + ValueMax: view.CotacolMaxPoints, + LabelMin: "Minimum Cotacol", + LabelMax: "Maximum Cotacol", + FormatValue: formatRideFilterCotacol, + } +} + func parseRideFilters(query url.Values) RideFilters { filters := RideFilters{ DistanceMinKm: parseRideFilterInt(query.Get(rideFilterDistanceMinParam), rideFilterDistanceMinKm, rideFilterDistanceMaxKm, rideFilterDistanceStepKm), diff --git a/web/ride-range-filter.templ b/web/ride-range-filter.templ new file mode 100644 index 0000000..27eb802 --- /dev/null +++ b/web/ride-range-filter.templ @@ -0,0 +1,13 @@ +package web + +templ RideRangeFilter(field RangeFilterConfig) { +
+ { field.Legend } +
{ field.FormatValue(field.ValueMin) }{ field.FormatValue(field.ValueMax) }
+
+
+ + +
+
+} diff --git a/web/templates.templ b/web/templates.templ index 0bfef9c..71df20b 100644 --- a/web/templates.templ +++ b/web/templates.templ @@ -37,33 +37,9 @@ templ RidesContent(data RidesPageData) {
-
- Distance -
{ formatRideFilterDistance(data.Filters.DistanceMinKm) }{ formatRideFilterDistance(data.Filters.DistanceMaxKm) }
-
-
- - -
-
-
- Moving duration -
{ formatRideFilterDuration(data.Filters.DurationMinMinutes) }{ formatRideFilterDuration(data.Filters.DurationMaxMinutes) }
-
-
- - -
-
-
- Cotacol -
{ formatRideFilterCotacol(data.Filters.CotacolMinPoints) }{ formatRideFilterCotacol(data.Filters.CotacolMaxPoints) }
-
-
- - -
-
+ @RideRangeFilter(rideDistanceFilterConfig(data.Filters)) + @RideRangeFilter(rideDurationFilterConfig(data.Filters)) + @RideRangeFilter(rideCotacolFilterConfig(data.Filters))
-- cgit v1.3