×

Plug-In: Multi-Day Project

This plug-in create a project, lasting a specified number of days, containing a sequential series of daily tasks.

multi-day project interface

Return to: OmniFocus Plug-In Collection

Mutli-Day Project
 

/*{ "type": "action", "targets": ["omnifocus"], "author": "Otto Automator", "identifier": "com.omni-automation.of.multiple-day-project", "version": "1.0", "description": "Creates a sequential project with tasks for each of the indicated days.", "label": "Multi-Day Project", "shortLabel": "Multi-Day Project", "paletteLabel": "Multi-Day Project", "image": "archivebox.fill" }*/ (() => { const action = new PlugIn.Action(function(selection, sender){ (async () => { var lengths = [3,5,7,10,12,14] var lengthStrings = ["3","5","7","10","12","14"] var projectLengthField = new Form.Field.Option( "projectLength", "Length", lengths, lengthStrings, 5 ) var projectNameField = new Form.Field.String( "projectName", "Name", "New Project", null ) var appointmentNoteField = new Form.Field.String( "projectNote", "Note", null, null ) var menu1Items = ["Today", "Tomorrow", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] var menu1Indexes = menu1Items.map((item, index) => index) var menu1Element = new Form.Field.Option( "menu1Element", "Start", menu1Indexes, menu1Items, 0 ) var checkSwitchField = new Form.Field.Checkbox( "followingWeek", "Following week", null ) var inputForm = new Form() inputForm.addField(projectLengthField) inputForm.addField(projectNameField) inputForm.addField(appointmentNoteField) inputForm.addField(menu1Element) inputForm.addField(checkSwitchField) inputForm.validate = function(formObject){ var projectName = formObject.values['projectName'] if (!projectName || projectName.length === 0){return false} return true } var defaultDueTime = settings.objectForKey('DefaultDueTime') var formPrompt = "Multiple-Day Project:" var buttonTitle = "Continue" var formObject = await inputForm.show(formPrompt, buttonTitle) var menu1Index = formObject.values['menu1Element'] var chosen1Item = menu1Items[menu1Index] var projectName = formObject.values['projectName'] var useFollowingWeek = formObject.values['followingWeek'] var projectLength = formObject.values['projectLength'] var projectNote = formObject.values['projectNote'] var fmatr = Formatter.Date.withStyle(Formatter.Date.Style.Full, Formatter.Date.Style.Short) var dateObj = fmatr.dateFromString(`${chosen1Item} @ ${defaultDueTime}`) if(useFollowingWeek){ var dc = Calendar.current.dateComponentsFromDate(dateObj) dc.day = dc.day + 7 dateObj = Calendar.current.dateFromDateComponents(dc) } var currentLocale = Calendar.current.locale.identifier currentLocale = currentLocale.replace("_", "-"); var project = new Project(projectName) project.sequential = true project.completedByChildren = true if(projectNote){project.note = projectNote} for (var i = 0; i < projectLength; i++) { var weekday = dateObj.toLocaleString(currentLocale, {weekday: 'short'}); var taskName = `Day ${i + 1} · ${weekday} ${dateObj.toLocaleDateString()}` new Task(taskName, project).dueDate = dateObj var dateObj = new Date(dateObj.setDate(dateObj.getDate() + 1)) } var projectID = project.id.primaryKey URL.fromString("omnifocus:///task/" + projectID).open() })().catch(err => console.error(err.message)) }); action.validate = function(selection, sender){ // validation code return true }; return action; })();