{{ csrf_input | safe if csrf_input }} {% if actions %}
selected {% if page.total is not none %} All {{ "{:,}".format(page.total) }} matching rows are selected. {% endif %} {% for item in actions %} {% if item.needs_dialog %} {% else %} {% endif %} {% endfor %}
{% endif %}
{% if actions %} {% endif %} {% for path in columns %} {% set state = sort_state(request, path) %} {% endfor %} {% for row in page %} {% set key = view.identity_of(row) %} {% if actions %} {% endif %} {% for path in columns %} {% set widget = view.field_for(path).widget %} {% set text = view.display(row, path) %} {% endfor %} {% else %} {% endfor %}
{{ view.label_for(path) }} {% if state == "asc" %}{% endif %} {% if state == "desc" %}{% endif %}
{% if loop.first %} {{ text or view.title_of(row) }} {% elif widget == "select" and text %} {{ text }} {% elif widget == "checkbox" and text %} {{ text }} {% else %} {{ text }} {% endif %} Edit
No {{ view.label_plural|lower }} to show.
{#- Each dialog is its own form, so a required input in one dialog never stops another action from submitting. On submit it copies the ticked rows across from the table. -#} {% for item in actions if item.needs_dialog %} {% endfor %}
{% if page.total is not none %} {{ page.first_position }} to {{ page.last_position }} of {{ "{:,}".format(page.total) }} {% else %} {{ page.first_position }} to {{ page.last_position }} {% endif %} {% set previous = urls.here(page=page_number - 1 if page_number > 2 else None) %} {% set next = urls.here(page=page_number + 1) %}
Previous Page {{ page_number }} Next