{% extends "base.html" %} {% load common_extras %} {% comment %} The broadcast list (SPEC §13). Everything below the toolbar is _rows.html, so the table has exactly one renderer: the filters fetch it, and every mutation answers with a `broadcastsChanged` event that makes it re-fetch itself. The "New broadcast" form offers only connections the policy table says permit broadcasts — apps/broadcasts/composer.py::broadcastable_connections. Every shipped platform permits them; what narrows an Instagram broadcast is its messaging window, not the selector (SPEC §13.2). There is no platform name in this file. {% endcomment %} {% block title %}Broadcasts · DemandTrail Messaging{% endblock %} {% block page_header %} {% comment %} No close_on: a created draft answers with HX-Redirect into the composer, so the page leaves under the dialog. A refusal is a 204 toast, and the dialog stays open with what was typed. {% endcomment %} {% if connections %} {% modal "new-broadcast" title="New broadcast" %}
{% endmodal %} {% endif %} {% endblock %} {% block content %} {% if not connections %}
No channel in this workspace accepts broadcasts yet. Connect one in channel settings first.
{% endif %}
{% filter_popover groups=filter_groups onchange="reload()" target="#broadcast-rows" count=broadcasts|length noun="broadcast" %}
{% filter_chips groups=filter_groups onchange="reload()" %}
{% include "broadcasts/_rows.html" %}
{% endblock %}