{# Macros for form and form field rendering. Connects WTForms, Fomantic-UI and HTMX. #} {% macro render_input( field, label_visible=true, icon=none, container=true, noindicator=false, indicator_icon=none, indicator_text=none, display=true, add_button=false, del_button=false ) -%} {%- set field_visible = field.type != 'HiddenField' and field.type !='CSRFTokenField' -%} {%- set disabled = kwargs.get("disabled") or (field.render_kw and "disabled" in field.render_kw) -%} {%- set readonly = kwargs.get("readonly") or (field.render_kw and "readonly" in field.render_kw) -%} {%- set required = "required" in field.flags -%} {%- set lock_indicator = readonly or disabled -%} {%- set corner_indicator = not noindicator and (indicator_icon or lock_indicator or required) -%} {%- set inline_validation = field.validators and field.type not in ("FileField", "MultipleFileField") -%} {%- if inline_validation -%} {%- set ignore_me = kwargs.update({"hx-post": ""}) -%} {%- set ignore_me = kwargs.update({"hx-indicator": "closest .input", "hx-trigger": "input changed delay:500ms"}) -%} {%- endif -%} {%- if request.headers.get("HX-Request") and not request.headers.get("HX-Boosted") -%} {# Prevent password to be automatically refilled when reset during edition #} {%- if field.type == "PasswordField" -%} {%- set ignore_me = kwargs.update({"autocomplete": "new-password"}) -%} {%- else -%} {%- set ignore_me = kwargs.update({"autocomplete": "off"}) -%} {%- endif -%} {%- endif -%} {% if container and field_visible -%} {# open field container #}
{% endif -%} {%- if field_visible and label_visible -%} {{ field.label() }} {%- endif -%} {%- if field_visible -%} {# open action container #} {% if add_button or del_button %}
{% endif %} {# input container #}
{% endif %} {% if icon %}{% endif %} {% if field.description %}{% endif %} {# Hotfix for the focus issue concerning type="email" inputs. # https://gitlab.com/yaal/canaille/-/issues/279 #} {% if field.type == "EmailField" %} {{ field(type="text", **kwargs) }} {% elif field.type not in ("SelectField", "SelectMultipleField") %} {{ field(**kwargs) }} {% elif field.type == "SelectMultipleField" and readonly %} {{ field(class_="ui fluid dropdown multiple read-only", **kwargs) }} {% elif field.type == "SelectMultipleField" %} {{ field(class_="ui fluid dropdown multiple", **kwargs) }} {% elif field.type == "SelectField" and readonly %} {{ field(class_="ui fluid dropdown read-only", **kwargs) }} {% elif field.type == "SelectField" %} {{ field(class_="ui fluid dropdown", **kwargs) }} {% endif %} {% if not noindicator %} {% if indicator_icon %}
{% elif lock_indicator %}
{% elif required %}
{% endif %} {% endif %} {% if field_visible %} {# close input container #}
{% if caller is defined %} {{ caller() }} {% else %} {% if del_button %} {% endif %} {% if add_button and not readonly and not disabled %} {% endif %} {# close action container #} {% if add_button or del_button %}
{% endif %} {% endif %} {% endif %} {% if field.errors %} {% for error in field.errors %}

{{ error }}

{% endfor %} {% endif %} {% set display_strength_indicator = field.render_kw and "class" in field.render_kw and "password_strength" in field.render_kw["class"] %} {% set strength = field.data|password_strength %} {% if display_strength_indicator and strength and not field.errors %}

{% trans %}Password strength{% endtrans %}

{% endif %} {% if container and field_visible %} {# close field container #}
{% endif %} {%- endmacro %} {% macro render_fields(form) %} {% for field in form %} {{ render_field(field) }} {% endfor %} {% endmacro %} {% macro render_field(field, parent_list=none, parent_indice=none) -%} {% if parent_list %} {% set last = parent_indice >= parent_list.entries|len -1 %} {% set ignore_me = kwargs.update({ "label_visible": false, "add_button": (last and (not parent_list.max_entries or parent_indice < parent_list.max_entries)), "del_button": (last and parent_list.min_entries and parent_indice >= parent_list.min_entries), }) %} {% endif %} {% if field.type == "FieldList" %} {{ render_list(field, **kwargs) }} {% elif field.type == "BooleanField" %} {{ render_checkbox(field, **kwargs) }} {% else %} {{ render_input(field, **kwargs) }} {% endif %} {%- endmacro %} {% macro render_list(field, render_func=none) -%}
{# Strangely enough, translations are not rendered when using field.label() #} {{ field[0].label() }} {% for subfield in field %} {% set ignore_me = kwargs.update(**field.render_kw or {}) %} {{ (render_func or render_field)( subfield, parent_list=field, parent_indice=loop.index0, **kwargs ) }} {% endfor %}
{%- endmacro %} {% macro render_checkbox(field, display=true) -%}
{{ field(**kwargs) }} {{ field.label() }}
{%- endmacro %} {% macro render_form( form, action_text=none, class_='', btn_class='ui right floated primary button', action=none, id=none, csrf=true) -%}
{% if caller is defined %} {% if csrf %} {% endif %} {{ caller() }} {% else %} {{ render_fields(form) }} {% endif %} {% if action_text %}
{% endif %}
{%- endmacro %}