Browse Source

Mass banning works now.

sh4nks 10 years ago
parent
commit
5ac15228a2

+ 18 - 2
flaskbb/management/views.py

@@ -201,8 +201,24 @@ def ban_user(user_id=None):
         return redirect(url_for("management.overview"))
 
     if request.is_xhr:
-        print "I AM A XHR REQUEST"
-        return jsonify(message="success", status=200)
+        ids = request.get_json()["ids"]
+
+        #banned_group = Group.query.filter_by(banned=True).first()
+        #users = User.query.\
+        #   filter(User.id.in_(ids)).\
+        #    update(
+        #        {"primary_group_id": banned_group.id},
+        #        synchronize_session=False
+        #    )
+
+        for user in User.query.filter(User.id.in_(ids)).all():
+            user.ban()
+
+        return jsonify(
+            message="{} Users banned.".format(users),
+            category="success",
+            status=200
+        )
 
     user = User.query.filter_by(id=user_id).first_or_404()
 

+ 0 - 18
flaskbb/static/js/conversation.js

@@ -1,18 +0,0 @@
-/**
- * topic.js
- */
-$(document).ready(function () {
-    // Quote
-    $('.reply-btn').click(function (event) {
-        event.preventDefault();
-        var message_id = $(this).attr('data-message-id');
-
-        $.get('/message/message/' + message_id + '/raw', function(text) {
-            var $contents = $('.message-content .md-editor textarea');
-            $contents.val(($contents.val() + '\n' + text).trim() + '\n');
-            $contents.selectionStart = $contents.selectionEnd = $contents.val().length;
-            $contents[0].scrollTop = $contents[0].scrollHeight;
-            window.location.href = '#content';
-        });
-    });
-});

+ 104 - 0
flaskbb/static/js/flaskbb.js

@@ -0,0 +1,104 @@
+/**
+ * flaskbb.js
+ * Copyright: (C) 2015 - FlaskBB Team
+ * License: BSD - See LICENSE for more details.
+ */
+
+
+ // get the csrf token from the header
+var csrftoken = $('meta[name=csrf-token]').attr('content');
+
+
+var flash_message = function(message) {
+    var container = $('#flashed-messages');
+
+    var flashed_message = '<div class="alert alert-'+ message.category +'">';
+
+    if(message.category == 'success') {
+        flashed_message += '<span class="glyphicon glyphicon-ok-sign"></span>&nbsp;';
+    } else if (message.category == 'error') {
+        flashed_message += '<span class="glyphicon glyphicon-exclamation-sign"></span>&nbsp;';
+    } else {
+        flashed_message += '<span class="glyphicon glyphicon-info-sign"></span>&nbsp;';
+    }
+    flashed_message += '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>' + message.message + '</div>';
+    container.append(flashed_message);
+};
+
+var BulkActions = function() {
+    this.execute = function(url) {
+        var selected = $('input.action-checkbox:checked').size();
+        var data = {"ids": []};
+
+        // don't do anything if nothing is selected
+        if (selected === 0) {
+            return false;
+        }
+
+        $('input.action-checkbox:checked').each(function(k, v) {
+            data.ids.push($(v).val());
+        });
+
+        send_data(url, data);
+
+        return false;
+    };
+
+    $(function() {
+        $('.action-checkall').change(function() {
+            $('input.action-checkbox').prop('checked', this.checked);
+        });
+    });
+};
+
+var send_data = function(endpoint_url, data) {
+    $.ajax({
+        url: BASE_URL + endpoint_url,
+        method: "POST",
+        data: JSON.stringify(data),
+        dataType: "json",
+        contentType: "application/json",
+        beforeSend: function(xhr, settings) {
+            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
+                xhr.setRequestHeader("X-CSRFToken", csrftoken);
+            }
+        }
+    })
+    .done(function(response) {
+        flash_message(response);
+    })
+    .fail(function(error) {
+        flash_message(error);
+    });
+};
+
+$(document).ready(function () {
+    // TODO: Refactor
+    // Reply conversation
+    $('.reply-btn').click(function (event) {
+        event.preventDefault();
+        var message_id = $(this).attr('data-message-id');
+
+        $.get('/message/message/' + message_id + '/raw', function(text) {
+            var $contents = $('.message-content .md-editor textarea');
+            $contents.val(($contents.val() + '\n' + text).trim() + '\n');
+            $contents.selectionStart = $contents.selectionEnd = $contents.val().length;
+            $contents[0].scrollTop = $contents[0].scrollHeight;
+            window.location.href = '#content';
+        });
+    });
+    // Reply to post
+    $('.quote_btn').click(function (event) {
+        event.preventDefault();
+        var post_id = $(this).attr('data-post-id');
+
+        $.get('/post/' + post_id + '/raw', function(text) {
+            var $contents = $('.reply-content .md-editor textarea');
+            console.log($contents);
+            $contents.val(($contents.val() + '\n' + text).trim() + '\n');
+            $contents.selectionStart = $contents.selectionEnd = $contents.val().length;
+            $contents[0].scrollTop = $contents[0].scrollHeight;
+            window.location.href = '#content';
+        });
+    });
+});

