mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 19:45:57 +01:00
MilestonesService provides a method which returns milestones with issue count.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 =>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user