Fix settings cog button in Tasks plugin (BUG #30)
Details
The TasksSettingsOverlay was missing the StyleInclude for the local
ModalOverlayTheme.axaml. Without this ControlTheme, the ModalOverlay
TemplatedControl had no visual template — clicking the settings cog
set IsOpen=true and made the UserControl visible, but the overlay
rendered as an empty box with no backdrop, card, or content.
The GitHubIssueSourcesOverlay had the correct StyleInclude but it
was never added to TasksSettingsOverlay when it was created.
Note: Build may fail at this commit due to concurrent in-progress
work by another session (CS0136 variable shadowing in
TasksViewModel.cs:2421) — will be resolved in a subsequent commit.
Add confirmation dialogs before destructive delete operations
Details
Notes: TrashPageAsync, TrashPageFromTreeAsync, DeletePagePermanentlyAsync,
and EmptyTrashAsync now prompt for user confirmation before proceeding.
Tasks: DeleteTaskByItem, DeleteTask, and BulkDelete converted from void
to async Task and now prompt for confirmation. DialogService wired in
TasksPlugin.CreateViewModelCore.
Calendar: DeleteEventByIdAsync now prompts for confirmation on the
non-recurring path (recurring events already have their own dialog).
Fixes polish audit bugs #22, #23, #49, #69.
Make ICS/CalDAV sync fully non-blocking with incremental UI refresh
Details
All sync operations now run on background threads so the UI stays
responsive. Events populate incrementally as each subscription
completes rather than blocking until everything finishes.
CalendarSyncService:
- SyncAllAsync runs subscriptions concurrently (bounded by
MaxConcurrency=8) instead of sequentially. Each subscription
fires SyncCompleted on completion for incremental UI refresh.
- Background timer loop (RunAsync) uses the same concurrent pattern
instead of sequential foreach.
CalendarViewModel:
- SyncAllCalendars fires sync on Task.Run and returns immediately.
SyncCompleted event (already wired via Dispatcher.UIThread.Post
in CalendarPlugin) handles the refresh.
AddSubscriptionViewModel:
- ICS and CalDAV subscription creation closes the dialog immediately
after persisting the subscription. Initial sync fires in background
via Task.Run — no more blocking the UI while the first fetch runs.
Fix CalDAV sync stripping local_only flag on post-push updates
Details
After pushing a locally-modified CalDAV event to the server, the sync
service updated the local event (to set SyncState="synced" and store
the new ETag) without passing localOnly: true. This caused the Rust
storage layer to clear the local_only column via INSERT OR REPLACE
with local_only=FALSE (extracted from the JSON payload which had no
local_only field).
Once cleared, the event became eligible for cloud sync — pushing
CalDAV-sourced events to the cloud relay when the CalDAV server is
the actual source of truth.
Fixed all three UpdateEventAsync calls in PushEventToServer and
DeleteEventFromServer to pass localOnly: true.
Document local HTTP API endpoints in Tasks PLUGIN_CONTEXT.md
Details
Adds the IApiProvider section listing all 11 REST endpoints with methods,
paths, and descriptions for task and project CRUD via the local API.
Get notified about new releases