Add pagination and search box to org teams list (#37245)

- Add pagination and keyword search to the teams list page
- 5 teams shown at most in the overview page

Fixes: #34482
Fixes: #36602
Fixes: #37084
Signed-off-by: silverwind <me@silverwind.io>
Co-authored-by: Animesh Kumar <83393501+kmranimesh@users.noreply.github.com>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Claude (Opus 4.7) <noreply@anthropic.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
PineBale
2026-04-17 23:29:11 +08:00
committed by GitHub
parent eb334e3738
commit 18064f772d
13 changed files with 226 additions and 86 deletions

View File

@@ -16,9 +16,12 @@ import (
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/test"
"code.gitea.io/gitea/tests"
"github.com/PuerkitoBio/goquery"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -31,6 +34,7 @@ func TestOrg(t *testing.T) {
t.Run("OrgMembers", testOrgMembers)
t.Run("OrgRestrictedUser", testOrgRestrictedUser)
t.Run("TeamSearch", testTeamSearch)
t.Run("TeamsPage", testTeamsPage)
t.Run("OrgSettings", testOrgSettings)
}
@@ -251,6 +255,67 @@ func testTeamSearch(t *testing.T) {
})
}
func testTeamsPage(t *testing.T) {
// org17 has three teams in fixtures: Owners (id 5), test_team (id 8), review_team (id 9).
// user15 is in Owners; user20 is in review_team only; user5 is not a member.
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})
listTeams := func(t *testing.T, session *TestSession, query string) []string {
req := NewRequestf(t, "GET", "/org/%s/teams%s", org.Name, query)
resp := session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
sel := htmlDoc.doc.Find(".ui.top.attached.header strong")
names := make([]string, 0, sel.Length())
sel.Each(func(_ int, s *goquery.Selection) {
names = append(names, s.Text())
})
return names
}
// Owner sees all teams, "Owners" sorted first regardless of alphabetical order
ownerSession := loginUser(t, "user15")
assert.Equal(t, []string{"Owners", "review_team", "test_team"}, listTeams(t, ownerSession, ""))
// Keyword filter narrows by name
assert.Equal(t, []string{"review_team"}, listTeams(t, ownerSession, "?q=review"))
// Non-admin org member sees only the teams they belong to
memberSession := loginUser(t, "user20")
assert.Equal(t, []string{"review_team"}, listTeams(t, memberSession, ""))
// Edit review_team so user20 gets full list
reviewTeam := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 9})
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/org/%s/teams/%s/edit", org.Name, reviewTeam.Name), map[string]string{
"team_name": reviewTeam.Name,
"description": reviewTeam.Description,
"repo_access": "all",
"permission": "admin",
"unit_1": "1",
"unit_2": "1",
"unit_3": "1",
"unit_4": "1",
"unit_5": "1",
"unit_6": "1",
"unit_7": "1",
"unit_8": "1",
"unit_9": "1",
"unit_10": "1",
})
ownerSession.MakeRequest(t, req, http.StatusSeeOther)
assert.Equal(t, []string{"Owners", "review_team", "test_team"}, listTeams(t, memberSession, ""))
// Non-member is denied
nonMemberSession := loginUser(t, "user5")
req = NewRequestf(t, "GET", "/org/%s/teams", org.Name)
nonMemberSession.MakeRequest(t, req, http.StatusNotFound)
t.Run("Pagination", func(t *testing.T) {
defer test.MockVariableValue(&setting.UI.MembersPagingNum, 2)()
assert.Len(t, listTeams(t, ownerSession, "?page=1"), 2)
assert.Equal(t, []string{"test_team"}, listTeams(t, ownerSession, "?page=2"))
})
}
func testOrgSettings(t *testing.T) {
session := loginUser(t, "user2")