diff --git a/Sources/RemindersLibrary/CLI.swift b/Sources/RemindersLibrary/CLI.swift index 329b88e..15acb13 100644 --- a/Sources/RemindersLibrary/CLI.swift +++ b/Sources/RemindersLibrary/CLI.swift @@ -229,6 +229,26 @@ private struct Edit: ParsableCommand { @Argument( help: "The index or id of the reminder to delete, see 'show' for indexes") var index: String + + @Option( + name: .shortAndLong, + help: "The new date the reminder is due") + var dueDate: DateComponents? + + @Flag( + name: .shortAndLong, + help: "Clear the due date.") + var clearDueDate: Bool = false + + @Option( + name: .shortAndLong, + help: "The new priority of the reminder") + var priority: Priority? + + @Flag( + name: .shortAndLong, + help: "Clear the priority of the reminder.") + var clearPriority: Bool = false @Option( name: .shortAndLong, @@ -241,8 +261,13 @@ private struct Edit: ParsableCommand { var reminder: [String] = [] func validate() throws { - if self.reminder.isEmpty && self.notes == nil { - throw ValidationError("Must specify either new reminder content or new notes") + + if self.dueDate != nil && self.clearDueDate { + throw ValidationError("Don't try to set & clear the due date at the same time.") + } + + if self.reminder.isEmpty && self.notes == nil && self.dueDate == nil && !self.clearDueDate { + throw ValidationError("Must specify new reminder content, new notes, or a new due date.") } } @@ -252,7 +277,11 @@ private struct Edit: ParsableCommand { itemAtIndex: self.index, onListNamed: self.listName, newText: newText.isEmpty ? nil : newText, - newNotes: self.notes + newNotes: self.notes, + dueDateComponents: self.dueDate, + clearDueDate: self.clearDueDate, + priority: self.priority, + clearPriority: self.clearPriority ) } } diff --git a/Sources/RemindersLibrary/EKReminder+Encodable.swift b/Sources/RemindersLibrary/EKReminder+Encodable.swift index 3821b0c..8db4f24 100644 --- a/Sources/RemindersLibrary/EKReminder+Encodable.swift +++ b/Sources/RemindersLibrary/EKReminder+Encodable.swift @@ -16,6 +16,7 @@ extension EKReminder: Encodable { case startDate case dueDate case list + case hasRecurrenceRules } public func encode(to encoder: Encoder) throws { @@ -26,7 +27,7 @@ extension EKReminder: Encodable { try container.encode(self.priority, forKey: .priority) try container.encode(self.calendar.title, forKey: .list) try container.encodeIfPresent(self.notes, forKey: .notes) - + try container.encode(self.hasRecurrenceRules, forKey: .hasRecurrenceRules) // url field is nil // https://developer.apple.com/forums/thread/128140 try container.encodeIfPresent(self.url, forKey: .url) diff --git a/Sources/RemindersLibrary/Reminders.swift b/Sources/RemindersLibrary/Reminders.swift index cab7d77..2e27438 100644 --- a/Sources/RemindersLibrary/Reminders.swift +++ b/Sources/RemindersLibrary/Reminders.swift @@ -223,7 +223,7 @@ public final class Reminders { } } - func edit(itemAtIndex index: String, onListNamed name: String, newText: String?, newNotes: String?) { + func edit(itemAtIndex index: String, onListNamed name: String, newText: String?, newNotes: String?, dueDateComponents: DateComponents? = nil, clearDueDate: Bool, priority: Priority?, clearPriority: Bool) { let calendar = self.calendar(withName: name) let semaphore = DispatchSemaphore(value: 0) @@ -236,6 +236,32 @@ public final class Reminders { do { reminder.title = newText ?? reminder.title reminder.notes = newNotes ?? reminder.notes + + + if clearPriority { + // https://developer.apple.com/documentation/eventkit/ekreminderpriority/none + reminder.priority = 0 + } + else if priority != nil { + reminder.priority = Int(priority?.value.rawValue ?? UInt(reminder.priority)) + + } + + if clearDueDate || (dueDateComponents != nil) { + // remove previous time-based alarms, leaving location alarms. + reminder.dueDateComponents = nil + for alarm in reminder.alarms ?? [] { + if alarm.structuredLocation != nil { continue } else { reminder.removeAlarm(alarm) } + } + + } + if dueDateComponents != nil { + reminder.dueDateComponents = dueDateComponents + if let dueDate = dueDateComponents?.date, dueDateComponents?.hour != nil { + reminder.addAlarm(EKAlarm(absoluteDate: dueDate)) + } + } + try Store.save(reminder, commit: true) print("Updated reminder '\(reminder.title!)'") } catch let error {