mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-03 12:05:59 +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 =>
|
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
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user