{% extends "base.html" %} {% load static %} {% comment %} The composer page (SPEC §13.1). The page itself is a shell; everything inside `#broadcast-wizard` is _wizard.html, so a step's POST answers with the next step's markup and there is one renderer for a step whether it was reached by navigation or by saving. flatpickr's stylesheet and script are pulled in here rather than globally, the same way templates/contacts/list.html does it: the schedule step is the only page in the product that needs a date picker, and styles.css has themed flatpickr since L1-B in anticipation. {% endcomment %} {% block title %}{{ broadcast.name }} · Broadcasts · DemandTrail Messaging{% endblock %} {% block extra_head %} {% endblock %} {% comment %} The editor bar (HANDOFF §2.3): a way back, the broadcast's own name and state, and "Save and exit". A step saves as it is continued past, so the button saves the step on screen first if it has changed (broadcastWizardExit in _compose_script.html) and only then leaves. Deleting the draft is the red link at the foot of the summary panel, away from anything you would press on the way through. {% endcomment %} {% block page_header %}
Broadcasts

{{ broadcast.name }}

{{ broadcast.get_status_display }} Save and exit
{% endblock %} {% block content %}
{% include "broadcasts/_wizard.html" %}
{% endblock %} {% block alpine_components %} {% comment %} The CRM filter builder's Alpine factory, defined here rather than inside the step that uses it. base.html renders this block before Alpine's own deferred script, which is the window in which a global x-data factory has to exist — and a definition that arrived *inside* an htmx swap would race Alpine's mutation observer for the element that calls it. {% endcomment %} {% include "contacts/_filter_bar_script.html" %} {% include "broadcasts/_compose_script.html" %} {% endblock %} {% block extra_js %} {% endblock %}