17-Jun-2026 — post-send workflow actions and server-side member bulk delete #278
build 701 — commit 9317e9c
Lets an email type act on its recipients after the send: an "Expired Membership" style workflow can disable (untick Approved Group Member) or permanently delete the members it has just emailed, and the bulk-delete path now runs as a single server-side cascade. The composer warns clearly before such a send. Continues the email work in #278.

When an email type will disable its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.

When an email type will delete its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.
What's new
- Email types can carry post-send actions. After a successful batch send the emailed members are disabled (groupMember set to false) or bulk-deleted, according to the notification config's postSendActions.
- The composer shows one consolidated alert when the chosen email type will disable or delete its recipients, with the count of affected members and a Dismiss button. On the Recipients step the "Before you can continue" validation and any already-sent notice share that same alert instead of stacking as separate boxes.
- Per-recipient send results carry a short note ("Removed from group", "Deleted from database", "Password reset link generated") so the Send step shows what happened to each member.
- Member bulk delete (from Member Admin and from a delete-workflow send) now runs server-side as one cascade, replacing the client-side loop.
How it behaves
- Post-send actions run only after the send completes and only on members who were actually emailed. DISABLE_GROUP_MEMBER clears groupMember; BULK_DELETE_GROUP_MEMBER deletes the members and records the deletion.
- The deletes/disables warning sits at the top of the composer and persists across steps; it is dismissible. The Recipients-step blockers join the same box while on that step.
Technical changes
- New server controller member-bulk-delete.bulkDeleteMembersCascade: deletes the members, writes deletedMember audit rows (deletedBy, membershipNumber), removes their mailListAudit rows and any orphaned audit rows, and returns per-id deletion responses plus counts. Exposed at POST member/bulk-delete.
- Client MemberService.bulkDelete posts member ids to that route; the member-admin bulk delete uses it and the standalone client-side MemberBulkDeleteService is removed.
- batch-transactional-send: applyPostSendActions (disable or cascade-delete emailed members) and annotateWorkflowActionNotes (per-recipient note) run after recording the sends; BatchSendProgressEntry gains a note field.
- email-composer: the post-send warning and the recipients validation render as a single email-composer-validation-summary, and the warning uses the standard Dismiss button rather than a corner close icon.