package templates import ( "track-gopher/models" "fmt" "strconv" ) // RacePublic renders the public race view templ RacePublic(currentGroup models.Group, heats []models.Heat, racers []models.Racer, currentHeatNum int, results []models.HeatResult) { @Layout("Race - " + currentGroup.Name) {

{ currentGroup.Name } - Heat { strconv.Itoa(currentHeatNum) } of { strconv.Itoa(len(heats)) }

0.000
Ready
@raceCurrentHeatLanes(heats, racers, currentHeatNum, results)

Next Heat

if currentHeatNum < len(heats) { @raceNextHeatPreview(heats, racers, currentHeatNum+1) } else {
No more heats in this group
}

Upcoming Heat

if currentHeatNum+1 < len(heats) { @raceNextHeatPreview(heats, racers, currentHeatNum+2) } else {
No more heats in this group
}
} } // Helper template for displaying current heat lanes templ raceCurrentHeatLanes(heats []models.Heat, racers []models.Racer, currentHeatNum int, results []models.HeatResult) { {{ // Find current heat var currentHeat models.Heat for _, heat := range heats { if heat.HeatNum == currentHeatNum { currentHeat = heat break } } // Find heat result if available var currentResult *models.HeatResult for _, result := range results { if result.HeatNumber == currentHeatNum { currentResult = &result break } } }}
if currentHeat.Lane1ID != nil { @raceLaneCard(1, *currentHeat.Lane1ID, racers, currentResult) } if currentHeat.Lane2ID != nil { @raceLaneCard(2, *currentHeat.Lane2ID, racers, currentResult) } if currentHeat.Lane3ID != nil { @raceLaneCard(3, *currentHeat.Lane3ID, racers, currentResult) } if currentHeat.Lane4ID != nil { @raceLaneCard(4, *currentHeat.Lane4ID, racers, currentResult) }
} // Helper template for displaying a lane card templ raceLaneCard(lane int, racerID int64, racers []models.Racer, result *models.HeatResult) { {{ // Find racer var racer models.Racer for _, r := range racers { if r.ID == racerID { racer = r break } } // Get time and position from result if available var time float64 var position int var hasResult bool if result != nil { hasResult = true switch lane { case 1: time = result.Lane1Time position = result.Lane1Position case 2: time = result.Lane2Time position = result.Lane2Position case 3: time = result.Lane3Time position = result.Lane3Position case 4: time = result.Lane4Time position = result.Lane4Position } } }}

Lane { strconv.Itoa(lane) }

{ racer.FirstName } { racer.LastName }

Car #: { racer.CarNumber }
Weight: { fmt.Sprintf("%.1f oz", racer.CarWeight) }

Time
if hasResult { { fmt.Sprintf("%.3f", time) } } else { --.- }
Position
if hasResult { { strconv.Itoa(position) } } else { - }
} // Helper template for displaying next heat preview templ raceNextHeatPreview(heats []models.Heat, racers []models.Racer, heatNum int) { {{ // Find the heat var nextHeat models.Heat for _, heat := range heats { if heat.HeatNum == heatNum { nextHeat = heat break } } }}

Heat { strconv.Itoa(heatNum) }

if nextHeat.Lane1ID != nil { @raceNextHeatRow(1, *nextHeat.Lane1ID, racers) } if nextHeat.Lane2ID != nil { @raceNextHeatRow(2, *nextHeat.Lane2ID, racers) } if nextHeat.Lane3ID != nil { @raceNextHeatRow(3, *nextHeat.Lane3ID, racers) } if nextHeat.Lane4ID != nil { @raceNextHeatRow(4, *nextHeat.Lane4ID, racers) }
Lane Racer Car #
} // Helper template for displaying a row in the next heat preview templ raceNextHeatRow(lane int, racerID int64, racers []models.Racer) { {{ // Find racer var racer models.Racer for _, r := range racers { if r.ID == racerID { racer = r break } } }} { strconv.Itoa(lane) } { racer.FirstName } { racer.LastName } { racer.CarNumber } }