File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
@**
* Yona, 21st Century Project Hosting SW
*
* Copyright Yona & Yobi Authors & NAVER Corp. & NAVER LABS Corp.
* https://yona.io
**@
@(title: String, milestones: List[models.Milestone], project: Project, param: MilestoneApp.MilestoneCondition)
@import scala.collection.immutable._
@import utils.TemplateHelper._
@import models.enumeration.ResourceType
@import models.enumeration.Operation
@import utils.AccessControl._
<link rel="stylesheet" href="@routes.IssueLabelApp.labelStyles(project.owner, project.name)" type="text/css" />
@urlToList = {@routes.MilestoneApp.milestones(project.owner, project.name)}
@makeFilterLink(fieldName:String, orderBy:String, orderDir:String, fieldText:String) = {
@if(orderBy.equals(fieldName)) {
<a href="@urlToList?orderBy=@fieldName&orderDir=@if(orderDir.equals("desc")){asc}else{desc}&state=@param.state" class="filter active"><i class="ico btn-gray-arrow @if(orderDir.equals("desc")){ down }"></i>@fieldText</a>
} else {
<a href="@urlToList?orderBy=@fieldName&orderDir=asc&state=@param.state" class="filter"><i class="ico btn-gray-arrow"></i>@fieldText</a>
}
}
@makeMilestoneListLink(_state: String) = @{
buildQueryString(routes.MilestoneApp.milestones(project.owner, project.name),
Map("state"->_state)
)
}
@projectLayout(project.name + " - " + title, project, utils.MenuType.MILESTONE) {
@projectMenu(project, utils.MenuType.MILESTONE, "")
<div class="page-wrap-outer">
<div class="project-page-wrap">
<div class="tab-wrap">
@if(isProjectResourceCreatable(UserApp.currentUser(), project, ResourceType.MILESTONE)) {
<div class="pull-right btns">
<a href="@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)" class="ybtn ybtn-success">@Messages("milestone.menu.new")</a>
</div>
}
<ul class="nav nav-tabs">
<li class="@if(param.state.equals("open")){active}">
<a href="@makeMilestoneListLink("open")">@Messages("milestone.state.open")</a>
</li>
<li class="@if(param.state.equals("closed")){active}">
<a href="@makeMilestoneListLink("closed")">@Messages("milestone.state.closed")</a>
</li>
<li class="@if(param.state.equals("all")){active}">
<a href="@makeMilestoneListLink("all")">@Messages("milestone.state.all")</a>
</li>
</ul>
</div>
@if(milestones == null || milestones.isEmpty){
<div class="error-wrap">
<i class="ico ico-err1"></i>
<p>@Messages("milestone.is.empty")</p>
</div>
} else {
<div class="filter-wrap milestone">
@if(milestones.length > 1){
<div class="filters">
@makeFilterLink("dueDate", param.orderBy, param.orderDir, Messages("common.order.dueDate"))
@makeFilterLink("completionRate", param.orderBy, param.orderDir, Messages("common.order.completionRate"))
</div>
<div class="pull-left search search-bar">
<input name="filter" class="textbox" type="text" placeholder="@Messages("search.title")" value="">
<button type="submit" class="search-btn"><i class="yobicon-search"></i></button>
</div>
}
</div>
<div class="row-fluid">
<div>
<ul class="milestones">
@for(milestone <- milestones){
<li class="milestone">
<div class="infos">
<div class="meta-info">
<strong class="version"></strong>
<a href="@routes.MilestoneApp.milestone(project.owner, project.name, milestone.id)" class="milestone-name">@milestone.title</a>
<span class="sp">|</span>
<span class="issue-item">@milestone.getNumClosedIssues / @(milestone.getNumOpenIssues + milestone.getNumClosedIssues)</span>
@if(milestone.state != State.CLOSED) {
@if(param.state.equals("all")) {
<span class="sp">|</span>
<span class="state nm open">@Messages("milestone.state." + milestone.state.state)</span>
}
@if(milestone.dueDate != null) {
<span class="sp">|</span>
<span class="due-date @if(milestone.isOverDueDate){over}">
@Messages("label.dueDate")
<strong>@milestone.getDueDateString</strong>
<span class="date">
(@milestone.until)
</span>
</span>
}
} else {
@if(param.state.equals("all")) {
<span class="sp">|</span>
<span class="state nm closed">@Messages("milestone.state." + milestone.state.state)</span>
}
@if(milestone.dueDate != null) {
<span class="sp">|</span>
<span class="due-date ml5">
@Messages("label.dueDate")
<strong>@milestone.getDueDateString</strong>
</span>
}
}
<div class="pull-right">
<span class="number completion-rate">@if(milestone.getNumOpenIssues + milestone.getNumClosedIssues > 0) { @milestone.getCompletionRate % }</span>
</div>
</div>
<div class="progress-wrap">
<div class="progress progress-success">
<div class="bar" style="width: @milestone.getCompletionRate%;"></div>
</div>
</div>
</div>
<div>
<div></div>
<div>
@for(issue <- Issue.findOpenIssuesByMilestone(milestone)){
<a class="issue-link" href="@routes.IssueApp.issue(project.owner, project.name, issue.getNumber)" target="_blank">
<div class="issue-item">
<span class="state-label open">
</span>
<span class="item-name">
<span class="number">#@issue.getNumber</span>
@issue.title
@if(issue.assignee != null){
- @issue.assignee.user.name
}
@for(label <- issue.labels.toList.sortBy(r => (r.category.name, r.name))) {
<a href="#" class="label issue-label list-label active" data-category-id="@label.category.id" data-label-id="@label.id">@label.name</a>
}
</span>
</div>
</a>
}
</div>
<div></div>
<div>
@for(issue <- Issue.findClosedIssuesByMilestone(milestone)){
<a class="issue-link" href="@routes.IssueApp.issue(project.owner, project.name, issue.getNumber)" target="_blank">
<div class="issue-item">
<span class="state-label closed">
<i class=" yobicon-checkmark"></i>
</span>
<span class="item-name">
<span class="number">#@issue.getNumber</span>
@issue.title
@if(issue.assignee != null){
- @issue.assignee.user.name
}
@for(label <- issue.labels.toList.sortBy(r => (r.category.name, r.name))) {
<a href="#" class="label issue-label list-label active" data-category-id="@label.category.id" data-label-id="@label.id">@label.name</a>
}
</span>
</div>
</a>
}
</div>
</div>
</li>
}
</ul>
</div>
</div>
}
</div>
</div>
@if(project.menuSetting.milestone) {
<script type="text/javascript">
$(document).ready(function () {
// search by keyword
$(".textbox").on("keyup", function() {
var value = $(this).val().toLowerCase().trim();
$(".issue-link").each(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) !== -1);
});
});
yobi.ShortcutKey.setKeymapLink({
"N": "@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)"
});
});
</script>
}
}