{# ========================================================================== Wiederverwendbare Bausteine. Import in Templates: {% from "tesm_core/macros.html" import field, card_header, pill, ... %} ========================================================================== #} {% macro csrf(token) -%} {%- endmacro %} {% macro hint(text) -%} {% if text %}?{% endif %} {%- endmacro %} {% macro field(name, label, value='', type='text', required=False, hint_text='', placeholder='', autocomplete='', readonly=False, disabled=False, error='', extra_class='', attrs='') -%} {%- endmacro %} {% macro select_field(name, label, options, selected='', hint_text='', required=False, disabled=False, extra_class='', attrs='') -%} {%- endmacro %} {% macro textarea_field(name, label, value='', rows=4, hint_text='', placeholder='', extra_class='', mono=False) -%} {%- endmacro %} {# Ein nicht angehakter Haken sendet **nichts**. Wer die gesendeten Felder auswertet, sieht ihn deshalb als "nicht angegeben" -- und liess den alten Wert stehen: Haken raus, speichern, "keine Änderungen". Diese versteckte Marke sagt "dieses Feld war im Formular", der Haken selbst sagt "an". Damit sind alle drei Fälle unterscheidbar: an, aus, nicht Teil des Formulars (Teilformulare dürfen fremde Schalter nicht löschen). Kein ``disabled``-Fall: ein deaktivierter Haken darf auch nicht als "aus" gespeichert werden, also fällt die Marke dann ebenfalls weg. #} {% macro _present(name, disabled=False) -%} {% if not disabled %}{% endif %} {%- endmacro %} {% macro checkbox(name, label, checked=False, value='1', hint_text='', disabled=False) -%} {%- endmacro %} {% macro switch(name, label, checked=False, value='1', disabled=False) -%} {%- endmacro %} {% macro pill(label, kind='') -%} {{ label }} {%- endmacro %} {% macro badge(label) -%}{{ label }}{%- endmacro %} {% macro card_header(title, sub='', icon_name='') -%}
{% if icon_name %}{{ icon(icon_name, size=17) }}{% endif %}{{ title }}
{% if sub %}
{{ sub }}
{% endif %}
{{ caller() if caller is defined else '' }}
{%- endmacro %} {% macro empty_state(title, text='', icon_name='info', node_id='') -%}
{{ icon(icon_name, size=34) }}
{{ title }}
{% if text %}

{{ text }}

{% endif %} {{ caller() if caller is defined else '' }}
{%- endmacro %} {% macro alert(text, kind='info', title='') -%}
{{ icon({'info': 'info', 'success': 'check', 'warning': 'alert', 'danger': 'alert'}[kind], size=18) }}
{% if title %}
{{ title }}
{% endif %} {{ text }}
{%- endmacro %} {% macro search_box(target_id, placeholder='Suchen ...', count_id='', empty_id='') -%} {{ icon('search', size=15) }} {%- endmacro %} {% macro stat(label, value, kind='', hint_text='', href='', filter_value='') -%} {% if href %} {% elif filter_value %} {% else %}{% endif %} {%- endmacro %} {% macro modal(node_id, title, sub='', size='') -%} {{ caller() }} {%- endmacro %} {% macro kv_row(label, value) -%}
{{ label }}
{{ value if value not in (None, '') else '–' | safe }}
{%- endmacro %} {#- Rechtematrix: einmal geschrieben, in beiden Anwendungen benutzt -#} {% macro permission_matrix(tree, action_meta, state, disabled=False, field_prefix='permissions') -%}
{% for area in tree.areas %} {% set columns = area.columns() %} {% for action in columns %} {% endfor %} {% for action in columns %}{% endfor %} {% for resource in area.resources %} {% for action in columns %} {% endfor %} {% endfor %} {% endfor %}
{{ area.label }} {{ action_meta[action][0] }}
{{ resource.label }} {% if resource.hint %}{{ resource.hint }}{% endif %} {% if resource.has(action) %} {% else %} {# Bewusst *kein* Eingabefeld: ein deaktiviertes Kästchen hat das JS beim Einschalten des Bereichs wieder freigegeben, es liess sich anhaken, hatte aber kein name-Attribut -- es sah erteilt aus und war nach dem Speichern weg. Was es nicht gibt, ist hier deshalb gar kein Bedienelement. #} nicht vorgesehen {% endif %}
{% for action, meta in action_meta.items() %} {{ meta[0] }} {{ meta[1] }} – {{ meta[2] }} {% endfor %} Für diese Zeile nicht vorgesehen – die Spalte gehört zu einer anderen Zeile desselben Bereichs.
{%- endmacro %} {# -------------------------------------------------------------------------- Navigationsreihenfolge. Die Reihenfolge der versteckten Felder ist die Reihenfolge -- verschiebt sich eine Zeile, verschiebt sich das Feld mit ihr. Ziehen mit der Maus oder die zwei Knoepfe je Zeile; auf einem Tablet sind die Knoepfe der verlaessliche Weg. -------------------------------------------------------------------------- #} {% macro _reorder_row(item, field_name, label) -%}
  • 1 {{ icon(item.icon, size=15) }} {{ item.label }}
  • {%- endmacro %} {% macro nav_order_card(items, order, child_order, action, csrf_field, csrf_value, sub='Gilt für alle Benutzer; jeder sieht weiter nur, was er darf') -%}
    {{ icon('sliders', size=17) }} Navigationsreihenfolge
    {{ sub }}
      {% for key in order %} {% set item = items | selectattr('key', 'equalto', key) | list | first %} {% if item %} {{ _reorder_row(item, 'order', item.label) }} {% if item.children %}
      1. {% set kinder = child_order.get(item.key) or (item.children | map(attribute='key') | list) %} {% for child_key in kinder %} {% set child = item.children | selectattr('key', 'equalto', child_key) | list | first %} {% if child %} {{ _reorder_row(child, 'child_order_' ~ item.key, item.label ~ ' / ' ~ child.label) }} {% endif %} {% endfor %}
    1. {% endif %} {% endif %} {% endfor %}

    Zeilen ziehen oder mit den Pfeilen verschieben, dann speichern. Untergeordnete Punkte werden innerhalb ihrer Gruppe sortiert.

    {%- endmacro %}