{% if records %}
| {% for col in resource.table_columns %} | {% 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 %} | {% endfor %}Actions |
|---|---|---|
| {% for col in resource.table_columns %} | {% set value = record | field_value(col.key) %} {% if 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 %} | {% endfor %}
{% 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-indigo-600 hover:bg-indigo-50 dark:hover:bg-indigo-900/30 dark:hover:text-indigo-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 %}
|
No results for "{{ search }}"
Try a different search term.
{% else %}No {{ resource.label_plural | lower }} yet
Create the first {{ resource.label | lower }} {% endif %}