wip
This commit is contained in:
@ -1,13 +1,7 @@
|
|||||||
import SwiftData
|
import SwiftData
|
||||||
|
|
||||||
enum SchemaVersion: Int, CaseIterable {
|
enum SchemaVersion: Int {
|
||||||
static var allCases: [SchemaVersion] = [
|
|
||||||
.v1
|
|
||||||
]
|
|
||||||
|
|
||||||
case v1
|
case v1
|
||||||
|
|
||||||
static var current: SchemaVersion {
|
static var current: SchemaVersion { .v1 }
|
||||||
.v1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -21,12 +21,11 @@ final class WorkoutsContainer {
|
|||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
static var preview: ModelContainer {
|
static var preview: ModelContainer {
|
||||||
let schema = Schema(versionedSchema: SchemaV1.self)
|
let configuration = ModelConfiguration(isStoredInMemoryOnly: true)
|
||||||
|
|
||||||
let configuration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)
|
|
||||||
|
|
||||||
do {
|
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)
|
let context = ModelContext(container)
|
||||||
|
|
||||||
// Create default data for previews
|
// Create default data for previews
|
||||||
|
@ -1,13 +1,96 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import SwiftData
|
||||||
|
|
||||||
struct ExerciseAddEditView: View {
|
struct ExerciseAddEditView: View {
|
||||||
@Environment(\.dismiss) private var dismiss
|
@Environment(\.dismiss) private var dismiss
|
||||||
@Environment(\.modelContext) private var modelContext
|
@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 {
|
var body: some View {
|
||||||
Text("Add/Edit Exercise")
|
Form {
|
||||||
.navigationTitle("Exercise")
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ struct ExercisesListView: View {
|
|||||||
|
|
||||||
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var groups: [ExerciseType]
|
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var groups: [ExerciseType]
|
||||||
|
|
||||||
|
@State var showingAddSheet = false
|
||||||
@State var itemToEdit: Exercise? = nil
|
@State var itemToEdit: Exercise? = nil
|
||||||
@State var itemToDelete: Exercise? = nil
|
@State var itemToDelete: Exercise? = nil
|
||||||
|
|
||||||
@ -53,6 +54,18 @@ struct ExercisesListView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navigationTitle("Exercises")
|
.navigationTitle("Exercises")
|
||||||
|
.toolbar {
|
||||||
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||||||
|
Button(action: {
|
||||||
|
showingAddSheet.toggle()
|
||||||
|
}) {
|
||||||
|
Image(systemName: "plus")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.sheet(isPresented: $showingAddSheet) {
|
||||||
|
ExerciseAddEditView()
|
||||||
|
}
|
||||||
.sheet(item: $itemToEdit) { item in
|
.sheet(item: $itemToEdit) { item in
|
||||||
ExerciseAddEditView(model: item)
|
ExerciseAddEditView(model: item)
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,11 @@ struct MuscleGroupAddEditView: View {
|
|||||||
@Environment(\.dismiss) private var dismiss
|
@Environment(\.dismiss) private var dismiss
|
||||||
@Environment(\.modelContext) private var modelContext
|
@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 {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
@ -38,6 +42,9 @@ struct MuscleGroupAddEditView: View {
|
|||||||
|
|
||||||
ToolbarItem(placement: .navigationBarTrailing) {
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||||||
Button("Save") {
|
Button("Save") {
|
||||||
|
if model.modelContext == nil {
|
||||||
|
modelContext.insert(model)
|
||||||
|
}
|
||||||
try? modelContext.save()
|
try? modelContext.save()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
@ -15,56 +15,67 @@ struct MuscleGroupsListView: View {
|
|||||||
|
|
||||||
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var items: [MuscleGroup]
|
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var items: [MuscleGroup]
|
||||||
|
|
||||||
|
@State var showingAddSheet = false
|
||||||
@State var itemToEdit: MuscleGroup? = nil
|
@State var itemToEdit: MuscleGroup? = nil
|
||||||
@State var itemToDelete: MuscleGroup? = nil
|
@State var itemToDelete: MuscleGroup? = nil
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
Form {
|
||||||
Form {
|
List {
|
||||||
List {
|
ForEach (items) { item in
|
||||||
ForEach (items) { item in
|
ListItem(title: item.name, count: item.muscles?.count)
|
||||||
ListItem(title: item.name, count: item.muscles?.count)
|
.swipeActions(edge: .trailing, allowsFullSwipe: false) {
|
||||||
.swipeActions(edge: .trailing, allowsFullSwipe: false) {
|
Button (role: .destructive) {
|
||||||
Button (role: .destructive) {
|
itemToDelete = item
|
||||||
itemToDelete = item
|
} label: {
|
||||||
} label: {
|
Label("Delete", systemImage: "trash")
|
||||||
Label("Delete", systemImage: "trash")
|
|
||||||
}
|
|
||||||
Button {
|
|
||||||
itemToEdit = item
|
|
||||||
} label: {
|
|
||||||
Label("Edit", systemImage: "pencil")
|
|
||||||
}
|
|
||||||
.tint(.indigo)
|
|
||||||
}
|
}
|
||||||
}
|
Button {
|
||||||
|
itemToEdit = item
|
||||||
|
} label: {
|
||||||
|
Label("Edit", systemImage: "pencil")
|
||||||
|
}
|
||||||
|
.tint(.indigo)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.navigationTitle("Muscle Groups")
|
|
||||||
}
|
}
|
||||||
.sheet(item: $itemToEdit) {item in
|
}
|
||||||
MuscleGroupAddEditView(model: item)
|
.navigationTitle("Muscle Groups")
|
||||||
}
|
.toolbar {
|
||||||
.confirmationDialog(
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||||||
"Delete?",
|
Button(action: {
|
||||||
isPresented: Binding<Bool>(
|
showingAddSheet.toggle()
|
||||||
get: { itemToDelete != nil },
|
}) {
|
||||||
set: { if !$0 { itemToDelete = nil } }
|
Image(systemName: "plus")
|
||||||
),
|
|
||||||
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")?")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sheet(isPresented: $showingAddSheet) {
|
||||||
|
MuscleGroupAddEditView()
|
||||||
|
}
|
||||||
|
.sheet(item: $itemToEdit) {item in
|
||||||
|
MuscleGroupAddEditView(model: item)
|
||||||
|
}
|
||||||
|
.confirmationDialog(
|
||||||
|
"Delete?",
|
||||||
|
isPresented: Binding<Bool>(
|
||||||
|
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")?")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user