(refs #32)Enable menu icon which is injected by plug-in

This commit is contained in:
Naoki Takezoe
2014-06-06 16:35:54 +09:00
parent b0b318ce30
commit e14a0c3770
4 changed files with 41 additions and 11 deletions

View File

@@ -2,37 +2,48 @@ package plugin
import app.Context import app.Context
import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
import javax.script.ScriptEngineManager
/** /**
* Provides extension points to plug-ins. * Provides extension points to plug-ins.
*/ */
object PluginSystem { object PluginSystem {
private val repositoryMenuList = scala.collection.mutable.ListBuffer[Menu]() private val repositoryMenuList = scala.collection.mutable.ListBuffer[RepositoryMenu]()
private val globalMenuList = scala.collection.mutable.ListBuffer[Menu]() private val globalMenuList = scala.collection.mutable.ListBuffer[GlobalMenu]()
private val actionList = scala.collection.mutable.ListBuffer[Action]() private val actionList = scala.collection.mutable.ListBuffer[Action]()
case class Menu(label: String, url: String, icon: String, condition: Context => Boolean) case class GlobalMenu(label: 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)
def addRepositoryMenu(label: String, url: String, icon: String = "")(condition: Context => Boolean): Unit = { def addRepositoryMenu(label: String, name: String, url: String, icon: String = "")(condition: Context => Boolean): Unit = {
repositoryMenuList += Menu(label, url, icon, condition) repositoryMenuList += RepositoryMenu(label, name, url, icon, condition)
} }
def addGlobalMenu(label: String, url: String, icon: String = "")(condition: Context => Boolean): Unit = { def addGlobalMenu(label: String, url: String, icon: String = "")(condition: Context => Boolean): Unit = {
globalMenuList += Menu(label, url, icon, condition) globalMenuList += GlobalMenu(label, url, icon, condition)
} }
def addAction(path: String)(function: (HttpServletRequest, HttpServletResponse) => Any): Unit = { def addAction(path: String)(function: (HttpServletRequest, HttpServletResponse) => Any): Unit = {
actionList += Action(path, function) actionList += Action(path, function)
} }
lazy val repositoryMenus: List[Menu] = repositoryMenuList.toList def evaluateJavaScript(script: String): Unit = {
lazy val globalMenus: List[Menu] = globalMenuList.toList val engine = new ScriptEngineManager().getEngineByName("JavaScript")
engine.eval(script)
}
lazy val repositoryMenus: List[RepositoryMenu] = repositoryMenuList.toList
lazy val globalMenus: List[GlobalMenu] = globalMenuList.toList
lazy val actions: List[Action] = actionList.toList lazy val actions: List[Action] = actionList.toList
// TODO This is a test // TODO This is a test
addGlobalMenu("Google", "http://www.google.co.jp/"){ context => context.loginAccount.isDefined } addGlobalMenu("Google", "http://www.google.co.jp/", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEvwAABL8BkeKJvAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIgSURBVEiJtdZNiI1hFAfw36ORhSFFPgYLszOKJAsWRLGzks1gYyFZKFs7C7K2Y2XDRiwmq9kIJWQjJR9Tk48xRtTIRwjH4p473nm99yLNqdNTz/mf//+555x7ektEmEmbNaPs6OkUKKX0YBmWp6/IE8bwIs8xjEfEt0aiiJBl6sEuXMRLfEf8pX/PnIvJ0TPFWxE4+w+Ef/Kzbd5qDx5l8H8tkku7LG17gH7sxWatevdhEUoXsjda5RnDTZzH6jagtMe0lHIa23AJw3iOiSRZlmJ9mfcyfTzFl2AldmI3rkbEkbrAYKrX7S1eVRyWVnxhQ87eiLjQ+o2/mtyve+PuYy3W4+EfsP2/TVGKTHRI+Iz9Fdx8XOmAnZjGWRMYqoF/4ESW4hpOYk1iZ2WsLjDUTeBYBfgeuyux2XiNT5hXud+DD5W8Y90EtifoSfultfjx7MVtrKzcr8No5m7vJtCLx1hQJ8/4IZzClpyoy5ibsYUYQW81Z9o2jYgPeKr15+poEXE9+1XF9WIkOaasaV2P4k4pZUdDbEm+VEQcjIgtEfGxlLIVd/Gs6TX1MhzQquU3HK1t23f4IsuS94fxNXMO/MbXIDBg+tidw5yMbcCmylSdqWEH/kagYLKWeAt9Fcxi3KhhJuXq6SqQBMO15NDalvswmLWux4cbuToIbMS9BpJOfg8bm7imtmmTlVJWaa3hpnU9nufziBjtyDHTny0/AaA7Qnb4AM4aAAAAAElFTkSuQmCC")
{ context => context.loginAccount.isDefined }
addRepositoryMenu("Board", "board", "/board", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEvwAABL8BkeKJvAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIgSURBVEiJtdZNiI1hFAfw36ORhSFFPgYLszOKJAsWRLGzks1gYyFZKFs7C7K2Y2XDRiwmq9kIJWQjJR9Tk48xRtTIRwjH4p473nm99yLNqdNTz/mf//+555x7ektEmEmbNaPs6OkUKKX0YBmWp6/IE8bwIs8xjEfEt0aiiJBl6sEuXMRLfEf8pX/PnIvJ0TPFWxE4+w+Ef/Kzbd5qDx5l8H8tkku7LG17gH7sxWatevdhEUoXsjda5RnDTZzH6jagtMe0lHIa23AJw3iOiSRZlmJ9mfcyfTzFl2AldmI3rkbEkbrAYKrX7S1eVRyWVnxhQ87eiLjQ+o2/mtyve+PuYy3W4+EfsP2/TVGKTHRI+Iz9Fdx8XOmAnZjGWRMYqoF/4ESW4hpOYk1iZ2WsLjDUTeBYBfgeuyux2XiNT5hXud+DD5W8Y90EtifoSfultfjx7MVtrKzcr8No5m7vJtCLx1hQJ8/4IZzClpyoy5ibsYUYQW81Z9o2jYgPeKr15+poEXE9+1XF9WIkOaasaV2P4k4pZUdDbEm+VEQcjIgtEfGxlLIVd/Gs6TX1MhzQquU3HK1t23f4IsuS94fxNXMO/MbXIDBg+tidw5yMbcCmylSdqWEH/kagYLKWeAt9Fcxi3KhhJuXq6SqQBMO15NDalvswmLWux4cbuToIbMS9BpJOfg8bm7imtmmTlVJWaa3hpnU9nufziBjtyDHTny0/AaA7Qnb4AM4aAAAAAElFTkSuQmCC")
{ context => true}
addAction("/hello"){ (request, response) => addAction("/hello"){ (request, response) =>
"Hello World!" "Hello World!"

View File

@@ -62,7 +62,7 @@
<a href="@url(loginAccount.get.userName)/_edit" class="menu" data-toggle="tooltip" data-placement="bottom" title="Account settings"><i class="icon-user"></i></a> <a href="@url(loginAccount.get.userName)/_edit" class="menu" data-toggle="tooltip" data-placement="bottom" title="Account settings"><i class="icon-user"></i></a>
@plugin.PluginSystem.globalMenus.map { menu => @plugin.PluginSystem.globalMenus.map { menu =>
@if(menu.condition(context)){ @if(menu.condition(context)){
<a href="@menu.url" class="menu" data-toggle="tooltip" data-placement="bottom" title="@menu.label">@menu.label</a> <a href="@menu.url" class="menu" data-toggle="tooltip" data-placement="bottom" title="@menu.label">@if(menu.icon.nonEmpty){<img src="@menu.icon" class="plugin-global-menu"/>} else {@menu.label}</a>
} }
} }
@if(loginAccount.get.isAdmin){ @if(loginAccount.get.isAdmin){
@@ -72,7 +72,7 @@
} else { } else {
@plugin.PluginSystem.globalMenus.map { menu => @plugin.PluginSystem.globalMenus.map { menu =>
@if(menu.condition(context)){ @if(menu.condition(context)){
<a href="@menu.url" class="menu" data-toggle="tooltip" data-placement="bottom" title="@menu.label">@menu.label</a> <a href="@menu.url" class="menu" data-toggle="tooltip" data-placement="bottom" title="@menu.label">@if(menu.icon.nonEmpty){<img src="@menu.icon" class="plugin-global-menu"/>} else {@menu.label}</a>
} }
} }
<a href="@path/signin?redirect=@urlEncode(currentPath)" class="btn btn-last" id="signin">Sign in</a> <a href="@path/signin?redirect=@urlEncode(currentPath)" class="btn btn-last" id="signin">Sign in</a>

View File

@@ -23,6 +23,13 @@
</li> </li>
} }
@sidemenuPlugin(path: String, name: String, label: String, icon: String) = {
<li @if(active == name){class="active"}>
<div class="@if(active == name){margin} else {gradient} pull-left"></div>
<a href="@url(repository)@path"><img src="@icon"/>@if(expand){ @label}</a>
</li>
}
<div class="container"> <div class="container">
@if(repository.commitCount > 0){ @if(repository.commitCount > 0){
<div class="pull-right"> <div class="pull-right">
@@ -54,6 +61,11 @@
@sidemenu("/issues", "issues", "Issues", repository.issueCount) @sidemenu("/issues", "issues", "Issues", repository.issueCount)
@sidemenu("/pulls" , "pulls" , "Pull Requests", repository.pullCount) @sidemenu("/pulls" , "pulls" , "Pull Requests", repository.pullCount)
@sidemenu("/wiki" , "wiki" , "Wiki") @sidemenu("/wiki" , "wiki" , "Wiki")
@plugin.PluginSystem.repositoryMenus.map { menu =>
@if(menu.condition(context)){
@sidemenuPlugin(menu.url, menu.label, menu.label, menu.icon)
}
}
@if(loginAccount.isDefined && (loginAccount.get.isAdmin || repository.managers.contains(loginAccount.get.userName))){ @if(loginAccount.isDefined && (loginAccount.get.isAdmin || repository.managers.contains(loginAccount.get.userName))){
@sidemenu("/settings", "settings", "Settings") @sidemenu("/settings", "settings", "Settings")
} }

View File

@@ -98,6 +98,13 @@ div.input-prepend span.count {
padding-bottom: 6px; padding-bottom: 6px;
} }
img.plugin-global-menu {
width: 16px;
height: 16px;
position: relative;
top: -2px;
}
/* ======================================================================== */ /* ======================================================================== */
/* General Styles */ /* General Styles */
/* ======================================================================== */ /* ======================================================================== */