{# The table, its pagination and its empty states. Rendered on its own when the list updates live, and included by list.html otherwise, so both paths render exactly the same markup from exactly the same context. A separate "partial" template is how the two quietly drift apart. #} {% if page.items %}
{% if actions %} {% endif %} {% for column in columns %} {% endfor %} {% for row in rows %} {# The whole row opens the record, not only the pencil. Hunting for a 16px target to open a row people have already pointed at is a step with no purpose. The linked cell is still a real link, so middle click, Ctrl+click and the keyboard all still work -- this only adds a shortcut for the plain click that lands anywhere else. #} {% if actions %} {% endif %} {% for cell in row.cells %} {% endfor %} {% endfor %}
{% if column.sort_url %} {{ column.label }} {% else %} {{ column.label }} {% endif %} {{ _("Actions") }}
{% if cell.boolean %} {{ cell.value|ff_bool }} {% elif cell.image %} {# A picture answers "which of these is the right one" faster than the stored path ever could, and the path was what this cell used to print. `loading="lazy"`, because a hundred-row page would otherwise open a hundred requests before anyone scrolled to them. #} {% if cell.thumb %} {% else %} {# A placeholder rather than nothing: rows with a picture and rows without keep the same height, so the table does not comb. #} {% endif %} {% elif cell.url %} {{ cell.value|ff_display }} {% else %} {{ cell.value|ff_display }} {% endif %} {# Icon buttons, always drawn. Text links revealed on hover meant the actions were invisible until the mouse found them, and invisible altogether on a touch screen. #}
{{ ff_icon("edit", size=15) }} {{ _("Edit {name}", name=row.label) }} {# `data-ff-method="post"` makes the confirmed answer delete the row, rather than following the link to the confirmation page and asking a second time. Without script the link is what it has always been: a GET to that page. #} {{ ff_icon("trash", size=15) }} {{ _("Delete {name}", name=row.label) }}
{% else %}
{% if query.search or query.filters %}
{{ _("Nothing matched") }}

{{ _("Nothing matches the current search and filters.") }}

{{ ff_icon("filter-off", size=15) }} {{ _("Clear search and filters") }} {% else %}
{{ _("Nothing here yet") }}

{{ _("Nothing has been added to {name} yet.", name=model_title|lower) }}

{% if add_url %} {{ ff_icon("plus", size=15) }} {{ _("Add the first {name}", name=model_singular|lower) }} {% endif %} {% endif %}
{% endif %}