Menus/Actions Overview¶
menus: []
lists an array of menu items. Each item can be configured as follows with some parts of the configuration being dynamic:
properties | ||
---|---|---|
label |
helps user to identify the meaning of a menu item (web, Context Menu, mobile Button in header of the detail section) | |
icon |
specifies the icon of an action. (mobile, slide left/swipe on an entry in the list view) | |
shortLabel |
(optional) (mobile, slide left/swipe on an entry in the list view) | |
action |
specifies the type of action | |
actionValues |
(optional) are specifying special parameters corresponding to the listed action | |
roles |
(optional) Confines availability to the listed security roles | |
visibleIn |
(optional) The visibility of a menu can be set to mobile or web. If not set, the menu is displayed. Possible values are mobile and web . Set as array of strings. |
|
swipeHidden |
(optional) Hides the menu action in insight-mobile's list swipe. Set as boolean. | |
onlineOnly |
(optional) Menu actions with onlineOnly can only be executed online. Set as boolean. | |
when |
(optional) specifies the moment an action can be triggered without user interaction, only valid for tree-level menu items | |
onInit : the first time a tree is selected |
||
onSelect : every time a tree is selected |
||
scenario |
(optional) group actions together even when in separate trees. Insight Explorer only. | |
tooltip |
(optional) Displays a tooltip when hovering over the menu action's button. Insight Explorer only. | |
on |
(optional) specifies where the menu-entry should be placed. Insight Explorer only. | |
top : (optional) on table header instead of context-menu |
||
visible |
(optional) checks the attribute values of the record. If all hits the condition, the menu is visible. * is a wildcard for any value. Insight Explorer only. |
|
js |
(optional) can be used to implement a JavaScript validation function. Processing of the objects. Execute a Javascript function, that will get the objects as an array and return the object for the action as an array or a single object. If your js transforms multiple objects to one object and you want to call an action that does not support multiple objects please set an actionValue with "allowMultipleObjects" to true. |
"visible": {
"FOLDER": "true",
"USER": "${userData.personid}",
"GROUP": "*"
}
Common menu actions that are available for Explorer and Mobile use
You can chain menu actions. Each menu action can have a then
property, describing the next menu action to be executed, if the previous action was executed successfully. Any number of actions can be chained. Please note, that chained menu actions will only be executed, if the previous menu action was executed successfully, not if the previous menu action was rejected.
{
"label": "Save and back",
"icon": "icon-floppy-disk",
"action": "save",
"actionValues": [{}],
"then": {
"action": "goto",
"actionValues": [
{
"back": "-1"
}
]
}
}
You can dynamically hide and show menu actions with the visible
javascript function function. The visible.js
has access to several properties and callbacks:
properties | |
---|---|
object |
server representation of the current object, null if the menu is at tree level. |
userData |
Properties of the logged in user. (Working with variables/values)) |
swipe |
true if the menu is displayed as swipe action. |
isSet |
checks if the given property is set. |
replaceObject |
replaceObject of the current object. |
getTimeTracker |
gets the currently active timeTracker, if there is one. |
{
"label": "Save",
"icon": "icon-floppy-disk",
"action": "save",
"actionValues": [
{
"DESCRIPTION": "Documentation"
}
],
"visible": {
"js": "return userData.personId == 'Docu';"
}
}
confirm
shows a confirm dialog on which the user can decide to proceed. actionValues:
actionValues | ||
---|---|---|
message |
Message to show. | |
title |
Title to show. (optional) | |
ok |
OK-Button text. (optional) | |
cancel |
Cancel-Button text. (optional) | |
js |
Javascript code to modify the confirm behavior. (optional) | |
in js function | setOkButtonText |
set the ok button text as string |
setCancelButtonText |
set the cancel button text as string | |
showOkButton |
show the ok button as boolean | |
showCancelButton |
show the cancel button as boolean | |
setTitle(text) |
set the title as string | |
setMessage(text) |
set the message as string | |
object |
current insight record. | |
object.$payload |
payload of previous actions. | |
userData |
user profile |
{
"label": "Confirm what you're doing",
"icon": "icon-checkmark-circle",
"action": "confirm",
"actionValues": [
{
"message": "Are you sure?",
"ok": "Yes",
"cancel": "Never",
"js": "setTitle('Confirmation')"
}
]
}
Displays a dependent record in another tree. If multiple records are appended, the first is used.
actionValues | |
---|---|
srcNode |
Node name of the record to link to |
dstTree * |
Tree to show the link, Tree to show in Explorer |
dstNode |
Node to show the link |
create |
Show the node in create mode |
listEdit |
Show the node in listEdit mode |
list |
Show the node in list mode |
path * |
Show the path |
params |
Only available at path . Parameters can be passed to the details view. Special parameters are headerLabel and headerLink . These two parameters can be used to control the header link of insight-mobile. Examples below. |
All actionValues
are available in Insight Mobile, actionValues
marked with *
are available in Insight Explorer.
Examples:
Go to the list view of tree asset-flat
:
{
"label": "Asset Öffnen",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"dstTree": "asset-flat"
}
]
}
Go to the node asset
of the tree asset-flat
with the ID of the first child of node assetchild
:
{
"label": "Asset Öffnen",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"srcNode": "assetchild",
"dstTree": "asset-flat",
"dstNode": "asset"
}
]
}
Go to the node asset
of the tree asset-flat
with the ID of the current record:
{
"label": "Asset Öffnen",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"dstTree": "asset-flat",
"dstNode": "asset"
}
]
}
Go to the create view of node asset
of the tree asset-flat
:
{
"label": "Asset Öffnen",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"create": true,
"dstTree": "asset-flat",
"dstNode": "asset"
}
]
}
Go to the listEdit
view: In the current tree. On the node woactivity
. With the records of the child node woactivity
of the current record:
{
"label": "Checklist",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"listEdit": true,
"dstNode": "woactivity"
}
]
}
Go to the listEdit
view: In the given tree. On the given node. With the records of the child node woactivity
of the current record:
{
"label": "Checklist",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"listEdit": true,
"srcNode": "woactivity",
"dstTree": "othertree",
"dstNode": "workorder"
}
]
}
Go to the listView
: In the current tree. On the node woactivity
. With the records of the child node woactivity
of the current record:
{
"label": "Checklist",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"list": true,
"dstNode": "woactivity"
}
]
}
Go to the listView
: In the given tree. On the given node. With the records of the child node woactivity
of the current record:
{
"label": "Checklist",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"list": true,
"srcNode": "woactivity",
"dstTree": "othertree",
"dstNode": "workorder"
}
]
}
Go back
:
{
"label": "Back",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"back": 1
}
]
}
Go to specified path
:
```json
{
"label": "Back",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"path": "${object.path}"
}
]
},
{
"label": "Back",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"path": "tree/node/id"
}
]
}
```
Go with path
, keep the header link and label:
```json
{
"label": "Go to documents",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"path": "${object.path}",
"params": {
"headerLabel": true,
"headerLink": true
}
}
]
}
```
Go with path
change the header label:
{
"label": "Go to documents",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"path": "${object.path}",
"params": {
"headerLabel": "Documents of ${WONUM}",
"headerLink": true
}
}
]
}
Go with path
pass attribute values to details view:
{
"label": "Go to details",
"action": "goto",
"icon": "icon-bathtub",
"actionValues": [
{
"path": "${object.path}",
"params": {
"TEXT": "${WONUM} ${DESCRIPTION}"
}
}
]
}
timeTrack
: Starts a time tracker on the current object. The time tracker will continue running even if you open other objects or trees in Insight. A running time tracker is visualized in the top right corner. Clicking on the time tracker icon will automatically navigate the user back to the item the timer was started on. Clicking the timeTrack menu action a second time on the active object will stop the time tracker and the time tracking result can be used in further then
actions. If a time tracker for object a is active and at the same time another time tracker is started on object b, the time tracker on object a will be stopped and a new one started for object b.
The resulting object is available under $payload in the following then
action. Available durations are milliSeconds
, seconds
, minutes
, hours
and days
.
When the timeTrackStart contains a then
action for create
the time tracker will be applied to the newly created object after its creation. The time tracker is started when the create page is loaded and already running when the user fills out the object. Canceling the creation will also stop the time tracker.
The timeTrackStop menu is only displayed when a TimeTracker has been started.
ATTENTION: No time tracker can have a create
action in the then
part of the timeTrackStop
if any timeTrackStart
has a create
action in the then
part. In these cases the timeTrackStop
must use a createForm
and form
with "mode" = "save"
in the then
actions (example).
ATTENTION: If you plan on using the TimeTracker on InsightMobile, please make sure that the usecase you include it in, supports offline. Several features here do not work fully if switching between online and offline, and the usecase is not downloaded locally on each client.
actionValues | ||
---|---|---|
maxTrackTime |
set the resulting duration object to the configured maxTrackTime , if the tracked time would exceed the configured time |
|
ignoreRunning |
To ensure that the menu is always displayed, this setting can be made | Works for timeTrackStart and timeTrackStop |
{
"label": "Time",
"icon": "icon-play",
"action": "timeTrackStart",
"actionValues": [
{
"maxTrackTime": 3600000,
"ignoreRunning": true
}
]
}
{
"label": "Time",
"icon": "icon-stop-circle",
"action": "timeTrackStop",
"actionValues": [
{
"ignoreRunning": true
}
],
"then": {
"label": "Zeitrückmeldung",
"action": "create",
"icon": "icon-clock"
}
}
browser
: opens a new web page in a new browser tab.
actionValues | |
---|---|
url |
specifies the URL which can be opened. Context specific values can be added to the URL: ${ASSETNUM} |
deepLink |
specifies the URL-Scheme of another installed app. The app will be opened with parameters. Context specific values can be added to the URL: ${ASSETNUM} |
inTab |
(inside-explorer only) when true open the defined URL using an iframe inside of the Insight-Explorer |
{
"label": "Fehlerhistorie",
"shortLabel": "FH",
"action": "browser",
"icon": "icon-pie-chart",
"actionValues": [
{
"inTab": true,
"url": "insight/kibana/app/kibana#/dashboard/Stillstand?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-15m,mode:quick,to:now))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!t,index:locations,key:properties.ASSETNUM,negate:!f,value:'${ASSETNUM}')"
}
]
}
{
"label": "IBFS",
"icon": "icon-browser",
"action": "browser",
"actionValues": [
{
"deepLink": "schemeofapp://hello:world:${ASSETNUM}"
}
]
}
searchThis
searches the current object in other trees. From v2.11.1 you can configure in which trees the search is executed. Without any configuration the search is executed in all trees.
actionValues | |
---|---|
trees |
specify the trees as array of strings |
{
"label": "Search this",
"action": "searchThis",
"actionValues": [
{
"trees": ["locations-web", "locations-others"]
}
]
}
Calls a remote REST/API endpoint.
actionValues |
|
---|---|
payloadKey |
key where the (JSON) response will be stored |
request |
|
---|---|
url |
absolute or relative URL to the http-endpoint |
method |
HTTP method to be used (POST, PUT, DELETE) |
params |
JSON Object of key/values |
timeout |
default: 60 |
Since Version 22.0.0 the request action has new several defaults and improvements for easier configuration:
- You may now emit the
params
object in the configuration, if you do not have any parameters to send. No dummy parameters are needed. - You may now emit the
headers
object in the configuration in Insight Standalone. The default (for Insight Standalone) is:
{
"Accept": "application/json",
"Content-Type": "application/json"
}
{
"action": "request",
"actionValues": [
{
"payloadKey": "activity"
}
],
"request": {
"method": "POST",
"url": "insight/action/business-suite/activity/get",
"params": {
"activityId": "${$context.$record.properties.activityId}"
}
},
"then": {
"action": "request",
"request": {
"method": "POST",
"url": "https://your-other-api.com/request",
"params": {
"result": "${$payload.activity}"
}
}
}
}
- You may now use a script tag in the request action configuration. Doing so will set the request method to POST as a default, but can still be overriden via the old configuration.
- You can now break up long request url configurations in the
script
tag. The request url will be generated from these settings:
{
"action": "request",
"script": {
"backend": "business-suite",
"name": "my-script"
}
}
- You can additionally configure the
params
object in the script object as well:
{
"action": "request",
"script": {
"backend": "business-suite",
"name": "my-script",
"params": {
"id": "${id}",
"user": "${userData.login}"
}
}
}
Difference between Maximo und OpenJet configuration
{
"action": "request",
"request": {
"method": "POST",
"url": "rest/mbo/WORKORDER/${WORKORDERID}",
"params": {
"WOPRIORITY": "1",
"DESCRIPTION": "${DESCRIPTION} + ${userData.personid} + ${appParams.standort}"
},
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
}
}
}
request
calls a remote method.
{
"label": "Verheiraten",
"shortLabel": "Verheiraten",
"action": "request",
"icon": "icon-man-woman",
"request": {
"method": "POST",
"url": "insight/eam/rpc/insightTest/mitarbeiter",
"params": {
"vorgesetzter": "${dstObject.uniqueId}",
"mitarbeiter": "${srcObject.uniqueId}"
},
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
}
}
}
RPCHandler Implementation
import gis.openframe.bol.BusinessObject;
import java.util.Map;
import de.ibfs.insight.rpc.api.RpcContext;
import de.ibfs.insight.rpc.api.RpcHandler;
public class MitarbeiterVerknueppler implements RpcHandler {
@Override
public void call(RpcContext context) throws Exception {
Map<String, String> parameters = context.getParameters();
String vorgesetzterId = parameters.get("vorgesetzter");
String mitarbeiterId = parameters.get("mitarbeiter");
if (vorgesetzterId.equals(mitarbeiterId)) {
return;
}
Person target = PersonFactory.get(vorgesetzterId);
Person mitarbeiter = PersonFactory.get(mitarbeiterId);
BusinessObject[] parents = mitarbeiter.getLinkSourceObjects(Person.folgt);
for (BusinessObject businessObject : parents) {
((Person) businessObject).removeFolgt(mitarbeiter);
}
target.addFolgt(mitarbeiter);
}
}
Registration in InitComponent
public void globalInit() {
try {
RpcRegistry service = OpenJetServiceRegistry.getService(RpcRegistry.class);
service.register("insightTest/mitarbeiter", MitarbeiterVerknueppler.class);
}
catch (Throwable t) {
gis.util.Trace.error("RpcRegistry", "Fehler beim Versuch RpcRegistry zu laden", t);
}
}
create
creates a new node item of referenced node type (Insight Mobile and Insight Explorer), TreeConfig:
- creates a new node and copies data (
"dst": "source"
) - values of source node can be accessed via
${attributeid}
actionValues | |
---|---|
_tree |
(optional) define a tree, default is current tree |
_node |
define a node, default is root node of the tree |
{attribute} |
Preallocate an attribute. Only available at node level. |
{
"label": "Material",
"action": "create",
"icon": "icon-plus",
"actionValues": [
{
"_tree": "WORKORDER",
"_node": "MATUSETRANS",
"WONUM": "${WONUM}",
"SENDERSYSID": "EXT"
}
]
}
refresh
refreshes the current node.
actionValues | |
---|---|
trees |
(optional) By configuring (multiple) trees as array of string you can refresh/reset trees |
paths |
(optional) array of strings. By configuring (multiple) paths as array of string you can refresh other nodes as well |
{
"label": "Refresh",
"icon": "icon-sync",
"action": "refresh"
}
{
"label": "Refresh",
"icon": "icon-sync",
"action": "refresh",
"actionValues": [
{
"paths": ["cluster-ab-basis/clusterStatus/KWB001-C0004"],
"trees": ["cluster-ab-basis"]
}
]
}
save
assigns values to specified attributes and saves the record.
actionValues | |
---|---|
{attribute} |
(optional) assign this value to the attribute |
{
"label": "save the record",
"icon": "icon-fire",
"action": "save",
"actionValues": [
{
"WOPRIORITY": "2"
},
{
"OWNER": "${userData.personid}"
},
{
"DESCRIPTION": "${DESCRIPTION} + ${WOPRIORITY} + ${appParams.standort}"
}
]
}
saveDetails
assigns values to specified attributes and saves the record and all children. Works only on detailsPage, on other pages it works like save
actionValues | |
---|---|
{attribute} |
(optional) assign this value to the attribute |
{
"label": "Saves the record and children",
"icon": "icon-floppy-disk",
"action": "saveDetails",
"actionValues": [
{
"WOPRIORITY": "2"
},
{
"OWNER": "${userData.personid}"
},
{
"DESCRIPTION": "${DESCRIPTION} + ${WOPRIORITY} + ${appParams.standort}"
}
]
}
staticContent
shows a html page configured in the ClientConfiguration - staticContent
actionValues | |
---|---|
name |
To redirect to the static content page. Needs a static content. |
{
"label": "Legal",
"icon": "icon-fire",
"action": "staticContent",
"actionValues": [
{
"name": "legal"
}
]
}
remove
deletes an object.
request | |
---|---|
method |
must be "DELETE" |
url |
url for the record |
{
"label": "Delete",
"shortLabel": "Delete",
"action": "remove",
"icon": "icon-question-circle",
"request": {
"method": "DELETE",
"url": "http://localhost:9080/node-red/tree/node/${WORKORDERID}"
}
}
The qr
action will render a QR code based on the given configuration.
actionValues | |
---|---|
qrData |
The generated QR Codes can contain any content, for example deepLinks or an url. |
{
"label": "QR-Code",
"icon": "icon-barcode",
"action": "qr",
"actionValues": [
{
"qrData": "https://google.de"
}
]
}
{
"label": "QR-Code",
"icon": "icon-barcode",
"action": "qr",
"actionValues": [
{
"qrData": "insightmobile://details:${object.path}"
}
]
}
An action to output all currently available information in the menu flow. Information like the current object
, payloads
or userData
will be printed to console. This action has no further configuration. Please be adviced that this action should only be used during development and should not be deployed on live/production systems!
form
shows a dialog on which the user can make inputs. The values are written to the record or a payload and can be used in further actions. Attributes of the node configuration are written to the record, formField
attributes are written to the payload. Important: "mode": "save"
will only save the current record. If you want to save a child of the current object you are standing on, you have to first create an intermediate record with createForm
and set the "_node": "myChildNode"
attribute.
actionValues | |
---|---|
attributes |
Array of attributes that can be entered. |
mode |
Possible values are: temp or save (default) |
temp |
Write only in the record/payload |
save |
Saves the record |
focusAttribute |
The attribute to be focused when opening the dialog. |
saveButtonText |
Change the default text for the save button |
dirtyCheck |
By default, Insight does not check upon leaving the form if there are unsaved changes. If you want to force Insight to dirty check the form action |
confirmLeave |
If you want to force Insight to always confirm you leaving the form |
Shows an input dialog and sends the values to a http service
Create a child with two input dialogs and navigate to the created record
{
"label": "Worklog",
"icon": "icon-plus",
"action": "createForm",
"actionValues": [
{
"_node": "worklog"
}
],
"then": {
"action": "form",
"actionValues": [
{
"mode": "temp",
"attributes": [
{
"name": "DESCRIPTION"
}
],
"dirtyCheck": true
}
],
"then": {
"action": "form",
"actionValues": [
{
"mode": "save",
"attributes": [
{
"name": "DESCRIPTION_LONGDESCRIPTION"
}
],
"confirmLeave": true
}
]
}
}
}
Attaches a file using the documents configuration.
actionValues | |
---|---|
documentHandler |
define the documentHandler.For more Information see here |
{
"label": "File Upload",
"icon": "icon-paperclip",
"action": "fileUpload",
"actionValues": [
{
"documentHandler": "attachments"
}
]
}
createSilent
creates a new node item of referenced node type without a user input. All other settings are like create.
createForm
Creates a new record without user input and does not save it. All other settings are like create. This record can then be used in further actions.
Create a child with two input dialogs and navigate to the created record:
{
"label": "Worklog",
"icon": "icon-plus",
"action": "createForm",
"actionValues": [
{
"_node": "worklog"
}
],
"then": {
"action": "form",
"actionValues": [
{
"mode": "temp",
"attributes": [
{
"name": "DESCRIPTION"
}
]
}
],
"then": {
"action": "form",
"actionValues": [
{
"mode": "save",
"attributes": [
{
"name": "DESCRIPTION_LONGDESCRIPTION"
}
]
}
],
"then": {
"action": "goto"
}
}
}
}
Insight offers several components that visualize many records, not just one (gantt, chart, table, map, pert). It can sometimes be hard to find and focus a specific element in such a component. The focus action lets a currently open component automatically focus the record in question. Example:
{
"label": "focus",
"action": "focus",
"actionValues": [
{
"path": "tree/node/1"
}
]
}
Menu actions available for Explorer.
It is possible to configure the label of a tab, based on the common template syntax known from labels.
This is possible for the following actions: details
, insert
, mapOpen
, kibanaOpen
, tableOpen
To configure the tab-label the following part must be added to the first element of the actionValues. Possible variables are explained in the Working with variables/values chapter.
{
"label": "Show Details",
"icon": "icon-aim",
"action": "details",
"actionValues": [
{
"tab": {
"label": "Details: ${ASSETNUM}"
}
}
]
}
"open" opens specified application with current object.
{
"label": "Öffnen",
"action": "open",
"icon": "icon-factory",
"actionValues": [
{
"ga": "508:43425:BA"
}
]
}
open
loads object to defined application (Insight Explorer)
- default: selected object is loaded
- option: actionValue
"uniqueid": "${parent.TICKETUID}"
will load the parent object
{
"label": "In neuem Tab öffnen",
"action": "open",
"icon": "icon-arrow-up-right",
"actionValues": [
{
"event": "loadapp",
"value": "LOCATION",
"inTab": "true"
}
],
"roles": ["MAXEVERYONE"]
}
details
opens a detail dialog to present all of the listed attributes (if not "hidden": true
)
{
"label": "Details",
"shortLabel": "Details",
"action": "details",
"icon": "icon-question-circle"
}
It is possible to configure a different tree as source for the details view. The name of the nodes in both trees must be the same, otherwise the object cannot be fetched.
{
"label": "Details from different tree",
"icon": "icon-aim",
"action": "details",
"actionValues": [
{
"tree": "test-table-assets-more",
"tab": {
"label": "Details: ${ASSETNUM}"
}
}
]
}
It is possible to execute the details action without a record but by configuring a path, for example a path returned from a request action
{
"label": "Details returned path",
"icon": "icon-aim",
"action": "details",
"actionValues": [
{
"path": "${$payload.req.path}",
"tab": {
"label": "Details: ${ASSETNUM}"
}
}
]
}
The details view can show children in a table below the attributes of the object. To enable this table, configure the attributes of the children in a list configuration. It's possible to enable multiple tables.
Example showing an Asset with its Location child
An action to select one or multiple objects from a tree with root-nodes. The initial list can be filtered. By default, multi records can be selected, single selection must be enabled.
The selected elements can be forwarded to the next action via then
. They are accesible in $payload
with the key selections
or by the one specified with payloadKey
. The result is an array of JSON-objects.
actionValues | |
---|---|
tree | source tree for getting (root-)nodes |
payloadKey | key the selections are stored for further processing |
filter | attribute/value object to pre-filter (root-)nodes |
{
"label": "Add Roles",
"action": "select",
"icon": "icon-select",
"actionValues": [
{
"tree": "usergroup"
}
],
"then": {
"action": "request",
"request": {
"method": "POST",
"url": "insight/action/insight-suite/roles",
"params": {
"roles": "${$payload.selections}",
"login": "${userData.login}"
}
}
}
}
{
"label": "Add Roles",
"action": "select",
"icon": "icon-select",
"actionValues": [
{
"tree": "usergroup",
"multi": false
}
]
}
{
"label": "Zu AS zuordnen",
"action": "select",
"icon": "icon-select",
"actionValues": [
{
"tree": "as-select",
"filter": {
"measureId": "${$context.$record.properties.id}"
}
}
],
"then": {
"action": "request",
"request": {
"method": "POST",
"url": "insight/action/business-suite/as/link",
"params": {
"arbeitsscheine": "${$payload.selections}",
"activityId": "${$context.$record.properties.id}"
}
}
}
}
{
"label": "Add Roles",
"action": "select",
"icon": "icon-select",
"actionValues": [
{
"payloadKey": "roles",
"tree": "usergroup"
}
],
"then": {
"action": "request",
"request": {
"method": "POST",
"url": "insight/action/insight-suite/roles/add",
"params": {
"roles": "${$payload.roles}",
"login": "${userData.login}"
}
}
}
}
insert
new mbo as additional event after loading an application
- event, additionalevent, value loads application with created object and copies data (src dst) Insight Explorer
{
"label": "Neuer IH-Bedarf",
"action": "insert",
"icon": "icon-warning",
"actionValues": [
{
"event": "loadapp",
"additionalevent": "insert",
"value": "SR",
"inTab": "true",
"node": "SRLOC"
},
{
"src": "LOCATION",
"dst": "LOCATION"
},
{
"static": "IH Bedarf ${LOCATION}: ",
"dst": "DESCRIPTION"
}
]
}
Insert
open specified application with a new object. Context specific data can be passed via additional key value entries. Those can be accessed in the EventHandler.ON_ENTERED()
method execution. EventHandler.getParam("FOO")
{
"label": "Insert",
"action": "insert",
"icon": "icon-snow2",
"actionValues": [
{
"ga": "508:40393:BA",
"FOO": "foo",
"BAR": "bar"
}
]
}
Please refer to: Kibana Dashboards
matrixOpen
opens a matrix view on the root nodes of a configuration. Example:
"menus": [
{
"label": "Matrix",
"icon": "icon-user",
"action": "matrixOpen",
"actionValues": [
{
"tab": {
"label": "Matrix"
},
"matrix": {
"tree": "matrix-tree"
},
// optional to display a table alongside the matrix
"table": {
"tree": "matrix-tree"
}
}
]
}
]
tableOpen
opens a Table view on the root nodes of a tree.
{
"label": "Table with workorders",
"icon": "icon-question-circle",
"action": "tableOpen",
"actionValues": [
{
"table": {
"tree": "workorder-table"
}
}
]
}
Tables can be opened with additional filters. The filters are identical to those in the filter
action.
```json
{
"label": "Table with workorders for an asset",
"icon": "icon-question-circle",
"action": "tableOpen",
"actionValues": [
{
"table": {
"tree": "workorder-table",
"settings": {
"filter": [
{
"attribute": "assetId",
"operator": "eq",
"value": "${assetId}"
}
]
}
}
}
]
}
```
To filter to nodes in the table the use of queryParams is possible.
Action for an "Asset"-node to show all of it's workorders
{
"label": "Table with workorders for an asset",
"icon": "icon-question-circle",
"action": "tableOpen",
"actionValues": [
{
"table": {
"tree": "workorder-table",
"queryParams": {
"myAssetSelection": "${ASSETNUM}"
}
}
}
]
}
Corresponding "workorder-table.json"
"root": {
"type": "WORKORDER",
"query": {
"constraint": "HISTORYFLAG=0 AND ASSETNUM in ( '${userData.myAssetSelection}' )",
}
}
The table view is linked by default which will add more nodes into the queryParam-selection list when you click them. The resulting sql can be configured as need, the query-params will be available as comma separated list of values, e.g. "AS-001", "AS-002", ... For every queryParam configured a count will be available in the userData-object to reflect the amount of objects in the selection. In the example above there would be ${userData.myAssetSelectionCount}
to be used in the constraint or anywhere else.
The tab
-action allows you to control the behaviour of tabs in the Explorer. Currently the action allows you to close a tab in any menu-flow.
{
"action": "tab",
"actionValues": [
{
"close": true
}
]
}
{
"action": "tab",
"actionValues": [
{
"close": true,
"scenario": "someScenarioIdFromAnotherMenu"
}
]
}
You can give users a UI to create and edit maps. See here.
You can display Gantt charts. See Gantt for more information.
Menu actions available for Mobile use.
downloadRecord
downloads the current record to the mobile device. This can only be used in the root node.
{
"label": "Download",
"icon": "icon-paperclip",
"action": "downloadRecord"
}
deleteLocal
reverts the changes of offline changed records. Deletes offline created records.
{
"label": "Delete",
"icon": "icon-cross-circcle",
"action": "deleteLocal"
}
Please use goto. This feature is currently only available in insight-mobile. listEdit
opens the given node in an list edit mode. (See listEdit(inputsupport))
actionValues | |
---|---|
tree |
set a tree |
node |
set a node for listEdit |
{
"label": "Checklist",
"action": "listEdit",
"icon": "icon-bathtub",
"actionValues": [
{
"tree": "workorder-test",
"node": "activities"
}
]
}
online
sets the app online, if the server is available.
{
"label": "Online",
"action": "online",
"icon": "icon-bathtub"
}
offline
sets the app offline.
{
"label": "Offline",
"action": "offline",
"icon": "icon-bathtub"
}
filter
sets a filter on the root node. (only root node)
actionValues | |
---|---|
attribute |
define a attribute for the filter |
value |
define a value or a range for the filter |
label |
defines a label |
operator |
set one of the given operators. Not equals ,Is null ,Is not null ,like ,gt , gte , lt , lte |
clear |
clears all filters |
totalCount |
When set to true, it shows the total number of hits that this filter would display, regardless of other filters and restrictions. |
Use this carefully as it can affect performance. |
Sets a filter for a fixed value
{
"label": "High prio",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"attribute": "WOPRIORITY",
"value": "1"
}
]
}
Compares a value from the userData with an attribute
{
"label": "Mine",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"attribute": "OWNER",
"value": "${userData.personid}"
}
]
}
Date range filters react as follows: Filter example: DATE:WEEK:-2
, Today is: 24.01.2019, resulting date filter is: from 07.01.2019 to 27.01.2019.
- Pattern:
<UNIT>:<VALUE>
- UNIT:
TODAY
orWEEK
orMONTH
- VALUE: positiv or negative number
{
"label": "Last week",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"attribute": "REPORTDATE",
"value": "WEEK:-1",
"label": "Last week"
}
]
}
The different operators
{
"label": "Not Mine",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"attribute": "OWNER",
"value": "${userData.personid}",
"operator": "notEquals"
}
]
}
{
"label": "No prio",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"label": "No priority",
"attribute": "WOPRIORITY",
"operator": "isNull"
}
]
}
{
"label": "Has prio",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"label": "Has priority",
"attribute": "WOPRIORITY",
"operator": "isNotNull"
}
]
}
{
"label": "Prio 1 + 2",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"label": "High and Middle",
"attribute": "WOPRIORITY",
"value": ["1", "2"]
}
]
}
{
"label": "*m*",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"label": "*m*",
"attribute": "OWNER",
"operator": "like",
"value": "*m*"
}
]
}
{
"label": "Greater than 5",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"label": "Greater than 5",
"attribute": "PRIO",
"operator": "gt",
"value": 5
}
]
}
Extras
{
"label": "*m*",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"clear": true
}
]
}
{
"label": "Mine, last week",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"clear": true
},
{
"attribute": "OWNER",
"value": "${userData.personid}"
},
{
"attribute": "REPORTDATE",
"value": "WEEK:-1",
"label": "Last week"
}
]
}
{
"label": "High prio",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"treeName": "my-tree",
"attribute": "WOPRIORITY",
"value": "1"
}
]
}
{
"label": "High prio",
"icon": "icon-user",
"action": "filter",
"actionValues": [
{
"totalCount": true
},
{
"attribute": "WOPRIORITY",
"value": "1"
}
]
}
OR
filters: Backend search with OR
geo
gets the current position of the device. The result can be used in further actions. Result of the Action contains the following properties:
longitude
latitude
accuracy
position
: The complete result of the API call tonavigator.geolocation.getCurrentPosition
{
"label": "Position",
"icon": "icon-map-marker",
"action": "geo",
"then": {
"action": "save",
"actionValues": [
{
"LONG": "${$payload.longitude}"
}
]
}
}
barcodeFilter
forces a barcode scan and passes the value in a JavaScript-Function. In the JavaScript-Function filters can be activated. The action values are:
actionValues | |
---|---|
clear |
(optional) clears all filter |
js |
A JavaScript-Function to analyze the value of the scan and set filter. The function got the following parameters: |
value : The scanned text |
|
userData : The user profile of the logged in user |
|
Functions to add filters: | |
eqFilter(name, value) |
|
notEqFilter(name, value) |
|
likeFilter(name, value) |
|
gtFilter(name, value) |
|
gteFilter(name, value) |
|
ltFilter(name, value) |
|
lteFilter(name, value) |
|
isNotNullFilter(name) |
|
isNullFilter(name) |
It is possible to define barcode parameters. It is similar to the configuration for the attribute. Add it to the actionValues. See Barcode/ QR-Code
{
"label": "Scan",
"icon": "icon-barcode",
"action": "barcodeFilter",
"actionValues": [
{
"clear": true,
"js": "eqFilter('WONUM', value.split('|')[0]); eqFilter('WOPRIORITY', value.split('|')[1])"
}
]
}
OR filters
Look for Backend search with OR
The barcodeDeeplink action will open the users camera module and scan barcodes. The scanned result will automatically be handled as a deepLink. Example:
{
"label": "Deeplink",
"shortLabel": "Deeplink",
"action": "barcodeDeeplink",
"icon": "icon-paper-plane"
}
The barcodeScan
action will open the users camera module and scan a barcode. The scanned result will be available in the payload of the then
action. They are accessible in $payload
with the fixed key barcode
. If the barcode contains a JSON string which should be parsed, the actionValues
can be set with the parseJson
option set to true. As default the barcode is only read as a string. Example:
actionValues | |
---|---|
parseJson |
boolean |
It is possible to define barcode parameters. It is similar to the configuration for the attribute. Add it to the actionValues. See Barcode/ QR-Code
{
"label": "Scan Barcode",
"action": "barcodeScan",
"actionValues": [
{
"parseJson": true
}
],
"then": {
"action": "request",
"params": {
"result": "${$payload.barcode}"
}
}
}
nfcRead
forces a NFC scan and passes the result in the payload of the then
chain. The action result contains the following properties:
text
: String: The first entry of the NDEFMessagesid
: String: The id of the tag. (only supported in android)nfcEvent
: Object: The complete result of the native NFC plugin.
see filter for more information
{
"label": "NFC",
"icon": "icon-broadcast",
"action": "nfcRead",
"then": {
"action": "filter",
"actionValues": [
{
"attribute": "DESCRIPTION",
"value": "${object.$payload.text}"
}
]
}
}
see scriptFilter for more information
{
"label": "NFC Filter",
"icon": "icon-broadcast",
"action": "nfcRead",
"then": {
"action": "scriptFilter",
"actionValues": [
{
"clear": true,
"js": "var desc = value.payload.text.split('|')[1]; eqFilter('DESCRIPTION', desc)"
}
]
}
}
scriptFilter
can be used in then
chains. The previous menu action passes the value object in a JavaScript-Function. In the JavaScript-Function filters can be activated. The action values are:
actionValues | |
---|---|
clear |
(optional) clears all filter |
js |
A JavaScript-Function to analyze the value of the scan and set filter. The function got the following parameters: |
value : The passed object of the previous menu action. |
|
userData : The user profile of the logged in user |
|
Functions to add filters: | |
eqFilter(name, value) |
|
notEqFilter(name, value) |
|
likeFilter(name, value) |
|
gtFilter(name, value) |
|
gteFilter(name, value) |
|
ltFilter(name, value) |
|
lteFilter(name, value) |
|
isNotNullFilter(name) |
|
isNullFilter(name) |
{
"label": "NFC Filter",
"icon": "icon-broadcast",
"action": "nfcRead",
"then": {
"action": "scriptFilter",
"actionValues": [
{
"clear": true,
"js": "var desc = value.payload.text.split('|')[1]; eqFilter('DESCRIPTION', desc)"
}
]
}
}
An action to select one record by a selectFromTree
configuration. The selected record can be forwarded to the next action via then
. They are accesible in $payload
with the fixed key selectedRecord
. $payload.selectedRecord
is the selected JSON-object.
actionValues | |
---|---|
tree |
set the tree |
node |
set the node of the tree |
attribute |
set the attribute of the node |
{
"label": "Choose template",
"icon": "icon-list",
"action": "select",
"actionValues": [
{
"tree": "demo-document-templates",
"node": "documents",
"attribute": "name"
}
],
"then": {
"action": "fileEdit",
"actionValues": [
{
"documentsAdd": "Workingfiles"
}
]
}
}
Add or edit an attached file. A full explample can be found here: Documents.
actionValues | |
---|---|
documentsAdd |
Attach the file to this documents configuration. |
{
"action": "fileEdit",
"actionValues": [
{
"documentsAdd": "Workingfiles"
}
]
}
Attaches a signature as a file or as Base64 data string. The signature file can be attach to documents
configuration.
actionValues | |
---|---|
asFile |
boolean |
{
"label": "Signature Attachment",
"icon": "icon-paperclip",
"action": "signature",
"actionValues": [
{
"asFile": true
}
],
"then": {
"action": "fileUpload",
"actionValues": [
{
"documentHandler": "signature",
"filePath": "${$payload.filePath}"
}
]
}
}
{
"label": "Signature to Request",
"icon": "icon-paperclip",
"action": "signature",
"then": {
"action": "request",
"request": {
"url": "/insight/some-endpoint",
"method": "POST",
"params": {
"id": "${id}",
"signature": "${object.payload.signature}"
}
}
}
}
actionValues | |
---|---|
js |
defines a custom JavaScript function which is executed. The function receives the userData and the object objects which can be used. |
The function can optionally return the following values | |
---|---|
Promise.resolve() |
continues the menu chain without a payload |
Promise.resolve(data) |
continues the menu chain with data as payload, where data can be an JavaScript object |
Promise.reject(error) |
throws the given error |
abort() |
cancels the menu chain |
When nothing is returned the menu chain will continue without a payload
.
{
"label": "JavaScript",
"icon": "icon-fire",
"action": "js",
"actionValues": [
{
"js": "return Promise.resolve();"
}
]
}
{
"label": "JavaScript",
"icon": "icon-fire",
"action": "js",
"actionValues": [
{
"js": "const data = 'test'; return Promise.resolve(data);"
}
]
}
{
"label": "JavaScript",
"icon": "icon-fire",
"action": "js",
"actionValues": [
{
"js": "if(/*something work*/) {} else {return Promise.reject(error);}"
}
]
}
{
"label": "JavaScript",
"icon": "icon-fire",
"action": "js",
"actionValues": [
{
"js": "if(/*something not work*/) {abort()};"
}
]
}
This action refreshes the user profile without relogin. After profile information has been changed, it can be rebuilt and made available to the server and client. Cannot be used offline. After rebuilding the profile, uncached trees are redownloaded. Cached (cacheDuration
, schedule
) trees are validated by the Insight server and redownloaded, if necessary. In IBM Maximo it can be used after the site has changed. Example:
{
"label": "Refresh Profile",
"icon": "icon-clipboard-user",
"action": "refreshProfile"
}
A guided form of the create menu. A create menu is needed.
The information can be spread over several pages and also summarized in sections on each page. Attributes can be required. Leaving the page or going to the next page is no longer possible without filling in the fields. To upload or make a photo, "documents": true
must be set on the appropriate page.
"flow": {
"create": {
"title": "Flow",
"pages": [
{
"label": "Page One",
"description": "Description of page one",
"attributes": [
{
"name": "DESCRIPTION",
"section": "Section One"
},
{
"name": "DESCRIPTION_LONGDESCRIPTION",
"section": "Section Two",
"requiered": true
}
]
}
{
"label": "Page Two",
"description": "Description of page two",
"attributes": [
{
"name": "ASSETNUM"
},
{
"name": "LOCATION"
}
],
"documents": true
}
]
}
}
The listDialog menu displays a root list in a dialog.
actionValues | |
---|---|
tree |
defines the tree |
filter |
(optional) filters the list by the given filter |
{
"label": "Show History",
"icon": "icon-clock",
"action": "listDialog",
"actionValues": [
{
"tree": "meterreading",
"filter": [
{
"attribute": "METERNAME",
"value": "${METERNAME}"
}
]
}
]
}