98 lines
2.8 KiB
Swift
98 lines
2.8 KiB
Swift
import Foundation
|
||
import SwiftData
|
||
import SwiftUI
|
||
|
||
@Model
|
||
final class Split {
|
||
var name: String = ""
|
||
var intro: String = ""
|
||
|
||
@Relationship(deleteRule: .cascade, inverse: \SplitExerciseAssignment.split)
|
||
var exercises: [SplitExerciseAssignment]? = []
|
||
|
||
@Relationship(deleteRule: .nullify, inverse: \Workout.split)
|
||
var workouts: [Workout]? = []
|
||
|
||
init(name: String, intro: String) {
|
||
self.name = name
|
||
self.intro = intro
|
||
}
|
||
}
|
||
|
||
// MARK: - EditableEntity Conformance
|
||
|
||
extension Split: EditableEntity {
|
||
var count: Int? {
|
||
return self.exercises?.count
|
||
}
|
||
|
||
static func createNew() -> Split {
|
||
return Split(name: "", intro: "")
|
||
}
|
||
|
||
static var navigationTitle: String {
|
||
return "Splits"
|
||
}
|
||
|
||
@ViewBuilder
|
||
static func formView(for model: Split) -> some View {
|
||
EntityAddEditView(model: model) { $model in
|
||
SplitFormView(model: $model)
|
||
}
|
||
}
|
||
}
|
||
|
||
// MARK: - Private Form View
|
||
|
||
fileprivate struct SplitFormView: View {
|
||
@Binding var model: Split
|
||
@State private var itemToDelete: SplitExerciseAssignment? = nil
|
||
|
||
var body: some View {
|
||
Section(header: Text("Name")) {
|
||
TextField("Name", text: $model.name)
|
||
.bold()
|
||
}
|
||
|
||
Section(header: Text("Description")) {
|
||
TextEditor(text: $model.intro)
|
||
.frame(minHeight: 100)
|
||
}
|
||
|
||
Section(header: Text("Exercises")) {
|
||
if let assignments = model.exercises, !assignments.isEmpty {
|
||
ForEach(assignments) { item in
|
||
ListItem(
|
||
title: item.exercise?.name ?? "Unnamed",
|
||
subtitle: "\(item.sets) × \(item.reps) @ \(item.weight) lbs"
|
||
)
|
||
.swipeActions {
|
||
Button(role: .destructive) {
|
||
itemToDelete = item
|
||
} label: {
|
||
Label("Delete", systemImage: "trash")
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
Text("No exercises added yet.")
|
||
}
|
||
Button(action: {
|
||
// TODO: Implement add exercise functionality
|
||
}) {
|
||
Label("Add Exercise", systemImage: "plus.circle")
|
||
}
|
||
}
|
||
.confirmationDialog("Delete Exercise?", isPresented: .constant(itemToDelete != nil), titleVisibility: .visible) {
|
||
Button("Delete", role: .destructive) {
|
||
if let item = itemToDelete {
|
||
withAnimation {
|
||
model.exercises?.removeAll { $0.id == item.id }
|
||
itemToDelete = nil
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|