This commit is contained in:
2025-07-18 10:03:58 -04:00
parent 4f01a6445f
commit 66f257609f
37 changed files with 845 additions and 704 deletions

View File

@ -18,14 +18,9 @@ enum AppStorageKeys {
struct SettingsView: View {
@Environment(\.modelContext) private var modelContext
@State private var showingPopulateData = false
@State private var showingClearAllDataConfirmation = false
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 {
@ -40,67 +35,9 @@ struct SettingsView: View {
.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)
}
}
}
Section(header: Text("Developer")) {
Button(action: {
showingPopulateData = true
}) {
HStack {
Label("Populate Data", systemImage: "plus")
Spacer()
}
}
.confirmationDialog(
"Populate Data?",
isPresented: $showingPopulateData,
titleVisibility: .hidden
) {
Button("Populate Data") {
DataLoader.create(modelContext: modelContext)
}
Button("Cancel", role: .cancel) {}
// } message: {
// Text("This action cannot be undone. All data will be permanently deleted.")
}
Button(action: {
showingClearAllDataConfirmation = true
}) {
@ -139,10 +76,6 @@ struct SettingsView: View {
private func clearAllData () {
do {
try deleteAllObjects(ofType: ExerciseType.self, from: modelContext)
try deleteAllObjects(ofType: Exercise.self, from: modelContext)
try deleteAllObjects(ofType: Muscle.self, from: modelContext)
try deleteAllObjects(ofType: MuscleGroup.self, from: modelContext)
try deleteAllObjects(ofType: Split.self, from: modelContext)
try deleteAllObjects(ofType: SplitExerciseAssignment.self, from: modelContext)
try deleteAllObjects(ofType: Workout.self, from: modelContext)
@ -154,30 +87,6 @@ struct SettingsView: View {
}
}
struct ExercisesListView: View {
var body: some View {
EntityListView<Exercise>(sort: [SortDescriptor(\Exercise.name)])
}
}
struct ExerciseTypeListView: View {
var body: some View {
EntityListView<ExerciseType>(sort: [SortDescriptor(\ExerciseType.name)])
}
}
struct MuscleGroupsListView: View {
var body: some View {
EntityListView<MuscleGroup>(sort: [SortDescriptor(\MuscleGroup.name)])
}
}
struct MusclesListView: View {
var body: some View {
EntityListView<Muscle>(sort: [SortDescriptor(\Muscle.name)])
}
}
struct SplitsListView: View {
var body: some View {
EntityListView<Split>(sort: [SortDescriptor(\Split.name)])

View File

@ -12,15 +12,24 @@ import SwiftUI
struct SplitExerciseAssignmentAddEditView: View {
@Environment(\.modelContext) private var modelContext
@Environment(\.dismiss) private var dismiss
@State private var showingExercisePicker = false
@State var model: SplitExerciseAssignment
var body: some View {
NavigationStack {
Form {
Section (header: Text("Setup")) {
TextEditor(text: $model.setup)
.frame(minHeight: 60)
Section(header: Text("Exercise")) {
Button(action: {
showingExercisePicker = true
}) {
HStack {
Text(model.exerciseName.isEmpty ? "Select Exercise" : model.exerciseName)
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(.gray)
}
}
}
Section (header: Text("Sets/Reps")) {
@ -44,7 +53,12 @@ struct SplitExerciseAssignmentAddEditView: View {
}
}
}
.navigationTitle("\(model.exercise?.name ?? Exercise.unnamed)")
.sheet(isPresented: $showingExercisePicker) {
ExercisePickerView { exerciseName in
model.exerciseName = exerciseName
}
}
.navigationTitle(model.exerciseName.isEmpty ? "New Exercise" : model.exerciseName)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {