|
|
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.")
|
|
|
}
|
|
|
}
|