Skip to content

Commit dc6f64b

Browse files
committed
Added sorting to organizations, repos & users page
1 parent b2cce12 commit dc6f64b

File tree

9 files changed

+179
-49
lines changed

9 files changed

+179
-49
lines changed

models/org.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,19 @@ func CountOrganizations() int64 {
189189
}
190190

191191
// Organizations returns number of organizations in given page.
192-
func Organizations(page, pageSize int) ([]*User, error) {
193-
orgs := make([]*User, 0, pageSize)
194-
return orgs, x.
195-
Limit(pageSize, (page-1)*pageSize).
196-
Where("type=1").
197-
Asc("name").
192+
func Organizations(opts *SearchUserOptions) ([]*User, error) {
193+
orgs := make([]*User, 0, opts.PageSize)
194+
195+
if len(opts.OrderBy) == 0 {
196+
opts.OrderBy = "name ASC"
197+
}
198+
199+
sess := x.
200+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
201+
Where("type=1")
202+
203+
return orgs, sess.
204+
OrderBy(opts.OrderBy).
198205
Find(&orgs)
199206
}
200207

models/repo.go

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,14 +1030,19 @@ func CountUserRepositories(userID int64, private bool) int64 {
10301030
return countRepositories(userID, private)
10311031
}
10321032

1033-
func Repositories(page, pageSize int) (_ []*Repository, err error) {
1034-
repos := make([]*Repository, 0, pageSize)
1035-
return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos)
1033+
// Repositories returns all repositories
1034+
func Repositories(opts *SearchRepoOptions) (_ []*Repository, err error) {
1035+
if len(opts.OrderBy) == 0 {
1036+
opts.OrderBy = "id ASC"
1037+
}
1038+
1039+
repos := make([]*Repository, 0, opts.PageSize)
1040+
return repos, x.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(opts.OrderBy).Find(&repos)
10361041
}
10371042

10381043
// RepositoriesWithUsers returns number of repos in given page.
1039-
func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) {
1040-
repos, err := Repositories(page, pageSize)
1044+
func RepositoriesWithUsers(opts *SearchRepoOptions) (_ []*Repository, err error) {
1045+
repos, err := Repositories(opts)
10411046
if err != nil {
10421047
return nil, fmt.Errorf("Repositories: %v", err)
10431048
}
@@ -1484,12 +1489,31 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) {
14841489
}
14851490

14861491
// GetRecentUpdatedRepositories returns the list of repositories that are recently updated.
1487-
func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err error) {
1488-
return repos, x.
1489-
Limit(pageSize, (page-1)*pageSize).
1490-
Where("is_private=?", false).
1491-
Limit(pageSize).
1492-
Desc("updated_unix").
1492+
func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos []*Repository, err error) {
1493+
if len(opts.OrderBy) == 0 {
1494+
opts.OrderBy = "updated_unix DESC"
1495+
}
1496+
1497+
sess := x.Where("is_private=?", false).
1498+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
1499+
Limit(opts.PageSize)
1500+
1501+
if opts.Searcher != nil {
1502+
sess.Or("owner_id = ?", opts.Searcher.ID)
1503+
1504+
err := opts.Searcher.GetOrganizations(true)
1505+
1506+
if err != nil {
1507+
return nil, fmt.Errorf("Organization: %v", err)
1508+
}
1509+
1510+
for _, org := range opts.Searcher.Orgs {
1511+
sess.Or("owner_id = ?", org.ID)
1512+
}
1513+
}
1514+
1515+
return repos, sess.
1516+
OrderBy(opts.OrderBy).
14931517
Find(&repos)
14941518
}
14951519

@@ -1502,9 +1526,11 @@ func GetRepositoryCount(u *User) (int64, error) {
15021526
return getRepositoryCount(x, u)
15031527
}
15041528

1529+
// SearchRepoOptions holds the search options
15051530
type SearchRepoOptions struct {
15061531
Keyword string
15071532
OwnerID int64
1533+
Searcher *User //ID of the person who's seeking
15081534
OrderBy string
15091535
Private bool // Include private repositories in results
15101536
Page int
@@ -1534,17 +1560,36 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int
15341560
sess.And("is_private=?", false)
15351561
}
15361562

1563+
if opts.Searcher != nil {
1564+
1565+
sess.Or("owner_id = ?", opts.Searcher.ID)
1566+
1567+
err := opts.Searcher.GetOrganizations(true)
1568+
1569+
if err != nil {
1570+
return nil, 0, fmt.Errorf("Organization: %v", err)
1571+
}
1572+
1573+
for _, org := range opts.Searcher.Orgs {
1574+
sess.Or("owner_id = ?", org.ID)
1575+
}
1576+
}
1577+
1578+
if len(opts.OrderBy) == 0 {
1579+
opts.OrderBy = "name ASC"
1580+
}
1581+
15371582
var countSess xorm.Session
15381583
countSess = *sess
15391584
count, err := countSess.Count(new(Repository))
15401585
if err != nil {
15411586
return nil, 0, fmt.Errorf("Count: %v", err)
15421587
}
15431588

