Skip to content

Console redesign: Broadcasts screens (Nuit claire) - #540

Merged
pierre-b merged 7 commits into
devfrom
feat/console-broadcasts-screens
Nov 12, 2026
Merged

pierre-b merged 7 commits into
devfrom
feat/console-broadcasts-screens

Conversation

@pierre-b

@pierre-b pierre-b commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Spec 5 "Newsletters" on the Nuit claire components. Plan: plans/console-redesign-screens-5-broadcasts-plan.md; the corrections from its review (Opus, xhigh, 12/11) are folded into the plan.

What changes

  • List: a table with counted status tabs (All, Drafts, Scheduled, Sending, Sent, and Failed only when there is one), a debounced search in the URL, the KPI strip over the last 30 days, and per-row results: recipients (an estimate before sending), opens and clicks as rate bars, unsubscribes and bounces with warning thresholds, and website visits. It loads 25 more from the footer. A draft opens in the composer when you can write, and in the detail otherwise.
  • Detail: a full-width drawer with J/K navigation. It shows the funnel, opens and clicks over time, the A/B test (pick a winner, test sends, analytics links), clicked links, and an aside with the preview, audience, web tracking, sending task and history. Header actions follow the status: edit, pause, resume, change sender, retry failed, cancel, delete.
  • Composer: one screen that replaces the 4-step drawer and the send-or-schedule modal.
    • It autosaves: it creates the broadcast at the first valid state, then updates it, one request at a time.
    • It has audience, content (A/B with up to 5 variants), sending, web tracking and advanced (data feeds) cards, a desktop and mobile preview, and a send summary with every check.
    • Send now asks for confirmation. Closing with unsaved changes asks, and navigation is blocked.
  • Shared components (additive, kept small):
    • SaveBar gets saveLabel, saveDisabled, saveDisabledReason and blockNavigation.
    • FullDrawer gets barTitle.
    • The feed Test buttons get a "Save the broadcast first" tooltip.
    • One is-hover row rule in antd-overrides.css.
  • Removed: UpsertBroadcastDrawer, SendOrScheduleModal, BroadcastStats, BroadcastLinkStats, DataFeedSettings, and the old page tests. The cases of BroadcastsPage.templatesRead.test.tsx (Show the template ID without Templates read on lists, broadcasts, automations and segments #536) now live in the AbTestPanel, aside, detail, cards, compose and page tests.
  • Without Templates read (Show the template ID without Templates read on lists, broadcasts, automations and segments #536): the table, aside, A/B panel and composer name a template by its ID, and request no template.
  • Translations for the 7 languages, and one CHANGELOG sentence added to the 44.0 broadcasts line.

No server change, no table or migration, no environment variable.

Tests

  • npx vitest run passes, including the new BroadcastsPage.test.tsx.
  • npx tsc -b and npx eslint . pass with no errors.
  • npm run build passes.
  • e2e broadcasts.spec.ts, rewritten for the new screens, passes 8 of 8 locally against the dev server on port 19173. Console e2e does not run in CI.
    • The fixture's broadcasts.get now answers the broadcast of the requested id.
    • In protected-pages.spec.ts, the broadcasts case passes. LogsPage fails locally, and that screen is untouched here.

Captures at 1440 and 1280 px are in the project files under captures/fil-5-6/.

Review

  • Plan: reviewed before the code (Opus, xhigh, 12/11). The corrections are folded into plans/console-redesign-screens-5-broadcasts-plan.md.
  • Code: an independent review of the whole branch found 5 bugs, fixed in 501be25. A review of that delta found that Send test refused an incomplete draft, fixed in 80b93dc.
  • Last review: 80b93dc and the merge of dev 2e5cb40 (head), nothing blocking. Each new test fails with its fix reverted.
  • CI on 2e5cb40: the console job (type-check, unit tests, lint, build) and the Go unit tests are green.

Known, not handled

  • Change sender stays a header button rather than an item of the "…" menu, because ChangeVariationSenderModal renders its own button.
  • At 1280 px the table scrolls horizontally: the Broadcast column keeps about 200 px.
  • With Templates read, the A/B panel still shows "Untitled" and "N/A" for a deleted template (Show the template ID without Templates read on lists, broadcasts, automations and segments #536 behaviour). The aside now says "This template no longer exists".
  • The console has no Prettier config, so the formatting follows the surrounding code.
  • The e2e detail-drawer case flaked once when it ran in parallel with the capture run. It passed on reruns.
  • No test pins that Send now shows the server's reason when the save before it is refused.
  • On a draft loaded incomplete, Send test switches the save line to "Incomplete: …".
  • J pressed twice while the next page loads relies on TanStack Query chaining a cancelled fetch to the new one; it works, and only the repeated-failure case is tested.

…oadcasts screens

SaveBar takes a save label, a disabled state with its reason, and can leave
navigation unblocked. FullDrawer takes a title in its bar. The feed Test
buttons explain why they are disabled before the broadcast is saved. A table
row can show the hover background while its detail is open.
The Broadcasts screen becomes a list with counted status tabs, a search, KPIs
and per-row stats; a full-width detail with the funnel, opens and clicks over
time, the A/B test, clicked links and an aside; and a one-screen composer that
saves as you type, with a live preview and a send summary. The old card list,
the four-step drawer and the send modal are removed.
broadcasts.get answers the broadcast of the requested id.
@codecov

codecov Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.97%. Comparing base (58b8c06) to head (2e5cb40).
⚠️ Report is 1 commits behind head on dev.

Additional details and impacted files
@@           Coverage Diff           @@
##              dev     #540   +/-   ##
=======================================
  Coverage   88.97%   88.97%           
=======================================
  Files         377      377           
  Lines       73836    73836           
=======================================
  Hits        65692    65692           
  Misses       5435     5435           
  Partials     2709     2709           
Flag Coverage Δ
unit 88.97% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Clearing every UTM field is now saved, a refused Save changes on a scheduled
broadcast shows its reason, Send test leaves a scheduled broadcast's pending
edits alone and stops on a draft's refused save, a confirmed close asks once,
and a pending J is dropped when the drawer leaves its row.
Send test stops only when the server refuses the draft, a refused send shows
the server's reason, and a pending J is dropped whenever its page fails.
…s-screens

# Conflicts:
#	console/src/components/layout/FullDrawer.test.tsx
#	console/src/i18n/locales/ca.po
#	console/src/i18n/locales/de.po
#	console/src/i18n/locales/en.po
#	console/src/i18n/locales/es.po
#	console/src/i18n/locales/fr.po
#	console/src/i18n/locales/it.po
#	console/src/i18n/locales/ja.po
#	console/src/i18n/locales/pt-BR.po
#	console/src/services/api/list.ts
@pierre-b
pierre-b marked this pull request as ready for review November 12, 2026 18:25
@pierre-b
pierre-b merged commit 73c1150 into dev Nov 12, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant