{# Renders field for bootstrap 3 standards.

Params:
field - WTForm field
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_field(form.email, placeholder='Input email', type='email') }}
#}
{% macro render_field(field, label_visible=true) -%}

<div class="form-group {% if field.errors %}has-error{% endif %} {{ kwargs.pop('class_', '') }}">
    {% if (field.type != 'HiddenField' or field.type !='CSRFTokenField') and label_visible %}
    <label for="{{ field.id }}" class="control-label">{{ field.label }}</label>
    {% endif %}
    {{ field(class_='form-control text-capitalized', **kwargs) }}
    {% if field.errors %}
    {% for e in field.errors %}
    <p class="help-block">{{ e }}</p>
    {% endfor %}
    {% endif %}
</div>
{%- endmacro %}

{# Renders checkbox fields since they are represented differently in bootstrap
Params:
field - WTForm field (there are no check, but you should put here only BooleanField.
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_checkbox_field(form.remember_me) }}
#}
{% macro render_checkbox_field(field) -%}
<div class="checkbox">
    <label>
        {{ field(type='checkbox', **kwargs) }} {{ field.label }}
    </label>
</div>
{%- endmacro %}

{# Renders radio field
Params:
field - WTForm field (there are no check, but you should put here only BooleanField.
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_radio_field(form.answers) }}
#}
{% macro render_radio_field(field) -%}
{% for value, label, _ in field.iter_choices() %}
<div class="radio" style="margin:8pt auto;">
    <label>
        <input type="radio" name="{{ field.id }}" id="{{ field.id }}" value="{{ value }}">{{ label }}
    </label>
    {% if field.errors %}
    {% for e in field.errors %}
    <p class="help-block">{{ e }}</p>
    {% endfor %}
    {% endif %}
</div>
{% endfor %}
{%- endmacro %}


{# Renders WTForm in bootstrap way. There are two ways to call function:
- as macros: it will render all field forms using cycle to iterate over them
- as call: it will insert form fields as you specify:
e.g. {% call macros.render_form(form, action_url=url_for('.login_view'), action_text='Login',
class_='login-form') %}
{{ macros.render_field(form.email, placeholder='Input email', type='email') }}
{{ macros.render_field(form.password, placeholder='Input password', type='password') }}
{{ macros.render_checkbox_field(form.remember_me, type='checkbox') }}
{% endcall %}

Params:
form - WTForm class
method - form method
action_url - url where to submit this form
action_text - text of submit button
class_ - sets a class for form
#}
{% macro render_form(form, action_url='', method='POST', action_text='Submit', class_='', disabled=False,
btn_class='btn btn-default') -%}

<form method="{{ method }}" action="{{ action_url }}" role="form" class="{{ class_ }}">
    {{ form.hidden_tag() if form.hidden_tag }}
    {% if caller %}
        {{ caller() }}
    {% else %}
    {% for f in form %}
    {% if f.id != 'csrf_token' %}
        {% if f.type == 'BooleanField' %}
            {{ render_checkbox_field(f) }}
        {% elif f.type == 'RadioField' %}
            {{ render_radio_field(f) }}
        {% else %}
            {{ render_field(f) }}
        {% endif %}
    {% endif %}
    {% endfor %}
    {% endif %}
    <button type="submit" {% if disabled %} disabled {% endif %} class="{{ btn_class }}">{{ action_text }}</button>
</form>
{%- endmacro %}