Skip to content

Commit

Permalink
Replaced Java-based generic screen rendering with template-based.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jul 29, 2015
1 parent 5990c60 commit d87cfc5
Show file tree
Hide file tree
Showing 12 changed files with 123 additions and 200 deletions.
Expand Up @@ -53,6 +53,8 @@
import org.rapidoid.pages.impl.ComplexView;
import org.rapidoid.plugins.db.DB;
import org.rapidoid.plugins.languages.Languages;
import org.rapidoid.plugins.templates.ITemplate;
import org.rapidoid.plugins.templates.Templates;
import org.rapidoid.security.Secure;
import org.rapidoid.util.English;
import org.rapidoid.util.U;
Expand Down Expand Up @@ -129,42 +131,29 @@ public Object content() {
Map<String, Class<?>> mainScreens = filterScreens();

Object pageContent = null;
int activeIndex = -1;

pageContent = pageContent();

Class<?>[] screens = APP_SCREENS.constructScreens(mainScreens);
List<Class<?>> scaffolding = Scan.annotated(Scaffold.class);

Object[] menuItems = new Object[screens.length + scaffolding.size()];
activeIndex = setupMenuItems(x.path(), screens, menuItems, scaffolding);
int activeIndex = setupMenuItems(x.path(), screens, menuItems, scaffolding);

boolean showNavbar = Apps.config(app, "navbar", true);

Object result;

String modal = Beany.getPropValue(screen, "modal", null);
Object modalContent = modal != null ? Beany.getPropValue(screen, modal, null) : null;

if (showNavbar) {
ATag brand = a(Pages.titleOf(x, app)).href("/");

Tag userMenu = userMenu();
Map<String, Object> model = U.map("navbar", showNavbar, "modal", modalContent, "fluid", isFluid(), "title",
title(), "body", pageContent, "state", "{}", "screen", true);

Tag debugMenu = x.isDevMode() ? debugMenu() : null;
FormTag searchForm = searchForm();

Tag navMenu = navbarMenu(true, activeIndex, menuItems);
Object[] navbarContent = arr(navMenu, debugMenu, userMenu, searchForm);

result = navbarPage(isFluid(), brand, navbarContent, arr(pageContent, modalContent));
} else {
result = cleanPage(isFluid(), arr(pageContent, modalContent));
}
ITemplate page = Templates.fromFile("page.html");
x.render(page, model);

Pages.store(x, screen);

return result;
return x;
}

