package seasonsview import "git.haelnorr.com/h/oslstats/internal/db" import "git.haelnorr.com/h/oslstats/internal/permissions" import "git.haelnorr.com/h/oslstats/internal/contexts" import "git.haelnorr.com/h/oslstats/internal/view/baseview" import "git.haelnorr.com/h/oslstats/internal/view/component/links" import "fmt" import "sort" import "strings" // seriesTeamName returns a display name for a team in the series, or "TBD" if nil func seriesTeamName(team *db.Team) string { if team == nil { return "TBD" } return team.Name } // seriesTeamShortName returns a short name for a team in the series, or "TBD" if nil func seriesTeamShortName(team *db.Team) string { if team == nil { return "TBD" } return team.ShortName } // roundDisplayName converts a round slug to a human-readable name func roundDisplayName(round string) string { switch round { case "upper_bracket": return "Upper Bracket" case "lower_bracket": return "Lower Bracket" case "upper_final": return "Upper Final" case "lower_final": return "Lower Final" case "quarter_final": return "Quarter Final" case "semi_final": return "Semi Final" case "elimination_final": return "Elimination Final" case "qualifying_final": return "Qualifying Final" case "preliminary_final": return "Preliminary Final" case "third_place": return "Third Place Playoff" case "grand_final": return "Grand Final" default: return strings.ReplaceAll(round, "_", " ") } } // SeriesDetailLayout renders the series detail page layout with header and // tab navigation. Tab content is rendered as children. templ SeriesDetailLayout(activeTab string, series *db.PlayoffSeries, schedule *db.PlayoffSeriesSchedule) { {{ backURL := fmt.Sprintf("/seasons/%s/leagues/%s/finals", series.Bracket.Season.ShortName, series.Bracket.League.ShortName) isCompleted := series.Status == db.SeriesStatusCompleted team1Name := seriesTeamName(series.Team1) team2Name := seriesTeamName(series.Team2) boLabel := fmt.Sprintf("BO%d", series.MatchesToWin*2-1) }} @baseview.Layout(fmt.Sprintf("%s — %s vs %s", series.Label, team1Name, team2Name)) {
Bye — team advances automatically
Teams not yet determined
No time scheduled
@localtime(schedule.ScheduledTime, "date")
@localtime(schedule.ScheduledTime, "time")
@localtime(schedule.ScheduledTime, "date")
@localtime(schedule.ScheduledTime, "time")
Awaiting confirmation
{ *schedule.RescheduleReason }
}No time confirmed
No players on roster.