Email v1.17.0: Multi-select, bulk operations, keyboard shortcuts
Details
Phase 2 of full-featured email client implementation:
- New EmailViewModel.BulkActions.cs: bulk delete (permanent in trash, move
to trash elsewhere), bulk archive, bulk mark read/unread, bulk star toggle,
select all/deselect all commands using BulkMoveAsync/BulkSetFlagsAsync
for single-connection efficiency
- Multi-select in message list: ListBox SelectionMode="Multiple" with
SelectionChanged handler that populates SelectedMessages collection
and notifies HasMultipleSelected/SelectedCount properties
- Bulk action bar in EmailView: conditional bar above message list showing
selected count with Select All/Deselect, Mark Read, Star, Archive,
Move to..., Delete buttons — replaces folder header when active
- Keyboard shortcuts: Delete/Backspace (delete), E (archive), R (reply),
Cmd+R (reply all), F (forward), N (compose), U (toggle read), S (star),
J/Down (next message), K/Up (previous message), Escape (deselect all)
— all bulk-aware when multiple messages are selected
- TextBox focus guard prevents shortcuts from firing during text input
Email v1.16.0: Folder management, move to folder, trash permanent delete
Details
Phase 1 of full-featured email client implementation:
- Split EmailViewModel.MessageActions.cs (439 lines) into MessageActions.cs (~165 lines)
and Internal.cs (~195 lines) for 250-line compliance
- Split EmailViewModel.Commands.cs (366 lines) into Commands.cs (~140 lines)
and Sync.cs (~170 lines) for 250-line compliance
- New ImapSyncService.FolderOps.cs: IMAP folder CRUD (create, rename, delete),
bulk move (BulkMoveAsync), permanent expunge (ExpungeAsync), bulk flag
set/clear (BulkSetFlagsAsync) using UID sets for efficiency
- New EmailViewModel.FolderManagement.cs: folder picker overlay state,
move-to-folder commands (single and bulk), inline folder create/rename/delete
with IMAP sync and local entity updates
- New FolderPickerOverlay.axaml: modal dialog showing all folders with filter
textbox for quick folder selection when moving messages
- Fix permanent delete in Trash: DeleteMessageAsync now calls ExpungeAsync
(flag Deleted + expunge) when in Trash folder instead of silently moving
to Trash again
- Sidebar folder context menus: right-click labels for Rename/Delete, "+"
button next to LABELS header for inline folder creation
- Message context menu: added "Move to..." option that opens folder picker
- Added SelectedMessages collection and HasMultipleSelected/SelectedCount
computed properties for future multi-select support
Reading pane polish + trust list management (v1.15.0)
Details
Restructure reading pane layout with distinct sections: full-width header
with bottom border, full-width trust banner, and white-background email body
area with centered max-width content. Trust banner now dismisses immediately
after clicking trust sender/domain by notifying ShowTrustBanner and
HasHtmlContent properties.
Add granular trust management: SenderTrustService gains GetTrustList(),
RevokeAddressTrust(), and RevokeDomainTrust() methods. AccountSettingsViewModel
now accepts the trust service and exposes TrustedAddresses/TrustedDomains
collections with remove commands. AccountSettingsOverlay shows a "Trusted
Senders" section between Signature and Server Settings with per-entry remove
buttons and an empty state message.
Add deep-link navigation for contact groups and companies (v1.8.0)
Details
Clicking a contact_group or company node in the neuron graph or info panel
title now navigates to the correct sub-view in the Contacts plugin. Previously
only the primary "contact" link type was routed, causing silent navigation
failures for the other two entity types.
Implemented IDeepLinkTarget.SupportedLinkTypes returning all three entity types,
added NavigateToEntityAsync dispatcher, SelectGroupByIdAsync, SelectCompanyByIdAsync,
and GetGroupAsync service method.
Real-time folder-first sync with footer progress bar
Details
Add FoldersSynced event to EmailSyncManager that fires after folder
list is persisted but before message sync begins. This enables the
sidebar to populate immediately with folder structure while messages
sync in the background.
Introduce SyncStatusMessage property on EmailSyncManager that tracks
human-readable sync phase text (Connecting, Syncing folders, Syncing
messages with counts). Add corresponding SyncStatusText and
IsSyncDeterminate properties to EmailViewModel for UI binding.
Move sync progress indicator from above the message list to the
lower-right footer. The footer now shows an indeterminate progress
bar during folder sync phase, switching to a determinate bar with
message count during message sync. When not syncing, the footer
falls back to showing the existing StatusMessage text.
Update OnMessageBatchSynced in EmailPlugin to capture sync state
snapshots (count, total, status) on the background thread before
posting to UI thread, eliminating cross-thread read races.
Wire OnFoldersSyncedAsync in EmailViewModel.MessageActions to reload
folders for the active account when FoldersSynced fires, giving
immediate sidebar feedback after account creation.
Version bump to 1.14.0.
Get notified about new releases