You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
3.5 KiB
77 lines
3.5 KiB
import SwiftUI
|
|
|
|
struct TasksView: View {
|
|
@EnvironmentObject var store: Store
|
|
@State private var newName = ""
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 0) {
|
|
HStack(spacing: 10) {
|
|
TextField("Neue Aufgabe", text: $newName)
|
|
.textFieldStyle(.roundedBorder)
|
|
.frame(width: 260)
|
|
.onSubmit(add)
|
|
Button("Hinzufügen", action: add).buttonStyle(.borderedProminent)
|
|
.disabled(newName.trimmingCharacters(in: .whitespaces).isEmpty)
|
|
Text("Reihenfolge = Spalten in der Übersicht (ziehen zum Umsortieren). „Mit Partner“ blendet beim Eintragen das Partner-Feld ein.")
|
|
.font(.caption).foregroundStyle(Theme.muted)
|
|
}
|
|
.padding(16)
|
|
|
|
List {
|
|
ForEach($store.db.tasks) { $task in
|
|
HStack(spacing: 16) {
|
|
TextField("Name", text: $task.name)
|
|
.textFieldStyle(.roundedBorder)
|
|
.frame(width: 260)
|
|
Picker("", selection: $task.group) {
|
|
ForEach(TaskGroup.allCases) { Text($0.shortTitle).tag($0) }
|
|
}
|
|
.labelsHidden()
|
|
.frame(width: 170)
|
|
if task.partnerColumn {
|
|
Text("zählt die Partner").foregroundStyle(Theme.muted).frame(width: 120, alignment: .leading)
|
|
} else {
|
|
Toggle("Mit Partner", isOn: $task.withPartner).frame(width: 120, alignment: .leading)
|
|
}
|
|
Text(count(store.entryCount(task: task))).foregroundStyle(Theme.muted).frame(width: 90, alignment: .leading)
|
|
Spacer()
|
|
if !task.partnerColumn {
|
|
Button("Löschen", role: .destructive) { delete(task) }
|
|
.buttonStyle(.link).foregroundStyle(Theme.bengara)
|
|
}
|
|
}
|
|
.padding(.vertical, 3)
|
|
}
|
|
.onMove { store.db.tasks.move(fromOffsets: $0, toOffset: $1) }
|
|
}
|
|
}
|
|
}
|
|
|
|
private func count(_ n: Int) -> String { n == 1 ? "1 Eintrag" : "\(n) Einträge" }
|
|
|
|
private func add() {
|
|
let n = newName.trimmingCharacters(in: .whitespaces)
|
|
guard !n.isEmpty else { return }
|
|
let at = store.db.tasks.firstIndex(where: \.partnerColumn) ?? store.db.tasks.endIndex
|
|
store.db.tasks.insert(DutyTask(id: newID("t"), name: n, group: .schulung), at: at)
|
|
newName = ""
|
|
}
|
|
|
|
private func delete(_ task: DutyTask) {
|
|
let n = store.entryCount(task: task)
|
|
let alert = NSAlert()
|
|
if n > 0 {
|
|
alert.messageText = "„\(task.name)“ hat \(n) Einträge im Verlauf."
|
|
alert.informativeText = "Aufgaben mit Einträgen lassen sich nicht löschen. Du kannst sie umbenennen."
|
|
alert.runModal(); return
|
|
}
|
|
alert.messageText = "Aufgabe „\(task.name)“ löschen?"
|
|
alert.addButton(withTitle: "Löschen").hasDestructiveAction = true
|
|
alert.addButton(withTitle: "Abbrechen")
|
|
guard alert.runModal() == .alertFirstButtonReturn else { return }
|
|
store.db.tasks.removeAll { $0.id == task.id }
|
|
for i in store.db.persons.indices { store.db.persons[i].tasks.removeAll { $0 == task.id } }
|
|
}
|
|
}
|