Separate issues and pull requests search

This commit is contained in:
Naoki Takezoe
2018-07-18 18:39:08 +09:00
parent 55c973b760
commit aac232f33e
6 changed files with 35 additions and 17 deletions

View File

@@ -237,9 +237,19 @@ trait IndexControllerBase extends ControllerBase {
} }
target.toLowerCase match { target.toLowerCase match {
case "issue" => case "issues" =>
gitbucket.core.search.html.issues( gitbucket.core.search.html.issues(
if (query.nonEmpty) searchIssues(repository.owner, repository.name, query) else Nil, if (query.nonEmpty) searchIssues(repository.owner, repository.name, query, false) else Nil,
false,
query,
page,
repository
)
case "pulls" =>
gitbucket.core.search.html.issues(
if (query.nonEmpty) searchIssues(repository.owner, repository.name, query, true) else Nil,
true,
query, query,
page, page,
repository repository

View File

@@ -630,7 +630,7 @@ trait IssuesService {
* @param query the keywords separated by whitespace. * @param query the keywords separated by whitespace.
* @return issues with comment count and matched content of issue or comment * @return issues with comment count and matched content of issue or comment
*/ */
def searchIssuesByKeyword(owner: String, repository: String, query: String)( def searchIssuesByKeyword(owner: String, repository: String, query: String, pullRequest: Boolean)(
implicit s: Session implicit s: Session
): List[(Issue, Int, String)] = { ): List[(Issue, Int, String)] = {
//import slick.driver.JdbcDriver.likeEncode //import slick.driver.JdbcDriver.likeEncode
@@ -638,7 +638,9 @@ trait IssuesService {
// Search Issue // Search Issue
val issues = Issues val issues = Issues
.filter(_.byRepository(owner, repository)) .filter { t =>
t.byRepository(owner, repository) && t.pullRequest === pullRequest.bind
}
.join(IssueOutline) .join(IssueOutline)
.on { .on {
case (t1, t2) => case (t1, t2) =>

View File

@@ -14,13 +14,15 @@ import gitbucket.core.model.Profile.profile.blockingApi._
trait RepositorySearchService { self: IssuesService => trait RepositorySearchService { self: IssuesService =>
import RepositorySearchService._ import RepositorySearchService._
def countIssues(owner: String, repository: String, query: String)(implicit session: Session): Int = def countIssues(owner: String, repository: String, query: String, pullRequest: Boolean)(
searchIssuesByKeyword(owner, repository, query).length implicit session: Session
): Int =
searchIssuesByKeyword(owner, repository, query, pullRequest).length
def searchIssues(owner: String, repository: String, query: String)( def searchIssues(owner: String, repository: String, query: String, pullRequest: Boolean)(
implicit session: Session implicit session: Session
): List[IssueSearchResult] = ): List[IssueSearchResult] =
searchIssuesByKeyword(owner, repository, query).map { searchIssuesByKeyword(owner, repository, query, pullRequest).map {
case (issue, commentCount, content) => case (issue, commentCount, content) =>
IssueSearchResult( IssueSearchResult(
issue.issueId, issue.issueId,

View File

@@ -1,16 +1,17 @@
@(issues: List[gitbucket.core.service.RepositorySearchService.IssueSearchResult], @(issues: List[gitbucket.core.service.RepositorySearchService.IssueSearchResult],
pullRequest: Boolean,
query: String, query: String,
page: Int, page: Int,
repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context) repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers @import gitbucket.core.view.helpers
@import gitbucket.core.service.RepositorySearchService @import gitbucket.core.service.RepositorySearchService
@gitbucket.core.html.main("Search Results", Some(repository)){ @gitbucket.core.html.main("Search Results", Some(repository)){
@gitbucket.core.search.html.menu("issues", query, repository){ @gitbucket.core.search.html.menu(if(pullRequest) "pulls" else "issues", query, repository){
@if(query.nonEmpty) { @if(query.nonEmpty) {
@if(issues.isEmpty) { @if(issues.isEmpty) {
<h4>We couldn't find any code matching '@query'</h4> <h4>We couldn't find any @{if(pullRequest) "pull requests" else "issues"} matching '@query'</h4>
} else { } else {
<h4>We've found @issues.size @helpers.plural(issues.size, "issue")</h4> <h4>We've found @issues.size @helpers.plural(issues.size, if(pullRequest) "pull request" else "issue")</h4>
} }
} }
@issues.drop((page - 1) * RepositorySearchService.IssueLimit).take(RepositorySearchService.IssueLimit).map { issue => @issues.drop((page - 1) * RepositorySearchService.IssueLimit).take(RepositorySearchService.IssueLimit).map { issue =>
@@ -31,6 +32,6 @@
</div> </div>
} }
@gitbucket.core.helper.html.paginator(page, issues.size, RepositorySearchService.IssueLimit, 10, @gitbucket.core.helper.html.paginator(page, issues.size, RepositorySearchService.IssueLimit, 10,
s"${helpers.url(repository)}/search?q=${helpers.urlEncode(query)}&type=issue") s"${helpers.url(repository)}/search?q=${helpers.urlEncode(query)}&type=${if(pullRequest) "pulls" else "issues"}")
} }
} }

View File

@@ -6,7 +6,10 @@
<select class="form-control" name="type"> <select class="form-control" name="type">
<option value="code" @if(active == "files"){ selected }>Files</option> <option value="code" @if(active == "files"){ selected }>Files</option>
@if(repository.repository.options.issuesOption != "DISABLE") { @if(repository.repository.options.issuesOption != "DISABLE") {
<option value="issue" @if(active == "issues"){ selected }>Issues</option> <option value="issues" @if(active == "issues"){ selected }>Issues</option>
}
@if(repository.repository.options.issuesOption != "DISABLE") {
<option value="pulls" @if(active == "pulls"){ selected }>Pull requests</option>
} }
@if(repository.repository.options.wikiOption != "DISABLE") { @if(repository.repository.options.wikiOption != "DISABLE") {
<option value="wiki" @if(active == "wiki"){ selected }>Wiki</option> <option value="wiki" @if(active == "wiki"){ selected }>Wiki</option>
@@ -17,4 +20,4 @@
<input type="hidden" name="type" value="@active"/> <input type="hidden" name="type" value="@active"/>
</form> </form>
@body @body
} }

View File

@@ -8,7 +8,7 @@
@gitbucket.core.search.html.menu("wiki", query, repository){ @gitbucket.core.search.html.menu("wiki", query, repository){
@if(query.nonEmpty) { @if(query.nonEmpty) {
@if(wikis.isEmpty) { @if(wikis.isEmpty) {
<h4>We could not find any code matching '@query'</h4> <h4>We could not find any pages matching '@query'</h4>
} else { } else {
<h4>We've found @wikis.size @helpers.plural(wikis.size, "page")</h4> <h4>We've found @wikis.size @helpers.plural(wikis.size, "page")</h4>
} }
@@ -23,4 +23,4 @@
@gitbucket.core.helper.html.paginator(page, wikis.size, RepositorySearchService.CodeLimit, 10, @gitbucket.core.helper.html.paginator(page, wikis.size, RepositorySearchService.CodeLimit, 10,
s"${helpers.url(repository)}/search?q=${helpers.urlEncode(query)}&type=wiki") s"${helpers.url(repository)}/search?q=${helpers.urlEncode(query)}&type=wiki")
} }
} }