diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index d7c5141..411a449 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -107,6 +107,13 @@ 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 @@ 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 @@ 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 } diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 4d0a707..0f7434d 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -93,9 +93,12 @@ * @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 @@ case "desc" => sort desc } } - } list + } drop(offset) take(limit) list /** * Assembles query for conditional issue searching. @@ -164,6 +167,8 @@ import java.net.URLEncoder import javax.servlet.http.HttpServletRequest + val IssueLimit = 1 + case class IssueSearchCondition( labels: Set[String] = Set.empty, milestoneId: Option[Int] = None, diff --git a/src/main/twirl/issues/issues.scala.html b/src/main/twirl/issues/issues.scala.html index b42d69d..3797fa1 100644 --- a/src/main/twirl/issues/issues.scala.html +++ b/src/main/twirl/issues/issues.scala.html @@ -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 @@ Clear milestone and label filters } - + @defining(if(condition.state == "open") openCount else closedCount){ count => + @if(count > service.IssuesService.IssueLimit){ + + } + }
@openCount Open @closedCount Closed