{% if records %}
{% for col in resource.table_columns %} {% endfor %} {% for record in records %} {% set record_id = record | field_value('id') %} {% for col in resource.table_columns %} {% endfor %} {% endfor %}
{% if col.sortable %} {% set next_dir = 'desc' if (sort_by == col.key and sort_dir == 'asc') else 'asc' %} {{ col.label }} {% if sort_by == col.key %} {% else %} {% endif %} {% else %} {{ col.label }} {% endif %} Actions
{% set value = record | field_value(col.key) %} {% if col.__class__.__name__ == 'Image' %} {% set _img_url = col.get_url(value) %} {% if _img_url %} {{ col.label }} {% else %} {% endif %} {% elif col.__class__.__name__ == 'Badge' %} {% set rendered = col.render(value) %} {% if rendered != '—' %} {{ rendered }} {% else %}—{% endif %} {% elif col.__class__.__name__ == 'Boolean' %} {% if col.is_true(value) %} {{ col.true_label }} {% else %} {{ col.false_label }} {% endif %} {% else %} {{ col.render(value) }} {% endif %}
{% set _all = resource.all_row_actions %} {% set _show_inline = _all | selectattr('is_builtin') | list %} {% set _overflow = _all | rejectattr('is_builtin') | list %} {# ── shared style maps ──────────────────────────────── #} {% set _icon_cls = { 'success': 'text-secondary-400 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-900/30 dark:hover:text-green-400', 'warning': 'text-secondary-400 hover:text-amber-600 hover:bg-amber-50 dark:hover:bg-amber-900/30 dark:hover:text-amber-400', 'danger': 'text-secondary-400 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/30 dark:hover:text-red-400', 'default': 'text-secondary-400 hover:text-primary-600 hover:bg-primary-50 dark:hover:bg-primary-900/30 dark:hover:text-primary-400', } %} {% set _menu_cls = { 'success': 'text-green-600 dark:text-green-400 hover:bg-green-50 dark:hover:bg-green-900/30', 'warning': 'text-amber-600 dark:text-amber-400 hover:bg-amber-50 dark:hover:bg-amber-900/30', 'danger': 'text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/30', 'default': 'text-secondary-700 dark:text-secondary-200 hover:bg-secondary-50 dark:hover:bg-secondary-700', } %} {# ── Inline actions ─────────────────────────────────── #} {% for action in _show_inline %} {% set _cls = _icon_cls.get(action.style, _icon_cls['default']) %} {% if action.is_builtin %} {# Built-in: view → , edit → , delete → hx-delete #} {% if action.key == '__view__' and has_perm(resource.slug + ':view') %} {{ render_icon(action.icon) }} {% elif action.key == '__edit__' and has_perm(resource.slug + ':edit') %} {{ render_icon(action.icon) }} {% elif action.key == '__delete__' and has_perm(resource.slug + ':delete') %} {% endif %} {% else %} {# Custom action: data-action-trigger modal #} {% if has_perm(resource.slug + ':action') %} {% endif %} {% endif %} {% endfor %} {# ── Overflow menu (⋮) ──────────────────────────────── #} {# Build a list of overflow items the current user is allowed to see #} {% set _visible_overflow = [] %} {% for action in _overflow %} {% if action.is_builtin %} {% if (action.key == '__view__' and has_perm(resource.slug + ':view')) or (action.key == '__edit__' and has_perm(resource.slug + ':edit')) or (action.key == '__delete__' and has_perm(resource.slug + ':delete')) %} {% set _ = _visible_overflow.append(action) %} {% endif %} {% elif has_perm(resource.slug + ':action') %} {% set _ = _visible_overflow.append(action) %} {% endif %} {% endfor %} {% if _visible_overflow %}
{% endif %}
{% if total_pages > 1 %}
Showing {{ ((page - 1) * per_page) + 1 }}–{{ [page * per_page, total] | min }} of {{ total }}
{% if page > 1 %} Previous {% endif %} {% set start_page = [1, page - 2] | max %} {% set end_page = [total_pages, page + 2] | min %} {% for p in range(start_page, end_page + 1) %} {% if p == page %} {{ p }} {% else %} {{ p }} {% endif %} {% endfor %} {% if page < total_pages %} Next {% endif %}
{% endif %}
{% else %}
{% if search %}

No results for "{{ search }}"

Try a different search term.

{% else %}

No {{ resource.label_plural | lower }} yet

Create the first {{ resource.label | lower }} {% endif %}
{% endif %}