Skip to content

Commit

Permalink
Completed menu construction from YAML (with icon and javascript config).
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Aug 9, 2015
1 parent 8d7620e commit 79b3ed8
Show file tree
Hide file tree
Showing 5 changed files with 141 additions and 71 deletions.
23 changes: 21 additions & 2 deletions rapidoid-html/src/main/resources/navbar.default.html
Expand Up @@ -6,11 +6,30 @@
<button data-target="#collapsable" class="navbar-toggle collapsed" data-toggle="collapse" type="button">
<span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{{home}}">{{app.title}}</a>
<a class="navbar-brand" href="{{home}}">{{app.title}} {{app.menu.items.size}}</a>
</div>

<div id="collapsable" class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-left"></ul>

{{#app.menu.items}}
<ul class="nav navbar-nav navbar-left">
<li class="dropdown">
<a{{#submenu}} class="dropdown-toggle" data-toggle="dropdown"{{/submenu}} href="{{target}}">{{caption}}{{#submenu}}<span class="caret"></span>{{/submenu}}</a>
{{#submenu}}
<ul role="menu" class="dropdown-menu">
{{#items}}
{{#javascript}}
<li><a onclick="{{javascript}}" href="javascript:void(0);">{{#icon}}<span class="{{icon}}"></span>&nbsp; {{/icon}}{{caption}}</a></li>
{{/javascript}}
{{^javascript}}
<li><a href="{{target}}">{{#icon}}<span class="{{icon}}"></span>&nbsp; {{/icon}}{{caption}}</a></li>
{{/javascript}}
{{/items}}
</ul>
{{/submenu}}
</li>
</ul>
{{/app.menu.items}}

{{^loggedIn}}
<ul class="nav navbar-nav navbar-right">
Expand Down
101 changes: 101 additions & 0 deletions rapidoid-http/src/main/java/org/rapidoid/webapp/AbstractMenuItem.java
@@ -0,0 +1,101 @@
package org.rapidoid.webapp;

/*
* #%L
* rapidoid-http
* %%
* Copyright (C) 2014 - 2015 Nikolche Mihajlovski and contributors
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/

import java.util.Map;

import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.cls.Cls;
import org.rapidoid.util.U;

@Authors("Nikolche Mihajlovski")
@Since("4.1.0")
public abstract class AbstractMenuItem {

protected String caption;

protected String target;

protected String javascript;

protected String icon;

protected final Map<String, Object> extra;

public AbstractMenuItem(String caption, Object target, Map<String, Object> extra) {
this.caption = caption;
this.extra = extra;

Object iconExtra = extra != null ? extra.get("icon") : null;
if (iconExtra != null) {
this.icon = Cls.str(iconExtra);
}

if (Cls.isSimple(target)) {
String targ = U.safe(Cls.str(target));
if (targ.startsWith("javascript:")) {
this.javascript = targ.substring(11).trim();
this.target = null;
} else {
this.target = targ.trim();
this.javascript = null;
}
}
}

public String getCaption() {
return caption;
}

public void setCaption(String caption) {
this.caption = caption;
}

public String getTarget() {
return target;
}

public String getJavascript() {
return javascript;
}

public void setJavascript(String javascript) {
this.javascript = javascript;
}

public String getIcon() {
return icon;
}

public void setIcon(String icon) {
this.icon = icon;
}

public void setTarget(String target) {
this.target = target;
}

public Map<String, Object> getExtra() {
return extra;
}

}
44 changes: 7 additions & 37 deletions rapidoid-http/src/main/java/org/rapidoid/webapp/AppMenuItem.java
Expand Up @@ -28,49 +28,17 @@

@Authors("Nikolche Mihajlovski")
@Since("4.1.0")
public class AppMenuItem {

private String caption;

private String target;
public class AppMenuItem extends AbstractMenuItem {

private AppSubMenu submenu;

private final Map<String, Object> extra;

public AppMenuItem(String caption, Object target, Map<String, Object> extra) {
this.caption = caption;
this.extra = extra;

if (Cls.isSimple(target)) {
this.target = Cls.str(target);
} else {
super(caption, target, extra);
if (!Cls.isSimple(target)) {
this.submenu = Cls.struct(AppSubMenu.class, AppSubMenuItem.class, target);
}
}

@Override
public String toString() {
return "AppMenuItem [caption=" + caption + ", target=" + target + ", submenu=" + submenu + ", extra=" + extra
+ "]";
}

public String getCaption() {
return caption;
}

public void setCaption(String caption) {
this.caption = caption;
}

public String getTarget() {
return target;
}

public void setTarget(String target) {
this.target = target;
}

public AppSubMenu getSubmenu() {
return submenu;
}
Expand All @@ -79,8 +47,10 @@ public void setSubmenu(AppSubMenu submenu) {
this.submenu = submenu;
}

public Map<String, Object> getExtra() {
return extra;
@Override
public String toString() {
return "AppMenuItem [submenu=" + submenu + ", caption=" + caption + ", target=" + target + ", javascript="
+ javascript + ", icon=" + icon + ", extra=" + extra + "]";
}

}
Expand Up @@ -24,47 +24,19 @@

import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.cls.Cls;

@Authors("Nikolche Mihajlovski")
@Since("4.1.0")
public class AppSubMenuItem {

private String caption;

private String target;

private final Map<String, Object> extra;
public class AppSubMenuItem extends AbstractMenuItem {

public AppSubMenuItem(String caption, Object target, Map<String, Object> extra) {
this.caption = caption;
this.extra = extra;
this.target = target != null ? Cls.str(target) : "";
super(caption, target, extra);
}

@Override
public String toString() {
return "AppSubMenuItem [" + caption + " => " + target + ", extra=" + extra + "]";
}

public String getCaption() {
return caption;
}

public void setCaption(String caption) {
this.caption = caption;
}

public String getTarget() {
return target;
}

public void setTarget(String target) {
this.target = target;
}

public Map<String, Object> getExtra() {
return extra;
return "AppSubMenuItem [caption=" + caption + ", target=" + target + ", javascript=" + javascript + ", icon="
+ icon + ", extra=" + extra + "]";
}

}
8 changes: 8 additions & 0 deletions rapidoid-main/src/main/java/org/rapidoid/main/Rapidoid.java
Expand Up @@ -34,6 +34,7 @@
import org.rapidoid.log.Log;
import org.rapidoid.quick.Quick;
import org.rapidoid.util.U;
import org.rapidoid.webapp.AppMenu;
import org.rapidoid.webapp.WebApp;
import org.rapidoid.webapp.WebAppGroup;

Expand Down Expand Up @@ -80,6 +81,13 @@ public static synchronized void run(WebApp app, String[] args, Object... config)
if (app == null) {
app = WebAppGroup.root();
app.getRouter().generic(new AppHandler());

Res menuRes = Res.from("config/menu.yaml");
if (menuRes.exists()) {
Object menuData = YAML.parse(menuRes.getContent(), Object.class);
AppMenu menu = AppMenu.from(menuData);
app.setMenu(menu);
}
}

Quick.run(app, args, config);
Expand Down

0 comments on commit 79b3ed8

Please sign in to comment.