With conversation view off, marking a message unread from the list — the hover button, the right-click menu — marked that message. Opening it and pressing Mark as unread in the toolbar above it marked every message in its thread, and so did Move to, Report spam and Delete.
The setting already reaches all the way into the reading pane: the list draws one row per message, and visibleMessages narrows the pane to the one opened. The toolbar was half converted. Its labels were right — Mark as unread against Mark as read, the star, the labels shown — all of those read messages, which is the narrowed set. Only rowIds, the one thing actually handed to the action, still read thread.emailIds. So the button said one message and did the whole conversation.
rowIds is now the same question visibleMessages answers for the pane, asked of the same ids, with the same fallback: an id that names nothing in the thread — a link from somebody with conversation view on, a stale m in the URL — shows the conversation, so the toolbar takes the conversation. Conversation view on is unchanged: nothing is singled out, so the whole thread comes back as before.
Four tests render the toolbar and press the buttons: one open message for unread, and for move/spam/delete; the whole thread when none is singled out; and the stale-id fallback. The first two fail without the change.
Fixes #414.
With conversation view off, marking a message unread from the list — the hover button, the right-click menu — marked that message. Opening it and pressing **Mark as unread** in the toolbar above it marked every message in its thread, and so did **Move to**, **Report spam** and **Delete**.
The setting already reaches all the way into the reading pane: the list draws one row per message, and `visibleMessages` narrows the pane to the one opened. The toolbar was half converted. Its labels were right — Mark as unread against Mark as read, the star, the labels shown — all of those read `messages`, which is the narrowed set. Only `rowIds`, the one thing actually handed to the action, still read `thread.emailIds`. So the button said one message and did the whole conversation.
`rowIds` is now the same question `visibleMessages` answers for the pane, asked of the same ids, with the same fallback: an id that names nothing in the thread — a link from somebody with conversation view on, a stale `m` in the URL — shows the conversation, so the toolbar takes the conversation. Conversation view **on** is unchanged: nothing is singled out, so the whole thread comes back as before.
Four tests render the toolbar and press the buttons: one open message for unread, and for move/spam/delete; the whole thread when none is singled out; and the stale-id fallback. The first two fail without the change.
No new strings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
**Merged** 2026-09-20 as coffey-labs/ihasmail@f627bfc1237d
<sub>Rebuilt from: git history, session transcript.</sub>
This repo is archived. You cannot comment on issues.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixes #414.
With conversation view off, marking a message unread from the list — the hover button, the right-click menu — marked that message. Opening it and pressing Mark as unread in the toolbar above it marked every message in its thread, and so did Move to, Report spam and Delete.
The setting already reaches all the way into the reading pane: the list draws one row per message, and
visibleMessagesnarrows the pane to the one opened. The toolbar was half converted. Its labels were right — Mark as unread against Mark as read, the star, the labels shown — all of those readmessages, which is the narrowed set. OnlyrowIds, the one thing actually handed to the action, still readthread.emailIds. So the button said one message and did the whole conversation.rowIdsis now the same questionvisibleMessagesanswers for the pane, asked of the same ids, with the same fallback: an id that names nothing in the thread — a link from somebody with conversation view on, a stalemin the URL — shows the conversation, so the toolbar takes the conversation. Conversation view on is unchanged: nothing is singled out, so the whole thread comes back as before.Four tests render the toolbar and press the buttons: one open message for unread, and for move/spam/delete; the whole thread when none is singled out; and the stale-id fallback. The first two fail without the change.
No new strings.
🤖 Generated with Claude Code
Merged 2026-09-20 as coffey-labs/ihasmail@f627bfc123
Rebuilt from: git history, session transcript.