fix(itinerary): add city to game items for proper constraint validation
Travel constraint validation was not working because ItineraryConstraints had no game items to validate against - games came from RichGame objects but were never converted to ItineraryItem for constraint checking. Changes: - Add city parameter to ItemKind.game enum case - Create game ItineraryItems from RichGame data in buildItineraryData() - Update isValidTravelPosition to compare against actual game sortOrders - Fix tests to use appropriate game sortOrder conventions Now travel is properly constrained to appear before arrival city games and after departure city games. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -203,7 +203,7 @@ struct TripDetailView: View {
|
||||
withAnimation {
|
||||
travelOverrides[travelId] = TravelOverride(day: newDay, sortOrder: newSortOrder)
|
||||
}
|
||||
await saveTravelDayOverride(travelAnchorId: travelId, displayDay: newDay)
|
||||
await saveTravelDayOverride(travelAnchorId: travelId, displayDay: newDay, sortOrder: newSortOrder)
|
||||
}
|
||||
},
|
||||
onCustomItemMoved: { itemId, day, sortOrder in
|
||||
@@ -1371,7 +1371,8 @@ struct TripDetailView: View {
|
||||
// Persist to CloudKit as a travel ItineraryItem
|
||||
await self.saveTravelDayOverride(
|
||||
travelAnchorId: droppedId,
|
||||
displayDay: dayNumber
|
||||
displayDay: dayNumber,
|
||||
sortOrder: newSortOrder
|
||||
)
|
||||
return
|
||||
}
|
||||
@@ -1393,8 +1394,8 @@ struct TripDetailView: View {
|
||||
return false
|
||||
}
|
||||
|
||||
private func saveTravelDayOverride(travelAnchorId: String, displayDay: Int) async {
|
||||
print("💾 [TravelOverrides] Saving override: \(travelAnchorId) -> day \(displayDay)")
|
||||
private func saveTravelDayOverride(travelAnchorId: String, displayDay: Int, sortOrder: Double) async {
|
||||
print("💾 [TravelOverrides] Saving override: \(travelAnchorId) -> day \(displayDay), sortOrder \(sortOrder)")
|
||||
|
||||
// Parse travel ID to extract cities (format: "travel:city1->city2")
|
||||
let stripped = travelAnchorId.replacingOccurrences(of: "travel:", with: "")
|
||||
@@ -1414,6 +1415,7 @@ struct TripDetailView: View {
|
||||
// Update existing
|
||||
var updated = itineraryItems[existingIndex]
|
||||
updated.day = displayDay
|
||||
updated.sortOrder = sortOrder
|
||||
updated.modifiedAt = Date()
|
||||
itineraryItems[existingIndex] = updated
|
||||
await ItineraryItemService.shared.updateItem(updated)
|
||||
@@ -1423,7 +1425,7 @@ struct TripDetailView: View {
|
||||
let item = ItineraryItem(
|
||||
tripId: trip.id,
|
||||
day: displayDay,
|
||||
sortOrder: 0, // Travel always comes first in day
|
||||
sortOrder: sortOrder,
|
||||
kind: .travel(travelInfo)
|
||||
)
|
||||
itineraryItems.append(item)
|
||||
|
||||
Reference in New Issue
Block a user