+ 0 - 24
flaskbb/static/js/management.js

@@ -1,24 +0,0 @@
-/**
- * management.js
- */
-var csrftoken = $('meta[name=csrf-token]').attr('content');
-$(document).ready(function() {
-
-    $('#ban_users').click(function(event) {
-        event.preventDefault();
-
-        $.ajax({
-            beforeSend: function(xhr, settings) {
-                if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
-                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
-                }
-            },
-            url: MANAGEMENT_URL + "/users/ban",
-            method: "POST",
-            data: { ids: [3, 4] },
-            success: function(result) {
-                console.log(result);
-            }
-        });
-    })
-});

+ 0 - 19
flaskbb/static/js/topic.js

@@ -1,19 +0,0 @@
-/**
- * topic.js
- */
-$(document).ready(function () {
-    // Quote
-    $('.quote_btn').click(function (event) {
-        event.preventDefault();
-        var post_id = $(this).attr('data-post-id');
-
-        $.get('/post/' + post_id + '/raw', function(text) {
-            var $contents = $('.reply-content .md-editor textarea');
-            console.log($contents)
-            $contents.val(($contents.val() + '\n' + text).trim() + '\n');
-            $contents.selectionStart = $contents.selectionEnd = $contents.val().length;
-            $contents[0].scrollTop = $contents[0].scrollHeight;
-            window.location.href = '#content';
-        });
-    });
-});

+ 0 - 1
flaskbb/templates/forum/topic.html

@@ -169,7 +169,6 @@
 {% endblock %}
 
 {% block scripts %}
-    <script type="text/javascript" src="{{ url_for('static', filename='js/topic.js') }}"></script>
     <script type="text/javascript" src="{{ url_for('static', filename='js/marked.js') }}"></script>
     <script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap-markdown.js') }}"></script>
 {% endblock %}

+ 86 - 81
flaskbb/templates/layout.html

@@ -15,6 +15,7 @@
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <meta name="description" content="FlaskBB is a forum software written in Flask">
         <meta name="author" content="FlaskBB Team">
+        <meta name="csrf-token" content="{{ csrf_token() }}">
 
         <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
 
@@ -38,102 +39,106 @@
         {% block navigation %}
         {%- from theme("macros.html") import topnav with context -%}
         <!-- Navigation -->
