{% comment %} RIMS approval queue — the shared list-of-pending-items table used by: • finance: disbursement_approval_queue • grants: funding_approval_queue • grants: review_queue Each row carries its own decision action (modal or link). The mobile fallback renders the same rows as stacked cards so small screens stay usable. Args: items : iterable of dicts/objects with: title (str) subtitle (str|None) href (str|None) — row click target (detail page) badges (list of dicts {label, variant}) — small chips inline meta (list of dicts {label, value}) — definition-list rows amount (str|None) — large value emphasised top-right amount_hint (str|None) actions (list of {label, url, variant, modal?}) — per-row CTAs empty_state : optional dict {heading, subtext, primary_url, primary_label} rendered when items is empty. {% endcomment %} {% if items %}
{% for it in items %}
{% if it.href %} {{ it.title }} {% else %}

{{ it.title }}

{% endif %} {% if it.amount %}

{{ it.amount }}

{% endif %}
{% if it.subtitle %}

{{ it.subtitle }}

{% endif %} {% if it.badges %}
{% for badge in it.badges %} {{ badge.label }} {% endfor %}
{% endif %} {% if it.meta %}
{% for m in it.meta %}
{{ m.label }}:
{{ m.value }}
{% endfor %}
{% endif %} {% if it.actions %}
{% for action in it.actions %} {% if action.modal %} {% else %} {{ action.label }} {% endif %} {% endfor %}
{% endif %}
{% endfor %}
{% else %} {% include "components/empty_state.html" with heading=empty_state.heading subtext=empty_state.subtext primary_url=empty_state.primary_url primary_label=empty_state.primary_label icon_path=empty_state.icon_path %} {% endif %}