Add rule node help links. Improve rule nodes description.

This commit is contained in:
Igor Kulikov 2018-05-21 11:47:48 +03:00
parent e0b6c3238c
commit 4230262960
11 changed files with 89 additions and 105 deletions

View File

@ -39,9 +39,9 @@ import org.thingsboard.server.common.msg.TbMsg;
nodeDetails =
"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\n" +
"Node output:\n" +
"If alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains 'isClearedAlarm' property " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
"If alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains 'isClearedAlarm' property. " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbActionNodeClearAlarmConfig",
icon = "notifications_off"

View File

@ -41,9 +41,9 @@ import org.thingsboard.server.common.msg.TbMsg;
nodeDetails =
"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\n" +
"Node output:\n" +
"If alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains one of those properties 'isNewAlarm/isExistingAlarm' " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
"If alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains one of those properties 'isNewAlarm/isExistingAlarm'. " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbActionNodeCreateAlarmConfig",
icon = "notifications_active"

View File

@ -31,8 +31,8 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
configClazz = TbLogNodeConfiguration.class,
nodeDescription = "Log incoming messages using JS script for transformation Message into String",
nodeDetails = "Transform incoming Message with configured JS function to String and log final value into Thingsboard log file. " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbActionNodeLogConfig",
icon = "menu"

View File

@ -38,7 +38,7 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
name = "generator",
configClazz = TbMsgGeneratorNodeConfiguration.class,
nodeDescription = "Periodically generates messages",
nodeDetails = "Generates messages with configurable period. Javascript function used fore message generation.",
nodeDetails = "Generates messages with configurable period. Javascript function used for message generation.",
inEnabled = false,
uiResources = {"static/rulenode/rulenode-core-config.js", "static/rulenode/rulenode-core-config.css"},
configDirective = "tbActionNodeGeneratorConfig",

View File

@ -35,9 +35,9 @@ import static org.thingsboard.rule.engine.mail.TbSendEmailNode.SEND_EMAIL_TYPE;
type = ComponentType.TRANSFORMATION,
name = "to email",
configClazz = TbMsgToEmailNodeConfiguration.class,
nodeDescription = "Change Message Originator To Tenant/Customer/Related Entity",
nodeDetails = "Related Entity found using configured relation direction and Relation Type. " +
"If multiple Related Entities are found, only first Entity is used as new Originator, other entities are discarded. ",
nodeDescription = "Transforms message to email message",
nodeDetails = "Transforms message to email message by populating email fields using values derived from message metadata. " +
"Set 'SEND_EMAIL' output message type.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbTransformationNodeToEmailConfig",
icon = "email"

View File

@ -37,10 +37,9 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
type = ComponentType.EXTERNAL,
name = "send email",
configClazz = TbSendEmailNodeConfiguration.class,
nodeDescription = "Log incoming messages using JS script for transformation Message into String",
nodeDetails = "Transform incoming Message with configured JS condition to String and log final value. " +
"Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
"Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
nodeDescription = "Sends email message via SMTP server",
nodeDetails = "Expects messages with 'SEND_EMAIL' message type, usually processed by 'to email' node. " +
"Will send email message via configured SMTP server.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbActionNodeSendEmailConfig",
icon = "send"

View File

