| @@ -71,16 +71,26 @@ func (repo *Repository) GetStargazers(page int) ([]*User, error) { | |||
| } | |||
| // GetStarredRepos returns the repos the user starred. | |||
| func (u *User) GetStarredRepos(private bool) (repos []*Repository, err error) { | |||
| func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) (repos []*Repository, err error) { | |||
| if len(orderBy) == 0 { | |||
| orderBy = "star.id" | |||
| } | |||
| sess := x. | |||
| Join("INNER", "star", "star.repo_id = repository.id"). | |||
| Where("star.uid = ?", u.ID). | |||
| Desc("star.id") | |||
| Desc(orderBy) | |||
| if !private { | |||
| sess = sess.And("is_private = ?", false) | |||
| } | |||
| if page <= 0 { | |||
| page = 1 | |||
| } | |||
| sess.Limit(pageSize, (page-1)*pageSize) | |||
| repos = make([]*Repository, 0, pageSize) | |||
| if err = sess.Find(&repos); err != nil { | |||
| return | |||
| } | |||
| @@ -93,3 +103,16 @@ func (u *User) GetStarredRepos(private bool) (repos []*Repository, err error) { | |||
| return | |||
| } | |||
| // GetStarredRepoCount returns the numbers of repo the user starred. | |||
| func (u *User) GetStarredRepoCount(private bool) (int64, error) { | |||
| sess := x. | |||
| Join("INNER", "star", "star.repo_id = repository.id"). | |||
| Where("star.uid = ?", u.ID) | |||
| if !private { | |||
| sess = sess.And("is_private = ?", false) | |||
| } | |||
| return sess.Count(&Repository{}) | |||
| } | |||
| @@ -53,12 +53,12 @@ func TestUser_GetStarredRepos(t *testing.T) { | |||
| assert.NoError(t, PrepareTestDatabase()) | |||
| user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | |||
| starred, err := user.GetStarredRepos(false) | |||
| starred, err := user.GetStarredRepos(false, 1, 10, "") | |||
| assert.NoError(t, err) | |||
| assert.Len(t, starred, 1) | |||
| assert.Equal(t, int64(4), starred[0].ID) | |||
| starred, err = user.GetStarredRepos(true) | |||
| starred, err = user.GetStarredRepos(true, 1, 10, "") | |||
| assert.NoError(t, err) | |||
| assert.Len(t, starred, 2) | |||
| assert.Equal(t, int64(4), starred[0].ID) | |||
| @@ -70,11 +70,24 @@ func TestUser_GetStarredRepos2(t *testing.T) { | |||
| assert.NoError(t, PrepareTestDatabase()) | |||
| user := AssertExistsAndLoadBean(t, &User{ID: 1}).(*User) | |||
| starred, err := user.GetStarredRepos(false) | |||
| starred, err := user.GetStarredRepos(false, 1, 10, "") | |||
| assert.NoError(t, err) | |||
| assert.Len(t, starred, 0) | |||
| starred, err = user.GetStarredRepos(true) | |||
| starred, err = user.GetStarredRepos(true, 1, 10, "") | |||
| assert.NoError(t, err) | |||
| assert.Len(t, starred, 0) | |||
| } | |||
| func TestUserGetStarredRepoCount(t *testing.T) { | |||
| assert.NoError(t, PrepareTestDatabase()) | |||
| user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | |||
| counts, err := user.GetStarredRepoCount(false) | |||
| assert.NoError(t, err) | |||
| assert.Equal(t, int64(1), counts) | |||
| counts, err = user.GetStarredRepoCount(true) | |||
| assert.NoError(t, err) | |||
| assert.Equal(t, int64(2), counts) | |||
| } | |||
| @@ -97,12 +97,27 @@ func Profile(ctx *context.Context) { | |||
| return | |||
| } | |||
| case "stars": | |||
| starredRepos, err := ctxUser.GetStarredRepos(showPrivate) | |||
| 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["Repos"] = starredRepos | |||
| counts, err := ctxUser.GetStarredRepoCount(showPrivate) | |||
| if err != nil { | |||
| ctx.Handle(500, "GetStarredRepoCount", 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" | |||
| default: | |||
| page := ctx.QueryInt("page") | |||
| if page <= 0 { | |||
| @@ -3,20 +3,20 @@ | |||
| <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}}"{{end}}> | |||
| <a class="{{if not .HasPrevious}}disabled{{end}} item" {{if .HasPrevious}}href="{{$.Link}}?page={{.Previous}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{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}}"{{end}}>{{.Num}}</a> | |||
| <a class="{{if .IsCurrent}}active{{end}} item" {{if not .IsCurrent}}href="{{$.Link}}?page={{.Num}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{end}}>{{.Num}}</a> | |||
| {{end}} | |||
| {{end}} | |||
| <a class="{{if not .HasNext}}disabled{{end}} item" {{if .HasNext}}href="{{$.Link}}?page={{.Next}}&q={{$.Keyword}}"{{end}}> | |||
| <a class="{{if not .HasNext}}disabled{{end}} item" {{if .HasNext}}href="{{$.Link}}?page={{.Next}}&q={{$.Keyword}}&tab={{$.Tabs}}"{{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}}">{{$.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={{$.Tabs}}">{{$.i18n.Tr "admin.last_page"}} <i class="angle double right icon"></i></a> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| @@ -93,6 +93,7 @@ | |||
| {{else if eq .TabName "stars"}} | |||
| <div class="stars"> | |||
| {{template "explore/repo_list" .}} | |||
| {{template "base/paginate" .}} | |||
| </div> | |||
| {{else}} | |||
| {{template "explore/search" .}} | |||