wip
This commit is contained in:
@ -1,9 +1,10 @@
|
||||
import Foundation
|
||||
import SwiftData
|
||||
import SwiftUI
|
||||
|
||||
@Model
|
||||
final class Split: ListableItem {
|
||||
@Attribute(.unique) var name: String = ""
|
||||
final class Split {
|
||||
var name: String = ""
|
||||
var intro: String = ""
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \SplitExerciseAssignment.split)
|
||||
@ -17,3 +18,80 @@ final class Split: ListableItem {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user