|
113 | 113 | return $tier; |
114 | 114 | }, |
115 | 115 |
|
| 116 | + connectorLine: function(args) { |
| 117 | + var $connector = $('<div></div>').addClass('connector-line'); |
| 118 | + var $router = args.$router; |
| 119 | + var $tier = args.$tier; |
| 120 | + var $connectorStart = $('<div></div>').addClass('connector-start'); |
| 121 | + var $connectorMid = $('<div></div>').addClass('connector-mid'); |
| 122 | + var $connectorEnd = $('<div></div>').addClass('connector-end'); |
| 123 | + |
| 124 | + $connector.append($connectorStart, $connectorMid, $connectorEnd); |
| 125 | + |
| 126 | + var posStartOffsetLeft = 5; |
| 127 | + var posStartOffsetTop = 10; |
| 128 | + var posStart = { |
| 129 | + top: $router.position().top + ($router.outerHeight() / 2 + ($tier.index() * posStartOffsetTop)), |
| 130 | + left: $router.position().left + $router.outerWidth() |
| 131 | + }; |
| 132 | + var posStartWidth = 60 - (($tier.index() + 1) * posStartOffsetLeft); |
| 133 | + |
| 134 | + var posEndOffset = 15; |
| 135 | + var posEnd = { |
| 136 | + top: $tier.position().top + ($tier.outerHeight() / 2), |
| 137 | + left: posStart.left + posStartWidth + posEndOffset |
| 138 | + }; |
| 139 | + var posEndWidth = Math.abs($tier.position().left - |
| 140 | + (posStart.left + posStartWidth)) - posEndOffset; |
| 141 | + |
| 142 | + // Start line (next to router) |
| 143 | + $connectorStart.css({ |
| 144 | + top: posStart.top, |
| 145 | + left: posStart.left |
| 146 | + }); |
| 147 | + $connectorStart.width(posStartWidth); |
| 148 | + |
| 149 | + // End line (next to tier) |
| 150 | + $connectorEnd.css({ |
| 151 | + top: posEnd.top, |
| 152 | + left: posEnd.left |
| 153 | + }); |
| 154 | + $connectorEnd.width(posEndWidth); |
| 155 | + |
| 156 | + // Mid line (connect start->end) |
| 157 | + if (posStart.top > posEnd.top) { // Tier above router |
| 158 | + $connectorMid.css({ |
| 159 | + top: posEnd.top, |
| 160 | + left: posEnd.left |
| 161 | + }); |
| 162 | + $connectorMid.height(posStart.top - posEnd.top); |
| 163 | + } else { // Tier below router |
| 164 | + $connectorMid.css({ |
| 165 | + top: posStart.top, |
| 166 | + left: posStart.left + posStartWidth + posEndOffset |
| 167 | + }); |
| 168 | + $connectorMid.height(posEnd.top - posStart.top); |
| 169 | + } |
| 170 | + |
| 171 | + return $connector; |
| 172 | + }, |
| 173 | + |
116 | 174 | router: function(args) { |
117 | 175 | var $router = elems.tier({ |
118 | 176 | context: args.context, |
|
171 | 229 | var section = cloudStack.vpc.sections[id]; |
172 | 230 | var $section = $('<div>'); |
173 | 231 | var $loading = $('<div>').addClass('loading-overlay'); |
174 | | - |
| 232 | + |
175 | 233 | if ($.isFunction(section)) { |
176 | 234 | section = cloudStack.vpc.sections[id](); |
177 | 235 | } |
|
193 | 251 |
|
194 | 252 | $section.appendTo($panel); |
195 | 253 | } |
196 | | - }); |
| 254 | + }); |
197 | 255 | }; |
198 | 256 |
|
199 | 257 | if (before) { |
|
262 | 320 | response: { |
263 | 321 | success: function(data) { |
264 | 322 | var tiers = data.tiers; |
| 323 | + var $router; |
265 | 324 | var $placeholder = elems.tierPlaceholder({ |
266 | 325 | context: context |
267 | 326 | }); |
268 | 327 |
|
| 328 | + // Router |
| 329 | + $router = elems.router({ |
| 330 | + context: context, |
| 331 | + dashboardItems: data.routerDashboard |
| 332 | + }).appendTo($chart); |
| 333 | + |
269 | 334 | $(tiers).map(function(index, tier) { |
270 | 335 | var $tier = elems.tier({ |
271 | 336 | context: context, |
272 | 337 | tier: tier, |
273 | 338 | dashboardItems: tier._dashboardItems |
274 | 339 | }); |
275 | 340 | $tier.appendTo($tiers); |
| 341 | + |
| 342 | + // Connect tier to router via line |
| 343 | + // |
| 344 | + // -- Needs to execute after chart generation is complete, |
| 345 | + // so that chart elements have positioning in place. |
| 346 | + $chart.bind('cloudStack.vpc.chartReady', function() { |
| 347 | + elems.connectorLine({ $tier: $tier, $router: $router }).appendTo($chart); |
| 348 | + }); |
276 | 349 | }); |
277 | 350 |
|
278 | 351 | // Add placeholder tier |
|
289 | 362 | if (args.complete) { |
290 | 363 | args.complete($chart); |
291 | 364 | } |
292 | | - |
293 | | - // Router |
294 | | - elems.router({ |
295 | | - context: context, |
296 | | - dashboardItems: data.routerDashboard |
297 | | - }).appendTo($chart); |
298 | 365 | } |
299 | 366 | } |
300 | 367 | }); |
|
303 | 370 | chart({ |
304 | 371 | complete: function($newChart) { |
305 | 372 | $chart.replaceWith($newChart); |
| 373 | + $newChart.trigger('cloudStack.vpc.chartReady'); |
306 | 374 | } |
307 | 375 | }); |
308 | 376 | }); |
|
314 | 382 | title: vpcItem.displaytext ? vpcItem.displaytext : vpcItem.name, |
315 | 383 | maximizeIfSelected: true, |
316 | 384 | complete: function($panel) { |
317 | | - var $chart = chart(); |
| 385 | + var $chart = chart({ |
| 386 | + complete: function($chart) { |
| 387 | + $chart.trigger('cloudStack.vpc.chartReady'); |
| 388 | + } |
| 389 | + }); |
318 | 390 |
|
319 | 391 | $chart.appendTo($panel); |
320 | 392 | } |
|
0 commit comments