Craft eXtension: Append Block Link to Project
This Craft extension will append a link to the selected block to a project chosen in OmniFocus.
| Append Block Link to Chosen Project |
| Recreates the structured Craft selection in OmniFocus as a project. |
|
|
Here is the main script from the Craft eXtension main HTML file:
Main Script
<script>btn = document.getElementById("F35ECB19-ED91-48B6-9579-770EC3022D6F");btn.addEventListener("click", async () => {try {// GET THE CURRENT PAGEresult = await craft.editorApi.getSelection()if (result.status !== "success") {throw new Error(result.message)} else {var selectionData = result.data}// GET THE INFO FOR THE FIRST SELECTED BLOCKvar spaceID = selectionData[0]["spaceId"]var blockID = selectionData[0]["id"]var craftData = {"spaceID":spaceID,"blockID":blockID}// FUNCTION TO BE EXECUTED BY OMNIFOCUSfunction appendLinkToProjectNote(passedData){// CREATE FORM FOR GATHERING USER INPUTvar inputForm = new Form()// CREATE TEXT FIELDvar textField = new Form.Field.String("textInput","Search",null)// CREATE MENUvar popupMenu = new Form.Field.Option("menuItem","Results",[],[],null)popupMenu.allowsNull = truepopupMenu.nullOptionTitle = "0 items"// ADD THE FIELDS TO THE FORMinputForm.addField(textField)inputForm.addField(popupMenu)// PRESENT THE FORM TO THE USERvar currentValue = nullformPrompt = "Enter a project title:"formPromise = inputForm.show(formPrompt,"Continue")// VALIDATE THE USER INPUTinputForm.validate = function(formObject){var textInput = formObject.values["textInput"]if(textInput !== currentValue){currentValue = textInput// remove popup menuif (inputForm.fields.length === 2){inputForm.removeField(inputForm.fields[1])}}if(inputForm.fields.length === 1){// search using provided stringif (!textInput){var searchResults = []} else {var searchResults = projectsMatching(textInput)}var searchResultNames = searchResults.map(item => item.name)var searchResultIDs = searchResults.map(item => item.id.primaryKey)var popupMenu = new Form.Field.Option("menuItem","Results",searchResultIDs,searchResultNames,null)popupMenu.allowsNull = truepopupMenu.nullOptionTitle = String(searchResults.length + " items")inputForm.addField(popupMenu)return false}if(!textInput){return false}if(inputForm.fields.length === 2){menuValue = formObject.values["menuItem"]if(menuValue === undefined || String(menuValue) === "null"){return false}return true}}// PROCESSING USING THE DATA EXTRACTED FROM THE FORMformPromise.then(function(formObject){var projectID = formObject.values["menuItem"]var projectObj = Project.byIdentifier(projectID)blockID = passedData["blockID"]spaceID = passedData["spaceID"]backLink = `craftdocs://open?blockId=${blockID}&spaceId=${spaceID}`if (projectObj.note.length === 0){var noteString = backLink} else {var noteString = `\n${backLink}`}projectObj.appendStringToNote(noteString)URL.fromString(`omnifocus:///task/${projectID}`).open()})}// CREATE FUNCTION AND CONTENT STRINGScontentString = JSON.stringify(craftData)encodedContent = encodeURIComponent(contentString)functionString = appendLinkToProjectNote.toString()encodedFunction = encodeURIComponent(functionString)// CREATE SCRIPT URLurl = 'omnifocus://localhost/omnijs-run?script=' +'%28' + encodedFunction + '%29' +'%28' + 'argument' + '%29' +'&arg=' + encodedContent// EXECUTE THE URLawait craft.editorApi.openURL(url)}catch(err){throw `${err.name}\n${err.message}`}});</script>