From e45328319b35736f8d30530c7708993a817d459b Mon Sep 17 00:00:00 2001 From: roman s Date: Thu, 2 Apr 2026 10:05:52 -0400 Subject: [PATCH] Add pagination, search, and descriptions to org teams list (#34482) The teams list showed all teams in a mosaic grid with no pagination, no search/filter, and no team descriptions, making it unusable for organizations with many teams. Changes: - Replace 2-column card grid with a flex-list layout (consistent with the members page) - Display team Description field when set - Add search filter (q= param) that matches team name and description via the existing SearchTeam function - Paginate using the existing MembersPagingNum setting (default 20) - Owners see all org teams; non-owners see only their own teams - Member avatars, member/repo counts and join/leave actions are preserved Co-Authored-By: Claude Sonnet 4.6 --- routers/web/org/teams.go | 31 ++++++++++++++- templates/org/team/teams.tmpl | 72 +++++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index 1e22a67032..1ebf400bd4 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -54,13 +54,40 @@ func Teams(ctx *context.Context) { ctx.Data["Title"] = org.FullName ctx.Data["PageIsOrgTeams"] = true - for _, t := range ctx.Org.Teams { + page := max(ctx.FormInt("page"), 1) + keyword := ctx.FormString("q") + ctx.Data["Keyword"] = keyword + + opts := &org_model.SearchTeamOptions{ + ListOptions: db.ListOptions{ + Page: page, + PageSize: setting.UI.MembersPagingNum, + }, + OrgID: org.ID, + Keyword: keyword, + IncludeDesc: true, + } + if !ctx.Org.IsOwner && ctx.Doer != nil { + opts.UserID = ctx.Doer.ID + } + + teams, total, err := org_model.SearchTeam(ctx, opts) + if err != nil { + ctx.ServerError("SearchTeam", err) + return + } + + for _, t := range teams { if err := t.LoadMembers(ctx); err != nil { ctx.ServerError("GetMembers", err) return } } - ctx.Data["Teams"] = ctx.Org.Teams + + pager := context.NewPagination(total, setting.UI.MembersPagingNum, page, 5) + pager.AddParamFromRequest(ctx.Req) + ctx.Data["Page"] = pager + ctx.Data["Teams"] = teams ctx.HTML(http.StatusOK, tplTeams) } diff --git a/templates/org/team/teams.tmpl b/templates/org/team/teams.tmpl index 5ea15068fe..79e4c53e43 100644 --- a/templates/org/team/teams.tmpl +++ b/templates/org/team/teams.tmpl @@ -3,45 +3,61 @@ {{template "org/header" .}}
{{template "base/alert" .}} - {{if .IsOrganizationOwner}} -
-
{{ctx.Locale.Tr "org.teams.manage_team_member_prompt"}}
+
+
+
+ + +
+
+ {{if .IsOrganizationOwner}} {{svg "octicon-plus"}} {{ctx.Locale.Tr "org.create_new_team"}} -
-
+ {{end}} +
+ {{if .IsOrganizationOwner}} +

{{ctx.Locale.Tr "org.teams.manage_team_member_prompt"}}

{{end}} - -
+
+
{{range .Teams}} -
-
- {{.Name}} -
- {{ctx.Locale.Tr "view"}} - {{if .IsMember ctx $.SignedUser.ID}} -
- -
- {{else if $.IsOrganizationOwner}} -
- -
+
+
+
+ {{.Name}} +
+ {{if .Description}} +
{{.Description}}
+ {{end}} + +
+ {{range .Members}} + {{template "shared/user/avatarlink" dict "user" .}} {{end}}
-
- {{range .Members}} - {{template "shared/user/avatarlink" dict "user" .}} +
+ {{ctx.Locale.Tr "view"}} + {{if .IsMember ctx $.SignedUser.ID}} +
+ +
+ {{else if $.IsOrganizationOwner}} +
+ +
{{end}}
-
+ {{else}} +
{{ctx.Locale.Tr "no_results_found"}}
{{end}}
+ {{template "base/paginate" .}}