Showing
7 changed files
with
392 additions
and
9 deletions
... | ... | @@ -1407,12 +1407,14 @@ |
1407 | 1407 | "balanced-match": { |
1408 | 1408 | "version": "1.0.0", |
1409 | 1409 | "bundled": true, |
1410 | - "dev": true | |
1410 | + "dev": true, | |
1411 | + "optional": true | |
1411 | 1412 | }, |
1412 | 1413 | "brace-expansion": { |
1413 | 1414 | "version": "1.1.11", |
1414 | 1415 | "bundled": true, |
1415 | 1416 | "dev": true, |
1417 | + "optional": true, | |
1416 | 1418 | "requires": { |
1417 | 1419 | "balanced-match": "^1.0.0", |
1418 | 1420 | "concat-map": "0.0.1" |
... | ... | @@ -1427,17 +1429,20 @@ |
1427 | 1429 | "code-point-at": { |
1428 | 1430 | "version": "1.1.0", |
1429 | 1431 | "bundled": true, |
1430 | - "dev": true | |
1432 | + "dev": true, | |
1433 | + "optional": true | |
1431 | 1434 | }, |
1432 | 1435 | "concat-map": { |
1433 | 1436 | "version": "0.0.1", |
1434 | 1437 | "bundled": true, |
1435 | - "dev": true | |
1438 | + "dev": true, | |
1439 | + "optional": true | |
1436 | 1440 | }, |
1437 | 1441 | "console-control-strings": { |
1438 | 1442 | "version": "1.1.0", |
1439 | 1443 | "bundled": true, |
1440 | - "dev": true | |
1444 | + "dev": true, | |
1445 | + "optional": true | |
1441 | 1446 | }, |
1442 | 1447 | "core-util-is": { |
1443 | 1448 | "version": "1.0.2", |
... | ... | @@ -1554,7 +1559,8 @@ |
1554 | 1559 | "inherits": { |
1555 | 1560 | "version": "2.0.3", |
1556 | 1561 | "bundled": true, |
1557 | - "dev": true | |
1562 | + "dev": true, | |
1563 | + "optional": true | |
1558 | 1564 | }, |
1559 | 1565 | "ini": { |
1560 | 1566 | "version": "1.3.5", |
... | ... | @@ -1566,6 +1572,7 @@ |
1566 | 1572 | "version": "1.0.0", |
1567 | 1573 | "bundled": true, |
1568 | 1574 | "dev": true, |
1575 | + "optional": true, | |
1569 | 1576 | "requires": { |
1570 | 1577 | "number-is-nan": "^1.0.0" |
1571 | 1578 | } |
... | ... | @@ -1580,6 +1587,7 @@ |
1580 | 1587 | "version": "3.0.4", |
1581 | 1588 | "bundled": true, |
1582 | 1589 | "dev": true, |
1590 | + "optional": true, | |
1583 | 1591 | "requires": { |
1584 | 1592 | "brace-expansion": "^1.1.7" |
1585 | 1593 | } |
... | ... | @@ -1691,7 +1699,8 @@ |
1691 | 1699 | "number-is-nan": { |
1692 | 1700 | "version": "1.0.1", |
1693 | 1701 | "bundled": true, |
1694 | - "dev": true | |
1702 | + "dev": true, | |
1703 | + "optional": true | |
1695 | 1704 | }, |
1696 | 1705 | "object-assign": { |
1697 | 1706 | "version": "4.1.1", |
... | ... | @@ -1703,6 +1712,7 @@ |
1703 | 1712 | "version": "1.4.0", |
1704 | 1713 | "bundled": true, |
1705 | 1714 | "dev": true, |
1715 | + "optional": true, | |
1706 | 1716 | "requires": { |
1707 | 1717 | "wrappy": "1" |
1708 | 1718 | } |
... | ... | @@ -1824,6 +1834,7 @@ |
1824 | 1834 | "version": "1.0.2", |
1825 | 1835 | "bundled": true, |
1826 | 1836 | "dev": true, |
1837 | + "optional": true, | |
1827 | 1838 | "requires": { |
1828 | 1839 | "code-point-at": "^1.0.0", |
1829 | 1840 | "is-fullwidth-code-point": "^1.0.0", | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2019 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | +:host ::ng-deep { | |
17 | + .fc-canvas { | |
18 | + .fc-node { | |
19 | + border-radius: 8px; | |
20 | + &.fc-selected { | |
21 | + &:not(.fc-edit) { | |
22 | + margin: -3px; | |
23 | + border: solid 3px #f00; | |
24 | + } | |
25 | + } | |
26 | + } | |
27 | + | |
28 | + .fc-edit { | |
29 | + .fc-nodeedit, | |
30 | + .fc-nodedelete { | |
31 | + border: solid 2px #fff; | |
32 | + background: #f83e05; | |
33 | + outline: none; | |
34 | + } | |
35 | + } | |
36 | + | |
37 | + .fc-arrow-marker { | |
38 | + polygon { | |
39 | + fill: #808080; | |
40 | + stroke: #808080; | |
41 | + } | |
42 | + } | |
43 | + | |
44 | + .fc-arrow-marker-selected { | |
45 | + polygon { | |
46 | + fill: #f00; | |
47 | + stroke: #f00; | |
48 | + } | |
49 | + } | |
50 | + | |
51 | + .fc-edge { | |
52 | + outline: none; | |
53 | + stroke: #808080; | |
54 | + | |
55 | + &.fc-selected { | |
56 | + stroke: #f00; | |
57 | + } | |
58 | + | |
59 | + &.fc-hover { | |
60 | + stroke: #808080; | |
61 | + } | |
62 | + } | |
63 | + | |
64 | + .edge-endpoint { | |
65 | + fill: #808080; | |
66 | + } | |
67 | + | |
68 | + .fc-edge-label { | |
69 | + opacity: 1 !important; | |
70 | + &:focus { | |
71 | + outline: 0; | |
72 | + } | |
73 | + | |
74 | + &.fc-selected { | |
75 | + .fc-edge-label-text { | |
76 | + span { | |
77 | + color: #fff !important; | |
78 | + background-color: #f00 !important; | |
79 | + border: solid #f00 !important; | |
80 | + } | |
81 | + } | |
82 | + } | |
83 | + | |
84 | + .fc-edge-label-text { | |
85 | + font-size: 14px !important; | |
86 | + font-weight: 600 !important; | |
87 | + | |
88 | + span { | |
89 | + background-color: #fff !important; | |
90 | + color: #003a79 !important; | |
91 | + border: solid 2px #003a79 !important; | |
92 | + } | |
93 | + } | |
94 | + } | |
95 | + } | |
96 | +} | ... | ... |
... | ... | @@ -39,7 +39,7 @@ import { RuleChainService } from '@core/http/rule-chain.service'; |
39 | 39 | @Component({ |
40 | 40 | selector: 'tb-rulechain-page', |
41 | 41 | templateUrl: './rulechain-page.component.html', |
42 | - styleUrls: [] | |
42 | + styleUrls: ['./rulechain-page.component.scss'] | |
43 | 43 | }) |
44 | 44 | export class RuleChainPageComponent extends PageComponent implements OnInit, HasDirtyFlag { |
45 | 45 | ... | ... |
... | ... | @@ -22,16 +22,28 @@ import {RuleChainRoutingModule} from '@modules/home/pages/rulechain/rulechain-ro |
22 | 22 | import {HomeComponentsModule} from '@modules/home/components/home-components.module'; |
23 | 23 | import { RuleChainTabsComponent } from '@home/pages/rulechain/rulechain-tabs.component'; |
24 | 24 | import { RuleChainPageComponent } from './rulechain-page.component'; |
25 | +import { RuleNodeComponent } from '@home/pages/rulechain/rulenode.component'; | |
26 | +import { FC_NODE_COMPONENT_CONFIG } from 'ngx-flowchart/dist/ngx-flowchart'; | |
25 | 27 | |
26 | 28 | @NgModule({ |
27 | 29 | entryComponents: [ |
28 | 30 | RuleChainComponent, |
29 | - RuleChainTabsComponent | |
31 | + RuleChainTabsComponent, | |
32 | + RuleNodeComponent | |
30 | 33 | ], |
31 | 34 | declarations: [ |
32 | 35 | RuleChainComponent, |
33 | 36 | RuleChainTabsComponent, |
34 | - RuleChainPageComponent | |
37 | + RuleChainPageComponent, | |
38 | + RuleNodeComponent | |
39 | + ], | |
40 | + providers: [ | |
41 | + { | |
42 | + provide: FC_NODE_COMPONENT_CONFIG, | |
43 | + useValue: { | |
44 | + nodeComponentType: RuleNodeComponent | |
45 | + } | |
46 | + } | |
35 | 47 | ], |
36 | 48 | imports: [ |
37 | 49 | CommonModule, | ... | ... |
1 | +<!-- | |
2 | + | |
3 | + Copyright © 2016-2019 The Thingsboard Authors | |
4 | + | |
5 | + Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | + you may not use this file except in compliance with the License. | |
7 | + You may obtain a copy of the License at | |
8 | + | |
9 | + http://www.apache.org/licenses/LICENSE-2.0 | |
10 | + | |
11 | + Unless required by applicable law or agreed to in writing, software | |
12 | + distributed under the License is distributed on an "AS IS" BASIS, | |
13 | + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | + See the License for the specific language governing permissions and | |
15 | + limitations under the License. | |
16 | + | |
17 | +--> | |
18 | +<div | |
19 | + (dblclick)="userNodeCallbacks.doubleClick($event, node)" | |
20 | + (mousedown)="userNodeCallbacks.mouseDown($event, node)" | |
21 | + (mouseenter)="userNodeCallbacks.mouseEnter($event, node)" | |
22 | + (mouseleave)="userNodeCallbacks.mouseLeave($event, node)"> | |
23 | + <div class="{{flowchartConstants.nodeOverlayClass}}"></div> | |
24 | + <div class="tb-rule-node {{node.nodeClass}}" [ngClass]="{'tb-rule-node-highlighted' : node.highlighted, 'tb-rule-node-invalid': node.error }"> | |
25 | + <mat-icon *ngIf="!node.iconUrl" fxFlex="15">{{node.icon}}</mat-icon> | |
26 | + <img *ngIf="node.iconUrl" fxFlex="15" src="{{node.iconUrl}}"/> | |
27 | + <div fxLayout="column" fxFlex="85" fxLayoutAlign="center"> | |
28 | + <span class="tb-node-type">{{ node.component.name }}</span> | |
29 | + <span class="tb-node-title" *ngIf="node.name">{{ node.name }}</span> | |
30 | + </div> | |
31 | + <div class="{{flowchartConstants.leftConnectorClass}}"> | |
32 | + <div fc-magnet [connector]="connector" [callbacks]="callbacks" | |
33 | + *ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)"> | |
34 | + <div fc-connector [connector]="connector" | |
35 | + [mouseOverConnector]="mouseOverConnector" | |
36 | + [callbacks]="callbacks" | |
37 | + [modelservice]="modelservice"></div> | |
38 | + </div> | |
39 | + </div> | |
40 | + <div class="{{flowchartConstants.rightConnectorClass}}"> | |
41 | + <div fc-magnet [connector]="connector" [callbacks]="callbacks" | |
42 | + *ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)"> | |
43 | + <div fc-connector [connector]="connector" | |
44 | + [mouseOverConnector]="mouseOverConnector" | |
45 | + [callbacks]="callbacks" | |
46 | + [modelservice]="modelservice"></div> | |
47 | + </div> | |
48 | + </div> | |
49 | + </div> | |
50 | + <div *ngIf="modelservice.isEditable() && !node.readonly" class="fc-nodeedit" (click)="userNodeCallbacks.nodeEdit($event, node)"> | |
51 | + <i class="fa fa-pencil" aria-hidden="true"></i> | |
52 | + </div> | |
53 | + <div *ngIf="modelservice.isEditable() && !node.readonly" class="fc-nodedelete" (click)="modelservice.nodes.delete(node)"> | |
54 | + × | |
55 | + </div> | |
56 | +</div> | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2019 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | + | |
17 | +:host { | |
18 | + | |
19 | + .fc-node-overlay { | |
20 | + position: absolute; | |
21 | + pointer-events: none; | |
22 | + left: 0; | |
23 | + top: 0; | |
24 | + right: 0; | |
25 | + bottom: 0; | |
26 | + background-color: #000; | |
27 | + border-radius: 5px; | |
28 | + opacity: 0; | |
29 | + } | |
30 | + | |
31 | + :host-context(.fc-hover) .fc-node-overlay { | |
32 | + opacity: 0.25; | |
33 | + transition: opacity .2s; | |
34 | + } | |
35 | + | |
36 | + :host-context(.fc-selected) .fc-node-overlay { | |
37 | + opacity: 0.25; | |
38 | + } | |
39 | + | |
40 | + :host-context(.fc-edit) { | |
41 | + .fc-nodeedit, | |
42 | + .fc-nodedelete { | |
43 | + border: solid 2px #fff; | |
44 | + background: #f83e05; | |
45 | + outline: none; | |
46 | + } | |
47 | + } | |
48 | + | |
49 | + .tb-rule-node { | |
50 | + display: flex; | |
51 | + flex-direction: row; | |
52 | + min-width: 150px; | |
53 | + max-width: 150px; | |
54 | + height: 32px; | |
55 | + min-height: 32px; | |
56 | + max-height: 32px; | |
57 | + padding: 5px 10px; | |
58 | + font-size: 12px; | |
59 | + line-height: 16px; | |
60 | + color: #333; | |
61 | + pointer-events: none; | |
62 | + background-color: #f15b26; | |
63 | + border: solid 1px #777; | |
64 | + border-radius: 5px; | |
65 | + | |
66 | + &.tb-filter-type { | |
67 | + background-color: #f1e861; | |
68 | + } | |
69 | + | |
70 | + &.tb-enrichment-type { | |
71 | + background-color: #cdf14e; | |
72 | + } | |
73 | + | |
74 | + &.tb-transformation-type { | |
75 | + background-color: #79cef1; | |
76 | + } | |
77 | + | |
78 | + &.tb-action-type { | |
79 | + background-color: #f1928f; | |
80 | + } | |
81 | + | |
82 | + &.tb-external-type { | |
83 | + background-color: #fbc766; | |
84 | + } | |
85 | + | |
86 | + &.tb-rule-chain-type { | |
87 | + background-color: #d6c4f1; | |
88 | + } | |
89 | + | |
90 | + &.tb-unknown-type { | |
91 | + background-color: #f16c29; | |
92 | + } | |
93 | + | |
94 | + &.tb-rule-node-highlighted:not(.tb-rule-node-invalid) { | |
95 | + box-shadow: 0 0 10px 6px #51cbee; | |
96 | + | |
97 | + .tb-node-title { | |
98 | + font-weight: 700; | |
99 | + text-decoration: underline; | |
100 | + } | |
101 | + } | |
102 | + | |
103 | + &.tb-rule-node-invalid { | |
104 | + box-shadow: 0 0 10px 6px #ff5c50; | |
105 | + } | |
106 | + | |
107 | + &.tb-input-type { | |
108 | + user-select: none; | |
109 | + background-color: #a3eaa9; | |
110 | + } | |
111 | + | |
112 | + mat-icon, img { | |
113 | + margin: auto; | |
114 | + width: 20px; | |
115 | + min-width: 20px; | |
116 | + height: 20px; | |
117 | + min-height: 20px; | |
118 | + padding-right: 4px; | |
119 | + font-size: 20px; | |
120 | + } | |
121 | + | |
122 | + .tb-node-title { | |
123 | + font-weight: 500; | |
124 | + } | |
125 | + | |
126 | + .tb-node-type, | |
127 | + .tb-node-title { | |
128 | + overflow: hidden; | |
129 | + text-overflow: ellipsis; | |
130 | + white-space: nowrap; | |
131 | + } | |
132 | + .fc-leftConnectors, | |
133 | + .fc-rightConnectors { | |
134 | + position: absolute; | |
135 | + top: 0; | |
136 | + | |
137 | + z-index: 0; | |
138 | + | |
139 | + display: flex; | |
140 | + flex-direction: column; | |
141 | + height: 100%; | |
142 | + | |
143 | + .fc-magnet { | |
144 | + align-items: center; | |
145 | + } | |
146 | + } | |
147 | + | |
148 | + .fc-leftConnectors { | |
149 | + left: -20px; | |
150 | + } | |
151 | + | |
152 | + .fc-rightConnectors { | |
153 | + right: -20px; | |
154 | + } | |
155 | + | |
156 | + .fc-magnet { | |
157 | + display: flex; | |
158 | + flex-grow: 1; | |
159 | + justify-content: center; | |
160 | + height: 60px; | |
161 | + } | |
162 | + | |
163 | + .fc-connector { | |
164 | + width: 14px; | |
165 | + height: 14px; | |
166 | + margin: 10px; | |
167 | + pointer-events: all; | |
168 | + background-color: #ccc; | |
169 | + border: 1px solid #333; | |
170 | + border-radius: 5px; | |
171 | + } | |
172 | + | |
173 | + .fc-connector.fc-hover { | |
174 | + background-color: #000; | |
175 | + } | |
176 | + } | |
177 | +} | ... | ... |
1 | +/// | |
2 | +/// Copyright © 2016-2019 The Thingsboard Authors | |
3 | +/// | |
4 | +/// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | +/// you may not use this file except in compliance with the License. | |
6 | +/// You may obtain a copy of the License at | |
7 | +/// | |
8 | +/// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | +/// | |
10 | +/// Unless required by applicable law or agreed to in writing, software | |
11 | +/// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | +/// See the License for the specific language governing permissions and | |
14 | +/// limitations under the License. | |
15 | +/// | |
16 | + | |
17 | +import { Component } from '@angular/core'; | |
18 | +import { FcNodeComponent } from 'ngx-flowchart/dist/ngx-flowchart'; | |
19 | + | |
20 | +@Component({ | |
21 | + selector: 'rule-node', | |
22 | + templateUrl: './rulenode.component.html', | |
23 | + styleUrls: ['./rulenode.component.scss'] | |
24 | +}) | |
25 | +export class RuleNodeComponent extends FcNodeComponent { | |
26 | + | |
27 | + constructor() { | |
28 | + super(); | |
29 | + } | |
30 | + | |
31 | +} | ... | ... |