- Shipped
- September 16, 2026 at 3:48 PM UTC
- Author
- Kamo
- Commit
- 9aca6ae
/marketing/email splits the campaigns into five sub-tabs, each with a live count, and every campaign is under exactly one: - In-Progress: sending - Not Started: drafts and scheduled campaigns - Paused: paused and cancelled campaigns - Complete: sent - Archived: whatever a member archived Failed is not a stage of its own: recipients fail, a campaign does not, and EmailService never sets it. A campaign that has it is filed by how far its send got. The tab lives in ?tab=, so a reload, the back button and a shared link keep it; a campaign changes tab by itself as its status changes live; and an empty tab says what it is for. Archive and Restore are in each campaign's ⋮ menu (emailservice 39ffa54). Only a campaign with nothing left to send can be archived: a draft, or a sent or cancelled one. The ⋮ button opened the campaign as well as its menu. AG Grid fires rowClicked from its own native listener on the row container, which runs before React's delegated onClick, so the cell renderer's stopPropagation came too late and the row navigated to the editor under the menu. The row handler now lets through clicks inside a data-campaign-own-click control, as the Tracking Codes grid does, and a click on the campaign's name no longer pushes the editor route twice. Checked in Chrome against the real component: on origin/main the ⋮ click went to **************** with this change it opens the menu and goes nowhere. Tabs, counts, archive and restore, empty tabs and a 520px strip were checked the same way. The wording is in kamo-translation-dictionary 02109cfc, pushed first and written by hand in every locale.