Skip to content

Commit 7eebf56

Browse files
wetnebGusted
authored andcommitted
fix: paginate list of repositories in a team (#12549)
Follow-up to #12103 / !12447, which added pagination for lists of team members. @mahlzahn has [noticed](https://codeberg.org/forgejo/forgejo/issues/12103#issuecomment-14454947) that the same problem applies to the list of repositories controlled by a team, so this PR adds pagination for that too. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12549 Reviewed-by: Robert Wolff <mahlzahn@posteo.de>
1 parent 1603774 commit 7eebf56

4 files changed

Lines changed: 44 additions & 3 deletions

File tree

models/organization/team.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,19 @@ func (t *Team) IsMember(ctx context.Context, userID int64) bool {
150150
return isMember
151151
}
152152

153-
// LoadRepositories returns paginated repositories in team of organization.
153+
// LoadRepositories returns the repositories of the team in t.Repos.
154154
func (t *Team) LoadRepositories(ctx context.Context) (err error) {
155+
return t.LoadPaginatedRepositories(ctx, db.ListOptionsAll)
156+
}
157+
158+
// LoadPaginatedRepositories loads paginated repositories of the team in t.Repos.
159+
func (t *Team) LoadPaginatedRepositories(ctx context.Context, listOptions db.ListOptions) (err error) {
155160
if t.Repos != nil {
156161
return nil
157162
}
158163
t.Repos, err = GetTeamRepositories(ctx, &SearchTeamRepoOptions{
159-
TeamID: t.ID,
164+
ListOptions: listOptions,
165+
TeamID: t.ID,
160166
})
161167
return err
162168
}

routers/web/org/teams.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,18 @@ func TeamRepositories(ctx *context.Context) {
413413
return
414414
}
415415

416-
if err := ctx.Org.Team.LoadRepositories(ctx); err != nil {
416+
page := max(ctx.FormInt("page"), 1)
417+
total := ctx.Org.Team.NumRepos
418+
pager := context.NewPagination(total, setting.UI.User.RepoPagingNum, page, 5)
419+
opts := db.ListOptions{}
420+
opts.Page = page
421+
opts.PageSize = setting.UI.User.RepoPagingNum
422+
423+
if err := ctx.Org.Team.LoadPaginatedRepositories(ctx, opts); err != nil {
417424
ctx.ServerError("GetRepositories", err)
418425
return
419426
}
427+
ctx.Data["Page"] = pager
420428
ctx.Data["Units"] = unit_model.Units
421429
ctx.HTML(http.StatusOK, tplTeamRepositories)
422430
}

templates/org/team/repositories.tmpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
</div>
5151
{{end}}
5252
</div>
53+
{{template "base/paginate" .}}
5354
</div>
5455
</div>
5556
</div>

tests/integration/org_team_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,29 @@ func TestPaginatedMembers(t *testing.T) {
4646
doc := NewHTMLParser(t, newVar)
4747
assert.Contains(t, strings.TrimSpace(doc.Find("a.item.navigation:contains('Next')").AttrOr("href", "")), fmt.Sprintf("%s?page=2", teamURL))
4848
}
49+
50+
func TestPaginatedRepos(t *testing.T) {
51+
defer tests.PrepareTestEnv(t)()
52+
// To make sure that pagination kicks in even though the test team has few repos
53+
defer test.MockVariableValue(&setting.UI.User.RepoPagingNum, 2)()
54+
55+
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
56+
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1})
57+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
58+
59+
assert.GreaterOrEqual(t, team.NumRepos, 3)
60+
isOrgMember, err := organization.IsOrganizationMember(db.DefaultContext, org.ID, user.ID)
61+
require.NoError(t, err)
62+
assert.True(t, isOrgMember)
63+
isTeamMember, err := organization.IsTeamMember(db.DefaultContext, team.OrgID, team.ID, user.ID)
64+
require.NoError(t, err)
65+
assert.True(t, isTeamMember)
66+
assert.Equal(t, org.ID, team.OrgID)
67+
68+
session := loginUser(t, user.Name)
69+
70+
teamURL := fmt.Sprintf("/org/%s/teams/%s/repositories", org.Name, team.LowerName)
71+
body := session.MakeRequest(t, NewRequest(t, "GET", teamURL), http.StatusOK).Body
72+
doc := NewHTMLParser(t, body)
73+
assert.Contains(t, strings.TrimSpace(doc.Find("a.item.navigation:contains('Next')").AttrOr("href", "")), fmt.Sprintf("%s?page=2", teamURL))
74+
}

0 commit comments

Comments
 (0)