Browse Source

Move partials and macros into its own directory

Peter Justin 3 years ago
parent
commit
6d403f6f86

+ 144 - 0
flaskbb/templates/_macros/form.html

@@ -0,0 +1,144 @@
+{%- macro field_label(field) -%}
+    {# don't render labels for buttons and radio fields #}
+    {% if field.type != "SubmitField" and field.type != "BooleanField" %}
+        {% set css_class = kwargs['class'] if kwargs['class'] else 'form-label' %}
+        <label class="{{ css_class }}" for="{{ field.id }}">{{ field.label.text }}</label>
+    {% endif %}
+{% endmacro %}
+
+
+{%- macro field_description(field) -%}
+    {% if field.description %}
+        <div class="form-text">{{ field.description|safe }}</div>
+    {% endif %}
+{%- endmacro -%}
+
+
+{%- macro field_errors(field) -%}
+    {% if field.errors %}
+        {%- for error in field.errors -%}
+        <div class="invalid-feedback">
+            {{error}}
+        </div>
+        {%- endfor -%}
+    {% endif %}
+{%- endmacro -%}
+
+
+{%- macro render_input_field(field, div_class='') -%}
+{% if div_class %}
+<div class="{{ div_class }}">
+{% endif %}
+
+    {% set placeholder = kwargs['placeholder']|length or field.label.text %}
+    {% set css_error = ' is-invalid' if field.errors else '' %}
+    {% set css_class = kwargs['class'] if kwargs['class'] else 'form-control' %}
+    {% set css_class = css_class + css_error if css_error else css_class %}
+
+    {{ field(class=css_class, placeholder=placeholder, **kwargs) }}
+    {{ field_description(field) }}
+    {{ field_errors(field) }}
+
+{% if div_class %}
+</div>
+{% endif %}
+{%- endmacro -%}
+
+
+{%- macro render_boolean_field(field, div_class='') -%}
+{% if div_class %}
+<div class="{{ div_class }}">
+{% endif %}
+
+    {% set css_error = ' is-invalid' if field.errors else '' %}
+    {% set css_class = kwargs['class'] if kwargs['class'] else 'form-check-input' %}
+    {% set css_class = css_class + css_error if css_error else css_class %}
+    <div class="form-check">
+        {{ field(class=css_class, **kwargs) }}
+        <label class="form-check-label" for="{{ field.id }}">
+        {{ field.label.text }}
+        </label>
+        {{ field_description(field) }}
+        {{ field_errors(field) }}
+    </div>
+
+{% if div_class %}
+</div>
+{% endif %}
+{%- endmacro -%}
+
+
+{%- macro render_select_field(field, div_class='') -%}
+{% if div_class %}
+<div class="{{ div_class }}">
+{% endif %}
+
+    {% set css_error = ' is-invalid' if field.errors else '' %}
+    {% set css_class = kwargs['class'] if kwargs['class'] else 'form-select' %}
+    {% set css_class = css_class + css_error if css_error else css_class %}
+
+    {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
+        {{ field(multiple=True, class=css_class) }}
+    {% else %}
+        {{ field(class=css_class) }}
+    {%- endif -%}
+
+    {{ field_description(field) }}
+    {{ field_errors(field) }}
+
+{% if div_class %}
+</div>
+{% endif %}
+{%- endmacro -%}
+
+
+{%- macro render_submit_field(field, div_class='') -%}
+{% if div_class %}
+<div class="{{ div_class }}">
+{% endif %}
+
+    {% set css_class = kwargs['class'] if kwargs['class'] else 'btn btn-success' %}
+    {{ field(class=css_class) }}
+
+{% if div_class %}
+</div>
+{% endif %}
+{%- endmacro -%}
+
+
+{%- macro render_field(field, div_class='mb-3 col-12') -%}
+<div class="{{ div_class }}">
+    {{ field_label(field) }}
+
+    {% if field.type == "BooleanField" %}
+        {{ render_boolean_field(field, **kwargs) }}
+    {% elif field.type == "SelectField" or field.type == "QuerySelectMultipleField" or field.type == "SelectMultipleField" %}
+        {{ render_select_field(field, **kwargs) }}
+    {% elif field.type == "SubmitField" %}
+        {{ render_submit_field(field, **kwargs) }}
+    {% else %}
+        {{ render_input_field(field, **kwargs) }}
+    {% endif %}
+</div>
+{%- endmacro -%}
+
+
+{%- macro horizontal_field(field, label_class='col-3 form-label text-end', div_class='col-4') -%}
+<div class="row mb-3">
+
+    {{ field_label(field, class=label_class) }}
+
+    <div class="{{ div_class }}">
+    {% if field.type == "BooleanField" %}
+        {{ render_boolean_field(field, **kwargs) }}
+    {% elif field.type == "SelectField" or field.type == "QuerySelectMultipleField" or field.type == "SelectMultipleField" %}
+        {{ render_select_field(field, **kwargs) }}
+    {% elif field.type == "SubmitField" %}
+        {{ render_submit_field(field, **kwargs) }}
+    {% else %}
+        {{ render_input_field(field, **kwargs) }}
+    {% endif %}
+    </div>
+
+</div>
+{%- endmacro -%}

+ 72 - 0
flaskbb/templates/_macros/navigation.html

@@ -0,0 +1,72 @@
+{% macro topnav(endpoint, name, icon='', id='', active=False) %}
+<li {% if id %}id={{id}}{% endif %} class="nav-item">
+    <a class="nav-link{% if endpoint == request.endpoint or active == True %} active{% endif %}" href="{{ url_for(endpoint) }}">
+        {% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ name }}
+    </a>
+</li>
+{% endmacro %}
+
+{% macro is_active(endpoint, active=False) %}
+    {%- if endpoint == request.endpoint or active == True -%}
+        active
+    {%- endif -%}
+{% endmacro %}
+
+{% macro navlink(endpoint, name, icon='', active='', urlforkwargs=None) %}
+<li {% if endpoint == request.endpoint or endpoint == active or active == True %}class="active"{% endif %}>
+    <a href="{% if urlforkwargs %}{{ url_for(endpoint, **urlforkwargs) }}{% else %}{{ url_for(endpoint) }}{% endif %}">
+        {% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}
+    </a>
+</li>
+{% endmacro %}
+
+{% macro externalnavlink(uri, name, icon='') %}
+<li>
+    <a href="{{uri}}">{% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}</a>
+</li>
+{% endmacro %}
+
+{% macro navtext(text, icon="", cls="") %}
+<li{% if cls %} class="{{ cls }}"{% endif %}><a href="#">{% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ text }}</a></li>
+{% endmacro %}
+
+{% macro navheader(text, icon="", cls="nav-header") %}
+{{ navtext(text, icon, cls) }}
+{% endmacro %}
+
+{% macro navdivider() %}
+<li class="nav-divider"></li>
+{% endmacro %}
+
+{% macro sidebar(items, extra_class="") %}
+{% if items %}
+<ul class="nav {% if extra_class %}{{ extra_class }}{% endif %}">
+    {{ sidebaritems(items) }}
+</ul>
+{% endif %}
+{% endmacro %}
+
+
+{% macro sidebaritems(items) %}
+{% for item in items %}
+    {% if item.content_type == NavigationContentType.link %}
+    {{ navlink(item.endpoint, item.name, item.icon, item.active, item.urlforkwargs) }}
+    {% elif item.content_type == NavigationContentType.external_link %}
+    {{ externalnavlink(item.uri, item.name, item.icon) }}
+    {% elif item.content_type == NavigationContentType.header %}
+    {{ navheader(item.text, cls="sidenav-header") }}
+    {% elif item.content_type == NavigationContentType.divider %}
+    {{ navdivider() }}
+    {% else %}
+    {# skip unknown #}
+    {% endif %}
+{% endfor %}
+{% endmacro %}
+
+
+{% macro tablink_href(endpoint, name, active=False) %}
+<li {% if endpoint == request.endpoint or active %}class="active"{% endif %} >
+    <a href={{ endpoint }} role="tab" data-toggle="tab">{{ name }}</a>
+</li>
+{% endmacro %}
+

+ 109 - 0
flaskbb/templates/_macros/pagination.html

@@ -0,0 +1,109 @@
+{% macro render_pagination(page_obj, url, ul_class='', sort_by=None, asc=True) %}
+<ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination{%- endif -%}'>
+    {% set ordering = 'asc' if asc == True else 'desc' %}
+    {% set sorting = '&sort_by='+(sort_by|urlencode)+'&order_by='+ordering if sort_by is string else '' %}
+    <li class="page-item disabled"><a class="page-link" href="#"><span class="pages-label">{% trans %}Pages{% endtrans %}</span></a></li>
+    {%- for page in page_obj.iter_pages() %}
+        {% if page %}
+            {% if page != page_obj.page %}
+                <li class="page-item"><a class="page-link" href="{{ url }}?page={{ page }}{{ sorting }}">{{ page }}</a></li>
+            {% else %}
+                <li class="page-item active"><a class="page-link" href="#">{{ page }}</a></li>
+            {% endif %}
+        {% endif %}
+    {%- else -%}
+        <li class="page-item active"><a class="page-link" href="#">1</a></li>
+    {%- endfor %}
+    {% if page_obj.has_next %}
+        <li class="page-item"><a class="page-link" href="{{ url }}?page={{ page_obj.next_num }}{{ sorting }}">&raquo;</a></li>
+    {% endif %}
+</ul>
+{% endmacro %}
+
+{% macro render_topic_pagination(page_obj, url) %}
+<ul class="pagination pagelink">
+    <li class="page-item disabled"><a class="page-link" href="#"><span class="pages-label">Pages: </span></a></li>
+    {%- for page in page_obj.iter_pages() %}
+        {% if page %}
+            {% if page != page_obj.page %}
+                <li class="page-item"><a class="page-link" href="{{ url }}?page={{ page }}">{{ page }}</a></li>
+            {% else %}
+                <li class="page-item disabled"><a class="page-link" href="#">{{ page }}</a></li>
+            {% endif %}
+        {% endif %}
+    {%- else -%}
+        <li class="page-item disabled"><a class="page-link" href="#">1</a></li>
+    {%- endfor %}
+    {% if page_obj.has_next %}
+        <li class="page-item"><a class="page-link" href="{{ url }}?page={{ page_obj.next_num }}">Next</a></li>
+    {% endif %}
+</ul>
+{% endmacro %}
+
+
+{% macro message_pagination(page_obj, url) %}
+<ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination pagination-sm{%- endif -%}'>
+    {%- for page in page_obj.iter_pages() %}
+        {% if page %}
+            {% if page != page_obj.page %}
+                <li><a href="{{ url }}?page={{ page }}">{{ page }}</a></li>
+            {% else %}
+                <li class="active"><a href="#">{{ page }}</a></li>
+            {% endif %}
+        {% endif %}
+    {%- else -%}
+        <li class="active"><a href="#">1</a></li>
+    {%- endfor %}
+    {% if page_obj.has_next %}
+        <li><a href="{{ url }}?page={{ page_obj.next_num }}">&raquo;</a></li>
+    {% endif %}
+</ul>
+{% endmacro %}
+
+
+{# Generates a some kind of pagination for the posts in topic in the forum view. #}
+{%- macro topic_pages(topic_obj, per_page=10) -%}
+{% set pages = (topic_obj.post_count / per_page)|round(method='ceil')|int %}
+{% set max_pages = 4 %}
+{% set page_count = pages if pages <= max_pages else max_pages %}
+
+{%- if pages > 1 -%}
+[
+    {%- for page in range(1, page_count+1) -%}
+        {% if pages > max_pages and page == max_pages-1 %}
+            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a> ...
+        {% elif pages > max_pages and loop.last %}
+            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ pages }}">{{ pages }}</a>
+        {% else %}
+            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a>
+        {% endif %}
+    {%- endfor -%}
+]
+{%- endif -%}
+{%- endmacro -%}
+
+
+{#
+Generates a topic url with an anchor to the post
+XXX: Rename to generate_anchor_url to make it universally useful
+#}
+{%- macro generate_post_url(topic, post, page) -%}
+    {%- if page > 1 -%}
+        {{ topic.url }}?page={{ page }}#pid{{ post.id }}
+    {%- else -%}
+        {{ topic.url }}#pid{{ post.id }}
+    {%- endif -%}
+{%- endmacro -%}
+
+
+{#
+Generates the pagination object id in a list.
+For example, on id should continue with 11 on page 2 if per_page is set to 10
+#}
+{%- macro generate_obj_id(obj, page, per_page) -%}
+    {%- if obj.page == 1 -%}
+        {{ page }}
+    {%- else -%}
+        {{ page + (obj.page - 1) * per_page }}
+    {%- endif -%}
+{%- endmacro -%}

+ 17 - 0
flaskbb/templates/_partials/confirm_dialog.html

@@ -0,0 +1,17 @@
+<div class="modal fade" id="confirmModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="confirmModalLabel">{% trans %}Are you sure?{% endtrans %}</h5>
+                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
+            </div>
+            <div class="modal-body">
+                <p>{% trans %}Are you sure that you want to perform this action? This action is irreversible.{% endtrans %}</p>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans %}Cancel{% endtrans %}</button>
+                <button type="button" class="btn btn-danger confirmBtn">{% trans %}Yes{% endtrans %}</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 0 - 0
flaskbb/templates/editor_help.html → flaskbb/templates/_partials/editor_help.html


+ 19 - 0
flaskbb/templates/_partials/flashed_messages.html

@@ -0,0 +1,19 @@
+{% with messages = get_flashed_messages(with_categories=True) %}
+    {% if messages %}
+        {% for category, message in messages %}
+            {% if category == 'error' %}
+                {% set icon = 'fas fa-exclamation' %}
+            {% elif category == 'success' %}
+                {% set icon = 'fas fa-check' %}
+            {% else %}
+                {% set icon = 'fas fa-info' %}
+            {% endif %}
+
+            <div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+                <span class="{{ icon }} me-2"></span>
+                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                {{ message }}
+            </div>
+        {% endfor %}
+    {% endif %}
+{% endwith %}

+ 0 - 17
flaskbb/templates/confirm_dialog.html

@@ -1,17 +0,0 @@
-<div class="modal fade confirmModal">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
-                <h4 class="modal-title" id="confirmModalLabel">{% trans %}Are you sure?{% endtrans %}</h4>
-            </div>
-            <div class="modal-body">
-                <p>{% trans %}Are you sure that you want to perform this action? This action is irreversible.{% endtrans %}</p>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal">{% trans %}Cancel{% endtrans %}</button>
-                <button type="button" class="btn btn-danger btn-ok confirmBtn">{% trans %}Yes{% endtrans %}</button>
-            </div>
-        </div>
-    </div>
-</div>

+ 0 - 18
flaskbb/templates/flashed_messages.html

@@ -1,18 +0,0 @@
-{% with messages = get_flashed_messages(with_categories=True) %}
-    {% if messages %}
-        {% for category, message in messages %}
-            {% if category == 'error' %}
-                {% set icon = 'glyphicon glyphicon-exclamation-sign' %}
-            {% elif category == 'success' %}
-                {% set icon = 'glyphicon glyphicon-ok-sign' %}
-            {% else %}
-                {% set icon = 'glyphicon glyphicon-info-sign' %}
-            {% endif %}
-            <div class="alert alert-{{ category }}">
-                <span class="{{ icon }}"></span>&nbsp;
-                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
-                {{ message }}
-            </div>
-        {% endfor %}
-    {% endif %}
-{% endwith %}

+ 0 - 477
flaskbb/templates/macros.html

@@ -1,477 +0,0 @@
-{%- macro field_label(field) -%}
-    <label for="{{ field.id }}">{{ field.label.text }}</label>
-{% endmacro %}
-
-
-{%- macro field_description(field) -%}
-    {% if field.description %}
-        <span class="help-block">{{ field.description|safe }}</span>
-    {% endif %}
-{%- endmacro -%}
-
-
-{%- macro field_errors(field) -%}
-    {% if field.errors %}
-        {%- for error in field.errors -%}
-        <span class="help-block">{{error}}</span>
-        {%- endfor -%}
-    {% endif %}
-{%- endmacro -%}
-
-
-{%- macro render_quickreply(field, rows, cols, div_class='') -%}
-{%- if kwargs['required'] or field.flags.required -%}
-    {% if div_class %}
-        {{ field(class=div_class, required="required", cols=cols, rows=rows, placeholder=field.label.text, **kwargs) }}
-    {% else %}
-        {{ field(class="new-message", required="required", cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
-    {% endif %}
-{%- else -%}
-    {% if div_class %}
-        {{ field(class=div_class, cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
-    {% else %}
-        {{ field(class="new-message", cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
-    {% endif %}
-{%- endif -%}
-
-{{ field_description(field) }}
-{{ field_errors(field) }}
-{%- endmacro -%}
-
-
-{# Renders a non bootstrap input field #}
-{%- macro render_input_field(field, div_class='', placeholder='') -%}
-{%- if div_class -%}
-    <div class="{{ div_class }}">
-{%- endif -%}
-
-{%- if placeholder -%}
-    {% set field_placeholder = placeholder %}
-{%- else -%}
-    {% set field_placeholder = field.label.text %}
-{%- endif -%}
-
-{%- if kwargs['required'] or field.flags.required -%}
-    {{ field(required="required", placeholder=field_placeholder) }}
-{%- else -%}
-    {{ field(placeholder=field_placeholder) }}
-{% endif %}
-
-{%- if div_class -%}
-    </div>
-{%- endif -%}
-
-{{ field_description(field) }}
-{{ field_errors(field) }}
-{%- endmacro -%}
-
-
-{%- macro render_boolean_field(field, inline=False) -%}
-<div class="checkbox{% if inline %}inline{% endif %}{% if field.errors %}has-error{% endif %}">
-    <label>
-    {{ field(**kwargs) }}
-    {{ field.label.text }}
-    </label>
-    {{ field_description(field) }}
-    {{ field_errors(field) }}
-</div>
-{%- endmacro -%}
-
-
-{%- macro render_select_field(field, div_class='', select_class="form-control") -%}
-<div class="form-group">
-    {% if div_class %}
-    <div class="{{ div_class }}">
-    {% else %}
-    <div class="col-sm-5">
-    {% endif %}
-        <label>{{ field.label.text }}</label>
-        {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
-            {{ field(multiple=True, class=select_class) }}
-        {% else %}
-            {{ field(class=select_class) }}
-        {%- endif -%}
-
-        {{ field_description(field) }}
-        {{ field_errors(field) }}
-    </div>
-</div>
-{%- endmacro -%}
-
-
-{%- macro render_submit_field(field, div_class='', input_class='') -%}
-{% if div_class %}
-<div class="{{ div_class }}">
-{% endif %}
-
-    {{ field(class=input_class or 'btn btn-success') }}
-
-{% if div_class %}
-</div>
-{% endif %}
-{%- endmacro -%}
-
-
-{%- macro render_field(field, with_label=True, div_class='', rows='') -%}
-<div class="form-group{%- if field.errors %} has-error{%- endif %}">
-
-    <div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-5{%- endif -%}">
-        {% if with_label %}
-            <label>{{ field.label.text }}</label>
-        {% endif %}
-
-        {%- if kwargs['required'] or field.flags.required -%}
-            {% if rows %}
-                {{ field(class="form-control", required="required", rows=rows, placeholder=field.label.text, **kwargs) }}
-            {% else %}
-                {{ field(class="form-control", required="required", placeholder=field.label.text, **kwargs) }}
-            {% endif %}
-        {%- else -%}
-            {% if rows %}
-                {{ field(class="form-control", rows=rows, placeholder=field.label.text, **kwargs) }}
-            {% else %}
-                {{ field(class="form-control", placeholder=field.label.text, **kwargs) }}
-            {% endif %}
-        {%- endif -%}
-
-        {{ field_description(field) }}
-        {{ field_errors(field) }}
-    </div>
-</div>
-{%- endmacro -%}
-
-
-{%- macro inline_field(field, label_text='', label_class='') -%}
-<div class="form-group {%- if field.errors %} has-error{%- endif %}">
-    {{field.label(class="sr-only")}}
-
-    <div class="col-sm-4">
-    {%- if kwargs['required'] or field.flags.required -%}
-        {% if label_text %}
-            {{field(class='form-control', placeholder=label_text, required="required", **kwargs)}}
-        {% else %}
-            {{field(class='form-control', placeholder=field.label.text, required="required", **kwargs)}}
-        {% endif %}
-    {%- else -%}
-        {% if label_text %}
-            {{field(class='form-control', placeholder=label_text, **kwargs)}}
-        {% else %}
-            {{field(class='form-control', placeholder=field.label.text, **kwargs)}}
-        {% endif %}
-    {%- endif -%}
-    {{ field_description(field) }}
-    {{ field_errors(field) }}
-    </div>
-</div>
-{%- endmacro -%}
-
-
-{%- macro group_field(field, label_text='', label_class='', css_class='form-control form-grouped') -%}
-    <div class="form-group {%- if field.errors %} has-error{%- endif %}" style="margin-bottom: 0px;">
-        {{field.label(class="sr-only")}}
-
-        {%- if kwargs['required'] or field.flags.required -%}
-            {% if label_text %}
-                {{field(class=css_class, placeholder=label_text, required="required", **kwargs)}}
-            {% else %}
-                {{field(class=css_class, placeholder=field.label.text, required="required", **kwargs)}}
-            {% endif %}
-        {%- else -%}
-            {% if label_text %}
-                {{field(class=css_class, placeholder=label_text, **kwargs)}}
-            {% else %}
-                {{field(class=css_class, placeholder=field.label.text, **kwargs)}}
-            {% endif %}
-        {%- endif -%}
-        {{ field_description(field) }}
-        {{ field_errors(field) }}
-    </div>
-{%- endmacro -%}
-
-
-{%- macro input_group_field(field, label_text='', css_class='form-control') -%}
-    {%- if kwargs['required'] or field.flags.required -%}
-        {% if label_text %}
-            {{field(class=css_class, placeholder=label_text, required="required", **kwargs)}}
-        {% else %}
-            {{field(class=css_class, placeholder=field.label.text, required="required", **kwargs)}}
-        {% endif %}
-    {%- else -%}
-        {% if label_text %}
-            {{field(class=css_class, placeholder=label_text, **kwargs)}}
-        {% else %}
-            {{field(class=css_class, placeholder=field.label.text, **kwargs)}}
-        {% endif %}
-    {%- endif -%}
-{%- endmacro -%}
-
-
-{%- macro horizontal_select_field(field, div_class='', label_class='', select_class="form-control", surrounded_div="col-sm-4") -%}
-<div class="form-group row {%- if field.errors %} has-error{%- endif %}">
-    {% if label_class %}
-        {{ field.label(class=label_class) }}
-    {% else %}
-        {{ field.label(class="col-sm-3 control-label") }}
-    {% endif %}
-
-    {% if div_class %}
-        <div class="{{ div_class }}">
-    {% else %}
-        <div class="col-sm-5">
-    {% endif %}
-
-        <div class="row">
-        {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
-            {{ field(multiple=True, class=select_class, surrounded_div=surrounded_div) }}
-        {% else %}
-            {{ field(class=select_class, surrounded_div=surrounded_div) }}
-        {%- endif -%}
-        </div>
-        {{ field_description(field) }}
-        {{ field_errors(field) }}
-    </div>
-</div>
-{%- endmacro -%}
-
-
-{%- macro horizontal_boolean_field(field, div_class='') -%}
-<div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-offset-3 col-sm-3{%- endif -%}">
-    {{ render_boolean_field(field, **kwargs) }}
-</div>
-{%- endmacro -%}
-
-
-{%- macro horizontal_submit_field(field, div_class='', input_class='') -%}
-<div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-offset-3 col-sm-3{%- endif -%}">
-    {{ field(class=input_class or 'btn btn-success') }}
-</div>
-{%- endmacro -%}
-
-
-{%- macro horizontal_field(field, label_text='', label_class='', div_class='', input_class='') -%}
-<div class="form-group row {%- if field.errors %} has-error{%- endif %}">
-
-    {% if field.type == "BooleanField" or field.type == "SubmitField" %}
-        {% if field.type == "BooleanField" %}
-            {{ horizontal_boolean_field(field, div_class) }}
-        {% else %}
-            {{ horizontal_submit_field(field, div_class) }}
-        {% endif %}
-    {% else %}
-
-        {% if label_class %}
-            {{ field.label(class=label_class) }}
-        {% else %}
-            {{ field.label(class="col-sm-3 control-label") }}
-        {% endif %}
-
-        {% if div_class %}
-            <div class="{{ div_class }}">
-        {% else %}
-            <div class="col-sm-4">
-        {% endif %}
-
-        {%- if kwargs['required'] or field.flags.required -%}
-            {% if label_text %}
-                {{ field(class='form-control', placeholder=label_text, required="required", **kwargs) }}
-            {% else %}
-                {{ field(class='form-control', placeholder=field.label.text, required="required", **kwargs) }}
-            {% endif %}
-        {%- else -%}
-            {% if label_text %}
-                {{ field(class='form-control', placeholder=label_text, **kwargs) }}
-            {% else %}
-                {{ field(class='form-control', placeholder=field.label.text, **kwargs) }}
-            {% endif %}
-        {%- endif -%}
-    </div> <!-- end div_class -->
-    {% endif %}
-
-    {{ field_description(field) }}
-    {{ field_errors(field) }}
-
-</div> <!-- end form-group -->
-{%- endmacro -%}
-
-
-{% macro topnav(endpoint, name, icon='', id='', active=False) %}
-<li {% if id %}id={{id}}{% endif %} {% if endpoint == request.endpoint or active == True %}class="active"{% endif %}>
-    <a href={{ url_for(endpoint) }}>
-        {% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ name }}
-    </a>
-</li>
-{% endmacro %}
-
-{% macro is_active(endpoint, active=False) %}
-    {%- if endpoint == request.endpoint or active == True -%}
-        active
-    {%- endif -%}
-{% endmacro %}
-
-{% macro navlink(endpoint, name, icon='', active='', urlforkwargs=None) %}
-<li {% if endpoint == request.endpoint or endpoint == active or active == True %}class="active"{% endif %}>
-    <a href="{% if urlforkwargs %}{{ url_for(endpoint, **urlforkwargs) }}{% else %}{{ url_for(endpoint) }}{% endif %}">
-        {% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}
-    </a>
-</li>
-{% endmacro %}
-
-{% macro externalnavlink(uri, name, icon='') %}
-<li>
-    <a href="{{uri}}">{% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}</a>
-</li>
-{% endmacro %}
-
-{% macro navtext(text, icon="", cls="") %}
-<li{% if cls %} class="{{ cls }}"{% endif %}><a href="#">{% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ text }}</a></li>
-{% endmacro %}
-
-{% macro navheader(text, icon="", cls="nav-header") %}
-{{ navtext(text, icon, cls) }}
-{% endmacro %}
-
-{% macro navdivider() %}
-<li class="nav-divider"></li>
-{% endmacro %}
-
-{% macro sidebar(items, extra_class="") %}
-{% if items %}
-<ul class="nav {% if extra_class %}{{ extra_class }}{% endif %}">
-    {{ sidebaritems(items) }}
-</ul>
-{% endif %}
-{% endmacro %}
-
-
-{% macro sidebaritems(items) %}
-{% for item in items %}
-    {% if item.content_type == NavigationContentType.link %}
-    {{ navlink(item.endpoint, item.name, item.icon, item.active, item.urlforkwargs) }}
-    {% elif item.content_type == NavigationContentType.external_link %}
-    {{ externalnavlink(item.uri, item.name, item.icon) }}
-    {% elif item.content_type == NavigationContentType.header %}
-    {{ navheader(item.text, cls="sidenav-header") }}
-    {% elif item.content_type == NavigationContentType.divider %}
-    {{ navdivider() }}
-    {% else %}
-    {# skip unknown #}
-    {% endif %}
-{% endfor %}
-{% endmacro %}
-
-
-{% macro tablink_href(endpoint, name, active=False) %}
-<li {% if endpoint == request.endpoint or active %}class="active"{% endif %} >
-    <a href={{ endpoint }} role="tab" data-toggle="tab">{{ name }}</a>
-</li>
-{% endmacro %}
-
-{% macro render_pagination(page_obj, url, ul_class='', sort_by=None, asc=True) %}
-<ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination{%- endif -%}'>
-    {% set ordering = 'asc' if asc == True else 'desc' %}
-    {% set sorting = '&sort_by='+(sort_by|urlencode)+'&order_by='+ordering if sort_by is string else '' %}
-    <li class="disabled"><a href="#"><span class="pages-label">{% trans %}Pages{% endtrans %}:</span></a></li>
-    {%- for page in page_obj.iter_pages() %}
-        {% if page %}
-            {% if page != page_obj.page %}
-                <li><a href="{{ url }}?page={{ page }}{{ sorting }}">{{ page }}</a></li>
-            {% else %}
-                <li class="active"><a href="#">{{ page }}</a></li>
-            {% endif %}
-        {% endif %}
-    {%- else -%}
-        <li class="active"><a href="#">1</a></li>
-    {%- endfor %}
-    {% if page_obj.has_next %}
-        <li><a href="{{ url }}?page={{ page_obj.next_num }}{{ sorting }}">&raquo;</a></li>
-    {% endif %}
-</ul>
-{% endmacro %}
-
-{% macro render_topic_pagination(page_obj, url) %}
-<ul class="pagination pagelink pull-left">
-    <li class="disabled"><a><span class="pages-label">Pages: </span></a></li>
-    {%- for page in page_obj.iter_pages() %}
-        {% if page %}
-            {% if page != page_obj.page %}
-                <li><a href="{{ url }}?page={{ page }}">{{ page }}</a></li>
-            {% else %}
-                <li class="disabled"><a href="#">{{ page }}</a></li>
-            {% endif %}
-        {% endif %}
-    {%- else -%}
-        <li class="disabled"><a href="#">1</a></li>
-    {%- endfor %}
-    {% if page_obj.has_next %}
-        <li><a href="{{ url }}?page={{ page_obj.next_num }}">Next</a></li>
-    {% endif %}
-</ul>
-{% endmacro %}
-
-
-{% macro message_pagination(page_obj, url) %}
-<ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination pagination-sm{%- endif -%}'>
-    {%- for page in page_obj.iter_pages() %}
-        {% if page %}
-            {% if page != page_obj.page %}
-                <li><a href="{{ url }}?page={{ page }}">{{ page }}</a></li>
-            {% else %}
-                <li class="active"><a href="#">{{ page }}</a></li>
-            {% endif %}
-        {% endif %}
-    {%- else -%}
-        <li class="active"><a href="#">1</a></li>
-    {%- endfor %}
-    {% if page_obj.has_next %}
-        <li><a href="{{ url }}?page={{ page_obj.next_num }}">&raquo;</a></li>
-    {% endif %}
-</ul>
-{% endmacro %}
-
-
-{# Generates a some kind of pagination for the posts in topic in the forum view. #}
-{%- macro topic_pages(topic_obj, per_page=10) -%}
-{% set pages = (topic_obj.post_count / per_page)|round(method='ceil')|int %}
-{% set max_pages = 4 %}
-{% set page_count = pages if pages <= max_pages else max_pages %}
-
-{%- if pages > 1 -%}
-[
-    {%- for page in range(1, page_count+1) -%}
-        {% if pages > max_pages and page == max_pages-1 %}
-            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a> ...
-        {% elif pages > max_pages and loop.last %}
-            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ pages }}">{{ pages }}</a>
-        {% else %}
-            <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a>
-        {% endif %}
-    {%- endfor -%}
-]
-{%- endif -%}
-{%- endmacro -%}
-
-
-{#
-Generates a topic url with an anchor to the post
-XXX: Rename to generate_anchor_url to make it universally useful
-#}
-{%- macro generate_post_url(topic, post, page) -%}
-    {%- if page > 1 -%}
-        {{ topic.url }}?page={{ page }}#pid{{ post.id }}
-    {%- else -%}
-        {{ topic.url }}#pid{{ post.id }}
-    {%- endif -%}
-{%- endmacro -%}
-
-
-{#
-Generates the pagination object id in a list.
-For example, on id should continue with 11 on page 2 if per_page is set to 10
-#}
-{%- macro generate_obj_id(obj, page, per_page) -%}
-    {%- if obj.page == 1 -%}
-        {{ page }}
-    {%- else -%}
-        {{ page + (obj.page - 1) * per_page }}
-    {%- endif -%}
-{%- endmacro -%}