A fundamental mechanism for prompting for and retrieving textual data from a script user, is the use of the text input field. Omni Automation action forms provide this form element to enable the passing of textual data to the script for processing.
textInputField = new Form.Field.String(
"textInputField",
null,
null)
Text Input Field
01
textInputField = newForm.Field.String(
02
key:String, <-- identifying key used in the form values record
03
displayName:String or null, <-- field label for the form dialog
04
value:String or null<-- an optional default value for the field
05
)
1 Instances of the form string input element are created using the new constructor with provided parameters that include the identifying key, an optional menu label (title), and an optional default string value or the field. The result of the constructor is a new instance that is stored in the variable: textFieldInput
2 The string input is assigned a unique identifying key (string) that is used to extract the current displayed text input object when the form is validated or processed.
3 The optional text to use as the label for the menu.
X An optional default string to be used as the value for the input field.
On iOS systems only, there is an optional property of the Form.Field.String class for setting which keyboard is displayed on the device (iPhone | iPod Touch):
keyboardType (KeyboardType) • A specific KeyboardType may be assigned to better match the input needed for a given field. Changing this value after the containing Form is shown will have no effect.
Class properties of the KeyboardType class:
ASCIICapable (KeyboardTyper/o) • Displays a keyboard which can enter ASCII characters
ASCIICapableNumberPad (KeyboardTyper/o) • A number pad (0–9) that will always be ASCII digits.
DecimalPad (KeyboardTyper/o) • A number pad with a decimal point.
Default (KeyboardTyper/o) • Default type for the current input method.
EmailAddress (KeyboardTyper/o) • A type optimized for multiple email address entry (shows space @ . prominently).
NamePhonePad (KeyboardTyper/o) • A type optimized for entering a person’s name or phone number.
NumberPad (KeyboardTyper/o) • A number pad with locale-appropriate digits (0–9, ۰-۹, ०-९, etc.). Suitable for PIN entry.
NumbersAndPunctuation (KeyboardTyper/o) • Numbers and assorted punctuation.
PhonePad (KeyboardTyper/o) • A phone pad (1–9, *, 0, #, with letters under the numbers).
Twitter (KeyboardTyper/o) • A type optimized for twitter text entry (easy access to @ #)
URL (KeyboardTyper/o) • A type optimized for URL entry (shows . / .com prominently).
WebSearch (KeyboardTyper/o) • A default keyboard type with URL-oriented addition (shows space . prominently).
all (KeyboardTyper/o) • An array of all items of this enumeration. Used in the creation of forms.
Using the Device class to determine whether or not to set the keyboard type:
if (Device.current.type === DeviceType.iPhone){
textInputField.keyboardType = KeyboardType.PhonePad
}
The following is an example of to create, display, and process the results of a form with a single text input field. As the script example is not placed within an Omni Automation action framework, this type of script is best run from either the console or a script URL.
textInputField = new Form.Field.String(
"textInput",
"ID",
"PCODE-XXXX-MM.DD.YYYY"
)
var inputForm = new Form()
inputForm.addField(textInputField)
inputForm.show("Please enter the project identifier:","Continue")
.then(
function(formObject){
console.log(formObject.values['textInput'])
}
)
inputForm.show("Please enter the project identifier:","Continue")
09
.then(
10
function(formObject){
11
console.log(formObject.values['textInput'])
12
}
13
)
01-05 The creation of a new instance of the Form.Field.String (text input) class. Note the inclusion of the identifying key string "textInput" that is used elsewhere in the script to retrieve the current input value of the form element.
06 A new empty instance of the Form class is created and stored in the variable: inputForm
07 The created text input field is added to the form using the addField(…) method of the Form class.
08 The form is displayed to the user by passing string values for the dialog prompt and button title into the show(…) method called on the created form instance. Note that the result of the form display is a JavaScript Promise object which will contain the form results when the form dialog has either been approved or declined by the user.
09-13 Although no representation for the JavaScript Promise is displayed, the then(…) method is called on the implied promise resulting from the previous show(…) method. Placing .then(…) on a new line is simply a connivence for displaying the code. Functionally, it is the same as appending to the previous method, like this: inputForm.show(…).then(…)
10 The callback function within the then(…) method is passed the form object as its parameter.
11 Using the text input’s identifying key, the current input value of the field is retrieved from the record returned as the value of the passed form’s values property. Any processing of the retrieved data by the script would be placed in the scrpt statements following this one.
Example Action: Integer Input
The following Omni Automation action for OmniGraffle includes the display, validation, and processing of a form containing a single text input field. In this example, the field is designed to accept only integers occurring within a specified range.
/*{
"type": "action",
"targets": ["omnigraffle"],
"author": "Otto Automator",
"identifier": "com.omni-automation.og.integer-input",
"description": "Displays a form with a field for accepting an integer value within a specified range.",
"version": "1.1",
"label": "Integer Input",
"shortLabel": "Integer"
}*/
(() => {
var action = new PlugIn.Action(function(selection, sender){
// CONSTRUCT THE FORM
var inputForm = new Form()
// CREATE FORM ELEMENTS: TEXT INPUT, DATE INPUT, AND CHECKBOX
textField = new Form.Field.String("input", "(1 to 34)", null)
// ADD THE ELEMENTS TO THE FORM
inputForm.addField(textField)
// DIALOG PROMPT AND OK BUTTON TITLE
let formPrompt = "Enter the number of segments to add:"
let buttonTitle = "Continue"
// DISPLAY THE FORM DIALOG
formPromise = inputForm.show(formPrompt, buttonTitle)
// VALIDATE FORM CONTENT
inputForm.validate = function(formObject){
// EXTRACT VALUES FROM THE FORM’S VALUES OBJECT
textValue = formObject.values['input']
if(!textValue){return false}
intValue = parseInt(textValue)
validation = (isNaN(intValue) || intValue > 34 || intValue < 1) ? false:true
// RETURN THE VALIDATION STATUS
return validation
}
// PERFORM PROCESSES USING FORM DATA
formPromise.then(function(formObject){
textValue = formObject.values['input']
intValue = parseInt(textValue)
console.log(intValue)
// PROCESSING STATEMENTS GO HERE
})
// PROCESS FORM CANCELLATION
formPromise.catch(function(error){
console.log("form cancelled", error)
})
});
return action;
})();
01-09 The required metadata header for the action file.
10-60 The creation and execution of an Omni Automation Action Plug-In.
14 Place a new empty instance of the Form class into the variable: inputForm
17 Place a new instance of a text input field into the variable: textField
20 Use the addField(…) method of the Form class to add the created field into the created form.
23,24 Place the form dialog prompt and approval button title into variables.
27 Pass the prompt and button title into the show(…) method of the Form class to display the form dialog to the user. The result of the dialog display will be a JavaScript Promise object that is stored in the variable: formPromise
30-42 The validation function for the displayed form. This is called when the dialog is displayed, and every time the form settings are edited by the user. The function is passed a reference to the form object in the parameter: formObject
32 The current value (text input) of the text field is extracted from the passed form by retrieving the value of the form’s values property, which is a JavaScript object containing the key/value pairs for each form element. The key "input" is used to retrieve the value of the text input field.
34 If the field contains no text, thereby returning no value, return a boolean value of false from the validation function, thereby keeping the approval button disabled.
36 If a string is entered in the text input field, attempt to convert it into an integer value using JavaScript’s parseInt(…) method, storing the resulting value in the variable: intValue
38 This ternary statement returns a value of false if: the entered string could not be converted into an integer value; or the provided integer value is greater than a specified number; or the provided integer value is less than a specified amount. However, if the provided input is an integer withi8n the specified range, then a value of true is returned from the the validation function, thereby enabling the form dialog’s approval button.
41 Return the boolean validation value.
45-51 The promise processing function then(…) is called when the form dialog has been approved by the user. A reference to the completed form object is provided as this function’s input parameter.
46 The final value (text input) of the text field is extracted from the passed form by retrieving the value of the form’s values property, which is a JavaScript object containing the key/value pairs for each form element. The key "input" is used to retrieve the value of the text input field.
47 The retrieve string is converted into an integer, which is then used in any processing routines added into this function.
54-56 Should the user cancel the form dialog, the catch(…) function is called for the promise object, allowing the script the option to perform any clean up or other necessary statements.
59 The action object is return to the enclosing function which gets called on the next line ().