This commit is contained in:
2025-07-13 18:25:40 -04:00
parent d4514805e9
commit 0545f5dbc7
6 changed files with 164 additions and 57 deletions

View File

@ -1,13 +1,7 @@
import SwiftData
enum SchemaVersion: Int, CaseIterable {
static var allCases: [SchemaVersion] = [
.v1
]
enum SchemaVersion: Int {
case v1
static var current: SchemaVersion {
.v1
}
static var current: SchemaVersion { .v1 }
}

View File

@ -21,12 +21,11 @@ final class WorkoutsContainer {
@MainActor
static var preview: ModelContainer {
let schema = Schema(versionedSchema: SchemaV1.self)
let configuration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)
let configuration = ModelConfiguration(isStoredInMemoryOnly: true)
do {
let container = try ModelContainer(for: schema, configurations: [configuration])
let schema = Schema(SchemaV1.models)
let container = try ModelContainer(for: schema, configurations: configuration)
let context = ModelContext(container)
// Create default data for previews

View File

@ -1,13 +1,96 @@
import SwiftUI
import SwiftData
struct ExerciseAddEditView: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.modelContext) private var modelContext
@Bindable var model: Exercise
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var exerciseTypes: [ExerciseType]
@State var model: Exercise
init(model: Exercise? = nil) {
_model = State(initialValue: model ?? Exercise(name: "", setup: "", descr: "", sets: 3, reps: 10, weight: 30))
}
var body: some View {
Text("Add/Edit Exercise")
.navigationTitle("Exercise")
Form {
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)
.padding(.vertical, 4)
}
Section (header: Text("Setup")) {
TextEditor(text: $model.setup)
.frame(minHeight: 100)
.padding(.vertical, 4)
// } footer: {
// Text("Describe concisely how equipment should be configured")
}
Section (header: Text("Weight")) {
HStack {
Text("\(model.weight)")
.bold()
Text("lbs")
Spacer()
Stepper("", value: $model.weight, in: 0...1000)
}
}
// Section(header: Text("Target Muscles")) {
// Button(action: {
// showingMuscleSelection = true
// }) {
// HStack {
// if selectedMuscles.isEmpty {
// Text("None selected")
// .foregroundColor(.secondary)
// } else {
// Text(selectedMuscles.map { $0.name }.joined(separator: ", "))
// .foregroundColor(.primary)
// .multilineTextAlignment(.leading)
// }
// Spacer()
// Image(systemName: "chevron.right")
// .foregroundColor(.secondary)
// .font(.caption)
// }
// }
// }
}
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {
dismiss()
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save") {
try? modelContext.save()
dismiss()
}
}
}
}
}

View File

@ -16,6 +16,7 @@ struct ExercisesListView: View {
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var groups: [ExerciseType]
@State var showingAddSheet = false
@State var itemToEdit: Exercise? = nil
@State var itemToDelete: Exercise? = nil
@ -53,6 +54,18 @@ struct ExercisesListView: View {
}
}
.navigationTitle("Exercises")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
showingAddSheet.toggle()
}) {
Image(systemName: "plus")
}
}
}
.sheet(isPresented: $showingAddSheet) {
ExerciseAddEditView()
}
.sheet(item: $itemToEdit) { item in
ExerciseAddEditView(model: item)
}

View File

@ -13,7 +13,11 @@ struct MuscleGroupAddEditView: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.modelContext) private var modelContext
@Bindable var model: MuscleGroup
@State var model: MuscleGroup
init(model: MuscleGroup? = nil) {
_model = State(initialValue: model ?? MuscleGroup(name: "", descr: ""))
}
var body: some View {
NavigationStack {
@ -38,6 +42,9 @@ struct MuscleGroupAddEditView: View {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save") {
if model.modelContext == nil {
modelContext.insert(model)
}
try? modelContext.save()
dismiss()
}

View File

@ -15,11 +15,11 @@ struct MuscleGroupsListView: View {
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var items: [MuscleGroup]
@State var showingAddSheet = false
@State var itemToEdit: MuscleGroup? = nil
@State var itemToDelete: MuscleGroup? = nil
var body: some View {
NavigationStack {
Form {
List {
ForEach (items) { item in
@ -39,7 +39,19 @@ struct MuscleGroupsListView: View {
}
}
}
}
.navigationTitle("Muscle Groups")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
showingAddSheet.toggle()
}) {
Image(systemName: "plus")
}
}
}
.sheet(isPresented: $showingAddSheet) {
MuscleGroupAddEditView()
}
.sheet(item: $itemToEdit) {item in
MuscleGroupAddEditView(model: item)
@ -66,5 +78,4 @@ struct MuscleGroupsListView: View {
Text("Are you sure you want to delete \(itemToDelete?.name ?? "this item")?")
}
}
}
}