From 0545f5dbc77aa2610de2e391e1456feceb75d5c3 Mon Sep 17 00:00:00 2001 From: rzen Date: Sun, 13 Jul 2025 18:25:40 -0400 Subject: [PATCH] wip --- Workouts/Schema/SchemaVersion.swift | 10 +- Workouts/Schema/WorkoutsContainer.swift | 7 +- .../Exercises/ExerciseAddEditView.swift | 89 +++++++++++++++++- .../Exercises/ExercisesListView.swift | 13 +++ .../MuscleGroups/MuscleGroupAddEditView.swift | 9 +- .../MuscleGroups/MuscleGroupsListView.swift | 93 +++++++++++-------- 6 files changed, 164 insertions(+), 57 deletions(-) diff --git a/Workouts/Schema/SchemaVersion.swift b/Workouts/Schema/SchemaVersion.swift index 147c305..20f97be 100644 --- a/Workouts/Schema/SchemaVersion.swift +++ b/Workouts/Schema/SchemaVersion.swift @@ -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 } } diff --git a/Workouts/Schema/WorkoutsContainer.swift b/Workouts/Schema/WorkoutsContainer.swift index b431d30..3be23a3 100644 --- a/Workouts/Schema/WorkoutsContainer.swift +++ b/Workouts/Schema/WorkoutsContainer.swift @@ -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 diff --git a/Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift b/Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift index f9cff58..0ae29a7 100644 --- a/Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift +++ b/Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift @@ -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() + } + } + } + } } diff --git a/Workouts/Views/Settings/Exercises/ExercisesListView.swift b/Workouts/Views/Settings/Exercises/ExercisesListView.swift index a0bdda8..8e294c3 100644 --- a/Workouts/Views/Settings/Exercises/ExercisesListView.swift +++ b/Workouts/Views/Settings/Exercises/ExercisesListView.swift @@ -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) } diff --git a/Workouts/Views/Settings/MuscleGroups/MuscleGroupAddEditView.swift b/Workouts/Views/Settings/MuscleGroups/MuscleGroupAddEditView.swift index f4bfdbe..cb696b2 100644 --- a/Workouts/Views/Settings/MuscleGroups/MuscleGroupAddEditView.swift +++ b/Workouts/Views/Settings/MuscleGroups/MuscleGroupAddEditView.swift @@ -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() } diff --git a/Workouts/Views/Settings/MuscleGroups/MuscleGroupsListView.swift b/Workouts/Views/Settings/MuscleGroups/MuscleGroupsListView.swift index c0b9a25..94ddb96 100644 --- a/Workouts/Views/Settings/MuscleGroups/MuscleGroupsListView.swift +++ b/Workouts/Views/Settings/MuscleGroups/MuscleGroupsListView.swift @@ -15,56 +15,67 @@ 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 - ListItem(title: item.name, count: item.muscles?.count) - .swipeActions(edge: .trailing, allowsFullSwipe: false) { - Button (role: .destructive) { - itemToDelete = item - } label: { - Label("Delete", systemImage: "trash") - } - Button { - itemToEdit = item - } label: { - Label("Edit", systemImage: "pencil") - } - .tint(.indigo) + Form { + List { + ForEach (items) { item in + ListItem(title: item.name, count: item.muscles?.count) + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + Button (role: .destructive) { + itemToDelete = item + } label: { + Label("Delete", systemImage: "trash") } - } + Button { + itemToEdit = item + } label: { + Label("Edit", systemImage: "pencil") + } + .tint(.indigo) + } } - .navigationTitle("Muscle Groups") } - .sheet(item: $itemToEdit) {item in - MuscleGroupAddEditView(model: item) - } - .confirmationDialog( - "Delete?", - isPresented: Binding( - get: { itemToDelete != nil }, - set: { if !$0 { itemToDelete = nil } } - ), - titleVisibility: .visible - ) { - Button("Delete", role: .destructive) { - if let itemToDelete = itemToDelete { - modelContext.delete(itemToDelete) - try? modelContext.save() - self.itemToDelete = nil - } + } + .navigationTitle("Muscle Groups") + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + showingAddSheet.toggle() + }) { + Image(systemName: "plus") } - Button("Cancel", role: .cancel) { - itemToDelete = nil - } - } message: { - Text("Are you sure you want to delete \(itemToDelete?.name ?? "this item")?") } } + .sheet(isPresented: $showingAddSheet) { + MuscleGroupAddEditView() + } + .sheet(item: $itemToEdit) {item in + MuscleGroupAddEditView(model: item) + } + .confirmationDialog( + "Delete?", + isPresented: Binding( + get: { itemToDelete != nil }, + set: { if !$0 { itemToDelete = nil } } + ), + titleVisibility: .visible + ) { + Button("Delete", role: .destructive) { + if let itemToDelete = itemToDelete { + modelContext.delete(itemToDelete) + try? modelContext.save() + self.itemToDelete = nil + } + } + Button("Cancel", role: .cancel) { + itemToDelete = nil + } + } message: { + Text("Are you sure you want to delete \(itemToDelete?.name ?? "this item")?") + } } }