{# settings/partials/module_card.html Inline-Einstellungskarte für ein Modul auf der Einstellungsseite. Erwartet im Kontext: data.mod, data.schema, data.values #} {% from "partials/components/ui_macros.html" import btn, btn_save, form_input, form_select, form_textarea %} {% set mod = data['mod'] %} {% set schema = data['schema'] %} {% set values = data['values'] %}
{{ mod.label }}
{# Sektionen mit nur einem Feld: die eigene Überschrift des Feldes (.form-label) wiederholt die Section-Überschrift optisch praktisch 1:1 direkt darunter -- wirkt wie zwei Überschriften hintereinander. Für solche Ein-Feld-Sektionen die .settings-section-label deshalb unterdrücken, das Feld-Label reicht. #} {% set section_sizes = [] %} {% set ns0 = namespace(count=0, started=False) %} {% for field in schema %} {% if field.get('type', 'text') == 'section' %} {% if ns0.started %}{% set _ = section_sizes.append(ns0.count) %}{% endif %} {% set ns0.count = 0 %} {% set ns0.started = True %} {% else %} {% set ns0.count = ns0.count + 1 %} {% endif %} {% endfor %} {% if ns0.started %}{% set _ = section_sizes.append(ns0.count) %}{% endif %} {% set ns = namespace(grid_open=False, grid_cols=1, first_section=True, section_idx=-1) %} {% for field in schema %} {% set ftype = field.get('type', 'text') %} {% if ftype == 'section' %} {% if ns.grid_open %}
{% endif %} {% set ns.section_idx = ns.section_idx + 1 %} {% set single_field_section = section_sizes[ns.section_idx] == 1 %} {% if not single_field_section %} {% endif %} {% set ns.first_section = False %} {% set ns.grid_cols = field.get('cols', 1) %}
{% set ns.grid_open = True %} {% else %} {% if not ns.grid_open %}
{% set ns.grid_open = True %} {% endif %} {% set fkey = field.key %} {% set fval = values.get(fkey, field.get('default', '')) %} {% set fspan = field.get('span', 1) %} {% if fspan > 1 %}
{% endif %}
{% if ftype == 'select' %} {{ form_select(fkey, field.options, fval, placeholder='') }} {% elif ftype in ('checkbox', 'boolean') %} {{ form_select(fkey, [{'value': 'true', 'label': 'Ja'}, {'value': 'false', 'label': 'Nein'}], 'true' if fval in (True, '1', 'true', 'on') else 'false', placeholder='') }} {% elif ftype == 'list' %} {% set flist = fval if fval is iterable and fval is not string else [] %}
{% call btn(attrs='style="gap:5px;" @click="add()"') %} Hinzufügen {% endcall %}
{% elif ftype == 'tags' %} {# Wie 'list' (gleiches Formular-Sende-Format: {{ fkey }}_0, _1, ..., von settings_save_module() identisch geparst), aber als kompakte Badges statt einer Eingabezeile pro Wert -- fuer Listen aus vielen KURZEN Werten (Namen, Tags) uebersichtlicher als 'list', bei laengeren/strukturierten Werten (Pfade o.ae.) bleibt 'list' die bessere Wahl. #} {% set flist = fval if fval is iterable and fval is not string else [] %}
{% call btn(attrs='@click="add()" type="button"') %} Hinzufügen {% endcall %}
{% elif ftype == 'textarea' %} {%- set _ta_attrs -%} style="resize:vertical; font-family:{% if field.get('mono') %}var(--font-mono){% else %}inherit{% endif %};" {%- endset -%} {{ form_textarea(fkey, fval, rows=field.get('rows', 3), placeholder=field.get('placeholder', ''), attrs=_ta_attrs) }} {% elif ftype == 'timezone_select' %} {# T-321-ADMIN: zwei gekoppelte Dropdowns (Region -> Stadt) statt Freitext, deckt alle IANA-Zeitzonen ab, ohne eine ~600-Eintraege-Liste in einem einzigen den Wert schon beim ersten Rendern zu setzen, BEVOR ein per x-for erzeugtes
{% if fspan > 1 %}
{% endif %} {% endif %} {% endfor %} {% if ns.grid_open %}
{% endif %}
{{ btn_save() }}