Feature - #3031 - search for org repos (#5986)

release/v1.15
Richard Mahn 2019-02-08 09:45:43 -07:00 committed by techknowlogick
parent 7fb09f035a
commit ba91214633
4 changed files with 71 additions and 9 deletions

View File

@ -620,6 +620,7 @@ type AccessibleReposEnvironment interface {
RepoIDs(page, pageSize int) ([]int64, error) RepoIDs(page, pageSize int) ([]int64, error)
Repos(page, pageSize int) ([]*Repository, error) Repos(page, pageSize int) ([]*Repository, error)
MirrorRepos() ([]*Repository, error) MirrorRepos() ([]*Repository, error)
AddKeyword(keyword string)
} }
type accessibleReposEnv struct { type accessibleReposEnv struct {
@ -627,6 +628,7 @@ type accessibleReposEnv struct {
userID int64 userID int64
teamIDs []int64 teamIDs []int64
e Engine e Engine
keyword string
} }
// AccessibleReposEnv an AccessibleReposEnvironment for the repositories in `org` // AccessibleReposEnv an AccessibleReposEnvironment for the repositories in `org`
@ -656,6 +658,9 @@ func (env *accessibleReposEnv) cond() builder.Cond {
if len(env.teamIDs) > 0 { if len(env.teamIDs) > 0 {
cond = cond.Or(builder.In("team_repo.team_id", env.teamIDs)) cond = cond.Or(builder.In("team_repo.team_id", env.teamIDs))
} }
if env.keyword != "" {
cond = cond.And(builder.Like{"`repository`.lower_name", strings.ToLower(env.keyword)})
}
return cond return cond
} }
@ -731,3 +736,7 @@ func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) {
In("`repository`.id", repoIDs). In("`repository`.id", repoIDs).
Find(&repos) Find(&repos)
} }
func (env *accessibleReposEnv) AddKeyword(keyword string) {
env.keyword = keyword
}

View File

@ -1,4 +1,5 @@
// Copyright 2014 The Gogs Authors. All rights reserved. // Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -387,6 +388,37 @@ func showOrgProfile(ctx *context.Context) {
org := ctx.Org.Organization org := ctx.Org.Organization
ctx.Data["Title"] = org.DisplayName() ctx.Data["Title"] = org.DisplayName()
var orderBy models.SearchOrderBy
ctx.Data["SortType"] = ctx.Query("sort")
switch ctx.Query("sort") {
case "newest":
orderBy = models.SearchOrderByNewest
case "oldest":
orderBy = models.SearchOrderByOldest
case "recentupdate":
orderBy = models.SearchOrderByRecentUpdated
case "leastupdate":
orderBy = models.SearchOrderByLeastUpdated
case "reversealphabetically":
orderBy = models.SearchOrderByAlphabeticallyReverse
case "alphabetically":
orderBy = models.SearchOrderByAlphabetically
case "moststars":
orderBy = models.SearchOrderByStarsReverse
case "feweststars":
orderBy = models.SearchOrderByStars
case "mostforks":
orderBy = models.SearchOrderByForksReverse
case "fewestforks":
orderBy = models.SearchOrderByForks
default:
ctx.Data["SortType"] = "recentupdate"
orderBy = models.SearchOrderByRecentUpdated
}
keyword := strings.Trim(ctx.Query("q"), " ")
ctx.Data["Keyword"] = keyword
page := ctx.QueryInt("page") page := ctx.QueryInt("page")
if page <= 0 { if page <= 0 {
page = 1 page = 1
@ -403,6 +435,9 @@ func showOrgProfile(ctx *context.Context) {
ctx.ServerError("AccessibleReposEnv", err) ctx.ServerError("AccessibleReposEnv", err)
return return
} }
if len(keyword) != 0 {
env.AddKeyword(keyword)
}
repos, err = env.Repos(page, setting.UI.User.RepoPagingNum) repos, err = env.Repos(page, setting.UI.User.RepoPagingNum)
if err != nil { if err != nil {
ctx.ServerError("env.Repos", err) ctx.ServerError("env.Repos", err)
@ -413,25 +448,41 @@ func showOrgProfile(ctx *context.Context) {
ctx.ServerError("env.CountRepos", err) ctx.ServerError("env.CountRepos", err)
return return
} }
ctx.Data["Repos"] = repos
} else { } else {
showPrivate := ctx.IsSigned && ctx.User.IsAdmin showPrivate := ctx.IsSigned && ctx.User.IsAdmin
repos, err = models.GetUserRepositories(org.ID, showPrivate, page, setting.UI.User.RepoPagingNum, "") if len(keyword) == 0 {
if err != nil { repos, err = models.GetUserRepositories(org.ID, showPrivate, page, setting.UI.User.RepoPagingNum, orderBy.String())
ctx.ServerError("GetRepositories", err) if err != nil {
return ctx.ServerError("GetRepositories", err)
return
}
count = models.CountUserRepositories(org.ID, showPrivate)
} else {
repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
Keyword: keyword,
OwnerID: org.ID,
OrderBy: orderBy,
Private: showPrivate,
Page: page,
IsProfile: true,
PageSize: setting.UI.User.RepoPagingNum,
})
if err != nil {
ctx.ServerError("SearchRepositoryByName", err)
return
}
} }
ctx.Data["Repos"] = repos
count = models.CountUserRepositories(org.ID, showPrivate)
} }
ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5)
if err := org.GetMembers(); err != nil { if err := org.GetMembers(); err != nil {
ctx.ServerError("GetMembers", err) ctx.ServerError("GetMembers", err)
return return
} }
ctx.Data["Members"] = org.Members
ctx.Data["Repos"] = repos
ctx.Data["Total"] = count
ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5)
ctx.Data["Members"] = org.Members
ctx.Data["Teams"] = org.Teams ctx.Data["Teams"] = org.Teams
ctx.HTML(200, tplOrgHome) ctx.HTML(200, tplOrgHome)

View File

@ -23,6 +23,7 @@
<div class="ui fluid action input"> <div class="ui fluid action input">
<input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus> <input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus>
<input type="hidden" name="tab" value="{{$.TabName}}"> <input type="hidden" name="tab" value="{{$.TabName}}">
<input type="hidden" name="sort" value="{{$.SortType}}">
<button class="ui blue button">{{.i18n.Tr "explore.search"}}</button> <button class="ui blue button">{{.i18n.Tr "explore.search"}}</button>
</div> </div>
</form> </form>

View File

@ -28,6 +28,7 @@
</div> </div>
<div class="ui divider"></div> <div class="ui divider"></div>
{{end}} {{end}}
{{template "explore/repo_search" .}}
{{template "explore/repo_list" .}} {{template "explore/repo_list" .}}
{{template "base/paginate" .}} {{template "base/paginate" .}}
</div> </div>