1544-
if len(opts.OrderBy) > 0 {
1545-
sess.OrderBy(opts.OrderBy)
1546-
}
1547-
return repos, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos)
1589+
return repos, count, sess.
1590+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
1591+
OrderBy(opts.OrderBy).
1592+
Find(&repos)
15481593
}
15491594

15501595
// DeleteRepositoryArchives deletes all repositories' archives.

models/user.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -603,12 +603,18 @@ func CountUsers() int64 {
603603
}
604604

605605
// Users returns number of users in given page.
606-
func Users(page, pageSize int) ([]*User, error) {
607-
users := make([]*User, 0, pageSize)
608-
return users, x.
609-
Limit(pageSize, (page-1)*pageSize).
610-
Where("type=0").
611-
Asc("name").
606+
func Users(opts *SearchUserOptions) ([]*User, error) {
607+
if len(opts.OrderBy) == 0 {
608+
opts.OrderBy = "name ASC"
609+
}
610+
611+
users := make([]*User, 0, opts.PageSize)
612+
sess := x.
613+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
614+
Where("type=0")
615+
616+
return users, sess.
617+
OrderBy(opts.OrderBy).
612618
Find(&users)
613619
}
614620

routers/admin/orgs.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ func Organizations(ctx *context.Context) {
2727
Counter: models.CountOrganizations,
2828
Ranger: models.Organizations,
2929
PageSize: setting.UI.Admin.OrgPagingNum,
30-
OrderBy: "id ASC",
3130
TplName: tplOrgs,
3231
})
3332
}

routers/admin/repos.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ func Repos(ctx *context.Context) {
2828
Ranger: models.Repositories,
2929
Private: true,
3030
PageSize: setting.UI.Admin.RepoPagingNum,
31-
OrderBy: "owner_id ASC, name ASC, id ASC",
3231
TplName: tplRepos,
3332
})
3433
}

routers/admin/users.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ func Users(ctx *context.Context) {
3535
Counter: models.CountUsers,
3636
Ranger: models.Users,
3737
PageSize: setting.UI.Admin.UserPagingNum,
38-
OrderBy: "id ASC",
3938
TplName: tplUsers,
4039
})
4140
}

routers/home.go

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ func Home(ctx *context.Context) {
5353
// RepoSearchOptions when calling search repositories
5454
type RepoSearchOptions struct {
5555
Counter func(bool) int64
56-
Ranger func(int, int) ([]*models.Repository, error)
56+
Ranger func(*models.SearchRepoOptions) ([]*models.Repository, error)
57+
Searcher *models.User
5758
Private bool
5859
PageSize int
59-
OrderBy string
6060
TplName base.TplName
6161
}
6262

@@ -68,14 +68,36 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
6868
}
6969

7070
var (
71-
repos []*models.Repository
72-
count int64
73-
err error
71+
repos []*models.Repository
72+
count int64
73+
err error
74+
orderBy string
7475
)
76+
ctx.Data["SortType"] = ctx.Query("sort")
77+
78+
switch ctx.Query("sort") {
79+
case "oldest":
80+
orderBy = "created_unix ASC"
81+
case "recentupdate":
82+
orderBy = "updated_unix DESC"
83+
case "leastupdate":
84+
orderBy = "updated_unix ASC"
85+
case "reversealphabetically":
86+
orderBy = "name DESC"
87+
case "alphabetically":
88+
orderBy = "name ASC"
89+
default:
90+
orderBy = "created_unix DESC"
91+
}
7592

7693
keyword := ctx.Query("q")
7794
if len(keyword) == 0 {
78-
repos, err = opts.Ranger(page, opts.PageSize)
95+
repos, err = opts.Ranger(&models.SearchRepoOptions{
96+
Page: page,
97+
PageSize: opts.PageSize,
98+
Searcher: ctx.User,
99+
OrderBy: orderBy,
100+
})
79101
if err != nil {
80102
ctx.Handle(500, "opts.Ranger", err)
81103
return
@@ -84,10 +106,11 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
84106
} else {
85107
repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
86108
Keyword: keyword,
87-
OrderBy: opts.OrderBy,
109+
OrderBy: orderBy,
88110
Private: opts.Private,
89111
Page: page,
90112
PageSize: opts.PageSize,
113+
Searcher: ctx.User,
91114
})
92115
if err != nil {
93116
ctx.Handle(500, "SearchRepositoryByName", err)
@@ -119,7 +142,7 @@ func ExploreRepos(ctx *context.Context) {
119142
Counter: models.CountRepositories,
120143
Ranger: models.GetRecentUpdatedRepositories,
121144
PageSize: setting.UI.ExplorePagingNum,
122-
OrderBy: "updated_unix DESC",
145+
Searcher: ctx.User,
123146
TplName: tplExploreRepos,
124147
})
125148
}
@@ -128,9 +151,8 @@ func ExploreRepos(ctx *context.Context) {
128151
type UserSearchOptions struct {
129152
Type models.UserType
130153
Counter func() int64
131-
Ranger func(int, int) ([]*models.User, error)
154+
Ranger func(*models.SearchUserOptions) ([]*models.User, error)
132155
PageSize int
133-
OrderBy string
134156
TplName base.TplName
135157
}
136158

@@ -142,14 +164,35 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) {
142164
}
143165

