2020-05-09 18:00:07 +00:00
|
|
|
{% extends 'skelet.html.j2' %}
|
|
|
|
|
|
|
|
{# 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, horizontal=false) -%}
|
|
|
|
|
|
|
|
<div class="form-group {% if field.errors %}has-error{% endif %} {{ 'row' if horizontal }} {{ kwargs.pop('class_', '') }}">
|
|
|
|
{% if (field.type != 'HiddenField' and field.type !='CSRFTokenField') and label_visible %}
|
|
|
|
<label for="{{ field.id }}" class="control-label {{ 'col-sm-2 col-form-label' if horizontal }}">{{ field.label.text }}</label>
|
|
|
|
{% endif %}
|
|
|
|
<div class="{{ 'col-sm-10' if horizontal }}">
|
|
|
|
{{ field(class_='form-control', **kwargs) }}
|
|
|
|
</div>
|
|
|
|
{% if field.errors %}
|
|
|
|
{% for e in field.errors %}
|
|
|
|
<p class="alert alert-danger">{{ 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">
|
|
|
|
<label>
|
|
|
|
<input type="radio" name="{{ field.id }}" id="{{ field.id }}" value="{{ value }}">{{ label }}
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
{% endfor %}
|
|
|
|
{%- endmacro %}
|
|
|
|
|
2022-02-19 09:22:21 +00:00
|
|
|
{# Renders range 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_range_field(form.answere) }}
|
|
|
|
#}
|
|
|
|
{% macro render_range_field(field) -%}
|
|
|
|
<div class="form-group {% if field.errors %}has-error{% endif %} {{ 'row' if horizontal }} {{ kwargs.pop('class_', '') }}">
|
|
|
|
<label for="{{ field.id }}" class="control-label {{ 'col-sm-2 col-form-label' if horizontal }}">{{ field.label.text }}</label>
|
|
|
|
<div class="{{ 'col-sm-10' if horizontal }}">
|
|
|
|
<div class="row">
|
|
|
|
<div class="col-10">
|
|
|
|
{{ field(class_='form-control', oninput='this.parentElement.nextElementSibling.children[0].value = this.value', **kwargs) }}
|
|
|
|
</div>
|
|
|
|
<div class="col-2">
|
|
|
|
<input onchange="this.parentElement.previousElementSibling.children[0].value = this.value" type="number" class="form-control" max="{{ field.widget.max }}" min="{{ field.widget.min }}" step="{{field.widget.step}}" value="{{ field.data }}" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{% if field.errors %}
|
|
|
|
{% for e in field.errors %}
|
|
|
|
<p class="alert alert-danger">{{ e }}</p>
|
|
|
|
{% endfor %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
{%- endmacro %}
|
|
|
|
|
|
|
|
|
|
|
|
{% macro render_password_field(field, label_visible=true, horizontal=false) -%}
|
|
|
|
|
|
|
|
<div class="form-group {% if field.errors %}has-error{% endif %} {{ 'row' if horizontal }} {{ kwargs.pop('class_', '') }}">
|
|
|
|
<label for="{{ field.id }}" class="control-label {{ 'col-sm-2 col-form-label' if horizontal }}">{{ field.label.text }}</label>
|
|
|
|
<div class="{{ 'col-sm-10' if horizontal }}">
|
|
|
|
{{ field(class_='form-control', **kwargs) }}
|
|
|
|
<i onclick="togglePasswordVisibility(this)" class="far fa-eye toggle-password"></i>
|
|
|
|
</div>
|
|
|
|
{% if field.errors %}
|
|
|
|
{% for e in field.errors %}
|
|
|
|
<p class="alert alert-danger">{{ e }}</p>
|
|
|
|
{% endfor %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
{%- endmacro %}
|
|
|
|
|
|
|
|
|
2020-05-09 18:00:07 +00:00
|
|
|
{# Renders submit 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_submit_field(form.answers) }}
|
|
|
|
#}
|
|
|
|
{% macro render_submit_field(field, btn_class='btn btn-primary') -%}
|
|
|
|
<input type="submit" class="{{ btn_class }}" value="{{ field.label.text }}" />
|
|
|
|
{%- endmacro %}
|
|
|
|
{# Renders form 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_submit_field(form.answers) }}
|
|
|
|
#}
|
|
|
|
{% macro render_form_field(field) -%}
|
|
|
|
<fieldset>
|
|
|
|
{#<legend>{{field.label}}</legend>#}
|
|
|
|
{{ _render_form(field, horizontal=true) }}
|
|
|
|
</fieldset>
|
|
|
|
{%- endmacro %}
|
|
|
|
|
2022-02-19 09:22:21 +00:00
|
|
|
{% macro render_list_field(field, horizontal) -%}
|
2020-05-09 18:00:07 +00:00
|
|
|
<fieldset>
|
|
|
|
<legend>{{ field.label.text }}</legend>
|
2022-02-19 09:22:21 +00:00
|
|
|
{% if field.modify %}
|
|
|
|
<template id='{{field.name}}-template' data-fieldlist-name="{{ field.name }}" data-fieldlist-next-id="{{ field | length }}">
|
2020-05-09 18:00:07 +00:00
|
|
|
<li class="list-group-item">
|
2022-02-19 22:16:13 +00:00
|
|
|
{{ _render_field(field.get_template(), horizontal=true) }}
|
2022-02-19 09:22:21 +00:00
|
|
|
<a class="btn btn-danger" onclick="fieldlist.remove(this)">{{ ('Remove') }}</a>
|
2020-05-09 18:00:07 +00:00
|
|
|
</li>
|
|
|
|
</template>
|
2022-02-19 09:22:21 +00:00
|
|
|
{% endif %}
|
2020-05-09 18:00:07 +00:00
|
|
|
<ul class="list-group">
|
|
|
|
{% for _field in field %}
|
|
|
|
<li class="list-group-item">
|
|
|
|
{{ _render_field(_field) }}
|
2022-02-19 09:22:21 +00:00
|
|
|
{% if field.modify %}
|
|
|
|
<a class="btn btn-danger" onclick="fieldlist.remove(this)">{{ ('Remove') }}</a>
|
|
|
|
{% endif %}
|
2020-05-09 18:00:07 +00:00
|
|
|
</li>
|
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
2022-02-19 09:22:21 +00:00
|
|
|
{% if field.modify %}
|
|
|
|
<a class="btn btn-success" onclick="fieldlist.add(this)">{{ ('Add') }}</a>
|
|
|
|
{% endif %}
|
2020-05-09 18:00:07 +00:00
|
|
|
</fieldset>
|
|
|
|
{%- endmacro %}
|
|
|
|
{% macro _render_field(f) %}
|
|
|
|
{% if f.type == 'BooleanField' %}
|
|
|
|
{{ render_checkbox_field(f, **kwargs) }}
|
|
|
|
{% elif f.type == 'RadioField' %}
|
|
|
|
{{ render_radio_field(f, **kwargs) }}
|
2022-02-19 09:22:21 +00:00
|
|
|
{% elif f.type == 'PasswordField' %}
|
|
|
|
{{ render_password_field(f, **kwargs) }}
|
|
|
|
{% elif f.type == 'DecimalRangeField' %}
|
|
|
|
{{ render_range_field(f, **kwargs) }}
|
2022-02-19 22:16:13 +00:00
|
|
|
{% elif f.type == 'URLField' %}
|
|
|
|
{{ render_field(f, **kwargs) }}
|
2020-05-09 18:00:07 +00:00
|
|
|
{% elif f.type == 'SubmitField' %}
|
|
|
|
{{ render_submit_field(f, **kwargs) }}
|
|
|
|
{% elif f.type == 'FormField' %}
|
|
|
|
{{ render_form_field(f, **kwargs) }}
|
|
|
|
{% elif f.type == 'ModelFieldList' %}
|
|
|
|
{{ render_list_field(f, **kwargs) }}
|
|
|
|
{% elif f.type == 'FieldList' %}
|
|
|
|
{{ render_list_field(f, **kwargs) }}
|
|
|
|
{% else %}
|
|
|
|
{{ render_field(f, **kwargs) }}
|
|
|
|
{% endif %}
|
|
|
|
{% endmacro %}
|
|
|
|
{% macro _render_form(form) -%}
|
|
|
|
{% if caller %}
|
|
|
|
{{ caller() }}
|
|
|
|
{% else %}
|
|
|
|
{% for f in form %}
|
|
|
|
{{ _render_field(f, **kwargs) }}
|
|
|
|
{% endfor %}
|
|
|
|
{% endif %}
|
|
|
|
{%- 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
|
|
|
|
action_url - url where to submit this form
|
|
|
|
action_text - text of submit button
|
|
|
|
class_ - sets a class for form
|
|
|
|
#}
|
2022-05-27 10:35:28 +00:00
|
|
|
{% macro render_form(form, action_url='', action_text='Submit', class_='', btn_class='btn btn-primary', method='post', onsubmit='') -%}
|
2020-05-09 18:00:07 +00:00
|
|
|
|
2022-05-27 10:35:28 +00:00
|
|
|
<form method="{{ method }}" {% if action_url %}action="{{ action_url }}" {% endif %}{% if onsubmit %}onsubmit="{{ onsubmit }}" {% endif %}role="form" class="{{ class_ }}">
|
2020-05-09 18:00:07 +00:00
|
|
|
<input name="form" type="hidden" value="{{ form.__class__.__name__ }}">
|
|
|
|
{{ _render_form(form) }}
|
2022-02-19 09:22:21 +00:00
|
|
|
{% if not form.submit %}
|
|
|
|
<button type="submit" class="{{ btn_class }}">{{ action_text }} </button>
|
|
|
|
{% endif %}
|
2020-05-09 18:00:07 +00:00
|
|
|
</form>
|
|
|
|
{%- endmacro %}
|
|
|
|
|