]> source.dussan.org Git - gitea.git/commitdiff
feat: support search bar on star tab of user profile. (#917)
authorBo-Yi Wu <appleboy.tw@gmail.com>
Tue, 14 Feb 2017 07:28:22 +0000 (15:28 +0800)
committerLunny Xiao <xiaolunwen@gmail.com>
Tue, 14 Feb 2017 07:28:22 +0000 (15:28 +0800)
* feat: support search bar on star tab of user profile.

* fix: update testing.

* fix: Using loadAttributes

* fix: remove empty line.

* remove LOWER

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
models/repo.go
models/star.go
models/star_test.go
routers/user/profile.go
templates/base/paginate.tmpl
templates/explore/repo_list.tmpl
templates/explore/search.tmpl
templates/user/profile.tmpl

index 7a6eaea2150bf1e28b648325980901db4106de47..d83c5fd6ab04a950734f547929c95e67b9c7f1a6 100644 (file)
@@ -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.
index 39f6eac1f072a3ee13f2fde00fe7a2e332c7389c..7525c8a6fa8d42866344af60fd96b5d998a1bbbc 100644 (file)
@@ -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)
index d6a83199b7c26422e4e930ca00d8e5e55278f263..714f5df5cd2bcee1e83897ca91934aecbe245db8 100644 (file)
@@ -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) {
index f0b1be3060ee1a1a4bcfff054ae87416a6676813..bb1ab64e0294f5fd19d068be58d1a82e44cb9dbf 100644 (file)
@@ -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)
index 427a4b09537c4ea308e881e11d5474dca1fba18a..0291c01282d329f20d6d87fb9ecfedb966c026ed 100644 (file)
@@ -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"}}&nbsp;<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"}}&nbsp;<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"}}&nbsp;<i class="angle double right icon"></i></a>
                        </div>
                </div>
        {{end}}
index 961e510c088362b51fed236b62391f7a4f7cfe04..76ed6491f476db29f73a907eeaa1dbd0f904ee49 100644 (file)
@@ -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}}
index 51c2a6908e5ed302e82f0b272e22ba78a5f1f85a..8cd6f9b2f585e081fe51342208d5b27728dbb5d4 100644 (file)
@@ -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>
index e1a8ca1ea7351c891557a6466a176eef11b83bd0..08627616b5aa3eb1e041c0901767a05dc67742fd 100644 (file)
@@ -92,6 +92,7 @@
                                        </div>
                                {{else if eq .TabName "stars"}}
                                        <div class="stars">
+                                               {{template "explore/search" .}}
                                                {{template "explore/repo_list" .}}
                                                {{template "base/paginate" .}}
                                        </div>