- Migrate from SwiftData to CoreData with CloudKit sync - Add core models: Split, Exercise, Workout, WorkoutLog - Implement tab-based UI: Workout Logs, Splits, Settings - Add SF Symbols picker for split icons - Add exercise picker filtered by split with exclusion of added exercises - Integrate IndieAbout for settings/about section - Add Yams for YAML exercise definition parsing - Include starter exercise libraries (bodyweight, Planet Fitness) - Add Date extensions for formatting (formattedTime, isSameDay) - Format workout date ranges to show time-only for same-day end dates - Add build number update script - Add app icons
67 lines
1.7 KiB
Swift
67 lines
1.7 KiB
Swift
import Foundation
|
|
import CoreData
|
|
import SwiftUI
|
|
|
|
@objc(Split)
|
|
public class Split: NSManagedObject, Identifiable {
|
|
@NSManaged public var name: String
|
|
@NSManaged public var color: String
|
|
@NSManaged public var systemImage: String
|
|
@NSManaged public var order: Int32
|
|
|
|
@NSManaged public var exercises: NSSet?
|
|
@NSManaged public var workouts: NSSet?
|
|
|
|
public var id: NSManagedObjectID { objectID }
|
|
|
|
static let unnamed = "Unnamed Split"
|
|
}
|
|
|
|
// MARK: - Convenience Accessors
|
|
|
|
extension Split {
|
|
var exercisesArray: [Exercise] {
|
|
let set = exercises as? Set<Exercise> ?? []
|
|
return set.sorted { $0.order < $1.order }
|
|
}
|
|
|
|
var workoutsArray: [Workout] {
|
|
let set = workouts as? Set<Workout> ?? []
|
|
return set.sorted { $0.start > $1.start }
|
|
}
|
|
|
|
func addToExercises(_ exercise: Exercise) {
|
|
let items = mutableSetValue(forKey: "exercises")
|
|
items.add(exercise)
|
|
}
|
|
|
|
func removeFromExercises(_ exercise: Exercise) {
|
|
let items = mutableSetValue(forKey: "exercises")
|
|
items.remove(exercise)
|
|
}
|
|
|
|
func addToWorkouts(_ workout: Workout) {
|
|
let items = mutableSetValue(forKey: "workouts")
|
|
items.add(workout)
|
|
}
|
|
|
|
func removeFromWorkouts(_ workout: Workout) {
|
|
let items = mutableSetValue(forKey: "workouts")
|
|
items.remove(workout)
|
|
}
|
|
}
|
|
|
|
// MARK: - Fetch Request
|
|
|
|
extension Split {
|
|
@nonobjc public class func fetchRequest() -> NSFetchRequest<Split> {
|
|
return NSFetchRequest<Split>(entityName: "Split")
|
|
}
|
|
|
|
static func orderedFetchRequest() -> NSFetchRequest<Split> {
|
|
let request = fetchRequest()
|
|
request.sortDescriptors = [NSSortDescriptor(keyPath: \Split.order, ascending: true)]
|
|
return request
|
|
}
|
|
}
|