"Defer until tomorrow" on the Mac

I frequently use the “Defer until Tomorrow” popup on OmniFocus on my iPhone (see below). Is there no way to do this on the Mac other than manually updating the defer and due dates?

1 Like

Take a look at this plug-in Plug-In: Task Date Controls

If you have the Inspector pane displayed, the Defer Until field has buttons to defer the current task +1 day, +1 week, and +1 month. And, of course, you can set the date for the Defer Until field directly.

If you want to defer multiple tasks, you can select them in the list and then use either one of those buttons or set the date directly. The change all of the selected tasks.

Hi. If you are using a sync server such as the Omnigroup’s, then OmniFocus should display the same configuration on all your devices including Defer dates. If you have many tasks you can put them all into a project and then set your constraints on the project - everything within the project, including tasks and sub-tasks, will take on the properties of the project including Defer dates, et.al.

I know about Task Date Controls, but I just wanted this one feature so I wrote a tiny plugin for it:

/*{
    "author": "Defer Until Tomorrow",
    "targets": ["omnifocus"],
    "type": "action",
    "identifier": "com.billatkinsplugins.Defer Until Tomorrow",
    "version": "0.1",
    "description": "A plug-in that...",
    "label": "Defer Until Tomorrow",
    "mediumLabel": "Defer Until Tomorrow",
    "paletteLabel": "Defer Until Tomorrow",
}*/
(() => {
    var action = new PlugIn.Action(function(selection) {
      let oneDayDelta = new DateComponents(); 
      oneDayDelta.day = 1; 
      
      let tomorrow = Calendar.current.dateComponentsFromDate(
        Calendar.current.dateByAddingDateComponents(new Date(), oneDayDelta)
      );
      
      function setDayToTomorrow(dateComps) {
        dateComps.day = tomorrow.day;
        dateComps.month = tomorrow.month;
        dateComps.year = tomorrow.year;
      }

      for( const task of selection.tasks ) {
        if( task.deferDate != null ) {
          let newDeferDateComponents = Calendar.current.dateComponentsFromDate(task.deferDate);
          setDayToTomorrow(newDeferDateComponents);
          task.deferDate = Calendar.current.dateFromDateComponents(newDeferDateComponents);
        }
        else {
          task.deferDate = Calendar.current.dateFromDateComponents(tomorrow);
        }
        
        if( task.dueDate != null && task.dueDate < task.deferDate ) {
          let newDueDateComponents = Calendar.current.dateComponentsFromDate(task.dueDate);
          setDayToTomorrow(newDueDateComponents);
          task.dueDate = Calendar.current.dateFromDateComponents(newDueDateComponents);
        }
      }
    });

    // If needed, uncomment, and add a function that returns true if the current selection is appropriate for the action.
    action.validate = function(selection){
      return selection.tasks.length > 0;
    };
        
    return action;
})();