diff --git a/src/main/scala/app/DashboardController.scala b/src/main/scala/app/DashboardController.scala index fcce6c0..038f8c3 100644 --- a/src/main/scala/app/DashboardController.scala +++ b/src/main/scala/app/DashboardController.scala @@ -23,11 +23,19 @@ }) get("/dashboard/pulls")(usersOnly { - searchPullRequests("created_by") + searchPullRequests("created_by", None) + }) + + get("/dashboard/pulls/owned")(usersOnly { + searchPullRequests("created_by", None) }) get("/dashboard/pulls/public")(usersOnly { - searchPullRequests("all") + searchPullRequests("not_created_by", None) + }) + + get("/dashboard/pulls/for/:owner/:repository")(usersOnly { + searchPullRequests("all", Some(params("owner") + "/" + params("repository"))) }) private def searchIssues(filter: String) = { @@ -56,21 +64,24 @@ countIssue(condition, Map.empty, false, repositories: _*), countIssue(condition, Map("assigned" -> userName), false, repositories: _*), countIssue(condition, Map("created_by" -> userName), false, repositories: _*), - countIssueGroupByRepository(condition, filterUser, repositories: _*), + countIssueGroupByRepository(condition, filterUser, false, repositories: _*), condition, filter) } - private def searchPullRequests(filter: String) = { + private def searchPullRequests(filter: String, repository: Option[String]) = { import IssuesService._ import PullRequestService._ // condition val sessionKey = "dashboard/pulls" - val condition = if(request.getQueryString == null) - session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] - else IssueSearchCondition(request) + val condition = { + if(request.getQueryString == null) + session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] + else + IssueSearchCondition(request) + }.copy(repo = repository) session.put(sessionKey, condition) @@ -79,15 +90,24 @@ val filterUser = Map(filter -> userName) val page = IssueSearchCondition.page(request) + val counts = countIssueGroupByRepository( + IssueSearchCondition().copy(state = condition.state), Map.empty, true, repositories: _*) + + getRepositoryNamesOfUser(userName).map { repoName => + (userName, repoName, counts.collectFirst { case (_, repoName, count) => count }) + } + dashboard.html.pulls( pulls.html.listparts( searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, repositories: _*), page, - countIssue(condition.copy(state = "open"), filterUser, false, repositories: _*), - countIssue(condition.copy(state = "closed"), filterUser, false, repositories: _*), + countIssue(condition.copy(state = "open"), filterUser, true, repositories: _*), + countIssue(condition.copy(state = "closed"), filterUser, true, repositories: _*), condition), - countIssue(condition, Map.empty, true, repositories: _*), - getPullRequestCount(condition.state == "closed", userName, None), + getPullRequestCountGroupByUser(condition.state == "closed", userName, None), + getRepositoryNamesOfUser(userName).map { RepoName => + (userName, RepoName, counts.collectFirst { case (_, RepoName, count) => count }.getOrElse(0)) + }.sortBy(_._3).reverse, condition, filter) diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index efc3213..ab89181 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -386,7 +386,7 @@ pulls.html.list( searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), - getPullRequestCount(condition.state == "closed", owner, Some(repoName)), + getPullRequestCountGroupByUser(condition.state == "closed", owner, Some(repoName)), userName, page, countIssue(condition.copy(state = "open"), filterUser, true, owner -> repoName), diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 46706d0..8dde330 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -88,19 +88,21 @@ * * @param condition the search condition * @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name) + * @param onlyPullRequest if true then returns only pull request, false then returns both of issue and pull request. * @param repos Tuple of the repository owner and the repository name * @return list which contains issue count for each repository */ def countIssueGroupByRepository( - condition: IssueSearchCondition, filterUser: Map[String, String], repos: (String, String)*): List[(String, String, Int)] = { - searchIssueQuery(repos, condition.copy(repo = None), filterUser, false) + condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean, + repos: (String, String)*): List[(String, String, Int)] = { + searchIssueQuery(repos, condition.copy(repo = None), filterUser, onlyPullRequest) .groupBy { t => t.userName ~ t.repositoryName } .map { case (repo, t) => repo ~ t.length } - .filter (_._3 > 0.bind) + .sortBy(_._3 desc) .list } @@ -108,7 +110,7 @@ * Returns the search result against issues. * * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name) + * @param filterUser the filter user name (key is "all", "assigned", "created_by" or "not_created_by", value is the user name) * @param onlyPullRequest if true then returns only pull request, false then returns both of issue and pull request. * @param offset the offset for pagination * @param limit the limit for pagination @@ -172,6 +174,7 @@ (t1.milestoneId isNull, condition.milestoneId == Some(None)) && (t1.assignedUserName is filterUser("assigned").bind, filterUser.get("assigned").isDefined) && (t1.openedUserName is filterUser("created_by").bind, filterUser.get("created_by").isDefined) && + (t1.openedUserName isNot filterUser("not_created_by").bind, filterUser.get("not_created_by").isDefined) && (t1.pullRequest is true.bind, onlyPullRequest) && (IssueLabels filter { t2 => (t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) && diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index bc2cf52..4a0abf7 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -18,7 +18,7 @@ } else None } - def getPullRequestCount(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] = + def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] = Query(PullRequests) .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } .filter { case (t1, t2) => @@ -28,9 +28,9 @@ } .groupBy { case (t1, t2) => t2.openedUserName } .map { case (userName, t) => userName ~ t.length } + .sortBy(_._2 desc) .list .map { x => PullRequestCount(x._1, x._2) } - .sortBy(_.count).reverse def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int, originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String, diff --git a/src/main/twirl/dashboard/pulls.scala.html b/src/main/twirl/dashboard/pulls.scala.html index a2139c2..4ffc18f 100644 --- a/src/main/twirl/dashboard/pulls.scala.html +++ b/src/main/twirl/dashboard/pulls.scala.html @@ -1,6 +1,6 @@ @(listparts: twirl.api.Html, - allCount: Int, counts: List[service.PullRequestService.PullRequestCount], + repositories: List[(String, String, Int)], condition: service.IssuesService.IssueSearchCondition, filter: String)(implicit context: app.Context) @import context._ @@ -10,30 +10,28 @@