Fix Spending by Category report layout and interactivity
Details
Bar chart:
- Dynamic height based on category count (32px per category, min 400px)
- Fix $0 data labels by hiding sub-$1 values
- Add XToolTipLabelFormatter for proper currency tooltips on hover
- Smart X-axis step intervals to prevent label cramming
Pie chart:
- Group categories below 10% of total into an "Other" slice
- "Other" slice rendered in distinct gray color with count/percentage tooltip
- Drill-down: click "View N smaller categories" to see Other breakdown
- Back button to return to main distribution view
- Increased chart height to 400px with centered horizontal alignment
- Section title updates dynamically based on drill-down state
Pin plugin SDK/UI.Adaptive NuGet versions to PrivStackSdkVersion
Details
Replace Version="*" with Version="$(PrivStackSdkVersion)" across all 15
plugin csproj files and the Finance test project. Add PrivStackSdkVersion
(1.68.0) to PrivStack-Plugins/Directory.Build.props.
This eliminates non-deterministic NuGet resolution in CI/standalone builds
where the wildcard would resolve to stale published versions (e.g. 1.5.3)
missing newer types like AdaptiveCartesianChart, causing MissingFieldException
at runtime. Local dev is unaffected — Directory.Build.props already swaps
these for project references when the sibling PrivStack-IO checkout exists.
Fix Journal map tiles not loading (missing User-Agent)
Details
OpenStreetMap tile server returns 403 for requests without a valid
User-Agent header. Mapsui's default CreateTileLayer() derives the
User-Agent from Assembly.GetEntryAssembly() which resolves incorrectly
in the plugin's AssemblyLoadContext, producing an empty/invalid value.
Pass an explicit "PrivStack/1.68" User-Agent to both the editor and
read-only map views.
Fix Finance plugin crash on navigation to Budget dashboard
Details
The BudgetDashboardView used a compiled binding with $parent[UserControl] type cast
inside a nested DataTemplate to access IsGoalColumnVisible on the root ViewModel.
Compiled bindings cannot resolve type casts (vm:BudgetDashboardViewModel) inside
nested DataTemplate contexts, causing an ArgumentException at runtime. Replaced
with a ReflectionBinding using RelativeSource AncestorType to avoid the compiled
binding type resolution issue.
Journal: handle photo storage errors gracefully on drop/browse
Details
Wrapped OnFileDrop and BrowseAndAddPhotosAsync with per-file try/catch
so that IOException from cloud-mounted drives (Google Drive timeout) or
other storage failures skip the individual file instead of crashing.
Journal v1.15.4
Get notified about new releases