Custom Action
Custom action widgets allow you to code an action to be performed, which will be triggered by a button or a form.
How it Works
This widget will display a form or button that will execute the user-coded action.
In the case of using a form, the action will receive the form values and any desired logic can be applied to them.
Additionally, this widget can be configured so that the action executes within a dialog box as an independent form.
Once the execution is initiated, a progress box will appear displaying the result of the action.
The execution will be successful as long as no exception is thrown in the source code.
Configuration
General
- Boxed: widget will be displayed with background in dahsboard.
- About: widget description in Markdown format.
- Title: widget title. It can be configured to remain fixed in the widget or only be displayed when it receives focus.
- Toolbar: configures the behavior of the widget bar on the dashboard, allowing you to hide it, hide it when not in use, or leave it always visible.
- Refresh Frequency: allows configuring the data refresh frequency displayed in the list.
- Extra actions: allows user to add new specific actions to the widget with your own code.
You can add a new one by pressing the New button.
Once you added a custom action it can be modified later by pressing the name in the list.
In order to remove the custom action click the delete icon button on the right.
In extra actions you can write your own code were you can open other dashboards, entities dashboards or execute wizards.
You can find all available functions and methods in Extra parameters
- Description here you will write what action will be executed when the corresponding button is pressed
- Icon determines the type of desired visualization: a button with an icon, an image, or a custom form. In the case of a form, it can also be specified if you want to display it as a dialog box.
If it’s a form, you must enter a JSON schema that determines what will be drawn.
Expert
Here you can configure source code that will run before the widget is loaded, allowing for the dynamic construction of the JSON schema of the form to be displayed, thereby facilitating the construction of dynamic forms based on platform data.
Available utils
$api -> use it to create http petitions to OpenGate Api Rest doc
$user -> Logged user
Example:
{
"email": "email@amplia.es",
"workgroup": "workgroup",
"domain": "domain",
"profile": "profile",
"countryCode": "ES",
"langCode": "en",
"timezone": "Europe/Madrid"
}$moment -> use it to format date doc
console -> display messages in navigator console
Promise -> allows easy execution of multiple promises
http -> javascript encapsulation of useFetch (Nuxt 4) library doc
Function
Depending of the configuration receives the following parameters:
- entityData contains the data of the opened entity NOTE: only available when the user opens an entity dashboard template
Example:
{
"provision.administration.identifier": {
"_value": {
"_current": {
"value": "device_1"
}
}
},
"provision.administration.organization": {
"_value": {
"_current": {
"value": "organization_name"
}
}
},
"provision.administration.channel": {
"_value": {
"_current": {
"value": "channel_name"
}
}
},
"provision.administration.serviceGroup": {
"_value": {
"_current": {
"value": "service_group_name"
}
}
}
}- relatedEntities contains an array of entities related to the entity selected. NOTE: only available when the user opens an entity dashboard template
Example:
[{
"provision.administration.identifier": {
"_value": {
"_current": {
"value": "related_1"
}
}
},
"provision.administration.organization": {
"_value": {
"_current": {
"value": "organization_name"
}
}
},
"provision.administration.channel": {
"_value": {
"_current": {
"value": "channel_name"
}
}
},
"provision.administration.serviceGroup": {
"_value": {
"_current": {
"value": "service_group_name"
}
}
}
}]- timeserieData contains info about the timeserie opened by the user
- config timeserie configuration
- data timeserie row selected
NOTE: only available when the user opens an entity dashboard template from timeserie table widget
An example:
{
"config": {
"identifier": "69281dc43545e97df66c42a1",
"name": "Battery charge history",
"timeBucket": 3600,
"bucketColumn": "bucketEnd",
"bucketInitColumn": "bucketInit",
"identifierColumn": "EntityID",
"retention": 2592000,
"origin": "2025-11-26T23:00:00Z",
"context": [
{
"path": "provision.device.administrativeState",
"name": "Administrative state",
"sort": "true",
"filter": "YES",
"type": "string"
}
],
"columns": [
{
"path": "device.powersupply.battery.charge._current.value",
"name": "Powersupply battery charge Current Value",
"filter": "NO",
"type": "number",
"sort": false,
"aggregationFunction": "FIRST"
}
]
},
"data": {
"bucketEnd": "2025-12-11T13:00:00+01:00",
"bucketInit": "2025-12-11T12:00:00+01:00",
"EntityID": "entity_1",
"Powersupply battery charge Current Value": 34
}
}- alarmData contains the data of the alarm opened in template
{
"identifier": "270dd9f9-1396-4660-bb5f-8d8b471e1dcd",
"name": "activityForbidden",
"rule": "activityForbidden",
"description": "Activity detected for an entity with administrative state disabled",
"severity": "INFORMATIVE",
"priority": "LOW",
"organization": "organization_name",
"channel": "default_channel",
"entityIdentifier": "A_WORKER_1",
"subEntityIdentifier": "A_WORKER_1",
"resourceType": "ENTITY_ASSET",
"status": "CLOSED",
"openingDate": "2019-06-27T08:57:36+02:00",
"closureDate": "2019-06-27T08:57:51+02:00"
}Action code specific parameters
-
value is the value, in string format, entered in value field when enabled
-
model contains the custom form values data
Example:
{
"your.datastream.name": "datastreamvalue",
"field1": "value1",
"field2": "value2"
}Final code structure build by the application
async function main(entityData,alarmData,relatedEntities,timeserieData,value, model) {
// YOUR CODE HERE WITH RETURN OR CALLBACK
}Expert code specific parameters
- config receives the configuration object of the widget in order to modify it
- callback function used to send the new configuration to the widget
Example:
callback(newConfig);or
return newConfig;Final code structure build by the application
async function main(entityData,alarmData,relatedEntities,timeserieData,config,callback) {
// YOUR CODE HERE WITH RETURN OR CALLBACK
}
