pickList("lists", C.recipient_list_id, l => ({ v: l.id, main: l.name, sub: `${l.row_count} rows · ${l.valid_count} valid` }), "recipient_list_id", true);
} else if (step === 3) {
b.innerHTML = H("Step 3 — Subject lines") + hint(`Select subject line variations (up to ${OPT.limits.max_subjects}) and how they rotate across recipients.`) +
pickList("subjects", C.subject_set_ids, s => ({ v: s.id, main: s.subject, sub: "" }), "subject_set_ids") +
`Subject rotation
${["round_robin", "random", "fixed_first"].map(m => `
${m === "round_robin" ? "Round robin" : m === "random" ? "Random shuffle" : "Fixed first subject"} `).join("")}
`;
} else if (step === 4) {
b.innerHTML = H("Step 4 — HTML templates") + hint("Select one or more templates and how they sequence across recipients.") +
pickList("templates", C.template_ids, t => ({ v: t.id, main: t.name, sub: "" }), "template_ids") +
`Template sequence mode
---PAYLOAD---
12: message_type: "html", attach_mode: "none", attach_pdf: false,
302: message_type: c.message_type, attach_mode: c.attach_mode,
378: const am = C.attach_mode;
463:
Attachments ${C.attach_mode === "none" ? "none" : esc(C.attach_mode) +
464: (C.attach_mode === "pdf" && C.attach_pdf_template_id ? ` — template #${C.attach_pdf_template_id}` : "") +
465: (C.attach_mode !== "none" && C.attach_mode !== "pdf" && C.attachment_id ? ` — attachment #${C.attachment_id}` : "")}
502: $$('input[name="attMode"]').forEach(r => r.onchange = () => { C.attach_mode = r.value; if (C.attach_mode !== "pdf") C.attach_pdf = false; bindAttExtra(); renderStep(); });
541: const mode = C.attach_mode;
---SCHEMA-VALIDATION---
app/api/routers/campaigns.py:39: attach_mode: str = "none" # none|pdf|file|image
app/api/routers/campaigns.py:61: "attach_mode": {"none", "pdf", "file", "image"},
app/api/routers/campaigns.py:75: "message_type": c.message_type, "attach_mode": c.attach_mode,
app/api/routers/campaigns.py:114: if data.attach_mode not in VALID_ENUMS["attach_mode"]:
app/api/routers/campaigns.py:115: errors.append("attach_mode must be none|pdf|file|image")
app/api/routers/campaigns.py:164: if data.attach_mode == "pdf":
app/api/routers/campaigns.py:167: if data.attach_mode in ("file", "image") and not data.attachment_id:
app/api/routers/campaigns.py:710: mode = data.get("attach_mode", "none")
app/api/routers/campaigns.py:711: if mode not in VALID_ENUMS["attach_mode"]: