diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 8a98475..e430bb2 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -17,10 +17,9 @@ case class IssueCreateForm(title: String, content: Option[String], assignedUserName: Option[String], milestoneId: Option[Int], labelNames: Option[String]) - case class IssueEditForm(title: String, content: Option[String]) - case class CommentForm(issueId: Int, content: String) + case class IssueStateForm(issueId: Int, content: Option[String]) val issueCreateForm = mapping( "title" -> trim(label("Title", text(required))), @@ -40,6 +39,11 @@ "content" -> trim(label("Comment", text(required))) )(CommentForm.apply) + val issueStateForm = mapping( + "issueId" -> label("Issue Id", number()), + "content" -> trim(optional(text())) + )(IssueStateForm.apply) + get("/:owner/:repository/issues")(referrersOnly { searchIssues("all", _) }) @@ -124,29 +128,11 @@ }) post("/:owner/:repository/issue_comments/new", commentForm)(readableUsersOnly { (form, repository) => - val owner = repository.owner - val name = repository.name - val userName = context.loginAccount.get.userName + handleComment(form.issueId, Some(form.content), repository) + }) - getIssue(owner, name, form.issueId.toString).map { issue => - val action = if(isEditable(owner, name, issue.openedUserName)){ - params.get("action") filter { action => - updateClosed(owner, name, form.issueId, if(action == "close") true else false) > 0 - } - } else None - - val commentId = createComment(owner, name, userName, form.issueId, form.content, action) - - // record activity - recordCommentIssueActivity(owner, name, userName, issue.issueId, form.content) - action match { - case Some("reopen") => recordReopenIssueActivity(owner, name, userName, issue.issueId, issue.title) - case Some("close") => recordCloseIssueActivity(owner, name, userName, issue.issueId, issue.title) - case _ => - } - - redirect("/%s/%s/issues/%d#comment-%d".format(owner, name, form.issueId, commentId)) - } + post("/:owner/:repository/issue_comments/state", issueStateForm)(readableUsersOnly { (form, repository) => + handleComment(form.issueId, form.content, repository) }) ajaxPost("/:owner/:repository/issue_comments/edit/:id", commentForm)(readableUsersOnly { (form, repository) => @@ -272,6 +258,35 @@ private def isEditable(owner: String, repository: String, author: String)(implicit context: app.Context): Boolean = hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName + private def handleComment(issueId: Int, content: Option[String], repository: RepositoryService.RepositoryInfo) = { + val owner = repository.owner + val name = repository.name + val userName = context.loginAccount.get.userName + + getIssue(owner, name, issueId.toString) map { issue => + val (action, recordActivity) = + params.get("action") + .filter(_ => isEditable(owner, name, issue.openedUserName)) + .collect { + case s if s == "close" => true -> (Some(s) -> Some(recordCloseIssueActivity _)) + case s if s == "reopen" => false -> (Some(s) -> Some(recordReopenIssueActivity _)) + } + .map { case (closed, t) => + updateClosed(owner, name, issueId, closed) + t + } + .getOrElse(None -> None) + + val commentId = createComment(owner, name, userName, issueId, content.getOrElse(action.get.capitalize), action) + + // record activity + content foreach ( recordCommentIssueActivity(owner, name, userName, issueId, _) ) + recordActivity foreach ( _ (owner, name, userName, issueId, issue.title) ) + + redirect("/%s/%s/issues/%d#comment-%d".format(owner, name, issueId, commentId)) + } getOrElse NotFound + } + private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = { val owner = repository.owner val repoName = repository.name diff --git a/src/main/twirl/issues/issue.scala.html b/src/main/twirl/issues/issue.scala.html index 2e35ac3..c36405b 100644 --- a/src/main/twirl/issues/issue.scala.html +++ b/src/main/twirl/issues/issue.scala.html @@ -98,7 +98,7 @@ } } @if(loginAccount.isDefined){ -
+
@avatar(loginAccount.get.userName, 48)
@@ -107,9 +107,9 @@
- + @if(hasWritePermission || issue.openedUserName == loginAccount.get.userName){ - + }