diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 630b595..8408671 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -27,26 +27,15 @@ )(CommentForm.apply) get("/:owner/:repository/issues"){ - val owner = params("owner") - val repository = params("repository") - - searchIssues(owner, repository, "all", None) + searchIssues("all") } get("/:owner/:repository/issues/assigned/:userName"){ - val owner = params("owner") - val repository = params("repository") - val userName = params("userName") - - searchIssues(owner, repository, "assigned", Some(userName)) + searchIssues("assigned") } get("/:owner/:repository/issues/created_by/:userName"){ - val owner = params("owner") - val repository = params("repository") - val userName = params("userName") - - searchIssues(owner, repository, "created_by", Some(userName)) + searchIssues("created_by") } get("/:owner/:repository/issues/:id"){ @@ -85,7 +74,10 @@ 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) // retrieve search condition @@ -96,7 +88,7 @@ session.put(sessionKey, condition) 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), getMilestones(owner, repository).filter(_.closedDate.isEmpty), condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount)) diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 67a3c60..8eb07c6 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -7,8 +7,11 @@ import model._ import Issues._ +import util.Implicits._ trait IssuesService { + import IssuesService._ + def getIssue(owner: String, repository: String, issueId: String) = if (issueId forall (_.isDigit)) Query(Issues) filter { t => @@ -25,13 +28,26 @@ (t.issueId is issueId.bind) } list - def searchIssue(owner: String, repository: String, - // TODO It is better to have a DTO - closed: Boolean) = + def searchIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]) = Query(Issues) filter { t => - (t.userName is owner.bind) && - (t.repositoryName is repository.bind) && - (t.closed is closed.bind) + (t.userName is owner.bind) && + (t.repositoryName is repository.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 def saveIssue(owner: String, repository: String, loginUser: String, diff --git a/src/main/scala/util/Implicits.scala b/src/main/scala/util/Implicits.scala index 19045ad..cff9be7 100644 --- a/src/main/scala/util/Implicits.scala +++ b/src/main/scala/util/Implicits.scala @@ -1,6 +1,7 @@ package util import twirl.api.Html +import scala.slick.driver.H2Driver.simple._ /** * Provides some usable implicit conversions. @@ -29,4 +30,8 @@ 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 + } + } \ No newline at end of file diff --git a/src/main/twirl/issues/issues.scala.html b/src/main/twirl/issues/issues.scala.html index e6a99be..b5555fe 100644 --- a/src/main/twirl/issues/issues.scala.html +++ b/src/main/twirl/issues/issues.scala.html @@ -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 view.helpers._ @html.main("Issues - " + repository.owner + "/" + repository.name){