protected Object genericScreen() {
Expand Down Expand Up @@ -332,98 +321,8 @@ protected int setupMenuItems(String currentUrl, Class<?>[] screens, Object[] men
return activeIndex;
}

protected Tag userMenu() {
Tag dropdownMenu = null;
if (addon("auth") || addon("googleLogin") || addon("facebookLogin") || addon("linkedinLogin")
|| addon("githubLogin")) {
if (AppCtx.isLoggedIn()) {
dropdownMenu = loggedInUserMenu();
} else {
dropdownMenu = loggedOutUserMenu();
}
}
return dropdownMenu;
}

protected ATag[] themesMenuOpttions() {
ATag[] themess = new ATag[themes.length];

Tag eye = awesome("eye");

for (int i = 0; i < themes.length; i++) {
String thm = themes[i];
String js = U.format("document.cookie='THEME=%s; path=/'; location.reload();", thm);
themess[i] = a_void(eye, NBSP, "Theme " + U.capitalized(thm)).onclick(js);
}

return themess;
}

protected Tag loggedOutUserMenu() {
Tag ga = null, fb = null, li = null, gh = null;

if (addon("googleLogin")) {
ga = loginMenuItem(OAuthProvider.GOOGLE);
}

if (addon("facebookLogin")) {
fb = loginMenuItem(OAuthProvider.FACEBOOK);
}

if (addon("linkedinLogin")) {
li = loginMenuItem(OAuthProvider.LINKEDIN);
}

if (addon("githubLogin")) {
gh = loginMenuItem(OAuthProvider.GITHUB);
}

return navbarDropdown(false, a_awesome("user", "Sign in", caret()), ga, fb, li, gh);
}

protected ATag loginMenuItem(OAuthProvider provider) {
String text = "Sign in with " + provider.getName();
String js = U.format("_popup('%s');", OAuth.getLoginURL(x, provider, null));
return a_awesome(provider.getName().toLowerCase(), text).onclick(js);
}

protected Tag loggedInUserMenu() {
ATag profile = a_awesome("user", userDisplay(), caret());
ATag settings = addon("settings") ? a_awesome("cog", " Settings").href("/settings") : null;
ATag logout = a_awesome("sign-out", "Logout").href("/_logout");

return navbarDropdown(false, profile, settings, logout);
}

protected String userDisplay() {
String username = AppCtx.username();
int pos = username.indexOf('@');
return pos > 0 ? username.substring(0, pos) : username;
}

protected Tag debugMenu() {
ATag debug = a_awesome("bug", " ", caret());

ATag userInfo = a_awesome("bug", "User info").href("/debuguserinfo");
ATag delAll = a_awesome("bug", "Delete All Data").href("/deletealldata");

Tag sep = menuDivider();

String theme = config("theme", null);
ATag[] themesOpts = theme == null ? themesMenuOpttions() : null;
Tag themeSep = themesOpts != null ? sep : null;

return navbarDropdown(false, debug, debugLoginUrl("admin"), debugLoginUrl("manager"),
debugLoginUrl("moderator"), debugLoginUrl("foo"), debugLoginUrl("bar"), sep, userInfo, themeSep,
themesOpts, sep, delAll);
}

protected ATag debugLoginUrl(String username) {
return a_awesome("bug", "Sign in as " + U.capitalized(username)).href("/_debugLogin?user=" + username);
}

protected boolean isFluid() {
return config("fluid", true);
return config("fluid", false);
}

protected Object getScreen() {
Expand Down
8 changes: 5 additions & 3 deletions rapidoid-html/src/main/resources/page.default.html
Expand Up @@ -7,7 +7,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>{{title}}</title>
<title>{{app.title}}</title>

{{#dev}}
<script src="/jquery-2.1.1.min.js"></script>
Expand All @@ -32,24 +32,26 @@

<script src="//cdn.rapidoid.org/1.0.0/rapidoid.min.js"></script>
<link href="//cdn.rapidoid.org/1.0.0/rapidoid.min.css">

{{/dev}}

<script src="/app.js"></script>
<link href="/app.css" rel="stylesheet">
<link href="/img/favicon.png" rel="shortcut icon">
<link href="bootstrap/css/theme-default.css" type="text/css" rel="stylesheet" />

{{>head}}
{{{head_extra}}}
<script>
window.__state = {{{state}}};
window.__state = {{{req.renderState}}};
</script>

</head>

<body ng-controller="Main" ng-app="app">

<div ng-if="!ajaxBodyContent">
{{{body}}}<br>
{{#screen}}{{>screen}}{{/screen}}<br>
</div>

<div compile="ajaxBodyContent" ng-if="ajaxBodyContent"></div>
Expand Down
12 changes: 12 additions & 0 deletions rapidoid-html/src/main/resources/profile.default.html
@@ -0,0 +1,12 @@
<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">
<span class="fa fa-user"></span>&nbsp;{{username}}<span class="caret"></span></a>
<ul role="menu" class="dropdown-menu">
<li><a href="/settings"><span class="fa fa-cog"></span>&nbsp; Settings</a></li>
<li><a onclick="javascript:_logout();" href="javascript:void(0);"><span class="fa fa-sign-out"></span>&nbsp;Logout</a></li>
{{#dev}}
<li class="divider"></li>
<li><a href="/debuguserinfo"><span class="fa fa-bug"></span>&nbsp;User info</a></li>
<li><a href="/deletealldata"><span class="fa fa-bug"></span>&nbsp;Delete All Data</a></li>
{{/dev}}
</ul>
</li>
2 changes: 1 addition & 1 deletion rapidoid-html/src/main/resources/public/rapidoid.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 51 additions & 0 deletions rapidoid-html/src/main/resources/screen.default.html
@@ -0,0 +1,51 @@
{{#navbar}}
<nav role="navigation" class="navbar navbar-default">
<div class="container{{#fluid}}-fluid{{/fluid}}">

<div class="navbar-header">
<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>
</div>

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

<ul class="nav navbar-nav navbar-right">
{{>signin}}
</ul>

<ul class="nav navbar-nav navbar-right">
{{>profile}}
</ul>

<form action="/search" class="navbar-form navbar-right" method="GET">
<div class="form-group">
<input id="navbar-q" placeholder="Search" name="q" class="form-control" type="text">
</div>
<button class="btn btn-default" type="submit">
<span class="fa fa-search"></span>
</button>
</form>
</div>
</div>
</nav>
{{/navbar}}

<div class="container{{#fluid}}-fluid{{/fluid}}">
<div>
<div class="title-box">0 search results</div>
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-hover">
<thead>
<tr></tr>
</thead>
<tbody></tbody>
</table>
<div></div>
</div>
</div>
</div>
</div>

0 comments on commit d87cfc5

Please sign in to comment.