Add YNAB-style weekly targets with dynamic day-of-week segments
Details
Weekly spending goals now let users pick which day of the week their
recurring expense falls on (e.g., Saturday for groceries). The monthly
budget is calculated as weeklyTarget × actual occurrences of that day
in the month (4 or 5), replacing the approximate weeks-remaining math.
The progress bar dynamically renders 3 or 4 dividers via an
ItemsRepeater bound to computed divider positions, instead of
hardcoding 3 dividers for a fixed 4-segment layout.
Changes:
- Category model: added GoalWeekday (DayOfWeek?) field
- GoalService: added CountWeekdayOccurrences() and
CalculateWeeklySegmentProgress(); rewrote CalculateWeeklyForMonth()
to use exact weekday counting; updated CalculateGoalProgress() to
compare allocated against the true monthly total for weekly goals
- CategoryViewModel: added WeeklySegmentCount, WeeklyDividers
(ObservableCollection<WeeklyDividerViewModel>) with computed
Canvas.Left positions; updated GoalProgressDisplay to show monthly
total for weekly goals
- BudgetDashboardView: replaced 3 hardcoded Border dividers with
dynamic ItemsControl bound to WeeklyDividers
- CategoryManagementViewModel: added WeekdayOption record,
WeekdayOptions array, SelectedWeekdayOption property, HasWeekday
computed property; persist GoalWeekday in SaveCategoryAsync
- CategoryManagementView: added day-of-week ComboBox visible only
when goal type is Weekly Spending
- FinanceSeedService: Groceries defaults to Saturday; allocation
uses CountWeekdayOccurrences for accurate monthly totals
- Version bump: 3.12.4 → 3.13.0
Replace weekly tick marks with pill-style segment gaps
Details
Weekly goal bars now show 4 distinct pill segments separated by 4px
background-colored gaps instead of barely visible 1px tick marks.
The gaps punch through the fill bar using the background color,
creating clear visual separation between weekly segments.
Fix CurrencyBox Value binding to TwoWay so edits propagate
Details
ValueProperty defaulted to OneWay binding, so when the user edited
the amount and tabbed out, the parsed value was set on the CurrencyBox
but never pushed back to CategoryViewModel.Allocated. Changed the
default binding mode to TwoWay so LostFocus edits flow back to the
ViewModel, triggering save and dashboard refresh.
Disable ZBB methodology switcher, default to Envelope mode
Details
Removed the "Switch Mode" button and methodology label from the
budget dashboard UI. Hardcoded IsEnvelopeMode = true so the Envelope
code path always executes. Updated intent handlers and indexable
content to pass true directly instead of reading MethodologyType.
ZBB code is preserved but unreachable for potential future use.
Add bottom padding to Finance ScrollViewers to prevent status bar cutoff
Details
All four Finance views (Budget, Reports, Register, Reconciliation) had
ScrollViewers with no bottom padding, causing the last row of content
to be clipped behind the shell's status bar. Added bottom padding to
each ScrollViewer so the last item scrolls fully into view.
Get notified about new releases