Commit 7b1a39fb68f153daf2f48c7aa7198d4deaab95d3
1 parent
68a943e2
Rule Chain hover and select improvements.
Showing
5 changed files
with
62 additions
and
9 deletions
... | ... | @@ -1177,6 +1177,7 @@ export default angular.module('thingsboard.locale', []) |
1177 | 1177 | "type": "Type", |
1178 | 1178 | "description": "Description", |
1179 | 1179 | "delete": "Delete rule node", |
1180 | + "delete-selected-objects": "Delete selected nodes and connections", | |
1180 | 1181 | "rulenode-details": "Rule node details", |
1181 | 1182 | "debug-mode": "Debug mode", |
1182 | 1183 | "configuration": "Configuration", | ... | ... |
... | ... | @@ -81,6 +81,9 @@ export function RuleChainController($stateParams, $scope, $compile, $q, $mdUtil, |
81 | 81 | vm.saveRuleChain = saveRuleChain; |
82 | 82 | vm.revertRuleChain = revertRuleChain; |
83 | 83 | |
84 | + vm.objectsSelected = objectsSelected; | |
85 | + vm.deleteSelected = deleteSelected; | |
86 | + | |
84 | 87 | vm.keyDown = function (evt) { |
85 | 88 | if (evt.keyCode === ctrlKeyCode) { |
86 | 89 | vm.ctrlDown = true; |
... | ... | @@ -632,6 +635,14 @@ export function RuleChainController($stateParams, $scope, $compile, $q, $mdUtil, |
632 | 635 | }); |
633 | 636 | } |
634 | 637 | |
638 | + function objectsSelected() { | |
639 | + return vm.modelservice.nodes.getSelectedNodes().length > 0 || | |
640 | + vm.modelservice.edges.getSelectedEdges().length > 0 | |
641 | + } | |
642 | + | |
643 | + function deleteSelected() { | |
644 | + vm.modelservice.deleteSelected(); | |
645 | + } | |
635 | 646 | } |
636 | 647 | |
637 | 648 | /*@ngInject*/ | ... | ... |
... | ... | @@ -121,10 +121,6 @@ |
121 | 121 | .fc-node { |
122 | 122 | z-index: 1; |
123 | 123 | outline: none; |
124 | - &.fc-hover, &.fc-selected { | |
125 | - -webkit-filter: brightness(70%); | |
126 | - filter: brightness(70%); | |
127 | - } | |
128 | 124 | &.fc-dragging { |
129 | 125 | z-index: 10; |
130 | 126 | } |
... | ... | @@ -132,6 +128,26 @@ |
132 | 128 | padding: 0 15px; |
133 | 129 | text-align: center; |
134 | 130 | } |
131 | + .fc-node-overlay { | |
132 | + position: absolute; | |
133 | + pointer-events: none; | |
134 | + left: 0; | |
135 | + top: 0; | |
136 | + right: 0; | |
137 | + bottom: 0; | |
138 | + background-color: #000; | |
139 | + opacity: 0; | |
140 | + } | |
141 | + &.fc-hover { | |
142 | + .fc-node-overlay { | |
143 | + opacity: 0.25; | |
144 | + } | |
145 | + } | |
146 | + &.fc-selected { | |
147 | + .fc-node-overlay { | |
148 | + opacity: 0.25; | |
149 | + } | |
150 | + } | |
135 | 151 | } |
136 | 152 | |
137 | 153 | .fc-leftConnectors, .fc-rightConnectors { |
... | ... | @@ -181,6 +197,7 @@ |
181 | 197 | stroke: gray; |
182 | 198 | stroke-width: 4; |
183 | 199 | fill: transparent; |
200 | + transition: stroke-width .2s; | |
184 | 201 | &.fc-selected { |
185 | 202 | stroke: red; |
186 | 203 | stroke-width: 4; |
... | ... | @@ -232,20 +249,29 @@ |
232 | 249 | .fc-edge-label { |
233 | 250 | position: absolute; |
234 | 251 | user-select: none; |
235 | - pointer-events: none; | |
252 | + transition: transform .2s; | |
236 | 253 | opacity: 0.8; |
254 | + &.fc-hover { | |
255 | + transform: scale(1.25); | |
256 | + } | |
257 | + &.fc-selected { | |
258 | + .fc-edge-label-text { | |
259 | + span { | |
260 | + border: solid red; | |
261 | + color: red; | |
262 | + } | |
263 | + } | |
264 | + } | |
237 | 265 | } |
238 | 266 | |
239 | 267 | .fc-edge-label-text { |
240 | 268 | position: absolute; |
241 | - left: 50%; | |
242 | - -webkit-transform: translateX(-50%); | |
243 | - transform: translateX(-50%); | |
269 | + -webkit-transform: translate(-50%, -50%); | |
270 | + transform: translate(-50%, -50%); | |
244 | 271 | white-space: nowrap; |
245 | 272 | text-align: center; |
246 | 273 | font-size: 14px; |
247 | 274 | font-weight: 600; |
248 | - top: 5px; | |
249 | 275 | span { |
250 | 276 | border: solid 2px #003a79; |
251 | 277 | border-radius: 10px; |
... | ... | @@ -255,6 +281,13 @@ |
255 | 281 | } |
256 | 282 | } |
257 | 283 | |
284 | +.fc-select-rectangle { | |
285 | + border: 2px dashed #5262ff; | |
286 | + position: absolute; | |
287 | + background: rgba(20,125,255,0.1); | |
288 | + z-index: 2; | |
289 | +} | |
290 | + | |
258 | 291 | @keyframes dash { |
259 | 292 | from { |
260 | 293 | stroke-dashoffset: 500; | ... | ... |
... | ... | @@ -112,6 +112,13 @@ |
112 | 112 | </tb-details-sidenav> |
113 | 113 | </section> |
114 | 114 | <section layout="row" layout-wrap class="tb-footer-buttons md-fab" layout-align="start end"> |
115 | + <md-button ng-disabled="$root.loading" ng-show="vm.objectsSelected()" class="tb-btn-footer md-accent md-hue-2 md-fab" | |
116 | + ng-click="vm.deleteSelected()" aria-label="{{ 'action.delete' | translate }}"> | |
117 | + <md-tooltip md-direction="top"> | |
118 | + {{ 'rulenode.delete-selected-objects' | translate }} | |
119 | + </md-tooltip> | |
120 | + <ng-md-icon icon="delete"></ng-md-icon> | |
121 | + </md-button> | |
115 | 122 | <md-button ng-disabled="$root.loading || !vm.isDirty" |
116 | 123 | class="tb-btn-footer md-accent md-hue-2 md-fab" |
117 | 124 | aria-label="{{ 'action.apply' | translate }}" | ... | ... |
... | ... | @@ -22,6 +22,7 @@ |
22 | 22 | ng-mousedown="callbacks.mouseDown($event, node)" |
23 | 23 | ng-mouseenter="callbacks.mouseEnter($event, node)" |
24 | 24 | ng-mouseleave="callbacks.mouseLeave($event, node)"> |
25 | + <div class="{{flowchartConstants.nodeOverlayClass}}"></div> | |
25 | 26 | <div class="tb-rule-node {{node.nodeClass}}"> |
26 | 27 | <md-icon aria-label="node-type-icon" flex="15" |
27 | 28 | class="material-icons">{{node.icon}}</md-icon> | ... | ... |