diff options
-rw-r--r-- | models/repo.go | 30 | ||||
-rw-r--r-- | models/star.go | 4 | ||||
-rw-r--r-- | models/star_test.go | 4 | ||||
-rw-r--r-- | routers/user/profile.go | 121 | ||||
-rw-r--r-- | templates/base/paginate.tmpl | 10 | ||||
-rw-r--r-- | templates/explore/repo_list.tmpl | 2 | ||||
-rw-r--r-- | templates/explore/search.tmpl | 13 | ||||
-rw-r--r-- | templates/user/profile.tmpl | 1 |
8 files changed, 109 insertions, 76 deletions
diff --git a/models/repo.go b/models/repo.go index 7a6eaea215..d83c5fd6ab 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1778,13 +1778,15 @@ type SearchRepoOptions struct { Searcher *User //ID of the person who's seeking OrderBy string Private bool // Include private repositories in results + Starred bool Page int PageSize int // Can be smaller than or equal to setting.ExplorePagingNum } // SearchRepositoryByName takes keyword and part of repository name to search, // it returns results in given range and number of total results. -func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int64, _ error) { +func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) { + var sess *xorm.Session if len(opts.Keyword) == 0 { return repos, 0, nil } @@ -1796,9 +1798,17 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int repos = make([]*Repository, 0, opts.PageSize) + if opts.Starred && opts.OwnerID > 0 { + sess = x. + Join("INNER", "star", "star.repo_id = repository.id"). + Where("star.uid = ?", opts.OwnerID). + And("lower_name LIKE ?", "%"+opts.Keyword+"%") + } else { + sess = x.Where("lower_name LIKE ?", "%"+opts.Keyword+"%") + } + // Append conditions - sess := x.Where("LOWER(lower_name) LIKE ?", "%"+opts.Keyword+"%") - if opts.OwnerID > 0 { + if !opts.Starred && opts.OwnerID > 0 { sess.And("owner_id = ?", opts.OwnerID) } if !opts.Private { @@ -1831,10 +1841,20 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int return nil, 0, fmt.Errorf("Count: %v", err) } - return repos, count, sess. + if err = sess. Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). OrderBy(opts.OrderBy). - Find(&repos) + Find(&repos); err != nil { + return nil, 0, fmt.Errorf("Repo: %v", err) + } + + if opts.Starred { + if err = repos.loadAttributes(x); err != nil { + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) + } + } + + return repos, count, nil } // DeleteRepositoryArchives deletes all repositories' archives. diff --git a/models/star.go b/models/star.go index 39f6eac1f0..7525c8a6fa 100644 --- a/models/star.go +++ b/models/star.go @@ -73,12 +73,12 @@ func (repo *Repository) GetStargazers(page int) ([]*User, error) { // GetStarredRepos returns the repos the user starred. func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) (repos []*Repository, err error) { if len(orderBy) == 0 { - orderBy = "star.id" + orderBy = "updated_unix DESC" } sess := x. Join("INNER", "star", "star.repo_id = repository.id"). Where("star.uid = ?", u.ID). - Desc(orderBy) + OrderBy(orderBy) if !private { sess = sess.And("is_private = ?", false) diff --git a/models/star_test.go b/models/star_test.go index d6a83199b7..714f5df5cd 100644 --- a/models/star_test.go +++ b/models/star_test.go @@ -61,8 +61,8 @@ func TestUser_GetStarredRepos(t *testing.T) { starred, err = user.GetStarredRepos(true, 1, 10, "") assert.NoError(t, err) assert.Len(t, starred, 2) - assert.Equal(t, int64(4), starred[0].ID) - assert.Equal(t, int64(2), starred[1].ID) + assert.Equal(t, int64(2), starred[0].ID) + assert.Equal(t, int64(4), starred[1].ID) } func TestUser_GetStarredRepos2(t *testing.T) { diff --git a/routers/user/profile.go b/routers/user/profile.go index f0b1be3060..bb1ab64e02 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -90,6 +90,44 @@ func Profile(ctx *context.Context) { tab := ctx.Query("tab") ctx.Data["TabName"] = tab + + page := ctx.QueryInt("page") + if page <= 0 { + page = 1 + } + + var ( + repos []*models.Repository + count int64 + orderBy string + ) + + ctx.Data["SortType"] = ctx.Query("sort") + switch ctx.Query("sort") { + case "newest": + orderBy = "created_unix DESC" + 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: + ctx.Data["SortType"] = "recentupdate" + orderBy = "updated_unix DESC" + } + + // set default sort value if sort is empty. + if ctx.Query("sort") == "" { + ctx.Data["SortType"] = "recentupdate" + } + + keyword := strings.Trim(ctx.Query("q"), " ") + ctx.Data["Keyword"] = keyword switch tab { case "activity": retrieveFeeds(ctx, ctxUser, -1, 0, !showPrivate) @@ -97,66 +135,39 @@ func Profile(ctx *context.Context) { return } case "stars": - page := ctx.QueryInt("page") - if page <= 0 { - page = 1 - } - - repos, err := ctxUser.GetStarredRepos(showPrivate, page, setting.UI.User.RepoPagingNum, "") - if err != nil { - ctx.Handle(500, "GetStarredRepos", err) - return - } + ctx.Data["PageIsProfileStarList"] = true + if len(keyword) == 0 { + repos, err = ctxUser.GetStarredRepos(showPrivate, page, setting.UI.User.RepoPagingNum, orderBy) + if err != nil { + ctx.Handle(500, "GetStarredRepos", err) + return + } - counts, err := ctxUser.GetStarredRepoCount(showPrivate) - if err != nil { - ctx.Handle(500, "GetStarredRepoCount", err) - return + count, err = ctxUser.GetStarredRepoCount(showPrivate) + if err != nil { + ctx.Handle(500, "GetStarredRepoCount", err) + return + } + } else { + repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ + Keyword: keyword, + OwnerID: ctxUser.ID, + OrderBy: orderBy, + Private: showPrivate, + Page: page, + PageSize: setting.UI.User.RepoPagingNum, + Starred: true, + }) + if err != nil { + ctx.Handle(500, "SearchRepositoryByName", err) + return + } } ctx.Data["Repos"] = repos - ctx.Data["Page"] = paginater.New(int(counts), setting.UI.User.RepoPagingNum, page, 5) - ctx.Data["Total"] = int(counts) - ctx.Data["Tabs"] = "stars" + ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5) + ctx.Data["Total"] = count default: - page := ctx.QueryInt("page") - if page <= 0 { - page = 1 - } - - var ( - repos []*models.Repository - count int64 - err error - orderBy string - ) - - ctx.Data["SortType"] = ctx.Query("sort") - switch ctx.Query("sort") { - case "newest": - orderBy = "created_unix DESC" - 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: - ctx.Data["SortType"] = "recentupdate" - orderBy = "updated_unix DESC" - } - - // set default sort value if sort is empty. - if ctx.Query("sort") == "" { - ctx.Data["SortType"] = "recentupdate" - } - - keyword := strings.Trim(ctx.Query("q"), " ") - ctx.Data["Keyword"] = keyword if len(keyword) == 0 { var total int repos, err = models.GetUserRepositories(ctxUser.ID, showPrivate, page, setting.UI.User.RepoPagingNum, orderBy) diff --git a/templates/base/paginate.tmpl b/templates/base/paginate.tmpl index 427a4b0953..0291c01282 100644 --- a/templates/base/paginate.tmpl +++ b/templates/base/paginate.tmpl @@ -2,21 +2,21 @@ {{if gt .TotalPages 1}} <div class="center page buttons"> <div class="ui borderless pagination menu"> - <a class="{{if .IsFirst}}disabled{{end}} item" href="{{$.Link}}?q={{$.Keyword}}"><i class="angle double left icon"></i> {{$.i18n.Tr "admin.first_page"}}</a> - <a class="{{if not .HasPrevious}}disabled{{end}} item" {{if .HasPrevious}}href="{{$.Link}}?page={{.Previous}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{end}}> + <a class="{{if .IsFirst}}disabled{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&tab={{$.TabName}}"><i class="angle double left icon"></i> {{$.i18n.Tr "admin.first_page"}}</a> + <a class="{{if not .HasPrevious}}disabled{{end}} item" {{if .HasPrevious}}href="{{$.Link}}?page={{.Previous}}&q={{$.Keyword}}&tab={{$.TabName}}"{{end}}> <i class="left arrow icon"></i> {{$.i18n.Tr "repo.issues.previous"}} </a> {{range .Pages}} {{if eq .Num -1}} <a class="disabled item">...</a> {{else}} - <a class="{{if .IsCurrent}}active{{end}} item" {{if not .IsCurrent}}href="{{$.Link}}?page={{.Num}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{end}}>{{.Num}}</a> + <a class="{{if .IsCurrent}}active{{end}} item" {{if not .IsCurrent}}href="{{$.Link}}?page={{.Num}}&q={{$.Keyword}}&tab={{$.TabName}}"{{end}}>{{.Num}}</a> {{end}} {{end}} - <a class="{{if not .HasNext}}disabled{{end}} item" {{if .HasNext}}href="{{$.Link}}?page={{.Next}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{end}}> + <a class="{{if not .HasNext}}disabled{{end}} item" {{if .HasNext}}href="{{$.Link}}?page={{.Next}}&q={{$.Keyword}}&tab={{$.TabName}}"{{end}}> {{$.i18n.Tr "repo.issues.next"}} <i class="icon right arrow"></i> </a> - <a class="{{if .IsLast}}disabled{{end}} item" href="{{$.Link}}?page={{.TotalPages}}&q={{$.Keyword}}&tab={{$.Tabs}}">{{$.i18n.Tr "admin.last_page"}} <i class="angle double right icon"></i></a> + <a class="{{if .IsLast}}disabled{{end}} item" href="{{$.Link}}?page={{.TotalPages}}&q={{$.Keyword}}&tab={{$.TabName}}">{{$.i18n.Tr "admin.last_page"}} <i class="angle double right icon"></i></a> </div> </div> {{end}} diff --git a/templates/explore/repo_list.tmpl b/templates/explore/repo_list.tmpl index 961e510c08..76ed6491f4 100644 --- a/templates/explore/repo_list.tmpl +++ b/templates/explore/repo_list.tmpl @@ -2,7 +2,7 @@ {{range .Repos}} <div class="item"> <div class="ui header"> - <a class="name" href="{{AppSubUrl}}/{{if .Owner}}{{.Owner.Name}}{{else if $.Org}}{{$.Org.Name}}{{else}}{{$.Owner.Name}}{{end}}/{{.Name}}">{{if $.PageIsExplore}}{{.Owner.Name}} / {{end}}{{.Name}}</a> + <a class="name" href="{{AppSubUrl}}/{{if .Owner}}{{.Owner.Name}}{{else if $.Org}}{{$.Org.Name}}{{else}}{{$.Owner.Name}}{{end}}/{{.Name}}">{{if or $.PageIsExplore $.PageIsProfileStarList }}{{.Owner.Name}} / {{end}}{{.Name}}</a> {{if .IsPrivate}} <span class="text gold"><i class="octicon octicon-lock"></i></span> {{else if .IsFork}} diff --git a/templates/explore/search.tmpl b/templates/explore/search.tmpl index 51c2a6908e..8cd6f9b2f5 100644 --- a/templates/explore/search.tmpl +++ b/templates/explore/search.tmpl @@ -6,18 +6,19 @@ <i class="dropdown icon"></i> </span> <div class="menu"> - <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> - <a class="{{if eq .SortType "oldest"}}active{{end}} item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.oldest"}}</a> - <a class="{{if eq .SortType "alphabetically"}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a> - <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> - <a class="{{if eq .SortType "recentupdate"}}active{{end}} item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.recentupdate"}}</a> - <a class="{{if eq .SortType "leastupdate"}}active{{end}} item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.i18n.Tr "repo.issues.filter_sort.leastupdate"}}</a> + <a class="{{if or (eq .SortType "newest") (not .SortType)}}active{{end}} item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.latest"}}</a> + <a class="{{if eq .SortType "oldest"}}active{{end}} item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.oldest"}}</a> + <a class="{{if eq .SortType "alphabetically"}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a> + <a class="{{if eq .SortType "reversealphabetically"}}active{{end}} item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a> + <a class="{{if eq .SortType "recentupdate"}}active{{end}} item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.recentupdate"}}</a> + <a class="{{if eq .SortType "leastupdate"}}active{{end}} item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.leastupdate"}}</a> </div> </div> </div> <form class="ui form" style="max-width: 90%"> <div class="ui fluid action input"> <input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus> + <input type="hidden" name="tab" value="{{$.TabName}}"> <button class="ui blue button">{{.i18n.Tr "explore.search"}}</button> </div> </form> diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index e1a8ca1ea7..08627616b5 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -92,6 +92,7 @@ </div> {{else if eq .TabName "stars"}} <div class="stars"> + {{template "explore/search" .}} {{template "explore/repo_list" .}} {{template "base/paginate" .}} </div> |