144166
var (
145-
users []*models.User
146-
count int64
147-
err error
167+
users []*models.User
168+
count int64
169+
err error
170+
orderBy string
148171
)
149172

173+
ctx.Data["SortType"] = ctx.Query("sort")
174+
//OrderBy: "id ASC",
175+
switch ctx.Query("sort") {
176+
case "oldest":
177+
orderBy = "id ASC"
178+
case "recentupdate":
179+
orderBy = "updated_unix DESC"
180+
case "leastupdate":
181+
orderBy = "updated_unix ASC"
182+
case "reversealphabetically":
183+
orderBy = "name DESC"
184+
case "alphabetically":
185+
orderBy = "name ASC"
186+
default:
187+
orderBy = "id DESC"
188+
}
189+
150190
keyword := ctx.Query("q")
151191
if len(keyword) == 0 {
152-
users, err = opts.Ranger(page, opts.PageSize)
192+
users, err = opts.Ranger(&models.SearchUserOptions{OrderBy: orderBy,
193+
Page: page,
194+
PageSize: opts.PageSize,
195+
})
153196
if err != nil {
154197
ctx.Handle(500, "opts.Ranger", err)
155198
return
@@ -159,7 +202,7 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) {
159202
users, count, err = models.SearchUserByName(&models.SearchUserOptions{
160203
Keyword: keyword,
161204
Type: opts.Type,
162-
OrderBy: opts.OrderBy,
205+
OrderBy: orderBy,
163206
Page: page,
164207
PageSize: opts.PageSize,
165208
})
@@ -187,7 +230,6 @@ func ExploreUsers(ctx *context.Context) {
187230
Counter: models.CountUsers,
188231
Ranger: models.Users,
189232
PageSize: setting.UI.ExplorePagingNum,
190-
OrderBy: "name ASC",
191233
TplName: tplExploreUsers,
192234
})
193235
}
@@ -203,7 +245,6 @@ func ExploreOrganizations(ctx *context.Context) {
203245
Counter: models.CountOrganizations,
204246
Ranger: models.Organizations,
205247
PageSize: setting.UI.ExplorePagingNum,
206-
OrderBy: "name ASC",
207248
TplName: tplExploreOrganizations,
208249
})
209250
}

templates/admin/base/search.tmpl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
1-
<form class="ui form">
1+
<div class="ui right floated secondary filter menu">
2+
<!-- Sort -->
3+
<div class="ui dropdown type jump item">
4+
<span class="text">
5+
{{.i18n.Tr "repo.issues.filter_sort"}}
6+
<i class="dropdown icon"></i>
7+
</span>
8+
<div class="menu">
9+
<a class="{{if or (eq .SortType "oldest") (not .SortType)}}active{{end}} item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.latest"}}</a>
10+
<a class="{{if eq .SortType "newest"}}active{{end}} item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.oldest"}}</a>
11+
<a class="{{if eq .SortType "alphabetically"}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
12+
<a class="{{if eq .SortType "reversealphabetically"}}active{{end}} item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
13+
<a class="{{if eq .SortType "recentupdate"}}active{{end}} item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.recentupdate"}}</a>
14+
<a class="{{if eq .SortType "leastupdate"}}active{{end}} item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.leastupdate"}}</a>
15+
</div>
16+
</div>
17+
</div>
18+
<form class="ui form" style="max-width: 90%">
219
<div class="ui fluid action input">
320
<input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus>
421
<button class="ui blue button">{{.i18n.Tr "explore.search"}}</button>

templates/explore/search.tmpl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
1-
<form class="ui form">
1+
<div class="ui right floated secondary filter menu">
2+
<!-- Sort -->
3+
<div class="ui dropdown type jump item">
4+
<span class="text">
5+
{{.i18n.Tr "repo.issues.filter_sort"}}
6+
<i class="dropdown icon"></i>
7+
</span>
8+
<div class="menu">
9+
<a class="{{if or (eq .SortType "newest") (not .SortType)}}active{{end}} item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.latest"}}</a>
10+
<a class="{{if eq .SortType "oldest"}}active{{end}} item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.oldest"}}</a>
11+
<a class="{{if eq .SortType "alphabetically"}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
12+
<a class="{{if eq .SortType "reversealphabetically"}}active{{end}} item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
13+
<a class="{{if eq .SortType "recentupdate"}}active{{end}} item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.recentupdate"}}</a>
14+
<a class="{{if eq .SortType "leastupdate"}}active{{end}} item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.leastupdate"}}</a>
15+
</div>
16+
</div>
17+
</div>
18+
<form class="ui form" style="max-width: 90%">
219
<div class="ui fluid action input">
320
<input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus>
421
<button class="ui blue button">{{.i18n.Tr "explore.search"}}</button>

0 commit comments

Comments
 (0)