{# Reusable list-page chrome (header, segments, search + filters + per-page + pagination). Consumed by every dashboard list page. Keeps markup + query-param wiring in ONE place so the look/behaviour stays consistent. Macros: list_header(title, eyebrow, total, total_label, subtitle, actions) segments(base_url, items, active_key, search_value, filters, extra_params) list_controls(base_url, search_value, ..., filters, per_page, ...) list_pagination(base_url, page, per_page, total, ...) `filters` is a list of: {name, label, value, options: [(value, label), ...]} `extra_params` is a flat dict of additional query params to preserve on pagination links (e.g. ?status= on Patterns). #} {% macro list_header(title, eyebrow=None, total=None, total_label='total', subtitle=None, actions=[]) %} {% endmacro %} {% macro segments(base_url, items, active_key, search_value='', filters=[], extra_params={}) %} {# Tab-style segmented control. items = [(key, label, count_or_none)]. #} {% set base_qs = [] %} {% if search_value %}{% set _ = base_qs.append('q=' ~ search_value) %}{% endif %} {% for flt in filters %}{% if flt.value %}{% set _ = base_qs.append(flt.name ~ '=' ~ flt.value) %}{% endif %}{% endfor %} {% for k, v in extra_params.items() %}{% if v %}{% set _ = base_qs.append(k ~ '=' ~ v) %}{% endif %}{% endfor %} {% set base_qs_str = '&'.join(base_qs) %}
{% for key, label, count in items %} {% set href = base_url ~ '?' ~ (('status=' ~ key) if key else 'status=all') %} {% if base_qs_str %}{% set href = href ~ '&' ~ base_qs_str %}{% endif %} {{ label }} {% if count is not none %}{{ count }}{% endif %} {% endfor %}
{% endmacro %} {% macro list_controls(base_url, search_value='', search_placeholder='Search…', filters=[], per_page=50, per_page_options=[25, 50, 100, 200], reset_label='Reset', show_per_page=True) %} {% endmacro %} {% macro list_pagination(base_url, page, per_page, total, search_value='', filters=[], extra_params={}, shown=None) %} {% if total > per_page %} {% set last_page = ((total - 1) // per_page) + 1 %} {% set prev_page = page - 1 if page > 1 else 0 %} {% set next_page = page + 1 if page < last_page else 0 %} {% set base_qs = [] %} {% if search_value %}{% set _ = base_qs.append('q=' ~ search_value) %}{% endif %} {% if per_page %}{% set _ = base_qs.append('per_page=' ~ per_page) %}{% endif %} {% for flt in filters %}{% if flt.value %}{% set _ = base_qs.append(flt.name ~ '=' ~ flt.value) %}{% endif %}{% endfor %} {% for k, v in extra_params.items() %}{% if v %}{% set _ = base_qs.append(k ~ '=' ~ v) %}{% endif %}{% endfor %} {% set base_qs_str = '&'.join(base_qs) %}
Page {{ page }} of {{ last_page }} {% if shown is not none %}· showing {{ shown }} of {{ total }}{% else %}· {{ total }} total{% endif %}
{% if prev_page %} ← Prev {% endif %} {% if next_page %} Next → {% endif %}
{% elif total %}

Showing {{ total }} row(s).

{% endif %} {% endmacro %}