GUI -- Implemented Show/Hide Offline devices & Show/Hide Hosts (also used Flash Service).
- added 'toggle(cb)' to panel API. - deferred keybindings to allow direct reference to sub-API functions. - re-implemented tick() function. - added 'list scenarios' command to mockserver. Change-Id: I1cc0009266e1015747b1d8106bd1f088adb2feb5
Showing
12 changed files
with
210 additions
and
105 deletions
... | @@ -71,6 +71,7 @@ | ... | @@ -71,6 +71,7 @@ |
71 | api = { | 71 | api = { |
72 | show: showPanel, | 72 | show: showPanel, |
73 | hide: hidePanel, | 73 | hide: hidePanel, |
74 | + toggle: togglePanel, | ||
74 | empty: emptyPanel, | 75 | empty: emptyPanel, |
75 | append: appendPanel, | 76 | append: appendPanel, |
76 | width: panelWidth, | 77 | width: panelWidth, |
... | @@ -111,6 +112,14 @@ | ... | @@ -111,6 +112,14 @@ |
111 | .style('opacity', 0); | 112 | .style('opacity', 0); |
112 | } | 113 | } |
113 | 114 | ||
115 | + function togglePanel(cb) { | ||
116 | + if (p.on) { | ||
117 | + hidePanel(cb); | ||
118 | + } else { | ||
119 | + showPanel(cb); | ||
120 | + } | ||
121 | + } | ||
122 | + | ||
114 | function emptyPanel() { | 123 | function emptyPanel() { |
115 | return p.el.html(''); | 124 | return p.el.html(''); |
116 | } | 125 | } | ... | ... |
... | @@ -141,7 +141,7 @@ | ... | @@ -141,7 +141,7 @@ |
141 | lightMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'], | 141 | lightMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'], |
142 | 142 | ||
143 | darkNorm = ['#304860', '#664631', '#A8391B', '#00754B', '#77206D', '#005959', '#428700'], | 143 | darkNorm = ['#304860', '#664631', '#A8391B', '#00754B', '#77206D', '#005959', '#428700'], |
144 | - darkMute = ['#16203A', '#281810', '#4F1206', '#00331C', '#3D063A', '#002D2D', '#1B4400']; | 144 | + darkMute = ['#304860', '#664631', '#A8391B', '#00754B', '#77206D', '#005959', '#428700']; |
145 | 145 | ||
146 | var colors= { | 146 | var colors= { |
147 | light: { | 147 | light: { | ... | ... |
... | @@ -36,73 +36,59 @@ | ... | @@ -36,73 +36,59 @@ |
36 | // Internal state | 36 | // Internal state |
37 | var zoomer; | 37 | var zoomer; |
38 | 38 | ||
39 | - // Note: "exported" state should be properties on 'self' variable | ||
40 | - | ||
41 | // --- Short Cut Keys ------------------------------------------------ | 39 | // --- Short Cut Keys ------------------------------------------------ |
42 | 40 | ||
43 | - var keyBindings = { | 41 | + function setUpKeys() { |
44 | - //O: [toggleSummary, 'Toggle ONOS summary pane'], | 42 | + // key bindings need to be made after the services have been injected |
45 | - I: [toggleInstances, 'Toggle ONOS instances pane'], | 43 | + // thus, deferred to here... |
46 | - //D: [toggleDetails, 'Disable / enable details pane'], | 44 | + ks.keyBindings({ |
47 | - | 45 | + //O: [toggleSummary, 'Toggle ONOS summary pane'], |
48 | - //H: [toggleHosts, 'Toggle host visibility'], | 46 | + I: [toggleInstances, 'Toggle ONOS instances pane'], |
49 | - //M: [toggleOffline, 'Toggle offline visibility'], | 47 | + //D: [toggleDetails, 'Disable / enable details pane'], |
50 | - //B: [toggleBg, 'Toggle background image'], | 48 | + |
51 | - //P: togglePorts, | 49 | + H: [tfs.toggleHosts, 'Toggle host visibility'], |
52 | - | 50 | + M: [tfs.toggleOffline, 'Toggle offline visibility'], |
53 | - //X: [toggleNodeLock, 'Lock / unlock node positions'], | 51 | + //B: [toggleBg, 'Toggle background image'], |
54 | - //Z: [toggleOblique, 'Toggle oblique view (Experimental)'], | 52 | + //P: togglePorts, |
55 | - L: [cycleLabels, 'Cycle device labels'], | 53 | + |
56 | - //U: [unpin, 'Unpin node (hover mouse over)'], | 54 | + //X: [toggleNodeLock, 'Lock / unlock node positions'], |
57 | - R: [resetZoom, 'Reset pan / zoom'], | 55 | + //Z: [toggleOblique, 'Toggle oblique view (Experimental)'], |
58 | - | 56 | + L: [tfs.cycleDeviceLabels, 'Cycle device labels'], |
59 | - //V: [showRelatedIntentsAction, 'Show all related intents'], | 57 | + //U: [unpin, 'Unpin node (hover mouse over)'], |
60 | - //rightArrow: [showNextIntentAction, 'Show next related intent'], | 58 | + R: [resetZoom, 'Reset pan / zoom'], |
61 | - //leftArrow: [showPrevIntentAction, 'Show previous related intent'], | 59 | + |
62 | - //W: [showSelectedIntentTrafficAction, 'Monitor traffic of selected intent'], | 60 | + //V: [showRelatedIntentsAction, 'Show all related intents'], |
63 | - //A: [showAllTrafficAction, 'Monitor all traffic'], | 61 | + //rightArrow: [showNextIntentAction, 'Show next related intent'], |
64 | - //F: [showDeviceLinkFlowsAction, 'Show device link flows'], | 62 | + //leftArrow: [showPrevIntentAction, 'Show previous related intent'], |
65 | - | 63 | + //W: [showSelectedIntentTrafficAction, 'Monitor traffic of selected intent'], |
66 | - //E: [equalizeMasters, 'Equalize mastership roles'], | 64 | + //A: [showAllTrafficAction, 'Monitor all traffic'], |
67 | - | 65 | + //F: [showDeviceLinkFlowsAction, 'Show device link flows'], |
68 | - //esc: handleEscape, | 66 | + |
69 | - | 67 | + //E: [equalizeMasters, 'Equalize mastership roles'], |
70 | - _helpFormat: [ | 68 | + |
71 | - ['O', 'I', 'D', '-', 'H', 'M', 'B', 'P' ], | 69 | + //esc: handleEscape, |
72 | - ['X', 'Z', 'L', 'U', 'R' ], | 70 | + |
73 | - ['V', 'rightArrow', 'leftArrow', 'W', 'A', 'F', '-', 'E' ] | 71 | + _helpFormat: [ |
74 | - ] | 72 | + ['O', 'I', 'D', '-', 'H', 'M', 'B', 'P' ], |
75 | - | 73 | + ['X', 'Z', 'L', 'U', 'R' ], |
76 | - }; | 74 | + ['V', 'rightArrow', 'leftArrow', 'W', 'A', 'F', '-', 'E' ] |
77 | - | 75 | + ] |
78 | - // mouse gestures | 76 | + }); |
79 | - var gestures = [ | ||
80 | - ['click', 'Select the item and show details'], | ||
81 | - ['shift-click', 'Toggle selection state'], | ||
82 | - ['drag', 'Reposition (and pin) device / host'], | ||
83 | - ['cmd-scroll', 'Zoom in / out'], | ||
84 | - ['cmd-drag', 'Pan'] | ||
85 | - ]; | ||
86 | 77 | ||
87 | - function toggleInstances() { | 78 | + // TODO: // mouse gestures |
88 | - if (tis.isVisible()) { | 79 | + var gestures = [ |
89 | - tis.hide(); | 80 | + ['click', 'Select the item and show details'], |
90 | - } else { | 81 | + ['shift-click', 'Toggle selection state'], |
91 | - tis.show(); | 82 | + ['drag', 'Reposition (and pin) device / host'], |
92 | - } | 83 | + ['cmd-scroll', 'Zoom in / out'], |
93 | - tfs.updateDeviceColors(); | 84 | + ['cmd-drag', 'Pan'] |
85 | + ]; | ||
94 | } | 86 | } |
95 | 87 | ||
96 | - function cycleLabels() { | ||
97 | - $log.debug('Cycle Labels.....'); | ||
98 | - } | ||
99 | 88 | ||
100 | - function resetZoom() { | 89 | + function toggleInstances() { |
101 | - zoomer.reset(); | 90 | + tis.toggle(); |
102 | - } | 91 | + tfs.updateDeviceColors(); |
103 | - | ||
104 | - function setUpKeys() { | ||
105 | - ks.keyBindings(keyBindings); | ||
106 | } | 92 | } |
107 | 93 | ||
108 | 94 | ||
... | @@ -122,8 +108,7 @@ | ... | @@ -122,8 +108,7 @@ |
122 | } | 108 | } |
123 | 109 | ||
124 | function zoomCallback() { | 110 | function zoomCallback() { |
125 | - var tr = zoomer.translate(), | 111 | + var sc = zoomer.scale(); |
126 | - sc = zoomer.scale(); | ||
127 | 112 | ||
128 | // keep the map lines constant width while zooming | 113 | // keep the map lines constant width while zooming |
129 | mapG.style('stroke-width', (2.0 / sc) + 'px'); | 114 | mapG.style('stroke-width', (2.0 / sc) + 'px'); |
... | @@ -139,6 +124,10 @@ | ... | @@ -139,6 +124,10 @@ |
139 | }); | 124 | }); |
140 | } | 125 | } |
141 | 126 | ||
127 | + function resetZoom() { | ||
128 | + zoomer.reset(); | ||
129 | + } | ||
130 | + | ||
142 | 131 | ||
143 | // callback invoked when the SVG view has been resized.. | 132 | // callback invoked when the SVG view has been resized.. |
144 | function svgResized(dim) { | 133 | function svgResized(dim) { | ... | ... |
... | @@ -23,9 +23,7 @@ | ... | @@ -23,9 +23,7 @@ |
23 | 'use strict'; | 23 | 'use strict'; |
24 | 24 | ||
25 | // injected refs | 25 | // injected refs |
26 | - var $log, fs, sus, is, ts, tis, uplink; | 26 | + var $log, fs, sus, is, ts, flash, tis, icfg, uplink; |
27 | - | ||
28 | - var icfg; | ||
29 | 27 | ||
30 | // configuration | 28 | // configuration |
31 | var labelConfig = { | 29 | var labelConfig = { |
... | @@ -53,9 +51,9 @@ | ... | @@ -53,9 +51,9 @@ |
53 | outColor: '#f00', | 51 | outColor: '#f00', |
54 | }, | 52 | }, |
55 | dark: { | 53 | dark: { |
56 | - baseColor: '#666', | 54 | + baseColor: '#aaa', |
57 | inColor: '#66f', | 55 | inColor: '#66f', |
58 | - outColor: '#f00', | 56 | + outColor: '#f66' |
59 | }, | 57 | }, |
60 | inWidth: 12, | 58 | inWidth: 12, |
61 | outWidth: 10 | 59 | outWidth: 10 |
... | @@ -74,7 +72,9 @@ | ... | @@ -74,7 +72,9 @@ |
74 | lu = network.lookup, // shorthand | 72 | lu = network.lookup, // shorthand |
75 | deviceLabelIndex = 0, // for device label cycling | 73 | deviceLabelIndex = 0, // for device label cycling |
76 | hostLabelIndex = 0, // for host label cycling | 74 | hostLabelIndex = 0, // for host label cycling |
77 | - showHosts = 1, // whether hosts are displayed | 75 | + showHosts = true, // whether hosts are displayed |
76 | + showOffline = true, // whether offline devices are displayed | ||
77 | + oblique = false, // whether we are in the oblique view | ||
78 | width, height; | 78 | width, height; |
79 | 79 | ||
80 | // SVG elements; | 80 | // SVG elements; |
... | @@ -150,9 +150,8 @@ | ... | @@ -150,9 +150,8 @@ |
150 | } | 150 | } |
151 | updateNodes(); | 151 | updateNodes(); |
152 | if (wasOnline !== d.online) { | 152 | if (wasOnline !== d.online) { |
153 | - // TODO: re-instate link update, and offline visibility | 153 | + findAttachedLinks(d.id).forEach(restyleLinkElement); |
154 | - //findAttachedLinks(d.id).forEach(restyleLinkElement); | 154 | + updateOfflineVisibility(d); |
155 | - //updateOfflineVisibility(d); | ||
156 | } | 155 | } |
157 | } else { | 156 | } else { |
158 | // TODO: decide whether we want to capture logic errors | 157 | // TODO: decide whether we want to capture logic errors |
... | @@ -338,9 +337,8 @@ | ... | @@ -338,9 +337,8 @@ |
338 | linkScale = d3.scale.linear() | 337 | linkScale = d3.scale.linear() |
339 | .domain([1, 12]) | 338 | .domain([1, 12]) |
340 | .range([widthRatio, 12 * widthRatio]) | 339 | .range([widthRatio, 12 * widthRatio]) |
341 | - .clamp(true); | 340 | + .clamp(true), |
342 | - | 341 | + allLinkTypes = 'direct indirect optical tunnel', |
343 | - var allLinkTypes = 'direct indirect optical tunnel', | ||
344 | defaultLinkType = 'direct'; | 342 | defaultLinkType = 'direct'; |
345 | 343 | ||
346 | function restyleLinkElement(ldata) { | 344 | function restyleLinkElement(ldata) { |
... | @@ -364,6 +362,12 @@ | ... | @@ -364,6 +362,12 @@ |
364 | .attr('stroke', linkConfig[th].baseColor); | 362 | .attr('stroke', linkConfig[th].baseColor); |
365 | } | 363 | } |
366 | 364 | ||
365 | + function findLinkById(id) { | ||
366 | + // check to see if this is a reverse lookup, else default to given id | ||
367 | + var key = network.revLinkToKey[id] || id; | ||
368 | + return key && lu[key]; | ||
369 | + } | ||
370 | + | ||
367 | function findLink(linkData, op) { | 371 | function findLink(linkData, op) { |
368 | var key = makeLinkKey(linkData), | 372 | var key = makeLinkKey(linkData), |
369 | keyrev = makeLinkKey(linkData, 1), | 373 | keyrev = makeLinkKey(linkData, 1), |
... | @@ -436,6 +440,15 @@ | ... | @@ -436,6 +440,15 @@ |
436 | return result; | 440 | return result; |
437 | } | 441 | } |
438 | 442 | ||
443 | + function findOfflineNodes() { | ||
444 | + var a = []; | ||
445 | + network.nodes.forEach(function (d) { | ||
446 | + if (d.class === 'device' && !d.online) { | ||
447 | + a.push(d); | ||
448 | + } | ||
449 | + }); | ||
450 | + return a; | ||
451 | + } | ||
439 | 452 | ||
440 | function findAttachedHosts(devId) { | 453 | function findAttachedHosts(devId) { |
441 | var hosts = []; | 454 | var hosts = []; |
... | @@ -513,6 +526,36 @@ | ... | @@ -513,6 +526,36 @@ |
513 | fResume(); | 526 | fResume(); |
514 | } | 527 | } |
515 | 528 | ||
529 | + function updateHostVisibility() { | ||
530 | + sus.makeVisible(nodeG.selectAll('.host'), showHosts); | ||
531 | + sus.makeVisible(linkG.selectAll('.hostLink'), showHosts); | ||
532 | + } | ||
533 | + | ||
534 | + function updateOfflineVisibility(dev) { | ||
535 | + function updDev(d, show) { | ||
536 | + sus.makeVisible(d.el, show); | ||
537 | + | ||
538 | + findAttachedLinks(d.id).forEach(function (link) { | ||
539 | + b = show && ((link.type() !== 'hostLink') || showHosts); | ||
540 | + sus.makeVisible(link.el, b); | ||
541 | + }); | ||
542 | + findAttachedHosts(d.id).forEach(function (host) { | ||
543 | + b = show && showHosts; | ||
544 | + sus.makeVisible(host.el, b); | ||
545 | + }); | ||
546 | + } | ||
547 | + | ||
548 | + if (dev) { | ||
549 | + // updating a specific device that just toggled off/on-line | ||
550 | + updDev(dev, dev.online || showOffline); | ||
551 | + } else { | ||
552 | + // updating all offline devices | ||
553 | + findOfflineNodes().forEach(function (d) { | ||
554 | + updDev(d, showOffline); | ||
555 | + }); | ||
556 | + } | ||
557 | + } | ||
558 | + | ||
516 | 559 | ||
517 | function sendUpdateMeta(d, store) { | 560 | function sendUpdateMeta(d, store) { |
518 | var metaUi = {}, | 561 | var metaUi = {}, |
... | @@ -536,16 +579,6 @@ | ... | @@ -536,16 +579,6 @@ |
536 | } | 579 | } |
537 | 580 | ||
538 | 581 | ||
539 | - function fStart() { | ||
540 | - $log.debug('TODO fStart()...'); | ||
541 | - // TODO... | ||
542 | - } | ||
543 | - | ||
544 | - function fResume() { | ||
545 | - $log.debug('TODO fResume()...'); | ||
546 | - // TODO... | ||
547 | - } | ||
548 | - | ||
549 | // ========================== | 582 | // ========================== |
550 | // === Devices and hosts - helper functions | 583 | // === Devices and hosts - helper functions |
551 | 584 | ||
... | @@ -817,6 +850,28 @@ | ... | @@ -817,6 +850,28 @@ |
817 | } | 850 | } |
818 | } | 851 | } |
819 | 852 | ||
853 | + function vis(b) { | ||
854 | + return b ? 'visible' : 'hidden'; | ||
855 | + } | ||
856 | + | ||
857 | + function toggleHosts() { | ||
858 | + showHosts = !showHosts; | ||
859 | + updateHostVisibility(); | ||
860 | + flash.flash('Hosts ' + vis(showHosts)); | ||
861 | + } | ||
862 | + | ||
863 | + function toggleOffline() { | ||
864 | + showOffline = !showOffline; | ||
865 | + updateOfflineVisibility(); | ||
866 | + flash.flash('Offline devices ' + vis(showOffline)); | ||
867 | + } | ||
868 | + | ||
869 | + function cycleDeviceLabels() { | ||
870 | + // TODO cycle device labels | ||
871 | + } | ||
872 | + | ||
873 | + // ========================================== | ||
874 | + | ||
820 | var dCol = { | 875 | var dCol = { |
821 | black: '#000', | 876 | black: '#000', |
822 | paleblue: '#acf', | 877 | paleblue: '#acf', |
... | @@ -1070,12 +1125,12 @@ | ... | @@ -1070,12 +1125,12 @@ |
1070 | // operate on exiting links: | 1125 | // operate on exiting links: |
1071 | link.exit() | 1126 | link.exit() |
1072 | .attr('stroke-dasharray', '3 3') | 1127 | .attr('stroke-dasharray', '3 3') |
1128 | + .attr('stroke', linkConfig[th].outColor) | ||
1073 | .style('opacity', 0.5) | 1129 | .style('opacity', 0.5) |
1074 | .transition() | 1130 | .transition() |
1075 | .duration(1500) | 1131 | .duration(1500) |
1076 | .attr({ | 1132 | .attr({ |
1077 | 'stroke-dasharray': '3 12', | 1133 | 'stroke-dasharray': '3 12', |
1078 | - stroke: linkConfig[th].outColor, | ||
1079 | 'stroke-width': linkConfig.outWidth | 1134 | 'stroke-width': linkConfig.outWidth |
1080 | }) | 1135 | }) |
1081 | .style('opacity', 0.0) | 1136 | .style('opacity', 0.0) |
... | @@ -1084,7 +1139,7 @@ | ... | @@ -1084,7 +1139,7 @@ |
1084 | // NOTE: invoke a single tick to force the labels to position | 1139 | // NOTE: invoke a single tick to force the labels to position |
1085 | // onto their links. | 1140 | // onto their links. |
1086 | tick(); | 1141 | tick(); |
1087 | - // FIXME: this is a bug when in oblique view | 1142 | + // TODO: this causes undesirable behavior when in oblique view |
1088 | // It causes the nodes to jump into "overhead" view positions, even | 1143 | // It causes the nodes to jump into "overhead" view positions, even |
1089 | // though the oblique planes are still showing... | 1144 | // though the oblique planes are still showing... |
1090 | } | 1145 | } |
... | @@ -1191,14 +1246,55 @@ | ... | @@ -1191,14 +1246,55 @@ |
1191 | 1246 | ||
1192 | // ========================== | 1247 | // ========================== |
1193 | // force layout tick function | 1248 | // force layout tick function |
1194 | - function tick() { | ||
1195 | 1249 | ||
1250 | + function fResume() { | ||
1251 | + if (!oblique) { | ||
1252 | + force.resume(); | ||
1253 | + } | ||
1254 | + } | ||
1255 | + | ||
1256 | + function fStart() { | ||
1257 | + if (!oblique) { | ||
1258 | + force.start(); | ||
1259 | + } | ||
1260 | + } | ||
1261 | + | ||
1262 | + var tickStuff = { | ||
1263 | + nodeAttr: { | ||
1264 | + transform: function (d) { return sus.translate(d.x, d.y); } | ||
1265 | + }, | ||
1266 | + linkAttr: { | ||
1267 | + x1: function (d) { return d.source.x; }, | ||
1268 | + y1: function (d) { return d.source.y; }, | ||
1269 | + x2: function (d) { return d.target.x; }, | ||
1270 | + y2: function (d) { return d.target.y; } | ||
1271 | + }, | ||
1272 | + linkLabelAttr: { | ||
1273 | + transform: function (d) { | ||
1274 | + var lnk = findLinkById(d.key); | ||
1275 | + if (lnk) { | ||
1276 | + return transformLabel({ | ||
1277 | + x1: lnk.source.x, | ||
1278 | + y1: lnk.source.y, | ||
1279 | + x2: lnk.target.x, | ||
1280 | + y2: lnk.target.y | ||
1281 | + }); | ||
1282 | + } | ||
1283 | + } | ||
1284 | + } | ||
1285 | + }; | ||
1286 | + | ||
1287 | + function tick() { | ||
1288 | + node.attr(tickStuff.nodeAttr); | ||
1289 | + link.attr(tickStuff.linkAttr); | ||
1290 | + linkLabel.attr(tickStuff.linkLabelAttr); | ||
1196 | } | 1291 | } |
1197 | 1292 | ||
1198 | 1293 | ||
1199 | // ========================== | 1294 | // ========================== |
1200 | // === MOUSE GESTURE HANDLERS | 1295 | // === MOUSE GESTURE HANDLERS |
1201 | 1296 | ||
1297 | + // FIXME: | ||
1202 | function selectCb() { } | 1298 | function selectCb() { } |
1203 | function atDragEnd() {} | 1299 | function atDragEnd() {} |
1204 | function dragEnabled() {} | 1300 | function dragEnabled() {} |
... | @@ -1211,14 +1307,15 @@ | ... | @@ -1211,14 +1307,15 @@ |
1211 | angular.module('ovTopo') | 1307 | angular.module('ovTopo') |
1212 | .factory('TopoForceService', | 1308 | .factory('TopoForceService', |
1213 | ['$log', 'FnService', 'SvgUtilService', 'IconService', 'ThemeService', | 1309 | ['$log', 'FnService', 'SvgUtilService', 'IconService', 'ThemeService', |
1214 | - 'TopoInstService', | 1310 | + 'FlashService', 'TopoInstService', |
1215 | 1311 | ||
1216 | - function (_$log_, _fs_, _sus_, _is_, _ts_, _tis_) { | 1312 | + function (_$log_, _fs_, _sus_, _is_, _ts_, _flash_, _tis_) { |
1217 | $log = _$log_; | 1313 | $log = _$log_; |
1218 | fs = _fs_; | 1314 | fs = _fs_; |
1219 | sus = _sus_; | 1315 | sus = _sus_; |
1220 | is = _is_; | 1316 | is = _is_; |
1221 | ts = _ts_; | 1317 | ts = _ts_; |
1318 | + flash = _flash_; | ||
1222 | tis = _tis_; | 1319 | tis = _tis_; |
1223 | 1320 | ||
1224 | icfg = is.iconConfig(); | 1321 | icfg = is.iconConfig(); |
... | @@ -1270,6 +1367,9 @@ | ... | @@ -1270,6 +1367,9 @@ |
1270 | resize: resize, | 1367 | resize: resize, |
1271 | 1368 | ||
1272 | updateDeviceColors: updateDeviceColors, | 1369 | updateDeviceColors: updateDeviceColors, |
1370 | + toggleHosts: toggleHosts, | ||
1371 | + toggleOffline: toggleOffline, | ||
1372 | + cycleDeviceLabels: cycleDeviceLabels, | ||
1273 | 1373 | ||
1274 | addDevice: addDevice, | 1374 | addDevice: addDevice, |
1275 | updateDevice: updateDevice, | 1375 | updateDevice: updateDevice, | ... | ... |
... | @@ -55,7 +55,6 @@ | ... | @@ -55,7 +55,6 @@ |
55 | 55 | ||
56 | 56 | ||
57 | // ========================== | 57 | // ========================== |
58 | - // *** ADD INSTANCE *** | ||
59 | 58 | ||
60 | function addInstance(data) { | 59 | function addInstance(data) { |
61 | var id = data.id; | 60 | var id = data.id; |
... | @@ -330,7 +329,8 @@ | ... | @@ -330,7 +329,8 @@ |
330 | 329 | ||
331 | isVisible: function () { return oiBox.isVisible(); }, | 330 | isVisible: function () { return oiBox.isVisible(); }, |
332 | show: function () { oiBox.show(); }, | 331 | show: function () { oiBox.show(); }, |
333 | - hide: function () { oiBox.hide(); } | 332 | + hide: function () { oiBox.hide(); }, |
333 | + toggle: function () { oiBox.toggle(); } | ||
334 | }; | 334 | }; |
335 | }]); | 335 | }]); |
336 | }()); | 336 | }()); | ... | ... |
... | @@ -87,7 +87,8 @@ describe('factory: fw/layer/panel.js', function () { | ... | @@ -87,7 +87,8 @@ describe('factory: fw/layer/panel.js', function () { |
87 | it('should provide an api of panel functions', function () { | 87 | it('should provide an api of panel functions', function () { |
88 | var p = ps.createPanel('foo'); | 88 | var p = ps.createPanel('foo'); |
89 | expect(fs.areFunctions(p, [ | 89 | expect(fs.areFunctions(p, [ |
90 | - 'show', 'hide', 'empty', 'append', 'width', 'height', 'isVisible', 'el' | 90 | + 'show', 'hide', 'toggle', 'empty', 'append', |
91 | + 'width', 'height', 'isVisible', 'el' | ||
91 | ])).toBeTruthy(); | 92 | ])).toBeTruthy(); |
92 | }); | 93 | }); |
93 | 94 | ... | ... |
... | @@ -76,7 +76,7 @@ describe('factory: fw/svg/svgUtil.js', function() { | ... | @@ -76,7 +76,7 @@ describe('factory: fw/svg/svgUtil.js', function() { |
76 | }); | 76 | }); |
77 | 77 | ||
78 | it('should provide an alternate (dark) shade of blue for muted', function () { | 78 | it('should provide an alternate (dark) shade of blue for muted', function () { |
79 | - expect(sus.cat7().getColor('foo', true, 'dark')).toEqual('#16203A'); | 79 | + expect(sus.cat7().getColor('foo', true, 'dark')).toEqual('#304860'); |
80 | }); | 80 | }); |
81 | 81 | ||
82 | it('should iterate across the colors', function () { | 82 | it('should iterate across the colors', function () { | ... | ... |
... | @@ -35,6 +35,7 @@ describe('factory: view/topo/topoForce.js', function() { | ... | @@ -35,6 +35,7 @@ describe('factory: view/topo/topoForce.js', function() { |
35 | it('should define api functions', function () { | 35 | it('should define api functions', function () { |
36 | expect(fs.areFunctions(tfs, [ | 36 | expect(fs.areFunctions(tfs, [ |
37 | 'initForce', 'resize', 'updateDeviceColors', | 37 | 'initForce', 'resize', 'updateDeviceColors', |
38 | + 'toggleHosts', 'toggleOffline','cycleDeviceLabels', | ||
38 | 'addDevice', 'updateDevice', 'removeDevice', | 39 | 'addDevice', 'updateDevice', 'removeDevice', |
39 | 'addHost', 'updateHost', 'removeHost', | 40 | 'addHost', 'updateHost', 'removeHost', |
40 | 'addLink', 'updateLink', 'removeLink' | 41 | 'addLink', 'updateLink', 'removeLink' | ... | ... |
... | @@ -36,7 +36,7 @@ describe('factory: view/topo/topoInst.js', function() { | ... | @@ -36,7 +36,7 @@ describe('factory: view/topo/topoInst.js', function() { |
36 | expect(fs.areFunctions(tis, [ | 36 | expect(fs.areFunctions(tis, [ |
37 | 'initInst', 'destroyInst', | 37 | 'initInst', 'destroyInst', |
38 | 'addInstance', 'updateInstance', 'removeInstance', | 38 | 'addInstance', 'updateInstance', 'removeInstance', |
39 | - 'isVisible', 'show', 'hide' | 39 | + 'isVisible', 'show', 'hide', 'toggle' |
40 | ])).toBeTruthy(); | 40 | ])).toBeTruthy(); |
41 | }); | 41 | }); |
42 | 42 | ... | ... |
... | @@ -25,10 +25,7 @@ var lastcmd, // last command executed | ... | @@ -25,10 +25,7 @@ var lastcmd, // last command executed |
25 | var scFiles = fs.readdirSync(scenarioRoot); | 25 | var scFiles = fs.readdirSync(scenarioRoot); |
26 | console.log('Mock Server v1.0'); | 26 | console.log('Mock Server v1.0'); |
27 | console.log('================'); | 27 | console.log('================'); |
28 | -console.log('Scenarios ...'); | 28 | +listScenarios(); |
29 | -console.log(scFiles.join(', ')); | ||
30 | -console.log(); | ||
31 | - | ||
32 | 29 | ||
33 | var rl = readline.createInterface(process.stdin, process.stdout); | 30 | var rl = readline.createInterface(process.stdin, process.stdout); |
34 | rl.setPrompt('ws> '); | 31 | rl.setPrompt('ws> '); |
... | @@ -118,6 +115,7 @@ function doCli() { | ... | @@ -118,6 +115,7 @@ function doCli() { |
118 | } | 115 | } |
119 | 116 | ||
120 | switch(cmd) { | 117 | switch(cmd) { |
118 | + case 'l': listScenarios(); break; | ||
121 | case 'c': connStatus(); break; | 119 | case 'c': connStatus(); break; |
122 | case 'm': customMessage(str); break; | 120 | case 'm': customMessage(str); break; |
123 | case 's': setScenario(str); break; | 121 | case 's': setScenario(str); break; |
... | @@ -137,10 +135,11 @@ function doCli() { | ... | @@ -137,10 +135,11 @@ function doCli() { |
137 | } | 135 | } |
138 | 136 | ||
139 | var helptext = '\n' + | 137 | var helptext = '\n' + |
138 | + 'l - list scenarios\n' + | ||
140 | 'c - show connection status\n' + | 139 | 'c - show connection status\n' + |
141 | 'm {text} - send custom message to client\n' + | 140 | 'm {text} - send custom message to client\n' + |
142 | 's {id} - load scenario {id}\n' + | 141 | 's {id} - load scenario {id}\n' + |
143 | - 's - show scenario staus\n' + | 142 | + 's - show scenario status\n' + |
144 | //'a - auto-send events\n' + | 143 | //'a - auto-send events\n' + |
145 | 'n - send next event\n' + | 144 | 'n - send next event\n' + |
146 | 'r - restart the scenario\n' + | 145 | 'r - restart the scenario\n' + |
... | @@ -151,6 +150,12 @@ function showHelp() { | ... | @@ -151,6 +150,12 @@ function showHelp() { |
151 | console.log(helptext); | 150 | console.log(helptext); |
152 | } | 151 | } |
153 | 152 | ||
153 | +function listScenarios() { | ||
154 | + console.log('Scenarios ...'); | ||
155 | + console.log(scFiles.join(', ')); | ||
156 | + console.log(); | ||
157 | +} | ||
158 | + | ||
154 | function connStatus() { | 159 | function connStatus() { |
155 | if (connection) { | 160 | if (connection) { |
156 | console.log('Connection from ' + origin + ' established.'); | 161 | console.log('Connection from ' + origin + ' established.'); | ... | ... |
-
Please register or login to post a comment