{% from '_partials/inline_select.html' import inline_select %} {% from '_partials/arc_badge.html' import arc_badge %} {% from '_partials/bvp_badge.html' import bvp_badge %}

Tasks

{{ tasks|length }}
+ New
{# ── Shared filter bar (board + list) ──────────────────── #}
{% if all_tags %} {% endif %} {# ── arc-007 S4c (T-2016): one removable chip per active filter ──────── #} {% if active_filter_chips %}
{% for chip in active_filter_chips %} {{ chip.label }} × {% endfor %} × Clear all
{% endif %}
{% if view == 'board' %} {% set status_display = {'captured':'Captured','started-work':'In Progress','issues':'Issues','work-completed':'Completed'} %} {% set _statuses = enum_statuses|default(['captured','started-work','issues','work-completed']) %} {% set tasks_by_status = {} %} {% for s in _statuses %} {% set _ = tasks_by_status.update({s: tasks|selectattr('status', 'equalto', s)|list}) %} {% endfor %}
{# ── Kanban card macro ─────────────────────────────────── #} {% macro kanban_card(task) %} {# S4d (T-2019): draggable + data-task-id → kanban-drag.js drags the card onto another .kanban-column and POSTs the target column's status to /api/task//status. #}
{# S4e (T-2018): bulk multi-select checkbox — bulk-actions.js owns it. #} {# S4a (T-2015): data-task-panel opens the slide-in panel; hx-boost=false keeps the href as the no-JS full-page fallback (task-panel.js owns the click). #} {{ task.id }} {{ inline_select(task.id, 'status', enum_statuses|default(['captured','started-work','issues','work-completed']), task.status, select_class='inline-kanban-status-select', hx_target='closest .kanban-card', hx_swap='none', form_class='inline-reset') }}
{{ task.name }}
{{ inline_select(task.id, 'type', enum_types, task.workflow_type, select_class='inline-type-select', hx_target='closest .kanban-card', hx_swap='none', form_class='inline-reset') }} {{ inline_select(task.id, 'horizon', enum_horizons, task.horizon, select_class='inline-horizon-select horizon-select', hx_target='closest .kanban-card', hx_swap='none', form_class='inline-reset') }} {{ inline_select(task.id, 'owner', enum_owners, task.owner, select_class='inline-owner-select', hx_target='closest .kanban-card', hx_swap='none', form_class='inline-reset') }} {{ arc_badge(task) }} {{ bvp_badge(task) }}
{% endmacro %} {# ── Dynamic kanban columns from enum_statuses (T-1197/G-041) ── #} {% for s in _statuses %} {% set col_tasks = tasks_by_status.get(s, []) %} {% set is_last = loop.last %}
{{ status_display.get(s, s|replace('-',' ')|title) }} ({{ col_tasks|length }})
{% for task in (col_tasks[:10] if is_last else col_tasks) %} {{ kanban_card(task) }} {% else %}
No tasks
{% endfor %} {% if is_last and col_tasks|length > 10 %} {% endif %}
{% endfor %}
{% else %} {% set all_filters = "[name='q'],[name='owner'],[name='horizon'],[name='tag'],[name='status'],[name='type'],[name='component'],[name='sort'],[name='view']" %}
{% for task in tasks %} {# S4e (T-2018): bulk multi-select checkbox #} {% endfor %}
ID Name Status Horizon Type Owner Arc BVP Tags
{{ task.id }} {{ task.name }} {{ inline_select(task.id, 'status', enum_statuses|default(['captured','started-work','issues','work-completed']), task.status, hx_target='next .status-update-result', form_class='inline-flex-center gap-xs') }} {{ inline_select(task.id, 'horizon', enum_horizons, task.horizon, select_class='inline-status-select horizon-select', hx_target='next .horizon-update-result', form_class='inline-flex-center gap-xs') }} {{ inline_select(task.id, 'type', enum_types, task.workflow_type, hx_target='next .type-update-result', form_class='inline-flex-center gap-xs') }} {{ inline_select(task.id, 'owner', enum_owners, task.owner, hx_target='next .owner-update-result', form_class='inline-flex-center gap-xs') }} {{ arc_badge(task) }} {{ bvp_badge(task) }} {{ task._tags[:3]|join(', ') }}
{% endif %}