diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala
index 71a9ec7b108..1527a036020 100644
--- a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala
+++ b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala
@@ -356,28 +356,28 @@ class Boot extends Loggable {
// All the following is related to the sitemap
val nodeManagerMenu =
- (Menu("NodeManagerHome", ++ Node management: NodeSeq) /
+ (Menu("10", ++ Node management: NodeSeq) /
"secure" / "nodeManager" / "index" >> TestAccess( ()
=> userIsAllowed("/secure/index",AuthorizationType.Node.Read) )).submenus (
- Menu("List Nodes", Nodes) /
+ Menu("10", Nodes) /
"secure" / "nodeManager" / "nodes"
>> LocGroup("nodeGroup")
- , Menu("SearchNodes", Node search) /
+ , Menu("20", Node search) /
"secure" / "nodeManager" / "searchNodes"
>> LocGroup("nodeGroup")
- , Menu("NodeDetails", Node details) /
+ , Menu("20", Node details) /
"secure" / "nodeManager" / "node"
>> LocGroup("nodeGroup")
>> Hidden
- , Menu("ManageNewNode", Pending nodes) /
+ , Menu("30", Pending nodes) /
"secure" / "nodeManager" / "manageNewNode"
>> LocGroup("nodeGroup")
- , Menu("Groups", Groups) /
+ , Menu("40", Groups) /
"secure" / "nodeManager" / "groups"
>> LocGroup("groupGroup")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Group.Read ) )
@@ -386,47 +386,47 @@ class Boot extends Loggable {
def policyMenu = {
val name = "configuration"
- (Menu(name+"ManagerHome", ++ {name.capitalize} policy: NodeSeq) /
+ (Menu("20", ++ {name.capitalize} policy: NodeSeq) /
"secure" / (name+"Manager") / "index" >> TestAccess ( ()
=> userIsAllowed("/secure/index",AuthorizationType.Configuration.Read) )).submenus (
- Menu(name+"RuleManagement", Rules) /
+ Menu("10", Rules) /
"secure" / (name+"Manager") / "ruleManagement"
>> LocGroup(name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Rule.Read ) )
- , Menu("Rule Details", Rule) /
+ , Menu("10", Rule) /
"secure" / (name+"Manager") / "ruleManagement" / "rule" / *
>> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "ruleManagement" :: Nil)}
>> LocGroup (name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index", AuthorizationType.Rule.Read) )
>> Hidden
- , Menu("Rule Category Details", Rule Category) /
+ , Menu("10", Rule Category) /
"secure" / (name+"Manager") / "ruleManagement" / "ruleCategory" / *
>> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "ruleManagement" :: Nil)}
>> LocGroup (name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Rule.Read ) )
>> Hidden
- ,Menu(name+"DirectiveManagement", Directives) /
+ ,Menu("20", Directives) /
"secure" / (name+"Manager") / "directiveManagement"
>> LocGroup(name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Directive.Read ) )
- , Menu("techniqueEditor", Techniques) /
+ , Menu("30", Techniques) /
"secure" / (name+"Manager") / "techniqueEditor"
>> LocGroup((name+"Manager"))
>> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Technique.Read))
- , Menu("Technique", Technique) /
+ , Menu("30", Technique) /
"secure" / (name+"Manager") / "techniqueEditor" / "technique" / *
>> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "techniqueEditor" :: Nil)}
>> LocGroup (name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index", AuthorizationType.Rule.Read) )
>> Hidden
- , Menu(name+"ParameterManagement", Parameters) /
+ , Menu("40", Parameters) /
"secure" / (name+"Manager") / "parameterManagement"
>> LocGroup(name+"Group")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Parameter.Read ) )
@@ -434,43 +434,43 @@ class Boot extends Loggable {
}
def administrationMenu =
- (Menu("AdministrationHome", ++ Administration: NodeSeq) /
+ (Menu("40", ++ Administration: NodeSeq) /
"secure" / "administration" / "index" >> TestAccess ( ()
=> userIsAllowed("/secure/index",AuthorizationType.Administration.Read, AuthorizationType.Technique.Read) )).submenus (
- Menu("Setup", Setup) /
+ Menu("10", Setup) /
"secure" / "administration" / "setup"
>> LocGroup("administrationGroup")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read ) )
- , Menu("policyServerManagement", Settings) /
+ , Menu("20", Settings) /
"secure" / "administration" / "policyServerManagement"
>> LocGroup("administrationGroup")
>> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) )
- , Menu("databaseManagement", Reports database) /
+ , Menu("30", Reports database) /
"secure" / "administration" / "databaseManagement"
>> LocGroup("administrationGroup")
>> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",AuthorizationType.Administration.Read) )
- , Menu("TechniqueLibraryManagement", Techniques tree) /
+ , Menu("40", Techniques tree) /
"secure" / "administration" / "techniqueLibraryManagement"
>> LocGroup("administrationGroup")
>> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Technique.Read ) )
- , Menu("apiManagement", API accounts) /
+ , Menu("50", API accounts) /
"secure" / "administration" / "apiManagement"
>> LocGroup("administrationGroup")
>> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",AuthorizationType.Administration.Write) )
)
def pluginsMenu = {
- (Menu("PluginsHome", ++ Plugins ++ : NodeSeq) /
+ (Menu("50 - plugins", ++ Plugins ++ : NodeSeq) /
"secure" / "plugins" / "index"
>> LocGroup("pluginsGroup")
>> TestAccess ( () => userIsAllowed("/secure/index", AuthorizationType.Administration.Read)
)) submenus (
- Menu("pluginInformation", Plugin information) /
+ Menu("0", Plugin information) /
"secure" / "plugins" / "pluginInformation"
>> LocGroup("pluginsGroup")
>> TestAccess ( () => userIsAllowed("/secure/index", AuthorizationType.Administration.Read) )
@@ -481,7 +481,7 @@ class Boot extends Loggable {
// if we can't get the workflow property, default to false
// (don't give rights if you don't know)
def workflowEnabled = RudderConfig.configService.rudder_workflow_enabled().either.runNow.getOrElse(false)
- (Menu("UtilitiesHome", ++ Utilities: NodeSeq) /
+ (Menu("30", ++ Utilities: NodeSeq) /
"secure" / "utilities" / "index" >>
TestAccess ( () =>
if ((workflowEnabled && (CurrentUser.checkRights(AuthorizationType.Validator.Read) || CurrentUser.checkRights(AuthorizationType.Deployer.Read))) || CurrentUser.checkRights(AuthorizationType.Administration.Read) || CurrentUser.checkRights(AuthorizationType.Technique.Read))
@@ -490,16 +490,16 @@ class Boot extends Loggable {
Full(RedirectWithState("/secure/index", redirection))
)).submenus (
- Menu("archivesManagement", Archives) /
+ Menu("10", Archives) /
"secure" / "utilities" / "archiveManagement"
>> LocGroup("utilitiesGroup")
>> TestAccess ( () => userIsAllowed("/secure/utilities/eventLogs",AuthorizationType.Administration.Write) )
- , Menu("eventLogViewer", Event logs) /
+ , Menu("20", Event logs) /
"secure" / "utilities" / "eventLogs"
>> LocGroup("utilitiesGroup")
>> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) )
- , Menu("healthCheckHome", Health check) /
+ , Menu("30", Health check) /
"secure" / "utilities" / "healthcheck"
>> LocGroup("utilitiesGroup")
>> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) )
@@ -507,7 +507,7 @@ class Boot extends Loggable {
}
val rootMenu = List(
- Menu("Dashboard", ++ Dashboard: NodeSeq) / "secure" / "index"
+ Menu("0", ++ Dashboard: NodeSeq) / "secure" / "index"
, Menu("Login") / "index" >> Hidden
, Menu("Templates") / "templates" / ** >> Hidden //allows access to html file use by js
, nodeManagerMenu
diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala
index 4c5a50b7eb6..1ed17eba411 100644
--- a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala
+++ b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala
@@ -184,7 +184,6 @@ import com.typesafe.config.ConfigException
import com.typesafe.config.ConfigFactory
import com.unboundid.ldap.sdk.DN
import com.unboundid.ldap.sdk.RDN
-import cron4s.expr.CronExpr
import net.liftweb.common.Loggable
import net.liftweb.common._
import org.apache.commons.io.FileUtils
diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala
index 9c05f88890c..8d0daba4803 100644
--- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala
+++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala
@@ -121,14 +121,26 @@ trait DefaultPluginDef extends RudderPluginDef {
* interaction with Rudder menu (at the risk of breaking it).
*/
def pluginMenuEntry: Option[Menu] = None
+ def pluginMenuParent: Option[Menu] = None
override def updateSiteMap(menus:List[Menu]) : List[Menu] = {
pluginMenuEntry match {
case None => menus
case Some(menu) =>
- menus.map {
- case m@Menu(l, _* ) if(l.name == "PluginsHome") =>
- Menu(l , (m.kids.toSeq :+ menu):_* )
+ val (parentName, updatedMenu) = pluginMenuParent match {
+ case None => ("90", menus)
+ case Some(parentMenu) =>
+ val name = parentMenu.loc.name
+ val menu = if (menus.exists (_.loc.name == name )) {
+ menus
+ } else {
+ (parentMenu :: menus).sortBy(_.loc.name.toIntOption.getOrElse(Int.MaxValue))
+ }
+ (name,menu)
+ }
+ updatedMenu.map {
+ case m@Menu(l, _* ) if(l.name == parentName) =>
+ Menu(l , (m.kids :+ menu).sortBy(_.loc.name.toIntOption.getOrElse(Int.MaxValue)):_* )
case m => m
}
}