(refs #26) Implements repository filter.

This commit is contained in:
shimamoto
2013-07-30 19:36:20 +09:00
parent b8da93912f
commit 66855e65bb
3 changed files with 30 additions and 6 deletions

View File

@@ -48,7 +48,7 @@ trait DashboardControllerBase extends ControllerBase {
countIssue(condition, Map.empty, repositories: _*), countIssue(condition, Map.empty, repositories: _*),
countIssue(condition, Map("assigned" -> userName), repositories: _*), countIssue(condition, Map("assigned" -> userName), repositories: _*),
countIssue(condition, Map("created_by" -> userName), repositories: _*), countIssue(condition, Map("created_by" -> userName), repositories: _*),
repositories, countIssueGroupByRepository(condition, filterUser, repositories: _*),
condition, condition,
filter) filter)

View File

@@ -80,6 +80,27 @@ trait IssuesService {
} }
.toMap .toMap
} }
/**
* Returns list which contains issue count for each repository.
* If the issue does not exist, its repository is not included in the result.
*
* @param condition the search condition
* @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name)
* @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)
.groupBy { t =>
t.userName ~ t.repositoryName
}
.map { case (repo, t) =>
repo ~ t.length
}
.filter (_._3 > 0.bind)
.list
}
/** /**
* Returns the search result against issues. * Returns the search result against issues.
@@ -133,7 +154,10 @@ trait IssuesService {
*/ */
private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, filterUser: Map[String, String]) = private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, filterUser: Map[String, String]) =
Query(Issues) filter { t1 => Query(Issues) filter { t1 =>
(repos.map { case (owner, repository) => t1.byRepository(owner, repository) } reduceLeft ( _ || _ ) ) && (condition.repo
.map { _.split('/') match { case array => Seq(array(0) -> array(1)) } }
.getOrElse (repos)
.map { case (owner, repository) => t1.byRepository(owner, repository) } reduceLeft ( _ || _ ) ) &&
(t1.closed is (condition.state == "closed").bind) && (t1.closed is (condition.state == "closed").bind) &&
(t1.milestoneId is condition.milestoneId.get.get.bind, condition.milestoneId.flatten.isDefined) && (t1.milestoneId is condition.milestoneId.get.get.bind, condition.milestoneId.flatten.isDefined) &&
(t1.milestoneId isNull, condition.milestoneId == Some(None)) && (t1.milestoneId isNull, condition.milestoneId == Some(None)) &&

View File

@@ -2,7 +2,7 @@
allCount: Int, allCount: Int,
assignedCount: Int, assignedCount: Int,
createdByCount: Int, createdByCount: Int,
repositories: List[(String, String)], 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._
@@ -33,10 +33,10 @@
</ul> </ul>
<hr/> <hr/>
<ul class="nav nav-pills nav-stacked small"> <ul class="nav nav-pills nav-stacked small">
@repositories.map { case (owner, name) => @repositories.map { case (owner, name, count) =>
<li> <li@if(condition.repo == Some(owner + "/" + name)){ class="active"}>
<a href="@condition.copy(repo = Some(owner + "/" + name)).toURL"> <a href="@condition.copy(repo = Some(owner + "/" + name)).toURL">
<span class="count-right">0</span> <span class="count-right">@count</span>
@owner/@name @owner/@name
</a> </a>
</li> </li>