mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-03 12:05:59 +01:00
Implementing conditional issue searching.
This commit is contained in:
@@ -27,26 +27,15 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
)(CommentForm.apply)
|
)(CommentForm.apply)
|
||||||
|
|
||||||
get("/:owner/:repository/issues"){
|
get("/:owner/:repository/issues"){
|
||||||
val owner = params("owner")
|
searchIssues("all")
|
||||||
val repository = params("repository")
|
|
||||||
|
|
||||||
searchIssues(owner, repository, "all", None)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/:owner/:repository/issues/assigned/:userName"){
|
get("/:owner/:repository/issues/assigned/:userName"){
|
||||||
val owner = params("owner")
|
searchIssues("assigned")
|
||||||
val repository = params("repository")
|
|
||||||
val userName = params("userName")
|
|
||||||
|
|
||||||
searchIssues(owner, repository, "assigned", Some(userName))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/:owner/:repository/issues/created_by/:userName"){
|
get("/:owner/:repository/issues/created_by/:userName"){
|
||||||
val owner = params("owner")
|
searchIssues("created_by")
|
||||||
val repository = params("repository")
|
|
||||||
val userName = params("userName")
|
|
||||||
|
|
||||||
searchIssues(owner, repository, "created_by", Some(userName))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/:owner/:repository/issues/:id"){
|
get("/:owner/:repository/issues/:id"){
|
||||||
@@ -85,7 +74,10 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
|
saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
|
||||||
})
|
})
|
||||||
|
|
||||||
private def searchIssues(owner: String, repository: String, filter: String, userName: Option[String]) = {
|
private def searchIssues(filter: String) = {
|
||||||
|
val owner = params("owner")
|
||||||
|
val repository = params("repository")
|
||||||
|
val userName = if(filter != "all") Some(params("userName")) else None
|
||||||
val sessionKey = "%s/%s/issues".format(owner, repository)
|
val sessionKey = "%s/%s/issues".format(owner, repository)
|
||||||
|
|
||||||
// retrieve search condition
|
// retrieve search condition
|
||||||
@@ -96,7 +88,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
session.put(sessionKey, condition)
|
session.put(sessionKey, condition)
|
||||||
|
|
||||||
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
|
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
|
||||||
issues.html.issues(searchIssue(owner, repository, condition.state == "closed"),
|
issues.html.issues(searchIssue(owner, repository, condition, filter, userName),
|
||||||
getLabels(owner, repository),
|
getLabels(owner, repository),
|
||||||
getMilestones(owner, repository).filter(_.closedDate.isEmpty),
|
getMilestones(owner, repository).filter(_.closedDate.isEmpty),
|
||||||
condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount))
|
condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount))
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ import Q.interpolation
|
|||||||
|
|
||||||
import model._
|
import model._
|
||||||
import Issues._
|
import Issues._
|
||||||
|
import util.Implicits._
|
||||||
|
|
||||||
trait IssuesService {
|
trait IssuesService {
|
||||||
|
import IssuesService._
|
||||||
|
|
||||||
def getIssue(owner: String, repository: String, issueId: String) =
|
def getIssue(owner: String, repository: String, issueId: String) =
|
||||||
if (issueId forall (_.isDigit))
|
if (issueId forall (_.isDigit))
|
||||||
Query(Issues) filter { t =>
|
Query(Issues) filter { t =>
|
||||||
@@ -25,13 +28,26 @@ trait IssuesService {
|
|||||||
(t.issueId is issueId.bind)
|
(t.issueId is issueId.bind)
|
||||||
} list
|
} list
|
||||||
|
|
||||||
def searchIssue(owner: String, repository: String,
|
def searchIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]) =
|
||||||
// TODO It is better to have a DTO
|
|
||||||
closed: Boolean) =
|
|
||||||
Query(Issues) filter { t =>
|
Query(Issues) filter { t =>
|
||||||
(t.userName is owner.bind) &&
|
(t.userName is owner.bind) &&
|
||||||
(t.repositoryName is repository.bind) &&
|
(t.repositoryName is repository.bind) &&
|
||||||
(t.closed is closed.bind)
|
(t.closed is (condition.state == "closed").bind) &&
|
||||||
|
(t.milestoneId is condition.milestoneId.get.bind, condition.milestoneId.isDefined) &&
|
||||||
|
//if(condition.labels.nonEmpty) Some(Query(Issue)) else None,
|
||||||
|
(t.assignedUserName is userName.get.bind, filter == "assigned") &&
|
||||||
|
(t.openedUserName is userName.get.bind, filter == "created_by")
|
||||||
|
} sortBy { t =>
|
||||||
|
(condition.sort match {
|
||||||
|
case "created" => t.registeredDate
|
||||||
|
case "comments" => t.updatedDate
|
||||||
|
case "updated" => t.updatedDate
|
||||||
|
}) match {
|
||||||
|
case sort => condition.direction match {
|
||||||
|
case "asc" => sort asc
|
||||||
|
case "desc" => sort desc
|
||||||
|
}
|
||||||
|
}
|
||||||
} list
|
} list
|
||||||
|
|
||||||
def saveIssue(owner: String, repository: String, loginUser: String,
|
def saveIssue(owner: String, repository: String, loginUser: String,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import twirl.api.Html
|
import twirl.api.Html
|
||||||
|
import scala.slick.driver.H2Driver.simple._
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides some usable implicit conversions.
|
* Provides some usable implicit conversions.
|
||||||
@@ -29,4 +30,8 @@ object Implicits {
|
|||||||
def mkHtml(separator: scala.xml.Elem) = Html(seq.mkString(separator.toString))
|
def mkHtml(separator: scala.xml.Elem) = Html(seq.mkString(separator.toString))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
implicit def extendsColumn(c1: Column[Boolean]) = new {
|
||||||
|
def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone], condition: service.IssuesService.IssueSearchCondition, filter: String, repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
|
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone],
|
||||||
|
condition: service.IssuesService.IssueSearchCondition, filter: String,
|
||||||
|
repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main("Issues - " + repository.owner + "/" + repository.name){
|
@html.main("Issues - " + repository.owner + "/" + repository.name){
|
||||||
|
|||||||
Reference in New Issue
Block a user