mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-11-03 20:15:59 +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>
 | 
			
		||||
      }
 | 
			
		||||
      @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>
 | 
			
		||||
          <li><a href="#">▶</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