Phase 12: Templates & campaign editor (v0.13.0) #54

Merged
vmanne-poc merged 5 commits from phase-12 into main 2026-10-15 12:39:03 -04:00
Owner

Phase 12: Templates & campaign editor (v0.13.0).

What shipped

  • Styled templates with a live preview (#43): Styled / HTML / Plain text types, style options, Markdown footer with an enforced unsubscribe link, clone, project default, sandboxed preview.
  • Renderer and template delete fixes (#44): the template type is respected (Markdown body converted first, then merged into the layout); deleting a template used by unsent campaigns returns 409, and sent campaigns have it cleared (ON DELETE SET NULL) instead of a 500.
  • Campaign editor (#45): new/edit pages with live preview for a chosen contact, Plain text / Markdown / HTML, live recipient count, test send (up to 5 addresses, [Test], untracked), duplicate, delete drafts, confirmation before send/schedule.
  • Preheader, personalisation, campaign data (#46): previewText as hidden preheader (max 150), {{ contact.data.<key> }}, {{ campaign.data.<key> }}, | default: fallbacks, HTML escaping, warnings for unknown placeholders.
  • Tracking options and public web view (#47): per-campaign tracking toggle; optional public link at /c/<publicId> with neutral contact data, no tracking, and a strict sandbox CSP; {{ web_view_url }}.
  • Detailed campaign report (#48): per-link clicks and unique clickers, paged/filterable recipients with CSV export, activity chart (hourly then daily) with table fallback, 14-day project trend.
  • One additive migration: templates_and_campaign_editor. nginx forwards /c/ to the backend. No new dependencies.
  • CHANGELOG [0.13.0], README features, and versions bumped to 0.13.0.

Tests

  • Backend (docker compose run --rm --build -T backend-test): nest build OK; unit 101 passed / 101 (10 suites); migrations applied on legacy-adopted and fresh databases (7 migrations, none pending); e2e 55 passed / 55.
  • Frontend (docker compose run --rm --build -T frontend-test): tsc && vite build OK; Vitest 87 passed / 87 (19 files).
  • Live smoke through nginx + Mailpit (smoke-12.ps1): 51 passed, 0 failed, including styled test send, personalised delivery, open/click tracking, web view CSP and headers, report endpoints and CSV, and all new pages rendered in headless Edge with 0 uncaught JS exceptions.

Not verified: real inbox rendering (Gmail/Outlook), interactive browser flows beyond Vitest, the 14-day trend with real snapshot data, full WCAG conformance.

Closes #43
Closes #44
Closes #45
Closes #46
Closes #47
Closes #48

Phase 12: Templates & campaign editor (v0.13.0). ## What shipped - **Styled templates with a live preview** (#43): Styled / HTML / Plain text types, style options, Markdown footer with an enforced unsubscribe link, clone, project default, sandboxed preview. - **Renderer and template delete fixes** (#44): the template type is respected (Markdown body converted first, then merged into the layout); deleting a template used by unsent campaigns returns 409, and sent campaigns have it cleared (`ON DELETE SET NULL`) instead of a 500. - **Campaign editor** (#45): new/edit pages with live preview for a chosen contact, Plain text / Markdown / HTML, live recipient count, test send (up to 5 addresses, `[Test]`, untracked), duplicate, delete drafts, confirmation before send/schedule. - **Preheader, personalisation, campaign data** (#46): `previewText` as hidden preheader (max 150), `{{ contact.data.<key> }}`, `{{ campaign.data.<key> }}`, `| default:` fallbacks, HTML escaping, warnings for unknown placeholders. - **Tracking options and public web view** (#47): per-campaign tracking toggle; optional public link at `/c/<publicId>` with neutral contact data, no tracking, and a strict sandbox CSP; `{{ web_view_url }}`. - **Detailed campaign report** (#48): per-link clicks and unique clickers, paged/filterable recipients with CSV export, activity chart (hourly then daily) with table fallback, 14-day project trend. - One additive migration: `templates_and_campaign_editor`. nginx forwards `/c/` to the backend. No new dependencies. - CHANGELOG `[0.13.0]`, README features, and versions bumped to 0.13.0. ## Tests - Backend (`docker compose run --rm --build -T backend-test`): `nest build` OK; unit **101 passed / 101** (10 suites); migrations applied on legacy-adopted and fresh databases (7 migrations, none pending); e2e **55 passed / 55**. - Frontend (`docker compose run --rm --build -T frontend-test`): `tsc && vite build` OK; Vitest **87 passed / 87** (19 files). - Live smoke through nginx + Mailpit (`smoke-12.ps1`): **51 passed, 0 failed**, including styled test send, personalised delivery, open/click tracking, web view CSP and headers, report endpoints and CSV, and all new pages rendered in headless Edge with 0 uncaught JS exceptions. Not verified: real inbox rendering (Gmail/Outlook), interactive browser flows beyond Vitest, the 14-day trend with real snapshot data, full WCAG conformance. Closes #43 Closes #44 Closes #45 Closes #46 Closes #47 Closes #48
Backend verified with: docker compose run --rm --build -T backend-test (101 unit, 55 e2e passed; migration adoption and fresh checks passed).

Refs #43

Refs #44

Refs #46

Refs #47

Refs #48
Refs #43
Refs #45

Refs #46

Refs #47
Frontend verified with: docker compose run --rm --build -T frontend-test (tsc + vite build OK; 19 files, 87 tests passed).

Refs #48
vmanne-poc deleted branch phase-12 2026-10-15 12:39:03 -04:00
Sign in to join this conversation.
No reviewers
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
vmanne-poc/Postak!54
No description provided.