{% for row in rows %} {% for column in spec.list_columns %}{{ render_value(row[column]) }}{% endfor %} {% else %} {# ``after`` is set only on a paging request: an exhausted page is not an empty result set, so it must not claim there is nothing here. #} {% if not after %} Nothing matches this view yet. {% endif %} {% endfor %} {% if cursor %} {# The trigger row swaps *itself* for the next page plus a fresh trigger, so rows accumulate. Its URL carries the current search and filters: the next page has to be drawn from the same result set the reader is already looking at. #} {% set query = dict(filters | default({}), after=cursor) %} {% if search %}{% set _ = query.update(search=search) %}{% endif %} {% endif %}