Implementing search condition behavior.

This commit is contained in:
takezoe
2013-06-25 15:32:52 +09:00
parent ffa6d21d28
commit aae5bfd184
2 changed files with 24 additions and 16 deletions

View File

@@ -75,16 +75,16 @@ object IssuesService {
import java.net.URLEncoder import java.net.URLEncoder
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
case class IssueSearchCondition(labels: Set[String], milestoneId: Option[Int], state: String, sort: Option[String], direction: Option[String]){ case class IssueSearchCondition(labels: Set[String], milestoneId: Option[Int], state: String, sort: String, direction: String){
import IssueSearchCondition._ import IssueSearchCondition._
def toURL(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context): String = { def toURL(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context): String = {
val params = List( val params = List(
if(labels.isEmpty) None else Some("labels=" + urlEncode(labels.mkString(" "))), if(labels.isEmpty) None else Some("labels=" + urlEncode(labels.mkString(" "))),
milestoneId.map("milestone=" + _), milestoneId.map("milestone=" + _),
Some("state=" + urlEncode(state)), Some("state=" + urlEncode(state)),
sort.map("sort=" + urlEncode(_)), Some("sort=" + urlEncode(sort)),
direction.map("direction=" + urlEncode(_)) Some("direction=" + urlEncode(direction))
) )
"%s/%s/%s/issues?%s".format(context.path, repository.owner, repository.name, params.flatten.mkString("&")) "%s/%s/%s/issues?%s".format(context.path, repository.owner, repository.name, params.flatten.mkString("&"))
} }
@@ -94,17 +94,17 @@ object IssuesService {
private def urlEncode(value: String): String = URLEncoder.encode(value, "UTF-8") private def urlEncode(value: String): String = URLEncoder.encode(value, "UTF-8")
private def param(request: HttpServletRequest, name: String): Option[String] = { private def param(request: HttpServletRequest, name: String, allow: Seq[String] = Nil): Option[String] = {
val value = request.getParameter(name) val value = request.getParameter(name)
if(value == null || value.isEmpty) None else Some(value) if(value == null || value.isEmpty || (allow.nonEmpty && !allow.contains(value))) None else Some(value)
} }
def apply(request: HttpServletRequest): IssueSearchCondition = def apply(request: HttpServletRequest): IssueSearchCondition =
IssueSearchCondition( IssueSearchCondition(
param(request, "labels").map(_.split(" ").toSet).getOrElse(Set.empty), param(request, "labels").map(_.split(" ").toSet).getOrElse(Set.empty),
param(request, "milestone").map(_.toInt), param(request, "milestone").map(_.toInt),
param(request, "state").getOrElse("open"), param(request, "state", Seq("open", "closed")).getOrElse("open"),
param(request, "sort"), param(request, "sort", Seq("created", "comments", "updated")).getOrElse("created"),
param(request, "direction")) param(request, "direction", Seq("asc", "desc")).getOrElse("desc"))
} }
} }

View File

@@ -89,16 +89,24 @@
</div> </div>
<div class="btn-group"> <div class="btn-group">
<button class="btn dropdown-toggle" data-toggle="dropdown"> <button class="btn dropdown-toggle" data-toggle="dropdown">
Sort: <strong>Newest</strong> Sort:
<strong>
@if(condition.sort == "created" && condition.direction == "desc"){ Newest }
@if(condition.sort == "created" && condition.direction == "asc" ){ Oldest }
@if(condition.sort == "comments" && condition.direction == "desc"){ Most commented }
@if(condition.sort == "comments" && condition.direction == "asc" ){ Least commented }
@if(condition.sort == "updated" && condition.direction == "desc"){ Recently updated }
@if(condition.sort == "updated" && condition.direction == "asc" ){ Least recently updated }
</strong>
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="#">Newest</a></li> <li><a href="@condition.copy(sort="created", direction="desc").toURL(repository)">Newest</a></li>
<li><a href="#">Oldest</a></li> <li><a href="@condition.copy(sort="created", direction="asc" ).toURL(repository)">Oldest</a></li>
<li><a href="#">Most commented</a></li> <li><a href="@condition.copy(sort="comments", direction="desc").toURL(repository)">Most commented</a></li>
<li><a href="#">Least commented</a></li> <li><a href="@condition.copy(sort="comments", direction="asc" ).toURL(repository)">Least commented</a></li>
<li><a href="#">Recently updated</a></li> <li><a href="@condition.copy(sort="updated", direction="desc").toURL(repository)">Recently updated</a></li>
<li><a href="#">Least recently updated</a></li> <li><a href="@condition.copy(sort="updated", direction="asc" ).toURL(repository)">Least recently updated</a></li>
</ul> </ul>
</div> </div>
<table class="table table-bordered table-hover"> <table class="table table-bordered table-hover">