@** * Yona, 21st Century Project Hosting SW * * Copyright Yona & Yobi Authors & NAVER Corp. & NAVER LABS Corp. * https://yona.io **@ @(title:String, issue:Issue, issueForm: play.data.Form[Issue], commentForm: play.data.Form[Comment],project:Project) @import scala.collection.mutable.ArrayBuffer @import org.apache.commons.lang.StringUtils @import models.enumeration.ResourceType @import models.enumeration.Operation @import models.Milestone @import utils.JodaDateUtil @import utils.TemplateHelper._ @import utils.AccessControl._ @import play.libs.Json.toJson @import utils.Markdown @import models.enumeration.State @import controllers.api.IssueApi @import org.apache.commons.codec.digest.DigestUtils @getTitle(issue:Issue) = @{ issue.title } @isFirstState(state:State) = {@if(issue.state.state == Issue.availableStates.get(0).state()){dirty}} @urlToIssues = @{ requestHeader.headers.get("Referer") match { case Some(u) => urlToList(u, routes.IssueApp.issues(project.owner, project.name, issue.state.state()).toString()) case _ => routes.IssueApp.issues(project.owner, project.name, "open").toString() } } @isVotedByCurrentUser = @{ issue.isVotedBy(UserApp.currentUser) } @urlToVote = @{ if(isVotedByCurrentUser){ routes.VoteApp.unvote(project.owner, project.name, issue.getNumber).toString } else { routes.VoteApp.vote(project.owner, project.name, issue.getNumber).toString } } @getVoteButtonTitle = { @if(isVotedByCurrentUser){ @Messages("issue.unvote.description") } else { @Messages("issue.vote.description") } } @titleForOGTag = @{getTitle(issue) + " |:| " + issue.body.substring(0, Math.min(issue.body.length, 200))} @parentIssueId = @{ if(issue.parent != null){ issue.parent.id } else { issue.id } } @hasAssignee = @{ issue.assigneeName != null } @hasSharer = @{ issue.sharers.size > 0 } @sharers = @{ var sharerIds = ArrayBuffer[String]() for( sharedUser <- issue.sharers ) { sharerIds += sharedUser.loginId } sharerIds.mkString(",") } @VOTER_AVATAR_SHOW_LIMIT = @{ 5 } @conatinsCurrentUserInWatchers = @{Watch.isWatching(UserApp.currentUser(), issue.asResource())} @isThisParentIssue() = @{ issue.parent == null } @amIShared() = @{ var found = false for(sharer <- issue.sharers) { if(sharer.user.id.equals(UserApp.currentUser().id)) { found = true } } found } @isFavoriteIssue = @{ FavoriteIssue.findByIssueId(UserApp.currentUser().id, issue.id) != null } @isAllowedUpdate = @{ isAllowed(UserApp.currentUser(), issue.asResource(), Operation.UPDATE) } @projectLayout(titleForOGTag, project, utils.MenuType.ISSUE){ @projectMenu(project, utils.MenuType.ISSUE, "main-menu-only")
@** Post Info **@
@agoOrDateString(issue.createdDate)
@Messages("issue.state." + issue.state.state)
@if(issue.parent != null) { subtask } @if(issue.isDraft){#@Messages("issue.state.draft")} else {@issue.getNumber} @issue.title star
@agoOrDateString(issue.createdDate) @Messages("issue.state." + issue.state.state)
@if(issue.isDraft){
@Messages("issue.draft.description")
}
@** Content body **@
@if(StringUtils.isEmpty(issue.body)){
} else {
@common.tasklistBar()
@Html(Markdown.render(issue.body, issue.project))
}
@if(isAllowed(UserApp.currentUser(), issue.asResource(), Operation.WATCH)) { } @if(isAllowedUpdate) { } @Messages("button.newSubtask") |@issue.weight
@if(isResourceCreatable(UserApp.currentUser, issue.asResource(), ResourceType.ISSUE_COMMENT)) { } else { } @if(issue.voters.size > 0) { @partial_voters(issue, 3) }
@if(issue.voters.size > 0) { @partial_voter_list("voters", issue.voters) } @if(StringUtils.isNotBlank(IssueApi.TRANSLATION_API)){ } @if(isAllowedUpdate) { } else { } @if(issue.canBeDeleted) { @if(isAllowed(UserApp.currentUser(), issue.asResource(), Operation.DELETE)) { } } else { }
@Messages("issue.sharer") @if(issue.sharers.size > 0) { @issue.sharers.size }
@if(isAllowedUpdate) { } else { @for(sharer <- issue.getSortedSharer){ } }
@if(amIShared) { @if(isThisParentIssue) { @partial_view_childIssueList(issue, project) } } else { @partial_view_childIssueList(issue, project) }
@** Comment **@ @if(!issue.isDraft) {
@partial_comments(project, issue)
@common.commentForm(issue.asResource(), ResourceType.ISSUE_COMMENT, routes.IssueApp.newComment(project.owner, project.name, issue.getNumber).toString())
@** // Comment **@ }
@****@
@if(project.menuSetting.issue) {
@Messages("button.newSubtask")
}
@Messages("issue.assignee")
@if(isAllowedUpdate) { @partial_assignee(project, issue) } else { @if(hasAssignee){ @issue.assignee.user.getDisplayName @{"@"}@issue.assignee.user.loginId } else {
@Messages("issue.noAssignee")
} }
@****@ @****@ @if(project.menuSetting.milestone) {
@Messages("milestone")
@if(Milestone.findByProjectId(project.id).isEmpty()){ @Messages("milestone.menu.new") } else { @defining(issue.milestone != null) { hasMilestone => @if(isAllowedUpdate) { } else { @if(hasMilestone){ @issue.milestone.title } else { @Messages("issue.noMilestone") } } } }
} @****@
@Messages("issue.dueDate") @if(issue.dueDate != null && issue.isOpen) { @if(issue.isOverDueDate) { (@Messages("issue.dueDate.overdue")) } else { (@issue.until) } }
@if(isAllowedUpdate) { } else { @if(issue.dueDate != null) { @issue.getDueDateString } else { @Messages("issue.noDuedate") } }
@****@ @if(!IssueLabel.findByProject(project).isEmpty){ @if(isAllowedUpdate){ @partial_select_label(IssueLabel.findByProject(project), issue.getLabelIds, "", "", project) } else { @partial_show_selected_label(issue.labels.toList, routes.IssueApp.issues(project.owner, project.name, issue.state.state(), "html", 1).toString) } }
@if(isAllowedUpdate) { } else { } @if(issue.canBeDeleted) { @if(isAllowed(UserApp.currentUser(), issue.asResource(), Operation.DELETE)) { } } else { }
@****@
@partial_index_comments(project, issue)
@** Confirm to delete post **@
@common.markdown(project) @common.commentDeleteModal() @common.select2() @common.calendar() }