From efd55dad39b071c57bb6ac8768b07f1bb5b830db Mon Sep 17 00:00:00 2001 From: Aaron Fields Date: Sun, 4 Aug 2024 08:25:52 -0400 Subject: [PATCH] Add the ability to edit or clear the due date, and priority. --- Sources/RemindersLibrary/CLI.swift | 35 ++++++++++++++++++++++-- Sources/RemindersLibrary/Reminders.swift | 28 ++++++++++++++++++- 2 files changed, 59 insertions(+), 4 deletions(-) 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/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 {