diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 4f28466..07b275a 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -9,6 +9,7 @@ import util.ControlUtil._ import org.scalatra.Ok import model.Issue +import plugin.PluginSystem class IssuesController extends IssuesControllerBase with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService @@ -396,7 +397,8 @@ condition, filter, repository, - hasWritePermission(owner, repoName, context.loginAccount)) + hasWritePermission(owner, repoName, context.loginAccount), + PluginSystem.buttons("issues")) } } diff --git a/src/main/scala/plugin/Plugin.scala b/src/main/scala/plugin/Plugin.scala index 43ce373..57d2c02 100644 --- a/src/main/scala/plugin/Plugin.scala +++ b/src/main/scala/plugin/Plugin.scala @@ -10,10 +10,11 @@ val url: String val description: String - def repositoryMenus : List[RepositoryMenu] - def globalMenus : List[GlobalMenu] - def repositoryActions : List[RepositoryAction] - def globalActions : List[Action] + def repositoryMenus : List[RepositoryMenu] + def globalMenus : List[GlobalMenu] + def repositoryActions : List[RepositoryAction] + def globalActions : List[Action] + def buttons(name: String) : List[Button] } object PluginConnectionHolder { diff --git a/src/main/scala/plugin/PluginSystem.scala b/src/main/scala/plugin/PluginSystem.scala index 6ba432b..488c1b7 100644 --- a/src/main/scala/plugin/PluginSystem.scala +++ b/src/main/scala/plugin/PluginSystem.scala @@ -81,10 +81,11 @@ } } - def repositoryMenus : List[RepositoryMenu] = pluginsMap.values.flatMap(_.repositoryMenus).toList - def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList - def repositoryActions : List[RepositoryAction] = pluginsMap.values.flatMap(_.repositoryActions).toList - def globalActions : List[Action] = pluginsMap.values.flatMap(_.globalActions).toList + def repositoryMenus : List[RepositoryMenu] = pluginsMap.values.flatMap(_.repositoryMenus).toList + def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList + def repositoryActions : List[RepositoryAction] = pluginsMap.values.flatMap(_.repositoryActions).toList + def globalActions : List[Action] = pluginsMap.values.flatMap(_.globalActions).toList + def buttons(name: String) : List[Button] = pluginsMap.values.flatMap(_.buttons(name)).toList // Case classes to hold plug-ins information internally in GitBucket case class PluginRepository(id: String, url: String) @@ -92,6 +93,7 @@ case class RepositoryMenu(label: String, name: String, url: String, icon: String, condition: Context => Boolean) case class Action(path: String, function: (HttpServletRequest, HttpServletResponse) => Any) case class RepositoryAction(path: String, function: (HttpServletRequest, HttpServletResponse, RepositoryInfo) => Any) + case class Button(label: String, href: String) /** * Checks whether the plugin is updatable. diff --git a/src/main/scala/plugin/ScalaPlugin.scala b/src/main/scala/plugin/ScalaPlugin.scala index af43d94..0b2718d 100644 --- a/src/main/scala/plugin/ScalaPlugin.scala +++ b/src/main/scala/plugin/ScalaPlugin.scala @@ -1,10 +1,9 @@ package plugin import scala.collection.mutable.ListBuffer +import scala.collection.mutable.{Map => MutableMap} import javax.servlet.http.{HttpServletResponse, HttpServletRequest} -import plugin.PluginSystem.GlobalMenu -import plugin.PluginSystem.Action -import plugin.PluginSystem.RepositoryAction +import plugin.PluginSystem._ import app.Context import plugin.PluginSystem.RepositoryMenu import service.RepositoryService.RepositoryInfo @@ -19,11 +18,13 @@ private val globalMenuList = ListBuffer[GlobalMenu]() private val repositoryActionList = ListBuffer[RepositoryAction]() private val globalActionList = ListBuffer[Action]() + private val buttonMap = MutableMap[String, ListBuffer[Button]]() - def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList - def globalMenus : List[GlobalMenu] = globalMenuList.toList - def repositoryActions : List[RepositoryAction] = repositoryActionList.toList - def globalActions : List[Action] = globalActionList.toList + def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList + def globalMenus : List[GlobalMenu] = globalMenuList.toList + def repositoryActions : List[RepositoryAction] = repositoryActionList.toList + def globalActions : List[Action] = globalActionList.toList + def buttons(name: String) : List[Button] = buttonMap.get(name).map(_.toList).getOrElse(Nil) def addRepositoryMenu(label: String, name: String, url: String, icon: String)(condition: (Context) => Boolean): Unit = { repositoryMenuList += RepositoryMenu(label, name, url, icon, condition) @@ -41,6 +42,14 @@ repositoryActionList += RepositoryAction(path, function) } + def addButton(name: String, label: String, href: String): Unit = { + if(!buttonMap.contains(name)){ + buttonMap.put(name, ListBuffer[Button]()) + } + val list = buttonMap(name) + list += Button(label, href) + } + } object ScalaPlugin { diff --git a/src/main/twirl/issues/list.scala.html b/src/main/twirl/issues/list.scala.html index 0e41fba..6450eb1 100644 --- a/src/main/twirl/issues/list.scala.html +++ b/src/main/twirl/issues/list.scala.html @@ -12,12 +12,13 @@ condition: service.IssuesService.IssueSearchCondition, filter: String, repository: service.RepositoryService.RepositoryInfo, - hasWritePermission: Boolean)(implicit context: app.Context) + hasWritePermission: Boolean, + buttons: List[plugin.PluginSystem.Button])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main(s"Issues - ${repository.owner}/${repository.name}", Some(repository)){ @html.menu("issues", repository){ - @tab("issues", false, repository) + @tab("issues", false, repository, buttons)