Fix state persistence for Notes and Tasks (BUG #12, #21, #25, #56)
Details
Notes: persist expanded sidebar node IDs and selected page across
sessions using IPluginSettings. On first load, restore expansion
state from settings and fall back to persisted SelectedPageId when
no in-memory selection exists.
Tasks: fix selected task restore to fall back to _allTasks when the
task isn't in the current filtered collection (BUG #25). Fix filter
project reference going stale on plugin switch by re-resolving
FilterProject after LoadProjects() rebuilds the list (BUG #56).
Persist ShowFiltersRow toggle state.
Split Tasks plugin: create PrivStack.Plugin.Tasks.Headless
Details
Extract Models/ (16 files) and Services/ (16 files) from the Tasks
plugin into a new PrivStack.Plugin.Tasks.Headless project. This
assembly references only PrivStack.Sdk — zero Avalonia dependency —
making it loadable by the headless server.
New files in Headless:
- TasksHeadlessPlugin.cs: HeadlessPluginBase entry point with entity
schemas, service initialization, and IApiProvider implementation
- TasksApiHandler.cs: Shared API handler extracted from
TasksPlugin.Api.cs — used by both desktop and headless plugins
The UI plugin (PrivStack.Plugin.Tasks) now references the Headless
project for shared models and services. TasksPlugin.Api.cs delegates
to the shared TasksApiHandler.
Directory.Build.props updated: HeadlessPlugin=true opt-out prevents
UI.Adaptive (and thus Avalonia) from being added as a transitive
dependency to headless plugin projects.
AXAML xmlns declarations updated with assembly qualifier for types
now in the Headless assembly.
Bump patch versions for unified toast migration
Details
Calendar 1.14.7→1.14.8, Canvas 1.0.4→1.0.5, Contacts 1.9.6→1.9.7,
Data 1.21.0→1.21.1, Email 1.28.1→1.28.2, Files 1.11.0→1.11.1,
Finance 3.24.1→3.24.2, Habits 1.2.3→1.2.4, Journal 1.15.5→1.15.6,
Notes 1.65.1→1.65.2, WebClips 1.3.4→1.3.5. Both csproj and
PluginMetadata versions updated.
Migrate remaining plugins to unified IToastService
Details
Migrate Journal, Finance, Habits, WebClips, Canvas, Data, and Email
from local ErrorMessage/StatusMessage patterns to the shell's unified
IToastService. Email was the most involved — removed _errorMessage
ObservableProperty, ClearStatusAfterDelay helper, and converted all
ErrorMessage/StatusMessage completion notifications across 8 partial
class files to _toast?.Show() calls. StatusMessage retained for
in-progress indicators (sync status text). Sub-ViewModels (Compose,
AccountSetup, AccountSettings) keep their own ErrorMessage for inline
form validation.
Migrate Notes plugin from local ErrorMessage to unified IToastService
Details
- Add IToastService to NotesViewModel constructor (injected from Host.Toast via NotesPlugin)
- Replace all ~45 ErrorMessage assignments with Toast() calls using ToastType.Error
- Remove [ObservableProperty] string? _errorMessage field (toast auto-dismisses)
- Remove inline ErrorMessage border from NotesView.axaml (toast UI is shell-provided)
- Add success toasts for key operations: wiki push, page duplicate, trash, restore, empty trash, template applied
- Clean up double blank lines left by ErrorMessage = null removal
- Leave SaveAsTemplate and WikiSources ErrorMessage untouched (form-level validation, separate VMs)
Get notified about new releases