-            <nav class="navbar navbar-default navbar-static-top">
-                <div class="container">
-                    <div class="navbar-header">
-                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
-                            <span class="sr-only">Toggle navigation</span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
+        <nav class="navbar navbar-default navbar-static-top">
+            <div class="container">
+                <div class="navbar-header">
+                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
+                        <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="/">FlaskBB</a>
+                </div>
+                <div class="collapse navbar-collapse navbar-ex1-collapse">
+                    <ul class="nav navbar-nav">
+                        {{ emit_event("before-first-navigation-element") }}
+
+                        {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
+                        {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
+                        {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
+                        {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
+
+                        {{ emit_event("after-last-navigation-element") }}
+                    </ul>
+
+                {% if current_user and current_user.is_authenticated() %}
+                    <div class="btn-group navbar-btn navbar-right" style="padding-left: 15px; margin-right: -10px">
+                        <a class="btn btn-primary" href="{{ url_for('user.profile', username=current_user.username) }}">
+                            <span class="fa fa-user"></span> {{ current_user.username }}
+                        </a>
+                        <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+                            <span class="caret"></span>
                         </button>
-                        <a class="navbar-brand" href="/">FlaskBB</a>
-                    </div>
-                    <div class="collapse navbar-collapse navbar-ex1-collapse">
-                        <ul class="nav navbar-nav">
-                            {{ emit_event("before-first-navigation-element") }}
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
+                            <li class="divider"></li>
 
-                            {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
-                            {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
-                            {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
-                            {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
+                            <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
+                            {% if current_user|is_admin_or_moderator %}
+                            <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
+                            <li class="divider"></li>
+                            {% endif %}
 
-                            {{ emit_event("after-last-navigation-element") }}
+                            <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
                         </ul>
+                    </div>
 
-                    {% if current_user and current_user.is_authenticated() %}
-                        <div class="btn-group navbar-btn navbar-right" style="padding-left: 15px; margin-right: -10px">
-                            <a class="btn btn-primary" href="{{ url_for('user.profile', username=current_user.username) }}">
-                                <span class="fa fa-user"></span> {{ current_user.username }}
-                            </a>
-                            <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
-                                <span class="caret"></span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
-                                <li class="divider"></li>
-
-                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
-                                {% if current_user|is_admin_or_moderator %}
-                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
-                                <li class="divider"></li>
-                                {% endif %}
-
-                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-
-                        <div class="btn-group navbar-btn navbar-right">
-                            <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown">
-                                <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('message.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Private Messages{% endtrans %}</a></li>
-                                <li><a href="{{ url_for('message.new_conversation') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-                    {% else %}
-                        <div class="btn-group navbar-btn navbar-right">
-                            <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
-                                <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
-                            </a>
-                            <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
-                                <span class="caret"></span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
-                                <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-                    {% endif %}
-                    </div><!-- nav-collapse -->
-                </div><!-- container -->
-            </nav> <!-- navbar navbar-inverse -->
+                    <div class="btn-group navbar-btn navbar-right">
+                        <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown">
+                            <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('message.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Private Messages{% endtrans %}</a></li>
+                            <li><a href="{{ url_for('message.new_conversation') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
+                        </ul>
+                    </div>
+                {% else %}
+                    <div class="btn-group navbar-btn navbar-right">
+                        <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
+                            <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
+                        </a>
+                        <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+                            <span class="caret"></span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
+                            <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
+                        </ul>
+                    </div>
+                {% endif %}
+                </div><!-- nav-collapse -->
+            </div><!-- container -->
+        </nav> <!-- navbar navbar-inverse -->
+        {% endblock %}
+
+
+        <div class="container">
+            {% block messages %}
+                {% include theme('flashed_messages.html') %}
             {% endblock %}
 
+            {% block content %}
+            {% endblock %}
+        </div> <!-- /container -->
 
+        {% block footer %}
+        <div id="footer">
             <div class="container">
-                {% block messages %}
-                    {% include theme('flashed_messages.html') %}
-                {% endblock %}
-
-                {% block content %}
-                {% endblock %}
-            </div> <!-- /container -->
-
-            {% block footer %}
-            <div id="footer">
-                <div class="container">
-                    <p class="text-muted credit pull-left">powered by <a href="http://flask.pocoo.org">Flask</a></p>
-                    <p class="text-muted credit pull-right">&copy; 2013 - <a href="http://flaskbb.org">FlaskBB.org</a></p>
-                </div>
+                <p class="text-muted credit pull-left">powered by <a href="http://flask.pocoo.org">Flask</a></p>
+                <p class="text-muted credit pull-right">&copy; 2013 - <a href="http://flaskbb.org">FlaskBB.org</a></p>
             </div>
-            {% endblock %}
+        </div>
+        {% endblock %}
 
         {# standard javascript libs #}
         {% block javascript %}
+        <script>
+            var BASE_URL = "{{ request.path.split('/')[0] }}";
+        </script>
         <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
         <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
+        <script src="{{ url_for('static', filename='js/flaskbb.js') }}"></script>
         {% endblock %}
 
         {# space for extra scripts - to use in other templates #}

+ 0 - 12
flaskbb/templates/management/management_layout.html

@@ -1,10 +1,5 @@
 {% extends theme("layout.html") %}
 
-{% block head_extra %}
-{# include the csrf token here because we access it in the javascript #}
-<meta name="csrf-token" content="{{ csrf_token() }}">
-{% endblock %}
-
 {% block content %}
 {%- from theme('macros.html') import navlink with context -%}
 
@@ -26,10 +21,3 @@
 {% block management_content %}{% endblock %}
 
 {% endblock %}
-
-{% block scripts %}
-<script>
-    var MANAGEMENT_URL = "/admin";
-</script>
-<script src="{{ url_for('static', filename='js/management.js') }}"></script>
-{% endblock %}

+ 21 - 1
flaskbb/templates/management/users.html

@@ -37,17 +37,31 @@
     <table class="table table-bordered">
         <thead>
             <tr>
+                <th><input type="checkbox" name="rowtoggle" class="action-checkall" title="Select All"/></th>
                 <th>#</th>
                 <th>{% trans %}Username{% endtrans %}</th>
                 <th>{% trans %}Posts{% endtrans %}</th>
                 <th>{% trans %}Date registered{% endtrans %}</th>
                 <th>{% trans %}Group{% endtrans %}</th>
-                <th><button class="btn btn-danger" id="ban_users">{% trans %}Ban{% endtrans %}</button></th>
+                <th>
+                    <div class="btn-group" role="group">
+                        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+                            Actions
+                            <span class="caret"></span>
+                      </button>
+                      <ul class="dropdown-menu" role="menu">
+                            <li><a href="javascript:void(0)" onclick="return bulk_actions.execute('/users/ban')">Ban selected Users</a></li>
+                            <li><a href="javascript:void(0)" onclick="return bulk_actions.execute('/users/unban')">Unban selected Users</a></li>
+                            <li><a href="javascript:void(0)" onclick="return bulk_actions.execute('/users/ban')">Delete selected Users</a></li>
+                        </ul>
+                    </div>
+                </th>
             </tr>
         </thead>
         <tbody>
             {% for user in users.items %}
                 <tr>
+                    <td><input type="checkbox" name="rowid" class="action-checkbox" value="{{ user.id }}" title="Select User"/></td>
                     <td>{{ user.id }}</td>
                     <td><a href="{{ url_for('user.profile', username=user.username) }}">{{ user.username }}</a></td>
                     <td>{{ user.post_count }}</td>
@@ -91,3 +105,9 @@
     </table>
 </div>
 {% endblock %}
+
+{% block scripts %}
+    <script>
+    var bulk_actions = new BulkActions()
+    </script>
+{% endblock %}

+ 0 - 1
flaskbb/templates/message/conversation.html

@@ -81,7 +81,6 @@
 {% endblock %}
 
 {% block scripts %}
-    <script type="text/javascript" src="{{ url_for('static', filename='js/conversation.js') }}"></script>
     <script type="text/javascript" src="{{ url_for('static', filename='js/marked.js') }}"></script>
     <script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap-markdown.js') }}"></script>
 {% endblock %}

+ 91 - 82
flaskbb/themes/bootstrap3/templates/layout.html

@@ -15,13 +15,14 @@
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <meta name="description" content="FlaskBB is a forum software written in Flask">
         <meta name="author" content="FlaskBB Team">
+        <meta name="csrf-token" content="{{ csrf_token() }}">
 
         <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
 
         {% block stylesheets %}
-        <link rel="stylesheet" href="{{ url_for('static', filename='css/code.css') }}">
         <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
-        <link rel="stylesheet" href="{{ url_for('static', filename='css/font-awesome.min.css') }}">
+        <link rel="stylesheet" href="{{ url_for('static', filename='css/font-awesome.min.css') }}" >
+        <link rel="stylesheet" href="{{ url_for('static', filename='css/code.css') }}">
         <link rel="stylesheet" href="{{ url_for('static', filename='css/flaskbb.css') }}">
         {% endblock %}
 
@@ -38,103 +39,111 @@
         {% block navigation %}
         {%- from theme("macros.html") import topnav with context -%}
         <!-- Navigation -->
-            <nav class="navbar navbar-default navbar-static-top">
-                <div class="container">
-                    <div class="navbar-header">
-                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
-                            <span class="sr-only">Toggle navigation</span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
+        <nav class="navbar navbar-default navbar-static-top">
+            <div class="container">
+                <div class="navbar-header">
+                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
+                        <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="/">FlaskBB</a>
+                </div>
+                <div class="collapse navbar-collapse navbar-ex1-collapse">
+                    <ul class="nav navbar-nav">
+                        {{ emit_event("before-first-navigation-element") }}
+
+                        {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
+                        {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
+                        {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
+                        {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
+
+                        {{ emit_event("after-last-navigation-element") }}
+                    </ul>
+
+                {% if current_user and current_user.is_authenticated() %}
+                    <div class="btn-group navbar-btn navbar-right" style="padding-left: 15px; margin-right: -10px">
+                        <a class="btn btn-primary" href="{{ url_for('user.profile', username=current_user.username) }}">
+                            <span class="fa fa-user"></span> {{ current_user.username }}
+                        </a>
+                        <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+                            <span class="caret"></span>
                         </button>
-                        <a class="navbar-brand" href="/">FlaskBB</a>
-                    </div>
-                    <div class="collapse navbar-collapse navbar-ex1-collapse">
-                        <ul class="nav navbar-nav">
-                            {{ emit_event("before-first-navigation-element") }}
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
+                            <li class="divider"></li>
 
-                            {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
-                            {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
-                            {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
-                            {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
+                            <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
+                            {% if current_user|is_admin_or_moderator %}
+                            <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
+                            <li class="divider"></li>
+                            {% endif %}
 
-                            {{ emit_event("after-last-navigation-element") }}
+                            <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
                         </ul>
+                    </div>
 
-                    {% if current_user and current_user.is_authenticated() %}
-                        <div class="btn-group navbar-btn navbar-right" style="padding-left: 15px; margin-right: -10px">
-                            <a class="btn btn-primary" href="{{ url_for('user.profile', username=current_user.username) }}">
-                                <span class="fa fa-user"></span> {{ current_user.username }}
-                            </a>
-                            <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
-                                <span class="caret"></span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
-                                <li class="divider"></li>
-
-                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
-                                {% if current_user|is_admin_or_moderator %}
-                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
-                                <li class="divider"></li>
-                                {% endif %}
-
-                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-
-                        <div class="btn-group navbar-btn navbar-right">
-                            <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown">
-                                <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('message.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Inbox{% endtrans %}</a></li>
-                                <li><a href="{{ url_for('message.new_conversation') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-                    {% else %}
-                        <div class="btn-group navbar-btn navbar-right">
-                            <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
-                                <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
-                            </a>
-                            <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
-                                <span class="caret"></span>
-                            </button>
-                            <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
-                                <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
-                            </ul>
-                        </div>
-                    {% endif %}
-                    </div><!-- nav-collapse -->
-                </div><!-- container -->
-            </nav> <!-- navbar navbar-inverse -->
-            {% endblock %}
+                    <div class="btn-group navbar-btn navbar-right">
+                        <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown">
+                            <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('message.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Private Messages{% endtrans %}</a></li>
+                            <li><a href="{{ url_for('message.new_conversation') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
+                        </ul>
+                    </div>
+                {% else %}
+                    <div class="btn-group navbar-btn navbar-right">
+                        <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
+                            <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
+                        </a>
+                        <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+                            <span class="caret"></span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu">
+                            <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
+                            <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
+                        </ul>
+                    </div>
+                {% endif %}
+                </div><!-- nav-collapse -->
+            </div><!-- container -->
+        </nav> <!-- navbar navbar-inverse -->
+        {% endblock %}
 
 
-            <div class="container">
-                {% block messages %}
+        <div class="container">
+            {% block messages %}
+                <div id="flashed-messages">
                     {% include theme('flashed_messages.html') %}
-                {% endblock %}
+                </div>
+            {% endblock %}
 
-                {% block content %}
-                {% endblock %}
-            </div> <!-- /container -->
+            {% block content %}
+            {% endblock %}
+        </div> <!-- /container -->
 
-            {% block footer %}
-            <div class="footer">
-                <div class="container">
-                    <p class="text-muted pull-left">powered by <a href="http://flask.pocoo.org">Flask</a></p>
-                    <p class="text-muted pull-right">&copy; 2013 - <a href="http://flaskbb.org">FlaskBB.org</a></p>
-                </div>
+        {% block footer %}
+        <div id="footer">
+            <div class="container">
+                <p class="text-muted credit pull-left">powered by <a href="http://flask.pocoo.org">Flask</a></p>
+                <p class="text-muted credit pull-right">&copy; 2013 - <a href="http://flaskbb.org">FlaskBB.org</a></p>
             </div>
-            {% endblock %}
+        </div>
+        {% endblock %}
 
+        {# standard javascript libs #}
         {% block javascript %}
+        <script>
+            var BASE_URL = "/{{ request.path.split('/')[1] }}";
+        </script>
         <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
         <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
+        <script src="{{ url_for('static', filename='js/flaskbb.js') }}"></script>
         {% endblock %}
 
+        {# space for extra scripts - to use in other templates #}
         {% block scripts %}
         {% endblock %}
     </body>