# 19-Jun-2026 —  Inbox & membership-run follow-ups from committee testing (June 2026) [#293](https://github.com/nbarrett/ngx-ramblers/issues/293)

## [build 705](https://github.com/nbarrett/ngx-ramblers/actions/runs/27795528715) — [commit a3f5247](https://github.com/nbarrett/ngx-ramblers/commit/a3f52479ac2b0d41a347b38f57da5148fa3e18eb)

_____

Follow-ups from committee testing of the new inbox: the two inbox bugs EKWG committee (early testers) hit (read state shared by everyone, role filter showing "no messages"),
the gap where members who can't be emailed were never deleted, a click-
heavy composer, several email-client conveniences for the inbox, and a fix
for broken welcome-email images.

## What's new

See https://github.com/nbarrett/ngx-ramblers/issues/293

- Marking a conversation read no longer marks it read for everyone -
read/unread is tracked per committee member.
- Role filters (Membership, Walks, etc.) now show messages sent from a
committee member's own identity, not only messages addressed to the role,
so a "no messages" view that should have had mail now shows it.
- The expiry run now includes members who cannot be emailed (no address, or
blocked in Brevo) so they are removed in the same pass instead of being
left in the database; they appear tagged "not emailable".
- Email types can skip the Compose and Events steps when they are not needed
(e.g. the welcome email), so a routine run has fewer steps.
- Inbox keyboard navigation: Up/Down arrows move between conversations and
Delete removes the highlighted one, like a normal email client.
- A funnel toggle filters the conversation list to unread only, and the
filter is kept in the URL so it survives reload and can be shared.
- Landing on a mailbox no longer marks the first conversation read
- it is
previewed only, and marked read when you click it, arrow onto it, or land
on it after a delete.
- The unread-count badge tooltip lists one role per line with no wrapping.
- Welcome-email images that were rendering broken now display correctly.

## At a glance

| Area | Before | Now |
| --- | --- | --- |
| Marking read | Cleared unread for everyone | Per committee member |
| Role filter | Only mail addressed to the role | Also mail sent from the member's identity |
| Expiry run, un-emailable members | Skipped, left in the database | Included, tagged "not emailable", deleted in the same pass |
| Composer steps | Always six steps | Compose/Events skippable per email type |
| Thread list | Mouse only | Arrow keys to move, Delete to delete |
| Read filter | None | Funnel toggle for unread only |
| Opening a mailbox | First conversation auto-marked read | Previewed only; read on user action |
| Welcome-email images | Broken (editing host baked into the URL) | Relative paths, render correctly |

## Where to find it

- Admin -> Email inbox: per-member read state, the role/identity filter, the
unread funnel toggle, arrow-key navigation, Delete to remove, and the
badge tooltip in the top bar.
- Email composer: un-emailable members shown in the recipient list, and the
steps that disappear for fixed-content email types.
- System Settings -> Mail -> notification template editor: the "Skip the
Compose step" and "Skip the Events step" toggles per email type.


![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/ae5010a9-877b-493b-bf66-2396c22f12b3.jpeg)

_Above: how the inbox looks when you first visit it_

## How it behaves

- Read state: a thread is unread for a member until that member opens it.
Marking read/unread, the unread counts and the badge are all per member;
new inbound mail resets a thread to unread for everyone.
- Role filter: each role resolves to a set of identity emails (the role
address, its forward targets and the assigned member's own email), and a
message is attributed to that role when any of From/To/Cc matches. This
fixes sent mail (welcome/expiry) that previously only landed in the
all-accessible mailbox.
- Un-emailable members: in the missing-from-bulk-load flow they are included
and auto-selected, shown under the existing "no email address" / "blocked"
groupings, skipped for the actual send, and fed into the bulk-delete
post-send action. Each selected recipient chip shows its grouping status
(e.g. "no email address") alongside the last-bulk-load detail, and the send
progress lists them as "not emailable" with the reason and the deletion note.
- Composer steps: a notification config can skip Compose and Events; the
stepper hides them and no longer requires them.
- Keyboard: with the thread list focused, Up/Down open the next/previous
conversation and scroll it into view; Delete/Backspace removes the
highlighted conversation and selects the next. Arrows do nothing while
typing in the reply editor or search box.
- Unread filter: one click shows unread only, click again for all.
- Opening a mailbox: the first conversation opens as a preview without being
marked read.
- Welcome-email images: stored as relative paths and made absolute against
the site host only when the email is sent.

## Why it is restricted

- The composer always keeps Sender & Template, Recipients, Review and Send,
in that order with Send last; only Compose and Events can ever be skipped,
so a sender always chooses the email type and the recipients before Send.
- Un-emailable members are only deleted where the email type carries the
bulk-delete action (the expiry run). On the warning run they appear tagged
but are not deleted.

## How to try it out

1. Admin -> Email inbox: open a conversation as one member, then check it is
still unread for another member. Use the funnel to show unread only.
2. Click into the list and use Up/Down to move between conversations and
Delete to remove one. Land on the mailbox fresh and confirm the first
conversation is previewed but stays unread until you act on it.
3. Select the Membership role filter and confirm sent membership mail now
appears (run "rescan general" once to re-bucket existing threads).
4. In the composer, choose the missing-from-bulk-load email type and confirm
no-email and blocked members are included and tagged. Tick "Skip the
Compose step" / "Skip the Events step" on the welcome type in the
notification template editor and confirm those steps disappear.

## Technical changes

User-facing behaviour is above; the implementation details follow.