(refs #2)'Pull Requests' tab in dashboard has been completed.

This commit is contained in:
takezoe
2013-08-07 03:31:26 +09:00
parent 908931b9ed
commit 1ebf4276e7
5 changed files with 53 additions and 32 deletions

View File

@@ -23,11 +23,19 @@ trait DashboardControllerBase extends ControllerBase {
}) })
get("/dashboard/pulls")(usersOnly { 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 { 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) = { private def searchIssues(filter: String) = {
@@ -56,21 +64,24 @@ trait DashboardControllerBase extends ControllerBase {
countIssue(condition, Map.empty, false, repositories: _*), countIssue(condition, Map.empty, false, repositories: _*),
countIssue(condition, Map("assigned" -> userName), false, repositories: _*), countIssue(condition, Map("assigned" -> userName), false, repositories: _*),
countIssue(condition, Map("created_by" -> userName), false, repositories: _*), countIssue(condition, Map("created_by" -> userName), false, repositories: _*),
countIssueGroupByRepository(condition, filterUser, repositories: _*), countIssueGroupByRepository(condition, filterUser, false, repositories: _*),
condition, condition,
filter) filter)
} }
private def searchPullRequests(filter: String) = { private def searchPullRequests(filter: String, repository: Option[String]) = {
import IssuesService._ import IssuesService._
import PullRequestService._ import PullRequestService._
// condition // condition
val sessionKey = "dashboard/pulls" val sessionKey = "dashboard/pulls"
val condition = if(request.getQueryString == null) val condition = {
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] if(request.getQueryString == null)
else IssueSearchCondition(request) session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
else
IssueSearchCondition(request)
}.copy(repo = repository)
session.put(sessionKey, condition) session.put(sessionKey, condition)
@@ -79,15 +90,24 @@ trait DashboardControllerBase extends ControllerBase {
val filterUser = Map(filter -> userName) val filterUser = Map(filter -> userName)
val page = IssueSearchCondition.page(request) 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( dashboard.html.pulls(
pulls.html.listparts( pulls.html.listparts(
searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, repositories: _*), searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, repositories: _*),
page, page,
countIssue(condition.copy(state = "open"), filterUser, false, repositories: _*), countIssue(condition.copy(state = "open"), filterUser, true, repositories: _*),
countIssue(condition.copy(state = "closed"), filterUser, false, repositories: _*), countIssue(condition.copy(state = "closed"), filterUser, true, repositories: _*),
condition), condition),
countIssue(condition, Map.empty, true, repositories: _*), getPullRequestCountGroupByUser(condition.state == "closed", userName, None),
getPullRequestCount(condition.state == "closed", userName, None), getRepositoryNamesOfUser(userName).map { RepoName =>
(userName, RepoName, counts.collectFirst { case (_, RepoName, count) => count }.getOrElse(0))
}.sortBy(_._3).reverse,
condition, condition,
filter) filter)

View File

@@ -386,7 +386,7 @@ trait PullRequestsControllerBase extends ControllerBase {
pulls.html.list( pulls.html.list(
searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), 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, userName,
page, page,
countIssue(condition.copy(state = "open"), filterUser, true, owner -> repoName), countIssue(condition.copy(state = "open"), filterUser, true, owner -> repoName),

View File

@@ -88,19 +88,21 @@ trait IssuesService {
* *
* @param condition the search condition * @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" 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 * @param repos Tuple of the repository owner and the repository name
* @return list which contains issue count for each repository * @return list which contains issue count for each repository
*/ */
def countIssueGroupByRepository( def countIssueGroupByRepository(
condition: IssueSearchCondition, filterUser: Map[String, String], repos: (String, String)*): List[(String, String, Int)] = { condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
searchIssueQuery(repos, condition.copy(repo = None), filterUser, false) repos: (String, String)*): List[(String, String, Int)] = {
searchIssueQuery(repos, condition.copy(repo = None), filterUser, onlyPullRequest)
.groupBy { t => .groupBy { t =>
t.userName ~ t.repositoryName t.userName ~ t.repositoryName
} }
.map { case (repo, t) => .map { case (repo, t) =>
repo ~ t.length repo ~ t.length
} }
.filter (_._3 > 0.bind) .sortBy(_._3 desc)
.list .list
} }
@@ -108,7 +110,7 @@ trait IssuesService {
* Returns the search result against issues. * Returns the search result against issues.
* *
* @param condition the search condition * @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 onlyPullRequest if true then returns only pull request, false then returns both of issue and pull request.
* @param offset the offset for pagination * @param offset the offset for pagination
* @param limit the limit for pagination * @param limit the limit for pagination
@@ -172,6 +174,7 @@ trait IssuesService {
(t1.milestoneId isNull, condition.milestoneId == Some(None)) && (t1.milestoneId isNull, condition.milestoneId == Some(None)) &&
(t1.assignedUserName is filterUser("assigned").bind, filterUser.get("assigned").isDefined) && (t1.assignedUserName is filterUser("assigned").bind, filterUser.get("assigned").isDefined) &&
(t1.openedUserName is filterUser("created_by").bind, filterUser.get("created_by").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) && (t1.pullRequest is true.bind, onlyPullRequest) &&
(IssueLabels filter { t2 => (IssueLabels filter { t2 =>
(t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) && (t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) &&

View File

@@ -18,7 +18,7 @@ trait PullRequestService { self: IssuesService =>
} else None } 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) Query(PullRequests)
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
.filter { case (t1, t2) => .filter { case (t1, t2) =>
@@ -28,9 +28,9 @@ trait PullRequestService { self: IssuesService =>
} }
.groupBy { case (t1, t2) => t2.openedUserName } .groupBy { case (t1, t2) => t2.openedUserName }
.map { case (userName, t) => userName ~ t.length } .map { case (userName, t) => userName ~ t.length }
.sortBy(_._2 desc)
.list .list
.map { x => PullRequestCount(x._1, x._2) } .map { x => PullRequestCount(x._1, x._2) }
.sortBy(_.count).reverse
def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int, def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int,
originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String, originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String,

View File

@@ -1,6 +1,6 @@
@(listparts: twirl.api.Html, @(listparts: twirl.api.Html,
allCount: Int,
counts: List[service.PullRequestService.PullRequestCount], counts: List[service.PullRequestService.PullRequestCount],
repositories: List[(String, String, Int)],
condition: service.IssuesService.IssueSearchCondition, condition: service.IssuesService.IssueSearchCondition,
filter: String)(implicit context: app.Context) filter: String)(implicit context: app.Context)
@import context._ @import context._
@@ -10,30 +10,28 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="span3"> <div class="span3">
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">
<li@if(filter == "all"){ class="active"}> <li@if(filter == "created_by"){ class="active"}>
<a href="@path/dashboard/pulls/owned@condition.toURL"> <a href="@path/dashboard/pulls/owned@condition.toURL">
<span class="count-right">@counts.find(_.userName == loginAccount.get.userName).map(_.count)</span> <span class="count-right">@counts.find(_.userName == loginAccount.get.userName).map(_.count).getOrElse(0)</span>
Yours Yours
</a> </a>
</li> </li>
<li> <li@if(filter == "not_created_by"){ class="active"}>
<a href="@path/dashboard/pulls/public@condition.toURL"> <a href="@path/dashboard/pulls/public@condition.toURL">
<span class="count-right">@allCount</span> <span class="count-right">@counts.filter(_.userName != loginAccount.get.userName).map(_.count).sum</span>
Public Public
</a> </a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
<ul class="nav nav-pills nav-stacked small"> <ul class="nav nav-pills nav-stacked small">
@counts.map { user => @repositories.map { case (owner, name, count) =>
@if(user.userName != loginAccount.get.userName){ <li@if(condition.repo == Some(owner + "/" + name)){ class="active"}>
<li> <a href="@path/dashboard/pulls/for/@owner/@name">
<a href="@path/dashboard/@user.userName@condition.toURL"> <span class="count-right">@count</span>
<span class="count-right">@user.count</span> @owner/@name
@user.userName </a>
</a> </li>
</li>
}
} }
</ul> </ul>
</div> </div>