feat(itinerary): add draggable travel day positioning with CloudKit persistence

- Add TravelDayOverride model for storing user-customized travel day positions
- Add TravelOverrideService for CloudKit CRUD operations on travel overrides
- Add CKTravelDayOverride CloudKit model wrapper
- Refactor itinerarySections to validate travel day bounds (must be after last game in departure city)
- Travel segments can now be dragged to different days within valid range
- Persist travel day overrides to CloudKit for cross-device sync

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-16 19:00:52 -06:00
parent 29942eee57
commit bf9619a207
4 changed files with 670 additions and 156 deletions

View File

@@ -0,0 +1,38 @@
//
// TravelDayOverride.swift
// SportsTime
//
// Stores user-customized travel day positions
//
import Foundation
/// Represents a user override of the default travel day placement.
/// Travel segments normally appear on the day after the last game in the departure city.
/// This model allows users to drag travel to a different day within valid bounds.
struct TravelDayOverride: Identifiable, Codable, Hashable {
let id: UUID
let tripId: UUID
/// Stable identifier for the travel segment (e.g., "travel:houston->arlington")
let travelAnchorId: String
/// The day number (1-indexed) where the travel should display
var displayDay: Int
let createdAt: Date
var modifiedAt: Date
init(
id: UUID = UUID(),
tripId: UUID,
travelAnchorId: String,
displayDay: Int,
createdAt: Date = Date(),
modifiedAt: Date = Date()
) {
self.id = id
self.tripId = tripId
self.travelAnchorId = travelAnchorId
self.displayDay = displayDay
self.createdAt = createdAt
self.modifiedAt = modifiedAt
}
}