@ -13,36 +13,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var pluginClazzHelpLinkMap = {
'org.thingsboard.server.extensions.core.plugin.messaging.DeviceMessagingPlugin': 'pluginDeviceMessaging',
'org.thingsboard.server.extensions.core.plugin.telemetry.TelemetryStoragePlugin': 'pluginTelemetryStorage',
'org.thingsboard.server.extensions.core.plugin.rpc.RpcPlugin': 'pluginRpcPlugin',
'org.thingsboard.server.extensions.core.plugin.mail.MailPlugin': 'pluginMailPlugin',
'org.thingsboard.server.extensions.rest.plugin.RestApiCallPlugin': 'pluginRestApiCallPlugin',
'org.thingsboard.server.extensions.core.plugin.time.TimePlugin': 'pluginTimePlugin',
'org.thingsboard.server.extensions.kafka.plugin.KafkaPlugin': 'pluginKafkaPlugin',
'org.thingsboard.server.extensions.rabbitmq.plugin.RabbitMqPlugin': 'pluginRabbitMqPlugin'
};
var filterClazzHelpLinkMap = {
'org.thingsboard.server.extensions.core.filter.MsgTypeFilter': 'filterMsgType',
'org.thingsboard.server.extensions.core.filter.DeviceTelemetryFilter': 'filterDeviceTelemetry',
'org.thingsboard.server.extensions.core.filter.MethodNameFilter': 'filterMethodName',
'org.thingsboard.server.extensions.core.filter.DeviceAttributesFilter': 'filterDeviceAttributes'
};
var processorClazzHelpLinkMap = {
'org.thingsboard.server.extensions.core.processor.AlarmDeduplicationProcessor': 'processorAlarmDeduplication'
};
var pluginActionsClazzHelpLinkMap = {
'org.thingsboard.server.extensions.core.action.rpc.RpcPluginAction': 'pluginActionRpc',
'org.thingsboard.server.extensions.core.action.mail.SendMailAction': 'pluginActionSendMail',
'org.thingsboard.server.extensions.core.action.telemetry.TelemetryPluginAction': 'pluginActionTelemetry',
'org.thingsboard.server.extensions.kafka.action.KafkaPluginAction': 'pluginActionKafka',
'org.thingsboard.server.extensions.rabbitmq.action.RabbitMqPluginAction': 'pluginActionRabbitMq',
'org.thingsboard.server.extensions.rest.action.RestApiCallPluginAction': 'pluginActionRestApiCall'
var ruleNodeClazzHelpLinkMap = {
'org.thingsboard.rule.engine.filter.TbJsFilterNode': 'ruleNodeJsFilter',
'org.thingsboard.rule.engine.filter.TbJsSwitchNode': 'ruleNodeJsSwitch',
'org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode': 'ruleNodeMessageTypeFilter',
'org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode': 'ruleNodeMessageTypeSwitch',
'org.thingsboard.rule.engine.metadata.TbGetAttributesNode': 'ruleNodeOriginatorAttributes',
'org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode': 'ruleNodeCustomerAttributes',
'org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode': 'ruleNodeDeviceAttributes',
'org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode': 'ruleNodeRelatedAttributes',
'org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode': 'ruleNodeTenantAttributes',
'org.thingsboard.rule.engine.transform.TbChangeOriginatorNode': 'ruleNodeChangeOriginator',
'org.thingsboard.rule.engine.transform.TbTransformMsgNode': 'ruleNodeTransformMsg',
'org.thingsboard.rule.engine.mail.TbMsgToEmailNode': 'ruleNodeMsgToEmail',
'org.thingsboard.rule.engine.action.TbClearAlarmNode': 'ruleNodeClearAlarm',
'org.thingsboard.rule.engine.action.TbCreateAlarmNode': 'ruleNodeCrateAlarm',
'org.thingsboard.rule.engine.debug.TbMsgGeneratorNode': 'ruleNodeMsgGenerator',
'org.thingsboard.rule.engine.action.TbLogNode': 'ruleNodeLog',
'org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode': 'ruleNodeRpcCallReply',
'org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode': 'ruleNodeRpcCallRequest',
'org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode': 'ruleNodeSaveAttributes',
'org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode': 'ruleNodeSaveTimeseries',
'tb.internal.RuleChain': 'ruleNodeRuleChain',
'org.thingsboard.rule.engine.aws.sns.TbSnsNode': 'ruleNodeAwsSns',
'org.thingsboard.rule.engine.aws.sqs.TbSqsNode': 'ruleNodeAwsSqs',
'org.thingsboard.rule.engine.kafka.TbKafkaNode': 'ruleNodeKafka',
'org.thingsboard.rule.engine.mqtt.TbMqttNode': 'ruleNodeMqtt',
'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode': 'ruleNodeRabbitMq',
'org.thingsboard.rule.engine.rest.TbRestApiCallNode': 'ruleNodeRestApiCall',
'org.thingsboard.rule.engine.mail.TbSendEmailNode': 'ruleNodeSendEmail'
};
var helpBaseUrl = "https://thingsboard.io";
@ -52,30 +52,36 @@ export default angular.module('thingsboard.help', [])
{
linksMap: {
outgoingMailSettings: helpBaseUrl + "/docs/user-guide/ui/mail-settings",
plugins: helpBaseUrl + "/docs/user-guide/rule-engine/#plugins",
pluginDeviceMessaging: helpBaseUrl + "/docs/reference/plugins/messaging/",
pluginTelemetryStorage: helpBaseUrl + "/docs/reference/plugins/telemetry/",
pluginRpcPlugin: helpBaseUrl + "/docs/reference/plugins/rpc/",
pluginMailPlugin: helpBaseUrl + "/docs/reference/plugins/mail/",
pluginRestApiCallPlugin: helpBaseUrl + "/docs/reference/plugins/rest/",
pluginTimePlugin: helpBaseUrl + "/docs/reference/plugins/time/",
pluginKafkaPlugin: helpBaseUrl + "/docs/reference/plugins/kafka/",
pluginRabbitMqPlugin: helpBaseUrl + "/docs/reference/plugins/rabbitmq/",
rules: helpBaseUrl + "/docs/user-guide/rule-engine/#rules",
filters: helpBaseUrl + "/docs/user-guide/rule-engine/#filters",
filterMsgType: helpBaseUrl + "/docs/reference/filters/message-type-filter",
filterDeviceTelemetry: helpBaseUrl + "/docs/reference/filters/device-telemetry-filter",
filterMethodName: helpBaseUrl + "/docs/reference/filters/method-name-filter/",
filterDeviceAttributes: helpBaseUrl + "/docs/reference/filters/device-attributes-filter",
processors: helpBaseUrl + "/docs/user-guide/rule-engine/#processors",
processorAlarmDeduplication: "http://thingsboard.io/docs/#q=processorAlarmDeduplication",
pluginActions: helpBaseUrl + "/docs/user-guide/rule-engine/#actions",
pluginActionRpc: helpBaseUrl + "/docs/reference/actions/rpc-plugin-action",
pluginActionSendMail: helpBaseUrl + "/docs/reference/actions/send-mail-action",
pluginActionTelemetry: helpBaseUrl + "/docs/reference/actions/telemetry-plugin-action/",
pluginActionKafka: helpBaseUrl + "/docs/reference/actions/kafka-plugin-action",
pluginActionRabbitMq: helpBaseUrl + "/docs/reference/actions/rabbitmq-plugin-action",
pluginActionRestApiCall: helpBaseUrl + "/docs/reference/actions/rest-api-call-plugin-action",
ruleEngine: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/overview/",
ruleNodeJsFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#script-filter-node",
ruleNodeJsSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#switch-node",
ruleNodeMessageTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-filter-node",
ruleNodeMessageTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-switch-node",
ruleNodeOriginatorAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-attributes",
ruleNodeCustomerAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#customer-attributes",
ruleNodeDeviceAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#device-attributes",
ruleNodeRelatedAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#related-attributes",
ruleNodeTenantAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#tenant-attributes",
ruleNodeChangeOriginator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#change-originator",
ruleNodeTransformMsg: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#script-transformation-node",
ruleNodeMsgToEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#to-email-node",
ruleNodeClearAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#clear-alarm-node",
ruleNodeCrateAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#create-alarm-node",
ruleNodeMsgGenerator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#generator-node",
ruleNodeLog: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#log-node",
ruleNodeRpcCallReply: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-reply-node",
ruleNodeRpcCallRequest: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-request-node",
ruleNodeSaveAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-attributes-node",
ruleNodeSaveTimeseries: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-timeseries-node",
ruleNodeRuleChain: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/rule-chains/",
ruleNodeAwsSns: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sns-node",
ruleNodeAwsSqs: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sqs-node",
ruleNodeKafka: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#kafka-node",
ruleNodeMqtt: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#mqtt-node",
ruleNodeRabbitMq: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rabbitmq-node",
ruleNodeRestApiCall: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rest-api-call-node",
ruleNodeSendEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#send-email-node",
rulechains: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/rule-chains/",
tenants: helpBaseUrl + "/docs/user-guide/ui/tenants",
customers: helpBaseUrl + "/docs/user-guide/ui/customers",
assets: helpBaseUrl + "/docs/user-guide/ui/assets",
@ -90,38 +96,11 @@ export default angular.module('thingsboard.help', [])
widgetsConfigAlarm: helpBaseUrl + "/docs/user-guide/ui/dashboards#alarm",
widgetsConfigStatic: helpBaseUrl + "/docs/user-guide/ui/dashboards#static",
},
getPluginLink: function(plugin) {
var link = 'plugins';
if (plugin && plugin.clazz) {
if (pluginClazzHelpLinkMap[plugin.clazz]) {
link = pluginClazzHelpLinkMap[plugin.clazz];
}
}
return link;
},
getFilterLink: function(filter) {
var link = 'filters';
if (filter && filter.clazz) {
if (filterClazzHelpLinkMap[filter.clazz]) {
link = filterClazzHelpLinkMap[filter.clazz];
}
}
return link;
},
getProcessorLink: function(processor) {
var link = 'processors';
if (processor && processor.clazz) {
if (processorClazzHelpLinkMap[processor.clazz]) {
link = processorClazzHelpLinkMap[processor.clazz];
}
}
return link;
},
getPluginActionLink: function(pluginAction) {
var link = 'pluginActions';
if (pluginAction && pluginAction.clazz) {
if (pluginActionsClazzHelpLinkMap[pluginAction.clazz]) {
link = pluginActionsClazzHelpLinkMap[pluginAction.clazz];
getRuleNodeLink: function(ruleNode) {
var link = 'ruleEngine';
if (ruleNode && ruleNode.component && ruleNode.component.clazz) {
if (ruleNodeClazzHelpLinkMap[ruleNode.component.clazz]) {
link = ruleNodeClazzHelpLinkMap[ruleNode.component.clazz];
}
}
return link;

View File

@ -15,7 +15,7 @@
limitations under the License.
-->
<md-dialog aria-label="{{ 'rulenode.add-link' | translate }}" tb-help="'rulechains'" help-container-id="help-container">
<md-dialog aria-label="{{ 'rulenode.add-link' | translate }}" tb-help="'ruleEngine'" help-container-id="help-container">
<form name="theForm" ng-submit="vm.add()">
<md-toolbar>
<div class="md-toolbar-tools">

View File

@ -15,7 +15,7 @@
limitations under the License.
-->
<md-dialog aria-label="{{ 'rulenode.add' | translate }}" tb-help="'rulechains'" help-container-id="help-container" style="min-width: 650px;">
<md-dialog aria-label="{{ 'rulenode.add' | translate }}" tb-help="vm.helpLinks.getRuleNodeLink(vm.ruleNode)" help-container-id="help-container" style="min-width: 650px;">
<form name="theForm" ng-submit="vm.add()">
<md-toolbar>
<div class="md-toolbar-tools">

View File

@ -30,7 +30,7 @@ import addRuleNodeLinkTemplate from './add-link.tpl.html';
/*@ngInject*/
export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $timeout, $mdExpansionPanel, $window, $document, $mdDialog,
$filter, $translate, hotkeys, types, ruleChainService, itembuffer, Modelfactory, flowchartConstants,
ruleChain, ruleChainMetaData, ruleNodeComponents) {
ruleChain, ruleChainMetaData, ruleNodeComponents, helpLinks) {
var vm = this;
@ -113,6 +113,8 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
vm.openRuleChainContextMenu = openRuleChainContextMenu;
vm.helpLinkIdForRuleNodeType = helpLinkIdForRuleNodeType;
initHotKeys();
function openRuleChainContextMenu($event, $mdOpenMousepointMenu) {
@ -473,6 +475,10 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
vm.destroyTooltips = destroyTooltips;
function helpLinkIdForRuleNodeType() {
return helpLinks.getRuleNodeLink(vm.editingRuleNode);
}
function destroyTooltips() {
if (vm.tooltipTimeout) {
$timeout.cancel(vm.tooltipTimeout);

View File

@ -202,7 +202,7 @@
on-toggle-details-edit-mode="vm.onRevertRuleNodeLinkEdit(vm.ruleNodeLinkForm)"
on-apply-details="vm.saveRuleNodeLink(vm.ruleNodeLinkForm)"
the-form="vm.ruleNodeLinkForm">
<details-buttons tb-help="vm.helpLinkIdForRuleNodeLink()" help-container-id="link-help-container">
<details-buttons tb-help="'ruleEngine'" help-container-id="link-help-container">
<div id="link-help-container"></div>
</details-buttons>
<form name="vm.ruleNodeLinkForm" ng-if="vm.isEditingRuleNodeLink">