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
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.
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.
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.
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.
Get notified about new releases