fix(planning): gameFirst mode now uses full date range and shows correct month

Two bugs fixed in "By Games" trip planning mode:

1. Calendar navigation: DateRangePicker now navigates to the selected
   game's month when startDate changes externally, instead of staying
   on the current month.

2. Date range calculation: Fixed race condition where date range was
   calculated before games were loaded. Now updateDateRangeForSelectedGames()
   is called after loadSummaryGames() completes.

3. Bonus games: planTrip() now uses the UI-selected 7-day date range
   instead of overriding it with just the anchor game dates. This allows
   ScenarioBPlanner to find additional games within the trip window.

Added regression tests to verify gameFirst mode includes bonus games.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-21 16:37:19 -06:00
parent 4d097883a6
commit d97dec44b2
4 changed files with 153 additions and 30 deletions

View File

@@ -90,6 +90,25 @@ struct DateRangePicker: View {
selectionState = .complete
}
}
.onChange(of: startDate) { oldValue, newValue in
// Navigate calendar to show the new month when startDate changes externally
// (e.g., when user selects a game in GamePickerStep)
let oldMonth = calendar.component(.month, from: oldValue)
let newMonth = calendar.component(.month, from: newValue)
let oldYear = calendar.component(.year, from: oldValue)
let newYear = calendar.component(.year, from: newValue)
if oldMonth != newMonth || oldYear != newYear {
withAnimation(.easeInOut(duration: 0.2)) {
displayedMonth = calendar.startOfDay(for: newValue)
}
}
// Also update selection state to complete if we have a valid range
if endDate > newValue {
selectionState = .complete
}
}
}
private var selectedRangeSummary: some View {