MilestonesService provides a method which returns milestones with issue count.

This commit is contained in:
takezoe
2013-06-27 02:35:24 +09:00
parent 38d51ccf90
commit 333c4f08d4
3 changed files with 39 additions and 35 deletions

View File

@@ -28,8 +28,7 @@ trait MilestonesControllerBase extends ControllerBase {
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
issues.html.milestones(state,
getMilestones(owner, repository),
getMilestoneIssueCounts(owner, repository),
getMilestonesWithIssueCount(owner, repository),
repositoryInfo,
isWritable(owner, repository, context.loginAccount))
} getOrElse NotFound

View File

@@ -61,8 +61,8 @@ trait MilestonesService {
.sortBy(_.milestoneId desc)
.firstOption
def getMilestoneIssueCounts(owner: String, repository: String): Map[(Int, Boolean), Int] =
Issues
def getMilestonesWithIssueCount(owner: String, repository: String): List[(Milestone, Int, Int)] = {
val counts = Issues
.filter { t =>
(t.userName is owner.bind) &&
(t.repositoryName is repository.bind) &&
@@ -80,6 +80,11 @@ trait MilestonesService {
}
.toMap
getMilestones(owner, repository).map { milestone =>
(milestone, counts.getOrElse((milestone.milestoneId, false), 0), counts.getOrElse((milestone.milestoneId, true), 0))
}
}
def getMilestones(owner: String, repository: String): List[Milestone] =
Query(Milestones)
.filter { t =>

View File

@@ -1,4 +1,4 @@
@(state: String, milestones: List[model.Milestone], counts: Map[(Int, Boolean), Int], repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
@(state: String, milestones: List[(model.Milestone, Int, Int)], repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
@import context._
@import view.helpers
@html.main("Milestones - " + repository.owner + "/" + repository.name){
@@ -9,13 +9,13 @@
<ul class="nav nav-pills nav-stacked">
<li@if(state == "open"){ class="active"}>
<a href="?state=open">
<span class="count-right">@milestones.filter(_.closedDate.isEmpty).size</span>
<span class="count-right">@milestones.filter(_._1.closedDate.isEmpty).size</span>
Open Milestones
</a>
</li>
<li@if(state == "closed"){ class="active"}>
<a href="?state=closed">
<span class="count-right">@milestones.filter(_.closedDate.isDefined).size</span>
<span class="count-right">@milestones.filter(_._1.closedDate.isDefined).size</span>
Closed Milestones
</a>
</li>
@@ -27,8 +27,10 @@
</div>
<div class="span9">
<table class="table table-bordered table-hover">
@defining(milestones.filter(m => if(state == "open") m.closedDate.isEmpty else m.closedDate.isDefined)){ milestones =>
@milestones.map { milestone =>
@defining(milestones.filter { case (milestone, _, _) =>
milestone.closedDate.map(_ => state == "closed").getOrElse(state == "open")
}){ milestones =>
@milestones.map { case (milestone, openCount, closedCount) =>
<tr>
<td>
<div class="milestone row-fluid">
@@ -45,37 +47,35 @@
}
</div>
<div class="span8">
@defining((counts.getOrElse((milestone.milestoneId, true), 0), counts.getOrElse((milestone.milestoneId, false), 0))) { case (closedCount, openCount) =>
<div class="milestone-menu">
<div class="pull-right">
@if(isWritable){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit
@if(milestone.closedDate.isDefined){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a>
} else {
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/close">Close</a>
}
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/delete" class="delete">Delete</a>
<div class="milestone-menu">
<div class="pull-right">
@if(isWritable){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit
@if(milestone.closedDate.isDefined){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a>
} else {
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/close">Close</a>
}
<a href="@path/@repository.owner/@repository.name/issues?milestone=@milestone.milestoneId&state=open">Browse issues</a>
</div>
<span class="muted">@closedCount closed - @openCount open</span>
</div>
<div class="milestone-progress">
@if(closedCount > 0){
<span class="milestone-progress" style="width: @((closedCount.toDouble / (openCount + closedCount).toDouble * 100).toInt)%;"></span>
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/delete" class="delete">Delete</a>
}
<span class="milestone-percentage">
@if(closedCount == 0){
0%
} else {
@((closedCount.toDouble / (openCount + closedCount).toDouble * 100).toInt)%
}
</span>
<a href="@path/@repository.owner/@repository.name/issues?milestone=@milestone.milestoneId&state=open">Browse issues</a>
</div>
<span class="muted">@closedCount closed - @openCount open</span>
</div>
<div class="milestone-progress">
@if(closedCount > 0){
<span class="milestone-progress" style="width: @((closedCount.toDouble / (openCount + closedCount).toDouble * 100).toInt)%;"></span>
}
<span class="milestone-percentage">
@if(closedCount == 0){
0%
} else {
@((closedCount.toDouble / (openCount + closedCount).toDouble * 100).toInt)%
}
</span>
</div>
</div>
}
</div>
@if(milestone.description.isDefined){
<div class="milestone-description">
@helpers.markdown(milestone.description.get, repository, false, false, false)