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
**@
@import play.data.Form
@import org.apache.commons.lang3.StringUtils
@(title:String, issueForm: Form[Issue], project:Project, issueTemplate:String = "")
@import helper._
@import scala.collection.mutable.Map
@import models.enumeration.ResourceType
@import models.enumeration.Operation
@import utils.AccessControl._
@import utils.TemplateHelper._
@import controllers.UserApp
@parentIssueId = @{
play.mvc.Http.Context.current().request().getQueryString("parentIssueId")
}
@commentId = @{
play.mvc.Http.Context.current().request().getQueryString("commentId")
}
@isFromGlobalMenuNew = @{
routes.IssueApp.newDirectIssueForm().toString().equals(requestHeader.path) ||
routes.IssueApp.newDirectMyIssueForm().toString().equals(requestHeader.path)
}
@projectLayout(Messages(title), project, utils.MenuType.ISSUE) {
@projectMenu(project, utils.MenuType.ISSUE, "main-menu-only")
<div class="page-wrap-outer">
<div class="project-page-wrap">
<div class="content-wrap frm-wrap">
@form(action = routes.IssueApp.newIssue(project.owner, project.name), 'id -> "issue-form", 'enctype -> "multipart/form-data" ) {
<div class="row-fluid">
<div class="span12">
<dl>
<dd>
@defining(issueForm.errors().get("title")) { errors =>
<div class="span12">
<div class="span11">
<input type="text" id="title" name="title" value="" class="text title @if(errors != null) {error}" maxlength="250" tabindex="1" placeholder="@Messages("title")" autocomplete="off" title="@Messages("title.help.key")">
</div>
<div class="span1 subtask-message">@Messages("issue.option")</div>
</div>
@if(errors != null) {
<div class="message">
@for(error <- errors) {
<div>@Messages(error.message)</div>
}
</div>
}
@if(StringUtils.isNotEmpty(parentIssueId)) {
@partial_select_subtask(project, Long.parseLong(parentIssueId), null)
} else {
@partial_select_subtask(project, null, null)
}
}
</dd>
</dl>
</div>
<div class="row-fluid">
<div class="span9 span-left-pane">
<dl>
<dd style="position: relative;">
@if(StringUtils.isNotBlank(parentIssueId)) {
@common.editor("body", "", "tabindex=2", "content-body")
} else {
@common.editor("body", issueTemplate, "tabindex=2", "content-body")
}
</dd>
</dl>
@** fileUploader **@
@if(!UserApp.currentUser.isAnonymous) {
@common.fileUploader(ResourceType.ISSUE_POST, null)
}
@** end of fileUploader **@
<div class="actrow right-txt">
<button type="submit" id="button-save" class="ybtn ybtn-success">@Messages("button.save")</button>
<button type="button" id="draft-save-btn" class="ybtn ybtn-watching draft-save-btn">@Messages("button.draft.save")</button><!--
--><a href="javascript:history.back();" class="ybtn">@Messages("button.cancel")</a>
</div>
</div>
<div class="span3 span-hard-wrap right-menu">
@if(isProjectResourceCreatable(UserApp.currentUser(), project, ResourceType.ISSUE_ASSIGNEE)) {
<dl class="issue-option">
<dt>@Messages("issue.assignee")</dt>
<dd>
@partial_assignee(project, null)
</dd>
</dl>
}
@if(project.menuSetting.milestone && isProjectResourceCreatable(UserApp.currentUser(), project, ResourceType.ISSUE_MILESTONE)) {
<dl id="milestoneOption" class="issue-option">
<dt>@Messages("milestone")</dt>
<dd>
@defining(Milestone.findOpenMilestones(project.id)) { milestones =>
@if(milestones.isEmpty()) {
<a href="@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)"
class="ybtn ybtn-small ybtn-fullsize" target="_blank">
@Messages("milestone.menu.new")
</a>
} else {
<select id="milestoneId" name="milestoneId"
data-toggle="select2" data-format="milestone" data-container-css-class="fullsize">
<option value="@Milestone.NULL_MILESTONE_ID" selected="selected">@Messages("issue.noMilestone")</option>
@for(milestone <- milestones){
<option value="@milestone.id" data-state="@milestone.state">
@milestone.title
</option>
}
</select>
}
}
</dd>
</dl>
}
<dl class="issue-option">
<dt>@Messages("issue.dueDate")</dt>
<dd>
<div class="search search-bar">
<input type="text" id="issueDueDate" data-toggle="calendar" name="dueDate" class="textbox full">
<button type="button" class="search-btn btn-calendar"><i class="yobicon-calendar2"></i></button>
</div>
</dd>
</dl>
@partial_select_label(IssueLabel.findByProject(project), null, "issue-option", "data-close-on-select=false", project)
<input type="hidden" name="referCommentId" value="@commentId">
<input type="hidden" id="isDraft" name="isDraft" value="false">
</div>
</div>
</div>
} @** end of form **@
</div>
</div>
</div>
@common.markdown(project)
@common.select2()
@common.calendar()
<link rel="stylesheet" type="text/css" media="screen" href="@routes.IssueLabelApp.labelStyles(project.owner, project.name)">
<link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.css")">
<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.caret.min.js")"></script>
<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.js")"></script>
<script type="text/javascript" src="@routes.Assets.at("javascripts/common/yona.Subtask.js")"></script>
<script type="text/javascript" src="@routes.Assets.at("javascripts/service/yona.issue.Assginee.js")"></script>
<script type="text/jAvascript" src="@routes.Assets.at("javascripts/common/yona.TitleHeadAutoCompletion.js")"></script>
<script type="text/javascript">
$(function(){
// yobi.issue.Write
$yobi.loadModule("issue.Write", {
"sMode" : "new",
"sIssueFormURL": "@routes.IssueApp.newIssueForm(project.owner, project.name)",
"sIssueListURL": "@routes.IssueApp.issues(project.owner, project.name)",
"elTextarea" : 'textarea[data-editor-mode="content-body"]',
"elMilestoneRefresh": $("#milestoneOption .yobicon-refresh"),
"elDueDate" : $("#issueDueDate")
});
// yobi.Mention
yobi.Mention({
"target": 'textarea[id^=editor-]',
"url" : "@routes.ProjectApp.mentionList(project.owner, project.name)"
});
if(@isFromGlobalMenuNew) {
$(".subtask-message").trigger("click");
}
yonaAssgineeModule(
"@api.routes.IssueApi.findAssignableUsersOfProject(project.owner, project.name)",
"",
"@Messages("issue.assignee")"
);
yonaTitleHeadModule({
"target": 'input[id=title]',
"url" : "@api.routes.ProjectApi.titleHeads(project.owner, project.name)"
});
$('#button-save').on('click', function(){
var $this = $(this);
$this.prop('disabled', true);
setTimeout(function (){
$this.prop('disabled', false);
}, 3000);
$('#issue-form').submit();
});
tippy('#draft-save-btn', {
content: '@Messages("button.draft.save.description")',
placement: 'top',
maxWidth: 'none',
});
$('#draft-save-btn').on('click', function(){
var $this = $(this);
$this.prop('disabled', true);
setTimeout(function (){
$this.prop('disabled', false);
}, 3000);
$('#isDraft').val('true');
$('#issue-form').submit();
});
});
</script>
}