{# macros/form_fields.html — Complete widget macro library for form rendering. Usage: {% from "macros/form_fields.html" import render_field %} {{ render_field(field_ctx, model_name) }} field_ctx is a FieldRenderContext with: .meta — FieldMeta (name, label, required, readonly, help_text, placeholder, extra) .widget_macro — str macro name .widget_context — dict from widget.render_context() .errors — list[str] #} {# ─── Dispatcher ────────────────────────────────────────────────────────── #} {% macro render_field(field_ctx, model_name) %} {% set m = field_ctx.widget_macro %} {% if m == "text_input" %}{{ _text_input(field_ctx, model_name) }} {% elif m == "textarea" %}{{ _textarea(field_ctx, model_name) }} {% elif m == "number_input" %}{{ _number_input(field_ctx, model_name) }} {% elif m == "toggle" %}{{ _toggle(field_ctx) }} {% elif m == "select" %}{{ _select(field_ctx, model_name) }} {% elif m == "date_picker" %}{{ _date_picker(field_ctx, model_name) }} {% elif m == "datetime_picker" %}{{ _datetime_picker(field_ctx, model_name) }} {% elif m == "time_picker" %}{{ _time_picker(field_ctx, model_name) }} {% elif m == "json_editor" %}{{ _json_editor(field_ctx) }} {% elif m == "password_input" %}{{ _password_input(field_ctx, model_name) }} {% elif m == "readonly" %}{{ _readonly(field_ctx) }} {% elif m == "hidden" %}{{ _hidden(field_ctx) }} {% elif m == "email_input" %}{{ _email_input(field_ctx, model_name) }} {% elif m == "url_input" %}{{ _url_input(field_ctx, model_name) }} {% elif m == "phone_input" %}{{ _phone_input(field_ctx, model_name) }} {% elif m == "color_picker" %}{{ _color_picker(field_ctx) }} {% elif m == "slug" %}{{ _slug(field_ctx, model_name) }} {% elif m == "image_upload" %}{{ _image_upload(field_ctx) }} {% elif m == "file_upload" %}{{ _file_upload(field_ctx) }} {% elif m == "tag_input" %}{{ _tag_input(field_ctx) }} {% elif m == "relation_picker" %}{{ _relation_picker(field_ctx) }} {% elif m == "multi_relation" %}{{ _multi_relation(field_ctx) }} {% else %} {{ _text_input(field_ctx, model_name) }} {% endif %} {% endmacro %} {# ─── Shared helpers ────────────────────────────────────────────────────── #} {% macro _field_wrapper_open(field_ctx) %} {% set name = field_ctx.meta.name %} {% set has_error = field_ctx.errors | length > 0 %} {% set full_width = field_ctx.meta.extra.get('full_width', false) %}
{{ field_ctx.meta.help_text }}
{% endif %} {% endmacro %} {% macro _htmx_validate(field_ctx, model_name, trigger="blur") %} hx-post="{{ admin_path }}/{{ model_name }}/validate-field" hx-trigger="{{ trigger }}" hx-target="#field-wrapper-{{ field_ctx.meta.name }}" hx-swap="outerHTML" hx-vals='{"field_name": "{{ field_ctx.meta.name }}"}' {% endmacro %} {# ─── Text Input ────────────────────────────────────────────────────────── #} {% macro _text_input(field_ctx, model_name) %} {% set name = field_ctx.meta.name %} {% set val = field_ctx.widget_context.value | default('') %} {% set has_error = field_ctx.errors | length > 0 %} {{ _field_wrapper_open(field_ctx) }} {{ _label(field_ctx) }} {{ _errors(field_ctx) }} {{ _help_text(field_ctx) }} {{ _field_wrapper_close() }} {% endmacro %} {# ─── Textarea ──────────────────────────────────────────────────────────── #} {% macro _textarea(field_ctx, model_name) %} {% set name = field_ctx.meta.name %} {% set val = field_ctx.widget_context.value | default('') %} {% set rows = field_ctx.widget_context.rows | default(5) %} {% set has_error = field_ctx.errors | length > 0 %} {{ _field_wrapper_open(field_ctx) }} {{ _label(field_ctx) }} {{ _errors(field_ctx) }} {{ _help_text(field_ctx) }} {{ _field_wrapper_close() }} {% endmacro %} {# ─── Number Input ──────────────────────────────────────────────────────── #} {% macro _number_input(field_ctx, model_name) %} {% set name = field_ctx.meta.name %} {% set val = field_ctx.widget_context.value | default('') %} {% set step = field_ctx.widget_context.step | default('1') %} {% set min = field_ctx.widget_context.min %} {% set max = field_ctx.widget_context.max %} {% set has_error = field_ctx.errors | length > 0 %} {{ _field_wrapper_open(field_ctx) }} {{ _label(field_ctx) }} {{ _errors(field_ctx) }} {{ _help_text(field_ctx) }} {{ _field_wrapper_close() }} {% endmacro %} {# ─── Toggle (Boolean) ─────────────────────────────────────────────────── #} {% macro _toggle(field_ctx) %} {% set name = field_ctx.meta.name %} {% set val = field_ctx.widget_context.value %} {{ _field_wrapper_open(field_ctx) }} {{ _label(field_ctx) }}