import SwiftUI struct EntrySheet: View { @EnvironmentObject var store: Store @EnvironmentObject var ui: UIState @Environment(\.dismiss) private var dismiss @State private var entry: Entry @State private var date: Date @State private var showAll = false init(entry: Entry) { _entry = State(initialValue: entry) _date = State(initialValue: Day.date(entry.date) ?? Date()) } private var task: DutyTask? { store.task(entry.task) } private var showPartner: Bool { task?.withPartner == true || !entry.partner.isEmpty } private func people(for taskID: String?, keep: String) -> [Person] { store.personsSorted.filter { showAll || taskID == nil || $0.may(taskID!) || $0.id == keep } } private var warnings: [String] { var w: [String] = [] if let t = task, let p = store.person(entry.person), !p.may(t.id) { w.append("\(p.name) ist für „\(t.name)“ nicht freigegeben.") } if let pa = store.person(entry.partner), !pa.may("partner") { w.append("\(pa.name) ist nicht als Partner freigegeben.") } if !entry.partner.isEmpty, entry.partner == entry.person { w.append("Person und Partner sind gleich.") } return w } var body: some View { VStack(alignment: .leading, spacing: 16) { Text(entry.isNew ? "Neuer Eintrag" : "Eintrag bearbeiten").font(.title3.weight(.semibold)) Form { DatePicker("Datum", selection: $date, displayedComponents: .date) .datePickerStyle(.field) Picker("Aufgabe", selection: $entry.task) { Text("Aufgabe wählen …").tag("") ForEach(TaskGroup.allCases) { g in Section(g.shortTitle) { ForEach(store.db.tasks.filter { $0.group == g && !$0.partnerColumn }) { Text($0.name).tag($0.id) } } } } Picker("Person", selection: $entry.person) { Text("Person wählen …").tag("") ForEach(people(for: task?.id, keep: entry.person)) { Text($0.name).tag($0.id) } } Toggle("Alle Personen anzeigen (auch ohne Freigabe)", isOn: $showAll) if showPartner { Picker("Partner", selection: $entry.partner) { Text("– kein Partner –").tag("") ForEach(people(for: "partner", keep: entry.partner)) { Text($0.name).tag($0.id) } } } TextField("Thema / Notiz", text: $entry.note, prompt: Text("optional")) } .formStyle(.columns) ForEach(warnings, id: \.self) { w in Label(w, systemImage: "exclamationmark.triangle").foregroundStyle(Theme.kohaku).font(.callout) } HStack { if !entry.isNew { Button("Löschen", role: .destructive) { store.delete(entry: entry.id); dismiss() } } Spacer() Button("Abbrechen", role: .cancel) { dismiss() }.keyboardShortcut(.cancelAction) Button(entry.isNew ? "Eintragen" : "Sichern", action: save) .keyboardShortcut(.defaultAction) .buttonStyle(.borderedProminent) .disabled(entry.task.isEmpty || entry.person.isEmpty) } } .padding(22) .frame(width: 460) } private func save() { var e = entry e.date = Day.string(date) if !(task?.withPartner ?? false) && e.partner.isEmpty { e.partner = "" } let wasNew = e.isNew if wasNew { e.id = newID("e") } e.note = e.note.trimmingCharacters(in: .whitespaces) store.save(entry: e) dismiss() ui.show(wasNew ? "Eingetragen: \(store.task(e.task)?.name ?? "") · \(store.name(e.person))" : "Eintrag geändert.") } }