From 4ca3816522d86ae950d1ad736476fe6726f76005 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Wed, 22 Nov 2023 01:55:01 +0900 Subject: [PATCH] Keyword search for issues and pull requests using search box (#3429) --- .../gitbucket/core/controller/IssuesController.scala | 8 +++++++- .../core/controller/PullRequestsController.scala | 8 +++++++- src/main/scala/gitbucket/core/service/IssuesService.scala | 7 ++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/scala/gitbucket/core/controller/IssuesController.scala b/src/main/scala/gitbucket/core/controller/IssuesController.scala index b9cc8fe02..4e96b81bf 100644 --- a/src/main/scala/gitbucket/core/controller/IssuesController.scala +++ b/src/main/scala/gitbucket/core/controller/IssuesController.scala @@ -93,7 +93,13 @@ trait IssuesControllerBase extends ControllerBase { case Some(filter) if filter.contains("is:pr") => redirect(s"/${repository.owner}/${repository.name}/pulls?q=${StringUtil.urlEncode(q)}") case Some(filter) => - searchIssues(repository, IssueSearchCondition(filter), IssueSearchCondition.page(request)) + val condition = IssueSearchCondition(filter) + if (condition.isEmpty) { + // Redirect to keyword search + redirect(s"/${repository.owner}/${repository.name}/search?q=${StringUtil.urlEncode(q)}&type=issues") + } else { + searchIssues(repository, condition, IssueSearchCondition.page(request)) + } case None => searchIssues(repository, IssueSearchCondition(request), IssueSearchCondition.page(request)) } diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index d114072eb..988faa6bc 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -106,7 +106,13 @@ trait PullRequestsControllerBase extends ControllerBase { case Some(filter) if filter.contains("is:issue") => redirect(s"/${repository.owner}/${repository.name}/issues?q=${StringUtil.urlEncode(q)}") case Some(filter) => - searchPullRequests(repository, IssueSearchCondition(filter), IssueSearchCondition.page(request)) + val condition = IssueSearchCondition(filter) + if (condition.isEmpty) { + // Redirect to keyword search + redirect(s"/${repository.owner}/${repository.name}/search?q=${StringUtil.urlEncode(q)}&type=pulls") + } else { + searchPullRequests(repository, IssueSearchCondition(filter), IssueSearchCondition.page(request)) + } case None => searchPullRequests(repository, IssueSearchCondition(request), IssueSearchCondition.page(request)) } diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index a1f41022f..d2a9d2f6b 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -975,15 +975,15 @@ object IssuesService { groups: Set[String] = Set.empty, others: Seq[CustomFieldCondition] = Nil ) { - def isEmpty: Boolean = { labels.isEmpty && milestone.isEmpty && author.isEmpty && assigned.isEmpty && - state == "open" && sort == "created" && direction == "desc" && visibility.isEmpty + state == "open" && sort == "created" && direction == "desc" && visibility.isEmpty && others.isEmpty } def nonEmpty: Boolean = !isEmpty - def toFilterString: String = + def toFilterString: String = if (isEmpty) "" + else { ( List( Some(s"is:${state}"), @@ -1025,6 +1025,7 @@ object IssuesService { } ++ groups.map(group => s"group:${group}") ).mkString(" ") + } def toURL: String = { "?" + (Seq(