mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 19:45:57 +01:00
Add issue pagination.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>◀</span></li>
|
||||
<li class="active"><span>1</span></li>
|
||||
<li><a href="#">2</a></li>
|
||||
<li><a href="#">3</a></li>
|
||||
<li><span>…</span></li>
|
||||
<li><a href="#">7</a></li>
|
||||
<li><a href="#">▶</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>◀</span></li>
|
||||
} else {
|
||||
<li><a href="@condition.toURL&page=@(page - 1)">◀</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>…</span></li>
|
||||
<li><a href="#">7</a></li>
|
||||
*@
|
||||
@if(page == (count - 1) / service.IssuesService.IssueLimit + 1){
|
||||
<li class="disabled"><span>▶</span></li>
|
||||
} else {
|
||||
<li><a href="@condition.toURL&page=@(page + 1)">▶</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>
|
||||
|
||||
Reference in New Issue
Block a user