From d53c756a6582837fa2f303c268f2ccfac917c871 Mon Sep 17 00:00:00 2001 From: logikonline Date: Sun, 18 Jan 2026 21:47:07 -0500 Subject: [PATCH] Fix repo grouping to order by group_header in database query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, repos were paginated first then grouped, causing groups to be split across pages. Now when grouping is enabled: 1. Order by group_header first in DB query (keeps groups together) 2. Support ?limit=N parameter (max 100) to show more repos per page Example: /org/repositories?limit=50 shows 50 repos per page 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- routers/web/org/home.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/routers/web/org/home.go b/routers/web/org/home.go index 7269512d05..c083e4860b 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -82,6 +82,17 @@ func home(ctx *context.Context, viewRepositories bool) { page = 1 } + // Allow custom page size via limit parameter (max 100, default from settings) + pageSize := ctx.FormInt("limit") + if pageSize <= 0 || pageSize > 100 { + pageSize = setting.UI.User.RepoPagingNum + } + ctx.Data["PageSize"] = pageSize + + // Check if grouping is enabled (default: true) + showGrouping := ctx.FormString("show_groups") != "0" + ctx.Data["ShowGrouping"] = showGrouping + archived := ctx.FormOptionalBool("archived") ctx.Data["IsArchived"] = archived @@ -221,14 +232,20 @@ func home(ctx *context.Context, viewRepositories bool) { ctx.Data["PageIsViewOverview"] = isViewOverview ctx.Data["ShowOrgProfileReadmeSelector"] = isViewOverview && prepareResult.ProfilePublicReadmeBlob != nil && prepareResult.ProfilePrivateReadmeBlob != nil + // When grouping is enabled, order by group_header first to keep groups together + finalOrderBy := orderBy + if showGrouping { + finalOrderBy = db.SearchOrderBy("group_header ASC, " + string(orderBy)) + } + repos, count, err := repo_model.SearchRepository(ctx, repo_model.SearchRepoOptions{ ListOptions: db.ListOptions{ - PageSize: setting.UI.User.RepoPagingNum, + PageSize: pageSize, Page: page, }, Keyword: keyword, OwnerID: org.ID, - OrderBy: orderBy, + OrderBy: finalOrderBy, Private: ctx.IsSigned, Actor: ctx.Doer, Language: language, @@ -248,9 +265,6 @@ func home(ctx *context.Context, viewRepositories bool) { ctx.Data["Total"] = count // Group repos by GroupHeader for grouped view - showGrouping := ctx.FormString("show_groups") != "0" // default to true - ctx.Data["ShowGrouping"] = showGrouping - if showGrouping { groupedRepos := make(map[string][]*repo_model.Repository) var headers []string @@ -280,7 +294,7 @@ func home(ctx *context.Context, viewRepositories bool) { ctx.Data["RepoHeaders"] = headers } - pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5) + pager := context.NewPagination(int(count), pageSize, page, 5) pager.AddParamFromRequest(ctx.Req) ctx.Data["Page"] = pager