mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-01 11:06:06 +01:00
(refs #2)'Pull Requests' tab in dashboard has been completed.
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)) &&
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user