Skip to main content

Changelog

Every improvement, automatically tracked from our commit history.

Subscribe via Atom feed
← Prev Page 24 of 95 Next →
February 27, 2026
patch Tasks

Fix Tasks settings button permanently unclickable after first click

Details

Root cause: OpenSettingsAsync() awaited Settings.OpenCommand

.ExecuteAsync(), which is an AsyncRelayCommand with

AllowConcurrentExecutions=false (the default). Inside that command,

LoadAllAsync() calls RuleService.GetRulesAsync() → sdk.SendAsync().

If the SDK call hangs (never resolves), the command stays in

"executing" state forever. AsyncRelayCommand.CanExecute returns false

while executing, so the Button becomes permanently disabled — clicks

are silently ignored, but tooltip still works on hover.

Fix:

  • Show the overlay immediately (IsOpen = true) before loading data
  • Call LoadSettingsDataAsync() directly from the parent ViewModel

instead of going through Settings.OpenCommand, bypassing the

AsyncRelayCommand concurrency guard entirely

  • Rename LoadAllAsync → LoadSettingsDataAsync (internal) so the parent

VM can call it directly

patch CalendarEmailNotesTasks

Migrate plugin modal overlays to ThemeShadowXl token

Details

Replace hardcoded BoxShadow="0 8 32 0 #60000000" in all four plugin

ModalOverlayTheme.axaml files (Tasks, Calendar, Notes, Email) with

{DynamicResource ThemeShadowXl} from the new elevation token system.

patch Tasks

Add right-click context menu to Tasks detailed list view

Details

The detailed/sidebar list view was missing a context menu while all

other views (Simple list, Kanban, GTD, Calendar) had one. Users had

to click a task and use the detail panel buttons for actions like

delete, duplicate, archive, etc.

Adds the same MenuFlyout context menu to the detailed list item Border

with: Edit, Start Work, Mark Complete, Reopen, Start/Stop Timer,

Duplicate, Archive, Delete — matching the Simple list view menu.

patch Tasks

Fix Tasks settings overlay not opening on cog button click

Details

OpenAsync() was awaiting LoadAllAsync() without a try-catch. If any

service call threw (e.g., RuleService.GetRulesAsync SDK query), the

exception was silently swallowed by the AsyncRelayCommand and IsOpen

was never set to true — resulting in zero visual feedback on click.

Wrap LoadAllAsync in try-catch so IsOpen = true always executes.

patch Tasks

Fix RecurrencePattern deserialization crash for missing type discriminator

Details

Task #3 had a recurrence.pattern JSON object without a "type" field,

causing NotSupportedException with [JsonPolymorphic]. Replaced the

attribute-based approach with a custom RecurrencePatternConverter that

handles missing/unknown discriminators gracefully (defaults to daily).

This matches the pattern already used by RecurrenceEnd and is resilient

to data written by older versions or external sync sources.

Also added RustWeekdayConverter.TryParse for use by the converter.

← Prev Page 24 of 95 Next →

Get notified about new releases