(refs #464)Add new extension point to add buttons

This commit is contained in:
Naoki Takezoe
2014-08-10 05:42:06 +09:00
parent 098b18fe6d
commit 93536d3365
6 changed files with 38 additions and 19 deletions

View File

@@ -9,6 +9,7 @@ import util.Implicits._
import util.ControlUtil._ import util.ControlUtil._
import org.scalatra.Ok import org.scalatra.Ok
import model.Issue import model.Issue
import plugin.PluginSystem
class IssuesController extends IssuesControllerBase class IssuesController extends IssuesControllerBase
with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService
@@ -396,7 +397,8 @@ trait IssuesControllerBase extends ControllerBase {
condition, condition,
filter, filter,
repository, repository,
hasWritePermission(owner, repoName, context.loginAccount)) hasWritePermission(owner, repoName, context.loginAccount),
PluginSystem.buttons("issues"))
} }
} }

View File

@@ -14,6 +14,7 @@ trait Plugin {
def globalMenus : List[GlobalMenu] def globalMenus : List[GlobalMenu]
def repositoryActions : List[RepositoryAction] def repositoryActions : List[RepositoryAction]
def globalActions : List[Action] def globalActions : List[Action]
def buttons(name: String) : List[Button]
} }
object PluginConnectionHolder { object PluginConnectionHolder {

View File

@@ -85,6 +85,7 @@ object PluginSystem {
def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList
def repositoryActions : List[RepositoryAction] = pluginsMap.values.flatMap(_.repositoryActions).toList def repositoryActions : List[RepositoryAction] = pluginsMap.values.flatMap(_.repositoryActions).toList
def globalActions : List[Action] = pluginsMap.values.flatMap(_.globalActions).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 classes to hold plug-ins information internally in GitBucket
case class PluginRepository(id: String, url: String) case class PluginRepository(id: String, url: String)
@@ -92,6 +93,7 @@ object PluginSystem {
case class RepositoryMenu(label: String, name: String, url: String, icon: String, condition: Context => Boolean) 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 Action(path: String, function: (HttpServletRequest, HttpServletResponse) => Any)
case class RepositoryAction(path: String, function: (HttpServletRequest, HttpServletResponse, RepositoryInfo) => Any) case class RepositoryAction(path: String, function: (HttpServletRequest, HttpServletResponse, RepositoryInfo) => Any)
case class Button(label: String, href: String)
/** /**
* Checks whether the plugin is updatable. * Checks whether the plugin is updatable.

View File

@@ -1,10 +1,9 @@
package plugin package plugin
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
import scala.collection.mutable.{Map => MutableMap}
import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
import plugin.PluginSystem.GlobalMenu import plugin.PluginSystem._
import plugin.PluginSystem.Action
import plugin.PluginSystem.RepositoryAction
import app.Context import app.Context
import plugin.PluginSystem.RepositoryMenu import plugin.PluginSystem.RepositoryMenu
import service.RepositoryService.RepositoryInfo import service.RepositoryService.RepositoryInfo
@@ -19,11 +18,13 @@ class ScalaPlugin(val id: String, val version: String,
private val globalMenuList = ListBuffer[GlobalMenu]() private val globalMenuList = ListBuffer[GlobalMenu]()
private val repositoryActionList = ListBuffer[RepositoryAction]() private val repositoryActionList = ListBuffer[RepositoryAction]()
private val globalActionList = ListBuffer[Action]() private val globalActionList = ListBuffer[Action]()
private val buttonMap = MutableMap[String, ListBuffer[Button]]()
def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList
def globalMenus : List[GlobalMenu] = globalMenuList.toList def globalMenus : List[GlobalMenu] = globalMenuList.toList
def repositoryActions : List[RepositoryAction] = repositoryActionList.toList def repositoryActions : List[RepositoryAction] = repositoryActionList.toList
def globalActions : List[Action] = globalActionList.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 = { def addRepositoryMenu(label: String, name: String, url: String, icon: String)(condition: (Context) => Boolean): Unit = {
repositoryMenuList += RepositoryMenu(label, name, url, icon, condition) repositoryMenuList += RepositoryMenu(label, name, url, icon, condition)
@@ -41,6 +42,14 @@ class ScalaPlugin(val id: String, val version: String,
repositoryActionList += RepositoryAction(path, function) 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 { object ScalaPlugin {

View File

@@ -12,12 +12,13 @@
condition: service.IssuesService.IssueSearchCondition, condition: service.IssuesService.IssueSearchCondition,
filter: String, filter: String,
repository: service.RepositoryService.RepositoryInfo, repository: service.RepositoryService.RepositoryInfo,
hasWritePermission: Boolean)(implicit context: app.Context) hasWritePermission: Boolean,
buttons: List[plugin.PluginSystem.Button])(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
@html.main(s"Issues - ${repository.owner}/${repository.name}", Some(repository)){ @html.main(s"Issues - ${repository.owner}/${repository.name}", Some(repository)){
@html.menu("issues", repository){ @html.menu("issues", repository){
@tab("issues", false, repository) @tab("issues", false, repository, buttons)
<div class="row-fluid"> <div class="row-fluid">
<div class="span3"> <div class="span3">
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">

View File

@@ -1,4 +1,5 @@
@(active: String, create: Boolean, repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) @(active: String, create: Boolean, repository: service.RepositoryService.RepositoryInfo,
buttons: List[plugin.PluginSystem.Button] = Nil)(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
<ul class="nav nav-tabs pull-left fill-width"> <ul class="nav nav-tabs pull-left fill-width">
@@ -7,6 +8,9 @@
@if(loginAccount.isDefined){ @if(loginAccount.isDefined){
<li class="pull-right"> <li class="pull-right">
<div class="btn-group"> <div class="btn-group">
@buttons.map { button =>
<a class="btn btn-small" href="@button.href">@button.label</a>
}
@if(create){ @if(create){
<a class="btn btn-small btn-success" href="#" disabled="disabled">New Issue</a> <a class="btn btn-small btn-success" href="#" disabled="disabled">New Issue</a>
} else { } else {