add GenericItemManager, fix small inconsistencies

This commit is contained in:
Felix Förtsch
2024-11-15 16:49:49 +01:00
parent 02e2937094
commit 1668b29803
4 changed files with 338 additions and 8 deletions

View File

@@ -9,16 +9,40 @@ import Foundation
import SwiftData
@Model
final class Equipment: Nameable {
static var systemImage = "dumbbell.fill"
final class Equipment {
var id = UUID()
var creationDate: Date = Date.now
@Attribute(.unique) var name: String
var exercises: [Exercise] = []
@Attribute(.unique)
var name: String
init(name: String) {
init(name: String = "") {
self.name = name
}
}
// This protocol is required to display the name if the equipment in the List.
extension Equipment: CustomStringConvertible {
var description: String {
name
}
}
extension Equipment: EditableModel {
static var editableProperties: [EditableProperty] {
[
EditableProperty(
displayName: "Name",
type: String.self,
get: { item in
guard let equipment = item as? Equipment else { return "" }
return equipment.name
},
set: { item, newValue in
guard let equipment = item as? Equipment else { return }
equipment.name = newValue
}
)
]
}
}

View File

@@ -51,6 +51,24 @@ struct ExerciseEditor: View {
}
.pickerStyle(NavigationLinkPickerStyle())
}
AssignmentButton<Exercise, Equipment>(
title: "Equipment",
owner: exercise,
sortBy: SortDescriptor(\Equipment.name),
getAssignedItems: { exercise in
exercise.equipment
},
assign: { exercise, equipment in
exercise.equipment.append(equipment)
},
unassign: { exercise, equipment in
exercise.equipment.removeAll(where: { $0.id == equipment.id })
},
createNew: { Equipment(name: "") }
)
Section(footer: Text("Feature coming soon.")) {
Toggle(isOn: $isPartOfProgression) {
Text("Exercise is Part of a Progression")