Add issue pagination.

This commit is contained in:
takezoe
2013-06-26 17:23:31 +09:00
parent 6a06b908b7
commit e8d5a222f1
3 changed files with 54 additions and 16 deletions

View File

@@ -107,6 +107,13 @@ trait IssuesControllerBase extends ControllerBase {
val userName = if(filter != "all") Some(params("userName")) else None
val sessionKey = "%s/%s/issues".format(owner, repository)
val page = try {
val i = params.getOrElse("page", "1").toInt
if(i <= 0) 1 else i
} catch {
case e: NumberFormatException => 1
}
// retrieve search condition
val condition = if(request.getQueryString == null){
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
@@ -115,7 +122,9 @@ trait IssuesControllerBase extends ControllerBase {
session.put(sessionKey, condition)
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
issues.html.issues(searchIssue(owner, repository, condition, filter, userName),
issues.html.issues(
searchIssue(owner, repository, condition, filter, userName, (page - 1) * IssueLimit, IssueLimit),
page,
getLabels(owner, repository),
getMilestones(owner, repository).filter(_.closedDate.isEmpty),
countIssue(owner, repository, condition.copy(state = "open"), filter, userName),
@@ -124,7 +133,10 @@ trait IssuesControllerBase extends ControllerBase {
context.loginAccount.map(x => countIssue(owner, repository, condition, "assigned", Some(x.userName))),
context.loginAccount.map(x => countIssue(owner, repository, condition, "created_by", Some(x.userName))),
countIssueGroupByLabels(owner, repository, condition, filter, userName),
condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount))
condition,
filter,
repositoryInfo,
isWritable(owner, repository, context.loginAccount))
} getOrElse NotFound
}

View File

@@ -93,9 +93,12 @@ trait IssuesService {
* @param condition the search condition
* @param filter the filter type ("all", "assigned" or "created_by")
* @param userName the filter user name required for "assigned" and "created_by"
* @param offset the offset for pagination
* @param limit the limit for pagination
* @return the count of the search result
*/
def searchIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]) =
def searchIssue(owner: String, repository: String, condition: IssueSearchCondition,
filter: String, userName: Option[String], offset: Int, limit: Int): List[Issue] =
searchIssueQuery(owner, repository, condition, filter, userName).sortBy { t =>
(condition.sort match {
case "created" => t.registeredDate
@@ -107,7 +110,7 @@ trait IssuesService {
case "desc" => sort desc
}
}
} list
} drop(offset) take(limit) list
/**
* Assembles query for conditional issue searching.
@@ -164,6 +167,8 @@ object IssuesService {
import java.net.URLEncoder
import javax.servlet.http.HttpServletRequest
val IssueLimit = 1
case class IssueSearchCondition(
labels: Set[String] = Set.empty,
milestoneId: Option[Int] = None,

View File

@@ -1,4 +1,4 @@
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone],
@(issues: List[model.Issue], page: Int, labels: List[model.Label], milestones: List[model.Milestone],
openCount: Int, closedCount: Int, allCount: Int, assignedCount: Option[Int], createdByCount: Option[Int], labelCounts: Map[String, Int],
condition: service.IssuesService.IssueSearchCondition, filter: String,
repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
@@ -80,17 +80,38 @@
<i class="icon-remove-circle"></i> Clear milestone and label filters
</a>
}
<div class="pagination pull-right">
<ul>
<li class="disabled"><span>&#9664;</span></li>
<li class="active"><span>1</span></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><span>&hellip;</span></li>
<li><a href="#">7</a></li>
<li><a href="#">&#9654;</a></li>
</ul>
</div>
@defining(if(condition.state == "open") openCount else closedCount){ count =>
@if(count > service.IssuesService.IssueLimit){
<div class="pagination pull-right">
<ul>
@if(page == 1){
<li class="disabled"><span>&#9664;</span></li>
} else {
<li><a href="@condition.toURL&page=@(page - 1)">&#9664;</a></li>
}
@for(i <- 1 to (count - 1) / service.IssuesService.IssueLimit + 1){
@if(i == page){
<li class="active"><span>@i</span></li>
} else {
<li><a href="@condition.toURL&page=@i">@i</a></li>
}
}
@*
<li class="active"><span>1</span></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><span>&hellip;</span></li>
<li><a href="#">7</a></li>
*@
@if(page == (count - 1) / service.IssuesService.IssueLimit + 1){
<li class="disabled"><span>&#9654;</span></li>
} else {
<li><a href="@condition.toURL&page=@(page + 1)">&#9654;</a></li>
}
</ul>
</div>
}
}
<div class="btn-group">
<a class="btn@if(condition.state == "open"){ active}" href="@condition.copy(state = "open").toURL">@openCount Open</a>
<a class="btn@if(condition.state == "closed"){ active}" href="@condition.copy(state = "closed").toURL">@closedCount Closed</a>