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)
switch bracket.Format { case db.PlayoffFormat5to6: @bracket5to6(season, league, bracket) case db.PlayoffFormat7to9: @bracket7to9(season, league, bracket) case db.PlayoffFormat10to15: @bracket10to15(season, league, bracket) }
Winner
Loser
} // ────────────────────────────────────────────── // 5-6 TEAMS FORMAT // ────────────────────────────────────────────── // Round 1: [Upper Bracket] [Lower Bracket] // Round 2: [Upper Final] [Lower Final] // Round 3: [Grand Final] templ bracket5to6(season *db.Season, league *db.League, bracket *db.PlayoffBracket) { {{ s := seriesByNumber(bracket.Series) conns := connectionsJSON(bracket.Series) }}
@seriesCard(season, league, s[1]) @seriesCard(season, league, s[2])
@seriesCard(season, league, s[3]) @seriesCard(season, league, s[4])
@seriesCard(season, league, s[5])
} // ────────────────────────────────────────────── // 7-9 TEAMS FORMAT // ────────────────────────────────────────────── // Round 1 (Quarter Finals): [QF1] [QF2] // Round 2 (Semi Finals): [SF1] [SF2] // Round 3: [3rd Place] [Grand Final] templ bracket7to9(season *db.Season, league *db.League, bracket *db.PlayoffBracket) { {{ s := seriesByNumber(bracket.Series) conns := connectionsJSON(bracket.Series) }}
@seriesCard(season, league, s[1]) @seriesCard(season, league, s[2])
@seriesCard(season, league, s[3]) @seriesCard(season, league, s[4])
@seriesCard(season, league, s[5]) @seriesCard(season, league, s[6])
} // ────────────────────────────────────────────── // 10-15 TEAMS FORMAT // ────────────────────────────────────────────── // 4 invisible columns, cards placed into specific cells: // Row 1: EF1(col2) EF2(col3) // Row 2: QF1(col1) QF2(col4) // Row 3: SF1(col2) SF2(col3) // Row 4: PF1(col2) PF2(col3) // Row 5: 3rd(col2) // Row 6: GF(col3) templ bracket10to15(season *db.Season, league *db.League, bracket *db.PlayoffBracket) { {{ s := seriesByNumber(bracket.Series) conns := connectionsJSON(bracket.Series) }}
@seriesCard(season, league, s[3]) @seriesCard(season, league, s[4])
@seriesCard(season, league, s[1])
@seriesCard(season, league, s[2])
@seriesCard(season, league, s[5]) @seriesCard(season, league, s[6])
@seriesCard(season, league, s[7]) @seriesCard(season, league, s[8])
@seriesCard(season, league, s[9])
@seriesCard(season, league, s[10])
} // ────────────────────────────────────────────── // SHARED COMPONENTS // ────────────────────────────────────────────── templ seriesCard(season *db.Season, league *db.League, series *db.PlayoffSeries) { {{ hasTeams := series.Team1 != nil || series.Team2 != nil seriesURL := fmt.Sprintf("/series/%d", series.ID) isForfeit := series.IsForfeit }}
{ series.Label } @seriesFormatBadge(series.MatchesToWin)
if isForfeit { FF } @seriesStatusBadge(series.Status)
@seriesTeamRow(season, league, series.Team1, series.Team1Seed, series.Team1Wins, series.WinnerTeamID, series.ForfeitTeamID, series.MatchesToWin) @seriesTeamRow(season, league, series.Team2, series.Team2Seed, series.Team2Wins, series.WinnerTeamID, series.ForfeitTeamID, series.MatchesToWin)
if series.MatchesToWin > 1 && !isForfeit {
{ 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, forfeitTeamID *int, matchesToWin int) { {{ isWinner := false if team != nil && winnerID != nil { isWinner = team.ID == *winnerID } isForfeiter := false if team != nil && forfeitTeamID != nil { isForfeiter = team.ID == *forfeitTeamID } isTBD := team == nil }}
if seed != nil { { fmt.Sprint(*seed) } } else { - } if isTBD { TBD } else {
@links.TeamLinkInSeason(team, season, league)
if isForfeiter { FF } else if isWinner { } }
if matchesToWin > 1 && forfeitTeamID == nil { { 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 } }