Projects are typically configured in the ArcGIS QuickCapture designer using a graphical interface, but you can also change the project's JSON code.
When editing the project's JSON, you can modify the following properties:
- basemap—Map displayed when reviewing data.
- dataSources—Lists the feature layers used by buttons in the project.
- preferences—Applicable to all records captured in a project.
- templateGroups—Represents a group of buttons.
- templates—Represents a button.
- cameraInfo—How photos and video are captured for the record.
- captureInfo—How data is captured when a button is selected. Configure to display the map after capture (for location editing) and customize the display text and hint that is shown on the map page.
- displayInfo—How a button will look.
- fieldInfos—The attribute values that will be captured for the record.
- tracking—Represents the location sharing layer used by the project.
- userInput—User-supplied string that can be used to populate attributes of a record.
Some of these properties are arrays of additional properties. The following subsections describe details of the property arrays.
Basemap
By default, the map of a new project will match the default basemap of the organization. When signed in to the app with an organization account, the user will see the current default organization basemap in that project. If the user is signed out of the app, the Esri World Topographic map is displayed.
The following properties are used to identify a map to be used in a project:
Property | Description | Field type |
---|---|---|
type | WebMap, MMPK, VTPK, or TPK. When null, Esri World Topographic map is used. | String |
itemId | The item ID of the map. | String |
useDefaultBasemap | True (default) or false. | Boolean |
Project authors can override the default behavior by selecting an online or offline map of their choice. If useDefaultBasemap is set to false and the itemId is null, the project will use the Esri World Topographic map.
The following example shows a required web map that is only available to the user who downloaded it:
{
"basemap":{
"type":"WebMap",
"itemId":fae788aa91e54244b161b59725dcbb2a,
"useDefaultBasemap":false,
"required":true,
"zoomLevel":null
}
}
To show users the previously submitted data on a map in your project, you can configure a web map that contains the project data and nominate it as the basemap.
- The web map should at least contain the same layers as the project. Other layers can also be included.
- The symbology defined in the web map will be used to symbolize the sent features.
- Data captured on the device that has not been sent will be symbolized using the default QuickCapture symbology. For example, points will be symbolized with the blue marker.
Note:
Only maps with Web Mercator spatial reference are supported.
Data sources
The following properties are used to identify a feature layer in a project:
Property | Description | Field type |
---|---|---|
dataSourceId | A unique number assigned by QuickCapture to this project to identify this layer in the array. This is not the index of the layer in the feature service. One project can have layers from different feature services. | Integer |
featureServiceItemId | The item ID of the feature service that contains this layer. | String |
URL | The URL of the feature layer REST endpoint (…/FeatureServer/0). This URL must include the full URL, down to the layer index. | String |
One or more data sources can be listed in the dataSource property. In the following example, two layers that come from two different feature services are listed:
{
"basemap":{
},
"dataSources":[
{
"featureServiceItemId":"1f683747c06c4a7e9843a477b2ab41e0",
"dataSourceId":0,
"url":"https://services1.arcgis.com/e7dVfn25KpfE6dDd/arcgis/rest/services/LayerOne/FeatureServer/0"
},
{
"featureServiceItemId":"2b313747c06c4a7e9843a477b2ab41e0",
"dataSourceId":1,
"url":"https://services1.arcgis.com/b45KpfE6dEf121/arcgis/rest/services/LayerTwo/FeatureServer/1"
}
],
"itemId":"",
"preferences":{
},
"templateGroups":[
],
"userInputs":[
],
"version":""
}
Preferences
The following properties are applicable to the project or all records captured in a project:
Property | Description | Field type |
---|---|---|
backgroundColor | Project background color as an HTML hexadecimal value. | String |
splitScreen | Show the buttons and map side by side. | Boolean |
horizontalAccuracyWarning | A decimal value, in meters, defining a recommended threshold above which the horizontal accuracy is no longer considered sufficient. This is used to change the color of the horizontal accuracy display on the project page. This property accepts a maximum value of 999 meters. | Decimal |
horizontalAccuracyError | A decimal value, in meters, defining a required threshold above which the horizontal accuracy is no longer considered sufficient. This is used to prevent the user from capturing records or vertices if the threshold is not met. This property accepts a maximum value of 999 meters. | Decimal |
allowEditLocation | Allow location of a point to be updated, within a limited time after capture. | Boolean |
distanceThreshold | The minimum movement distance in meters from the last vertex or point captured before a new vertex or point can be captured. The default distance is 10 meters. | Decimal |
undoThreshold | The time in seconds after capture in which records can be deleted or have their location updated. | Decimal |
adminEmail | Specifies the recipient of data recovery files generated by the mobile app. | String |
coordinateNotationFormat | Set the project coordinate notation format displayed in the mobile app. Supported values are UTM, USNG, MGRS, DD, DDM, and DMS. Default is DD. | Double |
While thresholds can be set for both horizontalAccuracyWarning and horizontalAccuracyError, the horizontalAccuracyWarning value must always be lower than the error. For example, if you set a recommended horizontal accuracy of 10 meters and a required horizontal accuracy of 30 meters, and your device returns an accuracy of 20 meters, you will see a warning. If your device returns an accuracy of 40 meters, you will be unable to capture a record.
The following example shows preferences set with a gray background, the recommended horizontal accuracy of 10 meters, no distance threshold, and an admin email address of quickcapture@esri.com:
{
"basemap":{
},
"dataSources":[
],
"itemId":"",
"preferences":{
"splitScreen":false,
"backgroundColor":"#f3f3f4",
"horizontalAccuracyError":null,
"horizontalAccuracyWarning":10,
"distanceThreshold":null,
"undoThreshold":10,
"adminEmail":"quickcapture@esri.com"
},
"templateGroups":[
],
"userInputs":[
],
"version":""
}
Note:
Decimal values must use a period as the decimal separator, and thousand separators should not be used. Commas are not accepted in the JSON editor.
Template groups
The following properties are used to define how a group of buttons is displayed in a project. Each group of buttons can use different properties.
Property | Description | Field type |
---|---|---|
name | Name of the group. | String |
label | Label shown in the project for the group. | String |
columns | Number of columns in the group. | Integer |
columnSpacing | Spacing between the columns. | Decimal |
rowSpacing | Spacing between the rows. | Decimal |
backgroundColor | Background color of the group as an HTML hexadecimal value. | String |
outlineColor | Outline color of the group as an HTML hexadecimal value. | String |
expanded | Default is true. | Boolean |
labelColor | Color of the group label as an HTML hexadecimal value. | String |
Templates
The following properties are used to identify the feature layer that's related to a button:
Property | Description | Field type |
---|---|---|
id | The UUID for the button. | Text |
dataSourceId | References the target layer where data is stored. The ID refers to a data source in the data sources array. | Integer |
captureInfo
The following properties describe how data is to be captured:
Property | Description | Field type |
---|---|---|
exclusivityGroup | A value defining an exclusivity group. All templates with the same value are grouped, with exclusive set to true. When set, only one button with the value can be active at a time. | Text |
type | esriGeometryPoint, esriGeometryPolyline, or esriGeometryPolygon. | String |
continuous | Always true for lines and polygons. | Boolean |
editMap | Options for edit map. Choose to show after capture (default is false), customize the map title (default is null), or customize the map hint (default is null). | String |
displayInfo
The following properties describe how a button will look:
Property | Description | Field type |
---|---|---|
label | The label on the button. | String |
shape | Rectangle, rounded, or circle. | String |
size | Small, medium, large, xlarge, or xxlarge. | String |
color | Color of the button background as an HTML hexadecimal value. | String |
outlineColor | Color of the button outline as an HTML hexadecimal value. | String |
outlineWidth | Width of the button outline. | Decimal |
labelColor | Color of the button label as an HTML hexadecimal value. | String |
labelFontSize | Font size for the button label. | Integer |
labelFontWeight | Bold or regular. | String |
shadowColor | When no value is provided, the app will use the same backgroundColor value as the group. This means the shadow will not be visible. | String |
image | Image to be shown with the button in PNG, JPG, or SVG format. All images are stored as resources of the item in the images folder. | String |
fieldInfos
The following properties describe attribute information that is entered into the feature service when a button is tapped. Typically, a project author will use predefined text or field variables to populate fields of the record collected.
Property | Description | Field type |
---|---|---|
fieldName | Name of the field. | String |
value | Can contain any of the properties listed in this topic. | String |
cameraInfo
The following properties describe how photos or video can be captured and saved in a project. By default, if you enable photos to be captured for a button, the photo is always required. You can make photo capture optional by changing the required property to be false and minMedia to be 0. You can also specify photo quality by changing the imageSize property. (The default maximum length for video is 10 seconds.)
Property | Description | Field type |
---|---|---|
mode | None (default)—No photo or video is associated with the feature. Automatic—A photo is taken without confirmation from the user as soon as the button is selected. Manual—Camera preview is displayed and the user controls the capture of a photo. | String |
imageSize | Small (320 pixels on longest edge), medium (640 pixels on longest edge), large (default, 1280 pixels on longest edge), or unrestricted (no size limit). If the image is resized by the app, the aspect ratio of the captured image will be maintained. | String |
required | True (default) or false. | Boolean |
captureVideo | True or false (default). | Boolean |
capturePhoto | True (default) or false. | Boolean |
maxMedia | Maximum number of photos or video captured by a button. The maximum limit is 5 for photos and 1 for video. | Integer |
minMedia | Minimum number of photos or video captured by a button. | Integer |
In the following example, an optional photo with no size limit is taken without preview confirmation:
{
"cameraInfo": {
"mode": "automatic",
"imageSize": "unrestricted",
"required": false,
"captureVideo": false,
"capturePhoto": true,
"maxMedia": 1,
"minMedia": 0
},
notificationsInfo
The following properties are used to configure notifications within a project. Currently, the only supported notification is a webhook.
Property | Description | Field type |
---|---|---|
id | Unique ID of the webhook (within the project). | String |
name | Name of the webhook. | String |
active | True or false (default). | Boolean |
created | Date and time when the webhook was created. | Date |
modified | Date and time when the webhook was last modified. | Date |
events | Event type that triggers the webhook. Only the addData event is supported. | String |
targetLayerUrl | Feature service layer (including layer index) against which the webhook has been configured. The addData events will be triggered by updates to this layer. | String |
webhookUrl | Webhook URL to which the payload will be sent. | String |
includePortalInfo | True (default) or false. | Boolean |
includeProjectInfo | True (default) or false. | Boolean |
includeServiceRequest | True (default) or false. | Boolean |
includeServiceResponse | True (default) or false. | Boolean |
In the following example, a single webhook is shown, but more than one can be configured in a single project:
"notificationsInfo": {
"webhooks": [
{
"active": true,
"created": 1502880915000,
"events": [
"addData"
],
"id": "ByCjvHpPz",
"includePortalInfo": true,
"includeProjectInfo": true,
"includeServiceRequest": true,
"includeServiceResponse": true,
"includeUserInfo": true,
"modified": 1502881754000,
"name": "Display name",
"targetLayerUrl": "https://<serviceurl including layer index>",
"webhookUrl": "https://<webhookserviceurl>"
}
]
}
Field variables
When using these variables in the JSON editor, you must enter the variable name in the format of ${variable_name}. In the following example, the username variable is assigned to a field named NameOfUser:
"fieldInfos": [
{
"fieldName": "NameOfUser",
"value": "${username}"
},
User input variable
The userInput variable value is populated by the app user and can be applied to one or more buttons in a project. The app user enters the value; however, the project author must define the buttons and fields to which the variable will apply.
In the project JSON, user inputs are defined in the userInputs array and then referenced by "fieldInfos" using the id property.
Property | Description | Field type |
---|---|---|
Id | Unique ID of the user input. | String |
label | The label is displayed in the mobile app to describe the expected input value from the end user. For example, the label might be RouteNo, CostCenter, or RouteNo-CostCenter. | String |
fieldType | The type of field to which the user input value can be written. Options are limited to esriFieldTypeString, esriFieldTypeDouble, and esriFieldTypeInteger. | String |
required | Specifies whether the user input value must be provided by the end user of the mobile app before (project mode) or after (button mode) a button can be pressed. | Boolean |
domain | Controls user input and is limited to a numerical range (range), list of predefined values (codedValue), or text input, optionally using an input mask (userDefined). | String |
mode | Controls whether the user is prompted for input when the project is launched (project) or when a button is pressed (button). | String |
multiline | Allows entry of multiple lines of text. This is only applicable when domain is userDefined. | Boolean |
autoCompleteMaxEntries | Specifies the number of user-entered values that are cached for a project user input. | Integer |
showEvent | Controls whether the button user input dialog box is shown at the beginning of record capture or the end. Options are onStart and onEnd. The default is onEnd. This is only applicable when domain is userDefined. | String |
showScanner | Controls whether the barcode scanner is shown in the user input. The default is false. This is only applicable when domain is userDefined. | Boolean |
dateTime | Controls input of date and time. This is only applicable when domain is userDefined. Can be constrained by the following: defaultValue, displayTime, maxValue, and minValue. | Date |
To learn when to use each mode, see Project user input variable or Button user input variable.
It is recommended that domains be managed in the feature service. The web designer reads domain information directly from the feature service to create the user input. Domain information is not automatically written into the project JSON.
The mobile app reads domain information directly from the feature service and stores it locally on the device. If you add or modify domain values in the feature service, you must resave the project to prompt the user to update the project and see the changes.
Caution:
A project author can choose to manually define domain information directly with the project JSON. This will override anything that is read from the feature service. It is the responsibility of the author to ensure that any values defined are within the limits of those defined in the feature service. An example of when you might choose to do this is to define a subset of coded values in the project from a much longer list in the feature service.
The following example shows how a range domain user input is defined to restrict data entry to a number between 1 and 100:
{
"userInputs":[
{
"autoCompleteMaxEntries":5,
"id":"001",
"label":"Enter route number",
"fieldType":"esriFieldTypeInteger",
"required":true,
"mode":"project",
"domain":{
"type":"range",
"name":"route no",
"range":[
1,
100
]
}
}
]
}
The following example shows how a codedValue domain user input is defined to limit data entry to the selection of one of three values:
{
"userInputs":[
{
"autoCompleteMaxEntries":5,
"id":"001",
"label":"Enter class",
"fieldType":"esriFieldTypeString",
"required":true,
"mode":"project",
"domain":{
"type":"codedValue",
"name":"Class",
"codedValues":[
{
"name":"Principle",
"code":"Principle"
},
{
"name":"Classified (Non-principle)",
"code":"Classified"
},
{
"name":"Unclassified",
"code":"Unclassified"
}
]
}
}
]
}
The following example shows how a userDefined text user input is defined to allow for scanning a QR code at the commencement of capturing a line:
{
"userInputs":[
{
"id":"001",
"label":"Scan QR code",
"fieldType":"esriFieldTypeString",
"required":true,
"mode":"button",
"domain":{
"type":"userDefined",
"name":"line identifier",
"multiline":false,
"showScanner":true,
"showEvent":"onStart"
"hint":"Scan QR code or type the identifier of the line to be captured"
}
}
]
}
The following example shows how a userDefined domain user input is defined to allow data entry of a date between June and December 2022:
{
"userInputs":[
{
"id":"001",
"label":"Enter date",
"fieldType":"esriFieldTypeDate",
"required":true,
"mode":"button",
"domain":{
"type":"userDefined",
"name":"followup date",
"multiline":false,
"hint":"Enter date between June and December 2022",
"dateTime": {
"defaultValue": "${captureTime}",
"displayTime": true,
"maxValue": "2022-06-01T00:00:00.000Z",
"minValue": "2022-12-31T24:59:00.000Z"
}
}
}
]
}
The following example shows how a userDefined domain user input is defined to restrict data entry to a four-digit route ID:
{
"userInputs":[
{
"id":"001",
"label":"Enter route number",
"fieldType":"esriFieldTypeString",
"required":true,
"mode":"button",
"domain":{
"type":"userDefined",
"name":"route no",
"inputMask":"9999",
"multiline":false,
"hint":"Enter a four digit route id"
}
}
]
}
Once userInput is defined, the project author can assign it for use in a field. The following shows userInput with an ID of 001 being used to populate a field named routeNo:
{
"fieldInfos":[
{
"fieldName":"routeNo",
"value":"${userInput:001}"
}
]
}
Input mask
An input mask defines the format for data entry by using characters and symbols as part of a user input variable. When you apply an input mask to a user input variable, values entered by the user must follow the specific pattern defined by the input mask.
To apply an input mask to your user input variable, define the mask in the userInputs.domain.inputMask property.
See Input masks for a list of all masks and examples that can be applied to user input variables.
Location sharing
The following properties are used to identify the location sharing layers:
Property | Description | Field type |
---|---|---|
enabled | Enable tracking for the project. The default is false. | Boolean |
required | Require that tracking is enabled to use the project. The default is false. | Boolean |
lastKnownLocationsUpdateInterval | Frequency (in seconds) at which the last known location layer is updated. The default is 60 seconds. The minimum is 5 seconds. | Decimal |
tracksUploadInterval | Frequency (in seconds) at which the tracks layer is updated. The default is -1 (off). Alternatively, it can be set to 600 seconds. | Decimal |
tracksCategory | Define the value to be written to the category field of the tracks layer. It can be the project name, fixed value, or value of a project user input. The default is the project name. | Text |
lastKnownLocationsCategory | Define the value to be written to the category field of the last known locations layer. It can be the project name, fixed value, or value of a project user input. The default is the project name. | Text |
The following example shows location sharing is enabled, but is not required to use the project. The last known location will be updated every 60 seconds, and tracks will be updated every 600 seconds. The project name will be written to the category field of the last known locations layer and the tracks layer.
{
"tracking": {
"enabled": true,
"required": false,
"lastKnownLocationsUpdateInterval": 60,
"tracksUploadInterval": 600,
"tracksCategory": "${projectName}",
"lastKnownLocationsCategory": "${projectName}"
}
}