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 } } } }