#----
{#
== Form Helpers ==
Macros to create form input, select, radio, checkbox, textarea compatible to BS3
::Input: @value
{{ f.tag('input', 'name', value='John', data={"k":"v", "k":"v"}) }}
->
{{ f.tag('input', 'fileSelect', type='file') }}
->
::Hidden: @value
{{ f.tag('hidden', 'name', value='John') }}
->
::Textarea: @value
{{ f.tag('textarea', 'feedback', value='Irving') }}
->
:: Button: @type, @value
{{ f.tag('button', 'my_button', type='submit', value='Save')}}
-> Save
{{ f.tag('button', 'submit', type='submit')}}
-> Submit
:: Checkbox: @options=[[k, v], [k, v]], @checked=[]
{{ f.tag('checkbox', 'test', options=[[1,'Male'], [2,'Female']], checked=[1]) }}
Male
Female
:: Radio: @options=[[k, v], [k, v]], @checked=[]
{{ f.tag('radio', 'test', options=[[1,'Male'], [2,'Female']], checked=[1]) }}
Male
Female
:: Select: @options=[[k, v], [k, v]], @selected
{{ f.tag('select', 'gender', options=[['m', 'Male'], ['f', 'Female']], selected='f') }}
Male
Female
:: Select-group: @options=[[k, v], [k, v]], @selected
{{ f.tag('select-group', 'gender', options={"List of genders": [['m', 'Male'], ['f', 'Female']], ...}, selected='f') }}
Male
Female
#}
{% macro tag(_tag, name) -%}
{% set _class = kwargs.pop('class', 'form-control') %}
{% set _data_ = kwargs.pop('data', none) %}
{% set _data = "" %}
{% if _data_ %}
{% for _k, _v in _data_.items() %}
{% set _data = _data + " data-{{ _k }} =\"{{ _v }}\" " %}
{% endfor %}
{% endif %}
{{ _data }}
{# input or hidden field #}
{%- if _tag == "input" or _tag == "hidden" -%}
{%- set _type = kwargs.pop('type', 'text') %}
{# Hidden field #}
{% if _tag == "hidden" %}
{% set _type = "hidden" %}
{% endif %}
{# textarea: @value #}
{% elif _tag == "textarea" -%}
{% set value = kwargs.pop('value', '') %}
{# button: @text=str, @type=str #}
{% elif _tag == "button" -%}
{% set _type = kwargs.pop('type', 'button') %}
{% set value = kwargs.pop('text', '') %}
{{ value if text is defined and value != "" else (name|capitalize()) }}
{# radio|checkbox: @checked=[], @options=[[k, v], [k,v]], @display_inline=bool #}
{% elif _tag in ['radio', 'checkbox'] -%}
{% set checked = kwargs.pop('checked', []) %}
{% set options = kwargs.pop('options', []) %}
{% set display_inline = kwargs.pop('display_inline', False) %}
{% for item in options %}
{{ item[1] }}
{% endfor %}
{# select: @options=[[k, v], [k, v]], @selected=str #}
{%- elif _tag == "select" -%}
{% set selected = kwargs.pop('selected', '') %}
{% set options = kwargs.pop('options', []) %}
{% for item in options %}
{{item[1] if item[1] is defined else item[0] }}
{% endfor %}
{# select-group: @options={"group_name":[[k, v], [k, v]], ... }, @selected=str #}
{%- elif _tag == "select-group" -%}
{% set selected = kwargs.pop('selected', '') %}
{% set groups = kwargs.pop('options', {}) %}
{% for group_name, options in groups.items() -%}
{% for item in options %}
{{item[1] if item[1] is defined else item[0] }}
{% endfor %}
{%- endfor %}
{%- endif -%}
{%- endmacro %}
{# ----- #}
{#:: Label
{{ f.label('name', 'First name') }}
-> First name
{{ f.label('name') }}
-> Name
{{ f.label('name', class='label', id='name-label') }}
-> Name
#}
{% macro label(for_name, title) %}
{{ (title) if (title is defined and title != "") else (for_name|capitalize()) }}
{% endmacro %}
{# ----- #}
{#:: Form-Group
Same as tag, except it wrap it in from-group
#}
{% macro group(_tag, name) %}
{% set _label = kwargs.pop('label', '') %}
{{ label(name, _label) }}
{{ tag(_tag, name, **kwargs) }}
{% endmacro %}
{#:: CSRF_FIELD
To secure post form by adding a csrf field in hit
:#}
{% macro csrf_field() %}
{{ tag('hidden', '_csrf_token', value=csrf_token() ) }}
{% endmacro %}