Skip to content

Commit fa3abc2

Browse files
Bwkolunny
authored andcommitted
Added sorting to organizations, repos & users page (#222)
1 parent c1e92ee commit fa3abc2

File tree

9 files changed

+177
-49
lines changed

9 files changed

+177
-49
lines changed

models/org.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,19 @@ func CountOrganizations() int64 {
195195
}
196196

197197
// Organizations returns number of organizations in given page.
198-
func Organizations(page, pageSize int) ([]*User, error) {
199-
orgs := make([]*User, 0, pageSize)
200-
return orgs, x.
201-
Limit(pageSize, (page-1)*pageSize).
202-
Where("type=1").
203-
Asc("name").
198+
func Organizations(opts *SearchUserOptions) ([]*User, error) {
199+
orgs := make([]*User, 0, opts.PageSize)
200+
201+
if len(opts.OrderBy) == 0 {
202+
opts.OrderBy = "name ASC"
203+
}
204+
205+
sess := x.
206+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
207+
Where("type=1")
208+
209+
return orgs, sess.
210+
OrderBy(opts.OrderBy).
204211
Find(&orgs)
205212
}
206213

models/repo.go

+58-15
Original file line numberDiff line numberDiff line change
@@ -1105,14 +1105,18 @@ func CountUserRepositories(userID int64, private bool) int64 {
11051105
}
11061106

11071107
// Repositories returns all repositories
1108-
func Repositories(page, pageSize int) (_ []*Repository, err error) {
1109-
repos := make([]*Repository, 0, pageSize)
1110-
return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos)
1108+
func Repositories(opts *SearchRepoOptions) (_ []*Repository, err error) {
1109+
if len(opts.OrderBy) == 0 {
1110+
opts.OrderBy = "id ASC"
1111+
}
1112+
1113+
repos := make([]*Repository, 0, opts.PageSize)
1114+
return repos, x.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(opts.OrderBy).Find(&repos)
11111115
}
11121116

11131117
// RepositoriesWithUsers returns number of repos in given page.
1114-
func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) {
1115-
repos, err := Repositories(page, pageSize)
1118+
func RepositoriesWithUsers(opts *SearchRepoOptions) (_ []*Repository, err error) {
1119+
repos, err := Repositories(opts)
11161120
if err != nil {
11171121
return nil, fmt.Errorf("Repositories: %v", err)
11181122
}
@@ -1565,12 +1569,31 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) {
15651569
}
15661570

15671571
// GetRecentUpdatedRepositories returns the list of repositories that are recently updated.
1568-
func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err error) {
1569-
return repos, x.
1570-
Limit(pageSize, (page-1)*pageSize).
1571-
Where("is_private=?", false).
1572-
Limit(pageSize).
1573-
Desc("updated_unix").
1572+
func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos []*Repository, err error) {
1573+
if len(opts.OrderBy) == 0 {
1574+
opts.OrderBy = "updated_unix DESC"
1575+
}
1576+
1577+
sess := x.Where("is_private=?", false).
1578+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
1579+
Limit(opts.PageSize)
1580+
1581+
if opts.Searcher != nil {
1582+
sess.Or("owner_id = ?", opts.Searcher.ID)
1583+
1584+
err := opts.Searcher.GetOrganizations(true)
1585+
1586+
if err != nil {
1587+
return nil, fmt.Errorf("Organization: %v", err)
1588+
}
1589+
1590+
for _, org := range opts.Searcher.Orgs {
1591+
sess.Or("owner_id = ?", org.ID)
1592+
}
1593+
}
1594+
1595+
return repos, sess.
1596+
OrderBy(opts.OrderBy).
15741597
Find(&repos)
15751598
}
15761599

@@ -1587,6 +1610,7 @@ func GetRepositoryCount(u *User) (int64, error) {
15871610
type SearchRepoOptions struct {
15881611
Keyword string
15891612
OwnerID int64
1613+
Searcher *User //ID of the person who's seeking
15901614
OrderBy string
15911615
Private bool // Include private repositories in results
15921616
Page int
@@ -1616,17 +1640,36 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int
16161640
sess.And("is_private=?", false)
16171641
}
16181642

1643+
if opts.Searcher != nil {
1644+
1645+
sess.Or("owner_id = ?", opts.Searcher.ID)
1646+
1647+
err := opts.Searcher.GetOrganizations(true)
1648+
1649+
if err != nil {
1650+
return nil, 0, fmt.Errorf("Organization: %v", err)
1651+
}
1652+
1653+
for _, org := range opts.Searcher.Orgs {
1654+
sess.Or("owner_id = ?", org.ID)
1655+
}
1656+
}
1657+
1658+
if len(opts.OrderBy) == 0 {
1659+
opts.OrderBy = "name ASC"
1660+
}
1661+
16191662
var countSess xorm.Session
16201663
countSess = *sess
16211664
count, err := countSess.Count(new(Repository))
16221665
if err != nil {
16231666
return nil, 0, fmt.Errorf("Count: %v", err)
16241667
}
16251668

1626-
if len(opts.OrderBy) > 0 {
1627-
sess.OrderBy(opts.OrderBy)
1628-
}
1629-
return repos, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos)
1669+
return repos, count, sess.
1670+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
1671+
OrderBy(opts.OrderBy).
1672+
Find(&repos)
16301673
}
16311674

