diff --git a/application/src/main/data/json/demo/dashboards/gateway.json b/application/src/main/data/json/demo/dashboards/gateway.json
index b35b480ef2..fc5c651a33 100644
--- a/application/src/main/data/json/demo/dashboards/gateway.json
+++ b/application/src/main/data/json/demo/dashboards/gateway.json
@@ -250,9 +250,9 @@
"useShowWidgetActionFunction": null,
"showWidgetActionFunction": "return true;",
"type": "customPretty",
- "customHtml": "
\r\n",
+ "customHtml": "\r\n",
"customCss": ".add-entity-form {\r\n min-width: 400px !important;\r\n}\r\n\r\n.add-entity-form .boolean-value-input {\r\n padding-left: 5px;\r\n}\r\n\r\n.add-entity-form .boolean-value-input .checkbox-label {\r\n margin-bottom: 8px;\r\n color: rgba(0,0,0,0.54);\r\n font-size: 12px;\r\n}\r\n\r\n.relations-list .header {\r\n padding-right: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .header .cell {\r\n padding-right: 5px;\r\n padding-left: 5px;\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: rgba(0, 0, 0, .54);\r\n white-space: nowrap;\r\n}\r\n\r\n.relations-list .mat-form-field-infix {\r\n width: auto !important;\r\n}\r\n\r\n.relations-list .body {\r\n padding-right: 5px;\r\n padding-bottom: 15px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .body .row {\r\n padding-top: 5px;\r\n}\r\n\r\n.relations-list .body .cell {\r\n padding-right: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .body .md-button {\r\n margin: 0;\r\n}\r\n\r\n",
- "customFunction": "let $injector = widgetContext.$scope.$injector;\r\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\r\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\r\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\r\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\r\nlet entityRelationService = $injector.get(widgetContext.servicesMap.get('entityRelationService'));\r\nlet userSettingsService = $injector.get(widgetContext.servicesMap.get('userSettingsService'));\r\n\r\nopenAddEntityDialog();\r\n\r\nfunction openAddEntityDialog() {\r\n customDialog.customDialog(htmlTemplate, AddEntityDialogController).subscribe();\r\n}\r\n\r\nfunction AddEntityDialogController(instance) {\r\n let vm = instance;\r\n let userSettings;\r\n userSettingsService.loadUserSettings().subscribe(settings=> {\r\n userSettings = settings;\r\n if (!userSettings.createdGatewaysCount) userSettings.createdGatewaysCount = 0;\r\n });\r\n \r\n\r\n vm.addEntityFormGroup = vm.fb.group({\r\n entityName: ['', [vm.validators.required]],\r\n entityType: ['DEVICE'],\r\n entityLabel: [''],\r\n type: ['', [vm.validators.required]],\r\n });\r\n\r\n vm.cancel = function() {\r\n vm.dialogRef.close(null);\r\n };\r\n\r\n\r\n vm.save = function() {\r\n vm.addEntityFormGroup.markAsPristine();\r\n saveEntityObservable().subscribe(\r\n function (device) {\r\n widgetContext.updateAliases();\r\n userSettingsService.putUserSettings({ createdGatewaysCount: ++userSettings.createdGatewaysCount }).subscribe(_=>{\r\n });\r\n vm.dialogRef.close(null);\r\n goToConfigState(device);\r\n }\r\n );\r\n };\r\n \r\n function goToConfigState(device) {\r\n const stateParams = {};\r\n stateParams.entityId = device.id;\r\n stateParams.entityName = device.name;\r\n const newStateParams = {\r\n targetEntityParamName: 'default',\r\n new_gateway: {\r\n entityId: device.id,\r\n entityName: device.name\r\n }\r\n }\r\n const params = {...stateParams, ...newStateParams};\r\n widgetContext.stateController.openState('gateway_details', params, false);\r\n }\r\n\r\n function saveEntityObservable() {\r\n const formValues = vm.addEntityFormGroup.value;\r\n let entity = {\r\n name: formValues.entityName,\r\n type: formValues.type,\r\n label: formValues.entityLabel,\r\n additionalInfo: {\r\n gateway: true\r\n }\r\n };\r\n return deviceService.saveDevice(entity);\r\n }\r\n}\r\n",
+ "customFunction": "let $injector = widgetContext.$scope.$injector;\r\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\r\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\r\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\r\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\r\nlet entityRelationService = $injector.get(widgetContext.servicesMap.get('entityRelationService'));\r\nlet userSettingsService = $injector.get(widgetContext.servicesMap.get('userSettingsService'));\r\n\r\nopenAddEntityDialog();\r\n\r\nfunction openAddEntityDialog() {\r\n customDialog.customDialog(htmlTemplate, AddEntityDialogController).subscribe();\r\n}\r\n\r\nfunction AddEntityDialogController(instance) {\r\n let vm = instance;\r\n let userSettings;\r\n userSettingsService.loadUserSettings().subscribe(settings=> {\r\n userSettings = settings;\r\n if (!userSettings.createdGatewaysCount) userSettings.createdGatewaysCount = 0;\r\n });\r\n \r\n\r\n vm.addEntityFormGroup = vm.fb.group({\r\n entityName: ['', [vm.validators.required]],\r\n entityType: ['DEVICE'],\r\n entityLabel: [''],\r\n type: ['', [vm.validators.required]],\r\n });\r\n\r\n vm.cancel = function() {\r\n vm.dialogRef.close(null);\r\n };\r\n\r\n\r\n vm.save = function($event) {\r\n vm.addEntityFormGroup.markAsPristine();\r\n saveEntityObservable().subscribe(\r\n function (device) {\r\n widgetContext.updateAliases();\r\n userSettingsService.putUserSettings({ createdGatewaysCount: ++userSettings.createdGatewaysCount }).subscribe(_=>{\r\n });\r\n vm.dialogRef.close(null);\r\n openCommandDialog(device, $event);\r\n }\r\n );\r\n };\r\n \r\n function openCommandDialog(device, $event) {\r\n vm.device = device;\r\n let openCommandAction = widgetContext.actionsApi.getActionDescriptors(\"actionCellButton\").find(action => action.name == \"Docker commands\");\r\n widgetContext.actionsApi.handleWidgetAction($event, openCommandAction, device.id, device.name, {newDevice: true});\r\n setTimeout(function() {\r\n document.querySelector(\".dashboard-state-dialog .mat-mdc-button-touch-target\").addEventListener('click', goToConfigState);\r\n document.querySelector(\".dashboard-state-dialog .mat-mdc-button.mat-primary\").addEventListener('click', goToConfigState);\r\n }, 500);\r\n }\r\n\r\n \r\n function goToConfigState() {\r\n document.querySelector(\".dashboard-state-dialog .mat-mdc-button-touch-target\").removeEventListener('click', goToConfigState);\r\n document.querySelector(\".dashboard-state-dialog .mat-mdc-button.mat-primary\").removeEventListener('click', goToConfigState);\r\n const stateParams = {};\r\n stateParams.entityId = vm.device.id;\r\n stateParams.entityName = vm.device.name;\r\n const newStateParams = {\r\n targetEntityParamName: 'default',\r\n new_gateway: {\r\n entityId: vm.device.id,\r\n entityName: vm.device.name\r\n }\r\n }\r\n const params = {...stateParams, ...newStateParams};\r\n widgetContext.stateController.openState('gateway_details', params, false);\r\n }\r\n\r\n function saveEntityObservable() {\r\n const formValues = vm.addEntityFormGroup.value;\r\n let entity = {\r\n name: formValues.entityName,\r\n type: formValues.type,\r\n label: formValues.entityLabel,\r\n additionalInfo: {\r\n gateway: true\r\n }\r\n };\r\n return deviceService.saveDevice(entity);\r\n }\r\n}\r\n",
"customResources": [],
"openInSeparateDialog": false,
"openInPopover": false,
@@ -2142,7 +2142,7 @@
"settings": {
"useMarkdownTextFunction": false,
"markdownTextPattern": "\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n",
- "applyDefaultMarkdownStyle": true,
+ "applyDefaultMarkdownStyle": false,
"markdownCss": ".mat-mdc-form-field-subscript-wrapper {\n display: none !important;\n}"
},
"title": "New Markdown/HTML Card",
@@ -2316,7 +2316,22 @@
"pageSize": 1024,
"noDataDisplayMessage": "",
"enableDataExport": false,
- "borderRadius": ""
+ "borderRadius": "",
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "45e4507d-3adc-bb31-8b2b-1ba09bbd56ac"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -2468,7 +2483,22 @@
"pageSize": 1024,
"noDataDisplayMessage": "",
"enableDataExport": false,
- "borderRadius": "4px"
+ "borderRadius": "4px",
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "852eccce-98eb-24db-c783-bdd62566f906"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -2619,7 +2649,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "3c31ba62-e760-2bea-4c8d-d32784a86c24"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -2770,7 +2815,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "4b55ea81-93bf-4206-9166-3e0bdc1dd9f3"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -2921,7 +2981,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "babf88d0-a118-e2b5-f10e-3a5970c8a65b"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3072,7 +3147,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "94de7690-f91d-b032-6771-85af99abd749"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3223,7 +3313,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "18414f44-1c65-536a-14de-eaf21a7d56bd"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3374,7 +3479,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "794974da-c9d2-a9f7-be47-c9eb642094e8"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3525,7 +3645,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "2add705b-3e53-8559-8126-380cac686fb0"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3676,7 +3811,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "7e1ba820-9992-d52a-579b-20485abb3926"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3827,7 +3977,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "91af27c1-b37c-2276-6022-a332e41b2b33"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -3978,7 +4143,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "26cf8696-054b-13ec-7984-6fc5df20e6f1"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4129,7 +4309,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "1dcfaf24-32be-cd19-62d6-86d12cc6a7ef"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4280,7 +4475,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "ad2bc817-f3c4-150c-4672-8fe0c38aee8d"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4431,7 +4641,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "d1ad84cd-bd9c-4dca-e4a0-f444ae8598bd"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4582,7 +4807,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "bf80eef9-b879-9a08-40a4-488dbdefa125"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4733,7 +4973,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "b5a406b3-cc0a-8a09-9aec-3f8befae5fb8"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -4884,7 +5139,22 @@
"widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n",
"pageSize": 1024,
"noDataDisplayMessage": "",
- "enableDataExport": false
+ "enableDataExport": false,
+ "actions": {
+ "actionCellButton": [
+ {
+ "name": "Show Device Info",
+ "icon": "info",
+ "useShowWidgetActionFunction": null,
+ "showWidgetActionFunction": "return true;",
+ "type": "custom",
+ "customFunction": "const url = `${window.location.origin}/entities/devices/${entityId.id}`;\nwindow.open(url, '_blank');",
+ "openInSeparateDialog": false,
+ "openInPopover": false,
+ "id": "ec1dfba3-4b43-2491-8948-f602337f8a3b"
+ }
+ ]
+ }
},
"row": 0,
"col": 0,
@@ -6596,4 +6866,4 @@
},
"externalId": null,
"name": "Gateway"
-}
+}
\ No newline at end of file
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.html
index 4aec0fd467..8a96f1849b 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.html
@@ -36,7 +36,7 @@
{{ 'gateway.statistics.command' | translate }}
-
+
{{ 'widget-config.datasource-parameters' | translate }}
@@ -56,8 +56,10 @@
- {{ 'gateway.rpc-command-result' | translate }}
-
+ {{ 'gateway.rpc-command-result' | translate }}
+ schedule
+ {{ resultTime | date: 'yyyy/MM/dd HH:mm:ss' }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.scss
index 345688d451..5dab1d91c1 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.scss
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.scss
@@ -24,6 +24,7 @@
.command-form {
flex-wrap: nowrap;
padding: 0 5px 5px;
+
& > button {
margin-top: 10px;
}
@@ -34,9 +35,30 @@
display: flex;
flex-direction: column;
flex: 1;
+
& > span {
font-weight: 600;
+ position: relative;
+ font-size: 14px;
+ margin-bottom: 10px;
+
+
+ .result-time {
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 32px;
+ position: absolute;
+ left: 0;
+ top: 25px;
+ z-index: 5;
+ color: rgba(0, 0, 0, 0.54);
+
+ span {
+ padding-left: 10px;
+ }
+ }
}
+
tb-json-content {
flex: 1;
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts
index a8ad61e1ec..d19624e257 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts
@@ -37,6 +37,8 @@ export class GatewayServiceRPCComponent implements AfterViewInit {
contentTypes = ContentType;
+ resultTime: number | null;
+
@Input()
dialogRef: MatDialogRef;
@@ -76,12 +78,17 @@ export class GatewayServiceRPCComponent implements AfterViewInit {
}
sendCommand() {
+ this.resultTime = null;
const formValues = this.commandForm.value;
const commandPrefix = this.isConnector ? `${this.connectorType}_` : 'gateway_';
this.ctx.controlApi.sendTwoWayCommand(commandPrefix+formValues.command.toLowerCase(), formValues.params,formValues.time).subscribe({
- next: resp => this.commandForm.get('result').setValue(JSON.stringify(resp)),
+ next: resp => {
+ this.resultTime = new Date().getTime();
+ this.commandForm.get('result').setValue(JSON.stringify(resp))
+ },
error: error => {
- console.log(error);
+ this.resultTime = new Date().getTime();
+ console.error(error);
this.commandForm.get('result').setValue(JSON.stringify(error.error));
}
});
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index ef660731bf..fcf42dc0e2 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -2682,7 +2682,7 @@
"connectors-table-key": "Key",
"connectors-table-class": "Class",
"rpc-command-send": "Send",
- "rpc-command-result": "Result",
+ "rpc-command-result": "Response",
"rpc-command-edit-params": "Edit parameters",
"gateway-configuration": "General Configuration",
"docker-label": "In order to run ThingsBoard IoT gateway in docker with credentials for this device you can use the following commands.",