From dc6f64b545be1010f3928adb3a812337eb46fd25 Mon Sep 17 00:00:00 2001 From: Bwko Date: Tue, 22 Nov 2016 19:17:43 +0100 Subject: [PATCH] Added sorting to organizations, repos & users page --- models/org.go | 19 +++++--- models/repo.go | 75 +++++++++++++++++++++++++------- models/user.go | 18 +++++--- routers/admin/orgs.go | 1 - routers/admin/repos.go | 1 - routers/admin/users.go | 1 - routers/home.go | 75 ++++++++++++++++++++++++-------- templates/admin/base/search.tmpl | 19 +++++++- templates/explore/search.tmpl | 19 +++++++- 9 files changed, 179 insertions(+), 49 deletions(-) diff --git a/models/org.go b/models/org.go index 7b251b2020d5..3812726e99fb 100644 --- a/models/org.go +++ b/models/org.go @@ -189,12 +189,19 @@ func CountOrganizations() int64 { } // Organizations returns number of organizations in given page. -func Organizations(page, pageSize int) ([]*User, error) { - orgs := make([]*User, 0, pageSize) - return orgs, x. - Limit(pageSize, (page-1)*pageSize). - Where("type=1"). - Asc("name"). +func Organizations(opts *SearchUserOptions) ([]*User, error) { + orgs := make([]*User, 0, opts.PageSize) + + if len(opts.OrderBy) == 0 { + opts.OrderBy = "name ASC" + } + + sess := x. + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + Where("type=1") + + return orgs, sess. + OrderBy(opts.OrderBy). Find(&orgs) } diff --git a/models/repo.go b/models/repo.go index 20671cb01983..ab46a64b61f2 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1030,14 +1030,19 @@ func CountUserRepositories(userID int64, private bool) int64 { return countRepositories(userID, private) } -func Repositories(page, pageSize int) (_ []*Repository, err error) { - repos := make([]*Repository, 0, pageSize) - return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos) +// Repositories returns all repositories +func Repositories(opts *SearchRepoOptions) (_ []*Repository, err error) { + if len(opts.OrderBy) == 0 { + opts.OrderBy = "id ASC" + } + + repos := make([]*Repository, 0, opts.PageSize) + return repos, x.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(opts.OrderBy).Find(&repos) } // RepositoriesWithUsers returns number of repos in given page. -func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) { - repos, err := Repositories(page, pageSize) +func RepositoriesWithUsers(opts *SearchRepoOptions) (_ []*Repository, err error) { + repos, err := Repositories(opts) if err != nil { return nil, fmt.Errorf("Repositories: %v", err) } @@ -1484,12 +1489,31 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { } // GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err error) { - return repos, x. - Limit(pageSize, (page-1)*pageSize). - Where("is_private=?", false). - Limit(pageSize). - Desc("updated_unix"). +func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos []*Repository, err error) { + if len(opts.OrderBy) == 0 { + opts.OrderBy = "updated_unix DESC" + } + + sess := x.Where("is_private=?", false). + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + Limit(opts.PageSize) + + if opts.Searcher != nil { + sess.Or("owner_id = ?", opts.Searcher.ID) + + err := opts.Searcher.GetOrganizations(true) + + if err != nil { + return nil, fmt.Errorf("Organization: %v", err) + } + + for _, org := range opts.Searcher.Orgs { + sess.Or("owner_id = ?", org.ID) + } + } + + return repos, sess. + OrderBy(opts.OrderBy). Find(&repos) } @@ -1502,9 +1526,11 @@ func GetRepositoryCount(u *User) (int64, error) { return getRepositoryCount(x, u) } +// SearchRepoOptions holds the search options type SearchRepoOptions struct { Keyword string OwnerID int64 + Searcher *User //ID of the person who's seeking OrderBy string Private bool // Include private repositories in results Page int @@ -1534,6 +1560,25 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int sess.And("is_private=?", false) } + if opts.Searcher != nil { + + sess.Or("owner_id = ?", opts.Searcher.ID) + + err := opts.Searcher.GetOrganizations(true) + + if err != nil { + return nil, 0, fmt.Errorf("Organization: %v", err) + } + + for _, org := range opts.Searcher.Orgs { + sess.Or("owner_id = ?", org.ID) + } + } + + if len(opts.OrderBy) == 0 { + opts.OrderBy = "name ASC" + } + var countSess xorm.Session countSess = *sess count, err := countSess.Count(new(Repository)) @@ -1541,10 +1586,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int return nil, 0, fmt.Errorf("Count: %v", err) } - if len(opts.OrderBy) > 0 { - sess.OrderBy(opts.OrderBy) - } - return repos, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos) + return repos, count, sess. + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + OrderBy(opts.OrderBy). + Find(&repos) } // DeleteRepositoryArchives deletes all repositories' archives. diff --git a/models/user.go b/models/user.go index e8c5c9168091..946eec85eade 100644 --- a/models/user.go +++ b/models/user.go @@ -603,12 +603,18 @@ func CountUsers() int64 { } // Users returns number of users in given page. -func Users(page, pageSize int) ([]*User, error) { - users := make([]*User, 0, pageSize) - return users, x. - Limit(pageSize, (page-1)*pageSize). - Where("type=0"). - Asc("name"). +func Users(opts *SearchUserOptions) ([]*User, error) { + if len(opts.OrderBy) == 0 { + opts.OrderBy = "name ASC" + } + + users := make([]*User, 0, opts.PageSize) + sess := x. + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + Where("type=0") + + return users, sess. + OrderBy(opts.OrderBy). Find(&users) } diff --git a/routers/admin/orgs.go b/routers/admin/orgs.go index 88d88d1c05be..eeb9002bc2e1 100644 --- a/routers/admin/orgs.go +++ b/routers/admin/orgs.go @@ -27,7 +27,6 @@ func Organizations(ctx *context.Context) { Counter: models.CountOrganizations, Ranger: models.Organizations, PageSize: setting.UI.Admin.OrgPagingNum, - OrderBy: "id ASC", TplName: tplOrgs, }) } diff --git a/routers/admin/repos.go b/routers/admin/repos.go index 287c2944083c..caf1e0b4f6bf 100644 --- a/routers/admin/repos.go +++ b/routers/admin/repos.go @@ -28,7 +28,6 @@ func Repos(ctx *context.Context) { Ranger: models.Repositories, Private: true, PageSize: setting.UI.Admin.RepoPagingNum, - OrderBy: "owner_id ASC, name ASC, id ASC", TplName: tplRepos, }) } diff --git a/routers/admin/users.go b/routers/admin/users.go index dd4d2f578655..b623c737a6bf 100644 --- a/routers/admin/users.go +++ b/routers/admin/users.go @@ -35,7 +35,6 @@ func Users(ctx *context.Context) { Counter: models.CountUsers, Ranger: models.Users, PageSize: setting.UI.Admin.UserPagingNum, - OrderBy: "id ASC", TplName: tplUsers, }) } diff --git a/routers/home.go b/routers/home.go index ee425a830e5d..3de11353e463 100644 --- a/routers/home.go +++ b/routers/home.go @@ -53,10 +53,10 @@ func Home(ctx *context.Context) { // RepoSearchOptions when calling search repositories type RepoSearchOptions struct { Counter func(bool) int64 - Ranger func(int, int) ([]*models.Repository, error) + Ranger func(*models.SearchRepoOptions) ([]*models.Repository, error) + Searcher *models.User Private bool PageSize int - OrderBy string TplName base.TplName } @@ -68,14 +68,36 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { } var ( - repos []*models.Repository - count int64 - err error + repos []*models.Repository + count int64 + err error + orderBy string ) + ctx.Data["SortType"] = ctx.Query("sort") + + switch ctx.Query("sort") { + case "oldest": + orderBy = "created_unix ASC" + case "recentupdate": + orderBy = "updated_unix DESC" + case "leastupdate": + orderBy = "updated_unix ASC" + case "reversealphabetically": + orderBy = "name DESC" + case "alphabetically": + orderBy = "name ASC" + default: + orderBy = "created_unix DESC" + } keyword := ctx.Query("q") if len(keyword) == 0 { - repos, err = opts.Ranger(page, opts.PageSize) + repos, err = opts.Ranger(&models.SearchRepoOptions{ + Page: page, + PageSize: opts.PageSize, + Searcher: ctx.User, + OrderBy: orderBy, + }) if err != nil { ctx.Handle(500, "opts.Ranger", err) return @@ -84,10 +106,11 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { } else { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ Keyword: keyword, - OrderBy: opts.OrderBy, + OrderBy: orderBy, Private: opts.Private, Page: page, PageSize: opts.PageSize, + Searcher: ctx.User, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err) @@ -119,7 +142,7 @@ func ExploreRepos(ctx *context.Context) { Counter: models.CountRepositories, Ranger: models.GetRecentUpdatedRepositories, PageSize: setting.UI.ExplorePagingNum, - OrderBy: "updated_unix DESC", + Searcher: ctx.User, TplName: tplExploreRepos, }) } @@ -128,9 +151,8 @@ func ExploreRepos(ctx *context.Context) { type UserSearchOptions struct { Type models.UserType Counter func() int64 - Ranger func(int, int) ([]*models.User, error) + Ranger func(*models.SearchUserOptions) ([]*models.User, error) PageSize int - OrderBy string TplName base.TplName } @@ -142,14 +164,35 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) { } var ( - users []*models.User - count int64 - err error + users []*models.User + count int64 + err error + orderBy string ) + ctx.Data["SortType"] = ctx.Query("sort") + //OrderBy: "id ASC", + switch ctx.Query("sort") { + case "oldest": + orderBy = "id ASC" + case "recentupdate": + orderBy = "updated_unix DESC" + case "leastupdate": + orderBy = "updated_unix ASC" + case "reversealphabetically": + orderBy = "name DESC" + case "alphabetically": + orderBy = "name ASC" + default: + orderBy = "id DESC" + } + keyword := ctx.Query("q") if len(keyword) == 0 { - users, err = opts.Ranger(page, opts.PageSize) + users, err = opts.Ranger(&models.SearchUserOptions{OrderBy: orderBy, + Page: page, + PageSize: opts.PageSize, + }) if err != nil { ctx.Handle(500, "opts.Ranger", err) return @@ -159,7 +202,7 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) { users, count, err = models.SearchUserByName(&models.SearchUserOptions{ Keyword: keyword, Type: opts.Type, - OrderBy: opts.OrderBy, + OrderBy: orderBy, Page: page, PageSize: opts.PageSize, }) @@ -187,7 +230,6 @@ func ExploreUsers(ctx *context.Context) { Counter: models.CountUsers, Ranger: models.Users, PageSize: setting.UI.ExplorePagingNum, - OrderBy: "name ASC", TplName: tplExploreUsers, }) } @@ -203,7 +245,6 @@ func ExploreOrganizations(ctx *context.Context) { Counter: models.CountOrganizations, Ranger: models.Organizations, PageSize: setting.UI.ExplorePagingNum, - OrderBy: "name ASC", TplName: tplExploreOrganizations, }) } diff --git a/templates/admin/base/search.tmpl b/templates/admin/base/search.tmpl index 22634354b80a..9e450ee367c5 100644 --- a/templates/admin/base/search.tmpl +++ b/templates/admin/base/search.tmpl @@ -1,4 +1,21 @@ -
+ +
diff --git a/templates/explore/search.tmpl b/templates/explore/search.tmpl index 8d91f3150414..51c2a6908e5e 100644 --- a/templates/explore/search.tmpl +++ b/templates/explore/search.tmpl @@ -1,4 +1,21 @@ - + +