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 "fmt" import "sort" import "time" templ SeasonLeagueFixturesPage(season *db.Season, league *db.League, fixtures []*db.Fixture, scheduleMap map[int]*db.FixtureSchedule, resultMap map[int]*db.FixtureResult) { @SeasonLeagueLayout("fixtures", season, league) { @SeasonLeagueFixtures(season, league, fixtures, scheduleMap, resultMap) } } templ SeasonLeagueFixtures(season *db.Season, league *db.League, fixtures []*db.Fixture, scheduleMap map[int]*db.FixtureSchedule, resultMap map[int]*db.FixtureResult) { {{ permCache := contexts.Permissions(ctx) canManage := permCache.HasPermission(permissions.FixturesManage) // Group fixtures by game week (only allocated ones) type gameWeekGroup struct { Week int Fixtures []*db.Fixture } groups := []gameWeekGroup{} groupMap := map[int]int{} // week -> index in groups for _, f := range fixtures { if f.GameWeek == nil { continue } idx, exists := groupMap[*f.GameWeek] if !exists { idx = len(groups) groupMap[*f.GameWeek] = idx groups = append(groups, gameWeekGroup{Week: *f.GameWeek, Fixtures: []*db.Fixture{}}) } groups[idx].Fixtures = append(groups[idx].Fixtures, f) } // Sort fixtures within each group by scheduled time // Scheduled fixtures first (by time), then TBD last farFuture := time.Date(9999, 1, 1, 0, 0, 0, 0, time.UTC) for i := range groups { sort.Slice(groups[i].Fixtures, func(a, b int) bool { ta := farFuture tb := farFuture if sa, ok := scheduleMap[groups[i].Fixtures[a].ID]; ok && sa.ScheduledTime != nil { ta = *sa.ScheduledTime } if sb, ok := scheduleMap[groups[i].Fixtures[b].ID]; ok && sb.ScheduledTime != nil { tb = *sb.ScheduledTime } return ta.Before(tb) }) } }}
if canManage {
Manage Fixtures
} if len(groups) == 0 {

No fixtures scheduled yet.

} else {
for _, group := range groups { {{ playedCount := 0 for _, f := range group.Fixtures { if res, ok := resultMap[f.ID]; ok && res.Finalized { playedCount++ } } hasPlayed := playedCount > 0 allPlayed := playedCount == len(group.Fixtures) }}

Game Week { fmt.Sprint(group.Week) }

if hasPlayed { }
for _, fixture := range group.Fixtures { {{ sched, hasSchedule := scheduleMap[fixture.ID] _ = sched res, hasResult := resultMap[fixture.ID] _ = res isPlayed := hasResult && res.Finalized }} if isPlayed { @fixtureListItem(fixture, sched, hasSchedule, res, hasResult) } else { @fixtureListItem(fixture, sched, hasSchedule, res, hasResult) } }
if allPlayed {
All fixtures played
}
}
}
} templ fixtureListItem(fixture *db.Fixture, sched *db.FixtureSchedule, hasSchedule bool, res *db.FixtureResult, hasResult bool) {
R{ fmt.Sprint(fixture.Round) } { fixture.HomeTeam.Name } vs { fixture.AwayTeam.Name }
if hasResult { if res.IsForfeit { if res.ForfeitType != nil && *res.ForfeitType == "mutual" { Mutual Forfeit } else { Forfeit } } else { if res.Winner == "home" { { fmt.Sprint(res.HomeScore) } { fmt.Sprint(res.AwayScore) } } else if res.Winner == "away" { { fmt.Sprint(res.HomeScore) } { fmt.Sprint(res.AwayScore) } } else { { fmt.Sprint(res.HomeScore) } { fmt.Sprint(res.AwayScore) } } } } else if hasSchedule && sched.ScheduledTime != nil { @localtime(sched.ScheduledTime, "short") } else { TBD } }