package seasonsview
import "git.haelnorr.com/h/oslstats/internal/db"
import "git.haelnorr.com/h/oslstats/internal/view/component/links"
import "fmt"
// PlayoffBracketView renders the full bracket visualization
templ PlayoffBracketView(season *db.Season, league *db.League, bracket *db.PlayoffBracket) {
★
Finals Bracket
{ formatLabel(bracket.Format) }
@playoffStatusBadge(bracket.Status)
@bracketRounds(season, league, bracket)
}
// bracketRounds groups series by round and renders them
templ bracketRounds(season *db.Season, league *db.League, bracket *db.PlayoffBracket) {
{{
// Group series by round
rounds := groupSeriesByRound(bracket.Series)
roundOrder := getRoundOrder(bracket.Format)
}}
for _, roundName := range roundOrder {
if series, ok := rounds[roundName]; ok {
{ formatRoundName(roundName) }
for _, s := range series {
@seriesCard(season, league, s)
}
}
}
}
templ seriesCard(season *db.Season, league *db.League, series *db.PlayoffSeries) {
{ series.Label }
@seriesFormatBadge(series.MatchesToWin)
@seriesStatusBadge(series.Status)
@seriesTeamRow(season, league, series.Team1, series.Team1Seed, series.Team1Wins,
series.WinnerTeamID, series.MatchesToWin)
@seriesTeamRow(season, league, series.Team2, series.Team2Seed, series.Team2Wins,
series.WinnerTeamID, series.MatchesToWin)
if series.MatchesToWin > 1 {
{ fmt.Sprint(series.Team1Wins) } - { fmt.Sprint(series.Team2Wins) }
}
}
templ seriesTeamRow(season *db.Season, league *db.League, team *db.Team, seed *int, wins int, winnerID *int, matchesToWin int) {
{{
isWinner := false
if team != nil && winnerID != nil {
isWinner = team.ID == *winnerID
}
isTBD := team == nil
}}
if seed != nil {
{ fmt.Sprint(*seed) }
} else {
-
}
if isTBD {
TBD
} else {
@links.TeamLinkInSeason(team, season, league)
if isWinner {
✓
}
}
if matchesToWin > 1 {
{ fmt.Sprint(wins) }
}
}
templ playoffStatusBadge(status db.PlayoffStatus) {
switch status {
case db.PlayoffStatusUpcoming:
Upcoming
case db.PlayoffStatusInProgress:
In Progress
case db.PlayoffStatusCompleted:
Completed
}
}
templ seriesFormatBadge(matchesToWin int) {
{{
label := fmt.Sprintf("BO%d", matchesToWin*2-1)
}}
{ label }
}
templ seriesStatusBadge(status db.SeriesStatus) {
switch status {
case db.SeriesStatusPending:
Pending
case db.SeriesStatusInProgress:
Live
case db.SeriesStatusCompleted:
Complete
case db.SeriesStatusBye:
Bye
}
}