16321675
// DeleteRepositoryArchives deletes all repositories' archives.

models/user.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -641,12 +641,18 @@ func CountUsers() int64 {
641641
}
642642

643643
// Users returns number of users in given page.
644-
func Users(page, pageSize int) ([]*User, error) {
645-
users := make([]*User, 0, pageSize)
646-
return users, x.
647-
Limit(pageSize, (page-1)*pageSize).
648-
Where("type=0").
649-
Asc("name").
644+
func Users(opts *SearchUserOptions) ([]*User, error) {
645+
if len(opts.OrderBy) == 0 {
646+
opts.OrderBy = "name ASC"
647+
}
648+
649+
users := make([]*User, 0, opts.PageSize)
650+
sess := x.
651+
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
652+
Where("type=0")
653+
654+
return users, sess.
655+
OrderBy(opts.OrderBy).
650656
Find(&users)
651657
}
652658

routers/admin/orgs.go

-1
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

-1
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

-1
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

+58-17
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ func Home(ctx *context.Context) {
5555
// RepoSearchOptions when calling search repositories
5656
type RepoSearchOptions struct {
5757
Counter func(bool) int64
58-
Ranger func(int, int) ([]*models.Repository, error)
58+
Ranger func(*models.SearchRepoOptions) ([]*models.Repository, error)
59+
Searcher *models.User
5960
Private bool
6061
PageSize int
61-
OrderBy string
6262
TplName base.TplName
6363
}
6464

@@ -78,14 +78,36 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
7878
}
7979

8080
var (
81-
repos []*models.Repository
82-
count int64
83-
err error
81+
repos []*models.Repository
82+
count int64
83+
err error
84+
orderBy string
8485
)
86+
ctx.Data["SortType"] = ctx.Query("sort")
87+
88+
switch ctx.Query("sort") {
89+
case "oldest":
90+
orderBy = "created_unix ASC"
91+
case "recentupdate":
92+
orderBy = "updated_unix DESC"
93+
case "leastupdate":
94+
orderBy = "updated_unix ASC"
95+
case "reversealphabetically":
96+
orderBy = "name DESC"
97+
case "alphabetically":
98+
orderBy = "name ASC"
99+
default:
100+
orderBy = "created_unix DESC"
101+
}
85102

86103
keyword := ctx.Query("q")
87104
if len(keyword) == 0 {
88-
repos, err = opts.Ranger(page, opts.PageSize)
105+
repos, err = opts.Ranger(&models.SearchRepoOptions{
106+
Page: page,
107+
PageSize: opts.PageSize,
108+
Searcher: ctx.User,
109+
OrderBy: orderBy,
110+
})
89111
if err != nil {
90112
ctx.Handle(500, "opts.Ranger", err)
91113
return
@@ -95,10 +117,11 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
95117
if isKeywordValid(keyword) {
96118
repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
97119
Keyword: keyword,
98-
OrderBy: opts.OrderBy,
120+
OrderBy: orderBy,
99121
Private: opts.Private,
100122
Page: page,
101123
PageSize: opts.PageSize,
124+
Searcher: ctx.User,
102125
})
103126
if err != nil {
104127
ctx.Handle(500, "SearchRepositoryByName", err)
@@ -131,7 +154,7 @@ func ExploreRepos(ctx *context.Context) {
131154
Counter: models.CountRepositories,
132155
Ranger: models.GetRecentUpdatedRepositories,
133156
PageSize: setting.UI.ExplorePagingNum,
134-
OrderBy: "updated_unix DESC",
157+
Searcher: ctx.User,
135158
TplName: tplExploreRepos,
136159
})
137160
}
@@ -140,9 +163,8 @@ func ExploreRepos(ctx *context.Context) {
140163
type UserSearchOptions struct {
141164
Type models.UserType
142165
Counter func() int64
143-
Ranger func(int, int) ([]*models.User, error)
166+
Ranger func(*models.SearchUserOptions) ([]*models.User, error)
144167
PageSize int
145-
OrderBy string
146168
TplName base.TplName
147169
}
148170

@@ -154,14 +176,35 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) {
154176
}
155177

156178
var (
157-
users []*models.User
158-
count int64
159-
err error
179+
users []*models.User
180+
count int64
181+
err error
182+
orderBy string
160183
)
161184

185+
ctx.Data["SortType"] = ctx.Query("sort")
186+
//OrderBy: "id ASC",
187+
switch ctx.Query("sort") {
188+
case "oldest":
189+
orderBy = "id ASC"
190+
case "recentupdate":
191+
orderBy = "updated_unix DESC"
192+
case "leastupdate":
193+
orderBy = "updated_unix ASC"
194+
case "reversealphabetically":
195+
orderBy = "name DESC"
196+
case "alphabetically":
197+
orderBy = "name ASC"
198+
default:
199+
orderBy = "id DESC"
200+
}
201+
162202
keyword := ctx.Query("q")
163203
if len(keyword) == 0 {
164-
users, err = opts.Ranger(page, opts.PageSize)
204+
users, err = opts.Ranger(&models.SearchUserOptions{OrderBy: orderBy,
205+
Page: page,
206+
PageSize: opts.PageSize,
207+
})
165208
if err != nil {
166209
ctx.Handle(500, "opts.Ranger", err)
167210
return
@@ -172,7 +215,7 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) {
172215
users, count, err = models.SearchUserByName(&models.SearchUserOptions{
173216
Keyword: keyword,
174217
Type: opts.Type,
175-
OrderBy: opts.OrderBy,
218+
OrderBy: orderBy,
176219
Page: page,
177220
PageSize: opts.PageSize,
178221
})
@@ -201,7 +244,6 @@ func ExploreUsers(ctx *context.Context) {
201244
Counter: models.CountUsers,
202245
Ranger: models.Users,
203246
PageSize: setting.UI.ExplorePagingNum,
204-
OrderBy: "name ASC",
205247
TplName: tplExploreUsers,
206248
})
207249
}
@@ -217,7 +259,6 @@ func ExploreOrganizations(ctx *context.Context) {
217259
Counter: models.CountOrganizations,
218260
Ranger: models.Organizations,
219261
PageSize: setting.UI.ExplorePagingNum,
220-
OrderBy: "name ASC",
221262
TplName: tplExploreOrganizations,
222263
})
223264
}

templates/admin/base/search.tmpl

+18-1
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

+18-1
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)