diff --git a/src/main/scala/gitbucket/core/controller/IssuesController.scala b/src/main/scala/gitbucket/core/controller/IssuesController.scala
index 20470e4..3b0ea78 100644
--- a/src/main/scala/gitbucket/core/controller/IssuesController.scala
+++ b/src/main/scala/gitbucket/core/controller/IssuesController.scala
@@ -417,6 +417,28 @@
}) getOrElse NotFound()
})
+ /**
+ * JSON API for issue and PR completion.
+ */
+ ajaxGet("/:owner/:repository/_issue/proposals")(writableUsersOnly { repository =>
+ contentType = formats("json")
+ org.json4s.jackson.Serialization.write(
+ Map(
+ "options" -> (
+ getOpenIssues(repository.owner, repository.name)
+ .map { t =>
+ Map(
+ "label" -> s"""${if (t.isPullRequest) ""
+ else ""} #${StringUtil
+ .escapeHtml(t.issueId.toString)} ${StringUtil.escapeHtml(t.title)}""",
+ "value" -> t.issueId.toString
+ )
+ }
+ )
+ )
+ )
+ })
+
val assignedUserName = (key: String) => params.get(key) filter (_.trim != "")
val milestoneId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt)
val priorityId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt)
diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala
index b018a29..217713d 100644
--- a/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala
+++ b/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala
@@ -57,6 +57,7 @@
private val textDecorators = new ConcurrentLinkedQueue[TextDecorator]
private val suggestionProviders = new ConcurrentLinkedQueue[SuggestionProvider]
suggestionProviders.add(new UserNameSuggestionProvider())
+ suggestionProviders.add(new IssueSuggestionProvider())
private val sshCommandProviders = new ConcurrentLinkedQueue[PartialFunction[String, Command]]()
def addPlugin(pluginInfo: PluginInfo): Unit = plugins.add(pluginInfo)
diff --git a/src/main/scala/gitbucket/core/plugin/SuggestionProvider.scala b/src/main/scala/gitbucket/core/plugin/SuggestionProvider.scala
index 32f5bff..f333486 100644
--- a/src/main/scala/gitbucket/core/plugin/SuggestionProvider.scala
+++ b/src/main/scala/gitbucket/core/plugin/SuggestionProvider.scala
@@ -91,7 +91,7 @@
* If this suggestion provider needs some additional process to assemble the proposal list (e.g. It need to use Ajax
* to get a proposal list from the server), then override this method and return any JavaScript code.
*/
- def additionalScript(implicit context: Context): String = ""
+ def additionalScript(repository: RepositoryInfo)(implicit context: Context): String = ""
}
@@ -99,6 +99,14 @@
override val id: String = "user"
override val prefix: String = "@"
override val context: Seq[String] = Seq("issues")
- override def additionalScript(implicit context: Context): String =
+ override def additionalScript(repository: RepositoryInfo)(implicit context: Context): String =
s"""$$.get('${context.path}/_user/proposals', { query: '', user: true, group: false }, function (data) { user = data.options; });"""
}
+
+class IssueSuggestionProvider extends SuggestionProvider {
+ override val id: String = "issue"
+ override val prefix: String = "#"
+ override val context: Seq[String] = Seq("issues")
+ override def additionalScript(repository: RepositoryInfo)(implicit context: Context): String =
+ s"""$$.get('${context.path}/${repository.owner}/${repository.name}/_issue/proposals', function (data) { issue = data.options; });"""
+}
diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala
index dd17c00..e38ad79 100644
--- a/src/main/scala/gitbucket/core/service/IssuesService.scala
+++ b/src/main/scala/gitbucket/core/service/IssuesService.scala
@@ -31,6 +31,9 @@
Issues filter (_.byPrimaryKey(owner, repository, issueId.toInt)) firstOption
else None
+ def getOpenIssues(owner: String, repository: String)(implicit s: Session): List[Issue] =
+ Issues filter (_.byRepository(owner, repository)) filterNot (_.closed) sortBy (_.issueId desc) list
+
def getComments(owner: String, repository: String, issueId: Int)(implicit s: Session) =
IssueComments filter (_.byIssue(owner, repository, issueId)) sortBy (_.commentId asc) list
diff --git a/src/main/twirl/gitbucket/core/helper/attached.scala.html b/src/main/twirl/gitbucket/core/helper/attached.scala.html
index 8988445..b48e95a 100644
--- a/src/main/twirl/gitbucket/core/helper/attached.scala.html
+++ b/src/main/twirl/gitbucket/core/helper/attached.scala.html
@@ -14,7 +14,7 @@
var @provider.id = @Html(helpers.json(provider.options(repository).map { case (value, label) =>
Map("value" -> value, "label" -> label)
}));
- @Html(provider.additionalScript)
+ @Html(provider.additionalScript(repository))
}
}
$('#@textareaId').textcomplete([