' +
'
' + name + '
' +
'
' + desc + '
';
if (details) {
@@ -1189,7 +1128,7 @@ export class RuleChainPageComponent extends PageComponent
resetDebugModeInAllNodes() {
let changed = false;
this.ruleChainModel.nodes.forEach((node) => {
- if (node.component.type !== RuleNodeType.INPUT && node.component.type !== RuleNodeType.RULE_CHAIN) {
+ if (node.component.type !== RuleNodeType.INPUT) {
changed = changed || node.debugMode;
node.debugMode = false;
}
@@ -1223,12 +1162,11 @@ export class RuleChainPageComponent extends PageComponent
const ruleChainMetaData: RuleChainMetaData = {
ruleChainId: this.ruleChain.id,
nodes: [],
- connections: [],
- ruleChainConnections: []
+ connections: []
};
const nodes: FcRuleNode[] = [];
this.ruleChainModel.nodes.forEach((node) => {
- if (node.component.type !== RuleNodeType.INPUT && node.component.type !== RuleNodeType.RULE_CHAIN) {
+ if (node.component.type !== RuleNodeType.INPUT) {
const ruleNode: RuleNode = {
id: node.ruleNodeId,
type: node.component.clazz,
@@ -1253,35 +1191,19 @@ export class RuleChainPageComponent extends PageComponent
const destNode = this.ruleChainCanvas.modelService.nodes.getNodeByConnectorId(edge.destination);
if (sourceNode.component.type !== RuleNodeType.INPUT) {
const fromIndex = nodes.indexOf(sourceNode);
- if (destNode.component.type === RuleNodeType.RULE_CHAIN) {
- const ruleChainConnection = {
- fromIndex,
- targetRuleChainId: {entityType: EntityType.RULE_CHAIN, id: destNode.targetRuleChainId},
- additionalInfo: destNode.additionalInfo ? destNode.additionalInfo : {}
- } as RuleChainConnectionInfo;
- ruleChainConnection.additionalInfo.layoutX = Math.round(destNode.x);
- ruleChainConnection.additionalInfo.layoutY = Math.round(destNode.y);
- ruleChainConnection.additionalInfo.ruleChainNodeId = destNode.id;
- edge.labels.forEach((label) => {
- const newRuleChainConnection = deepClone(ruleChainConnection);
- newRuleChainConnection.type = label;
- ruleChainMetaData.ruleChainConnections.push(newRuleChainConnection);
- });
- } else {
- const toIndex = nodes.indexOf(destNode);
- const nodeConnection = {
- fromIndex,
- toIndex
- } as NodeConnectionInfo;
- edge.labels.forEach((label) => {
- const newNodeConnection = deepClone(nodeConnection);
- newNodeConnection.type = label;
- ruleChainMetaData.connections.push(newNodeConnection);
- });
- }
+ const toIndex = nodes.indexOf(destNode);
+ const nodeConnection = {
+ fromIndex,
+ toIndex
+ } as NodeConnectionInfo;
+ edge.labels.forEach((label) => {
+ const newNodeConnection = deepClone(nodeConnection);
+ newNodeConnection.type = label;
+ ruleChainMetaData.connections.push(newNodeConnection);
+ });
}
});
- this.ruleChainService.saveAndGetResolvedRuleChainMetadata(ruleChainMetaData).subscribe((savedRuleChainMetaData) => {
+ this.ruleChainService.saveRuleChainMetadata(ruleChainMetaData).subscribe((savedRuleChainMetaData) => {
this.ruleChainMetaData = savedRuleChainMetaData;
if (this.isImport) {
this.isDirtyValue = false;
@@ -1346,7 +1268,8 @@ export class RuleChainPageComponent extends PageComponent
);
}
- addRuleNodeLink(link: FcRuleEdge, labels: {[label: string]: LinkLabel}, allowCustomLabels: boolean): Observable
{
+ addRuleNodeLink(link: FcRuleEdge, labels: {[label: string]: LinkLabel},
+ allowCustomLabels: boolean, sourceRuleChainId: string): Observable {
return this.dialog.open(AddRuleNodeLinkDialogComponent, {
disableClose: true,
@@ -1354,7 +1277,8 @@ export class RuleChainPageComponent extends PageComponent
data: {
link,
labels,
- allowCustomLabels
+ allowCustomLabels,
+ sourceRuleChainId
}
}).afterClosed();
}
@@ -1384,7 +1308,7 @@ export class RuleChainPageComponent extends PageComponent
}
);
const content = '
-
-
+
diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts
index ce7ff340d5..6825f7b5ff 100644
--- a/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts
+++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts
@@ -20,6 +20,7 @@ import { FcNodeComponent } from 'ngx-flowchart';
import { FcRuleNode, RuleNodeType } from '@shared/models/rule-node.models';
import { Router } from '@angular/router';
import { RuleChainType } from '@app/shared/models/rule-chain.models';
+import { TranslateService } from '@ngx-translate/core';
@Component({
// tslint:disable-next-line:component-selector
@@ -33,6 +34,7 @@ export class RuleNodeComponent extends FcNodeComponent implements OnInit {
RuleNodeType = RuleNodeType;
constructor(private sanitizer: DomSanitizer,
+ private translate: TranslateService,
private router: Router) {
super();
}
@@ -48,13 +50,48 @@ export class RuleNodeComponent extends FcNodeComponent implements OnInit {
if ($event) {
$event.stopPropagation();
}
- if (node.targetRuleChainId) {
+ if (node.configuration?.ruleChainId) {
if (node.ruleChainType === RuleChainType.EDGE) {
- this.router.navigateByUrl(`/edgeManagement/ruleChains/${node.targetRuleChainId}`);
+ this.router.navigateByUrl(`/edgeManagement/ruleChains/${node.configuration?.ruleChainId}`);
} else {
- this.router.navigateByUrl(`/ruleChains/${node.targetRuleChainId}`);
+ this.router.navigateByUrl(`/ruleChains/${node.configuration?.ruleChainId}`);
}
}
}
+
+ displayOpenRuleChainTooltip($event: MouseEvent, node: FcRuleNode) {
+ if ($event) {
+ $event.stopPropagation();
+ }
+ this.userNodeCallbacks.mouseLeave($event, node);
+ const tooltipContent = '
';
+ const element = $($event.target);
+ element.tooltipster(
+ {
+ theme: 'tooltipster-shadow',
+ delay: 100,
+ trigger: 'custom',
+ triggerOpen: {
+ click: false,
+ tap: false
+ },
+ triggerClose: {
+ click: true,
+ tap: true,
+ scroll: true,
+ mouseleave: true
+ },
+ side: 'top',
+ distance: 12,
+ trackOrigin: true
+ }
+ );
+ const tooltip = element.tooltipster('instance');
+ const contentElement = $(tooltipContent);
+ tooltip.content(contentElement);
+ tooltip.open();
+ }
}
diff --git a/ui-ngx/src/app/shared/models/component-descriptor.models.ts b/ui-ngx/src/app/shared/models/component-descriptor.models.ts
index e266113848..068a902b18 100644
--- a/ui-ngx/src/app/shared/models/component-descriptor.models.ts
+++ b/ui-ngx/src/app/shared/models/component-descriptor.models.ts
@@ -21,7 +21,8 @@ export enum ComponentType {
FILTER = 'FILTER',
TRANSFORMATION = 'TRANSFORMATION',
ACTION = 'ACTION',
- EXTERNAL = 'EXTERNAL'
+ EXTERNAL = 'EXTERNAL',
+ FLOW = 'FLOW'
}
export enum ComponentScope {
diff --git a/ui-ngx/src/app/shared/models/rule-chain.models.ts b/ui-ngx/src/app/shared/models/rule-chain.models.ts
index 925ad0b432..61f70bfcb6 100644
--- a/ui-ngx/src/app/shared/models/rule-chain.models.ts
+++ b/ui-ngx/src/app/shared/models/rule-chain.models.ts
@@ -38,17 +38,11 @@ export interface RuleChainMetaData {
firstNodeIndex?: number;
nodes: Array
;
connections: Array;
- ruleChainConnections: Array;
-}
-
-export interface ResolvedRuleChainMetaData extends RuleChainMetaData {
- targetRuleChainsMap: {[ruleChainId: string]: RuleChain};
}
export interface RuleChainImport {
ruleChain: RuleChain;
metadata: RuleChainMetaData;
- resolvedMetadata?: ResolvedRuleChainMetaData;
}
export interface NodeConnectionInfo {
@@ -57,39 +51,16 @@ export interface NodeConnectionInfo {
type: string;
}
-export interface RuleChainConnectionInfo {
- fromIndex: number;
- targetRuleChainId: RuleChainId;
- additionalInfo: any;
- type: string;
-}
-
export const ruleNodeTypeComponentTypes: ComponentType[] =
[
ComponentType.FILTER,
ComponentType.ENRICHMENT,
ComponentType.TRANSFORMATION,
ComponentType.ACTION,
- ComponentType.EXTERNAL
+ ComponentType.EXTERNAL,
+ ComponentType.FLOW
];
-export const ruleChainNodeComponent: RuleNodeComponentDescriptor = {
- type: RuleNodeType.RULE_CHAIN,
- name: 'rule chain',
- clazz: 'tb.internal.RuleChain',
- configurationDescriptor: {
- nodeDefinition: {
- description: '',
- details: 'Forwards incoming messages to specified Rule Chain',
- inEnabled: true,
- outEnabled: false,
- relationTypes: [],
- customRelations: false,
- defaultConfiguration: {}
- }
- }
-};
-
export const unknownNodeComponent: RuleNodeComponentDescriptor = {
type: RuleNodeType.UNKNOWN,
name: 'unknown',
diff --git a/ui-ngx/src/app/shared/models/rule-node.models.ts b/ui-ngx/src/app/shared/models/rule-node.models.ts
index 097f8b2edc..ce2563826f 100644
--- a/ui-ngx/src/app/shared/models/rule-node.models.ts
+++ b/ui-ngx/src/app/shared/models/rule-node.models.ts
@@ -52,6 +52,7 @@ export interface RuleNodeDefinition {
outEnabled: boolean;
relationTypes: string[];
customRelations: boolean;
+ ruleChainNode?: boolean;
defaultConfiguration: RuleNodeConfiguration;
icon?: string;
iconUrl?: string;
@@ -67,6 +68,8 @@ export interface RuleNodeConfigurationDescriptor {
export interface IRuleNodeConfigurationComponent {
ruleNodeId: string;
+ ruleChainId: string;
+ ruleChainType: RuleChainType;
configuration: RuleNodeConfiguration;
configurationChanged: Observable;
validate();
@@ -74,11 +77,16 @@ export interface IRuleNodeConfigurationComponent {
}
@Directive()
+// tslint:disable-next-line:directive-class-suffix
export abstract class RuleNodeConfigurationComponent extends PageComponent implements
IRuleNodeConfigurationComponent, OnInit, AfterViewInit {
ruleNodeId: string;
+ ruleChainId: string;
+
+ ruleChainType: RuleChainType;
+
configurationValue: RuleNodeConfiguration;
private configurationSet = false;
@@ -184,7 +192,7 @@ export enum RuleNodeType {
TRANSFORMATION = 'TRANSFORMATION',
ACTION = 'ACTION',
EXTERNAL = 'EXTERNAL',
- RULE_CHAIN = 'RULE_CHAIN',
+ FLOW = 'FLOW',
UNKNOWN = 'UNKNOWN',
INPUT = 'INPUT'
}
@@ -195,7 +203,7 @@ export const ruleNodeTypesLibrary = [
RuleNodeType.TRANSFORMATION,
RuleNodeType.ACTION,
RuleNodeType.EXTERNAL,
- RuleNodeType.RULE_CHAIN,
+ RuleNodeType.FLOW,
];
export interface RuleNodeTypeDescriptor {
@@ -260,12 +268,12 @@ export const ruleNodeTypeDescriptors = new Map