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 => getRepository(owner, repository, baseUrl).map { repositoryInfo =>
issues.html.milestones(state, issues.html.milestones(state,
getMilestones(owner, repository), getMilestonesWithIssueCount(owner, repository),
getMilestoneIssueCounts(owner, repository),
repositoryInfo, repositoryInfo,
isWritable(owner, repository, context.loginAccount)) isWritable(owner, repository, context.loginAccount))
} getOrElse NotFound } getOrElse NotFound

View File

@@ -61,8 +61,8 @@ trait MilestonesService {
.sortBy(_.milestoneId desc) .sortBy(_.milestoneId desc)
.firstOption .firstOption
def getMilestoneIssueCounts(owner: String, repository: String): Map[(Int, Boolean), Int] = def getMilestonesWithIssueCount(owner: String, repository: String): List[(Milestone, Int, Int)] = {
Issues val counts = Issues
.filter { t => .filter { t =>
(t.userName is owner.bind) && (t.userName is owner.bind) &&
(t.repositoryName is repository.bind) && (t.repositoryName is repository.bind) &&
@@ -80,6 +80,11 @@ trait MilestonesService {
} }
.toMap .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] = def getMilestones(owner: String, repository: String): List[Milestone] =
Query(Milestones) Query(Milestones)
.filter { t => .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 context._
@import view.helpers @import view.helpers
@html.main("Milestones - " + repository.owner + "/" + repository.name){ @html.main("Milestones - " + repository.owner + "/" + repository.name){
@@ -9,13 +9,13 @@
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">
<li@if(state == "open"){ class="active"}> <li@if(state == "open"){ class="active"}>
<a href="?state=open"> <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 Open Milestones
</a> </a>
</li> </li>
<li@if(state == "closed"){ class="active"}> <li@if(state == "closed"){ class="active"}>
<a href="?state=closed"> <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 Closed Milestones
</a> </a>
</li> </li>
@@ -27,8 +27,10 @@
</div> </div>
<div class="span9"> <div class="span9">
<table class="table table-bordered table-hover"> <table class="table table-bordered table-hover">
@defining(milestones.filter(m => if(state == "open") m.closedDate.isEmpty else m.closedDate.isDefined)){ milestones => @defining(milestones.filter { case (milestone, _, _) =>
@milestones.map { milestone => milestone.closedDate.map(_ => state == "closed").getOrElse(state == "open")
}){ milestones =>
@milestones.map { case (milestone, openCount, closedCount) =>
<tr> <tr>
<td> <td>
<div class="milestone row-fluid"> <div class="milestone row-fluid">
@@ -45,37 +47,35 @@
} }
</div> </div>
<div class="span8"> <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="milestone-menu"> <div class="pull-right">
<div class="pull-right"> @if(isWritable){
@if(isWritable){ <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit @if(milestone.closedDate.isDefined){
@if(milestone.closedDate.isDefined){ <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a>
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a> } else {
} 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/close">Close</a>
}
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/delete" class="delete">Delete</a>
} }
<a href="@path/@repository.owner/@repository.name/issues?milestone=@milestone.milestoneId&state=open">Browse issues</a> <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/delete" class="delete">Delete</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"> <a href="@path/@repository.owner/@repository.name/issues?milestone=@milestone.milestoneId&state=open">Browse issues</a>
@if(closedCount == 0){
0%
} else {
@((closedCount.toDouble / (openCount + closedCount).toDouble * 100).toInt)%
}
</span>
</div> </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> </div>
} </div>
@if(milestone.description.isDefined){ @if(milestone.description.isDefined){
<div class="milestone-description"> <div class="milestone-description">
@helpers.markdown(milestone.description.get, repository, false, false, false) @helpers.markdown(milestone.description.get, repository, false, false, false)