{# 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 %} {%- 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) -%}