{% macro widget_slot(field, control_id, locale) -%} {% if field.widget %}{% endif %} {%- endmacro %} {% macro render_field(field, locale, values, errors) -%} {% set localized = locale is not none %} {% set locale_code = locale.code if localized else '' %} {% set control_id = 'cm-field-' ~ block.id ~ '-' ~ field.name ~ ('-' ~ locale_code if localized else '') %} {% set label_control_id = control_id ~ '-start' if field.type == 'date_range' else control_id %} {% set field_value = values[field.name] if field.name in values else field.default %} {% set field_errors = errors.get(field.name, ()) %} {% set help_id = control_id ~ '-help' %} {% set errors_id = control_id ~ '-errors' %} {% set ns = namespace(input_type='text', required=field.required, min=none, max=none, minlength=none, maxlength=none, pattern=none, step=none) %} {% for validator in field.validators %} {% if validator.kind == 'required' %}{% set ns.required = true %}{% endif %} {% if validator.kind == 'email' %}{% set ns.input_type = 'email' %}{% endif %} {% if validator.kind == 'url' %}{% set ns.input_type = 'url' %}{% endif %} {% if validator.kind == 'integer' %}{% set ns.step = '1' %}{% endif %} {% if validator.kind == 'min' %}{% set ns.min = validator.value %}{% endif %} {% if validator.kind == 'max' %}{% set ns.max = validator.value %}{% endif %} {% if validator.kind == 'min_length' %}{% set ns.minlength = validator.value %}{% endif %} {% if validator.kind == 'max_length' %}{% set ns.maxlength = validator.value %}{% endif %} {% if validator.kind == 'pattern' %}{% set ns.pattern = validator.value %}{% endif %} {% endfor %} {% set described = (help_id if field.help else '') ~ (' ' ~ errors_id if field_errors else '') %}
{% if field.type == 'textarea' %} {{ widget_slot(field, control_id, locale) }} {% elif field.type == 'select' or field.type == 'multiselect' %} {{ widget_slot(field, control_id, locale) }} {% elif field.type == 'boolean' %} {{ widget_slot(field, control_id, locale) }} {% elif field.type == 'date_range' %} {% set range_value = field_value if field_value is mapping else {} %}
{{ widget_slot(field, control_id ~ '-start', locale) }}{{ widget_slot(field, control_id ~ '-end', locale) }}
{% elif field.type == 'file' %} {{ widget_slot(field, control_id, locale) }} {% elif field.type == 'number' %} {{ widget_slot(field, control_id, locale) }} {% elif field.type == 'date' %} {{ widget_slot(field, control_id, locale) }} {% else %} {{ widget_slot(field, control_id, locale) }} {% endif %} {% if field.help %}{{ field.help | e }}{% endif %} {% if field_errors %}{% endif %}
{%- endmacro %} {% macro render_fields_for_set(fieldset) -%} {% if block.translations %} {% for locale in block.translations.locales %} {% set locale_fields = namespace(has=false) %} {% for field in block.fields %}{% if field.localized and field.name in fieldset.fields %}{% set locale_fields.has = true %}{% endif %}{% endfor %} {% if locale_fields.has %}
{{ locale.label | e }}{% for field in block.fields %}{% if field.localized and field.name in fieldset.fields %}{{ render_field(field, locale, block.translations.values.get(locale.code, {}), block.translations.errors.get(locale.code, {})) }}{% endif %}{% endfor %}
{% endif %} {% endfor %} {% endif %} {% for field in block.fields %}{% if not field.localized and field.name in fieldset.fields %}{{ render_field(field, none, block.values, block.errors) }}{% endif %}{% endfor %} {%- endmacro %} {% set grouped = namespace(fields=[]) %}
{% for fieldset in block.fieldsets %} {% set grouped.fields = grouped.fields + fieldset.fields | list %}
1 %} style="--cm-form-columns: {{ fieldset.columns }}"{% endif %}>{{ fieldset.label or fieldset.id | e }}{{ render_fields_for_set(fieldset) }}
{% endfor %} {% if block.translations %} {% for locale in block.translations.locales %} {% set locale_fields = namespace(has=false) %} {% for field in block.fields %}{% if field.localized and field.name not in grouped.fields %}{% set locale_fields.has = true %}{% endif %}{% endfor %} {% if locale_fields.has %}
{{ locale.label | e }}{% for field in block.fields %}{% if field.localized and field.name not in grouped.fields %}{{ render_field(field, locale, block.translations.values.get(locale.code, {}), block.translations.errors.get(locale.code, {})) }}{% endif %}{% endfor %}
{% endif %} {% endfor %} {% endif %} {% for field in block.fields %}{% if not field.localized and field.name not in grouped.fields %}{{ render_field(field, none, block.values, block.errors) }}{% endif %}{% endfor %} {% if block.submit %}{% endif %}