Skip to content

Commit e3081c6

Browse files
authored
Only show part of members on orgnization dashboard and add paging for orgnization members page (#9092)
* Only show part of members on orgnization dashboard and add paging for orgnization members page * fix test * fix typo
1 parent 77730db commit e3081c6

File tree

9 files changed

+121
-46
lines changed

9 files changed

+121
-46
lines changed

docs/content/doc/advanced/config-cheat-sheet.en-us.md

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
113113

114114
- `EXPLORE_PAGING_NUM`: **20**: Number of repositories that are shown in one explore page.
115115
- `ISSUE_PAGING_NUM`: **10**: Number of issues that are shown in one page (for all pages that list issues).
116+
- `MEMBERS_PAGING_NUM`: **20**: Number of members that are shown in organization members.
116117
- `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed.
117118
- `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph.
118119
- `DEFAULT_THEME`: **gitea**: \[gitea, arc-green\]: Set the default theme for the Gitea install.

docs/content/doc/advanced/config-cheat-sheet.zh-cn.md

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ menu:
3737

3838
- `EXPLORE_PAGING_NUM`: 探索页面每页显示的仓库数量。
3939
- `ISSUE_PAGING_NUM`: 工单页面每页显示的工单数量。
40+
- `MEMBERS_PAGING_NUM`: **20**: 组织成员页面每页显示的成员数量。
4041
- `FEED_MAX_COMMIT_NUM`: 活动流页面显示的最大提交数量。
4142

4243
### UI - Admin (`ui.admin`)

models/org.go

+45-12
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,35 @@ func (org *User) GetTeams() error {
6868
}
6969

7070
// GetMembers returns all members of organization.
71-
func (org *User) GetMembers() error {
72-
ous, err := GetOrgUsersByOrgID(org.ID)
71+
func (org *User) GetMembers() (err error) {
72+
org.Members, org.MembersIsPublic, err = FindOrgMembers(FindOrgMembersOpts{
73+
OrgID: org.ID,
74+
})
75+
return
76+
}
77+
78+
// FindOrgMembersOpts represensts find org members condtions
79+
type FindOrgMembersOpts struct {
80+
OrgID int64
81+
PublicOnly bool
82+
Start int
83+
Limit int
84+
}
85+
86+
// CountOrgMembers counts the organization's members
87+
func CountOrgMembers(opts FindOrgMembersOpts) (int64, error) {
88+
sess := x.Where("org_id=?", opts.OrgID)
89+
if opts.PublicOnly {
90+
sess.And("is_public = ?", true)
91+
}
92+
return sess.Count(new(OrgUser))
93+
}
94+
95+
// FindOrgMembers loads organization members according conditions
96+
func FindOrgMembers(opts FindOrgMembersOpts) (UserList, map[int64]bool, error) {
97+
ous, err := GetOrgUsersByOrgID(opts.OrgID, opts.PublicOnly, opts.Start, opts.Limit)
7398
if err != nil {
74-
return err
99+
return nil, nil, err
75100
}
76101

77102
var ids = make([]int64, len(ous))
@@ -80,9 +105,12 @@ func (org *User) GetMembers() error {
80105
ids[i] = ou.UID
81106
idsIsPublic[ou.UID] = ou.IsPublic
82107
}
83-
org.MembersIsPublic = idsIsPublic
84-
org.Members, err = GetUsersByIDs(ids)
85-
return err
108+
109+
users, err := GetUsersByIDs(ids)
110+
if err != nil {
111+
return nil, nil, err
112+
}
113+
return users, idsIsPublic, nil
86114
}
87115

88116
// AddMember adds new member to organization.
@@ -467,15 +495,20 @@ func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
467495
}
468496

469497
// GetOrgUsersByOrgID returns all organization-user relations by organization ID.
470-
func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) {
471-
return getOrgUsersByOrgID(x, orgID)
498+
func GetOrgUsersByOrgID(orgID int64, publicOnly bool, start, limit int) ([]*OrgUser, error) {
499+
return getOrgUsersByOrgID(x, orgID, publicOnly, start, limit)
472500
}
473501

474-
func getOrgUsersByOrgID(e Engine, orgID int64) ([]*OrgUser, error) {
502+
func getOrgUsersByOrgID(e Engine, orgID int64, publicOnly bool, start, limit int) ([]*OrgUser, error) {
475503
ous := make([]*OrgUser, 0, 10)
476-
err := e.
477-
Where("org_id=?", orgID).
478-
Find(&ous)
504+
sess := e.Where("org_id=?", orgID)
505+
if publicOnly {
506+
sess.And("is_public = ?", true)
507+
}
508+
if limit > 0 {
509+
sess.Limit(limit, start)
510+
}
511+
err := sess.Find(&ous)
479512
return ous, err
480513
}
481514

models/org_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ func TestGetOrgUsersByUserID(t *testing.T) {
395395
func TestGetOrgUsersByOrgID(t *testing.T) {
396396
assert.NoError(t, PrepareTestDatabase())
397397

398-
orgUsers, err := GetOrgUsersByOrgID(3)
398+
orgUsers, err := GetOrgUsersByOrgID(3, false, 0, 0)
399399
assert.NoError(t, err)
400400
if assert.Len(t, orgUsers, 3) {
401401
assert.Equal(t, OrgUser{
@@ -410,7 +410,7 @@ func TestGetOrgUsersByOrgID(t *testing.T) {
410410
IsPublic: false}, *orgUsers[1])
411411
}
412412

413-
orgUsers, err = GetOrgUsersByOrgID(NonexistentID)
413+
orgUsers, err = GetOrgUsersByOrgID(NonexistentID, false, 0, 0)
414414
assert.NoError(t, err)
415415
assert.Len(t, orgUsers, 0)
416416
}

modules/setting/setting.go

+2
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ var (
159159
ExplorePagingNum int
160160
IssuePagingNum int
161161
RepoSearchPagingNum int
162+
MembersPagingNum int
162163
FeedMaxCommitNum int
163164
GraphMaxCommitNum int
164165
CodeCommentLines int
@@ -191,6 +192,7 @@ var (
191192
ExplorePagingNum: 20,
192193
IssuePagingNum: 10,
193194
RepoSearchPagingNum: 10,
195+
MembersPagingNum: 20,
194196
FeedMaxCommitNum: 5,
195197
GraphMaxCommitNum: 100,
196198
CodeCommentLines: 4,

routers/api/v1/org/member.go

+7-24
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,13 @@ import (
1818
// listMembers list an organization's members
1919
func listMembers(ctx *context.APIContext, publicOnly bool) {
2020
var members []*models.User
21-
if publicOnly {
22-
orgUsers, err := models.GetOrgUsersByOrgID(ctx.Org.Organization.ID)
23-
if err != nil {
24-
ctx.Error(500, "GetOrgUsersByOrgID", err)
25-
return
26-
}
27-
28-
memberIDs := make([]int64, 0, len(orgUsers))
29-
for _, orgUser := range orgUsers {
30-
if orgUser.IsPublic {
31-
memberIDs = append(memberIDs, orgUser.UID)
32-
}
33-
}
34-
35-
if members, err = models.GetUsersByIDs(memberIDs); err != nil {
36-
ctx.Error(500, "GetUsersByIDs", err)
37-
return
38-
}
39-
} else {
40-
if err := ctx.Org.Organization.GetMembers(); err != nil {
41-
ctx.Error(500, "GetMembers", err)
42-
return
43-
}
44-
members = ctx.Org.Organization.Members
21+
members, _, err := models.FindOrgMembers(models.FindOrgMembersOpts{
22+
OrgID: ctx.Org.Organization.ID,
23+
PublicOnly: publicOnly,
24+
})
25+
if err != nil {
26+
ctx.Error(500, "GetUsersByIDs", err)
27+
return
4528
}
4629

4730
apiMembers := make([]*api.User, len(members))

routers/org/members.go

+35-5
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,44 @@ func Members(ctx *context.Context) {
2525
ctx.Data["Title"] = org.FullName
2626
ctx.Data["PageIsOrgMembers"] = true
2727

28-
if err := org.GetMembers(); err != nil {
28+
page := ctx.QueryInt("page")
29+
if page <= 1 {
30+
page = 1
31+
}
32+
33+
var opts = models.FindOrgMembersOpts{
34+
OrgID: org.ID,
35+
PublicOnly: true,
36+
}
37+
38+
if ctx.User != nil {
39+
isMember, err := ctx.Org.Organization.IsOrgMember(ctx.User.ID)
40+
if err != nil {
41+
ctx.Error(500, "IsOrgMember")
42+
return
43+
}
44+
opts.PublicOnly = !isMember
45+
}
46+
47+
total, err := models.CountOrgMembers(opts)
48+
if err != nil {
49+
ctx.Error(500, "CountOrgMembers")
50+
return
51+
}
52+
53+
pager := context.NewPagination(int(total), setting.UI.MembersPagingNum, page, 5)
54+
opts.Start = (page - 1) * setting.UI.MembersPagingNum
55+
opts.Limit = setting.UI.MembersPagingNum
56+
members, membersIsPublic, err := models.FindOrgMembers(opts)
57+
if err != nil {
2958
ctx.ServerError("GetMembers", err)
3059
return
3160
}
32-
ctx.Data["Members"] = org.Members
33-
ctx.Data["MembersIsPublicMember"] = org.MembersIsPublic
34-
ctx.Data["MembersIsUserOrgOwner"] = org.Members.IsUserOrgOwner(org.ID)
35-
ctx.Data["MembersTwoFaStatus"] = org.Members.GetTwoFaStatus()
61+
ctx.Data["Page"] = pager
62+
ctx.Data["Members"] = members
63+
ctx.Data["MembersIsPublicMember"] = membersIsPublic
64+
ctx.Data["MembersIsUserOrgOwner"] = members.IsUserOrgOwner(org.ID)
65+
ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus()
3666

3767
ctx.HTML(200, tplMembers)
3868
}

routers/user/home.go

+26-3
Original file line numberDiff line numberDiff line change
@@ -537,14 +537,37 @@ func showOrgProfile(ctx *context.Context) {
537537
return
538538
}
539539

540-
if err := org.GetMembers(); err != nil {
541-
ctx.ServerError("GetMembers", err)
540+
var opts = models.FindOrgMembersOpts{
541+
OrgID: org.ID,
542+
PublicOnly: true,
543+
Limit: 25,
544+
}
545+
546+
if ctx.User != nil {
547+
isMember, err := org.IsOrgMember(ctx.User.ID)
548+
if err != nil {
549+
ctx.Error(500, "IsOrgMember")
550+
return
551+
}
552+
opts.PublicOnly = !isMember
553+
}
554+
555+
members, _, err := models.FindOrgMembers(opts)
556+
if err != nil {
557+
ctx.ServerError("FindOrgMembers", err)
558+
return
559+
}
560+
561+
membersCount, err := models.CountOrgMembers(opts)
562+
if err != nil {
563+
ctx.ServerError("CountOrgMembers", err)
542564
return
543565
}
544566

545567
ctx.Data["Repos"] = repos
546568
ctx.Data["Total"] = count
547-
ctx.Data["Members"] = org.Members
569+
ctx.Data["MembersTotal"] = membersCount
570+
ctx.Data["Members"] = members
548571
ctx.Data["Teams"] = org.Teams
549572

550573
pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)

templates/org/member/members.tmpl

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
</div>
5858
{{end}}
5959
</div>
60+
61+
{{template "base/paginate" .}}
6062
</div>
6163
</div>
6264
{{template "base/footer" .}}

0 commit comments

Comments
 (0)