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([