wip
This commit is contained in:
@ -0,0 +1,48 @@
|
||||
//
|
||||
// ExerciseTypeAddEditView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 11:33 AM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct ExerciseTypeAddEditView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Bindable var model: ExerciseType
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section (header: Text("Nname")) {
|
||||
TextField("Name", text: $model.name)
|
||||
.bold()
|
||||
}
|
||||
|
||||
Section(header: Text("Description")) {
|
||||
TextEditor(text: $model.descr)
|
||||
.frame(minHeight: 100)
|
||||
.padding(.vertical, 4)
|
||||
}
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
Button("Cancel") {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
Button("Save") {
|
||||
try? modelContext.save()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
//
|
||||
// ExerciseTypeListView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 11:27 AM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct ExerciseTypeListView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var items: [ExerciseType]
|
||||
|
||||
@State var itemToEdit: ExerciseType? = nil
|
||||
@State var itemToDelete: ExerciseType? = nil
|
||||
|
||||
private func save () {
|
||||
try? modelContext.save()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
List {
|
||||
ForEach (items) { item in
|
||||
ListItem(title: item.name)
|
||||
.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("Exercise Types")
|
||||
.sheet(item: $itemToEdit) {item in
|
||||
ExerciseTypeAddEditView(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")?")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
13
Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift
Normal file
13
Workouts/Views/Settings/Exercises/ExerciseAddEditView.swift
Normal file
@ -0,0 +1,13 @@
|
||||
import SwiftUI
|
||||
|
||||
struct ExerciseAddEditView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Bindable var model: Exercise
|
||||
|
||||
var body: some View {
|
||||
Text("Add/Edit Exercise")
|
||||
.navigationTitle("Exercise")
|
||||
}
|
||||
}
|
82
Workouts/Views/Settings/Exercises/ExercisesListView.swift
Normal file
82
Workouts/Views/Settings/Exercises/ExercisesListView.swift
Normal file
@ -0,0 +1,82 @@
|
||||
//
|
||||
// ExercisesListView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 4:30 PM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct ExercisesListView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\ExerciseType.name)]) var groups: [ExerciseType]
|
||||
|
||||
@State var itemToEdit: Exercise? = nil
|
||||
@State var itemToDelete: Exercise? = nil
|
||||
|
||||
private func save () {
|
||||
try? modelContext.save()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
ForEach (groups) { group in
|
||||
let items = group.exercises ?? []
|
||||
let itemCount = items.count
|
||||
if itemCount > 0 {
|
||||
Section (header: Text("\(group.name) (\(itemCount))")) {
|
||||
ForEach (items) { item in
|
||||
ListItem(title: item.name)
|
||||
.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("Exercises")
|
||||
.sheet(item: $itemToEdit) { item in
|
||||
ExerciseAddEditView(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")?")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
import SwiftUI
|
||||
|
||||
//
|
||||
// MuscleGroupAddEditView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 12:14 PM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
struct MuscleGroupAddEditView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Bindable var model: MuscleGroup
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section (header: Text("Name")) {
|
||||
TextField("Name", text: $model.name)
|
||||
.bold()
|
||||
}
|
||||
|
||||
Section(header: Text("Description")) {
|
||||
TextEditor(text: $model.descr)
|
||||
.frame(minHeight: 100)
|
||||
.padding(.vertical, 4)
|
||||
}
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
Button("Cancel") {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
Button("Save") {
|
||||
try? modelContext.save()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
//
|
||||
// MuscleGroupsListView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 12:14 PM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct MuscleGroupsListView: View {
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var items: [MuscleGroup]
|
||||
|
||||
@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)
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("Muscle Groups")
|
||||
}
|
||||
.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")?")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
59
Workouts/Views/Settings/Muscles/MuscleAddEditView.swift
Normal file
59
Workouts/Views/Settings/Muscles/MuscleAddEditView.swift
Normal file
@ -0,0 +1,59 @@
|
||||
//
|
||||
// MuscleAddEditView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 11:55 AM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct MuscleAddEditView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var muscleGroups: [MuscleGroup]
|
||||
@Bindable var model: Muscle
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section (header: Text("Name")) {
|
||||
TextField("Name", text: $model.name)
|
||||
.bold()
|
||||
}
|
||||
|
||||
Section(header: Text("Muscle Group")) {
|
||||
Picker("Muscle Group", selection: $model.muscleGroup) {
|
||||
Text("Select a muscle group").tag(nil as MuscleGroup?)
|
||||
ForEach(muscleGroups) { group in
|
||||
Text(group.name).tag(group as MuscleGroup?)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Section(header: Text("Description")) {
|
||||
TextEditor(text: $model.descr)
|
||||
.frame(minHeight: 100)
|
||||
.padding(.vertical, 4)
|
||||
}
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
Button("Cancel") {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
Button("Save") {
|
||||
try? modelContext.save()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
79
Workouts/Views/Settings/Muscles/MusclesListView.swift
Normal file
79
Workouts/Views/Settings/Muscles/MusclesListView.swift
Normal file
@ -0,0 +1,79 @@
|
||||
//
|
||||
// MuscleGroupsListView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 12:14 PM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct MusclesListView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\MuscleGroup.name)]) var groups: [MuscleGroup]
|
||||
|
||||
@State var itemToEdit: Muscle? = nil
|
||||
@State var itemToDelete: Muscle? = nil
|
||||
|
||||
private func save () {
|
||||
try? modelContext.save()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
ForEach (groups) { group in
|
||||
Section (header: Text("\(group.name) (\(group.muscles?.count ?? 0))")) {
|
||||
let items = group.muscles ?? []
|
||||
ForEach (items) { item in
|
||||
ListItem(title: item.name)
|
||||
.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("Muscles")
|
||||
.sheet(item: $itemToEdit) { item in
|
||||
MuscleAddEditView(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")?")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
77
Workouts/Views/Settings/SettingsView.swift
Normal file
77
Workouts/Views/Settings/SettingsView.swift
Normal file
@ -0,0 +1,77 @@
|
||||
//
|
||||
// SettingsView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 10:24 AM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct SettingsView: View {
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
|
||||
var splitsCount: Int? { try? modelContext.fetchCount(FetchDescriptor<Split>()) }
|
||||
var musclesCount: Int? { try? modelContext.fetchCount(FetchDescriptor<Muscle>()) }
|
||||
var muscleGroupsCount: Int? { try? modelContext.fetchCount(FetchDescriptor<MuscleGroup>()) }
|
||||
var exerciseTypeCount: Int? { try? modelContext.fetchCount(FetchDescriptor<ExerciseType>()) }
|
||||
var exercisesCount: Int? { try? modelContext.fetchCount(FetchDescriptor<Exercise>()) }
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section (header: Text("Lists")) {
|
||||
NavigationLink(destination: SplitsListView()) {
|
||||
HStack {
|
||||
Text("Splits")
|
||||
Spacer()
|
||||
Text("\(splitsCount ?? 0)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
NavigationLink(destination: MuscleGroupsListView()) {
|
||||
HStack {
|
||||
Text("Muscle Groups")
|
||||
Spacer()
|
||||
Text("\(muscleGroupsCount ?? 0)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
NavigationLink(destination: MusclesListView()) {
|
||||
HStack {
|
||||
Text("Muscles")
|
||||
Spacer()
|
||||
Text("\(musclesCount ?? 0)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
NavigationLink(destination: ExerciseTypeListView()) {
|
||||
HStack {
|
||||
Text("Exercise Types")
|
||||
Spacer()
|
||||
Text("\(exerciseTypeCount ?? 0)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
NavigationLink(destination: ExercisesListView()) {
|
||||
HStack {
|
||||
Text("Exercises")
|
||||
Spacer()
|
||||
Text("\(exercisesCount ?? 0)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("Settings")
|
||||
}
|
||||
}
|
||||
}
|
78
Workouts/Views/Settings/Splits/SplitAddEditView.swift
Normal file
78
Workouts/Views/Settings/Splits/SplitAddEditView.swift
Normal file
@ -0,0 +1,78 @@
|
||||
import SwiftUI
|
||||
|
||||
struct SplitAddEditView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Bindable var model: Split
|
||||
|
||||
@State var itemToEdit: SplitExerciseAssignment? = nil
|
||||
@State var itemToDelete: SplitExerciseAssignment? = nil
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section (header: Text("Name")) {
|
||||
TextField("Name", text: $model.name)
|
||||
.bold()
|
||||
}
|
||||
|
||||
Section(header: Text("Description")) {
|
||||
TextEditor(text: $model.intro)
|
||||
.frame(minHeight: 100)
|
||||
.padding(.vertical, 4)
|
||||
}
|
||||
|
||||
Section(header: Text("Exercises")) {
|
||||
let item = model
|
||||
if let assignments = item.exercises, !assignments.isEmpty {
|
||||
ForEach(assignments, id: \.id) { item in
|
||||
List {
|
||||
ListItem(
|
||||
title: item.exercise?.name ?? "Unnamed",
|
||||
subtitle: "\(item.sets) × \(item.reps) @ \(item.weight) lbs"
|
||||
)
|
||||
.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)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Text("No exercises added")
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
|
||||
Button(action: {
|
||||
|
||||
}) {
|
||||
Label("Add Exercise", systemImage: "plus.circle")
|
||||
}
|
||||
}
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
Button("Cancel") {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
Button("Save") {
|
||||
try? modelContext.save()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
78
Workouts/Views/Settings/Splits/SplitsListView.swift
Normal file
78
Workouts/Views/Settings/Splits/SplitsListView.swift
Normal file
@ -0,0 +1,78 @@
|
||||
//
|
||||
// SplitsListView.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/13/25 at 10:27 AM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
struct SplitsListView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
|
||||
@Query(sort: [SortDescriptor(\Split.name)]) var items: [Split]
|
||||
|
||||
@State var itemToEdit: Split? = nil
|
||||
@State var itemToDelete: Split? = nil
|
||||
|
||||
private func save () {
|
||||
try? modelContext.save()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
List {
|
||||
ForEach (items) { item in
|
||||
ListItem(
|
||||
title: item.name,
|
||||
count: item.exercises?.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
|
||||
SplitAddEditView(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