import Foundation import SwiftData import SwiftUI @Model final class Exercise { var name: String = "" var setup: String = "" var descr: String = "" var sets: Int = 0 var reps: Int = 0 var weight: Int = 0 @Relationship(deleteRule: .nullify, inverse: \ExerciseType.exercises) var type: ExerciseType? @Relationship(deleteRule: .nullify, inverse: \Muscle.exercises) var muscles: [Muscle]? = [] @Relationship(deleteRule: .nullify, inverse: \SplitExerciseAssignment.exercise) var splits: [SplitExerciseAssignment]? = [] @Relationship(deleteRule: .nullify, inverse: \WorkoutLog.exercise) var logs: [WorkoutLog]? = [] init(name: String, setup: String, descr: String, sets: Int, reps: Int, weight: Int) { self.name = name self.setup = setup self.descr = descr self.sets = sets self.reps = reps self.weight = weight } static let unnamed = "Unnamed Exercise" } extension Exercise: EditableEntity { static func createNew() -> Exercise { return Exercise(name: "", setup: "", descr: "", sets: 3, reps: 10, weight: 30) } static var navigationTitle: String { return "Exercises" } @ViewBuilder static func formView(for model: Exercise) -> some View { EntityAddEditView(model: model) { $model in // This internal view is necessary to use @Query within the form. ExerciseFormView(model: $model) } } } fileprivate struct ExerciseFormView: View { @Binding var model: Exercise @Query(sort: [SortDescriptor(\ExerciseType.name)]) var exerciseTypes: [ExerciseType] var body: some View { Section(header: Text("Name")) { TextField("Name", text: $model.name) .bold() } Section(header: Text("Exercise Type")) { Picker("Type", selection: $model.type) { Text("Select a type").tag(nil as ExerciseType?) ForEach(exerciseTypes) { type in Text(type.name).tag(type as ExerciseType?) } } } Section(header: Text("Description")) { TextEditor(text: $model.descr) .frame(minHeight: 100) } Section(header: Text("Setup")) { TextEditor(text: $model.setup) .frame(minHeight: 100) } Section(header: Text("Weight")) { HStack { Text("\(model.weight)") .bold() Text("lbs") Spacer() Stepper("", value: $model.weight, in: 0...1000) } } } }