From 9e3355deb6525bb06bb89345a96d227385d6d71c Mon Sep 17 00:00:00 2001 From: Haelnorr Date: Fri, 20 Feb 2026 20:08:57 +1100 Subject: [PATCH] added team rosters to season_league overview --- internal/db/teamroster.go | 20 +++++++++++ internal/embedfs/web/css/output.css | 6 ++++ internal/handlers/season_league_teams.go | 10 ++++-- .../seasonsview/season_league_teams.templ | 33 ++++++++++++++++--- 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/internal/db/teamroster.go b/internal/db/teamroster.go index 6361cb6..fe9fa9d 100644 --- a/internal/db/teamroster.go +++ b/internal/db/teamroster.go @@ -75,6 +75,26 @@ func GetTeamRoster(ctx context.Context, tx bun.Tx, seasonShortName, leagueShortN return twr, nil } +// GetManagersByTeam returns a map of teamID -> manager Player for all teams in a season/league +func GetManagersByTeam(ctx context.Context, tx bun.Tx, seasonID, leagueID int) (map[int]*Player, error) { + rosters := []*TeamRoster{} + err := tx.NewSelect(). + Model(&rosters). + Where("tr.season_id = ?", seasonID). + Where("tr.league_id = ?", leagueID). + Where("tr.is_manager = true"). + Relation("Player"). + Scan(ctx) + if err != nil { + return nil, errors.Wrap(err, "tx.NewSelect") + } + result := make(map[int]*Player, len(rosters)) + for _, r := range rosters { + result[r.TeamID] = r.Player + } + return result, nil +} + func AddPlayerToTeam(ctx context.Context, tx bun.Tx, seasonID, leagueID, teamID, playerID int, manager bool, audit *AuditMeta) error { season, err := GetByID[Season](tx, seasonID).Get(ctx) if err != nil { diff --git a/internal/embedfs/web/css/output.css b/internal/embedfs/web/css/output.css index 74829ca..876577f 100644 --- a/internal/embedfs/web/css/output.css +++ b/internal/embedfs/web/css/output.css @@ -1005,6 +1005,9 @@ .p-8 { padding: calc(var(--spacing) * 8); } + .px-1\.5 { + padding-inline: calc(var(--spacing) * 1.5); + } .px-2 { padding-inline: calc(var(--spacing) * 2); } @@ -1044,6 +1047,9 @@ .pt-2 { padding-top: calc(var(--spacing) * 2); } + .pt-3 { + padding-top: calc(var(--spacing) * 3); + } .pt-4 { padding-top: calc(var(--spacing) * 4); } diff --git a/internal/handlers/season_league_teams.go b/internal/handlers/season_league_teams.go index d6fb17d..51a4adc 100644 --- a/internal/handlers/season_league_teams.go +++ b/internal/handlers/season_league_teams.go @@ -25,6 +25,7 @@ func SeasonLeagueTeamsPage( var league *db.League var teams []*db.Team var available []*db.Team + var managers map[int]*db.Player if ok := conn.WithReadTx(s, w, r, func(ctx context.Context, tx bun.Tx) (bool, error) { var err error @@ -45,15 +46,20 @@ func SeasonLeagueTeamsPage( return false, errors.Wrap(err, "db.GetList[Team]") } + managers, err = db.GetManagersByTeam(ctx, tx, season.ID, league.ID) + if err != nil { + return false, errors.Wrap(err, "db.GetManagersByTeam") + } + return true, nil }); !ok { return } if r.Method == "GET" { - renderSafely(seasonsview.SeasonLeagueTeamsPage(season, league, teams, available), s, r, w) + renderSafely(seasonsview.SeasonLeagueTeamsPage(season, league, teams, available, managers), s, r, w) } else { - renderSafely(seasonsview.SeasonLeagueTeams(season, league, teams, available), s, r, w) + renderSafely(seasonsview.SeasonLeagueTeams(season, league, teams, available, managers), s, r, w) } }) } diff --git a/internal/view/seasonsview/season_league_teams.templ b/internal/view/seasonsview/season_league_teams.templ index 2892246..135778c 100644 --- a/internal/view/seasonsview/season_league_teams.templ +++ b/internal/view/seasonsview/season_league_teams.templ @@ -5,9 +5,9 @@ import "git.haelnorr.com/h/oslstats/internal/permissions" import "git.haelnorr.com/h/oslstats/internal/contexts" import "fmt" -templ SeasonLeagueTeamsPage(season *db.Season, league *db.League, teams []*db.Team, allTeams []*db.Team) { +templ SeasonLeagueTeamsPage(season *db.Season, league *db.League, teams []*db.Team, allTeams []*db.Team, managers map[int]*db.Player) { @SeasonLeagueLayout("teams", season, league) { - @SeasonLeagueTeams(season, league, teams, allTeams) + @SeasonLeagueTeams(season, league, teams, allTeams, managers) } } @@ -94,7 +94,7 @@ templ addTeamModal(season *db.Season, league *db.League, existingTeams []*db.Tea } -templ SeasonLeagueTeams(season *db.Season, league *db.League, teams []*db.Team, allTeams []*db.Team) { +templ SeasonLeagueTeams(season *db.Season, league *db.League, teams []*db.Team, allTeams []*db.Team, managers map[int]*db.Player) { {{ permCache := contexts.Permissions(ctx) canAddTeam := permCache.HasPermission(permissions.TeamsAddToLeague) @@ -122,6 +122,9 @@ templ SeasonLeagueTeams(season *db.Season, league *db.League, teams []*db.Team, } else {
for _, team := range teams { + {{ + manager := managers[team.ID] + }}
} -
+
{ team.ShortName } @@ -143,6 +146,28 @@ templ SeasonLeagueTeams(season *db.Season, league *db.League, teams []*db.Team, { team.AltShortName }
+ + if len(team.Players) == 0 { +

No roster

+ } else { +
+ if manager != nil { +
+ { manager.Name } + + ★ Mgr + +
+ } + for _, player := range team.Players { + if manager == nil || player.ID != manager.ID { +
+ { player.Name } +
+ } + } +
+ }
}