You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2017/11/11 14:00:18 UTC

[1/8] qpid-dispatch git commit: DISPATCH-801 Removed reference to 3rd party libraries form stand-alone console

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 97de78eeb -> 58461d730


DISPATCH-801 Removed reference to 3rd party libraries form stand-alone console


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/fdb093e4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/fdb093e4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/fdb093e4

Branch: refs/heads/master
Commit: fdb093e4a5dee70b0865942d358a51eee0c117ec
Parents: 97de78e
Author: Ernest Allen <ea...@redhat.com>
Authored: Sat Nov 11 08:56:16 2017 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Sat Nov 11 08:56:16 2017 -0500

----------------------------------------------------------------------
 LICENSE | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/fdb093e4/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 890d436..66380af 100644
--- a/LICENSE
+++ b/LICENSE
@@ -205,11 +205,7 @@
 # Third Party Dependency Licensing Information:
 ###############################################
 
-The following 4 files are licensed under the above Apache License, Version 2.0
-1. console/stand-alone/plugin/lib/rhea-min.js
-2. console/hawtio/src/main/webapp/plugin/lib/rhea-min.js
-3. console/stand-alone/bower_components/angular-patternfly/dist/angular-patternfly.min.js
-4. console/stand-alone/bower_components/angular-patternfly/dist/styles/angular-patternfly.min.css
+console/hawtio/src/main/webapp/plugin/lib/rhea-min.js is licensed under the above Apache License, Version 2.0
 
 The following 3 files are licensed under the BSD license, for details see licenses/d3.js-license
 1. console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/d3.v3.min.js


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[4/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrOverview.js b/console/stand-alone/plugin/js/qdrOverview.js
index 1266355..056dbf9 100644
--- a/console/stand-alone/plugin/js/qdrOverview.js
+++ b/console/stand-alone/plugin/js/qdrOverview.js
@@ -19,30 +19,24 @@ under the License.
 /**
  * @module QDR
  */
-/**
- * @module QDR
- */
 var QDR = (function (QDR) {
 
   /**
-   * @method OverviewController
-   * @param $scope
-   * @param QDRService
-   * @param QDRChartServer
-   * dialogServer
-   * $location
    *
    * Controller that handles the QDR overview page
    */
-  QDR.module.controller("QDR.OverviewController", ['$scope', 'QDRService', '$location', '$timeout', '$uibModal', function($scope, QDRService, $location, $timeout, $uibModal) {
+  QDR.module.controller("QDR.OverviewController", ['$scope', 'QDRService', '$location', '$timeout', '$uibModal', 'uiGridConstants', function($scope, QDRService, $location, $timeout, $uibModal, uiGridConstants) {
+
+    QDR.log.debug("QDR.OverviewControll started with location of " + $location.path() + " and connection of  " + QDRService.management.connection.is_connected());
+    var updateIntervalHandle = undefined;
+    var updateInterval = 5000;
 
-    console.log("QDR.OverviewControll started with location of " + $location.path() + " and connection of  " + QDRService.connected);
     var COLUMNSTATEKEY = 'QDRColumnKey.';
     var OVERVIEWEXPANDEDKEY = "QDROverviewExpanded"
     var OVERVIEWACTIVATEDKEY = "QDROverviewActivated"
     var FILTERKEY = "QDROverviewFilters"
     var OVERVIEWMODEIDS = "QDROverviewModeIds"
-    var treeRoot;   // the dynatree root node. initialized once log data is received
+    var treeRoot;   // the fancytree root node. initialized once log data is received
 
     // we want attributes to be listed first, so add it at index 0
     $scope.subLevelTabs = [{
@@ -91,14 +85,22 @@ var QDR = (function (QDR) {
     ];
     var topLevelChildren = [];
 
-    $scope.allRouterSelected = function (row ) {
-      console.log("row selected" + row)
-    }
     function afterSelectionChange(rowItem, checkAll) {
       var nodeId = rowItem.entity.nodeId;
-      $("#overtree").dynatree("getTree").activateKey(nodeId);
+      $("#overtree").fancytree("getTree").activateKey(nodeId);
     }
 
+    var selectRow = function (gridApi) {
+      if (!gridApi.selection)
+        return
+      gridApi.selection.on.rowSelectionChanged($scope,function(row){
+        var treeKey = row.grid.options.treeKey
+        if (treeKey && row.entity[treeKey]) {
+          var key = row.entity[treeKey]
+          $("#overtree").fancytree("getTree").activateKey(key);
+        }
+      })
+    }
     $scope.routerPagingOptions = {
       pageSizes: [50, 100, 500],
       pageSize: 50,
@@ -118,9 +120,9 @@ var QDR = (function (QDR) {
     $scope.totalRouters = 0;
     $scope.allRouterFields = [];
     $scope.pagedRouterFields = [];
-    $scope.allRouterSelections = [];
     $scope.allRouters = {
       saveKey: 'allRouters',
+      treeKey: 'nodeId',
       data: 'pagedRouterFields',
       columnDefs: [
         {
@@ -156,55 +158,48 @@ var QDR = (function (QDR) {
       totalServerItems: 'totalRouters',
       pagingOptions: $scope.routerPagingOptions,
       multiSelect: false,
-      selectedItems: $scope.allRouterSelections,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-          var selItem = $scope.allRouterSelections[0]
-          var nodeId = selItem.nodeId
-          // activate Routers->nodeId in the tree
-          $("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-      }
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      minRowsToShow: Math.min(QDRService.management.topology.nodeIdList().length, 50),
+      noUnselect: true,
     };
 
     // get info for all routers
-    var allRouterInfo = function () {
+    var allRouterInfo = function (node, callback) {
       var nodes = {}
       // gets called each node/entity response
       var gotNode = function (nodeName, entity, response) {
         if (!nodes[nodeName])
           nodes[angular.copy(nodeName)] = {}
-        nodes[nodeName][entity] = angular.copy(response);
+        nodes[nodeName][entity] = response;
       }
       // send the requests for all connection and router info for all routers
-      QDRService.fetchAllEntities([{entity: ".connection", attrs: ["role"]}], function () {
-        QDRService.fetchAllEntities([{entity: ".router"}], function () {
-          // we have all the data now in the nodes object
-          var allRouterFields = []
-          for (var node in nodes) {
-            var connections = 0
-            for (var i=0; i<nodes[node][".connection"].results.length; ++i) {
-              // we only requested "role" so it will be at [0]
-              if (nodes[node][".connection"].results[i][0] === 'inter-router')
-                ++connections
-            }
-            var routerRow = {connections: connections, nodeId: node, id: QDRService.nameFromId(node)}
-            nodes[node][".router"].attributeNames.forEach( function (routerAttr, i) {
-              if (routerAttr !== "routerId" && routerAttr !== "id")
-                routerRow[routerAttr] = nodes[node][".router"].results[0][i]
-            })
-            allRouterFields.push(routerRow)
+      QDRService.management.topology.fetchAllEntities([
+        {entity: "connection", attrs: ["role"]},
+        {entity: "router"}], function () {
+        // we have all the data now in the nodes object
+        var allRouterFields = []
+        for (var node in nodes) {
+          var connections = 0
+          for (var i=0; i<nodes[node]["connection"].results.length; ++i) {
+            // we only requested "role" so it will be at [0]
+            if (nodes[node]["connection"].results[i][0] === 'inter-router')
+              ++connections
           }
-          $timeout(function () {
-            $scope.allRouterFields = allRouterFields
-            getPagedData($scope.routerPagingOptions.pageSize, $scope.routerPagingOptions.currentPage);
-            updateRouterTree(nodeIds)
-            scheduleNextUpdate()
-            //if ($scope.router)
-            //  routerInfo($scope.router)
+          var routerRow = {connections: connections, nodeId: node, id: QDRService.management.topology.nameFromId(node)}
+          nodes[node]["router"].attributeNames.forEach( function (routerAttr, i) {
+            if (routerAttr !== "routerId" && routerAttr !== "id")
+              routerRow[routerAttr] = nodes[node]["router"].results[0][i]
           })
-        }, gotNode)
+          allRouterFields.push(routerRow)
+        }
+        $scope.allRouterFields = allRouterFields
+        expandGridToContent("Routers", $scope.allRouterFields.length)
+        getPagedData($scope.routerPagingOptions.pageSize, $scope.routerPagingOptions.currentPage);
+        updateRouterTree(nodeIds)
+        callback(null)
       }, gotNode)
       loadColState($scope.allRouters)
     }
@@ -226,29 +221,29 @@ var QDR = (function (QDR) {
       ],
       jqueryUIDraggable: true,
       enableColumnResize: true,
+      minRowsToShow: 25,
       multiSelect: false
     }
 
     $scope.router = null;
     // get info for a single router
-    var routerInfo = function (node) {
+    var routerInfo = function (node, callback) {
       $scope.router = node
 
       var routerFields = [];
       $scope.allRouterFields.some( function (field) {
-        if (field.id === node.data.title) {
+        if (field.id === node.title) {
           Object.keys(field).forEach ( function (key) {
-            if (key !== '$$hashKey') {
-              var attr = (key === 'connections') ? 'External connections' : key
-              routerFields.push({attribute: attr, value: field[key]})
-            }
+            var attr = (key === 'connections') ? 'External connections' : key
+            routerFields.push({attribute: attr, value: field[key]})
           })
           return true
         }
       })
-      $timeout(function () {$scope.routerFields = routerFields})
-      scheduleNextUpdate()
+      $scope.routerFields = routerFields
+      expandGridToContent("Router", $scope.routerFields.length)
       loadColState($scope.routerGrid);
+      callback(null)
     }
 
     $scope.addressPagingOptions = {
@@ -273,6 +268,7 @@ var QDR = (function (QDR) {
     $scope.selectedAddresses = []
     $scope.addressesGrid = {
       saveKey: 'addressesGrid',
+      treeKey: 'uid',
       data: 'pagedAddressesData',
       columnDefs: [
         {
@@ -320,20 +316,15 @@ var QDR = (function (QDR) {
       pagingOptions: $scope.addressPagingOptions,
       enableColumnResize: true,
       multiSelect: false,
-      jqueryUIDraggable: true,
-      selectedItems: $scope.selectedAddresses,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-          var selItem = data.entity;
-          var nodeId = selItem.uid
-          $("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-      }
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      noUnselect: true
     };
 
     // get info for all addresses
-    var allAddressInfo = function () {
+    var allAddressInfo = function (address, callback) {
       var nodes = {}
       // gets called each node/entity response
       var gotNode = function (nodeName, entity, response) {
@@ -362,16 +353,16 @@ var QDR = (function (QDR) {
         return ''
       }
       var prettyVal = function (val) {
-        return QDRService.pretty(val || "-")
+        return QDRService.utilities.pretty(val || "-")
       }
       var addressFields = []
       var addressObjs = {}
       // send the requests for all connection and router info for all routers
-      QDRService.fetchAllEntities({entity: ".router.address"}, function () {
+      QDRService.management.topology.fetchAllEntities({entity: "router.address"}, function () {
         for (var node in nodes) {
-          var response = nodes[node][".router.address"]
+          var response = nodes[node]["router.address"]
           response.results.forEach( function (result) {
-            var address = QDRService.flatten(response.attributeNames, result)
+            var address = QDRService.utilities.flatten(response.attributeNames, result)
 
             var addNull = function (oldVal, newVal) {
               if (oldVal != null && newVal != null)
@@ -382,12 +373,12 @@ var QDR = (function (QDR) {
             }
 
             var uid = address.identity
-            var identity = QDRService.identity_clean(uid)
+            var identity = QDRService.utilities.identity_clean(uid)
 
-            if (!addressObjs[QDRService.addr_text(identity)+QDRService.addr_class(identity)])
-              addressObjs[QDRService.addr_text(identity)+QDRService.addr_class(identity)] = {
-                address: QDRService.addr_text(identity),
-                'class': QDRService.addr_class(identity),
+            if (!addressObjs[QDRService.utilities.addr_text(identity)+QDRService.utilities.addr_class(identity)])
+              addressObjs[QDRService.utilities.addr_text(identity)+QDRService.utilities.addr_class(identity)] = {
+                address: QDRService.utilities.addr_text(identity),
+                'class': QDRService.utilities.addr_class(identity),
                 phase:   addr_phase(identity),
                 inproc:  address.inProcess,
                 local:   address.subscriberCount,
@@ -400,7 +391,7 @@ var QDR = (function (QDR) {
                 uid:     uid
               }
             else {
-              var sumObj = addressObjs[QDRService.addr_text(identity)+QDRService.addr_class(identity)]
+              var sumObj = addressObjs[QDRService.utilities.addr_text(identity)+QDRService.utilities.addr_class(identity)]
               sumObj.inproc = addNull(sumObj.inproc, address.inproc)
               sumObj.local = addNull(sumObj.local, address.local)
               sumObj.remote = addNull(sumObj.remote, address.remote)
@@ -410,22 +401,6 @@ var QDR = (function (QDR) {
               sumObj.toproc = addNull(sumObj.toproc, address.toproc)
               sumObj.fromproc = addNull(sumObj.fromproc, address.fromproc)
             }
-/*
-            addressFields.push({
-              address: QDRService.addr_text(identity),
-              'class': QDRService.addr_class(identity),
-              phase:   addr_phase(identity),
-              inproc:  prettySum("inProcess"),
-              local:   prettySum("subscriberCount"),
-              remote:  prettySum("remoteCount"),
-              'in':    prettySum("deliveriesIngress"),
-              out:     prettySum("deliveriesEgress"),
-              thru:    prettySum("deliveriesTransit"),
-              toproc:  prettySum("deliveriesToContainer"),
-              fromproc:prettySum("deliveriesFromContainer"),
-              uid:     uid
-            })
-*/
           })
         }
         for (var obj in addressObjs) {
@@ -458,15 +433,14 @@ var QDR = (function (QDR) {
           } else
             addressFields[i].title = addressFields[i].address
         }
-        $timeout(function () {
-          $scope.addressesData = addressFields
-          getAddressPagedData($scope.addressPagingOptions.pageSize, $scope.addressPagingOptions.currentPage);
-          // repopulate the tree's child nodes
-          updateAddressTree(addressFields)
-          scheduleNextUpdate()
-        })
+        $scope.addressesData = addressFields
+        expandGridToContent("Addresses", $scope.addressesData.length)
+        getAddressPagedData($scope.addressPagingOptions.pageSize, $scope.addressPagingOptions.currentPage);
+        // repopulate the tree's child nodes
+        updateAddressTree(addressFields)
+        loadColState($scope.addressesGrid);
+        callback(null)
       }, gotNode)
-      loadColState($scope.addressesGrid);
     }
 
     var updateLinkGrid = function ( linkFields ) {
@@ -478,13 +452,14 @@ var QDR = (function (QDR) {
             include = false;
         }
         if ($scope.filter.hideConsoles) {
-          if (QDRService.isConsoleLink(link))
+          if (QDRService.utilities.isConsole(QDRService.management.topology.getConnForLink(link)))
             include = false;
         }
         return include;
       })
       QDR.log.debug("setting linkFields in updateLinkGrid")
       $scope.linkFields = filteredLinks;
+      expandGridToContent("Links", $scope.linkFields.length)
       getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
       // if we have a selected link
       if ($scope.link) {
@@ -493,9 +468,9 @@ var QDR = (function (QDR) {
           return link.name === $scope.link.data.fields.name;
         })
         if (links.length > 0) {
-          // linkInfo() is the function that is called by dynatree when a link is selected
-          // It is passed a dynatree node. We need to simulate that node type to update the link grid
-          linkInfo({data: {title: links[0].title, fields: links[0]}})
+          // linkInfo() is the function that is called by fancytree when a link is selected
+          // It is passed a fancytree node. We need to simulate that node type to update the link grid
+          linkInfo({data: {title: links[0].title, fields: links[0]}}, function () {$timeout(function (){})})
         }
       }
     }
@@ -521,15 +496,9 @@ var QDR = (function (QDR) {
     $scope.pagedLinkData = []
     $scope.selectedLinks = []
 
-    var linkRowTmpl = "<div ng-class=\"{linkDirIn: row.getProperty('linkDir') == 'in', linkDirOut: row.getProperty('linkDir') == 'out'}\">" +
-          "<div ng-style=\"{ 'cursor': row.cursor }\" ng-repeat=\"col in renderedColumns\" ng-class=\"col.colIndex()\" class=\"ngCell {{col.cellClass}}\">" +
-          "<div class=\"ngVerticalBar\" ng-style=\"{height: rowHeight}\" ng-class=\"{ ngVerticalBarVisible: !$last }\">&nbsp;</div>" +
-          "<div ng-cell></div>" +
-          "</div>" +
-          "</div>";
-
     $scope.linksGrid = {
       saveKey: 'linksGrid',
+      treeKey: 'uid',
       data: 'pagedLinkData',
       columnDefs: [
         {
@@ -604,21 +573,16 @@ var QDR = (function (QDR) {
       enableColumnResize: true,
       enableColumnReordering: true,
       showColumnMenu: true,
-      rowTemplate: linkRowTmpl,
+      rowTemplate: 'linkRowTemplate.html',
+      minRowsToShow: 15,
       multiSelect: false,
-      jqueryUIDraggable: true,
-      selectedItems: $scope.selectedLinks,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-          var selItem = data.entity;
-          var nodeId = selItem.uid
-          $("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-            }
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      noUnselect: true
     };
 
-
     $scope.$on('ngGridEventColumns', function (e, columns) {
       var saveInfo = columns.map( function (col) {
         return [col.width, col.visible]
@@ -643,26 +607,27 @@ return;
         })
       }
     }
-    var allLinkInfo = function () {
+    var allLinkInfo = function (node, callback) {
       var gridCallback = function (linkFields) {
-        QDRService.ensureAllEntities({entity: ".connection", force: true}, function () {
+        QDRService.management.topology.ensureAllEntities({entity: "connection", force: true}, function () {
           // only update the grid with these fields if the List tree node is selected
           // this is becuase we are using the link grid in other places and we don't want to overwrite it
           if ($scope.template.name === "Links")
             updateLinkGrid(linkFields)
           updateLinkTree(linkFields)
+          callback(null)
         })
       }
-      getAllLinkFields([gridCallback, scheduleNextUpdate])
+      getAllLinkFields([gridCallback])
       loadColState($scope.linksGrid);
     }
 
     var getAllLinkFields = function (completionCallbacks, selectionCallback) {
       if (!$scope.linkFields) {
-        QDR.log.info("$scope.linkFields was not defined")
+        QDR.log.debug("$scope.linkFields was not defined!")
         return;
       }
-      var nodeIds = QDRService.nodeIdList()
+      var nodeIds = QDRService.management.topology.nodeIdList()
       var linkFields = []
       var now = Date.now()
       var rate = function (linkName, response, result) {
@@ -675,7 +640,7 @@ return;
           var elapsed = (now - oldname[0].timestamp) / 1000;
           if (elapsed < 0)
             return 0
-          var delivered = QDRService.valFor(response.attributeNames, result, "deliveryCount") - oldname[0].rawDeliveryCount
+          var delivered = QDRService.utilities.valFor(response.attributeNames, result, "deliveryCount") - oldname[0].rawDeliveryCount
           //QDR.log.debug("elapsed " + elapsed + " delivered " + delivered)
           return elapsed > 0 ? parseFloat(Math.round((delivered/elapsed) * 100) / 100).toFixed(2) : 0;
         } else {
@@ -686,6 +651,7 @@ return;
       var expected = nodeIds.length;
       var received = 0;
       var gotLinkInfo = function (nodeName, entity, response) {
+        if (response.results)
         response.results.forEach( function (result) {
           var nameIndex = response.attributeNames.indexOf('name')
           var prettyVal = function (field) {
@@ -694,20 +660,20 @@ return;
               return "-"
             }
             var val = result[fieldIndex]
-            return QDRService.pretty(val)
+            return QDRService.utilities.pretty(val)
           }
           var uncounts = function () {
-            var und = QDRService.valFor(response.attributeNames, result, "undeliveredCount")
-            var uns = QDRService.valFor(response.attributeNames, result, "unsettledCount")
-            return QDRService.pretty(und + uns)
+            var und = QDRService.utilities.valFor(response.attributeNames, result, "undeliveredCount")
+            var uns = QDRService.utilities.valFor(response.attributeNames, result, "unsettledCount")
+            return QDRService.utilities.pretty(und + uns)
           }
           var linkName = function () {
-            var namestr = QDRService.nameFromId(nodeName)
-            return namestr + ':' + QDRService.valFor(response.attributeNames, result, "identity")
+            var namestr = QDRService.management.topology.nameFromId(nodeName)
+            return namestr + ':' + QDRService.utilities.valFor(response.attributeNames, result, "identity")
           }
           var fixAddress = function () {
             var addresses = []
-            var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr") || ""
+            var owningAddr = QDRService.utilities.valFor(response.attributeNames, result, "owningAddr") || ""
             var rawAddress = owningAddr
             /*
                  - "L*"  =>  "* (local)"
@@ -743,12 +709,12 @@ return;
             return addresses
           }
           if (!selectionCallback || selectionCallback(response, result)) {
-            var adminStatus = QDRService.valFor(response.attributeNames, result, "adminStatus")
-            var operStatus = QDRService.valFor(response.attributeNames, result, "operStatus")
+            var adminStatus = QDRService.utilities.valFor(response.attributeNames, result, "adminStatus")
+            var operStatus = QDRService.utilities.valFor(response.attributeNames, result, "operStatus")
             var linkName = linkName()
-            var linkType = QDRService.valFor(response.attributeNames, result, "linkType")
+            var linkType = QDRService.utilities.valFor(response.attributeNames, result, "linkType")
             var addresses = fixAddress();
-            var link = QDRService.flatten(response.attributeNames, result)
+            var link = QDRService.utilities.flatten(response.attributeNames, result)
             linkFields.push({
               link:       linkName,
               title:      linkName,
@@ -764,7 +730,7 @@ return;
               releasedCount: prettyVal("releasedCount"),
               deliveryCount:prettyVal("deliveryCount") + " ",
 
-              rate: QDRService.pretty(rate(linkName, response, result)),
+              rate: QDRService.utilities.pretty(rate(linkName, response, result)),
               capacity: link.capacity,
               undeliveredCount: link.undeliveredCount,
               unsettledCount: link.unsettledCount,
@@ -794,7 +760,7 @@ return;
         }
       }
       nodeIds.forEach( function (nodeId) {
-        QDRService.fetchEntity(nodeId, "router.link", [], gotLinkInfo);
+        QDRService.management.topology.fetchEntity(nodeId, "router.link", [], gotLinkInfo);
       })
     }
 
@@ -820,6 +786,7 @@ return;
     $scope.allConnectionSelections = [];
     $scope.allConnectionGrid = {
       saveKey: 'allConnGrid',
+      treeKey: 'uid',
       data: 'pagedConnectionsData',
       columnDefs: [
       {
@@ -854,26 +821,21 @@ return;
       pagingOptions: $scope.connectionPagingOptions,
       enableColumnResize: true,
       multiSelect: false,
-      jqueryUIDraggable: true,
-      selectedItems: $scope.allConnectionSelections,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-          var selItem = $scope.allConnectionSelections[0]
-          var nodeId = selItem.uid
-          // activate Routers->nodeId in the tree
-          $("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-      }
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      noUnselect: true
     };
     // get info for a all connections
-    var allConnectionInfo = function () {
-      getAllConnectionFields([updateConnectionGrid, updateConnectionTree, scheduleNextUpdate])
+    var allConnectionInfo = function (connection, callback) {
+      getAllConnectionFields([updateConnectionGrid, updateConnectionTree, function () {callback(null)}])
       loadColState($scope.allConnectionGrid);
     }
     // called after conection data is available
     var updateConnectionGrid = function (connectionFields) {
       $scope.allConnectionFields = connectionFields;
+      expandGridToContent("Connections", $scope.allConnectionFields.length)
       getConnectionPagedData($scope.connectionPagingOptions.pageSize, $scope.connectionPagingOptions.currentPage);
     }
 
@@ -881,7 +843,7 @@ return;
     // called periodically
     // creates a connectionFields array and calls the callbacks (updateTree and updateGrid)
     var getAllConnectionFields = function (callbacks) {
-      var nodeIds = QDRService.nodeIdList()
+      var nodeIds = QDRService.management.topology.nodeIdList()
       var connectionFields = [];
       var expected = nodeIds.length;
       var received = 0;
@@ -889,8 +851,8 @@ return;
         response.results.forEach( function (result) {
 
           var auth = "no_auth"
-          var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
-          if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
+          var sasl = QDRService.utilities.valFor(response.attributeNames, result, "sasl")
+          if (QDRService.utilities.valFor(response.attributeNames, result, "isAuthenticated")) {
             auth = sasl
             if (sasl === "ANONYMOUS")
               auth = "anonymous-user"
@@ -899,27 +861,27 @@ return;
                 sasl = "Kerberos"
               if (sasl === "EXTERNAL")
                 sasl = "x.509"
-              auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
-                  QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+              auth = QDRService.utilities.valFor(response.attributeNames, result, "user") + "(" +
+                  QDRService.utilities.valFor(response.attributeNames, result, "sslCipher") + ")"
               }
           }
 
           var sec = "no-security"
-          if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
+          if (QDRService.utilities.valFor(response.attributeNames, result, "isEncrypted")) {
             if (sasl === "GSSAPI")
               sec = "Kerberos"
             else
-              sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
-                  QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+              sec = QDRService.utilities.valFor(response.attributeNames, result, "sslProto") + "(" +
+                  QDRService.utilities.valFor(response.attributeNames, result, "sslCipher") + ")"
           }
 
-          var host = QDRService.valFor(response.attributeNames, result, "host")
+          var host = QDRService.utilities.valFor(response.attributeNames, result, "host")
           var connField = {
             host: host,
             security: sec,
             authentication: auth,
             routerId: nodeName,
-            uid: host + QDRService.valFor(response.attributeNames, result, "identity")
+            uid: host + QDRService.utilities.valFor(response.attributeNames, result, "identity")
           }
           response.attributeNames.forEach( function (attribute, i) {
             connField[attribute] = result[i]
@@ -934,7 +896,7 @@ return;
         }
       }
       nodeIds.forEach( function (nodeId) {
-        QDRService.fetchEntity(nodeId, ".connection", [], gotConnectionInfo)
+        QDRService.management.topology.fetchEntity(nodeId, "connection", [], gotConnectionInfo)
       })
     }
 
@@ -956,18 +918,19 @@ return;
       }
       ],
       enableColumnResize: true,
+      minRowsToShow: 11,
       jqueryUIDraggable: true,
       multiSelect: false
     }
 
     // get info for a single address
-    var addressInfo = function (address) {
+    var addressInfo = function (address, callback) {
       $scope.address = address
       var currentEntity = getCurrentLinksEntity();
       // we are viewing the addressLinks page
       if (currentEntity === 'Address' && entityModes[currentEntity].currentModeId === 'links') {
         updateModeLinks()
-        scheduleNextUpdate()
+        callback(null)
         return;
       }
 
@@ -977,7 +940,8 @@ return;
         if (field != "title" && field != "uid")
           $scope.addressFields.push({attribute: field, value: address.data.fields[field]})
       })
-      scheduleNextUpdate()
+      expandGridToContent("Address", $scope.addressFields.length)
+      callback(null)
       loadColState($scope.addressGrid);
     }
 
@@ -998,14 +962,15 @@ return;
         }
       ],
       enableColumnResize: true,
+      minRowsToShow: 24,
       jqueryUIDraggable: true,
       multiSelect: false
     }
 
     // display the grid detail info for a single link
-    var linkInfo = function (link) {
-QDR.log.debug("linkInfo called for " + link.data.key)
+    var linkInfo = function (link, callback) {
       if (!link) {
+        callback(null)
         return;
       }
       $scope.link = link
@@ -1017,7 +982,8 @@ QDR.log.debug("linkInfo called for " + link.data.key)
         if (excludeFields.indexOf(field) == -1)
           $scope.singleLinkFields.push({attribute: field, value: link.data.fields[field]})
       })
-      scheduleNextUpdate()
+      expandGridToContent("Link", $scope.singleLinkFields.length)
+      callback(null)
       loadColState($scope.linkGrid);
     }
 
@@ -1042,34 +1008,34 @@ QDR.log.debug("linkInfo called for " + link.data.key)
         {Address: 'attributes', Connection: 'attributes'}
     }
     var savedModeIds = loadModeIds()
-      var entityModes = {
-          Address: {
-              currentModeId: savedModeIds.Address,
-              filter: function (response, result) {
-          var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr")
+    var entityModes = {
+      Address: {
+        currentModeId: savedModeIds.Address,
+        filter: function (response, result) {
+          var owningAddr = QDRService.utilities.valFor(response.attributeNames, result, "owningAddr")
           var id = $scope.address.data.fields.uid
           return (owningAddr === $scope.address.data.fields.uid)
-              }
-          },
-          Connection: {
-              currentModeId: savedModeIds.Connection,
-              filter: function (response, result) {
-          var connectionId = QDRService.valFor(response.attributeNames, result, "connectionId")
+        }
+      },
+      Connection: {
+        currentModeId: savedModeIds.Connection,
+        filter: function (response, result) {
+          var connectionId = QDRService.utilities.valFor(response.attributeNames, result, "connectionId")
           return (connectionId === $scope.connection.data.fields.identity)
-              }
-          }
+        }
       }
+    }
     $scope.selectMode = function (mode, entity) {
       if (!mode || !entity)
         return;
       entityModes[entity].currentModeId = mode.id;
       saveModeIds();
       if (mode.id === 'links') {
-QDR.log.debug("setting linkFields to [] in selectMode")
         $scope.linkFields = [];
         getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
         updateModeLinks();
       }
+      updateExpanded()
     }
     $scope.isModeSelected = function (mode, entity) {
       return mode.id === entityModes[entity].currentModeId
@@ -1079,23 +1045,20 @@ QDR.log.debug("setting linkFields to [] in selectMode")
     }
 
     var updateEntityLinkGrid = function (linkFields) {
-      $timeout(function () {
-        QDR.log.debug("setting linkFields in updateEntityLinkGrid");
-        $scope.linkFields = linkFields
-        getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
-      })
+      $scope.linkFields = linkFields
+      expandGridToContent("Link", $scope.linkFields.length)
+      getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
     }
     // based on which entity is selected, get and filter the links
     var updateModeLinks = function () {
       var currentEntity = getCurrentLinksEntity()
       if (!currentEntity)
         return;
-      var selectionCallback = entityModes[currentEntity].filter;
-      getAllLinkFields([updateEntityLinkGrid], selectionCallback)
+      getAllLinkFields([updateEntityLinkGrid], entityModes[currentEntity].filter)
     }
     var getCurrentLinksEntity = function () {
       var currentEntity;
-      var active = $("#overtree").dynatree("getActiveNode");
+      var active = $("#overtree").fancytree("getActiveNode");
       if (active) {
         currentEntity = active.data.type;
       }
@@ -1111,8 +1074,15 @@ QDR.log.debug("setting linkFields to [] in selectMode")
     }
 
     $scope.quiesceLink = function (row, $event) {
-      QDRService.quiesceLink(row.entity.nodeId, row.entity.name);
       $event.stopPropagation()
+      QDRService.management.topology.quiesceLink(row.entity.nodeId, row.entity.name)
+        .then( function (results, context) {
+          var statusCode = context.message.application_properties.statusCode;
+          if (statusCode < 200 || statusCode >= 300) {
+            Core.notification('error', context.message.statusDescription);
+            QDR.log.error('Error ' + context.message.statusDescription)
+          }
+        })
     }
 
     $scope.quiesceLinkDisabled = function (row) {
@@ -1123,12 +1093,12 @@ QDR.log.debug("setting linkFields to [] in selectMode")
     }
 
     $scope.expandAll = function () {
-      $("#overtree").dynatree("getRoot").visit(function(node){
+      $("#overtree").fancytree("getRoot").visit(function(node){
                 node.expand(true);
             });
     }
     $scope.contractAll = function () {
-      $("#overtree").dynatree("getRoot").visit(function(node){
+      $("#overtree").fancytree("getRoot").visit(function(node){
                 node.expand(false);
             })
     }
@@ -1150,20 +1120,23 @@ QDR.log.debug("setting linkFields to [] in selectMode")
       }
       ],
       enableColumnResize: true,
+      minRowsToShow: 21,
       jqueryUIDraggable: true,
       multiSelect: false
     }
 
-    var connectionInfo = function (connection) {
-      if (!connection)
+    var connectionInfo = function (connection, callback) {
+      if (!connection) {
+        callback(null)
         return;
+      }
       $scope.connection = connection
 
       var currentEntity = getCurrentLinksEntity();
       // we are viewing the connectionLinks page
       if (currentEntity === 'Connection' && entityModes[currentEntity].currentModeId === 'links') {
         updateModeLinks()
-        scheduleNextUpdate()
+        callback(null)
         return;
       }
 
@@ -1173,12 +1146,16 @@ QDR.log.debug("setting linkFields to [] in selectMode")
         if (field != "title" && field != "uid")
           $scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
       })
+      expandGridToContent("Connection", $scope.connectionFields.length)
       // this is missing an argument?
       loadColState($scope.connectionGrid);
+      callback(null)
     }
 
 
-    var logModuleCellTemplate = '<div ng-click="logInfoFor(row, col)" class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{COL_FIELD | pretty}}</span></div>'
+    //var logModuleCellTemplate = '<div ng-click="logInfoFor(row, col)" class="ui-grid-cell-contents">{{grid.getCellValue(row, col) | pretty}}</div>'
+    var logModuleCellTemplate = '<div class="ui-grid-cell-contents" ng-click="grid.appScope.logInfoFor(row, col)">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>'
+
     $scope.logModule = {}
     $scope.logModuleSelected = []
     $scope.logModuleData = []
@@ -1239,15 +1216,12 @@ QDR.log.debug("setting linkFields to [] in selectMode")
       enableColumnResize: true,
       jqueryUIDraggable: true,
       multiSelect: false,
-      selectedItems: $scope.logModuleSelected,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-            var selItem = $scope.logModuleSelected[0]
-            var nodeId = selItem.nodeId
-
-        }
-      }
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      minRowsToShow: Math.min(QDRService.management.topology.nodeIdList().length, 50),
+      noUnselect: true
     }
 
     $scope.logInfoFor = function (row, col) {
@@ -1274,11 +1248,10 @@ QDR.log.debug("setting linkFields to [] in selectMode")
         },
       }
     });
-
     d.result.then(function (result) {
-      console.log("d.open().then");
+      QDR.log.debug("d.open().then");
     }, function () {
-      console.log('Modal dismissed at: ' + new Date());
+      QDR.log.debug('Modal dismissed at: ' + new Date());
     });
   };
 
@@ -1287,6 +1260,7 @@ QDR.log.debug("setting linkFields to [] in selectMode")
     $scope.allLogSelections = [];
     $scope.allLogGrid = {
       saveKey: 'allLogGrid',
+      treeKey: 'name',
       data: 'allLogFields',
       columnDefs: [
         {
@@ -1294,12 +1268,6 @@ QDR.log.debug("setting linkFields to [] in selectMode")
           saveKey: 'allLogGrid',
           displayName: 'Module'
         },
-/*        {
-          field: 'enable',
-          displayName: 'Enable'
-        },
-*/
-
         {
           field: 'noticeCount',
           displayName: 'Notice',
@@ -1345,24 +1313,17 @@ QDR.log.debug("setting linkFields to [] in selectMode")
       ],
       //enableCellSelection: true,
       enableColumnResize: true,
-      jqueryUIDraggable: true,
+      minRowsToShow: 17,
       multiSelect: false,
-      selectedItems: $scope.allLogSelections,
-      plugins: [new ngGridFlexibleHeightPlugin()],
-
-      afterSelectionChange: function(data) {
-        if (data.selected) {
-            var selItem = $scope.allLogSelections[0]
-            var nodeId = selItem.name
-            // activate in the tree
-            $("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-      }
-
+      enableSelectAll: false,
+      onRegisterApi: selectRow,
+      enableSelectionBatchEvent: false,
+      enableRowHeaderSelection: false,
+      noUnselect: true
     };
 
     var allLogEntries = {}
-    var allLogInfo = function () {
+    var allLogInfo = function (log, callback) {
         // update the count of entries for each module
         $scope.allLogFields = []
         var logResults = {}
@@ -1371,7 +1332,7 @@ QDR.log.debug("setting linkFields to [] in selectMode")
         var gotLogStats = function (node, entity, response) {
           logDetails[node] = []
           response.results.forEach( function (result) {
-            var oresult = QDRService.flatten(response.attributeNames, result)
+            var oresult = QDRService.utilities.flatten(response.attributeNames, result)
             // make a copy for the details grid since logResults has the same object reference
             logDetails[node].push(angular.copy(oresult))
             if (!(oresult.name in logResults)) {
@@ -1392,117 +1353,54 @@ QDR.log.debug("setting linkFields to [] in selectMode")
           sortedModules.forEach( function (module) {
             $scope.allLogFields.push(logResults[module])
           })
+          expandGridToContent("Logs", $scope.allLogFields.length)
           allLogEntries = logDetails
           updateLogTree($scope.allLogFields)
+          callback(null)
         }
-        QDRService.fetchAllEntities({entity: 'logStats'}, gotAllLogStats, gotLogStats)
-/*
-        var q = QDR.queue(1)
+        QDRService.management.topology.fetchAllEntities({entity: 'logStats'}, gotAllLogStats, gotLogStats)
+    }
 
-        var queuedSendMethod = function (node, callback) {
-          var gotLogInfo = function (nodeId, entity, response, context) {
-            var statusCode = context.message.application_properties.statusCode;
-            if (statusCode < 200 || statusCode >= 300) {
-              callback("getLog failed with statusCode of " + statusCode)
-            } else {
-              var logFields = response.map( function (result) {
-                return {
-                  nodeId: QDRService.nameFromId(nodeId),
-                  name: result[0],
-                  type: result[1],
-                  message: result[2],
-                  source: result[3],
-                  line: result[4],
-                  time: Date(result[5]).toString()
-                }
-              })
-              logResults.push.apply(logResults, logFields) // append new array to existing
-              callback(null)
-            }
-          }
-          QDRService.sendMethod(node, undefined, {}, "GET-LOG", {}, gotLogInfo)
+    var expandGridToContent = function (type, rows) {
+      var tree = $("#overtree").fancytree("getTree")
+      var node = tree.getActiveNode()
+      if (node) {
+        if (node.data.type === type) {
+          var height = (rows+1) * 30 + 40 // header is 40px
+          var gridDetails = $('#overview-controller .grid')
+          gridDetails.css('height', height + "px")
         }
-        for (var i=0; i<nodeIds.length; ++i) {
-          q.defer(queuedSendMethod, nodeIds[i])
-        }
-        q.await(function (error) {
-          if (!error) {
-            logResults.sort( function (a, b) {return b.name - a.name})
-            var allLogFields = $scope.allLogFields
-            $scope.allLogFields = [];
-            for (var i=0; i<allLogFields.length; ++i) {
-              $scope.allLogFields.push({module: allLogFields[i].module,
-                count: logResults.filter( function (entry) {
-                  return entry.name === allLogFields[i].module
-                }).length
-              })
-            }
-            $timeout(function () {allLogEntries = logResults; scheduleNextUpdate()})
-          }
-        })
       }
-      if ($scope.allLogFields.length == 0) {
-        QDRService.fetchEntity(nodeIds[0], "logStats", [], function (nodeName, entity, response) {
-          var moduleIndex = response.attributeNames.indexOf("name")
-          response.results.sort( function (a,b) {return a[moduleIndex] < b[moduleIndex] ? -1 : a[moduleIndex] > b[moduleIndex] ? 1 : 0})
-          response.results.forEach( function (result) {
-            var log = QDRService.flatten(response.attributeNames, result)
-            $scope.allLogFields.push(log)
-          })
-          updateLogTree($scope.allLogFields)
-          haveLogFields()
-        })
-      } else {
-        haveLogFields()
-      }
-        */
     }
 
     $scope.logFields = []
     // get info for a single log
-    var logInfo = function (node) {
+    var logInfo = function (node, callback) {
 
         var gotLogInfo = function (responses) {
-          $timeout(function () {
-            $scope.logModuleData = []
-            $scope.logModule.module = node.data.key
-            for (var n in responses) {
-              var moduleIndex = responses[n]['log'].attributeNames.indexOf("module")
-              var result = responses[n]['log'].results.filter( function (r) {
-                return r[moduleIndex] === node.data.key
-              })[0]
-              var logInfo = QDRService.flatten(responses[n]['log'].attributeNames, result)
-              var entry = allLogEntries[n]
-              entry.forEach( function (module) {
-                if (module.name === node.data.key) {
-                  module.nodeName = QDRService.nameFromId(n)
-                  module.nodeId = n
-                  module.enable = logInfo.enable
-                  $scope.logModuleData.push(module)
-                }
-              })
-            }
-            $scope.logModuleData.sort ( function (a,b) { return a.nodeName < b.nodeName? -1 : a.nodeName> b.nodeName? 1 : 0})
-            scheduleNextUpdate()
-          })
-        }
-        QDRService.fetchAllEntities({entity: 'log', attrs: ['module', 'enable']}, gotLogInfo)
-/*
-      $timeout(function () {
-        $scope.log = node
-        $scope.logFields = []
-        for (var n in allLogEntries) {
-          var entry = allLogEntries[n]
-          entry.forEach( function (module) {
-            if (module.name === node.data.key) {
-              module.nodeId = n
-              $scope.logFields.push(module)
-            }
-          })
+          $scope.logModuleData = []
+          $scope.logModule.module = node.key
+          for (var n in responses) {
+            var moduleIndex = responses[n]['log'].attributeNames.indexOf("module")
+            var result = responses[n]['log'].results.filter( function (r) {
+              return r[moduleIndex] === node.key
+            })[0]
+            var logInfo = QDRService.utilities.flatten(responses[n]['log'].attributeNames, result)
+            var entry = allLogEntries[n]
+            entry.forEach( function (module) {
+              if (module.name === node.key) {
+                module.nodeName = QDRService.management.topology.nameFromId(n)
+                module.nodeId = n
+                module.enable = logInfo.enable
+                $scope.logModuleData.push(module)
+              }
+            })
+          }
+          $scope.logModuleData.sort ( function (a,b) { return a.nodeName < b.nodeName? -1 : a.nodeName> b.nodeName? 1 : 0})
+          expandGridToContent("Log", $scope.logModuleData.length)
+          callback(null)
         }
-        scheduleNextUpdate()
-      })
-*/
+        QDRService.management.topology.fetchAllEntities({entity: 'log', attrs: ['module', 'enable']}, gotLogInfo)
     }
 
     var getExpandedList = function () {
@@ -1512,7 +1410,7 @@ QDR.log.debug("setting linkFields to [] in selectMode")
       if (treeRoot.visit) {
         treeRoot.visit(function(node){
           if (node.isExpanded()) {
-            list.push(node.data.parent)
+            list.push(node.data.parentKey)
           }
           });
       }
@@ -1545,148 +1443,158 @@ QDR.log.debug("setting linkFields to [] in selectMode")
       var template = $scope.templates.filter( function (tpl) {
         return tpl.name == type;
       })
-      $scope.template = template[0];
+      $timeout( function () {
+        $scope.template = template[0];
+      })
     }
     $scope.template = $scope.templates[0]
     // activated is called each time a tree node is clicked
     // based on which node is clicked, load the correct data grid template and start getting the data
-    var activated = function (node) {
-      QDR.log.debug("node activated: " + node.data.title)
+    var onTreeNodeActivated = function (event, data) {
       saveExpanded()
-      saveActivated(node.data.key)
-
-      setTemplate(node)
-      // the nodes info function will fetch the grids data
-      if (node.data.info) {
-        $timeout(function () {
-          if (node.data.key === node.data.parent) {
-            node.data.info()
-          }
-          else {
-            node.data.info(node)
-          }
-        })
-      }
+      saveActivated(data.node.key)
+      $scope.ActivatedKey = data.node.key
+      setTemplate(data.node)
+      updateExpanded()
     }
 
-    var treeNodeExpanded = function (node) {
+    var onTreeNodeExpanded = function (event, data) {
       saveExpanded()
-      tick()
+      updateExpanded()
     }
-    $scope.template = {url: ''};
 
-    if (!QDRService.connected) {
-      QDRService.redirectWhenConnected("overview")
+    if (!QDRService.management.connection.is_connected()) {
+      QDR.redirectWhenConnected($location, "overview")
       return;
     }
 
-    // we are currently connected. setup a handler to get notified if we are ever disconnected
-    var onDisconnect = function () {
-QDR.log.info("we were just disconnected while on the overview page. Setting org to redirect back once we are connected again")
-      $timeout(function () {
-        QDRService.redirectWhenConnected("overview")
-      })
-    }
-    QDRService.addDisconnectAction( onDisconnect )
-
     /* --------------------------------------------------
      *
      * setup the tree on the left
      *
      * -------------------------------------------------
      */
+    var getActiveChild = function (node) {
+      var active = node.children.filter(function (child) {
+        return child.isActive()
+      })
+      if (active.length > 0)
+        return active[0].key
+      return null
+    }
     // utility function called by each top level tree node when it needs to populate its child nodes
-    var updateLeaves = function (leaves, parentKey, parentFolder, worker) {
-      var scrollTree = $('.qdr-overview.pane.left .pane-viewport')
-      var scrollTop = scrollTree.scrollTop();
-      var tree = $("#overtree").dynatree("getTree")
-      var parentNode = tree.getNodeByKey(parentKey);
-      parentNode.removeChildren();
-
+    var updateLeaves = function (leaves, entity, worker) {
+      var tree = $("#overtree").fancytree("getTree"), node;
+      if (tree) {
+        node = tree.getNodeByKey(entity)
+      }
+      if (!tree || !node) {
+        return
+      }
+      var wasActive = node.isActive()
+      var wasExpanded = node.isExpanded()
+      var activeChildKey = getActiveChild(node)
+      node.removeChildren()
+      var children = []
       leaves.forEach( function (leaf) {
-        parentNode.addChild(worker(leaf))
+        children.push(worker(leaf))
       })
-      scrollTree.scrollTop(scrollTop)
-      if (firstTime) {
-        var newActive = tree.getActiveNode();
-        if (newActive &&
-//            newActive.data.key === lastKey &&
-            newActive.data.key !== newActive.data.parent &&  // this is a leaf node
-            newActive.data.parent === parentKey) {          // the active node was just created
-          firstTime = false
-QDR.log.debug("newly created node needs to be activated")
-          activated(newActive)
+      node.addNode(children)
+      // top level node was expanded
+      if (wasExpanded)
+        node.setExpanded(true, {noAnimation: true, noEvents: true})
+      if (wasActive) {
+        node.setActive(true, {noAnimation: true, noEvents: true})
+      } else {
+        // re-active the previously active child node
+        if (activeChildKey) {
+          var newNode = tree.getNodeByKey(activeChildKey)
+          // the node may not be there after the update
+          if (newNode)
+            newNode.setActive(true, {noAnimation: true, noEvents: true}) // fires the onTreeNodeActivated event for this node
         }
       }
-     }
+      resizer()
+    }
+
+    var resizer = function () {
+      // this forces the tree and the grid to be the size of the browser window.
+      // the effect is that the tree and the grid will have vertical scroll bars if needed.
+      // the alternative is to let the tree and grid determine the size of the page and have
+      // the scroll bar on the window
+      var viewport = $('#overview-controller .pane-viewport')
+      viewport.height( window.innerHeight - viewport.offset().top)
+
+      // remove the comments to allow the tree to take all the height it needs
+/*
+      var gridDetails = $('#overview-controller .grid')
+      gridDetails.height( window.innerHeight - gridDetails.offset().top)
+
+      var gridViewport = $('#overview-controller .ui-grid-viewport')
+      gridViewport.height( window.innerHeight - gridViewport.offset().top )
+*/
+    }
+    $(window).resize(resizer);
 
     // get saved tree state
-    var lastKey = loadActivatedNode();
+    $scope.ActivatedKey = loadActivatedNode();
     var expandedNodeList = loadExpandedNodeList();
     var firstTime = true;
 
     // create a routers tree branch
     var routers = new Folder("Routers")
     routers.type = "Routers"
-    routers.info = allRouterInfo
-    routers.activate = lastKey === 'Routers'
-    routers.expand = (expandedNodeList.indexOf("Routers") > -1)
-    routers.clickFolderMode = 1
+    routers.info = {fn: allRouterInfo}
+    routers.expanded = (expandedNodeList.indexOf("Routers") > -1)
     routers.key = "Routers"
-    routers.parent = "Routers"
-    routers.addClass = "routers"
-    routers.isFolder = true
+    routers.parentKey= "Routers"
+    routers.extraClasses = "routers"
     topLevelChildren.push(routers)
     // called when the list of routers changes
     var updateRouterTree = function (nodes) {
       var worker = function (node) {
-        var name = QDRService.nameFromId(node)
-        var router = new Folder(name)
+        var name = QDRService.management.topology.nameFromId(node)
+        var router = new Leaf(name)
         router.type = "Router"
-        router.info = routerInfo
+        router.info = {fn: routerInfo}
         router.nodeId = node
         router.key = node
-        router.addClass = "router"
-        router.parent = "Routers"
-        router.activate = lastKey === node
+        router.extraClasses = "router"
+        router.parentKey = "Routers"
         return router;
       }
-      $timeout(function () {updateLeaves(nodes, "Routers", routers, worker)})
+      updateLeaves(nodes, "Routers", worker)
     }
 
     // create an addresses tree branch
     var addresses = new Folder("Addresses")
     addresses.type = "Addresses"
-    addresses.info = allAddressInfo
-    addresses.activate = lastKey === 'Addresses'
-    addresses.expand = (expandedNodeList.indexOf("Addresses") > -1)
-    addresses.clickFolderMode = 1
+    addresses.info = {fn: allAddressInfo}
+    addresses.expanded = (expandedNodeList.indexOf("Addresses") > -1)
     addresses.key = "Addresses"
-    addresses.parent = "Addresses"
-    addresses.addClass = "addresses"
-    addresses.isFolder = true
+    addresses.parentKey = "Addresses"
+    addresses.extraClasses = "addresses"
     topLevelChildren.push(addresses)
     var updateAddressTree = function (addressFields) {
       var worker = function (address) {
-        var a = new Folder(address.title)
-        a.info = addressInfo
+        var a = new Leaf(address.title)
+        a.info = {fn: addressInfo}
         a.key = address.uid
         a.fields = address
         a.type = "Address"
         a.tooltip = address['class'] + " address"
         if (address.address === '$management')
           a.tooltip = "internal " + a.tooltip
-        a.addClass = a.tooltip
-        a.activate = lastKey === address.uid
-        a.parent = "Addresses"
+        a.extraClasses = a.tooltip
+        a.parentKey = "Addresses"
         return a;
       }
-      $timeout(function () {updateLeaves(addressFields, "Addresses", addresses, worker)})
+      updateLeaves(addressFields, "Addresses", worker)
     }
 
     $scope.$watch("filter", function (newValue, oldValue) {
       if (newValue !== oldValue) {
-        $timeout(allLinkInfo);
+        allLinkInfo(null, function () {$timeout(function (){})})
         localStorage[FILTERKEY] = JSON.stringify($scope.filter)
       }
     }, true)
@@ -1699,97 +1607,101 @@ QDR.log.debug("newly created node needs to be activated")
     $scope.filter = angular.fromJson(localStorage[FILTERKEY]) || {endpointsOnly: "true", hideConsoles: true};
     var links = new Folder("Links")
     links.type = "Links"
-    links.info = allLinkInfo
-    links.activate = lastKey === 'Links'
-    links.expand = (expandedNodeList.indexOf("Links") > -1)
-    links.clickFolderMode = 1
+    links.info = {fn: allLinkInfo}
+    links.expanded = (expandedNodeList.indexOf("Links") > -1)
     links.key = "Links"
-    links.parent = "Links"
-    links.addClass = "links"
-    links.isFolder = true
+    links.parentKey = "Links"
+    links.extraClasses = "links"
     topLevelChildren.push(links)
 
     // called both before the tree is created and whenever a background update is done
     var updateLinkTree = function (linkFields) {
       var worker = function (link) {
-        var l = new Folder(link.title)
-        var isConsole = QDRService.isConsoleLink(link)
-        l.info = linkInfo
+        var l = new Leaf(link.title)
+        var isConsole = QDRService.utilities.isConsole(QDRService.management.topology.getConnForLink(link))
+        l.info = {fn: linkInfo}
         l.key = link.uid
         l.fields = link
         l.type = "Link"
-        l.parent = "Links"
-        l.activate = lastKey === link.uid
+        l.parentKey = "Links"
         if (isConsole)
           l.tooltip = "console link"
         else
           l.tooltip = link.linkType  + " link"
-        l.addClass = l.tooltip
+        l.extraClasses = l.tooltip
         return l;
       }
-      $timeout(function () {updateLeaves(linkFields, "Links", links, worker)})
+      updateLeaves(linkFields, "Links", worker)
     }
 
     var connections = new Folder("Connections")
     connections.type = "Connections"
-    connections.info = allConnectionInfo
-    connections.activate = lastKey === 'Connections'
-    connections.expand = (expandedNodeList.indexOf("Connections") > -1)
-    connections.clickFolderMode = 1
+    connections.info = {fn: allConnectionInfo}
+    connections.expanded = (expandedNodeList.indexOf("Connections") > -1)
     connections.key = "Connections"
-    connections.parent = "Connections"
-    connections.addClass = "connections"
-    connections.isFolder = true
+    connections.parentKey = "Connections"
+    connections.extraClasses = "connections"
     topLevelChildren.push(connections)
 
     updateConnectionTree = function (connectionFields) {
       var worker = function (connection) {
-        var c = new Folder(connection.host)
-        var isConsole = QDRService.isAConsole (connection.properties, connection.identity, connection.role, connection.routerId)
+        var c = new Leaf(connection.host)
+        var isConsole = QDRService.utilities.isAConsole (connection.properties, connection.identity, connection.role, connection.routerId)
         c.type = "Connection"
-        c.info = connectionInfo
+        c.info = {fn: connectionInfo}
         c.key = connection.uid
         c.fields = connection
         if (isConsole)
           c.tooltip = "console connection"
         else
           c.tooltip = connection.role === "inter-router" ? "inter-router connection" : "external connection"
-        c.addClass = c.tooltip
-        c.parent = "Connections"
-        c.activate = lastKey === connection.uid
+        c.extraClasses = c.tooltip
+        c.parentKey = "Connections"
         return c
       }
-      $timeout(function () {updateLeaves(connectionFields, "Connections", connections, worker)})
+      updateLeaves(connectionFields, "Connections", worker)
     }
 
     var updateLogTree = function (logFields) {
       var worker = function (log) {
-        var l = new Folder(log.name)
+        var l = new Leaf(log.name)
         l.type = "Log"
-        l.info = logInfo
+        l.info = {fn: logInfo}
         l.key = log.name
-        l.parent = "Logs"
-        l.activate = lastKey === l.key
-        l.addClass = "log"
+        l.parentKey = "Logs"
+        l.extraClasses = "log"
         return l
       }
-      $timeout(function () {updateLeaves(logFields, "Logs", logs, worker)})
+      updateLeaves(logFields, "Logs", worker)
     }
 
     var htmlReady = false;
     var dataReady = false;
-    $scope.largeNetwork = QDRService.isLargeNetwork()
+    $scope.largeNetwork = QDRService.management.topology.isLargeNetwork()
     var logs = new Folder("Logs")
     logs.type = "Logs"
-    logs.info = allLogInfo
-    logs.activate = lastKey === 'Logs'
-    logs.expand = (expandedNodeList.indexOf("Logs") > -1)
-    logs.clickFolderMode = 1
+    logs.info = {fn: allLogInfo}
+    logs.expanded = (expandedNodeList.indexOf("Logs") > -1)
     logs.key = "Logs"
-    logs.parent = "Logs"
-    logs.isFolder = true
-    if (QDRService.versionCheck('0.8.0'))
+    logs.parentKey = "Logs"
+    if (QDRService.management.connection.versionCheck('0.8.0'))
       topLevelChildren.push(logs)
+
+    var onTreeInitialized = function (event, data) {
+      treeRoot = data.tree
+      loadColState($scope.allRouters);
+      loadColState($scope.routerGrid);
+      loadColState($scope.addressesGrid);
+      loadColState($scope.addressGrid);
+      loadColState($scope.linksGrid);
+      loadColState($scope.linkGrid);
+      loadColState($scope.allConnectionGrid);
+      loadColState($scope.connectionGrid);
+      var activeNode = treeRoot.getNodeByKey($scope.ActivatedKey)
+      if (activeNode)
+        activeNode.setActive(true)
+      updateExpanded()
+    }
     var initTreeAndGrid = function () {
       if (!htmlReady || !dataReady)
         return;
@@ -1798,29 +1710,15 @@ QDR.log.debug("newly created node needs to be activated")
         setTimeout(initTreeAndGrid, 100);
         return;
       }
-      $('#overtree').dynatree({
-        onActivate: activated,
-        onExpand: treeNodeExpanded,
+      $('#overtree').fancytree({
+        activate: onTreeNodeActivated,
+        expand: onTreeNodeExpanded,
+        init: onTreeInitialized,
         autoCollapse: $scope.largeNetwork,
         activeVisible: !$scope.largeNetwork,
-        selectMode: 1,
-        debugLevel: 0,
-        classNames: {
-          expander: 'fa-angle',
-          connector: 'dynatree-no-connector'
-          },
-        children: topLevelChildren
+        clickFolderMode: 1,
+        source: topLevelChildren
       })
-      treeRoot = $("#overtree").dynatree("getRoot");
-      tick()
-      loadColState($scope.allRouters);
-      loadColState($scope.routerGrid);
-      loadColState($scope.addressesGrid);
-      loadColState($scope.addressGrid);
-      loadColState($scope.linksGrid);
-      loadColState($scope.linkGrid);
-      loadColState($scope.allConnectionGrid);
-      loadColState($scope.connectionGrid);
     }
 
     $scope.overviewLoaded = function () {
@@ -1828,51 +1726,57 @@ QDR.log.debug("newly created node needs to be activated")
       initTreeAndGrid();
     }
 
-    var nodeIds = QDRService.nodeIdList()
-    //updateRouterTree(nodeIds);
+    var nodeIds = QDRService.management.topology.nodeIdList()
     // add placeholders for the top level tree nodes
     var topLevelTreeNodes = [routers, addresses, links, connections, logs]
     topLevelTreeNodes.forEach( function (parent) {
-      var placeHolder = new Folder("loading...")
-      placeHolder.addClass = "loading"
+      var placeHolder = new Leaf("loading...")
+      placeHolder.extraClasses = "loading"
       parent.children = [placeHolder]
     })
 
-    var singleQ = null
     var updateExpanded = function () {
-      if (!treeRoot)
-        return;
-      if (treeRoot.visit) {
-        treeRoot.visit(function(node){
-          if (node.isActive())
-            setTemplate(node)
+      QDR.log.debug("updateExpandedEntities")
+      clearTimeout(updateIntervalHandle)
+
+      var tree = $("#overtree").fancytree("getTree");
+      if (tree && tree.visit) {
+        var q = d3.queue(10)
+        tree.visit( function (node) {
           if (node.isActive() || node.isExpanded()) {
-            if (node.data.key === node.data.parent) {
-              node.data.info()
-            }
-            else {
-              node.data.info(node)
+            q.defer(node.data.info.fn, node)
+          }
+        })
+        q.await( function (error) {
+          if (error)
+            QDR.log.error(error.message)
+
+          // if there are no active nodes, activate the saved one
+          var tree = $("#overtree").fancytree("getTree")
+          if (!tree.getActiveNode()) {
+            var active = tree.getNodeByKey($scope.ActivatedKey)
+            if (active) {
+              active.setActive(true)
+            } else {
+              tree.getNodeByKey("Routers").setActive(true)
             }
           }
+
+          // fancytree animations sometimes stop short of shrinking its placeholder spans
+          d3.selectAll('.ui-effects-placeholder').style('height', '0px')
+          // once all expanded tree nodes have been update, schedule another update
+          $timeout(function () {
+            updateIntervalHandle = setTimeout(updateExpanded, updateInterval)
+          })
         })
       }
     }
 
-    var tickTimer;
-    var scheduleNextUpdate = function () {
-      clearTimeout(tickTimer)
-      tickTimer = setTimeout(tick, refreshInterval)
-    }
-    var tick = function () {
-      clearTimeout(tickTimer)
-      updateExpanded();
-    }
     dataReady = true;
     initTreeAndGrid();
     $scope.$on("$destroy", function( event ) {
-      clearTimeout(tickTimer)
-      QDRService.delDisconnectAction( onDisconnect )
-      //QDRService.stopUpdating()
+      clearTimeout(updateIntervalHandle)
+      $(window).off("resize", resizer);
     });
 
   }]);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrOverviewLogsController.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrOverviewLogsController.js b/console/stand-alone/plugin/js/qdrOverviewLogsController.js
index 0bda9e9..103e39e 100644
--- a/console/stand-alone/plugin/js/qdrOverviewLogsController.js
+++ b/console/stand-alone/plugin/js/qdrOverviewLogsController.js
@@ -23,7 +23,7 @@ var QDR = (function(QDR) {
 
   QDR.module.controller('QDR.OverviewLogsController', function ($scope, $uibModalInstance, QDRService, $timeout, nodeName, nodeId, module, level) {
 
-      var gotLogInfo = function (nodeId, entity, response, context) {
+      var gotLogInfo = function (nodeId, response, context) {
         var statusCode = context.message.application_properties.statusCode;
         if (statusCode < 200 || statusCode >= 300) {
           Core.notification('error', context.message.statusDescription);
@@ -36,7 +36,7 @@ var QDR = (function(QDR) {
           })
           var logFields = levelLogs.map( function (result) {
             return {
-              nodeId: QDRService.nameFromId(nodeId),
+              nodeId: QDRService.management.topology.nameFromId(nodeId),
               name: result[0],
               type: result[1],
               message: result[2],
@@ -51,7 +51,8 @@ var QDR = (function(QDR) {
           })
         }
       }
-      QDRService.sendMethod(nodeId, undefined, {}, "GET-LOG", {module: module}, gotLogInfo)
+      QDRService.management.connection.sendMethod(nodeId, undefined, {}, "GET-LOG", {module: module})
+        .then( function (response) {gotLogInfo(nodeId, response.response, response.context)})
 
     $scope.loading = true
     $scope.module = module

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSchema.js b/console/stand-alone/plugin/js/qdrSchema.js
index 7365d5a..89c5e9d 100644
--- a/console/stand-alone/plugin/js/qdrSchema.js
+++ b/console/stand-alone/plugin/js/qdrSchema.js
@@ -22,15 +22,15 @@ under the License.
 var QDR = (function (QDR) {
 
   QDR.module.controller("QDR.SchemaController", ['$scope', '$location', '$timeout', 'QDRService', function($scope, $location, $timeout, QDRService) {
-    if (!QDRService.connected) {
-      QDRService.redirectWhenConnected("schema")
+    if (!QDRService.management.connection.is_connected()) {
+      QDR.redirectWhenConnected($location, "schema")
       return;
     }
     var onDisconnect = function () {
-      $timeout( function () {QDRService.redirectWhenConnected("schema")})
+      $timeout( function () {QDR.redirectWhenConnected("schema")})
     }
     // we are currently connected. setup a handler to get notified if we are ever disconnected
-    QDRService.addDisconnectAction( onDisconnect )
+    QDRService.management.connection.addDisconnectAction( onDisconnect )
 
     var keys2kids = function (tree, obj) {
       if (obj === Object(obj)) {
@@ -40,7 +40,7 @@ var QDR = (function (QDR) {
           var key = keys[i];
           var kid = {title: key}
           if (obj[key] === Object(obj[key])) {
-              kid.isFolder = true
+              kid.folder = true
               keys2kids(kid, obj[key])
           } else {
             kid.title += (': ' + JSON.stringify(obj[key],null,2))
@@ -51,10 +51,10 @@ var QDR = (function (QDR) {
     }
 
     var tree = []
-    for (var key in QDRService.schema) {
+    for (var key in QDRService.management.schema()) {
       var kid = {title: key}
-      kid.isFolder = true
-      var val = QDRService.schema[key]
+      kid.folder = true
+      var val = QDRService.management.schema()[key]
       if (val === Object(val))
         keys2kids(kid, val)
       else
@@ -62,17 +62,18 @@ var QDR = (function (QDR) {
 
       tree.push(kid);
     }
-    $('#schema').dynatree({
+    $('#schema').fancytree({
       minExpandLevel: 2,
+      clickFolderMode: 3,
       classNames: {
         expander: 'fa-angle',
-        connector: 'dynatree-no-connector'
+        connector: 'fancytree-no-connector'
       },
-      children: tree
+      source: tree
     })
 
       $scope.$on("$destroy", function(event) {
-        QDRService.delDisconnectAction( onDisconnect )
+        QDRService.management.connection.delDisconnectAction( onDisconnect )
       });
 
   }]);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[6/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/site-base.css b/console/stand-alone/plugin/css/site-base.css
deleted file mode 100644
index 27aca28..0000000
--- a/console/stand-alone/plugin/css/site-base.css
+++ /dev/null
@@ -1,4721 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-* {
-  outline: none;
-}
-
-* {
-    font-family: 'Open Sans', sans-serif;
-}
-
-a:focus {
-  outline: none;
-}
-.navbar .brand {
-  font-size: 18px;
-}
-
-.brand > img {
-  height: 11px;
-  width: auto;
-}
-
-.property-name {
-  white-space: nowrap;
-}
-
-small table tbody tr td.property-name {
-  font-weight: bold;
-  text-align: right;
-}
-
-#log-panel {
-  position: fixed;
-  top: -5px;
-  left: 30px;
-  right: 30px;
-  bottom: 50%;
-  z-index: 10000;
-  background: inherit;
-  transition: bottom 1s ease-in-out;
-}
-
-#log-panel > div {
-  position: relative;
-  width: 100%;
-  height: 100%;
-}
-
-#log-panel #log-panel-statements {
-  margin-left: 0;
-  margin-bottom: 0;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 20px;
-  overflow-y: auto;
-}
-
-#log-panel-statements li {
-  margin-left: 3px;
-  margin-right: 3px;
-  transition: background .25s ease-in-out;
-}
-
-#log-panel-statements li pre {
-  border-radius: 0;
-  font-size: 11px;
-}
-
-#log-panel-statements li:hover {
-  background: #111111;
-}
-
-#log-panel-statements li.DEBUG {
-  color: dodgerblue;
-}
-
-#log-panel-statements li.INFO {
-  color: white;
-}
-
-#log-panel-statements li.WARN {
-  color: yellow;
-}
-
-#log-panel-statements li.ERROR {
-  color: red;
-}
-
-#log-panel #close {
-  text-align: center;
-  position: absolute;
-  height: 20px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
-  opacity: 1;
-}
-
-#log-panel #copy {
-  position: absolute;
-  right: 23px;
-  bottom: 26px;
-  background: inherit;
-  transition: opacity 1s ease-in-out;
-  opacity: 0.4;
-  cursor: pointer;
-}
-
-#log-panel #copy:hover {
-  opacity: 1;
-}
-
-div.log-stack-trace p {
-  line-height: 14px;
-  margin-bottom: 2px;
-}
-
-#canvas {
-  display: inline-block;
-}
-.fill {
-  min-height: 100%;
-  height: 100%;
-}
-/* sub tab tweaks */
-body div div ul.nav {
-  margin-bottom: 5px;
-  border-bottom: none;
-}
-
-#tree-ctrl {
-  position: relative;
-  top: -3px;
-}
-
-#tree-ctrl > li > a {
-  display: block;
-  padding-left: 5px;
-  padding-right: 5px;
-  /* padding: 5px; */
-}
-
-ul.dynatree-container {
-  background: inherit;
-}
-ul.dynatree-container li {
-  background: inherit;
-}
-/* Chart stuff */
-#charts {
-  display: block;
-  overflow: hidden;
-  margin: 5px auto;
-  position: relative;
-  padding-bottom: 35px;
-}
-.group {
-  margin-bottom: 1em;
-}
-.axis {
-  font: 10px sans-serif;
-  pointer-events: none;
-  z-index: 2;
-}
-.axis.text {
-  -webkit-transition: fill-opacity 250ms linear;
-}
-.axis path {
-  display: none;
-}
-.axis line {
-  stroke: #000;
-  shape-rendering: crispEdges;
-}
-.axis.top {
-  position: relative;
-  top: 0;
-  padding: 0;
-}
-.axis.bottom {
-  position: absolute;
-  bottom: 0px;
-  padding: 0;
-}
-.horizon {
-  overflow: hidden;
-  position: relative;
-}
-.horizon:last-child {
-  border-bottom: none;
-}
-.horizon + .horizon {
-  border-top: none;
-}
-.horizon canvas {
-  display: block;
-}
-.horizon .title,
-.horizon .value {
-  bottom: 0;
-  line-height: 30px;
-  margin: 0 6px;
-  position: absolute;
-  white-space: nowrap;
-}
-.horizon .title {
-  left: 0;
-}
-.horizon .value {
-  right: 0;
-}
-.line {
-  opacity: .2;
-  z-index: 2;
-}
-
-td {
-  padding-right: 20px;
-}
-
-.expandable {
-  padding: 3px;
-}
-
-.expandable > .title {
-  cursor: pointer;
-}
-
-i.expandable-indicator {
-  font-family: FontAwesome;
-  font-weight: normal;
-  font-style: normal;
-  display: inline-block;
-  text-decoration: inherit;
-}
-
-.expandable-body form fieldset legend {
-  font-size: inherit;
-  margin-bottom: 0px;
-}
-
-.expandable.opened i.expandable-indicator:before {
-  font-family: FontAwesome;
-  content: "\f078" !important;
-}
-
-.expandable.closed i.expandable-indicator:before {
-  font-family: FontAwesome;
-  content: "\f054";
-}
-
-.expandable.opened i.expandable-indicator.folder:before {
-  font-family: FontAwesome;
-  content: "\F07C" !important;
-}
-
-.expandable.closed i.expandable-indicator.folder:before {
-  font-family: FontAwesome;
-  content: "\F07B";
-}
-
-.expandable.opened .expandable-body {
-  display: inline-block;
-  margin-bottom: 3px;
-}
-
-.expandable.closed .expandable-body {
-  display: none;
-}
-
-span.dynatree-icon {
-  position: relative;
-  top: -2px;
-  font-size: 17px;
-}
-
-span:not(.dynatree-has-children) .dynatree-icon:before {
-  font-family: FontAwesome;
-  content: "\f013";
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  padding-right: 2px;
-  padding-left: 2px;
-}
-
-.tab {
-  display: block;
-  margin-left: 1em;
-}
-
-.red {
-  color: red !important;
-}
-
-.orange {
-  color: orange !important;
-}
-
-.yellow {
-  color: yellow !important;
-}
-
-.green {
-  color: green !important;
-}
-
-.background-green {
-  color: white;
-  background-color: #51a351;
-}
-
-.background-light-green {
-  color: white;
-  background-color: #5ab15a;
-}
-
-.blue {
-  color: dodgerblue !important;
-}
-
-.background-blue {
-  color: white;
-  background-color: #006dcc;
-}
-
-.icon1point5x {
-  font-size: 1.5em;
-}
-
-.centered,
-.align-center {
-  margin-left: auto !important;
-  margin-right: auto !important;
-  text-align: center;
-}
-
-.align-right {
-  text-align: right;
-}
-
-.align-left {
-  text-align: left;
-}
-
-.inline {
-  display: inline;
-}
-
-.inline-block,
-.list-row-select,
-.list-row-contents,
-.list-row-contents > .ngCellText {
-  display: inline-block;
-}
-
-.list-row {
-  height: 30px;
-  white-space: nowrap;
-}
-
-.list-row .ngCellText {
-  padding: 0;
-  vertical-align: middle;
-}
-
-.list-row-select,
-.list-row-contents {
-  height: 100%;
-  vertical-align: middle;
-}
-
-.list-row-select > input {
-  vertical-align: middle;
-}
-
-.no-bottom-margin {
-  margin-bottom: 0 !important;
-}
-
-.no-bottom-margin .control-group {
-  margin-bottom: 4px;
-}
-
-.bottom-margin {
-  margin-bottom: 20px;
-}
-
-li.attr-column {
-  width: 1em;
-}
-
-.editor-autoresize .CodeMirror {
-  height: auto;
-}
-
-.well.editor-autoresize {
-  padding: 0px;
-}
-
-.well.editor-autoresize .CodeMirror {
-  margin-bottom: 0px;
-  border: none;
-}
-
-.editor-autoresize .CodeMirror .CodeMirror-scroll {
-  overflow-y: hidden;
-  overflow-x: auto;
-}
-
-.gridster ul#widgets {
-  list-style-type: none;
-}
-
-.gridster ul#widgets .gs_w {
-  padding: 0px;
-  overflow: hidden;
-  position: relative;
-}
-
-.gridster ul#widgets .preview-holder {
-  transition-property: opacity;
-  transition-duration: 500ms;
-  padding: 1px;
-}
-
-.widget-area {
-  position: relative;
-  height: 100%;
-  width: 100%;
-}
-
-.widget-title {
-  margin: 0;
-  padding-left: 5px;
-  padding-right: 5px;
-  z-index: 6000;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-}
-
-.widget-title:hover {
-  cursor: move;
-}
-
-.widget-title > .row-fluid > .pull-right > i {
-  cursor: pointer;
-  opacity: .25;
-}
-
-.widget-title > .row-fluid > .pull-right > i:hover {
-  transition: opacity 0.25s ease-in-out;
-  -moz-transition: opacity 0.25s ease-in-out;
-  -webkit-transition: opacity 0.25s ease-in-out;
-  opacity: 1;
-}
-
-.widget-body {
-  position: absolute;
-  top: 20px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.height-controls > a {
-  float: left;
-  display: block;
-  opacity: .1;
-  text-decoration: none;
-}
-
-.width-controls > a {
-  float: left;
-  display: block;
-  opacity: .1;
-  text-decoration: none;
-}
-
-.width-controls > a:hover {
-  opacity: .9;
-  text-decoration: none;
-}
-
-.height-controls > a:hover {
-  opacity: .9;
-  text-decoration: none;
-}
-
-.width-controls {
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  width: 1.5em;
-  height: 3em;
-  display: block;
-  right: 5px;
-  top: 43%;
-}
-
-.height-controls {
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  display: block;
-  width: 3em;
-  height: 1.5em;
-  left: 41%;
-  bottom: 5px;
-}
-
-editable-property {
-  position: relative;
-}
-
-.ep.editing {
-  position: absolute;
-  top: -10px;
-  padding: 0;
-  z-index: 10000;
-  border: 1px solid #cecdcd;
-  white-space: nowrap;
-}
-
-/*
-.widget-title > div > div .ep[ng-show=editing] {
-  top: -1px;
-}
-
-table .ep.editing {
-  top: 12px;
-}
-  */
-.ep.editing > form > fieldset > i {
-  position: relative;
-  top: 2px;
-}
-
-.ep > i {
-  cursor: pointer;
-  opacity: .25;
-  transition: opacity 0.25s ease-in-out;
-  -moz-transition: opacity 0.25s ease-in-out;
-  -webkit-transition: opacity 0.25s ease-in-out;
-}
-
-.ep > form > fieldset > input {
-  border: 0;
-}
-
-.ep > i:hover {
-  opacity: 1;
-}
-
-.ep form fieldset i {
-  cursor: pointer;
-  padding-left: 5px;
-}
-
-.ep form.no-bottom-margin {
-  margin: 0;
-}
-
-.ngTotalSelectContainer {
-  margin: 0px;
-}
-
-.ngTopPanel {
-  background: inherit;
-}
-
-.ngGrid {
-  background: inherit;
-}
-
-.ngViewport {
-  margin-left: 0px;
-  margin-right: 0px;
-}
-
-#widgets li div div div div form fieldset div input {
-  display: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngCell {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngFooterPanel {
-  border: none;
-  display: none;
-}
-.ngFooterPanel {
-  border-top: none;
-}
-.ngRow .ngCell:last-child {
-  border-right: none;
-}
-.ngRow:last-child {
-  border-bottom: none;
-}
-.ngFooterTotalItems span:first-child {
-  margin-right: .5em;
-}
-
-.ACTIVE:before {
-  font-family: FontAwesome;
-  content: "\f087";
-  font-style: normal;
-  color: #777777;
-}
-
-.RESOLVED:before {
-  font-family: FontAwesome;
-  content: "\f0ad";
-  font-style: normal;
-}
-
-.STARTING:before {
-  font-family: FontAwesome;
-  content: "\f021";
-  font-style: normal;
-}
-
-.STARTING {
-  -moz-animation: spin 2s infinite linear;
-  -o-animation: spin 2s infinite linear;
-  -webkit-animation: spin 2s infinite linear;
-  animation: spin 2s infinite linear;
-}
-
-.STOPPING:before {
-  font-family: FontAwesome;
-  content: "\f021";
-  font-style: normal;
-}
-
-.STOPPING {
-  -moz-animation: spin 2s infinite linear;
-  -o-animation: spin 2s infinite linear;
-  -webkit-animation: spin 2s infinite linear;
-  animation: spin 2s infinite linear;
-}
-
-.UNINSTALLED:before {
-  font-family: FontAwesome;
-  content: "\f014";
-  font-style: normal;
-}
-
-.INSTALLED:before {
-  font-family: FontAwesome;
-  content: "\f06b";
-  font-style: normal;
-}
-
-.table-bordered {
-  border: none;
-  border-radius: 0px;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-  border-radius: 0px;
-  border-left: none;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: none;
-  border-top: none;
-}
-
-.table-bordered th:last-child,
-.table-bordered td:last-child {
-  border-left: none;
-  border-top: none;
-  border-right: none;
-}
-
-table.table thead .sorting {
-  background: inherit;
-}
-
-table.table thead .sorting_asc:after {
-  background: url('../img/datatable/sort_asc.png') no-repeat top center;
-}
-
-table.table thead .sorting_desc:after {
-  background: url('../img/datatable/sort_desc.png') no-repeat top center;
-}
-
-.dataTables_filter label {
-  margin-bottom: 0px;
-}
-
-.dataTables_filter label input {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  margin-bottom: 0;
-}
-
-.nav {
-  margin-bottom: 10px;
-}
-
-.navbar-fixed-top {
-  margin-bottom: 0px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
-  margin-bottom: 10px;
-  min-width: 120px;
-}
-
-#main > div > ul.nav > li, 
-ng-include > .nav.nav-tabs > li {
-  margin-top: 3px;
-  margin-bottom: 3px;
-}
-
-.navbar .btn-navbar span:after {
-  font-family: FontAwesome;
-  content: "\f0de";
-  margin-left: 7px;
-}
-
-.navbar .btn-navbar.collapsed span:after {
-  font-family: FontAwesome;
-  content: "\f0dd";
-  margin-left: 7px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
-  padding-left: 3px;
-  padding-right: 3px;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  margin-right: 0px;
-}
-
-div#main div ul.nav li a,
-div#main div ul.nav li span {
-  padding-bottom: 2px;
-  padding-top: 2px;
-}
-div#main div ul.nav li a:not(.btn), div#main div ul.nav li span.a:not(.btn) {
-    border: 1px;
-    border-radius: 2px;
-    background: inherit;
-    color: #777777;
-    text-shadow: 0 1px 0 #FFFFFF;
-}
-
-div#main div ul.nav li a:hover {
-  padding-bottom: 2px;
-  padding-top: 2px;
-}
-
-#main div div div section .tabbable .nav.nav-tabs {
-  margin-top: 0px;
-  margin-bottom: 10px;
-  min-width: 120px;
-}
-
-#main > div > div > div > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs:not(.connected) {
-  margin-top: 5px;
-}
-
-.span12 > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs > li {
-  margin: 3px;
-}
-
-.logbar {
-  z-index: 40;
-  position: fixed;
-  width: 87%;
-  top: 70px;
-  left: 5%;
-  padding-left: 20px;
-  padding-right: 20px;
-}
-
-.logbar-container {
-  margin-top: 10px;
-  margin-bottom: 5px;
-}
-
-.logbar-container .control-group {
-  margin-bottom: 5px;
-}
-
-.log-main {
-  margin-top: 55px;
-}
-
-.log-filter {
-  margin-right: 30px;
-}
-
-.ui-resizeable-handle {
-  display: none;
-}
-
-.ui-resizable-se {
-  height: 10px;
-  width: 10px;
-  margin-right: 5px;
-  margin-bottom: 5px;
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  display: block;
-  right: 0px;
-  bottom: 0px;
-  cursor: se-resize;
-}
-
-.no-log {
-  margin-top: 55px;
-}
-
-.control i {
-  cursor: pointer;
-}
-
-td.details {
-  padding: 0px;
-  border: none;
-  margin: 0px;
-  height: 0px;
-}
-
-.innerDetails {
-  padding: 5px;
-  white-space: normal;
-  display: none;
-}
-
-table.dataTable {
-  table-layout: fixed;
-}
-
-table.dataTable tbody tr td {
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.wiki.logbar-container {
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-
-.wiki.logbar-container > .nav.nav-tabs {
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-
-.wiki.logbar-container .pull-right {
-  margin-top: 1px;
-}
-
-.wiki-fixed {
-  margin-top: 45px;
-}
-
-.wiki-fixed .pane {
-  top: 120px;
-}
-
-.help-sidebar li {
-  padding-left: 2px;
-  padding-right: 2px;
-}
-
-.help-sidebar li a {
-  padding-left: 3px;
-  padding-right: 3px;
-}
-
-.help-sidebar li:first-child {
-  margin-top: 0px !important;
-  padding-top: 20px;
-}
-
-.help-display p {
-  text-align: justify;
-}
-
-.help-display h5 {
-  margin-top: 2em;
-}
-
-.help-display h6 {
-  margin-top: 2em;
-}
-
-.form-data {
-  display: inline-block;
-  margin: 5px;
-}
-
-input[type="checkbox"].hawtio-checkbox {
-  margin-top: 10px;
-}
-
-.bundle-list {
-  width: 100%;
-}
-
-.bundle-item {
-  position: relative;
-  display: inline-block;
-  width: 300px;
-  margin-bottom: 1px;
-}
-
-.bundle-item-details table {
-  min-height: 0;
-}
-
-.bundle-item-details {
-  height: 0;
-  display: inline-block;
-  z-index: 15;
-}
-
-.bundle-item > a {
-  display: block;
-  z-index: 5;
-}
-
-.bundle-item > a:hover {
-  text-decoration: none;
-}
-
-.bundle-item a span {
-  display: block;
-  padding: 8px;
-  font-weight: normal;
-  z-index: 6;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.bundle-item a span.badge {
-  margin-left: 7px;
-}
-
-.bundle-item a span.badge::before {
-  padding: 0px;
-  float: left;
-  position: relative;
-  top: 4px;
-  left: -8px;
-  display: block;
-  content: ' ';
-  height: 6px;
-  width: 6px;
-  z-index: 10;
-}
-
-.bundle-item a.toggle-action {
-  position: absolute;
-  display: block;
-  width: 16px;
-  height: 16px;
-  margin: 0;
-  padding: 0;
-  right: 12px;
-  top: 6px;
-  opacity: 0.2;
-  transition: all 500ms ease-in-out;
-  font-size: 18px;
-}
-
-.bundle-item a.toggle-action .icon-power-off {
-  color: orange;
-}
-
-.bundle-item a.toggle-action .icon-play-circle {
-  color: green;
-}
-
-.bundle-item a.toggle-action:hover {
-  opacity: 1;
-  text-decoration: none;
-}
-
-.bundle-list {
-  margin-bottom: 2em;
-}
-
-div.hawtio-form-tabs div.tab-content {
-  padding-top: 15px;
-  padding: 10px;
-}
-
-.hawtio-form fieldset legend {
-  margin-bottom: 0;
-  border-bottom: none;
-  font-size: 15px;
-}
-
-.spacer {
-  display: inline-block;
-  margin-bottom: 10px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs {
-  margin-bottom: 0px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li {
-  margin-bottom: -1px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
-  margin-left: 0px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active {
-  margin-right: 1px;
-  margin-left: 2px;
-  box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active a {
-  font-weight: bold;
-}
-
-.popover-inner .popover-title {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.popover {
-  width: auto;
-}
-
-li.stacktrace {
-  line-height: 10px;
-}
-
-.control-button {
-  width: 14px;
-}
-
-.ngViewport:focus {
-  outline: none;
-}
-
-.wikiGridStyle {
-  height: 350px;
-}
-
-/** Animations */
-.wave-enter-setup,
-.wave-leave-setup {
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.wave-enter-setup {
-  position: absolute;
-  left: -100%;
-}
-
-.wave-enter-start {
-  left: 0;
-}
-
-.wave-leave-setup {
-  position: absolute;
-  left: 0;
-}
-
-.wave-leave-start {
-  left: 100%;
-}
-
-/* slideout directive stuff */
-.slideout {
-  position: fixed;
-  z-index: 3000;
-  width: 75%;
-}
-
-.slideout > .slideout-title {
-  min-height: 22px;
-  font-size: 20px;
-  padding: 15px;
-}
-
-.slideout > .slideout-content {
-  position: relative;
-  min-height: 93%;
-  max-height: 93%;
-  overflow: auto;
-  -webkit-transform: translateZ(0);
-}
-
-.slideout-title span {
-  width: 97%;
-  display: inline-block;
-  text-align: left;
-}
-
-.slideout.left > .slideout-content {
-  left: 0;
-  top: 0;
-  margin-right: 2px;
-  margin-left: 0px;
-}
-
-.slideout.right > .slideout-content {
-  left: 2px;
-  top: 0;
-  margin-left: 2px;
-  margin-right: 0px;
-}
-
-.slideout > .slideout-content > .slideout-body {
-  margin: 5px;
-  height: 100%;  
-}
-
-.slideout.right {
-  left: 100%;
-}
-
-.slideout.left {
-  left: -75%;
-}
-
-.slideout .slideout-title a {
-  display: inline-block;
-}
-
-.slideout .slideout-title a:hover {
-  text-decoration: none;
-}
-
-.slideout.right .slideout-title a {
-  margin-left: 5px;
-  float: left;
-}
-
-.out {
-  transition: left 1s, right 1s ease-in-out;
-}
-
-.slideout.left .slideout-title a {
-  margin-right: 5px;
-  float: right;
-}
-
-.slideout.right.out {
-  left: 25%;
-}
-
-.slideout.left.out {
-  left: 0%;
-}
-
-.column-filter {
-  width: 94%;
-  margin-bottom: 10px !important;
-}
-
-.color-picker {
-  display: inline-block;
-  position: relative;
-  margin: 0px;
-  line-height: 0px;
-}
-
-.color-picker .wrapper {
-  display: inline-block;
-  padding: 2px;
-  line-height: 0;
-}
-
-.selected-color {
-  width: 1em;
-  height: 1em;
-  padding: 4px;
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-  display: inline-block;
-  cursor: pointer;
-}
-
-.color-picker-popout {
-  transition: opacity 0.25s ease-in-out;
-  position: absolute;
-  top: 0px;
-  overflow: hidden;
-  padding: 0px;
-  line-height: 0;
-  margin: 0px;
-  width: 0px;
-  opacity: 0;
-}
-
-.popout-open {
-  padding: 1px;
-  width: auto;
-  opacity: 1;
-}
-
-.color-picker div table tr td div {
-  width: 1em;
-  height: 1em;
-  padding: 3px;
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.color-picker div table tr td {
-  padding-right: 5px;
-}
-
-.color-picker div table tr td:last-child {
-  padding-right: 0px;
-}
-
-.modal-body div form fieldset div.spacer {
-  display: inherit;
-  margin-bottom: inherit;
-}
-
-.mouse-pointer {
-  cursor: pointer;
-}
-
-.clickable {
-  cursor: pointer;
-  opacity: 0.6;
-  transition: opacity .5s;
-  text-decoration: none;
-}
-
-.clickable,
-.clickable:before {
-  width: 16px;
-  height: 16px;
-  line-height: 16px;
-}
-
-.clickable.no-fade {
-  transition: none;
-  opacity: 1;
-}
-
-.clickable:hover {
-  opacity: 1;
-  text-decoration: none;
-}
-
-.hawtio-pager {
-  overflow: auto;
-  display: inline-block;
-}
-
-.hawtio-pager label {
-  min-height: 100%;
-  vertical-align: middle;
-  margin-right: 5px;
-  display: inline-block;
-}
-
-.fabric-view {
-  position: relative;
-  min-width: 928px;
-}
-
-.columns {
-  position: absolute;
-  bottom: 0;
-  top: 0;
-  left: 0;
-  right: 0;
-  padding-left: 300px;
-  padding-right: 304px;
-  padding-bottom: 0px;
-  padding-top: 0px;
-}
-
-.column {
-  float: left;
-  position: relative;
-  margin-top: 0px;
-  margin-bottom: 0;
-  height: 100%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.columns #center {
-  width: 100%;
-  padding: 0 5px;
-  margin-right: 8px;
-}
-
-.columns #left {
-  width: 280px;
-  padding: 0 5px;
-  margin-left: -100%;
-  right: 315px;
-}
-
-.columns #right {
-  width: 270px;
-  padding: 0 5px;
-  margin-right: -330px;
-}
-
-.canvas {
-  height: 91%;
-}
-
-.container-section {
-  height: 90%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.profile-section {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.box.ui-draggable-dragging {
-  width: 274px;
-  transition: none;
-}
-
-.box.selected .box-right i {
-  text-shadow: none;
-}
-
-.contained {
-  display: inline-block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: relative;
-  white-space: nowrap;
-}
-
-h2 > .contained {
-  top: 5px;
-}
-
-h4 > .contained {
-  top: 4px;
-}
-
-.dropdown-toggle > .contained,
-.breadcrumb-link > .contained {
-  top: 2px;
-  line-height: 15px;
-}
-
-/* these widths are totally arbitrary */
-.c-narrow {
-  max-width: 5em;
-}
-
-.c-medium {
-  max-width: 10em;
-}
-
-.c-wide {
-  max-width: 15em;
-}
-
-.c-wide2 {
-  max-width: 20em;
-}
-
-.c-wide3 {
-  max-width: 25em;
-  min-width: 10em;
-}
-
-.c-max {
-  width: 100%;
-}
-
-.fabric-page-header > .profile-summary-wide {
-  margin-left: 10px;
-  line-height: 22px;
-}
-
-.profile-selector-name > .contained {
-  top: 8px;
-}
-
-.box {
-  cursor: pointer;
-  height: 50px;
-  overflow: hidden;
-  padding: 0;
-  margin: 0;
-  position: relative;
-  text-overflow: ellipsis;
-  transition: all 0.2s ease 0s;
-  white-space: nowrap;
-  line-height: 22px;
-  vertical-align: middle;
-}
-
-.box > .box-left,
-.box > .box-right,
-.box > .box-middle {
-  display: inline-block;
-  position: absolute;
-  vertical-align: middle;
-  top: 0;
-  bottom: 0;
-  padding-top: 10px;
-}
-
-.box > .box-left {
-  left: 11px;
-}
-
-.box > .box-right {
-  right: 11px;
-}
-
-.box > .box-middle {
-  right: 60px;
-}
-
-.box > .box-left > div,
-.box > .box-right > div,
-.box > .box-middle > div {
-
-}
-
-.box > .box-left > div > div,
-.box > .box-right > div > div,
-.box > .box-middle > div > div {
-  vertical-align: middle;
-  display: inline-block;
-  margin-left: 4px;
-  margin-right: 4px;
-}
-
-
-.box > .box-left > div > div .contained,
-.box > .box-left > div > div > span,
-.box > .box-right > div > div .contained,
-.box > .box-middle > div > div .contained {
-  vertical-align: middle;
-}
-
-
-.box > .box-left > .profile-select {
-  display: inline-block;
-  top: 9px;
-  max-width: 210px;
-  width: 210px;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.box input[type='checkbox'] {
-  margin-top: 5px;
-  display: inline;
-}
-
-.box .active-profile a.invisible {
-  visibility: none;
-}
-
-.box .active-profile div {
-  display: inline;
-}
-
-.box .active-profile {
-  position: absolute;
-  display: inline-block;
-  top: 10px;
-  left: 12px;
-  right: 0px;
-}
-
-.box .active-profile [class^='icon-circle'] {
-  top: 0;
-}
-
-.box-middle ul.inline li {
-  opacity: 0.5;
-  transition: opacity 0.5s;
-}
-
-.box-middle ul.inline li:hover{
-  opacity: 1;
-}
-
-.section-header {
-  padding: 5px 7px;
-}
-
-.selection-controls {
-  display: inline-block;
-}
-
-.section-title {
-  margin-left: 10px;
-  display: inline-block;
-}
-
-.section-controls {
-  display: inline-block;
-  float: right;
-}
-
-#center .section-header .section-controls {
-  position: relative;
-  top: 7px;
-  left: -2px;
-}
-
-.page-padded .section-header .section-controls {
-  position: relative;
-  top: 6px;
-  left: -3px;
-}
-
-.page-padded .section-header .selection-controls {
-  position: relative;
-  top: 1px;
-}
-
-.section-controls > a,
-.section-controls > span > span > span > span > span > .hawtio-dropdown {
-  margin-left: 12px;
-  margin-right: 12px;
-  cursor: pointer;
-}
-
-.section-controls > a:hover,
-.section-controls > span:hover {
-  text-decoration: none;
-}
-
-.section-controls > a.nav-danger {
-  color: IndianRed !important;
-}
-
-.section-controls > a.nav-danger:hover {
-  text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
-}
-
-.page-padded .section-header .section-filter {
-  margin-top: 0px;
-}
-
-.section-filter {
-  position: relative;
-  display: inline-block;
-  margin-left: 12px;
-}
-
-.active-profile-filter > .section-filter {
-  margin-top: 5px;
-}
-
-#center > .section-header > .section-filter {
-  margin-top: 0px;
-}
-
-#right > .section-header > .section-filter {
-  margin-left: 8px;
-}
-
-#right > .canvas {
-  height: 80%;
-}
-
-.section-filter .icon-remove {
-  position: absolute;
-  top: 7px;
-  right: 9px;
-}
-
-.features-toolbar {
-  position: relative;
-  margin-bottom: 0.5em;
-}
-
-.version-section > .canvas > div > .box {
-  line-height: inherit;
-}
-
-.version-section select {
-  width: 100%;
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-
-span.remove {
-  float: right;
-}
-
-span.deleting {
-  text-decoration: line-through;
-}
-
-td.deleting {
-  background-color: IndianRed !important;
-}
-
-td.adding {
-  background-color: Aquamarine !important;
-}
-
-.no-match-filter {
-  display: none;
-}
-
-.file-upload div form fieldset .input-prepend .btn {
-  float: left;
-}
-
-@-moz-document url-prefix() {
-  /* hack to get the add button to line up correctly in FF */
-  .input-prepend .btn {
-    padding-top: 5px;
-    padding-bottom: 5px;
-  }
-}
-
-.input-prepend .progress {
-  position: relative;
-  left: 1px;
-  top: 0px;
-  min-height: 30px;
-  width: 160px;
-}
-
-.login-wrapper {
-  position: absolute;
-  left: 0;
-  top: 350px;
-  padding-top: 2px;
-  padding-bottom: 2px;
-  padding-left: 0;
-  padding-right: 0;
-  line-height: 0;
-  width: 100%;
-}
-
-.login-wrapper form {
-  margin-bottom: 0px;
-  padding-top: 67px;
-  padding-bottom: 7px;
-  padding-right: 40px;
-  padding-left: 40px;
-}
-
-.login-wrapper form fieldset {
-  width: 413px;
-}
-
-.login-form form fieldset .control-group {
-  margin-bottom: 15px;
-  margin-left: 5px;
-}
-
-.login-form form fieldset .control-group button[type='submit'] {
-  float: right;
-}
-
-.login-logo {
-  display: block;
-  position: absolute;
-  letter-spacing: 5px;
-  padding: 10px;
-  font-size: 20px;
-  left: 233px;
-  top: 9px;
-}
-
-.login-logo > img {
-  height: 30px;
-}
-
-/** highlight required fields which have no focus */
-input.ng-invalid,
-textarea.ng-invalid,
-select.ng-invalid {
-  border-color: #e5e971;
-  -webkit-box-shadow: 0 0 6px #eff898;
-  -moz-box-shadow: 0 0 6px #eff898;
-  box-shadow: 0 0 6px #eff898;
-}
-
-/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
-input[type="checkbox"].ng-invalid {
-  -webkit-box-shadow: 0 0 12px #e5e971;
-  -moz-box-shadow: 0 0 12px #e5e971;
-  box-shadow: 0 0 12px #e5e971;
-}
-
-.container-profile-settings {
-  min-width: 360px;
-}
-
-.container-settings {
-  min-width: 360px;
-}
-
-.bold {
-  font-weight: bold;
-}
-
-.container-settings dd .ep {
-  display: inline-block;
-  top: -5px;
-}
-
-.deployment-pane h3 {
-  margin-top: 0px;
-}
-
-.deployment-pane ul li i {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.deployment-pane ul li {
-  white-space: nowrap;
-  padding: 7px;
-}
-
-.deployment-pane ul li editable-property {
-  display: inline-block;
-}
-
-.deployment-pane ul li .ep {
-  display: inline-block;
-}
-
-.container-settings dd input[type=radio] {
-  display: inline-block;
-}
-
-.fabric-page-header .span4 h1,
-.fabric-page-header .span4 h2 {
-  line-height: inherit;
-}
-
-.fabric-page-header h2.inline-block {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.create-container-body {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd {
-  margin-left: 0;
-}
-
-.log-message > dd > div {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul > li {
-  line-height: 12px;
-}
-
-.log-stack-trace > dd > ul > li > div.stack-line > a {
-  font-weight: bold;
-}
-
-pre.stack-line {
-  padding: 0;
-  margin: 0;
-  line-height: 14px;
-}
-
-div.stack-line {
-  white-space: pre-wrap;
-  word-break: break-all;
-  word-wrap: break-word;
-  line-height: 14px;
-}
-
-#container-create-form {
-  margin-bottom: 14px;
-}
-
-#container-create-form .control-group {
-  margin-bottom: 0px;
-}
-
-h1.ajaxError {
-  font-size: 16px;
-}
-
-h2.ajaxError {
-  font-size: 14px;
-}
-
-h3.ajaxError,
-h4.ajaxError {
-  font-size: 12px;
-}
-
-.directive-example {
-  padding: 10px;
-  margin: 10px;
-}
-
-div#main div ul.nav li a.nav-primary.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-div#main div ul.nav li a.nav-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #0044cc;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-div#main div ul.nav li a.nav-primary:hover,
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active,
-div#main div ul.nav li a.nav-primary.disabled,
-div#main div ul.nav li a.nav-primary[disabled] {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active {
-  background-color: #003399 \9;
-}
-
-.nav.nav-tabs li a[disabled] {
-  cursor: not-allowed;
-  opacity: 0.3;
-}
-
-.caret:before {
-  font-family: 'FontAwesome';
-  border: 0;
-  content: "\f078";
-  font-size: 11px;
-  display: block;
-  position: relative;
-  top: -9px;
-  left: 0;
-}
-
-.dropdown.perspective-selector .caret:before {
-  top: -7px;
-}
-
-.caret {
-  border: none;
-  width: 9px;
-}
-
-div#main div ul.nav li a.nav-primary .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.main-nav-upper .container:before {
-  display: none;
-}
-
-.main-nav-upper .container:after {
-  display: none;
-}
-
-.main-nav-upper .container {
-  width: auto;
-  line-height: 23px;
-  vertical-align: auto;
-}
-
-.main-nav-upper .icon-desktop:before {
-  position:relative;
-  top: 1px;
-}
-
-.main-nav-lower .container:before {
-  display: none;
-}
-
-.main-nav-lower .container:after {
-  display: none;
-}
-
-.main-nav-lower .container {
-  width: 100%;
-}
-
-.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
-  border: none;
-}
-
-.main-nav-lower .container ul.nav {
-  width: 100%;
-}
-
-.navbar-inner {
-  height: auto;
-  min-height: 0;
-}
-
-.main-nav-upper {
-  height: 28px;
-  min-height: 28px;
-  font-size: 11px;
-}
-
-.main-nav-upper .brand {
-  font-size: 13px;
-  margin-left: 0px;
-  padding: 0px;
-  font-weight: normal;
-  margin-left: 20px;
-}
-
-.main-nav-upper .nav li a {
-  padding-top: 2px;
-  padding-bottom: 5px;
-}
-
-#main-nav {
-  max-height: 70px;
-  background-color: #F0f0f0;
-  font-size: 20px;
-}
-
-div#main.qdr {
-  margin-top: 40px !important;
-}
-
-dd.file-list {
-  margin-left: 0;
-}
-
-.file-list-toolbar .nav .caption {
-  font-weight: bold;
-  padding-top: 5px;
-  padding-bottom: 5px;
-  padding-left: 0 !important;
-}
-
-.file-icon {
-  padding: 0;
-  margin: 0;
-  display: inline-block;
-  width: 16px;
-  height: 16px;
-  margin-right: 6px;
-}
-
-.file-icon i {
-  width: 16px;
-  height: 16px;
-  font-size: 17px;
-  position: relative;
-  left: 2px;
-  top: 2px;
-}
-
-.file-icon img {
-  width: 16px;
-  height: 16px;
-}
-
-.page-padded {
-  padding-left: 20px;
-  padding-right: 20px;
-}
-
-.fabric-page-header .span4 h2 i {
-  margin-right: 13px;
-}
-
-.controller-section-widget {
-  padding: 3px;
-}
-
-.container-dashboard-controls {
-  position: relative;
-  z-index: 10;
-}
-
-.container-dashboard-controls .pull-right .btn {
-  opacity: 0.5;
-  transition: opacity 1s;
-}
-
-.container-dashboard-controls .pull-right .btn:hover {
-  opacity: 0.9;
-}
-
-.container-dashboard-status-table {
-  position: relative;
-  top: -34px;
-  display: table;
-  max-width: 278px;
-  z-index: 9;
-}
-
-.container-status-dashboard {
-  text-align: center;
-  display: table-cell;
-  min-width: 144px;
-}
-
-.container-status-dashboard i {
-  position: relative;
-  left: 0px;
-  font-size: 133px;
-}
-
-.status-icon {
-  display: inline-block;
-  text-decoration: none;
-  color: inherit;
-}
-
-.status-icon:hover {
-  text-decoration: none;
-}
-
-.dashboard-service-list {
-  display: table-cell;
-  min-width: 139px;
-  vertical-align: middle;
-}
-
-.container-dashboard-profile-controls {
-  width: 100%;
-  text-align: center;
-  margin-bottom: 5px;
-}
-
-.no-list {
-  list-style-type: none;
-}
-
-.profile-selector-item {
-  display: table;
-}
-
-.profile-selector-checkbox {
-  display: table-cell;
-  padding-right: 5px;
-}
-
-.profile-selector-name {
-  display: table-cell;
-  position: relative;
-  width: 100%;
-}
-
-.profile-info {
-  position: absolute;
-  right: 3px;
-}
-
-.profile-list ul {
-  margin-left: 0;
-  margin-bottom: 0;
-}
-
-.profile-list ul li .expandable .expandable-body {
-  margin-left: 16px;
-}
-
-/** fabric active profiles */
-.active-profile-titles {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  height: 40px;
-}
-
-.active-profile-list .expandable {
-  padding: 0;
-}
-
-.active-profile-titles.section-header {
-  padding: 0;
-}
-
-.active-profile-titles div:not(.active-profile-filter) {
-  display: inline-block;
-  font-weight: bold;
-  top: 10px;
-}
-
-.active-profile-row {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  line-height: 22px;
-  height: 22px;
-}
-
-.active-profile-row div {
-  display: inline-block;
-}
-
-.active-profile-list .expandable .expandable-body {
-  width: 100%;
-}
-
-.active-profile-list .expandable .expandable-body ul li .box {
-  background: inherit;
-}
-
-.active-profile-list .expandable .expandable-body ul li .child-container {
-  margin-left: 0;
-}
-
-.active-profile-expander {
-  position: absolute;
-  left: 0;
-}
-
-.active-profile-requirements {
-  position: absolute;
-  right: 75px;
-}
-
-.active-profile-requirements-title {
-  position: absolute;
-  right: 75px;
-}
-
-.active-profile-create {
-  position: absolute;
-  right: 210px;
-}
-
-.active-profile-count {
-  position: absolute;
-  right: 0px;
-}
-
-.active-profile-count-title {
-  padding: 5px;
-  text-align: right;
-  font-weight: bold;
-}
-
-.active-profile-titles .section-controls {
-  position: absolute;
-  top: 10px !important;
-  right: 10px;
-}
-
-.active-profile-titles .section-controls a {
-  font-weight: normal;
-}
-
-
-.active-profile-name {
-  position: absolute;
-  left: 35px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  right: 95px;
-}
-
-.active-profile-icon {
-  position: absolute;
-  top: 1px;
-  left: 15px;
-  color: green !important;
-}
-
-.active-profile-icon i {
-  font-size: 17px;
-}
-
-.active-profile-filter {
-  position: absolute;
-  left: 0px;
-  top: -10px;
-}
-
-.active-profile-main {
-  min-width: 754px;
-}
-
-.active-profile-count a .icon-plus {
-  position: relative;
-  top: 1px;
-}
-
-.active-profile-count a:hover {
-  text-decoration: none;
-}
-
-/** fabric brokers page */
-.mq-titles {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  height: 40px;
-}
-
-.mq-titles.section-header {
-  padding: 0;
-}
-
-.mq-titles .section-controls {
-  position: absolute;
-  top: 9px !important;
-  right: 0px;
-}
-
-.mq-titles .section-controls a {
-  font-weight: normal;
-}
-
-.mq-profile-icon {
-  color: green !important;
-}
-
-.mq-profile-list, .mq-broker-list, .mq-container-list {
-  margin-left: 15px;
-}
-
-i.mq-master {
-  color: orange;
-}
-
-.mq-broker-rectangle, .mq-container-rectangle {
-  position: relative;
-
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-
-  margin-left: 5px;
-  margin-right: 5px;
-  margin-bottom: 5px;
-  margin-top: 5px;
-
-  border-left-width: 10px;
-  border-right-width: 10px;
-  border-top-width: 10px;
-
-  *zoom: 1;
-  padding: 4px 12px;
-  margin-bottom: 0;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-}
-
-.mq-page {
-  position: relative;
-}
-
-.mq-page .hero-unit {
-  position: absolute;
-  top: 53px;
-  left: 10px;
-  right: 10px;
-}
-
-.mq-groups {
-  position: absolute;
-  top: 42px;
-  left: 19px;
-  right: 10px;
-}
-
-.mq-group-rectangle:first-child {
-  margin-top: 10px;
-}
-
-.mq-group-rectangle {
-  position: relative;
-  margin-left: 0;
-  margin-right: 10px;
-  margin-bottom: 10px;
-  margin-top: 0;
-}
-
-.mq-group-rectangle-label .mq-group-name {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: absolute;
-  top: 61px;
-  left: 4px;
-  right: 0;
-}
-
-.mq-group-rectangle-label a {
-  position: absolute;
-  top: 5px;
-  right: 5px;
-}
-
-.mq-group-rectangle-label {
-  position: relative;
-  top: 7px;
-  display: inline-block;
-  min-width: 150px;
-  max-width: 150px;
-  min-height: 150px;
-}
-
-.mq-profiles {
-  position: absolute;
-  min-height: 185px;
-  left: 150px;
-  right: 0;
-  display: inline-block;
-  overflow-x: auto;
-}
-
-.mq-profiles .mq-profile-canvas {
-  overflow: auto;
-}
-
-.mq-profile-rectangle {
-  display: inline-block;
-  height: 150px;
-  margin: 0;
-  margin-top: 5px;
-  margin-left: 10px;
-  padding-left: 4px;
-  padding-right: 4px;
-  padding-top: 4px;
-}
-
-.mq-profile-rectangle-label {
-  position: relative;
-  top: 2px;
-}
-
-.mq-profile-name {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  margin-right: 48px;
-  max-width: 300px;
-  display: block;
-}
-
-.mq-profile-rectangle-label .mq-profile-create-broker {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-
-.mq-profile-canvas {
-  display: inline-block;
-}
-
-.mq-broker-area {
-  position: relative;
-  top: 11px;
-  text-align: center;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.mq-container-rectangle {
-  margin-top: 2px;
-  width: 20px;
-}
-
-.mq-container-row {
-  display: block;
-  margin-top: 8px;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.mq-broker-rectangle {
-  height: 88px;
-}
-
-.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
-  white-space:nowrap;
-}
-
-/** dashboard */
-.dashboard-link-row {
-  width: 100%;
-  position: relative;
-}
-
-a.dashboard-link {
-  line-height: 15px;
-  font-weight: normal;
-}
-
-a.dashboard-link:hover {
-  text-decoration: none;
-}
-
-.dashboard-link {
-  position: absolute;
-  top: 15px;
-  right: 76px;
-  z-index: 500;
-}
-
-.container-list-main {
-  min-width: 592px;
-}
-
-.widget-title > .row-fluid {
-  position: relative;
-}
-
-.widget-title > .row-fluid > .pull-left {
-  position: absolute;
-  right: 16px;
-  left: 0;
-}
-
-.widget-title > .row-fluid > .pull-left > .ep > div {
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.container-detail-profiles {
-  position: relative;
-  margin-top: 2px;
-}
-
-.container-detail-profile-buttons {
-  position: absolute;
-  right: 0;
-  z-index: 50;
-}
-
-#dialog-body div .profile-list {
-  max-height: 327px;
-  overflow-y: auto;
-}
-
-@media (max-width: 979px) {
-  .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
-    padding: 0;
-  }
-
-  .navbar-fixed-top, .navbar-fixed-bottom {
-    position: fixed;
-  }
-
-}
-
-.header-list li {
-  vertical-align: top;
-  height: 30px;
-}
-
-.header-list li div {
-  height: 30px;
-}
-
-.provision-list {
-  margin-left: 0px;
-}
-
-.provision-list ul {
-  margin-left: 0px;
-}
-
-.provision-list ul li {
-  list-style-type: none;
-  padding: 7px;
-}
-
-ul.zebra-list {
-  margin-left: 0;
-}
-
-.zebra-list li {
-  padding: 7px;
-}
-
-ul.zebra-list > li {
-  list-style-type: none;
-}
-
-ol.zebra-list {
-  counter-reset:li;
-  margin-left: 0;
-  padding-left: 0;
-}
-
-ol.zebra-list > li {
-  position: relative;
-  list-style-type: none;
-}
-
-ol.zebra-list > li:before {
-  content: counter(li);
-  counter-increment: li;
-  padding: 7px;
-  font-weight: bold;
-}
-
-.pointer {
-  cursor: pointer;
-}
-
-.container-profile-settings span.folder-title {
-  font-weight: bold;
-}
-li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
-  color: #005580;
-}
-.widget-body div div .wiki-fixed {
-  margin: 3px;
-}
-
-
-.loading {
-  position: relative;
-  top: 140px;
-}
-.loading p {
-  margin-top: 20px;
-  font-weight: bold;
-  font-size: 20px;
-}
-
-.add-link {
-  position: absolute;
-  right: 20px;
-  top: 130px;
-  width: 22px;
-  height: 19px;
-  text-align: center;
-}
-
-.log-table > li {
-  position: relative;
-  list-style-type: none;
-  min-height: 32px;
-  max-width: 100%;
-  padding: 0;
-}
-
-.log-table .table-head div div {
-  font-weight: bold;
-  text-align: center !important;
-  direction: ltr !important;
-}
-
-.log-table .table-head div div:nth-child(4) {
-  font-weight: bold;
-  left: 247px;
-  width: 326px;
-  text-align: center !important;
-  direction: ltr !important;
-}
-
-.log-table > li > div > div {
-  position: absolute;
-  display: inline-block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  font-size: 12px;
-  min-height: 28px;
-  overflow-x: hidden;
-  padding: 3px;
-  padding-top: 6px;
-  width: auto;
-}
-
-.log-table {
-  margin: 0;
-}
-
-.log-table > .table-row {
-  cursor: pointer;
-}
-
-.log-table > .table-row.selected:before {
-  z-index: 39;
-  position: absolute;
-  top: 6px;
-  font-family: FontAwesome;
-  content: "\f054";
-  font-size: 20px;
-  color: green;
-}
-
-.log-table > li > div > div:nth-child(1):not(.stack-line) {
-  left: 0;
-  width: 11px;
-  z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(2) {
-  left: 18px;
-  width: 180px;
-  z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(3) {
-  left: 190px;
-  width: 60px;
-  z-index: 5;
-  text-align: center;
-}
-
-.log-table > li > div > div:nth-child(4) {
-  padding-right: 5px;
-  text-align: right;
-  direction: rtl;
-  z-index: 3;
-  left: 0;
-  width: 573px;
-}
-
-.log-table > li > div > div:nth-child(5) {
-  left: 580px;
-  right: 0;
-  padding-left: 5px;
-}
-
-.log-table > li > div > div:nth-child(6) {
-  position: static;
-  margin-top: 43px;
-  white-space: normal;
-  display: block;
-}
-
-.log-info-panel {
-  z-index: 60;
-  position: fixed;
-  right: 7em;
-  top: 150px;
-  bottom: 5em;
-  padding: 0;
-  overflow: hidden;
-  min-height: 500px;
-  min-width: 800px;
-}
-
-@media(max-width: 1085px) {
-  .log-info-panel {
-    left: 5px;
-    right: 5px;
-    max-width: inherit;
-    min-width: 500px;
-  }
-}
-
-.log-info-panel >.log-info-panel-frame {
-  position: relative;
-  height: 100%;
-  width: 100%;
-  margin: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
-  position: absolute;
-  top: 0;
-  height: 80px;
-  left: 5px;
-  right: 50px;
-  white-space: nowrap;
-}
-
-.log-info-panel-header > span {
-  margin-left: 7px;
-  position: relative;
-  top: 2px;
-  overflow: hidden;
-}
-
-.log-info-panel-frame > .log-info-panel-body {
-  position: absolute;
-  overflow: auto;
-  left: 5px;
-  right: 27px;
-  top: 80px;
-  bottom: 15px;
-  padding-top: 10px;
-  padding-left: 5px;
-  padding-right: 5px;
-}
-
-.log-info-panel-body > .row-fluid {
-  margin-bottom: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
-  margin-right: 7px;
-  white-space: nowrap;
-}
-
-.log-table-dashboard {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.ex-node-container {
-  position: relative;
-  width: 100%;
-  height: 696px;
-}
-
-.ex-node {
-  position: absolute;
-  width: 150px;
-  height: 90px;
-  text-align: center;
-  padding-top: 60px;
-}
-
-.dozer-mapping-node {
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-  padding: 20px;
-}
-
-.dozer-mappings li {
-  list-style-type: none;
-}
-
-.dozer-mappings ul {
-  margin-left: 50px;
-}
-
-.dozer-mappings span {
-  width: 500px;
-}
-
-.wiki-file-list-up:hover {
-  text-decoration: none;
-
-}
-
-.fabric-page-header.features {
-  margin-top: 10px;
-}
-
-.fabric-page-header > * {
-  line-height: 38px;
-}
-
-.profile-selector-name a:hover {
-  text-decoration: none;
-}
-
-.file-name:hover {
-  text-decoration: none;
-}
-
-i.expandable-indicator.folder {
-  font-size: 17px;
-}
-
-.switches li {
-  width: 215px;
-}
-
-.switch-light.switch-ios {
-  width: 100px;
-}
-
-.switch-container {
-  position: static;
-  padding-top: 5px;
-  width: 215px;
-  height: 45px;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] {
-
-}
-
-[class^="dynatree-folder icon-"]:before, [class*=" dynatree-folder icon-"]:before {
-  font-size: 17px;
-  margin-left: 18px;
-}
-
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-connector {
-  display: none;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-icon {
-  display: none;
-}
-
-.main-nav-lower .container ul .dropdown.overflow {
-  margin-right: 25px;
-}
-
-.dropdown-menu.right {
-  left: auto;
-  right: 0;
-}
-
-.dropdown-menu.right:before {
-  left:auto !important;
-  right: 9px;
-}
-
-.dropdown-menu.right:after {
-  left:auto !important;
-  right: 10px;
-}
-
-@media(max-width: 1134px) {
-  .profile-details > [class^="span"] {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-}
-
-/* Start 800x600 Optimzations */
-@media(max-width: 849px) {
-
-  .page-padded {
-    padding-left: 5px;
-    padding-right: 5px;
-  }
-
-  .wiki-fixed {
-    margin-left: 0 !important;
-    margin-right: 0 !important;
-  }
-
-  .wiki-fixed .row-fluid .span9 {
-    margin-left: 9px;
-  }
-
-  .container-details > [class*=" offset"] {
-    display: none;
-  }
-
-  .container-details > .span4.offset1 {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .container-details > .span5.offset1 {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .create-container-body > [class^="span"] {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .create-container-body > [class^="span"]:first-child {
-    margin-bottom: 15px;
-  }
-
-  .features-toolbar .pull-left {
-    margin-bottom: 10px;
-  }
-
-  .edit-feature-lists > [class^="span"] {
-    width: 49%;
-    float: inherit;
-    display: inline-block;
-    margin-left: 0;
-    margin-right: 0;
-  }
-
-}
-/* End 800x600 optimizations */
-
-/*
- * jquery.tocify.css 1.8.0
- * Author: @gregfranko
- */
-/* The Table of Contents container element */
-.tocify {
-  /* top works for the wiki, may need customization
-     elsewhere */
-  top: 120px;
-  width: 232px;
-  padding-left: 1em;
-  padding-right: 1em;
-  overflow-y: auto;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  position: fixed;
-  bottom: 5px;
-  z-index: 20;
-}
-
-.tocify h2,
-.tocify h3 {
-  white-space: normal;
-}
-
-.toc-container {
-  position: relative;
-  width: 100%;
-}
-
-.toc-content {
-  position: absolute;
-  left: 290px;
-  right: 0;
-}
-
-.tocify ul {
-  margin-left: 0px;
-}
-
-.tocify li {
-  list-style-type: none;
-  display: block;
-}
-
-.tocify li a {
-  display: block;
-  padding: 3px;
-  transition: background,border .25s ease-in-out;
-}
-
-.tocify li a:hover {
-  text-decoration: none;
-}
-
-.tocify li a.active {
-  font-weight: bolder;
-}
-
-/* Makes the font smaller for all subheader elements. */
-.tocify-subheader li {
-  font-size: 12px;
-}
-
-/* Further indents second level subheader elements. */
-.tocify-subheader .tocify-subheader {
-  text-indent: 30px;
-}
-
-/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
-.tocify-subheader .tocify-subheader .tocify-subheader {
-  text-indent: 40px;
-}
-
-@media(max-width: 700px) {
-  .tocify {
-    position: static;
-    width: auto;
-    margin-bottom: 1em;
-  }
-
-  .toc-content {
-    position: static;
-    left: auto;
-  }
-}
-
-fs-donut svg g text.value {
-  font-size: 40px;
-}
-
-fs-donut svg g text.units {
-  font-size: 20px;
-}
-
-.health-displays {
-  width: 100%;
-}
-
-.panel {
-  position: fixed;
-}
-
-.panel.bottom {
-  bottom: 0;
-}
-
-.deploy {
-  right: 0;
-}
-
-.profile-list-item:after {
-  content: ", ";
-}
-
-.profile-list-item:last-child:after {
-  content: " ";
-}
-
-.health-displays .health-display,
-.column-box,
-.column-box-variable,
-.column-box-square,
-.column-box-half-screen {
-  position: relative;
-  display: inline-block;
-  width: 300px;
-  height: 300px;
-  margin-left: 0;
-  margin-right: 0;
-  margin-bottom: 10px;
-  overflow: hidden;
-  vertical-align: top;
-}
-
-.column-box {
-  height: auto;
-  min-height: 175px;
-  width: 500px;
-}
-
-.wiki-icon-view {
-  min-height: 200px;
-}
-
-.wiki-icon-view .column-box {
-  min-height: 0;
-  margin-bottom: 25px;
-}
-
-.column-box-half-screen {
-  width: 50%;
-  min-width: auto;
-  height: auto;
-}
-
-.column-box-square {
-  height: 32px;
-  width: 32px;
-  line-height: 28px;
-  vertical-align: middle;
-  text-align: center;
-}
-
-.column-box-variable {
-  height: auto;
-  min-height: 175px;
-  width: auto;
-  min-width: 175px;
-  max-width: 500px;
-}
-
-.column-box-variable > h3 {
-  margin-bottom: 0;
-}
-
-.column-box .file-icon > * {
-  width: 100%;
-  height: auto;
-}
-
-.location-box {
-  margin: 12px;
-}
-
-.column-box-square > i {
-  font-size: 24px;
-  height: 24px;
-  vertical-align: middle;
-}
-
-.container-groups .column-box {
-  height: 125px;
-  width: auto;
-}
-
-.container-header-version,
-.container-header-version + hr {
-  margin-bottom: 0;
-}
-
-.container-header-version + hr {
-  margin-top: 0;
-}
-
-.container-groups .container-group-header {
-  border-bottom: none;
-}
-
-.column-row {
-  float: left;
-}
-
-.column-box-selected .column-box-header {
-  font-size: 150%;
-  font-weight: bold;
-}
-
-.column-box-icons > .span1 {
-  text-align: center;
-  vertical-align: middle;
-  width: 32px;
-}
-
-.column-box-icons i, 
-.column-box-icons img {
-  font-size: 32px;
-  width: 32px;
-}
-
-.ok-container > i {
-  font-size: 32px;
-  color: #a4a4a4;
-}
-
-.column-box > div {
-  position: relative;
-  height: 100%;
-  margin: 10px;
-}
-
-.column-box h3 {
-  text-overflow: ellipsis;
-  line-height: normal;
-  margin-bottom: 0;
-}
-
-.bottom-anchored {
-  position: absolute;
-  bottom: 0;
-  margin-top: -3em;
-}
-
-.label-list > li > .badge {
-  margin-top: 3px;
-  margin-bottom: 3px;
-}
-
-.label-list > .inline-block > .badge {
-  margin-left: 3px;
-  margin-right: 3px;
-}
-
-.health-details {
-  top: 0;
-  bottom: 0;
-  z-index: 40;
-}
-
-.health-status {
-  padding: 0;
-  position: absolute;
-  bottom: 0;
-  overflow: hidden;
-  left: 0;
-  right: 0;
-  z-index: 20;
-}
-
-.health-message-wrap {
-  margin: 0;
-  padding: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.health-message {
-  display: block;
-  margin: 10px;
-}
-
-.health-details-toggle {
-  position: absolute;
-  display: inline-block;
-  width: 16px;
-  height: 16px;
-  right: 2px;
-  top: 0px;
-}
-
-.health-details-wrap {
-  width: 300px;
-  height: 300px;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-
-.health-details-wrap a {
-  color: #d4d4d4;
-}
-
-.health-details-wrap dl {
-  margin-top: 5px;
-  margin-bottom: 2px;
-  margin-left: 0;
-}
-
-.health-details-wrap table {
-  max-width: 300px;
-}
-
-.health-details-wrap table tr td {
-  vertical-align: middle;
-}
-
-.health-details-wrap table tr td:first-child {
-  font-weight: bold;
-  text-align: right;
-  padding-right: 5px;
-}
-
-.health-details-wrap table tr td:last-child {
-  padding-left: 5px;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-}
-
-.health-display-title {
-  padding-top: 18px;
-  font-size: 30px;
-  width: 100%;
-  height: 40px;
-  margin-top: 10px;
-  margin-bottom: 10px;
-  font-weight: bold;
-  text-align: center;
-}
-
-.health-display-title.ok {
-  background-color: lightgreen;
-}
-
-.health-display-title.warning {
-  background-color: darkorange;
-}
-
-.health-displays .health-display .health-chart {
-  width: 300px;
-  height: 300px;
-}
-
-.create-column {
-  vertical-align: top;
-  display: inline-block;
-  width: 445px;
-  margin-bottom: 10px;
-}
-
-#create-form {
-  max-width: 422px;
-}
-
-/* hack to work around strange tabset behavior */
-tabset > .tabbable > ul {
-/*  display: none; */
-}
-/* end hack */
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
-  cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
-  cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
-  opacity: 0.3;
-}
-
-.toast.toast-warning * {
-  color: black;
-}
-
-.hawtio-toc .panel-title {
-  padding: 0;
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.hawtio-toc .panel-title a {
-  display: block;
-  text-align: center;
-  padding: 10px;
-}
-
-._jsPlumb_endpoint {
-  z-index: 25;
-}
-
-.panes {
-  position: relative;
-  display: block;
-  min-height: 100%;
-}
-
-.panes > .left-pane {
-  position: absolute;
-  left: 0;
-  right: 285px;
-  height: 100%;
-}
-
-.panes > .right-pane {
-  position: absolute;
-  right: 0;
-  width: 275px;
-  height: 100%;
-}
-
-.camel-viewport {
-  overflow: auto;
-  height: 100%;
-}
-
-.camel-canvas-endpoint svg circle {
-  fill: #346789;
-}
-
-.camel-props {
-  position: relative;
-  height: 100%;
-}
-
-.camel-props > .button-bar {
-  left: 0;
-  right: 0;
-  display: block;
-  position: absolute;
-}
-
-.button-bar > .centered > form {
-  margin-bottom: 10px;
-}
-
-.camel-props > .prop-viewport {
-  overflow-y: auto;
-  overflow-x: visible;
-  position: absolute;
-  bottom: 0;
-  top: 80px;
-  width: 100%;
-}
-
-.camel-props form > fieldset > legend {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-control > label {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-props > p {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  margin-bottom: 25px;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-control > .controls {
-  margin-top: 15px;
-}
-
-.camel-props form fieldset .control-label {
-  float: none;
-  width: auto;
-  text-align: left;
-}
-
-.camel-props form fieldset .controls {
-  margin-left: auto;
-}
-
-.camel-props form fieldset .controls .input-xxlarge {
-  width: auto;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
-  float: none;
-}
-
-.welcome {
-  margin-left: 5em;
-  margin-right: 5em;
-}
-
-input.ng-invalid-pattern {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-
-input.ng-invalid-pattern:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-
-.threads.logbar > .logbar-container {
-  margin-top: 2px;
-  margin-bottom: 5px;
-}
-
-.state-panel > ul > li:not(:first-child) > span {
-  margin-left: 15px;
-}
-
-.state-panel > ul > li.active {
-  font-weight: bold;
-}
-
-.runnable {
-  color: green;
-}
-
-.timed-waiting {
-  color: orange;
-}
-
-.waiting,
-.darkgray {
-  color: darkgray;
-}
-
-.blocked {
-  color: red;
-}
-
-strong.new,
-.lightgreen {
-  color: lightgreen;
-}
-
-.terminated,
-.darkred {
-  color: darkred;
-}
-
-.thread-state-indicator {
-  width: 100%;
-  height: 100%;
-  padding-top: 5px;
-}
-
-.monitor-indicator {
-  font-size: 10px;
-  padding: 4px;
-  margin: 5px;
-}
-
-.monitor-indicator.button {
-  cursor: pointer;
-}
-
-.monitor-indicator.true {
-  background: #1cd11d;
-  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
-}
-
-.monitor-indicator.false {
-  background: #737373;
-  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
-}
-
-.table-header {
-  color: black;
-  position: relative;
-}
-
-.table-header > .indicator:after {
-  font-family: 'FontAwesome';
-  position: absolute;
-  right: 5px;
-}
-
-.table-header.asc > .indicator:after {
-  content: "\f077";
-}
-
-.table-header.desc > .indicator:after {
-  content: "\f078";
-}
-
-.camel-tree > ul.nav {
-  margin-bottom: 3px !important;
-}
-
-.camel-tree > .section-filter {
-  margin: 0 0 8px;
-  display: block;
-}
-
-.table > thead > tr > th {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-th > .indicator:before {
-  display: inline-block;
-  content: "\00a0";
-  margin-left: 12px;
-}
-
-.simple-table-checkbox, 
-.simple-table-checkbox > input {
-  vertical-align: middle;
-  margin: 0;
-  width: 16px;
-  line-height: 16px;
-  max-width: 16px;
-}
-
-
-.table td,
-.table th {
-  vertical-align: middle;
-}
-
-.ngCellText .icon-replication-controller {
-  width: 32px;
-}
-
-.repository-browser-toolbar > .btn {
-  margin-bottom: 10px;
-}
-
-.bundle-list-toolbar {
-  vertical-align: top;
-}
-
-.bundle-list-toolbar > .pull-left > *,
-.bundle-list-toolbar > .pull-right > * {
-  display: inline-block;
-}
-
-.bundle-list-toolbar > div > input,
-.bundle-list-toolbar > div > div > input {
-  margin-bottom: 10px;
-}
-
-.bundle-list-toolbar > div > label,
-.bundle-list-toolbar > div > strong {
-  position: relative;
-  top: -3px;
-}
-
-.bundle-list-toolbar > div > .input-append {
-  position: relative;
-  left: 3px;
-  top: -9px;
-}
-
-.connect-column {
-  display: inline-block;
-  vertical-align: top;
-  width: 34em;
-}
-
-.icon-spacer:before {
-  content: '\00a0';
-  width: 11px;
-}
-
-.dropdown-menu {
-  padding-top: 0;
-  padding-bottom: 0;
-  margin-top: 0;
-  top: 100%;
-  left: 0;
-  right: 0;
-  border-radius: 0;
-}
-
-.main-nav-upper .dropdown-menu {
-  border-top: none;
-  margin-top: -1;
-  border-radius: 0;
-}
-
-.main-nav-lower .dropdown-menu {
-  border-top: none;
-}
-
-.dropdown-menu > li > a {
-  cursor: pointer;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-
-.dropdown.perspective-selector > .dropdown-menu {
-  min-width: 160px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div {
-  display: block;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > p,
-.hawtio-dropdown p {
-  font-size: smaller;
-  padding-left: 3px;
-  padding-right: 3px;
-  margin-bottom: 0;
-}
-
-.nav .hawtio-dropdown {
-  margin-top: 2px;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul {
-  margin-top: 0;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
-  padding: 3px 5px;
-}
-
-.dropdown-menu > li:hover > a {
-  text-shadow:0px 0px 1px white;
-}
-
-.dropdown-menu:before {
-  display: none !important;
-}
-
-.dropdown-menu:after {
-  display: none !important;
-}
-
-.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
-  margin-top: 4px;
-  border-top: none;
-}
-
-span.hawtio-dropdown {
-  position: relative;
-  display: block;
-  cursor: pointer;
-}
-
-span.hawtio-dropdown .dropdown-menu {
-  width: auto;
-}
-
-.btn .hawtio-dropdown > .caret {
-  width: 7px;
-}
-
-.btn .hawtio-dropdown > .dropdown-menu {
-  left: -10px;
-  margin-top: 5px;
-  text-align: left;
-}
-
-.submenu-caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-}
-
-.submenu-caret:before {
-  font-family: 'FontAwesome';
-  border: 0;
-  content: "\f054";
-  font-size: 11px;
-  display: block;
-}
-
-.hawtio-dropdown > ul > li {
-  padding: 3px;
-  padding-left: 5px;
-}
-
-.hawtio-dropdown > ul > li > .menu-item {
-  position: relative;
-  display: block;
-}
-
-.hawtio-dropdown > .submenu-caret:before,
-.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
-  position: absolute;
-  top: 0;
-  right: -2px;
-}
-
-.dropdown-menu .sub-menu {
-  position: absolute;
-  left: 195px;
-  top: -8px;
-}
-
-.hawtio-breadcrumb > li {
-  display: inline-block;
-}
-
-.dropdown-menu .dropdown .caret {
-  display: none;
-}
-
-.hawtio-breadcrumb .caret {
-  border: 0;
-  width: 17px;
-  margin-right: 2px;
-  margin-left: 0;
-}
-
-.hawtio-breadcrumb .caret:before {
-  font-family: 'FontAwesome';
-  content: "\F105";
-  font-size: 40px;
-  top: -9px;
-}
-/*
-.modal {
-  z-index: 5000;
-  width: 660px;
-  margin: -250px 0 0 -320px;
-}
-.modal-backdrop {
-  z-index: 4090;
-}
-*/
-.scrollable-section {
-  overflow-x: hidden;
-  overflow-y: auto;
-  max-height: 260px;
-}
-
-.component {
-  opacity: 0.8;
-  filter: alpha(opacity = 80);
-}
-
-.window,
-.node > rect {
-  stroke-width: 2px;
-  stroke: #346789;
-  fill: url(#rect-gradient);
-  border: 2px solid #346789;
-  z-index: 20;
-  position: absolute;
-  font-size: 0.8em;
-  filter: alpha(opacity = 80);
-  cursor: move;
-
-  box-shadow: 2px 2px 19px #e0e0e0;
-  -o-box-shadow: 2px 2px 19px #e0e0e0;
-  -webkit-box-shadow: 2px 2px 19px #e0e0e0;
-  -moz-box-shadow: 2px 2px 19px #e0e0e0;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  background-color: lightgrey;
-  fill: lightgrey;
-}
-
-.window,
-.node.selected > rect {
-    stroke-width: 2px;
-    stroke-dasharray: 10,5;
-    stroke: red;
-}
-
-.window-inner {
-  position: relative;
-  border-radius: 2px;
-}
-
-.window-inner {
-  padding: 6px;
-}
-
-.window-inner.from,
-.node > .from {
-  background-color: lightsteelblue;
-  fill: lightsteelblue;
-}
-
-.window-inner.choice,
-.node > .choice {
-  background-color: lightblue;
-  fill: lightblue;
-}
-
-.window-inner.when,
-.node > .when {
-  background-color: lightgreen;
-  fill: lightgreen;
-}
-
-.window-inner.otherwise,
-.node > .otherwise {
-  background-color: lightgreen;
-  fill: lightgreen;
-}
-
-.window-inner.to,
-.node > .to {
-  background-color: lightsteelblue;
-  fill: lightsteelblue;
-}
-
-.window-inner.log,
-.node > .log {
-  background-color: lightcyan;
-  fill: lightcyan;
-}
-
-.window-inner.setBody,
-.node > .setBody {
-  background-color: #d3d3d3;
-  fill: #d3d3d3;
-}
-
-.window-inner.onException,
-.node > .onException {
-  background-color: lightpink;
-  fill: lightpink;
-}
-
-.window-inner.delay,
-.node > .delay {
-  background-color: lightgrey;
-  fill: lightgrey;
-}
-
-.window-inner.bean,
-.node > .bean {
-  background-color: mediumaquamarine;
-  fill: mediumaquamarine;
-}
-
-.window-inner > * {
-  vertical-align: middle;
-}
-
-.window-inner > span {
-  max-width: 15em;
-  display: inline-block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.window:hover {
-  border-color: #5d94a6;
-  background-color: #ffffa0;
-}
-
-.window:hover > .window-inner {
-  background: inherit;
-}
-
-.window.selected {
-  background-color: #f0f0a0;
-}
-
-.window.selected > .window-inner {
-  background: inherit;
-}
-
-img.nodeIcon {
-  width: 24px !important;
-  height: 24px !important;
-  cursor: crosshair;
-  margin-right: 10px;
-}
-
-img.nodeIcon:hover {
-  opacity: 0.6;
-  box-shadow: 2px 2px 19px #a0a0a0;
-  background-color: #a0a0a0;
-}
-
-.l1 {
-  font-size: 13px;
-}
-
-._jsPlumb_connector {
-  z-index: 4;
-}
-
-._jsPlumb_overlay {
-  z-index: 6;
-}
-
-.hl {
-  border: 3px solid red;
-}
-
-.strong {
-  font-weight: bold;
-}
-
-.discovery > li {
-  position: relative;
-}
-
-.discovery > li > div {
-  vertical-align: middle;
-}
-
-.discovery > li > div:first-child {
-  margin-right: 10px;
-}
-
-.discovery > li > div:last-child,
-.discovery > li > .lock {
-  position: absolute;
-  width: 32px;
-  height: 32px;
-  margin: auto;
-  top: 0;
-  bottom: 0;
-  right: 10px;
-}
-
-.discovery > li > .lock {
-  right: 42px;
-}
-
-.discovery > li > div:last-child > div.connect-button {
-  width: 32px;
-  height: 32px;
-}
-
-.discovery > li > div:last-child > div > i,
-.discovery > li > .lock > i {
-  font-size: 32px;
-  cursor: pointer;
-}
-
-.discovery > li > .lock > i {
-  cursor: inherit;
-}
-
-.discovery > li > div:first-child > img {
-  vertical-align: middle;
-  width: 64px;
-  max-height: 64px;
-}
-
-.auth-form {
-  white-space: nowrap;
-}
-
-.auth-form > form > input {
-  margin-bottom: 0;
-}
-
-.slideout-body .btn-group,
-.btn-group[hawtio-pager] {
-  line-height: normal;
-}
-
-@media print {
-  #main-nav,
-  #log-panel {
-    display: none !important;
-    height: 0 !important;
-  }
-
-  .wiki-grid {
-    display: none;
-  }
-
-  .wiki-fixed {
-    margin-top: 0 !important;
-  }
-
-  .wiki-fixed > .row-fluid > .span3 {
-    display: none;
-  }
-
-  .wiki-fixed > .row-fluid > .span9 {
-    width: 100%;
-  }
-
-  .instance-name {
-    display: none !important;
-  }
-
-  .logbar-container > .nav {
-    display: none !important;
-    height: 0 !important;
-  }
-
-}
-
-.prefs {
-  height: 100%;
-  margin: 0;
-}
-
-.prefs > div {
-  height: 100%;
-  margin: 0;
-}
-
-.slideout-body .prefs {
-  overflow: hidden;
-  margin: 0;
-}
-
-.slideout-body .prefs .tabbable {
-  position: relative;
-  height: 100%;
-  margin: 0;
-}
-
-.pref-slideout > div > div > div {
-  height: 100%;
-  margin: 0;
-}
-
-.pref-slideout .slideout-body {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0px;
-  right: 0;
-  overflow: none !important;
-  margin: 0 !important;
-}
-
-.slideout-body .prefs .nav.nav-tabs {
-  top: 5px;
-  bottom: 5px;
-  left: 0;
-  width: 130px;
-  position: absolute;
-  margin: 0;
-  overflow-y: auto;
-}
-
-.slideout-body .prefs .nav.nav-tabs:after,
-.slideout-body .prefs .nav.nav-tabs:before {
-  display: none;
-}
-
-.slideout-body .prefs .nav.nav-tabs li {
-  display: block;
-  float: none;
-}
-
-.slideout-body .prefs .tab-content {
-  position: absolute;
-  overflow: auto;
-  top: 5px;
-  left: 140px;
-  right: 15px;
-  bottom: 5px;
-  margin: 0;
-}
-
-.help-header .without-text,
-.about-header .without-text {
-  position: relative;
-  top: -4px;
-  vertical-align: middle;    
-  height: 48px;
-}
-
-.help-header .with-text,
-.about-header .with-text {
-  position: relative;
-  top: -4px;
-  vertical-align: middle;
-  height: 48px;
-}
-
-.service-list > li {
-  list-style-type: none;
-  display: inline-block;
-  margin-left: 3px;
-  margin-right: 3px;
-  vertical-align: middle;
-}
-
-.container-type {
-  width: 16px;
-}
-
-.container-status > i:before,
-.container-type i:before,
-.container-type img {
-  vertical-align: middle;
-  font-size: 16px;
-  height: 16px;
-  width: auto;
-  line-height: 16px;
-}
-
-.container-type img.girthy {
-  height: auto;
-  width: 16px;
-}
-
-.app-logo {
-  width: 64px;
-  margin-right: 10px;
-}
-
-.app-logo img,
-.app-logo i {
-  vertical-align: middle;
-  font-size: 64px;
-  height: 64px;
-  width: auto;
-  line-height: 64px;
-}
-
-.app-logo img.girthy {
-  height: auto;
-  width: 64px;
-}
-
-.service-list i:before,
-.service-list img {
-  height: 16px;
-  width: auto;
-  font-size: 16px;
-  vertical-align: middle;
-}
-
-.service-list img.girthy {
-  height: auto;
-  width: 16px;
-}
-
-.perspective-selector img {
-  width: auto;
-  height: 16px;
-  vertical-align: top;
-}
-
-.operation-row {
-  position: relative;
-  height: 30px;
-  vertical-align: middle;
-}
-
-.operation-row.can-invoke {
-  cursor: pointer;
-}
-
-.operation-row.cant-invoke {
-  cursor: not-allowed;
-}
-
-.operation-row > * {
-  display: inline-block;
-  height: 100%;
-  line-height: 30px;
-}
-
-.operation-actions {
-  position: absolute;
-  right: 6px;
-  top: 4px;
-}
-
-.help-block:empty {
-  margin-top: 10px;
-}
-
-ul.dynatree-container {
-  overflow: visible;
-}
-
-.pane {
-	position: absolute;
-    bottom: 0;
-    top: 70px;
-    height: auto;
-    width: 300px;
-}
-
-.pane > .pane-wrapper {
-  position: relative;
-  height: 100%;
-  width: 100%;
-  overflow: hidden;
-}
-
-.pane-viewport {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  overflow: auto;
-  margin-right: 10px;
-}
-
-.pane-content {
-  width: auto;
-  height: auto;
-}
-
-.pane-bar {
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 5px;
-  cursor: ew-resize;
-  height: 100%;
-}
-
-.pane-content {
-  float: none;
-  position: static;
-}
-
-.pane.left {
-  /*left: 0; */
-  z-index: 39;
-}
-
-.pane.left .pane-viewport {
-  margin-left: 10px;
-  right: 5px;
-  margin-right: 0;
-}
-
-.pane.left .pane-bar {
-  right: 0;
-}
-
-.pane.right {
-  right: 0;
-}
-
-.pane.right .pane-viewport {
-  margin-left: 10px;
-  margin-right: 5px;
-  right: 5px;
-}
-
-.pane.right .pane-bar {
-  left: 0;
-}
-
-.pane-header-wrapper {
-  margin-left: 10px;
-  margin-right: 10px;
-}
-
-.tree-header {
-  position: relative;
-  height: 26px;
-}
-
-.fabric-app-view-header {
-  height: auto;
-}
-
-.fabric-app-view-header > * {
-  line-height: 12px;
-}
-
-.fabric-app-view-header .alert {
-  margin-bottom: 0;
-}
-
-.fabric-app-view-header .row-fluid:last-child {
-  padding-bottom: 8px;
-}
-
-.tree-header > .left,
-.tree-header > .right {
-  position: absolute;
-  top: 3px;
-  bottom: 6px;
-  vertical-align: middle;
-  line-height: 10px;
-}
-
-.tree-header > .left {
-  left: 0;
-}
-
-.tree-header > .right {
-  right: 10px;
-}
-
-.camel.tree-header {
-  height: 42px;
-}
-
-.camel.tree-header > .left {
-  right: 94px;
-}
-
-.camel.tree-header > .left,
-.camel.tree-header > .right {
-  top: 6px;
-  line-height: 30px;
-}
-
-
-.camel.tree-header > .left > .section-filter {
-  width: 100%;
-}
-
-.camel.tree-header > .left > .section-filter > .search-query {
-  width: 100%;
-  margin-bottom: 10px;
-}
-
-.camel.tree-header > .left > .section-filter > .icon-remove {
-  right: -16px;
-}
-
-.attributes-wrapper {
-  width: 100%;
-  overflow: auto;
-}
-
-.separator {
-  padding-top: 4px;
-  display: inline-block;
-}
-
-.grid-block,
-.health-display {
-  border: 1px solid #00f;
-}
-
-.widget-title {
-  border-bottom: 1px solid #00f;
-}
-
-.container-group-header {
-  vertical-align: middle;
-  line-height: 18px;
-  font-weight: bold;
-  padding: 4px;
-  margin-top: 10px;
-}
-
-.search-query.has-text {
-  background: #55ddff;
-  color: #333333;
-}
-
-.dataTables_filter input {
-    border-radius: 15px
-}
-
-.config-admin-form .form-horizontal .control-label {
-    width: 260px;
-}
-.config-admin-form .form-horizontal .controls {
-    margin-left: 280px;
-}
-
-.new-config-name-form {
-    margin-top: 30px;
-}
-
-.td-fixed-width-150 {
-  white-space: normal;
-  width: 150px;
-}
-
-.pod-label {
-  margin-right: 1em;
-}
-
-td > ul {
-  margin-bottom: 0px;
-}
-
-td > .zebra-list > li {
-  padding: 2px;
-}
-
-ul.nav select {
-  margin-bottom: 0px;
-  height: 25px;
-}
-
-/* ENTESB-2249: fixing bootstrap forms with tooltips */
-.form-horizontal input + div + .help-block,
-.form-horizontal select + div + .help-block,
-.form-horizontal textarea + div + .help-block {
-  margin-top: 10px;
-}
-
-div#main div ul.nav {
-    border-radius: 0 0 4px 4px;
-    border: 1px solid #d4d4d4;
-    border-top: 1px transparent;
-    background-color: #FAFAFA;
-    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
-    background-repeat: repeat-x;
-    box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-ul.dynatree-container {
-  background: inherit;
-}
-ul.dynatree-container li {
-  background: inherit;
-}
-
-i.expandable-indicator {
-  color: #666;
-}
-
-span.dynatree-expander {
-  color: #728271;
-}
-
-span.dynatree-icon {
-  color: #EECA7C;
-}
-span:not(.dynatree-has-children) .dynatree-icon:before {
-  color: gray;
-}
-
-span.dynatree-empty,
-span.dynatree-vline,
-span.dynatree-connector,
-span.dynatree-expander,
-span.dynatree-icon,
-span.dynatree-checkbox,
-span.dynatree-radio,
-span.dynatree-drag-helper-img,
-#dynatree-drop-marker
-{
-    font-family: FontAwesome;
-    font-weight: normal;
-    font-style: normal;
-    display: inline-block;
-    text-decoration: inherit;
-    background-image: none;
-    vertical-align: middle;
-}
-
-.dynatree-checkbox {
-    color: #888888
-}
-
-/* Dynatree checkbox */
-span.dynatree-checkbox:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "";
-}
-
-span.dynatree-checkbox:before:hover
-{
-    background-position: 0 0;
-    content: "";
-}
-
-.dynatree-selected span.dynatree-checkbox:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "\f00c";
-}
-
-.dynatree-selected span.dynatree-checkbox:before:hover
-{
-    background-position: 0 0;
-    content: "\f00c";
-}
-
-
-.dynatree-expander {
-    color: #888888
-}
-
-/* Dynatree expander */
-span.dynatree-expander:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "\f054";
-}
-
-span.dynatree-expander:before:hover
-{
-    background-position: 0 0;
-    content: "\f054";
-}
-
-.dynatree-exp-e span.dynatree-expander:before,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before  /* Expanded, delayed, last sibling */
-{
-    background-position: 0 0;
-    content: "\f078";
-}
-.dynatree-exp-e span.dynatree-expander:before:hover,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before:hover,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before:hover,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before:hover  /* Expanded, delayed, last sibling */
-{
-    background-position: 0 0;
-    content: "\f0da";
-}
-
-/* closed folder */
-.dynatree-ico-cf span.dynatree-icon:before {
-    background-position: 0 0;
-    content: "\f07b";
-}
-
-/* open folder */
-.dynatree-ico-ef span.dynatree-icon:before {
-    background-position: 0 0;
-    content: "\f07c";
-}
-
-span.dynatree-icon:before {
-    background-position: 0px 0px;
-    font-family: FontAwesome;
-    content: "\f013";
-}
-
-span.dynatree-folder a {
-    font-weight: normal;
-}
-
-div.treeContainer ul.dynatree-container {
-	border: 0px;
-}
-
-.pane>.pane-wrapper {
-    position: relative;
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-}
-
-.pane.left .pane-viewport {
-    margin-left: 10px;
-    right: 5px;
-    margin-right: 0;
-}
-
-.pane-viewport {
-    border-top: 1px solid #d4d4d4;
-}
-.pane-viewport {
-    position: absolute;
-    top: 24px;
-    bottom: 0;
-    left: 0;
-    overflow: auto;
-    margin-right: 10px;
-}
-
-.pane-content {
-    float: none;
-    position: static;
-}
-.pane-content {
-    width: auto;
-    height: auto;
-}
-
-.pane.left .pane-bar {
-    border-right: 1px solid #d4d4d4;
-}
-.pane.left .pane-bar, .pane.right {
-    right: 0;
-}
-.pane-bar {
-    background: white;
-}
-.pane-bar {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 5px;
-    cursor: ew-resize;
-    height: 100%;
-}
-
-div#overview-controller, div#list-controller {
-	padding-left: 300px;
-}
-
-.ngViewport.ng-scope{
-    height: auto !important;
-	width: auto !important;
-    overflow-y: hidden;
-}
-
-.ngTopPanel.ng-scope, .ngHeaderContainer{
-    width: auto !important;
-}
-
-.qdr-overview.pane.left, .qdr-attributes.pane.left, .qdr-topology.pane.left {
-	top: 70px;
-}
-
-div.chartContainer {
-	width: auto;
-}
-
-div.chartOptions div.duration {
-    width: 30em !important;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/qdrConnect.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrConnect.html b/console/stand-alone/plugin/html/qdrConnect.html
index 4559655..1d04042 100644
--- a/console/stand-alone/plugin/html/qdrConnect.html
+++ b/console/stand-alone/plugin/html/qdrConnect.html
@@ -72,7 +72,7 @@ under the License.
         <i class="icon-spin icon-spinner icon-4x"></i>
         <p>Please wait, connecting now...</p>
     </div>
-    <div class="centered" ng-show="connectionError">
+    <div class="centered error" ng-show="connectionError">
         <p>There was a connection error: {{connectionErrorText}}</p>
     </div>
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/qdrLayout.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrLayout.html b/console/stand-alone/plugin/html/qdrLayout.html
deleted file mode 100644
index 6c1115a..0000000
--- a/console/stand-alone/plugin/html/qdrLayout.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<ul class="nav nav-tabs connected dispatch-view" ng-controller="QDR.NavBarController">
-  <li ng-repeat="link in breadcrumbs" title="{{link.title}}" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
-    <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content"></a>
-  </li>
-</ul>
-<div class="container-fluid">
-  <div class="row">
-    <div class="col-md-12">
-      <ol class="breadcrumb">
-        <li><a href="#">Home</a></li>
-        <li>Typography</li>
-      </ol>
-      <h1>Application Heading h1</h1>
-      <div ng-view></div>
-    </div>
-  </div>
-</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/qdrList.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrList.html b/console/stand-alone/plugin/html/qdrList.html
index 8b7800f..d32a27a 100644
--- a/console/stand-alone/plugin/html/qdrList.html
+++ b/console/stand-alone/plugin/html/qdrList.html
@@ -27,7 +27,9 @@ under the License.
         <h4>{{selectedRecordName}}</h4>
         <div ng-show="currentMode.id === 'attributes'" class="selectedItems">
             <div ng-show="selectedRecordName === selectedEntity" class="no-content">There are no {{selectedEntity | safePlural}}</div>
-            <div ng-hide="selectedRecordName === selectedEntity" ng-grid="details"></div>
+            <div ng-hide="selectedRecordName === selectedEntity" ui-grid="details" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state
+                 ng-style="getTableHeight()">
+            </div>
         </div>
         <div ng-show="currentMode.id === 'delete'">
             <div class="delete" ng-show="selectedRecordName !== selectedEntity">

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/qdrOverview.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrOverview.html b/console/stand-alone/plugin/html/qdrOverview.html
index 4535d2c..3173fff 100644
--- a/console/stand-alone/plugin/html/qdrOverview.html
+++ b/console/stand-alone/plugin/html/qdrOverview.html
@@ -26,14 +26,14 @@ under the License.
     <div class="row-fluid">
         <h3>Routers</h3>
         <div class="overview">
-            <div class="gridStyle" ng-grid="allRouters"></div>
+            <div class="grid" ui-grid="allRouters" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
 <script type="text/ng-template" id="router.html">
     <div class="row-fluid">
-        <h3>Router {{router.data.title}} attributes</h3>
-        <div class="gridStyle noHighlight" ng-grid="routerGrid"></div>
+        <h3>Router {{router.title}} attributes</h3>
+        <div class="grid noHighlight" ui-grid="routerGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
     </div>
 </script>
 
@@ -41,7 +41,7 @@ under the License.
     <div class="row-fluid">
         <h3>Addresses</h3>
         <div class="overview">
-            <div class="gridStyle" ng-grid="addressesGrid"></div>
+            <div class="grid" ui-grid="addressesGrid" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
@@ -51,12 +51,12 @@ under the License.
             <li ng-repeat="mode in gridModes" ng-click="selectMode(mode,'Address')" ng-class="{active : isModeSelected(mode,'Address')}" title="{{mode.title}}" ng-bind-html="mode.content"> </li>
         </ul>
         <div ng-if="isModeVisible('Address','attributes')" class="selectedItems">
-            <h3>Address {{address.data.title}}</h3>
-            <div class="gridStyle noHighlight" ng-grid="addressGrid"></div>
+            <h3>Address {{address.title}}</h3>
+            <div class="grid noHighlight" ui-grid="addressGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
         <div ng-if="isModeVisible('Address','links')" class="selectedItems">
-            <h3>Links for address {{address.data.title}}</h3>
-            <div class="gridStyle" ng-grid="linksGrid"></div>
+            <h3>Links for address {{address.title}}</h3>
+            <div class="grid" ui-grid="linksGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
@@ -73,13 +73,13 @@ under the License.
             <div class="formLine"><label for="endpointOnly">Endpoints only</label><input name="linkTypes" id="endpointOnly" type="radio" ng-model="filter.endpointsOnly" value="true"/>
                 <label for="allLinks">All link types</label><input name="linkTypes" id="allLinks" type="radio" ng-model="filter.endpointsOnly" value="false"/></div>
         </div>
-        <div class="gridStyle" ng-grid="linksGrid"></div>
+        <div class="grid" ui-grid="linksGrid" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
     </div>
 </script>
 <script type="text/ng-template" id="link.html">
     <div class="row-fluid">
-        <h3>Link {{link.data.title}}</h3>
-        <div class="gridStyle noHighlight" ng-grid="linkGrid"></div>
+        <h3>Link {{link.title}}</h3>
+        <div class="grid noHighlight" ui-grid="linkGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
     </div>
 </script>
 
@@ -87,7 +87,7 @@ under the License.
     <div class="row-fluid">
         <h3>Connections</h3>
         <div class="overview">
-            <div class="gridStyle" ng-grid="allConnectionGrid"></div>
+            <div class="grid" ui-grid="allConnectionGrid" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
@@ -97,12 +97,12 @@ under the License.
             <li ng-repeat="mode in gridModes" ng-click="selectMode(mode,'Connection')" ng-class="{active : isModeSelected(mode,'Connection')}" title="{{mode.title}}" ng-bind-html="mode.content"> </li>
         </ul>
         <div ng-if="isModeVisible('Connection','attributes')" class="selectedItems">
-            <h3>Connection {{connection.data.title}}</h3>
-            <div class="gridStyle noHighlight" ng-grid="connectionGrid"></div>
+            <h3>Connection {{connection.title}}</h3>
+            <div class="grid noHighlight" ui-grid="connectionGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
         <div ng-if="isModeVisible('Connection','links')" class="selectedItems">
-            <h3>Links for connection {{connection.data.title}}</h3>
-            <div class="gridStyle" ng-grid="linksGrid"></div>
+            <h3>Links for connection {{connection.title}}</h3>
+            <div class="grid" ui-grid="linksGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
@@ -122,7 +122,7 @@ under the License.
     <div class="row-fluid">
         <h3>Recent log events</h3>
         <div class="overview">
-            <div class="gridStyle" ng-grid="allLogGrid"></div>
+            <div class="grid" ui-grid="allLogGrid" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
@@ -130,13 +130,13 @@ under the License.
     <div class="row-fluid">
         <h3>{{logModule.module}} events</h3>
         <div class="overview-cell">
-            <div class="gridStyle" ng-grid="logModuleGrid"></div>
+            <div class="grid" ui-grid="logModuleGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
         </div>
     </div>
 </script>
 <script type="text/ng-template" id="log.html">
     <div class="row-fluid">
-        <h3>{{log.data.title}}</h3>
+        <h3>{{log.title}}</h3>
         <div ng-if="logFields.length > 0">
             <table class="log-entry" ng-repeat="entry in logFields track by $index">
                 <tr>
@@ -153,15 +153,14 @@ under the License.
                 </tr>
             </table>
         </div>
-        <div ng-if="logFields.length == 0">No log entries for {{log.data.title}}</div>
+        <div ng-if="logFields.length == 0">No log entries for {{log.title}}</div>
     </div>
 </script>
 
 <script type="text/ng-template" id="linkRowTemplate.html">
-    <div ng-class="{linkDirIn: row.getProperty('linkDir') == 'in', linkDirOut: row.getProperty('linkDir') == 'out'}">
-        <div ng-style="{ 'cursor': row.cursor }" ng-repeat="col in renderedColumns" ng-class="col.colIndex()" class="ngCell {{col.cellClass}}">
-            <div class="ngVerticalBar" ng-style="{height: rowHeight}" ng-class="{ ngVerticalBarVisible: !$last }">&nbsp;</div>
-            <div ng-cell></div>
+    <div ng-class="{'linkDirIn': row.entity.linkDir == 'in', 'linkDirOut': row.entity.linkDir == 'out' }">
+        <div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
+             class="ui-grid-cell" ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }" ui-grid-cell>
         </div>
     </div>
 </script>
@@ -207,3 +206,4 @@ under the License.
         <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
     </div>
 </script>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrTopology.js b/console/stand-alone/plugin/js/qdrTopology.js
index 71516b5..a54540d 100644
--- a/console/stand-alone/plugin/js/qdrTopology.js
+++ b/console/stand-alone/plugin/js/qdrTopology.js
@@ -24,8 +24,9 @@ var QDR = (function(QDR) {
   QDR.module.controller('QDR.TopologyFormController', function($scope, $rootScope, $timeout, QDRService) {
 
     $scope.attributes = []
-    var nameTemplate = '<div title="{{row.entity.description}}" class="ngCellText {{row.entity.cls}}"><span>{{row.entity.attributeName}}</span></div>';
-    var valueTemplate = '<div title="{{row.entity.attributeValue}}" class="ngCellText {{row.entity.cls}}"><span>{{row.entity.attributeValue}}</span></div>';
+    var nameTemplate =  '<div title="{{row.entity.description}}" class="ui-grid-cell-contents {{row.entity.cls}}">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>';
+    var valueTemplate = '<div title="{{row.entity.attributeValue}}" class="ui-grid-cell-contents {{row.entity.cls}}">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>';
+
     $scope.topoGridOptions = {
       data: 'attributes',
       enableColumnResize: false,
@@ -43,8 +44,9 @@ var QDR = (function(QDR) {
     };
     $scope.form = 'router'
     $scope.$on('showEntityForm', function(event, args) {
+console.log("showEntityForm " + args.entity)
       var attributes = args.attributes;
-      var entityTypes = QDRService.schema.entityTypes[args.entity].attributes;
+      var entityTypes = QDRService.management.schema().entityTypes[args.entity].attributes;
       attributes.forEach(function(attr) {
         attr.cls = ''
         if (attr.attributeName === 'Listening on')
@@ -57,19 +59,24 @@ var QDR = (function(QDR) {
       $scope.attributes = attributes;
       $scope.form = args.entity;
     })
+    $scope.infoStyle = function () {
+      return {
+        height: ($scope.attributes.length * 30 + 40) + "px"
+      }
+    }
   })
   /**
    * @method TopologyController
    *
    * Controller that handles the QDR topology page
    */
-  QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'QDRService', '$location', '$timeout', '$uibModal',
-    function($scope, $rootScope, QDRService, $location, $timeout, $uibModal) {
+  QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'QDRService', '$location', '$timeout', '$uibModal', '$sce',
+    function($scope, $rootScope, QDRService, $location, $timeout, $uibModal, $sce) {
 
       $scope.multiData = []
-      $scope.selectedClient = [];
       $scope.quiesceState = {}
       var dontHide = false;
+      $scope.crosshtml = $sce.trustAsHtml("")
 
       $scope.panelVisible = true  // show/hide the panel on the left
       $scope.hideLeftPane = function () {
@@ -130,22 +137,30 @@ var QDR = (function(QDR) {
         return stateClassMap[$scope.quiesceState[row.entity.connectionId].state];
       }
 
+      // This is the grid that shows each connection when a client node that represents multiple connections is clicked
       $scope.multiData = []
       $scope.multiDetails = {
         data: 'multiData',
-        selectedItems: $scope.selectedClient,
-        multiSelect: false,
+        enableColumnResize: true,
         jqueryUIDraggable: true,
-        afterSelectionChange: function(obj) {
-          if (obj.selected && obj.orig) {
-            var detailsDiv = d3.select('#link_details')
-            var isVis = detailsDiv.style('display') === 'block';
-            if (!dontHide && isVis && $scope.connectionId === obj.entity.connectionId) {
-              hideLinkDetails();
-              return;
-            }
-            dontHide = false;
-            $scope.multiDetails.showLinksList(obj)
+        enablePaging: false,
+        multiSelect: false,
+        enableSelectAll: false,
+        enableSelectionBatchEvent: false,
+        enableRowHeaderSelection: false,
+        noUnselect: true,
+        onRegisterApi: function (gridApi) {
+          if (gridApi.selection) {
+            gridApi.selection.on.rowSelectionChanged($scope, function(row){
+              var detailsDiv = d3.select('#link_details')
+              var isVis = detailsDiv.style('display') === 'block';
+              if (!dontHide && isVis && $scope.connectionId === row.entity.connectionId) {
+                hideLinkDetails();
+                return;
+              }
+              dontHide = false;
+              $scope.multiDetails.showLinksList(row)
+            })
           }
         },
         showLinksList: function(obj) {
@@ -153,7 +168,7 @@ var QDR = (function(QDR) {
           $scope.connectionId = obj.entity.connectionId;
           var visibleLen = Math.min(obj.entity.linkData.length, 10)
           //QDR.log.debug("visibleLen is " + visibleLen)
-          var left = parseInt(d3.select('#multiple_details').style("left"))
+          var left = parseInt(d3.select('#multiple_details').style("left"), 10)
           var offset = jQuery('#topology').offset();
           var detailsDiv = d3.select('#link_details')
           detailsDiv
@@ -207,17 +222,17 @@ var QDR = (function(QDR) {
         columnDefs: [{
             field: 'host',
             cellTemplate: "titleCellTemplate.html",
-            headerCellTemplate: 'titleHeaderCellTemplate.html',
+            //headerCellTemplate: 'titleHeaderCellTemplate.html',
             displayName: 'Connection host'
           }, {
             field: 'user',
             cellTemplate: "titleCellTemplate.html",
-            headerCellTemplate: 'titleHeaderCellTemplate.html',
+            //headerCellTemplate: 'titleHeaderCellTemplate.html',
             displayName: 'User'
           }, {
             field: 'properties',
             cellTemplate: "titleCellTemplate.html",
-            headerCellTemplate: 'titleHeaderCellTemplate.html',
+            //headerCellTemplate: 'titleHeaderCellTemplate.html',
             displayName: 'Properties'
           }
           /*,
@@ -235,7 +250,14 @@ var QDR = (function(QDR) {
         return stateClassMap[row.entity.adminStatus]
       }
       $scope.quiesceLink = function(row) {
-        QDRService.quiesceLink(row.entity.nodeId, row.entity.name);
+        QDRService.management.topology.quiesceLink(row.entity.nodeId, row.entity.name)
+        .then( function (results, context) {
+          var statusCode = context.message.application_properties.statusCode;
+          if (statusCode < 200 || statusCode >= 300) {
+            Core.notification('error', context.message.statusDescription);
+            QDR.log.info('Error ' + context.message.statusDescription)
+          }
+        })
       }
       $scope.quiesceLinkDisabled = function(row) {
         return (row.entity.operStatus !== 'up' && row.entity.operStatus !== 'down')
@@ -287,20 +309,6 @@ var QDR = (function(QDR) {
         ]
       }
 
-      if (!QDRService.connected) {
-        // we are not connected. we probably got here from a bookmark or manual page reload
-        QDRService.redirectWhenConnected("topology");
-        return;
-      }
-      // we are currently connected. setup a handler to get notified if we are ever disconnected
-      var onDisconnect = function () {
-        //QDR.log.info("we were just disconnected while on the topology page. Setting org to redirect back once we are connected again")
-        $timeout(function () {
-          QDRService.redirectWhenConnected("topology")
-        })
-      }
-      QDRService.addDisconnectAction( onDisconnect )
-
       var urlPrefix = $location.absUrl();
       urlPrefix = urlPrefix.split("#")[0]
       QDR.log.debug("started QDR.TopologyController with urlPrefix: " + urlPrefix);
@@ -345,7 +353,7 @@ var QDR = (function(QDR) {
 
       var mouseX, mouseY;
       var relativeMouse = function () {
-        var offset = jQuery('#topology').offset();
+        var offset = $('#main_container').offset();
         return {left: (mouseX + $(document).scrollLeft()) - 1,
                 top: (mouseY  + $(document).scrollTop()) - 1,
                 offset: offset
@@ -463,7 +471,7 @@ var QDR = (function(QDR) {
             return nodes[i]
           }
         }
-        var routerId = QDRService.nameFromId(id)
+        var routerId = QDRService.management.topology.nameFromId(id)
         return {
           key: id,
           name: name,
@@ -505,13 +513,13 @@ var QDR = (function(QDR) {
       }
 
       var getLinkDir = function (id, connection, onode) {
-        var links = onode[".router.link"]
+        var links = onode["router.link"]
         if (!links) {
           return "unknown"
         }
         var inCount = 0, outCount = 0
         links.results.forEach( function (linkResult) {
-          var link = QDRService.flatten(links.attributeNames, linkResult)
+          var link = QDRService.utilities.flatten(links.attributeNames, linkResult)
           if (link.linkType === "endpoint" && link.connectionId === connection.identity)
             if (link.linkDir === "in")
               ++inCount
@@ -542,7 +550,7 @@ var QDR = (function(QDR) {
         var yInit = 50;
         nodes = []
         for (var id in nodeInfo) {
-          var name = QDRService.nameFromId(id);
+          var name = QDRService.management.topology.nameFromId(id);
           // if we have any new nodes, animate the force graph to position them
           var position = angular.fromJson(localStorage[name]);
           if (!angular.isDefined(position)) {
@@ -568,15 +576,15 @@ var QDR = (function(QDR) {
         var client = 1.0;
         for (var id in nodeInfo) {
           var onode = nodeInfo[id];
-          if (!onode['.connection'])
+          if (!onode['connection'])
             continue
-          var conns = onode['.connection'].results;
-          var attrs = onode['.connection'].attributeNames;
+          var conns = onode['connection'].results;
+          var attrs = onode['connection'].attributeNames;
           //QDR.log.debug("external client parent is " + parent);
           var normalsParent = {}; // 1st normal node for this parent
 
           for (var j = 0; j < conns.length; j++) {
-            var connection = QDRService.flatten(attrs, conns[j])
+            var connection = QDRService.utilities.flatten(attrs, conns[j])
             var role = connection.role
             var properties = connection.properties || {};
             var dir = connection.dir
@@ -588,7 +596,7 @@ var QDR = (function(QDR) {
               }
             } else if (role == "normal" || role == "on-demand" || role === "route-container") {
               // not an connection between routers, but an external connection
-              var name = QDRService.nameFromId(id) + "." + connection.identity;
+              var name = QDRService.management.topology.nameFromId(id) + "." + connection.identity;
 
               // if we have any new clients, animate the force graph to position them
               var position = angular.fromJson(localStorage[name]);
@@ -607,7 +615,7 @@ var QDR = (function(QDR) {
               var existingNodeIndex = nodeExists(connection.container)
               var normalInfo = normalExists(connection.container)
               var node = aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, connection.container, j, position.fixed, properties)
-              var nodeType = QDRService.isAConsole(properties, connection.identity, role, node.key) ? "console" : "client"
+              var nodeType = QDRService.utilities.isAConsole(properties, connection.identity, role, node.key) ? "console" : "client"
               var cdir = getLinkDir(id, connection, onode)
               if (existingNodeIndex >= 0) {
                 // make a link between the current router (source) and the existing node
@@ -691,7 +699,7 @@ var QDR = (function(QDR) {
       var initForceGraph = function() {
         nodes = [];
         links = [];
-        var nodeInfo = QDRService.topology.nodeInfo();
+        var nodeInfo = QDRService.management.topology.nodeInfo();
         var nodeCount = Object.keys(nodeInfo).length
 
         var oldSelectedNode = selected_node
@@ -738,7 +746,7 @@ var QDR = (function(QDR) {
         // initialize the list of links
         var unknowns = []
         initializeLinks(nodeInfo, unknowns)
-        $scope.schema = QDRService.schema;
+        $scope.schema = QDRService.management.schema();
         // init D3 force layout
         force = d3.layout.force()
           .nodes(nodes)
@@ -805,7 +813,7 @@ var QDR = (function(QDR) {
           d3.selectAll('circle.inter-router').each(function (d) {
             if (d.key === oldMouseoverNode.key) {
               mouseover_node = d
-              QDRService.ensureAllEntities([{entity: ".router.node", attrs: ["id","nextHop"]}], function () {
+              QDRService.management.topology.ensureAllEntities([{entity: "router.node", attrs: ["id","nextHop"]}], function () {
                 nextHop(selected_node, d);
                 restart();
               })
@@ -813,7 +821,7 @@ var QDR = (function(QDR) {
           })
         }
         setTimeout(function () {
-          updateForm(Object.keys(QDRService.topology.nodeInfo())[0], 'router', 0);
+          updateForm(Object.keys(QDRService.management.topology.nodeInfo())[0], 'router', 0);
         })
 
         // if any clients don't yet have link directions, get the links for those nodes and restart the graph
@@ -838,7 +846,8 @@ var QDR = (function(QDR) {
         }
         unknownNodes = Object.keys(unknownNodes)
         //QDR.log.info("-- resolveUnknowns: ensuring .connection and .router.link are present for each node")
-        QDRService.ensureEntities(unknownNodes, [{entity: ".connection", force: true}, {entity: ".router.link", attrs: ["linkType","connectionId","linkDir"], force: true}], function () {
+        QDRService.management.topology.ensureEntities(unknownNodes, [{entity: "connection", force: true}, {entity: "router.link", attrs: ["linkType","connectionId","linkDir"], force: true}], function () {
+          nodeInfo = QDRService.management.topology.nodeInfo()
           initializeLinks(nodeInfo, [])
           // collapse any router-container nodes that are duplicates
           animate = true;
@@ -848,14 +857,23 @@ var QDR = (function(QDR) {
       }
 
       function updateForm(key, entity, resultIndex) {
-        var nodeInfo = QDRService.topology.nodeInfo();
-        if (key in nodeInfo) {
-          QDRService.ensureEntities(key, [
-            {entity: '.'+entity},
-            {entity: '.listener', attrs: ["role", "port"]}], function () {
+        if (!angular.isDefined(resultIndex))
+          return;
+        var nodeList = QDRService.management.topology.nodeIdList()
+        if (nodeList.indexOf(key) > -1) {
+          QDRService.management.topology.ensureEntities(key, [
+            {entity: entity},
+            {entity: 'listener', attrs: ["role", "port"]}], function () {
+            nodeInfo = QDRService.management.topology.nodeInfo();
             var onode = nodeInfo[key]
-            var nodeResults = onode['.' + entity].results[resultIndex]
-            var nodeAttributes = onode['.' + entity].attributeNames
+            if (!onode[entity]) {
+              console.log("requested " + entity + " but didn't get it")
+              console.dump(nodeInfo)
+              return
+            }
+
+            var nodeResults = onode[entity].results[resultIndex]
+            var nodeAttributes = onode[entity].attributeNames
             var attributes = nodeResults.map(function(row, i) {
                 return {
                   attributeName: nodeAttributes[i],
@@ -876,14 +894,14 @@ var QDR = (function(QDR) {
 
             // get the list of ports this router is listening on
             if (entity === 'router') {
-              var listeners = onode['.listener'].results;
-              var listenerAttributes = onode['.listener'].attributeNames;
+              var listeners = onode['listener'].results;
+              var listenerAttributes = onode['listener'].attributeNames;
               var normals = listeners.filter(function(listener) {
-                return QDRService.valFor(listenerAttributes, listener, 'role') === 'normal';
+                return QDRService.utilities.valFor(listenerAttributes, listener, 'role') === 'normal';
               })
               var ports = []
               normals.forEach(function(normalListener) {
-                  ports.push(QDRService.valFor(listenerAttributes, normalListener, 'port'))
+                  ports.push(QDRService.utilities.valFor(listenerAttributes, normalListener, 'port'))
                 })
                 // add as 2nd row
               if (ports.length) {
@@ -906,7 +924,7 @@ var QDR = (function(QDR) {
       function getContainerIndex(_id, nodeInfo) {
         var nodeIndex = 0;
         for (var id in nodeInfo) {
-          if (QDRService.nameFromId(id) === _id)
+          if (QDRService.management.topology.nameFromId(id) === _id)
             return nodeIndex;
           ++nodeIndex;
         }
@@ -1025,7 +1043,7 @@ var QDR = (function(QDR) {
           return selected_node;
 
         //QDR.log.debug("finding nextHop from: " + from.name + " to " + d.name);
-        var sInfo = QDRService.topology.nodeInfo()[from.key];
+        var sInfo = QDRService.management.topology.nodeInfo()[from.key];
 
         if (!sInfo) {
           QDR.log.warn("unable to find topology node info for " + from.key);
@@ -1033,15 +1051,15 @@ var QDR = (function(QDR) {
         }
 
         // find the hovered name in the selected name's .router.node results
-        if (!sInfo['.router.node'])
+        if (!sInfo['router.node'])
           return null;
-        var aAr = sInfo['.router.node'].attributeNames;
-        var vAr = sInfo['.router.node'].results;
+        var aAr = sInfo['router.node'].attributeNames;
+        var vAr = sInfo['router.node'].results;
         for (var hIdx = 0; hIdx < vAr.length; ++hIdx) {
-          var addrT = QDRService.valFor(aAr, vAr[hIdx], "id");
+          var addrT = QDRService.utilities.valFor(aAr, vAr[hIdx], "id");
           if (addrT == d.name) {
             //QDR.log.debug("found " + d.name + " at " + hIdx);
-            var nextHop = QDRService.valFor(aAr, vAr[hIdx], "nextHop");
+            var nextHop = QDRService.utilities.valFor(aAr, vAr[hIdx], "nextHop");
             //QDR.log.debug("nextHop was " + nextHop);
             return (nextHop == null) ? nodeFor(addrT) : nodeFor(nextHop);
           }
@@ -1082,10 +1100,6 @@ var QDR = (function(QDR) {
       }
 
       function removeCrosssection() {
-        setTimeout(function() {
-          d3.select("[id^=tooltipsy]").remove()
-          $('.hastip').empty();
-        }, 1010);
         d3.select("#crosssection svg g").transition()
           .duration(1000)
           .attr("transform", "scale(0)")
@@ -1165,33 +1179,32 @@ var QDR = (function(QDR) {
             return d.cls == 'small';
           })
           .on('mouseover', function(d) { // mouse over a path
-            //QDR.log.debug("showing connections form");
+            QDR.log.info("mouseover a path");
             var resultIndex = 0; // the connection to use
             var left = d.left ? d.target : d.source;
             // right is the node that the arrow points to, left is the other node
             var right = d.left ? d.source : d.target;
-            var onode = QDRService.topology.nodeInfo()[left.key];
+            var onode = QDRService.management.topology.nodeInfo()[left.key];
             // loop through all the connections for left, and find the one for right
-            if (!onode || !onode['.connection'])
+            if (!onode || !onode['connection'])
               return;
             // update the info dialog for the link the mouse is over
             if (!selected_node && !selected_link) {
-              for (resultIndex = 0; resultIndex < onode['.connection'].results.length; ++resultIndex) {
-                var conn = onode['.connection'].results[resultIndex];
+              for (resultIndex = 0; resultIndex < onode['connection'].results.length; ++resultIndex) {
+                var conn = onode['connection'].results[resultIndex];
                 /// find the connection whose container is the right's name
-                var name = QDRService.valFor(onode['.connection'].attributeNames, conn, "container");
+                var name = QDRService.utilities.valFor(onode['connection'].attributeNames, conn, "container");
                 if (name == right.routerId) {
                   break;
                 }
               }
               // did not find connection. this is a connection to a non-interrouter node
-              if (resultIndex === onode['.connection'].results.length) {
+              if (resultIndex === onode['connection'].results.length) {
                 // use the non-interrouter node's connection info
                 left = d.target;
                 resultIndex = left.resultIndex;
               }
-              if (resultIndex)
-                updateForm(left.key, 'connection', resultIndex);
+              updateForm(left.key, 'connection', resultIndex);
             }
 
             mousedown_link = d;
@@ -1217,6 +1230,7 @@ var QDR = (function(QDR) {
                   .value(function(d) { return d.size; });
 
               d3.select("#crosssection svg").remove();
+              //var svg = d3.select(document.createElement('div'))
               var svg = d3.select("#crosssection").append("svg")
                   .attr("width", diameter)
                   .attr("height", diameter)
@@ -1227,8 +1241,8 @@ var QDR = (function(QDR) {
                 name: " Links between " + d.source.name + " and " + d.target.name,
                 children: []
               }
-              var nodeInfo = QDRService.topology.nodeInfo();
-              var connections = nodeInfo[d.source.key]['.connection'];
+              var nodeInfo = QDRService.management.topology.nodeInfo();
+              var connections = nodeInfo[d.source.key]['connection'];
               var containerIndex = connections.attributeNames.indexOf('container');
               connections.results.some ( function (connection) {
                 if (connection[containerIndex] == d.target.routerId) {
@@ -1241,7 +1255,7 @@ var QDR = (function(QDR) {
               })
 
               // find router.links where link.remoteContainer is d.source.name
-              var links = nodeInfo[d.source.key]['.router.link'];
+              var links = nodeInfo[d.source.key]['router.link'];
               var identityIndex = connections.attributeNames.indexOf('identity')
               var roleIndex = connections.attributeNames.indexOf('role')
               var connectionIdIndex = links.attributeNames.indexOf('connectionId');
@@ -1269,28 +1283,37 @@ var QDR = (function(QDR) {
                 .enter().append("g")
                 .attr("class", function(d) { return d.children ? "parent node hastip" : "leaf node hastip"; })
                 .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")" + (!d.children ? "scale(0.9)" : ""); })
-                .attr("title", function (d) {
-                  var title = "<h4>" + d.desc + "</h4><table class='tiptable'><tbody>";
-                  if (d.attributeNames)
-                    d.attributeNames.forEach( function (n, i) {
-                      title += "<tr><td>" + n + "</td><td>";
-                      title += d.obj[i] != null ? d.obj[i] : '';
-                      title += '</td></tr>';
-                    })
-                  title += "</tbody></table>"
-                  return title
-                })
               node.append("circle")
-                .attr("r", function(d) { return d.r; });
+                .attr("r", function(d) { return d.r; })
+
+              node.on('mouseenter', function (d) {
+                var title = "<h4>" + d.desc + "</h4><table class='tiptable'><tbody>";
+                if (d.attributeNames)
+                  d.attributeNames.forEach( function (n, i) {
+                    title += "<tr><td>" + n + "</td><td>";
+                    title += d.obj[i] != null ? d.obj[i] : '';
+                    title += '</td></tr>';
+                  })
+                title += "</tbody></table>"
+                $timeout( (function () {
+                  $scope.crosshtml = $sce.trustAsHtml(title)
+                  $('#crosshtml').show()
+                  var parent = $("#crosssection")
+                  var ppos = parent.position()
+                  var mleft = ppos.left + parent.width()
+                  $('#crosshtml').css({left: mleft, top: ppos.top})
+                }).bind(this))
+              })
+              node.on('mouseout', function (d) {
+                  $('#crosshtml').hide()
+              })
 
-  //          node.filter(function(d) { return !d.children; }).append("text")
               node.append("text")
                 .attr("dy", function (d) { return d.children ? "-10em" : ".5em"})
                 .style("text-anchor", "middle")
                 .text(function(d) {
                     return d.name.substring(0, d.r / 3);
                 });
-              $('.hastip').tooltipsy({ alignTo: 'cursor'});
               svgg.attr("transform", "translate(2,2) scale(0.01)")
 
               var bounds = $("#topology").position()
@@ -1305,7 +1328,7 @@ var QDR = (function(QDR) {
                   d3.selectAll("#crosssection g.leaf text").attr("dy", ".3em")
                 })
             }
-            QDRService.ensureEntities(d.source.key, {entity: '.router.link', force: true}, showCrossSection)
+            QDRService.management.topology.ensureEntities(d.source.key, {entity: 'router.link', force: true}, showCrossSection)
           })
         // remove old links
         path.exit().remove();
@@ -1343,7 +1366,7 @@ var QDR = (function(QDR) {
               return radii[d.nodeType]
             })
             .attr('fill', function (d) {
-              if (d.cdir === 'both' && !QDRService.isConsole(d)) {
+              if (d.cdir === 'both' && !QDRService.utilities.isConsole(d)) {
                 return 'url(' + urlPrefix + '#half-circle)'
               }
               return null;
@@ -1352,7 +1375,7 @@ var QDR = (function(QDR) {
               return d.fixed & 1
             })
             .classed('normal', function(d) {
-              return d.nodeType == 'normal' || QDRService.isConsole(d)
+              return d.nodeType == 'normal' || QDRService.utilities.isConsole(d)
             })
             .classed('in', function(d) {
               return d.cdir == 'in'
@@ -1370,16 +1393,16 @@ var QDR = (function(QDR) {
               return d.nodeType == 'on-demand'
             })
             .classed('console', function(d) {
-              return QDRService.isConsole(d)
+              return QDRService.utilities.isConsole(d)
             })
             .classed('artemis', function(d) {
-              return QDRService.isArtemis(d)
+              return QDRService.utilities.isArtemis(d)
             })
             .classed('qpid-cpp', function(d) {
-              return QDRService.isQpid(d)
+              return QDRService.utilities.isQpid(d)
             })
             .classed('route-container', function (d) {
-              return (!QDRService.isArtemis(d) && !QDRService.isQpid(d) && d.nodeType === 'route-container')
+              return (!QDRService.utilities.isArtemis(d) && !QDRService.utilities.isQpid(d) && d.nodeType === 'route-container')
             })
             .classed('client', function(d) {
               return d.nodeType === 'normal' && !d.properties.console_identifier
@@ -1411,7 +1434,7 @@ var QDR = (function(QDR) {
             }
             clerAllHighlights()
             // we need .router.node info to highlight hops
-            QDRService.ensureAllEntities([{entity: ".router.node", attrs: ["id","nextHop"]}], function () {
+            QDRService.management.topology.ensureAllEntities([{entity: "router.node", attrs: ["id","nextHop"]}], function () {
               mouseover_node = d  // save this node in case the topology changes so we can restore the highlights
               nextHop(selected_node, d);
               restart();
@@ -1475,7 +1498,7 @@ var QDR = (function(QDR) {
               restart() // redraw the node without a dashed line
               force.start(); // let the nodes move to a new position
             }
-            if (QDRService.nameFromId(d.key) == '__internal__') {
+            if (QDRService.management.topology.nameFromId(d.key) == '__internal__') {
               editNode();
               if (!$scope.$$phase) $scope.$apply()
             }
@@ -1483,13 +1506,16 @@ var QDR = (function(QDR) {
           .on("contextmenu", function(d) {  // circle
             $(document).click();
             d3.event.preventDefault();
-            $scope.contextNode = d
             var rm = relativeMouse()
             d3.select('#node_context_menu')
-              .style('left', rm.left + "px")
-              .style('top', (rm.top - rm.offset.top) + "px")
-              .style('display', 'block');
-            if (!$scope.$$phase) $scope.$apply()
+              .style({
+                display: 'block',
+                left: rm.left + "px",
+                top: (rm.top - rm.offset.top) + "px"
+              })
+            $timeout( function () {
+              $scope.contextNode = d
+            })
           })
           .on("click", function(d) {  // circle
             if (!mouseup_node)
@@ -1498,7 +1524,7 @@ var QDR = (function(QDR) {
             clearPopups();
             if (!d.normals) {
               // circle was a router or a broker
-              if (QDRService.isArtemis(d)) {
+              if (QDRService.utilities.isArtemis(d)) {
                 var artemisPath = '/jmx/attributes?tab=artemis&con=Artemis'
                 if (QDR.isStandalone)
                   window.location = $location.protocol() + '://localhost:8161/hawtio' + artemisPath
@@ -1520,9 +1546,9 @@ var QDR = (function(QDR) {
             .attr('x', 0)
             .attr('y', function(d) {
               var y = 7;
-              if (QDRService.isArtemis(d))
+              if (QDRService.utilities.isArtemis(d))
                 y = 8;
-              else if (QDRService.isQpid(d))
+              else if (QDRService.utilities.isQpid(d))
                 y = 9;
               else if (d.nodeType === 'inter-router')
                 y = 4;
@@ -1532,7 +1558,7 @@ var QDR = (function(QDR) {
             })
             .attr('class', 'id')
             .classed('console', function(d) {
-              return QDRService.isConsole(d)
+              return QDRService.utilities.isConsole(d)
             })
             .classed('normal', function(d) {
               return d.nodeType === 'normal'
@@ -1541,17 +1567,17 @@ var QDR = (function(QDR) {
               return d.nodeType === 'on-demand'
             })
             .classed('artemis', function(d) {
-              return QDRService.isArtemis(d)
+              return QDRService.utilities.isArtemis(d)
             })
             .classed('qpid-cpp', function(d) {
-              return QDRService.isQpid(d)
+              return QDRService.utilities.isQpid(d)
             })
             .text(function(d) {
-              if (QDRService.isConsole(d)) {
+              if (QDRService.utilities.isConsole(d)) {
                 return '\uf108'; // icon-desktop for this console
-              } else if (QDRService.isArtemis(d)) {
+              } else if (QDRService.utilities.isArtemis(d)) {
                 return '\ue900'
-              } else if (QDRService.isQpid(d)) {
+              } else if (QDRService.utilities.isQpid(d)) {
                 return '\ue901';
               } else if (d.nodeType === 'route-container') {
                 return d.properties.product ? d.properties.product[0].toUpperCase() : 'S'
@@ -1568,9 +1594,9 @@ var QDR = (function(QDR) {
             var x = '';
             if (d.normals && d.normals.length > 1)
               x = " x " + d.normals.length;
-            if (QDRService.isConsole(d)) {
+            if (QDRService.utilities.isConsole(d)) {
               return 'Dispatch console' + x
-            } else if (QDRService.isArtemis(d)) {
+            } else if (QDRService.utilities.isArtemis(d)) {
               return 'Broker - Artemis' + x
             } else if (d.properties.product == 'qpid-cpp') {
               return 'Broker - qpid-cpp' + x
@@ -1701,7 +1727,7 @@ var QDR = (function(QDR) {
         // called after each topology update
         var extendConnections = function() {
           // force a fetch of the links for this node
-          QDRService.ensureEntities(d.key, {entity: ".router.link", force: true}, function () {
+          QDRService.management.topology.ensureEntities(d.key, {entity: "router.link", force: true}, function () {
             // the links for this node are now available
             $scope.multiData = []
             var normals = d.normals;
@@ -1714,15 +1740,15 @@ var QDR = (function(QDR) {
               });
             if (normals) {
               normals.forEach(function(n) {
-                var nodeInfo = QDRService.topology.nodeInfo();
-                var links = nodeInfo[n.key]['.router.link'];
+                var nodeInfo = QDRService.management.topology.nodeInfo();
+                var links = nodeInfo[n.key]['router.link'];
                 var linkTypeIndex = links.attributeNames.indexOf('linkType');
                 var connectionIdIndex = links.attributeNames.indexOf('connectionId');
                 n.linkData = [];
                 links.results.forEach(function(link) {
                   if (link[linkTypeIndex] === 'endpoint' && link[connectionIdIndex] === n.connectionId) {
                     var l = {};
-                    var ll = QDRService.flatten(links.attributeNames, link)
+                    var ll = QDRService.utilities.flatten(links.attributeNames, link)
                     l.owningAddr = ll.owningAddr
                     l.dir = ll.linkDir
                     if (l.owningAddr && l.owningAddr.length > 2)
@@ -1732,7 +1758,7 @@ var QDR = (function(QDR) {
                         l.owningAddr = l.owningAddr.substr(1)
 
                     l.deliveryCount = ll.deliveryCount
-                    l.uncounts = QDRService.pretty(ll.undeliveredCount + ll.unsettledCount)
+                    l.uncounts = QDRService.utilities.pretty(ll.undeliveredCount + ll.unsettledCount)
                     l.adminStatus = ll.adminStatus;
                     l.operStatus = ll.operStatus;
                     l.identity = ll.identity
@@ -1786,8 +1812,18 @@ var QDR = (function(QDR) {
               })
           })
         }
+        $scope.connectionsStyle = function () {
+          return {
+            height: ($scope.multiData.length * 30 + 40) + "px"
+          }
+        }
+        $scope.linksStyle = function () {
+          return {
+            height: ($scope.linkData.length * 30 + 40) + "px"
+          }
+        }
         // register a notification function for when the topology is updated
-        QDRService.addUpdatedAction("normalsStats", extendConnections)
+        QDRService.management.topology.addUpdatedAction("normalsStats", extendConnections)
         // call the function that gets the links right now
         extendConnections();
         clearPopups();
@@ -1804,11 +1840,11 @@ var QDR = (function(QDR) {
             display: display,
             opacity: 1,
             left: rm.left + "px",
-            top: rm.top + "px"
+            top: (rm.top - rm.offset.top) + "px"
           })
         if (d.normals.length === 1) {
           // simulate a click on the connection to popup the link details
-          QDRService.ensureEntities(d.key, {entity: ".router.link", force: true}, function () {
+          QDRService.management.topology.ensureEntities(d.key, {entity: "router.link", force: true}, function () {
             $scope.multiDetails.showLinksList({
               entity: d
             })
@@ -1816,7 +1852,7 @@ var QDR = (function(QDR) {
         }
       }
       var stopUpdateConnectionsGrid = function() {
-        QDRService.delUpdatedAction("normalsStats");
+        QDRService.management.topology.delUpdatedAction("normalsStats");
       }
 
       var initConnState = function(id) {
@@ -1868,16 +1904,32 @@ var QDR = (function(QDR) {
       function hasChanged() {
         // Don't update the underlying topology diagram if we are adding a new node.
         // Once adding is completed, the topology will update automatically if it has changed
-        var nodeInfo = QDRService.topology.nodeInfo();
-        if (Object.keys(nodeInfo).length != Object.keys(savedKeys).length)
-          return Object.keys(nodeInfo).length > Object.keys(savedKeys).length ? 1 : -1;
+        var nodeInfo = QDRService.management.topology.nodeInfo();
+        // don't count the nodes without connection info
+        var cnodes = Object.keys(nodeInfo).filter ( function (node) {
+          return (nodeInfo[node]['connection'])
+        })
+        var routers = nodes.filter( function (node) {
+          return node.nodeType === 'inter-router'
+        })
+        if (routers.length > cnodes.length) {
+          return -1
+        }
+
+
+        if (cnodes.length != Object.keys(savedKeys).length) {
+          return cnodes.length > Object.keys(savedKeys).length ? 1 : -1;
+        }
         // we may have dropped a node and added a different node in the same update cycle
-        for (var key in nodeInfo) {
+        for (var i=0; i<cnodes.length; i++) {
+          var key = cnodes[i]
           // if this node isn't in the saved node list
           if (!savedKeys.hasOwnProperty(key))
             return 1;
           // if the number of connections for this node chaanged
-          if (nodeInfo[key]['.connection'].results.length != savedKeys[key]) {
+          if (!nodeInfo[key]['connection'])
+            return -1
+          if (nodeInfo[key]['connection'].results.length != savedKeys[key]) {
             return -1;
           }
         }
@@ -1886,14 +1938,12 @@ var QDR = (function(QDR) {
 
       function saveChanged() {
         savedKeys = {};
-        var nodeInfo = QDRService.topology.nodeInfo();
+        var nodeInfo = QDRService.management.topology.nodeInfo();
         // save the number of connections per node
         for (var key in nodeInfo) {
-          if (nodeInfo[key]['.connection'])
-            savedKeys[key] = nodeInfo[key]['.connection'].results.length;
+          if (nodeInfo[key]['connection'])
+            savedKeys[key] = nodeInfo[key]['connection'].results.length;
         }
-        //QDR.log.debug("saving current keys");
-        //console.dump(savedKeys);
       };
       // we are about to leave the page, save the node positions
       $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
@@ -1906,11 +1956,10 @@ var QDR = (function(QDR) {
       $scope.$on("$destroy", function(event) {
         //QDR.log.debug("scope on destroy");
         savePositions();
-        QDRService.setUpdateEntities([])
-        QDRService.stopUpdating();
-        QDRService.delUpdatedAction("normalsStats");
-        QDRService.delUpdatedAction("topology");
-        QDRService.delDisconnectAction( onDisconnect )
+        QDRService.management.topology.setUpdateEntities([])
+        QDRService.management.topology.stopUpdating();
+        QDRService.management.topology.delUpdatedAction("normalsStats");
+        QDRService.management.topology.delUpdatedAction("topology");
 
         d3.select("#SVG_ID").remove();
         window.removeEventListener('resize', resize);
@@ -1918,25 +1967,26 @@ var QDR = (function(QDR) {
 
       function handleInitialUpdate() {
         // we only need to update connections during steady-state
-        QDRService.setUpdateEntities([".connection"])
+        QDRService.management.topology.setUpdateEntities(["connection"])
         // we currently have all entities available on all routers
         saveChanged();
-        animate = true;
         initForceGraph();
         // after the graph is displayed fetch all .router.node info. This is done so highlighting between nodes
         // doesn't incur a delay
-        QDRService.ensureAllEntities([{entity: ".router.node", attrs: ["id","nextHop"]}], function () {})
+        QDRService.management.topology.addUpdateEntities({entity: "router.node", attrs: ["id","nextHop"]})
         // call this function every time a background update is done
-        QDRService.addUpdatedAction("topology", function() {
+        QDRService.management.topology.addUpdatedAction("topology", function() {
           var changed = hasChanged()
           // there is a new node, we need to get all of it's entities before drawing the graph
           if (changed > 0) {
-            QDRService.delUpdatedAction("topology")
+            QDRService.management.topology.delUpdatedAction("topology")
+            animate = true;
             setupInitialUpdate()
           } else if (changed === -1) {
             // we lost a node (or a client), we can draw the new svg immediately
+            animate = false;
             saveChanged();
-            var nodeInfo = QDRService.topology.nodeInfo();
+            var nodeInfo = QDRService.management.topology.nodeInfo();
             initializeNodes(nodeInfo)
 
             var unknowns = []
@@ -1946,7 +1996,6 @@ var QDR = (function(QDR) {
             }
             else {
               force.nodes(nodes).links(links).start();
-              animate = true;
               restart();
             }
 
@@ -1960,14 +2009,21 @@ var QDR = (function(QDR) {
 
       function setupInitialUpdate() {
         // make sure all router nodes have .connection info. if not then fetch any missing info
-        QDRService.ensureAllEntities(
+        QDRService.management.topology.ensureAllEntities(
 //          [{entity: ".connection"}, {entity: ".router.lin.router.link", attrs: ["linkType","connectionId","linkDir"]}],
-          [{entity: ".connection"}],
+          [{entity: "connection"}],
           //[{entity: ".connection"}],
             handleInitialUpdate)
       }
+      if (!QDRService.management.connection.is_connected()) {
+        // we are not connected. we probably got here from a bookmark or manual page reload
+        QDR.redirectWhenConnected($location, "topology");
+        return;
+      }
+
+      animate = true;
       setupInitialUpdate();
-      QDRService.startUpdating();
+      QDRService.management.topology.startUpdating(false);
 
     }
   ]);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[5/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrTopology.html b/console/stand-alone/plugin/html/qdrTopology.html
index 851c724..472ad9c 100644
--- a/console/stand-alone/plugin/html/qdrTopology.html
+++ b/console/stand-alone/plugin/html/qdrTopology.html
@@ -20,12 +20,16 @@ under the License.
     <div class="qdr-topology pane left" ng-controller="QDR.TopologyFormController">
         <div id="topologyForm" ng-class="{selected : isSelected()}">
             <div ng-if="form == 'router'">
-                <h4>Router Info</h4>
-                <div class="gridStyle" ng-grid="topoGridOptions"></div>
+                <h4 uib-popover="This is popover text"
+                          popover-title="The title"
+                          popover-trigger="'mouseenter'"
+                          popover-append-to-body="true">
+                        Router Info</h4>
+                <div class="grid" ui-grid="topoGridOptions" ui-grid-auto-resize ng-style="infoStyle()"></div>
             </div>
             <div ng-if="form == 'connection'">
                 <h4>Connection Info</h4>
-                <div class="gridStyle" ng-grid="topoGridOptions"></div>
+                <div class="grid" ui-grid="topoGridOptions" ui-grid-auto-resize ng-style="infoStyle()"></div>
             </div>
         </div>
         <button ng-if="panelVisible" ng-click="hideLeftPane()" class="hideLeft" title="Hide"><i class="icon-step-backward"></i></button>
@@ -33,7 +37,8 @@ under the License.
     </div>
     <div class="panel-adjacent">
         <div id="topology"><!-- d3 toplogy here --></div>
-        <div id="crosssection"><!-- d3 pack here --></div>
+        <div id="crosssection"></div><div id="crosshtml" ng-bind-html="crosshtml"></div>
+
         <div id="node_context_menu" class="contextMenu">
             <ul>
                 <li class="na" ng-class="{'force-display': !isFixed()}" ng-click="setFixed(true)">Freeze in place</li>
@@ -43,11 +48,11 @@ under the License.
         <div id="svg_legend"></div>
         <div id="multiple_details">
             <h4 class="grid-title">Connections</h4>
-            <div class="gridStyle" ng-grid="multiDetails"></div>
+            <div class="grid" ui-grid="multiDetails" ui-grid-selection ui-grid-auto-resize ng-style="connectionsStyle()"></div>
         </div>
         <div id="link_details">
             <h4 class="grid-title">Links</h4>
-            <div class="gridStyle" ng-grid="linkDetails"></div>
+            <div class="grid" ui-grid="linkDetails" ui-grid-auto-resize ng-style="linksStyle()"></div>
         </div>
     </div>
 </div>
@@ -61,5 +66,5 @@ under the License.
     </div>
 </script>
 <script type="text/ng-template" id="titleCellTemplate.html">
-    <div title="{{row.entity[col.field]}}" class="ngCellText">{{row.entity[col.field]}}</div>
+    <div title="{{row.entity.attributeValue}}" class="ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>
 </script>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/tmplListTree.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/tmplListTree.html b/console/stand-alone/plugin/html/tmplListTree.html
index f00ea19..64797fa 100644
--- a/console/stand-alone/plugin/html/tmplListTree.html
+++ b/console/stand-alone/plugin/html/tmplListTree.html
@@ -17,10 +17,10 @@
  under the License
 -->
 
-<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2" style="min-height: 990px;">
+<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
     <ng-include src="'listGrid.html'"></ng-include>
 </div>
-<div class="col-sm-3 col-md-2 col-sm-pull-9 col-md-pull-10 sidebar-pf sidebar-pf-left" style="min-height: 990px;">
+<div class="qdr-attributes col-sm-3 col-md-2 col-sm-pull-9 col-md-pull-10 sidebar-pf sidebar-pf-left">
     <div class="pane-wrapper">
         <div class="pane-header-wrapper">
             <div class="tree-header"><select ng-options="node as node.name for node in nodes" ng-model="currentNode" ng-change="selectNode(currentNode)"></select></div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/html/tmplOverviewTree.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/tmplOverviewTree.html b/console/stand-alone/plugin/html/tmplOverviewTree.html
index 35e8b7b..8bc9a13 100644
--- a/console/stand-alone/plugin/html/tmplOverviewTree.html
+++ b/console/stand-alone/plugin/html/tmplOverviewTree.html
@@ -17,11 +17,11 @@
  under the License
 -->
 
-<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2" style="min-height: 990px;">
+<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
     <ng-include src="'overviewGrid.html'"></ng-include>
 </div>
 
-<div class="col-sm-3 col-md-2 col-sm-pull-9 col-md-pull-10 sidebar-pf sidebar-pf-left" style="min-height: 990px;">
+<div class="overview-tree col-sm-3 col-md-2 col-sm-pull-9 col-md-pull-10 sidebar-pf sidebar-pf-left">
     <div class="pane-wrapper">
         <div class="pane-header-wrapper">
             <div ng-hide="largeNetwork" class="expand-collapse">

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/dispatchPlugin.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/dispatchPlugin.js b/console/stand-alone/plugin/js/dispatchPlugin.js
index 19b65b7..4a07e78 100644
--- a/console/stand-alone/plugin/js/dispatchPlugin.js
+++ b/console/stand-alone/plugin/js/dispatchPlugin.js
@@ -60,14 +60,19 @@ var QDR = (function(QDR) {
   QDR.SETTINGS_KEY = 'QDRSettings';
   QDR.LAST_LOCATION = "QDRLastLocation";
 
+  QDR.redirectWhenConnected = function ($location, org) {
+    $location.path(QDR.pluginRoot + "/connect")
+    $location.search('org', org);
+  }
+
   /**
    * @property module
    * @type {object}
    *
    * This plugin's angularjs module instance
    */
-  QDR.module = angular.module(QDR.pluginName, ['ngRoute', 'ngSanitize', 'ngResource', 'ui.bootstrap', 'ngGrid', 'ui.slider']);
-//  QDR.module = angular.module(QDR.pluginName, ['ngResource', 'ngGrid', 'ui.bootstrap', 'ui.slider'/*, 'minicolors' */]);
+  QDR.module = angular.module(QDR.pluginName, ['ngRoute', 'ngSanitize', 'ngResource', 'ui.bootstrap',
+        'ui.grid', 'ui.grid.selection', 'ui.grid.autoResize', 'ui.grid.resizeColumns', 'ui.grid.saveState', 'ui.slider']);
 
   Core = {
     notification: function (severity, msg) {
@@ -81,48 +86,24 @@ var QDR = (function(QDR) {
       .when('/', {
         templateUrl: QDR.templatePath + 'qdrOverview.html'
         })
-      .when('/QDR/overview', {
-        templateUrl: QDR.templatePath + 'qdrOverview.html'
-        })
       .when('/overview', {
           templateUrl: QDR.templatePath + 'qdrOverview.html'
         })
-      .when('/QDR/topology', {
-          templateUrl: QDR.templatePath + 'qdrTopology.html'
-        })
       .when('/topology', {
           templateUrl: QDR.templatePath + 'qdrTopology.html'
         })
-      .when('/QDR/list', {
-          templateUrl: QDR.templatePath + 'qdrList.html'
-        })
       .when('/list', {
           templateUrl: QDR.templatePath + 'qdrList.html'
         })
-      .when('#/list', {
-          templateUrl: QDR.templatePath + 'qdrList.html'
-        })
-      .when('/#/list', {
-          templateUrl: QDR.templatePath + 'qdrList.html'
-        })
-      .when('/QDR/schema', {
-          templateUrl: QDR.templatePath + 'qdrSchema.html'
-        })
       .when('/schema', {
           templateUrl: QDR.templatePath + 'qdrSchema.html'
         })
-      .when('/QDR/charts', {
-          templateUrl: QDR.templatePath + 'qdrCharts.html'
-        })
       .when('/charts', {
           templateUrl: QDR.templatePath + 'qdrCharts.html'
         })
       .when('/connect', {
           templateUrl: QDR.templatePath + 'qdrConnect.html'
         })
-      .otherwise({
-          templateUrl: QDR.templatePath + 'qdrConnect.html'
-        })
   });
 
   QDR.module.config(function ($compileProvider) {
@@ -142,7 +123,7 @@ var QDR = (function(QDR) {
 
   QDR.module.filter('humanify', function (QDRService) {
     return function (input) {
-      return QDRService.humanify(input);
+      return QDRService.utilities.humanify(input);
     };
   });
 
@@ -195,23 +176,20 @@ var QDR = (function(QDR) {
     QDR.log = new QDR.logger($log);
     QDR.log.info("*************creating Dispatch Console************");
     var curPath = $location.path()
-QDR.log.info("curPath = " + curPath)
     var org = curPath.substr(1)
     if (org && org.length > 0 && org !== "connect") {
-QDR.log.info("setting location.search to org=" + org)
       $location.search('org', org)
     } else {
-QDR.log.info("setting location.search to org=null")
       $location.search('org', null)
     }
     QDR.queue = d3.queue;
 
-    QDRService.addUpdatedAction("initChartService", function() {
-      QDRService.delUpdatedAction("initChartService")
+    QDRService.management.topology.addUpdatedAction("initChartService", function() {
+      QDRService.management.topology.delUpdatedAction("initChartService")
       QDRChartService.init(); // initialize charting service after we are connected
     });
     var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {autostart: false, address: 'localhost', port: 5673}
-    if (!QDRService.connected) {
+    if (!QDRService.management.connection.is_connected()) {
       // attempt to connect to the host:port that served this page
       var protocol = $location.protocol()
       var host = $location.host()
@@ -219,50 +197,51 @@ QDR.log.info("setting location.search to org=null")
       var search = $location.search()
       if (search.org) {
         if (search.org === 'connect')
-QDR.log.info("was not connected. setting org to overview")
           $location.search("org", "overview")
       }
       var connectOptions = {address: host, port: port}
-      QDRService.testConnect(connectOptions, 10000, function (e) {
+      QDRService.management.connection.testConnect(connectOptions, function (e) {
         if (e.error) {
-          QDR.log.info("failed to auto-connect to " + host + ":" + port)
+          QDR.log.debug("failed to auto-connect to " + host + ":" + port)
+          QDR.log.debug("redirecting to connect page")
           // the connect page should rneder
           $timeout(function () {
             $location.path('/connect')
             $location.search('org', org)
           })
         } else {
-QDR.log.info("testConnect succeeded using address:port of browser")
-          QDRService.getSchema(function () {
-            QDR.log.debug("got schema after connection")
-            QDRService.addUpdatedAction("initialized", function () {
-              QDRService.delUpdatedAction("initialized")
-              QDR.log.debug("got initial topology")
-              $timeout(function() {
-    QDR.log.info("after initialization org was " + org + " and location.path() was " + $location.path())
-                if (org === '' || org === 'connect') {
-                  org = localStorage[QDR.LAST_LOCATION] || "/overview"
-                  if (org === '/')
-                    org = "/overview"
-    QDR.log.info("after initialization org was loaded from localStorage and is now " + org)
-                } else {
-                  if (org && $location.path() !== '/connect') {
-                    org = $location.path().substr(1)
+          QDR.log.info("Connect succeeded. Using address:port of browser")
+          // register an onConnect event handler
+          QDRService.management.connection.addConnectAction( function () {
+            QDRService.management.getSchema(function () {
+              QDR.log.debug("got schema after connection")
+              QDRService.management.topology.addUpdatedAction("initialized", function () {
+                QDRService.management.topology.delUpdatedAction("initialized")
+                QDR.log.debug("got initial topology")
+                $timeout(function() {
+                  if (org === '' || org === 'connect') {
+                    org = localStorage[QDR.LAST_LOCATION] || "/overview"
+                    if (org === '/')
+                      org = "/overview"
+                  } else {
+                    if (org && $location.path() !== '/connect') {
+                      org = $location.path().substr(1)
+                    }
                   }
-                }
-    QDR.log.info("after initialization going to " + org)
-                $location.path(org)
-                $location.search('org', null)
-                $location.replace()
+                  $location.path(org)
+                  $location.search('org', null)
+                  $location.replace()
+                })
               })
+              QDR.log.info("requesting a topology")
+              QDRService.management.topology.setUpdateEntities([])
+              QDRService.management.topology.get() // gets the list of routers
             })
-            QDR.log.info("requesting a topology")
-            QDRService.setUpdateEntities([])
-            QDRService.topology.get()
           })
           $timeout( function () {
-            QDR.log.info("calling connect")
-            QDRService.connect(e)
+            // complete the connection (create the sender/receiver)
+            connectOptions.reconnect = true
+            QDRService.management.connection.connect(connectOptions)
           })
         }
       })
@@ -270,7 +249,6 @@ QDR.log.info("testConnect succeeded using address:port of browser")
 
     $rootScope.$on('$routeChangeSuccess', function(event, next, current) {
       var path = $location.path();
-QDR.log.info("routeChangeSuccess: path is now " + path)
       if (path !== "/connect") {
         localStorage[QDR.LAST_LOCATION] = path;
       }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/navbar.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/navbar.js b/console/stand-alone/plugin/js/navbar.js
index 0d7baf9..e562a7e 100644
--- a/console/stand-alone/plugin/js/navbar.js
+++ b/console/stand-alone/plugin/js/navbar.js
@@ -21,55 +21,47 @@ under the License.
  */
 var QDR = (function (QDR) {
 
-  /**
-   * @property breadcrumbs
-   * @type {{content: string, title: string, isValid: isValid, href: string}[]}
-   *
-   * Data structure that defines the sub-level tabs for
-   * our plugin, used by the navbar controller to show
-   * or hide tabs based on some criteria
-   */
   QDR.breadcrumbs = [
     {
         content: '<i class="icon-cogs"></i> Connect',
         title: "Connect to a router",
         isValid: function () { return true; },
-        href: "#!" + QDR.pluginRoot + "/connect",
+        href: "#/connect",
         name: "Connect"
     },
     {
         content: '<i class="pficon-home"></i> Overview',
         title: "View router overview",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#!" + QDR.pluginRoot + "/overview",
+        isValid: function (QDRService) {return QDRService.management.connection.is_connected() },
+        href: "#/overview",
         name: "Overview"
       },
     {
         content: '<i class="icon-list "></i> Entities',
         title: "View the attributes of the router entities",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#!" + QDR.pluginRoot + "/list",
+        isValid: function (QDRService) { return QDRService.management.connection.is_connected() },
+        href: "#/list",
         name: "Entities"
       },
     {
         content: '<i class="icon-star-empty"></i> Topology',
         title: "View router network topology",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#!" + QDR.pluginRoot + "/topology",
+        isValid: function (QDRService) { return QDRService.management.connection.is_connected() },
+        href: "#/topology",
         name: "Topology"
       },
     {
         content: '<i class="icon-bar-chart"></i> Charts',
         title: "View charts",
-        isValid: function (QDRService, $location) { return QDRService.isConnected() && QDR.isStandalone; },
-        href: "#!/charts",
+        isValid: function (QDRService, $location) { return QDRService.management.connection.is_connected() },
+        href: "#/charts",
         name: "Charts"
     },
     {
         content: '<i class="icon-align-left"></i> Schema',
         title: "View dispatch schema",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#!" + QDR.pluginRoot + "/schema",
+        isValid: function (QDRService) { return QDRService.management.connection.is_connected() },
+        href: "#/schema",
         right: true,
         name: "Schema"
       }
@@ -86,19 +78,11 @@ var QDR = (function (QDR) {
   QDR.module.controller("QDR.NavBarController", ['$rootScope', '$scope', 'QDRService', 'QDRChartService', '$routeParams', '$location', function($rootScope, $scope, QDRService, QDRChartService, $routeParams, $location) {
     $scope.breadcrumbs = QDR.breadcrumbs;
     $scope.isValid = function(link) {
-      if ($scope.isActive(link.href))
-        $rootScope.$broadcast("setCrumb", {name: link.name, title: link.content})
       return link.isValid(QDRService, $location);
     };
 
     $scope.isActive = function(href) {
-//QDR.log.info("isActive(" + href + ") location.path() is " + $location.path())
-      // highlight the connect tab if we are on the root page
-      if (($location.path() === QDR.pluginRoot) && (href.split("#")[1] === QDR.pluginRoot + "/connect")) {
-//QDR.log.info("isActive is returning true for connect page")
-        return true
-      }
-      return href.split("#")[1] === '!' + $location.path();
+      return href.split("#")[1] === $location.path();
     };
 
     $scope.isRight = function (link) {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrChartService.js b/console/stand-alone/plugin/js/qdrChartService.js
index cc64981..418b597 100644
--- a/console/stand-alone/plugin/js/qdrChartService.js
+++ b/console/stand-alone/plugin/js/qdrChartService.js
@@ -81,7 +81,7 @@ var QDR = (function(QDR) {
             var nameparts = name.split('/');
             if (nameparts.length == 2)
               name = nameparts[1];
-            var key = QDRService.nameFromId(this.request().nodeId) + this.request().entity + name + this.attr() + "_" + this.instance + "_" + (this.request().aggregate ? "1" : "0");
+            var key = QDRService.management.topology.nameFromId(this.request().nodeId) + this.request().entity + name + this.attr() + "_" + this.instance + "_" + (this.request().aggregate ? "1" : "0");
             // remove all characters except letters,numbers, and _
             return key.replace(/[^\w]/gi, '')
           }
@@ -142,9 +142,9 @@ var QDR = (function(QDR) {
           return this;
         }
         this.title = function(_) {
-          var name = this.request().aggregate ? 'Aggregate' : QDRService.nameFromId(this.nodeId());
+          var name = this.request().aggregate ? 'Aggregate' : QDRService.management.topology.nameFromId(this.nodeId());
           var computed = name +
-            " " + QDRService.humanify(this.attr()) +
+            " " + QDRService.utilities.humanify(this.attr()) +
             " - " + this.name()
           if (!arguments.length) return this.userTitle || computed;
 
@@ -266,11 +266,11 @@ var QDR = (function(QDR) {
 
         init: function() {
           self.loadCharts();
-          QDRService.addDisconnectAction(function() {
+          QDRService.management.connection.addDisconnectAction(function() {
             self.charts.forEach(function(chart) {
               self.unRegisterChart(chart, true)
             })
-            QDRService.addConnectAction(self.init);
+            QDRService.management.connection.addConnectAction(self.init);
           })
         },
 
@@ -461,10 +461,10 @@ var QDR = (function(QDR) {
             }
           }
           if (request.aggregate) {
-            var nodeList = QDRService.nodeIdList()
-            QDRService.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
+            var nodeList = QDRService.management.topology.nodeIdList()
+            QDRService.management.topology.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
           } else {
-            QDRService.fetchEntity(request.nodeId, request.entity, attrs, saveResponse);
+            QDRService.management.topology.fetchEntity(request.nodeId, request.entity, attrs, saveResponse);
           }
           // it is now safe to schedule another request
           if (once)
@@ -527,7 +527,7 @@ var QDR = (function(QDR) {
           var charts = angular.fromJson(localStorage["QDRCharts"]);
           if (charts) {
             // get array of known ids
-            var nodeList = QDRService.nodeList().map(function(node) {
+            var nodeList = QDRService.management.topology.nodeList().map(function(node) {
               return node.id;
             })
             charts.forEach(function(chart) {
@@ -587,7 +587,7 @@ var QDR = (function(QDR) {
             var now = new Date();
             var visibleDate = new Date(now.getTime() - chart.visibleDuration * 60 * 1000);
             var data = chart.data();
-            var nodeList = QDRService.nodeIdList();
+            var nodeList = QDRService.management.topology.nodeIdList();
 
             if (chart.type == "rate") {
               var rateData = [];
@@ -608,7 +608,7 @@ var QDR = (function(QDR) {
                         nodeList.forEach(function(node, nodeIndex) {
                           if (d1[2][nodeIndex] && d[2][nodeIndex])
                             detail.push({
-                              node: QDRService.nameFromId(node),
+                              node: QDRService.management.topology.nameFromId(node),
                               val: (d1[2][nodeIndex].val - d[2][nodeIndex].val) / elapsed
                             })
                         })
@@ -696,9 +696,9 @@ var QDR = (function(QDR) {
               }
               // create and initialize the chart
               this.svgchart = self.timeSeriesStackedChart(id, width, height,
-                  QDRService.humanify(this.chart.attr()),
+                  QDRService.utilities.humanify(this.chart.attr()),
                   this.chart.name(),
-                  QDRService.nameFromId(this.chart.nodeId()),
+                  QDRService.management.topology.nameFromId(this.chart.nodeId()),
                   this.chart.entity(),
                   stacked,
                   this.chart.visibleDuration)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrCharts.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrCharts.js b/console/stand-alone/plugin/js/qdrCharts.js
index 2cb9e42..7766457 100644
--- a/console/stand-alone/plugin/js/qdrCharts.js
+++ b/console/stand-alone/plugin/js/qdrCharts.js
@@ -28,55 +28,54 @@ var QDR = (function (QDR) {
    */
   QDR.module.controller("QDR.ChartsController", function($scope, QDRService, QDRChartService, $uibModal, $location, $routeParams) {
 
-	var updateTimer = null;
-
-	if (!QDRService.connected) {
-		// we are not connected. we probably got here from a bookmark or manual page reload
-		QDRService.redirectWhenConnected("charts");
-		return;
-	}
-	// we are currently connected. setup a handler to get notified if we are ever disconnected
-	QDRService.addDisconnectAction( function () {
-		QDRService.redirectWhenConnected("charts")
-		$scope.$apply();
-	})
-
-
-    $scope.svgCharts = [];
-    // create an svg object for each chart
-    QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
-        var svgChart = new QDRChartService.AreaChart(chart)
-        svgChart.zoomed = false;
-        $scope.svgCharts.push(svgChart);
-    })
+  var updateTimer = null;
+
+  if (!QDRService.management.connection.is_connected()) {
+    // we are not connected. we probably got here from a bookmark or manual page reload
+    QDR.redirectWhenConnected($locaion, "charts");
+    return;
+  }
+  // we are currently connected. setup a handler to get notified if we are ever disconnected
+  QDRService.management.connection.addDisconnectAction( function () {
+    QDR.redirectWhenConnected($locaion, "charts")
+    $scope.$apply();
+  })
+
+  $scope.svgCharts = [];
+  // create an svg object for each chart
+  QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
+    var svgChart = new QDRChartService.AreaChart(chart)
+    svgChart.zoomed = false;
+    $scope.svgCharts.push(svgChart);
+  })
 
     // redraw the chart every update period
-	// this is a $scope function because it is called from the dialog
+  // this is a $scope function because it is called from the dialog
     var updateCharts = function () {
-        $scope.svgCharts.forEach(function (svgChart) {
-            svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
-        })
-		var updateRate = localStorage['updateRate'] ?  localStorage['updateRate'] : 5000;
-		if (updateTimer) {
-			clearTimeout(updateTimer)
-		}
-        updateTimer = setTimeout(updateCharts, updateRate);
+      $scope.svgCharts.forEach(function (svgChart) {
+        svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
+      })
+      var updateRate = localStorage['updateRate'] ?  localStorage['updateRate'] : 5000;
+      if (updateTimer) {
+        clearTimeout(updateTimer)
+      }
+      updateTimer = setTimeout(updateCharts, updateRate);
     }
 
         // called by ng-init in the html when the page is loaded
-	$scope.chartsLoaded = function () {
-	    $scope.svgCharts.forEach(function (svgChart) {
+  $scope.chartsLoaded = function () {
+      $scope.svgCharts.forEach(function (svgChart) {
                 QDRChartService.sendChartRequest(svgChart.chart.request(), true);
             })
             if (updateTimer)
                 clearTimeout(updateTimer)
-	    setTimeout(updateCharts, 0);
-	}
+      setTimeout(updateCharts, 0);
+  }
 
-	$scope.zoomChart = function (chart) {
-		chart.zoomed = !chart.zoomed;
-		chart.zoom(chart.chart.id(), chart.zoomed);
-	}
+  $scope.zoomChart = function (chart) {
+    chart.zoomed = !chart.zoomed;
+    chart.zoom(chart.chart.id(), chart.zoomed);
+  }
     $scope.showListPage = function () {
         $location.path("/list");
     };
@@ -102,7 +101,7 @@ var QDR = (function (QDR) {
     // called from dialog when we want to clone the dialog chart
     // the chart argument here is a QDRChartService chart
     $scope.addChart = function (chart) {
-        $scope.svgCharts.push(new QDRChartService.AreaChart(chart));
+      $scope.svgCharts.push(new QDRChartService.AreaChart(chart));
     };
 
     $scope.$on("$destroy", function( event ) {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrList.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrList.js b/console/stand-alone/plugin/js/qdrList.js
index 2be64ed..4ff7b1e 100644
--- a/console/stand-alone/plugin/js/qdrList.js
+++ b/console/stand-alone/plugin/js/qdrList.js
@@ -22,22 +22,24 @@ under the License.
 var QDR = (function(QDR) {
 
   /**
-   * @method ListController
-   * @param $scope
-   * @param QDRService
-   *
    * Controller for the main interface
    */
   QDR.module.controller("QDR.ListController", ['$scope', '$location', '$uibModal', '$filter', '$timeout', 'QDRService', 'QDRChartService',
     function ($scope, $location, $uibModal, $filter, $timeout, QDRService, QDRChartService) {
 
+    QDR.log.debug("QDR.ListControll started with location of " + $location.path() + " and connection of  " + QDRService.management.connection.is_connected());
     var updateIntervalHandle = undefined;
     var updateInterval = 5000;
     var ListExpandedKey = "QDRListExpanded";
+    var SelectedEntityKey = "QDRSelectedEntity"
+    var ActivatedKey = "QDRActivatedKey"
     $scope.details = {};
 
     $scope.tmplListTree = QDR.templatePath + 'tmplListTree.html';
-    $scope.selectedEntity = localStorage['QDRSelectedEntity'] || "address";
+    $scope.selectedEntity = localStorage[SelectedEntityKey] || "address";
+    $scope.ActivatedKey = localStorage[ActivatedKey] || null;
+    if ($scope.selectedEntity == "undefined")
+      $scope.selectedEntity = undefined
     $scope.selectedNode = localStorage['QDRSelectedNode'];
     $scope.selectedNodeId = localStorage['QDRSelectedNodeId'];
     $scope.selectedRecordName = localStorage['QDRSelectedRecordName'];
@@ -57,8 +59,6 @@ var QDR = (function(QDR) {
         op: 'UPDATE',
         title: "Update this attribute",
         isValid: function () {
-          //QDR.log.debug("isValid UPDAATE? " + this.op)
-          //console.dump($scope.operations)
           return $scope.operations.indexOf(this.op) > -1
         }
       },
@@ -96,28 +96,30 @@ var QDR = (function(QDR) {
         $scope.logResults = [];
         $scope.fetchingLog = true;
         var entity; // undefined since it is not supported in the GET-LOG call
-        QDRService.sendMethod($scope.currentNode.id, entity, {}, $scope.currentMode.op, {}, function (nodeName, entity, response, context) {
-          $scope.fetchingLog = false;
-          var statusCode = context.message.application_properties.statusCode;
+        QDRService.management.connection.sendMethod($scope.currentNode.id, entity, {}, $scope.currentMode.op)
+          .then( function (response) {
+          var statusCode = response.context.message.application_properties.statusCode;
           if (statusCode < 200 || statusCode >= 300) {
-            Core.notification('error', context.message.statusDescription);
-            QDR.log.info('Error ' + context.message.statusDescription)
+            Core.notification('error', response.context.message.statusDescription);
+            QDR.log.error('Error ' + response.context.message.statusDescription)
             return;
           }
-          $scope.logResults = response.filter( function (entry) {
-            return entry[0] === $scope.detailsObject.module
-          }).sort( function (a, b) {
-            return b[5] - a[5]
-          }).map( function (entry) {
-            return {
-              type: entry[1],
-              message: entry[2],
-              source: entry[3],
-              line: entry[4],
-              time: Date(entry[5]).toString()
-            }
+          $timeout( function () {
+            $scope.fetchingLog = false;
+            $scope.logResults = response.response.filter( function (entry) {
+              return entry[0] === $scope.detailsObject.module
+            }).sort( function (a, b) {
+              return b[5] - a[5]
+            }).map( function (entry) {
+              return {
+                type: entry[1],
+                message: entry[2],
+                source: entry[3],
+                line: entry[4],
+                time: Date(entry[5]).toString()
+              }
+            })
           })
-          $scope.$apply();
         })
       }
     }
@@ -126,47 +128,40 @@ var QDR = (function(QDR) {
     }
 
     $scope.expandAll = function () {
-      $("#entityTree").dynatree("getRoot").visit(function(node){
-                node.expand(true);
-            });
+      $("#entityTree").fancytree("getTree").visit(function(node){
+        node.setExpanded(true);
+      });
     }
     $scope.contractAll = function () {
-      $("#entityTree").dynatree("getRoot").visit(function(node){
-                node.expand(false);
-            });
+      $("#entityTree").fancytree("getTree").visit(function(node){
+        node.setExpanded(false);
+      });
     }
 
-    if (!QDRService.connected) {
+    if (!QDRService.management.connection.is_connected()) {
       // we are not connected. we probably got here from a bookmark or manual page reload
-      QDRService.redirectWhenConnected("list");
+      QDR.redirectWhenConnected($location, "list")
       return;
     }
-    var onDisconnect = function () {
-QDR.log.info("we were just disconnected while on the list page. Setting org to redirect back once we are connected again")
-      $timeout( function () {
-        QDRService.redirectWhenConnected("list")
-      })
-    }
-    // we are currently connected. setup a handler to get notified if we are ever disconnected
-    QDRService.addDisconnectAction( onDisconnect )
 
     $scope.nodes = []
     var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"];
     var aggregateEntities = ["router.address"];
     var classOverrides = {
       "connection": function (row, nodeId) {
-        var isConsole = QDRService.isAConsole (row.properties.value, row.identity.value, row.role.value, nodeId)
+        var isConsole = QDRService.utilities.isAConsole (row.properties.value, row.identity.value, row.role.value, nodeId)
         return isConsole ? "console" : row.role.value === "inter-router" ? "inter-router" : "external";
       },
       "router.link": function (row, nodeId) {
         var link = {nodeId: nodeId, connectionId: row.connectionId.value}
-        var isConsole = QDRService.isConsoleLink(link)
+
+        var isConsole = QDRService.utilities.isConsole(QDRService.management.topology.getConnForLink(link))
         return isConsole ? "console" : row.linkType.value;
       },
       "router.address": function (row) {
-        var identity = QDRService.identity_clean(row.identity.value)
-        var address = QDRService.addr_text(identity)
-        var cls = QDRService.addr_class(identity)
+        var identity = QDRService.utilities.identity_clean(row.identity.value)
+        var address = QDRService.utilities.addr_text(identity)
+        var cls = QDRService.utilities.addr_class(identity)
         if (address === "$management")
           cls = "internal " + cls
         return cls
@@ -174,29 +169,51 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
     }
 
     var lookupOperations = function () {
-      var ops = QDRService.schema.entityTypes[$scope.selectedEntity].operations.filter( function (op) { return op !== 'READ'});
+      var ops = QDRService.management.schema().entityTypes[$scope.selectedEntity].operations.filter( function (op) { return op !== 'READ'});
       $scope.operation = ops.length ? ops[0] : "";
       return ops;
     }
-
     var entityTreeChildren = [];
     var expandedList = angular.fromJson(localStorage[ListExpandedKey]) || [];
-    var onTreeNodeExpanded = function (expanded, node) {
+    var saveExpanded = function () {
       // save the list of entities that are expanded
-      var tree = $("#entityTree").dynatree("getTree");
-      var list = [];
+      var tree = $("#entityTree").fancytree("getTree");
+      var list = []
       tree.visit( function (tnode) {
         if (tnode.isExpanded()) {
-          list.push(tnode.data.key)
+          list.push(tnode.key)
         }
       })
       localStorage[ListExpandedKey] = JSON.stringify(list)
+    }
 
-      if (expanded)
-        onTreeSelected(node);
+    var onTreeNodeBeforeActivate = function (event, data) {
+      // if node is toplevel entity
+      if (data.node.data.typeName === "entity") {
+        // if the current active node is not this one and not one of its children
+        var active = data.tree.getActiveNode()
+        if (active && !data.node.isActive() && data.node.isExpanded()) {  // there is an active node and it's not this one
+          var any = false
+          var children = data.node.getChildren()
+          if (children) {
+            any = children.some( function (child) {
+              return child.key === active.key
+            })
+          }
+          if (!any) // none of the clicked on node's children was active
+            return false  // don't activate, just collapse this top level node
+        }
+      }
+      return true
+    }
+    var onTreeNodeExpanded = function (event, data) {
+      saveExpanded()
+      updateExpandedEntities()
     }
     // a tree node was selected
-    var onTreeSelected = function (selectedNode) {
+    var onTreeNodeActivated = function (event, data) {
+      $scope.ActivatedKey = data.node.key
+      var selectedNode = data.node
       $timeout( function () {
         if ($scope.currentMode.id === 'operations')
           $scope.currentMode = $scope.modes[0];
@@ -207,25 +224,29 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
           $scope.currentMode = $scope.modes[0];
         }
         if (selectedNode.data.typeName === "entity") {
-          $scope.selectedEntity = selectedNode.data.key;
+          $scope.selectedEntity = selectedNode.key;
           $scope.operations = lookupOperations()
         } else if (selectedNode.data.typeName === 'attribute') {
-          $scope.selectedEntity = selectedNode.parent.data.key;
+          $scope.selectedEntity = selectedNode.parent.key;
           $scope.operations = lookupOperations()
-          $scope.selectedRecordName = selectedNode.data.key;
+          $scope.selectedRecordName = selectedNode.key;
           updateDetails(selectedNode.data.details);   // update the table on the right
-          $("#entityTree").dynatree("getRoot").visit(function(node){
-             node.select(false);
-          });
-          selectedNode.select();
         }
       })
     }
-
+    var getExpanded = function (tree) {
+      var list = []
+      tree.visit( function (tnode) {
+        if (tnode.isExpanded()) {
+          list.push(tnode)
+        }
+      })
+      return list
+    }
     // fill in an empty results recoord based on the entities schema
     var fromSchema = function (entityName) {
       var row = {}
-      var schemaEntity = QDRService.schema.entityTypes[entityName]
+      var schemaEntity = QDRService.management.schema().entityTypes[entityName]
       for (attr in schemaEntity.attributes) {
         var entity = schemaEntity.attributes[attr]
         var value = ""
@@ -248,77 +269,98 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
       return row;
     }
     $scope.hasCreate = function () {
-      var schemaEntity = QDRService.schema.entityTypes[$scope.selectedEntity]
+      var schemaEntity = QDRService.management.schema().entityTypes[$scope.selectedEntity]
       return (schemaEntity.operations.indexOf("CREATE") > -1)
     }
 
-    var stopUpdating = function () {
-      if (angular.isDefined(updateIntervalHandle)) {
-        clearInterval(updateIntervalHandle);
-      }
-      updateIntervalHandle = undefined;
+    var getActiveChild = function (node) {
+      var active = node.children.filter(function (child) {
+        return child.isActive()
+      })
+      if (active.length > 0)
+        return active[0].key
+      return null
     }
-
     // the data for the selected entity is available, populate the tree
-    var updateEntityChildren = function (entity, tableRows, expand) {
-      var tree = $("#entityTree").dynatree("getTree");
-      if (!tree.getNodeByKey) {
-        return stopUpdating()
+    var updateTreeChildren = function (entity, tableRows, expand) {
+      var tree = $("#entityTree").fancytree("getTree"), node;
+      if (tree) {
+        node = tree.getNodeByKey(entity)
+      }
+      if (!tree || !node) {
+        return
       }
-      var node = tree.getNodeByKey(entity)
+      var wasActive = node.isActive()
+      var wasExpanded = node.isExpanded()
+      var activeChildKey = getActiveChild(node)
+      node.removeChildren()
       var updatedDetails = false;
-      var scrollTreeDiv = $('.qdr-attributes.pane.left .pane-viewport')
-      var scrollTop = scrollTreeDiv.scrollTop();
-      node.removeChildren();
       if (tableRows.length == 0) {
-          node.addChild({
+        var newNode = {
           addClass:   "no-data",
-              typeName:   "none",
-              title:      "no data",
-          key:        node.data.key + ".1"
-          })
-          if (expand) {
-              updateDetails(fromSchema(entity));
-                 $scope.selectedRecordName = entity;
+          typeName:   "none",
+          title:      "no data",
+          key:        node.key + ".1"
+        }
+        node.addNode(newNode)
+        if (expand) {
+          updateDetails(fromSchema(entity));
+          $scope.selectedRecordName = entity;
         }
       } else {
-        tableRows.forEach( function (row) {
+        var children = tableRows.map( function (row) {
           var addClass = entity;
           if (classOverrides[entity]) {
             addClass += " " + classOverrides[entity](row, $scope.currentNode.id);
           }
           var child = {
-                        typeName:   "attribute",
-                        addClass:   addClass,
-                        tooltip:    addClass,
-                        key:        row.name.value,
-                        title:      row.name.value,
-                        details:    row
-                    }
-          if (row.name.value === $scope.selectedRecordName) {
-            if (expand)
-              updateDetails(row); // update the table on the right
-            child.select = true;
-            updatedDetails = true;
+            typeName:   "attribute",
+            extraClasses:   addClass,
+            tooltip:    addClass,
+            key:        row.name.value,
+            title:      row.name.value,
+            details:    row
           }
-          node.addChild(child)
+          return child
         })
+        node.addNode(children)
       }
-      // if the selectedRecordName was not found, select the 1st one
-      if (expand && !updatedDetails && tableRows.length > 0) {
-        var row = tableRows[0];
-        $scope.selectedRecordName = row.name.value;
-        var node = tree.getNodeByKey($scope.selectedRecordName);
-        node.select(true);
-        updateDetails(row)  // update the table on the right
+      // top level node was expanded
+      if (wasExpanded)
+        node.setExpanded(true, {noAnimation: true, noEvents: true})
+      // if the parent node was active, but none of the children were active, active the 1st child
+      if (wasActive) {
+        if (!activeChildKey) {
+          activeChildKey = node.children[0].key
+        }
       }
-      scrollTreeDiv.scrollTop(scrollTop)
+      if (!tree.getActiveNode())
+         activeChildKey = $scope.ActivatedKey
+      // re-active the previously active child node
+      if (activeChildKey) {
+        var newNode = tree.getNodeByKey(activeChildKey)
+        // the node may not be there after the update
+        if (newNode)
+          newNode.setActive(true) // fires the onTreeNodeActivated event for this node
+      }
+      resizer()
+    }
+
+
+    var resizer = function () {
+      // this forces the tree and the grid to be the size of the browser window.
+      // the effect is that the tree and the grid will have vertical scroll bars if needed.
+      // the alternative is to let the tree and grid determine the size of the page and have
+      // the scroll bar on the window
+      var viewport = $('#list-controller .pane-viewport')
+      viewport.height( window.innerHeight - viewport.offset().top)
     }
+    $(window).resize(resizer);
 
     var schemaProps = function (entityName, key, currentNode) {
          var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean', map: 'textarea'};
 
-      var entity = QDRService.schema.entityTypes[entityName]
+      var entity = QDRService.management.schema().entityTypes[entityName]
       var value = entity.attributes[key]
       // skip identity and depricated fields
       if (!value)
@@ -334,7 +376,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
         // turn input into a select. the values will be populated later
         value.type = []
         // find all the connector names and populate the select
-        QDRService.fetchEntity(currentNode.id, '.connector', ['name'], function (nodeName, dotentity, response) {
+        QDRService.management.topology.fetchEntity(currentNode.id, 'connector', ['name'], function (nodeName, dotentity, response) {
           $scope.detailFields.some( function (field) {
             if (field.name === 'connector') {
               field.rawtype = response.results.map (function (result) {return result[0]})
@@ -344,7 +386,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
         });
       }
       return {    name:       key,
-            humanName:  QDRService.humanify(key),
+            humanName:  QDRService.utilities.humanify(key),
                         description:value.description,
                         type:       disabled ? 'disabled' : typeMap[value.type],
                         rawtype:    value.type,
@@ -376,14 +418,14 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
         })
         var schemaEntity = schemaProps($scope.selectedEntity, attr, $scope.currentNode)
         details.push( {
-          attributeName:  QDRService.humanify(attr),
-          attributeValue: attr === 'port' ? row[attr].value : QDRService.pretty(row[attr].value),
+          attributeName:  QDRService.utilities.humanify(attr),
+          attributeValue: attr === 'port' ? row[attr].value : QDRService.utilities.pretty(row[attr].value),
           name:           attr,
           changed:        changed.length,
           rawValue:       row[attr].value,
           graph:          row[attr].graph,
           title:          row[attr].title,
-          aggregateValue: QDRService.pretty(row[attr].aggregate),
+          aggregateValue: QDRService.utilities.pretty(row[attr].aggregate),
           aggregateTip:   row[attr].aggregateTip,
 
           input:          schemaEntity.input,
@@ -401,28 +443,35 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
     }
 
     var applyDetails = function (details) {
-      $scope.detailFields = details;
-      aggregateColumn();
-      $scope.$apply();
-      // ng-grid bug? the entire table doesn't always draw unless a reflow is triggered;
-      $(window).trigger('resize');
+      $timeout( function () {
+        $scope.detailFields = details;
+        aggregateColumn();
+      })
     }
 
-    var restartUpdate = function () {
-      stopUpdating();
-      updateTableData($scope.selectedEntity, true);
-      updateIntervalHandle = setInterval(updateExpandedEntities, updateInterval);
+    // called from html ng-style="getTableHeight()"
+    $scope.getTableHeight = function () {
+      return {
+        height: ($scope.detailFields.length * 30 + 40) + 'px'
+      }
     }
+
     var updateExpandedEntities = function () {
-      var tree = $("#entityTree").dynatree("getTree");
-      if (tree.visit) {
-        tree.visit( function (node) {
-          if (node.isExpanded()) {
-            updateTableData(node.data.key, node.data.key === $scope.selectedEntity)
-          }
+      clearTimeout(updateIntervalHandle)
+      var tree = $("#entityTree").fancytree("getTree");
+      if (tree) {
+        var q = d3.queue(10)
+        var expanded = getExpanded(tree)
+        expanded.forEach( function (node) {
+          q.defer(q_updateTableData, node.key, node.key === $scope.selectedEntity)
+        })
+
+        q.await(function (error) {
+          if (error)
+            QDR.log.error(error.message)
+          // once all expanded tree nodes have been update, schedule another update
+          updateIntervalHandle = setTimeout(updateExpandedEntities, updateInterval)
         })
-      } else {
-        stopUpdating();
       }
     }
 
@@ -430,12 +479,15 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
       $scope.selectedNode = node.name;
       $scope.selectedNodeId = node.id;
       setCurrentNode();
-      restartUpdate();
     };
+    $scope.$watch('ActivatedKey', function(newValue, oldValue) {
+      if (newValue !== oldValue) {
+        localStorage[ActivatedKey] = $scope.ActivatedKey;
+      }
+    })
     $scope.$watch('selectedEntity', function(newValue, oldValue) {
       if (newValue !== oldValue) {
         localStorage['QDRSelectedEntity'] = $scope.selectedEntity;
-        restartUpdate();
         $scope.operations = lookupOperations()
       }
     })
@@ -452,15 +504,10 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
     })
 
     /* Called periodically to refresh the data on the page */
-    var updateTableData = function (entity, expand) {
-      if (!QDRService.connected) {
-        // we are no longer connected. bail back to the connect page
-        $location.path("/" + QDR.pluginName + "/connect")
-        $location.search('org', "list");
-        return;
-      }
-      // don't update the data when on the operations tab
-      if ($scope.currentMode.id === 'operations') {
+    var q_updateTableData = function (entity, expand, callback) {
+      // don't update the data when on the operations tabs
+      if ($scope.currentMode.id !== 'attributes') {
+        callback(null)
         return;
       }
 
@@ -473,7 +520,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
         if (attributeNames) {
           var nameIndex = attributeNames.indexOf("name");
           var identityIndex = attributeNames.indexOf("identity");
-          var ent = QDRService.schema.entityTypes[entity];
+          var ent = QDRService.management.schema().entityTypes[entity];
           for (var i=0; i<records.length; ++i) {
             var record = records[i];
             var aggregate = aggregates ? aggregates[i] : undefined;
@@ -486,8 +533,10 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
               }
             }
             if (!rowName) {
-              QDR.log.error("response attributeNames did not contain a name field");
+              var msg = "response attributeNames did not contain a name field"
+              QDR.log.error(msg);
               console.dump(response.attributeNames);
+              callback(Error(msg))
               return;
             }
             for (var j=0; j<attributeNames.length; ++j) {
@@ -515,23 +564,23 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
             }
             tableRows.push(row);
           }
+          tableRows.sort( function (a, b) { return a.name.value.localeCompare(b.name.value) })
+          setTimeout(selectRow, 0, {entity: dotentity, rows: tableRows, expand: expand});
         }
-
-        tableRows.sort( function (a, b) { return a.name.value.localeCompare(b.name.value) })
-        setTimeout(selectRow, 0, {entity: dotentity, rows: tableRows, expand: expand});
+        callback(null)  // let queue handler know we are done
       }
       // if this entity should show an aggregate column, send the request to get the info for this entity from all the nedes
       if (aggregateEntities.indexOf(entity) > -1) {
-        var nodeInfo = QDRService.topology.nodeInfo();
-        QDRService.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
+        var nodeInfo = QDRService.management.topology.nodeInfo();
+        QDRService.management.topology.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
       } else {
-        QDRService.fetchEntity($scope.selectedNodeId, entity, [], gotNodeInfo);
+        QDRService.management.topology.fetchEntity($scope.selectedNodeId, entity, [], gotNodeInfo);
       }
     };
 
-    // tableRows are the records that were returned, this populates the left hand table on the page
+    // tableRows are the records that were returned, this populates the left hand tree on the page
     var selectRow = function (info) {
-      updateEntityChildren(info.entity, info.rows, info.expand);
+      updateTreeChildren(info.entity, info.rows, info.expand);
       fixTooltips();
     }
 
@@ -541,7 +590,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
         var table = "<table class='tiptable'><tbody>";
         data.forEach (function (row) {
           table += "<tr>";
-          table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
+          table += "<td>" + row.node + "</td><td align='right'>" + QDRService.utilities.pretty(row.val) + "</td>";
           table += "</tr>"
         })
         table += "</tbody></table>"
@@ -574,7 +623,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
     $scope.addToGraph = function(rowEntity) {
       var chart = QDRChartService.registerChart(
         {nodeId: $scope.selectedNodeId,
-         entity: "." + $scope.selectedEntity,
+         entity: $scope.selectedEntity,
          name:   $scope.selectedRecordName,
          attr:    rowEntity.name,
          forceCreate: true});
@@ -595,7 +644,6 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
       doDialog('tmplListChart.html', chart);
     }
 
-    $scope.detailCols = [];
     var aggregateColumn = function () {
       if ((aggregateEntities.indexOf($scope.selectedEntity) > -1 && $scope.detailCols.length != 3) ||
         (aggregateEntities.indexOf($scope.selectedEntity) == -1 && $scope.detailCols.length != 2)) {
@@ -604,12 +652,14 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
          {
            field: 'attributeName',
            displayName: 'Attribute',
-           cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName">{{row.entity[col.field]}}<i ng-if="row.entity.graph" ng-click="addToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>'
+           cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS | pretty}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>'
+
+                         //'<div title="{{row.entity.title}}" class="listAttrName">{{row.entity[col.field]}}<i ng-if="row.entity.graph" ng-click="addToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>'
          },
          {
            field: 'attributeValue',
            displayName: 'Value',
-           cellTemplate: '<div class="ngCellText" ng-class="{\'changed\': row.entity.changed == 1}"><span>{{row.getProperty(col.field)}}</span></div>'
+           cellTemplate: '<div class="ui-grid-cell-contents" ng-class="{\'changed\': row.entity.changed == 1}"><span>{{COL_FIELD CUSTOM_FILTERS | pretty}}</span></div>'
          }
          ]
         if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
@@ -618,7 +668,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
              width: '10%',
              field: 'aggregateValue',
              displayName: 'Aggregate',
-             cellTemplate: '<div class="hastip" alt="{{row.entity.aggregateTip}}"><span ng-class="{\'changed\': row.entity.changed == 1}">{{row.entity[col.field]}}</span><i ng-if="row.entity.graph" ng-click="addAllToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>',
+             cellTemplate: '<div class="hastip ui-grid-cell-contents" alt="{{row.entity.aggregateTip}}"><span ng-class="{\'changed\': row.entity.changed == 1}">{{COL_FIELD CUSTOM_FILTERS}}</span><i ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>',
              cellClass: 'aggregate'
            }
           )
@@ -629,33 +679,43 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
     }
 
     // the table on the right of the page contains a row for each field in the selected record in the table on the left
+    $scope.desiredTableHeight = 340;
+    $scope.detailCols = [];
     $scope.details = {
       data: 'detailFields',
-      columnDefs: "detailCols",
+      columnDefs: [
+        {
+          field: 'attributeName',
+          displayName: 'Attribute',
+          cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS | pretty}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>'
+          //'<div title="{{row.entity.title}}" class="listAttrName">{{row.entity[col.field]}}<i ng-if="row.entity.graph" ng-click="addToGraph(row.entity)" ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></div>'
+        },
+        {
+          field: 'attributeValue',
+          displayName: 'Value',
+          cellTemplate: '<div class="ui-grid-cell-contents" ng-class="{\'changed\': row.entity.changed == 1}"><span>{{COL_FIELD CUSTOM_FILTERS | pretty}}</span></div>'
+        }
+      ],
       enableColumnResize: true,
       multiSelect: false,
-      jqueryUIDraggable: true,
-      beforeSelectionChange: function() {
-          return false;
-      }
+      jqueryUIDraggable: true
     };
+
     $scope.$on("$destroy", function( event ) {
-      //QDR.log.debug("scope destroyed for qdrList");
-      stopUpdating();
-      QDRService.delDisconnectAction( onDisconnect )
+      clearTimeout(updateIntervalHandle)
+      $(window).off("resize", resizer);
     });
 
-    function gotMethodResponse (nodeName, entity, response, context) {
+    function gotMethodResponse (entity, context) {
       var statusCode = context.message.application_properties.statusCode;
       if (statusCode < 200 || statusCode >= 300) {
         Core.notification('error', context.message.statusDescription);
-        QDR.log.info('Error ' + context.message.statusDescription)
+        QDR.log.error('Error ' + context.message.statusDescription)
       } else {
         var note = entity + " " + $filter('Pascalcase')($scope.currentMode.op) + "d"
         Core.notification('success', note);
-        QDR.log.info('Success ' + note)
+        QDR.log.debug('Success ' + note)
         $scope.selectMode($scope.modes[0]);
-        restartUpdate();
       }
     }
     $scope.ok = function () {
@@ -678,11 +738,13 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
             attributes[field.name] = value
         }
       })
-      QDRService.sendMethod($scope.currentNode.id, $scope.selectedEntity, attributes, $scope.currentMode.op, undefined, gotMethodResponse)
+      QDRService.management.connection.sendMethod($scope.currentNode.id, $scope.selectedEntity, attributes, $scope.currentMode.op)
+       .then(function (response) {gotMethodResponse($scope.selectedEntity, response.context)})
     }
     $scope.remove = function () {
       var attributes = {type: $scope.selectedEntity, name: $scope.selectedRecordName}
-      QDRService.sendMethod($scope.currentNode.id, $scope.selectedEntity, attributes, $scope.currentMode.op, undefined, gotMethodResponse)
+      QDRService.management.connection.sendMethod($scope.currentNode.id, $scope.selectedEntity, attributes, $scope.currentMode.op)
+       .then(function (response) {gotMethodResponse($scope.selectedEntity, response.context)})
     }
 
     function doDialog(tmpl, chart) {
@@ -702,7 +764,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
               }
         });
 
-        d.result.then(function(result) { console.log("d.open().then"); });
+        d.result.then(function(result) { QDR.log.debug("d.open().then"); });
 
     };
 
@@ -717,13 +779,13 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
 
     var treeReady = false;
     var serviceReady = false;
-    $scope.largeNetwork = QDRService.isLargeNetwork()
+    $scope.largeNetwork = QDRService.management.topology.isLargeNetwork()
     // called after we know for sure the schema is fetched and the routers are all ready
-    QDRService.addUpdatedAction("initList", function () {
-      QDRService.stopUpdating();
-      QDRService.delUpdatedAction("initList")
+    QDRService.management.topology.addUpdatedAction("initList", function () {
+      QDRService.management.topology.stopUpdating();
+      QDRService.management.topology.delUpdatedAction("initList")
 
-      $scope.nodes = QDRService.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
+      $scope.nodes = QDRService.management.topology.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
       // unable to get node list? Bail.
       if ($scope.nodes.length == 0) {
         $location.path("/" + QDR.pluginName + "/connect")
@@ -745,7 +807,7 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
           $scope.currentNode = $scope.nodes[0];
         }
       }
-      var sortedEntities = Object.keys(QDRService.schema.entityTypes).sort();
+      var sortedEntities = Object.keys(QDRService.management.schema().entityTypes).sort();
       sortedEntities.forEach( function (entity) {
         if (excludedEntities.indexOf(entity) == -1) {
           if (!angular.isDefined($scope.selectedEntity))
@@ -754,9 +816,8 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
           var e = new Folder(entity)
           e.typeName = "entity"
           e.key = entity
-          e.isFolder = true
-          e.expand = (expandedList.indexOf(entity) > -1)
-          var placeHolder = new Folder("loading...")
+          e.expanded = (expandedList.indexOf(entity) > -1)
+          var placeHolder = new Leaf("loading...")
           placeHolder.addClass = "loading"
           e.children = [placeHolder]
           entityTreeChildren.push(e)
@@ -765,33 +826,46 @@ QDR.log.info("we were just disconnected while on the list page. Setting org to r
       serviceReady = true;
       initTree();
     })
+    // called by ng-init="treeReady()" in tmplListTree.html
     $scope.treeReady = function () {
       treeReady = true;
       initTree();
     }
 
+    // this gets called once tree is initialized
+    var onTreeInitialized = function (event, data) {
+      if ($scope.ActivatedKey) {
+        var node = data.tree.getNodeByKey($scope.ActivatedKey)
+        if (node) {
+          node.setActive(true, {noEvents: true})
+        }
+      }
+      updateExpandedEntities();
+    }
+
     var initTree = function () {
       if (!treeReady || !serviceReady)
         return;
-      $('#entityTree').dynatree({
-        onActivate: onTreeSelected,
-        onExpand: onTreeNodeExpanded,
+      $('#entityTree').fancytree({
+        activate: onTreeNodeActivated,
+        expand: onTreeNodeExpanded,
+        beforeActivate: onTreeNodeBeforeActivate,
+        init: onTreeInitialized,
         selectMode: 1,
         autoCollapse: $scope.largeNetwork,
         activeVisible: !$scope.largeNetwork,
+        clickFolderMode: 3,
         debugLevel: 0,
-        classNames: {
+        extraClasses: {
           expander: 'fa-angle',
-          connector: 'dynatree-no-connector'
+          connector: 'fancytree-no-connector'
           },
-        children: entityTreeChildren
+        source: entityTreeChildren
       })
-      restartUpdate()
-      updateExpandedEntities();
     };
-    QDRService.ensureAllEntities({entity: ".connection"}, function () {
-      QDRService.setUpdateEntities([".connection"])
-      QDRService.startUpdating();
+    QDRService.management.topology.ensureAllEntities({entity: "connection"}, function () {
+      QDRService.management.topology.setUpdateEntities(["connection"])
+      QDRService.management.topology.startUpdating(true);
     })
   }]);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrService.js b/console/stand-alone/plugin/js/qdrService.js
index 62938d2..a2dd335 100644
--- a/console/stand-alone/plugin/js/qdrService.js
+++ b/console/stand-alone/plugin/js/qdrService.js
@@ -21,1086 +21,28 @@ Licensed to the Apache Software Foundation (ASF) under one
  */
 var QDR = (function(QDR) {
 
-  // The QDR service handles the connection to
-  // the server in the background
-  QDR.module.factory("QDRService", ['$rootScope', '$http', '$timeout', '$resource', '$location', function($rootScope, $http, $timeout, $resource, $location) {
+  // The QDR service handles the connection to the router
+  QDR.module.factory("QDRService", ['$timeout', '$location', function($timeout, $location) {
+    var dm = require("dispatch-management")
     var self = {
-
-      rhea: require("rhea"),
-      timeout: 10,             // seconds to wait before assuming a request has failed
-      updateInterval: 2000,   // milliseconds between background updates
-      connectActions: [],
-      disconnectActions: [],
-      updatedActions: {},
-      updating: false,        // are we updating the node list in the background
-      maxCorrelatorDepth: 10, // max number of outstanding requests to allow
-
-      /*
-       * @property message
-       * The proton message that is used to send commands
-       * and receive responses
-       */
-      sender: undefined,
-      receiver: undefined,
-      version: undefined,
-      sendable: false,
-
-      schema: undefined,
-
-      connected: false,
-      gotTopology: false,
-      errorText: undefined,
-      connectionError: undefined,
-
-      addConnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.connectActions.push(action);
-        }
-      },
-      addDisconnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.disconnectActions.push(action);
-        }
-      },
-      delDisconnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          var index = self.disconnectActions.indexOf(action)
-          if (index >= 0)
-            self.disconnectActions.splice(index, 1)
-        }
-      },
-      addUpdatedAction: function(key, action) {
-        if (angular.isFunction(action)) {
-          self.updatedActions[key] = action;
-        }
-      },
-      delUpdatedAction: function(key) {
-        if (key in self.updatedActions)
-          delete self.updatedActions[key];
-      },
-
-      executeConnectActions: function() {
-        self.connectActions.forEach(function(action) {
-          try {
-            action.apply();
-          } catch (e) {
-            // in case the page that registered the handler has been unloaded
-            QDR.log.info(e.message)
-          }
-        });
-        self.connectActions = [];
-      },
-      executeDisconnectActions: function() {
-        self.disconnectActions.forEach(function(action) {
-          try {
-            action.apply();
-          } catch (e) {
-            // in case the page that registered the handler has been unloaded
-          }
-        });
-        self.disconnectActions = [];
-      },
-      executeUpdatedActions: function() {
-        for (action in self.updatedActions) {
-//          try {
-            self.updatedActions[action].apply();
-/*          } catch (e) {
-QDR.log.debug("caught error executing updated actions")
-console.dump(e)
-            delete self.updatedActions[action]
-          }
-          */
-        }
-      },
-      redirectWhenConnected: function(org) {
-        $location.path(QDR.pluginRoot + "/connect")
-        $location.search('org', org);
-      },
-
-      notifyTopologyDone: function() {
-        if (!self.gotTopology) {
-          QDR.log.debug("topology was just initialized");
-          //console.dump(self.topology._nodeInfo)
-          self.gotTopology = true;
-          //$rootScope.$apply();
-        } else {
-          //QDR.log.debug("topology model was just updated");
-        }
-        self.executeUpdatedActions();
-
-      },
-
-      isConnected: function() {
-        return self.connected;
-      },
-
-      versionCheck: function (minVer) {
-        var verparts = self.version.split('.')
-        var minparts = minVer.split('.')
-        try {
-          for (var i=0; i<minparts.length; ++i) {
-            if (parseInt(minVer[i] > parseInt(verparts[i])))
-              return false
-          }
-        } catch (e) {
-          QDR.log.debug("error doing version check between: " + self.version + " and " + minVer + " " + e.message)
-          return false
-        }
-        return true
-      },
-
-      correlator: {
-        _objects: {},
-        _correlationID: 0,
-
-        corr: function() {
-          var id = ++this._correlationID + "";
-          this._objects[id] = {
-            resolver: null
-          }
-          return id;
-        },
-        request: function() {
-          //QDR.log.debug("correlator:request");
-          return this;
-        },
-        then: function(id, resolver, error) {
-          //QDR.log.debug("registered then resolver for correlationID: " + id);
-          if (error) {
-            //QDR.log.debug("then received an error. deleting correlator")
-            delete this._objects[id];
-            return;
-          }
-          this._objects[id].resolver = resolver;
-        },
-        // called by receiver's on('message') handler when a response arrives
-        resolve: function(context) {
-          var correlationID = context.message.correlation_id;
-          this._objects[correlationID].resolver(context.message.body, context);
-          delete this._objects[correlationID];
-        },
-        depth: function () {
-          return Object.keys(this._objects).length
-        }
-      },
-
-      onSubscription: function() {
-        self.executeConnectActions();
-        var org = $location.search()
-        if (org)
-          org = org.org
-        if (org && org.length > 0 && org !== "connect") {
-          self.getSchema(function () {
-            self.setUpdateEntities([])
-            self.topology.get()
-            self.addUpdatedAction('onSub', function () {
-              self.delUpdatedAction('onSub')
-              $timeout( function () {
-                $location.path(QDR.pluginRoot + '/' + org)
-                $location.search('org', null)
-                $location.replace()
-              })
-            })
-          });
-        }
-      },
-
-      startUpdating: function() {
-        self.stopUpdating(true);
-        QDR.log.info("startUpdating called")
-        self.updating = true;
-        self.topology.get();
-      },
-      stopUpdating: function(silent) {
-        self.updating = false;
-        if (self.topology._getTimer) {
-          clearTimeout(self.topology._getTimer)
-          self.topology._getTimer = null;
-        }
-        if (self.topology._waitTimer) {
-          clearTimeout(self.topology._waitTimer)
-          self.topology._waitTimer = null;
-        }
-        if (self.topology._gettingTopo) {
-          if (self.topology.q)
-            self.topology.q.abort()
-        }
-        if (!silent)
-          QDR.log.info("stopUpdating called")
-      },
-
-      cleanUp: function() {},
-      error: function(line) {
-        if (line.num) {
-          QDR.log.debug("error - num: ", line.num, " message: ", line.message);
-        } else {
-          QDR.log.debug("error - message: ", line.message);
-        }
-      },
-      disconnected: function(line) {
-        QDR.log.debug("Disconnected from QDR server");
-        self.executeDisconnectActions();
-      },
-
-      nameFromId: function(id) {
-        return id.split('/')[3];
-      },
-
-      humanify: function(s) {
-        if (!s || s.length === 0)
-          return s;
-        var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
-        return t.replace(".", " ");
-      },
-      pretty: function(v) {
-        var formatComma = d3.format(",");
-        if (!isNaN(parseFloat(v)) && isFinite(v))
-          return formatComma(v);
-        return v;
-      },
-
-      nodeNameList: function() {
-        var nl = [];
-        for (var id in self.topology._nodeInfo) {
-          nl.push(self.nameFromId(id));
-        }
-        return nl.sort();
-      },
-
-      nodeIdList: function() {
-        var nl = [];
-        for (var id in self.topology._nodeInfo) {
-          nl.push(id);
-        }
-        return nl.sort();
-      },
-
-      nodeList: function() {
-        var nl = [];
-        for (var id in self.topology._nodeInfo) {
-          nl.push({
-            name: self.nameFromId(id),
-            id: id
-          });
-        }
-        return nl;
-      },
-
-      isLargeNetwork: function () {
-        return Object.keys(self.topology._nodeInfo).length >= 12
-      },
-      isMSIE: function () {
-        return (document.documentMode || /Edge/.test(navigator.userAgent))
-      },
-
-      // given an attribute name array, find the value at the same index in the values array
-      valFor: function(aAr, vAr, key) {
-        var idx = aAr.indexOf(key);
-        if ((idx > -1) && (idx < vAr.length)) {
-          return vAr[idx];
-        }
-        return null;
-      },
-
-      isArtemis: function(d) {
-        return (d.nodeType === 'route-container' || d.nodeType === 'on-demand') && (d.properties && d.properties.product === 'apache-activemq-artemis');
-      },
-
-      isQpid: function(d) {
-        return (d.nodeType === 'route-container' || d.nodeType === 'on-demand') && (d.properties && d.properties.product === 'qpid-cpp');
-      },
-
-      isAConsole: function(properties, connectionId, nodeType, key) {
-        return self.isConsole({
-          properties: properties,
-          connectionId: connectionId,
-          nodeType: nodeType,
-          key: key
-        })
-      },
-      isConsole: function(d) {
-        // use connection properties if available
-        return (d && d['properties'] && d['properties']['console_identifier'] === 'Dispatch console')
-      },
-
-      flatten: function(attributes, result) {
-        var flat = {}
-        attributes.forEach(function(attr, i) {
-          if (result && result.length > i)
-            flat[attr] = result[i]
-        })
-        return flat;
-      },
-      isConsoleLink: function(link) {
-        // find the connection for this link
-        var conns = self.topology.nodeInfo()[link.nodeId]['.connection']
-        var connIndex = conns.attributeNames.indexOf("identity")
-        var linkCons = conns.results.filter(function(conn) {
-          return conn[connIndex] === link.connectionId;
-        })
-        var conn = self.flatten(conns.attributeNames, linkCons[0]);
-
-        return self.isConsole(conn)
-      },
-
-      quiesceLink: function(nodeId, name) {
-        function gotMethodResponse(nodeName, entity, response, context) {
-          var statusCode = context.message.application_properties.statusCode;
-          if (statusCode < 200 || statusCode >= 300) {
-            Core.notification('error', context.message.statusDescription);
-            QDR.log.info('Error ' + context.message.statusDescription)
-          }
-        }
-        var attributes = {
-          adminStatus: 'disabled',
-          name: name
-        };
-        self.sendMethod(nodeId, "router.link", attributes, "UPDATE", undefined, gotMethodResponse)
-      },
-      addr_text: function(addr) {
-        if (!addr)
-          return "-"
-        if (addr[0] == 'M')
-          return addr.substring(2)
-        else
-          return addr.substring(1)
-      },
-      addr_class: function(addr) {
-        if (!addr) return "-"
-        if (addr[0] == 'M') return "mobile"
-        if (addr[0] == 'R') return "router"
-        if (addr[0] == 'A') return "area"
-        if (addr[0] == 'L') return "local"
-        if (addr[0] == 'C') return "link-incoming"
-        if (addr[0] == 'E') return "link-incoming"
-        if (addr[0] == 'D') return "link-outgoing"
-        if (addr[0] == 'F') return "link-outgoing"
-        if (addr[0] == 'T') return "topo"
-        return "unknown: " + addr[0]
-      },
-      identity_clean: function(identity) {
-        if (!identity)
-          return "-"
-        var pos = identity.indexOf('/')
-        if (pos >= 0)
-          return identity.substring(pos + 1)
-        return identity
-      },
-
-      queueDepth: function () {
-        var qdepth = self.maxCorrelatorDepth - self.correlator.depth()
-        if (qdepth <= 0)
-          qdepth = 1;
-//QDR.log.debug("queueDepth requested " + qdepth + "(" + self.correlator.depth() + ")")
-        return qdepth;
-      },
-      // check if all nodes have this entity. if not, get them
-      initEntity: function (entity, callback) {
-        var callNeeded = Object.keys(self.topology._nodeInfo).some( function (node) {
-          return !angular.isDefined(self.topology._nodeInfo[node][entity])
-        })
-        if (callNeeded) {
-          self.loadEntity(entity, callback)
-        } else
-          callback()
-      },
-
-      // get/refresh entities for all nodes
-      loadEntity: function (entities, callback) {
-        if (Object.prototype.toString.call(entities) !== '[object Array]') {
-          entities = [entities]
-        }
-        var q = QDR.queue(self.queueDepth())
-        for (node in self.topology._nodeInfo) {
-          for (var i=0; i<entities.length; ++i) {
-            var entity = entities[i]
-            q.defer(self.ensureNodeInfo, node, entity, [], q)
-          }
-        }
-        q.await(function (error) {
-          clearTimeout(self.topology._waitTimer)
-          callback();
-        })
-      },
-
-      // enusre all the topology nones have all these entities
-      ensureAllEntities: function (entityAttribs, callback, extra) {
-        self.ensureEntities(Object.keys(self.topology._nodeInfo), entityAttribs, callback, extra)
-      },
-
-      // ensure these nodes have all these entities. don't fetch unless forced to
-      ensureEntities: function (nodes, entityAttribs, callback, extra) {
-        if (Object.prototype.toString.call(entityAttribs) !== '[object Array]') {
-          entityAttribs = [entityAttribs]
-        }
-        if (Object.prototype.toString.call(nodes) !== '[object Array]') {
-          nodes = [nodes]
-        }
-        var q = QDR.queue(self.queueDepth())
-        for (var n=0; n<nodes.length; ++n) {
-          for (var i=0; i<entityAttribs.length; ++i) {
-            var ea = entityAttribs[i]
-            // if we don'e already have the entity or we want to force a refresh
-            if (!self.topology._nodeInfo[nodes[n]][ea.entity] || ea.force)
-              q.defer(self.ensureNodeInfo, nodes[n], ea.entity, ea.attrs || [], q)
-          }
-        }
-        q.await(function (error) {
-          clearTimeout(self.topology._waitTimer)
-          callback(extra);
-        })
-      },
-
-      // queue up a request to get certain attributes for one entity for a node and return the results
-      fetchEntity: function (node, entity, attrs, callback) {
-        var results = {}
-        var gotResponse = function (nodeName, dotentity, response) {
-          results = response
-        }
-        var q = QDR.queue(self.queueDepth())
-        q.defer(self.fetchNodeInfo, node, entity, attrs, q, gotResponse)
-        q.await(function (error) {
-          callback(node, entity, results)
-        })
-      },
-
-      // get/refreshes entities for all topology.nodes
-      // call doneCallback when all data is available
-      // optionally supply a resultCallBack that will be called as each result is avaialble
-      // if a resultCallBack is supplied, the calling function is responsible for accumulating the responses
-      //   otherwise the responses will be returned to the doneCallback as an object
-      fetchAllEntities: function (entityAttribs, doneCallback, resultCallback) {
-        var q = QDR.queue(self.queueDepth())
-        var results = {}
-        if (!resultCallback) {
-          resultCallback = function (nodeName, dotentity, response) {
-            if (!results[nodeName])
-              results[nodeName] = {}
-            results[nodeName][dotentity] = angular.copy(response);
-          }
-        }
-        var gotAResponse = function (nodeName, dotentity, response) {
-          resultCallback(nodeName, dotentity, response)
-        }
-        if (Object.prototype.toString.call(entityAttribs) !== '[object Array]') {
-          entityAttribs = [entityAttribs]
-        }
-        var nodes = Object.keys(self.topology._nodeInfo)
-        for (var n=0; n<nodes.length; ++n) {
-          for (var i=0; i<entityAttribs.length; ++i) {
-            var ea = entityAttribs[i]
-            q.defer(self.fetchNodeInfo, nodes[n], ea.entity, ea.attrs || [], q, gotAResponse)
-          }
-        }
-        q.await(function (error) {
-          doneCallback(results);
-        })
-      },
-
-      setUpdateEntities: function (entities) {
-        self.topology._autoUpdatedEntities = entities
-      },
-      addUpdateEntity: function (entity) {
-        if (self.topology._autoUpdatedEntities.indexOf(entity) == -1)
-          self.topology._autoUpdatedEntities.push(entity)
-      },
-      delUpdateEntity: function (entity) {
-        var index = self.topology._autoUpdatedEntities.indexOf(entity)
-        if (index != -1)
-          self.topology._autoUpdatedEntities.splice(index, 1)
-      },
-
-      /*
-       * send the management messages that build up the topology
-       *
-       *
-       */
-      topology: {
-        _gettingTopo: false,
-        _nodeInfo: {},
-        _lastNodeInfo: {},
-        _waitTimer: null,
-        _getTimer: null,
-        _autoUpdatedEntities: [],
-        q: null,
-
-        nodeInfo: function() {
-          return self.topology._nodeInfo
-        },
-
-        get: function() {
-          if (self.topology._gettingTopo) {
-            QDR.log.debug("asked to get topology but was already getting it")
-            if (self.topology.q)
-              self.topology.q.abort()
-          }
-          self.topology.q = null
-          if (!self.connected) {
-            QDR.log.debug("topology get failed because !self.connected")
-            return;
-          }
-          if (self.topology._getTimer) {
-            clearTimeout(self.topology._getTimer)
-            self.topology._getTimer = null
-          }
-
-          //QDR.log.info("starting get topology with correlator.depth of " + self.correlator.depth())
-          self.topology._gettingTopo = true;
-          self.errorText = undefined;
-
-          // get the list of nodes to query.
-          // once this completes, we will get the info for each node returned
-          self.getRemoteNodeInfo(function(response, context) {
-            if (Object.prototype.toString.call(response) === '[object Array]') {
-              // remove dropped nodes
-              var keys = Object.keys(self.topology._nodeInfo)
-              for (var i=0; i<keys.length; ++i) {
-                if (response.indexOf(keys[i]) < 0) {
-                  delete self.topology._nodeInfo[keys[i]]
-                }
-              }
-              // add any new nodes
-              // if there is only one node, it will not be returned
-              if (response.length === 0) {
-                var parts = self.receiver.remote.attach.source.address.split('/')
-                parts[4] = '$management'
-                response.push(parts.join('/'))
-                //QDR.log.info("GET-MGMT-NODES returned an empty list. Using ")
-                //console.dump(response)
-              }
-              for (var i=0; i<response.length; ++i) {
-                if (!angular.isDefined(self.topology._nodeInfo[response[i]])) {
-                  self.topology._nodeInfo[angular.copy(response[i])] = {};
-                }
-              }
-              // also refresh any entities that were requested
-              self.topology.q = QDR.queue(self.queueDepth())
-              for (var i=0; i<self.topology._autoUpdatedEntities.length; ++i) {
-                var entity = self.topology._autoUpdatedEntities[i]
-                //QDR.log.debug("queuing requests for all nodes for " + entity)
-                for (node in self.topology._nodeInfo) {
-                  self.topology.q.defer(self.ensureNodeInfo, node, entity, [], self.topology.q)
-                }
-              }
-              self.topology.q.await(function (error) {
-                self.topology._gettingTopo = false;
-                self.topology.q = null
-                self.topology.ondone(error)
-              })
-            };
-          });
-        },
-
-        cleanUp: function(obj) {
-          if (obj)
-            delete obj;
-        },
-        timedOut: function(q) {
-          // a node dropped out. this happens when the get-mgmt-nodex
-          // results contains more nodes than actually respond within
-          // the timeout
-          QDR.log.debug("timed out waiting for management responses");
-          // note: can't use 'this' in a timeout handler
-          self.topology.miniDump("state at timeout");
-          q.abort()
-          //self.topology.onerror(Error("management responses are not consistent"));
-        },
-
-        addNodeInfo: function(id, entity, values, q) {
-          clearTimeout(self.topology._waitTimer)
-          // save the results in the nodeInfo object
-          if (id) {
-            if (!(id in self.topology._nodeInfo)) {
-              self.topology._nodeInfo[id] = {};
-            }
-            // copy the values to allow garbage collector to reclaim their memory
-            self.topology._nodeInfo[id][entity] = angular.copy(values)
-          }
-          self.topology.cleanUp(values);
-        },
-        ondone: function(waserror) {
-          clearTimeout(self.topology._getTimer);
-          clearTimeout(self.topology._waitTimer);
-          self.topology._waitTimer = null;
-          if (self.updating)
-            self.topology._getTimer = setTimeout(self.topology.get, self.updateInterval);
-          //if (!waserror)
-            self.notifyTopologyDone();
-        },
-        dump: function(prefix) {
-          if (prefix)
-            QDR.log.info(prefix);
-          QDR.log.info("---");
-          for (var key in self.topology._nodeInfo) {
-            QDR.log.info(key);
-            console.dump(self.topology._nodeInfo[key]);
-            QDR.log.info("---");
-          }
-        },
-        miniDump: function(prefix) {
-          if (prefix)
-            QDR.log.info(prefix);
-          QDR.log.info("---");
-          console.dump(Object.keys(self.topology._nodeInfo));
-          QDR.log.info("---");
-        },
-        onerror: function(err) {
-          self.topology._gettingTopo = false;
-          QDR.log.debug("Err:" + err);
-          //self.executeDisconnectActions();
-        }
-
-      },
-      getRemoteNodeInfo: function(callback) {
-        //QDR.log.debug("getRemoteNodeInfo called");
-
-        setTimeout(function () {
-          var ret;
-          // first get the list of remote node names
-          self.correlator.request(
-            ret = self.sendMgmtQuery('GET-MGMT-NODES')
-          ).then(ret.id, function(response, context) {
-            callback(response, context);
-            self.topology.cleanUp(response);
-          }, ret.error);
-        }, 1)
-      },
-
-      // sends a request and updates the topology.nodeInfo object with the response
-      // should only be called from a q.defer() statement
-      ensureNodeInfo: function (nodeId, entity, attrs, q, callback) {
-        //QDR.log.debug("queuing request for " + nodeId + " " + entity)
-        self.getNodeInfo(nodeId, entity, attrs, q, function (nodeName, dotentity, response) {
-          //QDR.log.debug("got response for " + nodeId + " " + entity)
-          self.topology.addNodeInfo(nodeName, dotentity, response, q)
-          callback(null)
-        })
-        return {
-          abort: function() {
-            delete self.topology._nodeInfo[nodeId]
-            //self.topology._nodeInfo[nodeId][entity] = {attributeNames: [], results: [[]]};
-          }
-        }
-      },
-
-      // sends request and returns the response
-      // should only be called from a q.defer() statement
-      fetchNodeInfo: function (nodeId, entity, attrs, q, heartbeat, callback) {
-        self.getNodeInfo(nodeId, entity, attrs, q, function (nodeName, dotentity, response) {
-          heartbeat(nodeName, dotentity, response)
-          callback(null)
-        })
-      },
-
-      getMultipleNodeInfo: function(nodeNames, entity, attrs, callback, selectedNodeId, aggregate) {
-        if (!angular.isDefined(aggregate))
-          aggregate = true;
-        var responses = {};
-        var gotNodesResult = function(nodeName, dotentity, response) {
-          responses[nodeName] = response;
-        }
-
-        var q = QDR.queue(self.queueDepth())
-        nodeNames.forEach(function(id) {
-            q.defer(self.fetchNodeInfo, id, '.' + entity, attrs, q, gotNodesResult)
-        })
-        q.await(function (error) {
-          if (aggregate)
-            self.aggregateNodeInfo(nodeNames, entity, selectedNodeId, responses, callback);
-          else {
-            callback(nodeNames, entity, responses)
-          }
-        })
-      },
-
-      aggregateNodeInfo: function(nodeNames, entity, selectedNodeId, responses, callback) {
-        //QDR.log.debug("got all results for  " + entity);
-        // aggregate the responses
-        var newResponse = {};
-        var thisNode = responses[selectedNodeId];
-        newResponse['attributeNames'] = thisNode.attributeNames;
-        newResponse['results'] = thisNode.results;
-        newResponse['aggregates'] = [];
-        for (var i = 0; i < thisNode.results.length; ++i) {
-          var result = thisNode.results[i];
-          var vals = [];
-          result.forEach(function(val) {
-            vals.push({
-              sum: val,
-              detail: []
-            })
-          })
-          newResponse.aggregates.push(vals);
-        }
-        var nameIndex = thisNode.attributeNames.indexOf("name");
-        var ent = self.schema.entityTypes[entity];
-        var ids = Object.keys(responses);
-        ids.sort();
-        ids.forEach(function(id) {
-          var response = responses[id];
-          var results = response.results;
-          results.forEach(function(result) {
-            // find the matching result in the aggregates
-            var found = newResponse.aggregates.some(function(aggregate, j) {
-              if (aggregate[nameIndex].sum === result[nameIndex]) {
-                // result and aggregate are now the same record, add the graphable values
-                newResponse.attributeNames.forEach(function(key, i) {
-                  if (ent.attributes[key] && ent.attributes[key].graph) {
-                    if (id != selectedNodeId)
-                      aggregate[i].sum += result[i];
-                  }
-                  aggregate[i].detail.push({
-                    node: self.nameFromId(id) + ':',
-                    val: result[i]
-                  })
-                })
-                return true; // stop looping
-              }
-              return false; // continute looking for the aggregate record
-            })
-            if (!found) {
-              // this attribute was not found in the aggregates yet
-              // because it was not in the selectedNodeId's results
-              var vals = [];
-              result.forEach(function(val) {
-                vals.push({
-                  sum: val,
-                  detail: [{
-                    node: self.nameFromId(id),
-                    val: val
-                  }]
-                })
-              })
-              newResponse.aggregates.push(vals)
-            }
-          })
-        })
-        callback(nodeNames, entity, newResponse);
-      },
-
-
-      getSchema: function(callback) {
-        //QDR.log.info("getting schema");
-        var ret;
-        self.correlator.request(
-          ret = self.sendMgmtQuery('GET-SCHEMA')
-        ).then(ret.id, function(response) {
-          //QDR.log.info("Got schema response");
-          // remove deprecated
-          for (var entityName in response.entityTypes) {
-            var entity = response.entityTypes[entityName]
-            if (entity.deprecated) {
-              // deprecated entity
-              delete response.entityTypes[entityName]
-            } else {
-              for (var attributeName in entity.attributes) {
-                var attribute = entity.attributes[attributeName]
-                if (attribute.deprecated) {
-                  // deprecated attribute
-                  delete response.entityTypes[entityName].attributes[attributeName]
-                }
-              }
-            }
-          }
-          self.schema = response;
-          callback()
-        }, ret.error);
-      },
-
-      getNodeInfo: function(nodeName, entity, attrs, q, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var timedOut = function (q) {
-          q.abort()
-        }
-        var atimer = setTimeout(timedOut, self.timeout * 1000, q);
-        var ret;
-        self.correlator.request(
-          ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-          clearTimeout(atimer)
-          callback(nodeName, entity, response);
-        }, ret.error);
-      },
-
-      sendMethod: function(nodeId, entity, attrs, operation, props, callback) {
-        setTimeout(function () {
-          var ret;
-          self.correlator.request(
-            ret = self._sendMethod(nodeId, entity, attrs, operation, props)
-          ).then(ret.id, function(response, context) {
-            callback(nodeId, entity, response, context);
-          }, ret.error);
-        }, 1)
-      },
-
-      _fullAddr: function(toAddr) {
-        var toAddrParts = toAddr.split('/');
-        if (toAddrParts.shift() != "amqp:") {
-          self.topology.error(Error("unexpected format for router address: " + toAddr));
-          return;
-        }
-        var fullAddr = toAddrParts.join('/');
-        return fullAddr;
-      },
-
-      _sendMethod: function(toAddr, entity, attrs, operation, props) {
-        var ret = {
-          id: self.correlator.corr()
-        };
-        var fullAddr = self._fullAddr(toAddr);
-        if (!self.sender || !self.sendable) {
-          ret.error = "no sender"
-          return ret;
-        }
-        try {
-          var application_properties = {
-            operation: operation
-          }
-          if (entity) {
-            var ent = self.schema.entityTypes[entity];
-            var fullyQualifiedType = ent ? ent.fullyQualifiedType : entity;
-            application_properties.type = fullyQualifiedType || entity;
-          }
-          if (attrs.name)
-            application_properties.name = attrs.name;
-          if (props) {
-            jQuery.extend(application_properties, props);
-          }
-          var msg = {
-            body: attrs,
-            to: fullAddr,
-            reply_to: self.receiver.remote.attach.source.address,
-            correlation_id: ret.id,
-            application_properties: application_properties
-          }
-          self.sender.send(msg);
-          //console.dump("------- method called -------")
-          //console.dump(msg)
-        } catch (e) {
-          error = "error sending: " + e;
-          QDR.log.error(error)
-          ret.error = error;
-        }
-        return ret;
-      },
-
-      sendQuery: function(toAddr, entity, attrs, operation) {
-        operation = operation || "QUERY"
-        var fullAddr = self._fullAddr(toAddr);
-
-        var body;
-        if (attrs) {
-          body = {
-            "attributeNames": attrs,
-          }
-        } else {
-          body = {
-            "attributeNames": [],
-          }
-        }
-        if (entity[0] === '.')
-          entity = entity.substr(1, entity.length - 1)
-        var prefix = "org.apache.qpid.dispatch."
-        var configs = ["address", "autoLink", "linkRoute"]
-        if (configs.indexOf(entity) > -1)
-          prefix += "router.config."
-        return self._send(body, fullAddr, operation, prefix + entity);
-      },
-
-      sendMgmtQuery: function(operation) {
-        return self._send([], "/$management", operation);
-      },
-
-      _send: function(body, to, operation, entityType) {
-        var ret = {
-          id: self.correlator.corr()
-        };
-        if (!self.sender || !self.sendable) {
-          ret.error = "no sender"
-          return ret;
-        }
-        try {
-          var application_properties = {
-            operation: operation,
-            type: "org.amqp.management",
-            name: "self"
-          };
-          if (entityType)
-            application_properties.entityType = entityType;
-
-          self.sender.send({
-            body: body,
-            to: to,
-            reply_to: self.receiver.remote.attach.source.address,
-            correlation_id: ret.id,
-            application_properties: application_properties
-          })
-        } catch (e) {
-          error = "error sending: " + e;
-          QDR.log.error(error)
-          ret.error = error;
-        }
-        return ret;
-      },
-
-      disconnect: function() {
-        self.connection.close();
-        self.connected = false
-        self.errorText = "Disconnected."
-      },
-
-      connectionTimer: null,
-
-      testConnect: function (options, timeout, callback) {
-        var connection;
-        var allowDelete = true;
-        var reconnect = angular.isDefined(options.reconnect) ? options.reconnect : false
-        var baseAddress = options.address + ':' + options.port;
-        var protocol = "ws"
-        if ($location.protocol() === "https")
-          protocol = "wss"
-        QDR.log.info("testConnect called with reconnect " + reconnect + " using " + protocol + " protocol")
-        try {
-          var ws = self.rhea.websocket_connect(WebSocket);
-          connection = self.rhea.connect({
-            connection_details: ws(protocol + "://" + baseAddress, ["binary"]),
-            reconnect: reconnect,
-              properties: {
-                console_identifier: 'Dispatch console'
-              }
-            }
-          );
-        } catch (e) {
-          QDR.log.debug("exception caught on test connect " + e)
-          self.errorText = "Connection failed "
-          callback({error: e})
-          return
-        }
-        // called when initial connecting fails, and when connection is dropped after connecting
-        connection.on('disconnected', function(context) {
-          if (allowDelete) {
-            delete connection
-            connection.options.reconnect = false
-            //QDR.log.info("connection.on(disconnected) called")
-            callback({error: "failed to connect"})
-          }
-        })
-        connection.on("connection_open", function (context) {
-          allowDelete = false;
-          callback({connection: connection, context: context})
-        })
-      },
-
-      connect: function(options) {
-        var connection;
-        self.topologyInitialized = false;
-        if (!self.connected) {
-          var okay = {
-            connection: false,
-            sender: false,
-            receiver: false
-          }
-          var sender, receiver
-          self.connectionError = undefined;
-
-          var stop = function(context) {
-            //self.stopUpdating();
-            okay.sender = false;
-            okay.receiver = false;
-            okay.connected = false;
-            self.connected = false;
-            self.sender = null;
-            self.receiver = null;
-            self.sendable = false;
-            self.gotTopology = false;
-          }
-          var maybeStart = function() {
-            if (okay.connection && okay.sender && okay.receiver && self.sendable && !self.connected) {
-              //QDR.log.info("okay to start")
-              self.connected = true;
-              self.connection = connection;
-              self.sender = sender;
-              self.receiver = receiver;
-              self.gotTopology = false;
-              self.onSubscription();
-            }
-          }
-          var onDisconnect = function() {
-            //QDR.log.warn("Disconnected");
-            self.connectionError = true;
-            stop();
-            self.executeDisconnectActions();
-          }
-
-          // called after connection.open event is fired or connection error has happened
-          var connectionCallback = function (options) {
-            //QDR.log.info('connectionCallback called')
-            if (!options.error) {
-              //QDR.log.info('there was no error')
-              connection = options.connection
-              self.version = options.context.connection.properties.version
-              QDR.log.debug("connection_opened")
-              okay.connection = true;
-              okay.receiver = false;
-              okay.sender = false;
-
-              connection.on('disconnected', function(context) {
-                //QDR.log.info("connection.on(disconnected) called")
-                self.errorText = "Unable to connect"
-                onDisconnect();
-              })
-              connection.on('connection_close', function(context) {
-                //QDR.log.info("connection closed")
-                self.errorText = "Disconnected"
-                onDisconnect();
-              })
-
-              sender = connection.open_sender();
-              sender.on('sender_open', function(context) {
-                //QDR.log.info("sender_opened")
-                okay.sender = true
-                maybeStart()
-              })
-              sender.on('sendable', function(context) {
-                //QDR.log.debug("sendable")
-                self.sendable = true;
-                maybeStart();
-              })
-
-              receiver = connection.open_receiver({
-                source: {
-                  dynamic: true
-                }
-              });
-              receiver.on('receiver_open', function(context) {
-                //QDR.log.info("receiver_opened")
-                if (receiver.remote && receiver.remote.attach && receiver.remote.attach.source) {
-                  okay.receiver = true;
-                  maybeStart()
-                }
-              })
-              receiver.on("message", function(context) {
-                self.correlator.resolve(context);
-              });
-            } else {
-              //QDR.log.info("there was an error " + options.error)
-              self.errorText = "Unable to connect"
-              onDisconnect();
-            }
-          }
-
-          QDR.log.debug("****** calling rhea.connect ********")
-          if (!options.connection) {
-            QDR.log.debug("rhea.connect was not passed an existing connection")
-            options.reconnect = true
-            self.testConnect(options, 5000, connectionCallback)
+      management: new dm.Management($location.protocol()),
+      utilities: dm.Utilities,
+
+      onDisconnect: function () {
+        $timeout( function () {
+          $location.path('/connect')
+          var curPath = $location.path()
+          var org = curPath.substr(1)
+          if (org && org.length > 0 && org !== "connect") {
+            $location.search('org', org)
           } else {
-            QDR.log.debug("rhea.connect WAS passed an existing connection")
-            connectionCallback(options)
+            $location.search('org', null)
           }
-        }
+        })
       }
+
     }
+
     return self;
   }]);
 
@@ -1117,52 +59,6 @@ console.dump(e)
   };
 })();
 
-function ngGridFlexibleHeightPlugin (opts) {
-    var self = this;
-    self.grid = null;
-    self.scope = null;
-    self.init = function (scope, grid, services) {
-        self.domUtilityService = services.DomUtilityService;
-        self.grid = grid;
-        self.scope = scope;
-        var recalcHeightForData = function () { setTimeout(innerRecalcForData, 1); };
-        var innerRecalcForData = function () {
-            var gridId = self.grid.gridId;
-            var footerPanelSel = '.' + gridId + ' .ngFooterPanel';
-            if (!self.grid.$topPanel || !self.grid.$canvas)
-              return;
-            var extraHeight = self.grid.$topPanel.height() + $(footerPanelSel).height();
-            var naturalHeight = self.grid.$canvas.height() + 1;
-            if (opts != null) {
-                if (opts.minHeight != null && (naturalHeight + extraHeight) < opts.minHeight) {
-                    naturalHeight = opts.minHeight - extraHeight - 2;
-                }
-                if (opts.maxHeight != null && (naturalHeight + extraHeight) > opts.maxHeight) {
-                    naturalHeight = opts.maxHeight;
-                }
-            }
-
-            var newViewportHeight = naturalHeight + 3;
-            if (!self.scope.baseViewportHeight || self.scope.baseViewportHeight !== newViewportHeight) {
-                self.grid.$viewport.css('height', newViewportHeight + 'px');
-                self.grid.$root.css('height', (newViewportHeight + extraHeight) + 'px');
-                self.scope.baseViewportHeight = newViewportHeight;
-                self.domUtilityService.RebuildGrid(self.scope, self.grid);
-            }
-        };
-        self.scope.catHashKeys = function () {
-            var hash = '',
-                idx;
-            for (idx in self.scope.renderedRows) {
-                hash += self.scope.renderedRows[idx].$$hashKey;
-            }
-            return hash;
-        };
-        self.scope.$watch('catHashKeys()', innerRecalcForData);
-        self.scope.$watch(self.grid.config.data, recalcHeightForData);
-    };
-}
-
 if (!String.prototype.startsWith) {
   String.prototype.startsWith = function (searchString, position) {
     return this.substr(position || 0, searchString.length) === searchString

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/js/qdrSettings.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSettings.js b/console/stand-alone/plugin/js/qdrSettings.js
index 3f0c109..746e296 100644
--- a/console/stand-alone/plugin/js/qdrSettings.js
+++ b/console/stand-alone/plugin/js/qdrSettings.js
@@ -51,7 +51,7 @@ var QDR = (function(QDR) {
     }, true);
 
     $scope.buttonText = function() {
-      if (QDRService.isConnected()) {
+      if (QDRService.management.connection.is_connected()) {
         return "Disconnect";
       } else {
         return "Connect";
@@ -59,9 +59,9 @@ var QDR = (function(QDR) {
     };
 
     $scope.connect = function() {
-      if (QDRService.connected) {
+      if (QDRService.management.connection.is_connected()) {
         $timeout( function () {
-          QDRService.disconnect();
+          QDRService.management.connection.disconnect();
         })
         return;
       }
@@ -76,53 +76,58 @@ var QDR = (function(QDR) {
       }
     }
 
-    var doConnect = function(opts) {
+    var doConnect = function() {
+    QDR.log.info("doConnect called on connect page")
       if (!$scope.formEntity.address)
         $scope.formEntity.address = "localhost"
       if (!$scope.formEntity.port)
         $scope.formEntity.port = 5673
 
       var failed = function() {
+        QDR.log.info("disconnect action called");
         $timeout(function() {
-          QDR.log.debug("disconnect action called");
           $scope.connecting = false;
-          $scope.connectionErrorText = QDRService.errorText;
-          $scope.connectionError = true;
+          $scope.connectionErrorText = "Unable to connect to " + $scope.formEntity.address + ":" + $scope.formEntity.port
+          $scope.connectionError = true
         })
       }
-      QDRService.addDisconnectAction(failed);
-      QDRService.addConnectAction(function() {
-        QDRService.delDisconnectAction(failed)
-        QDRService.getSchema(function () {
-          QDR.log.info("got schema after connection")
-          QDRService.addUpdatedAction("initialized", function () {
-            QDRService.delUpdatedAction("initialized")
-            QDR.log.info("got initial topology")
-            $timeout(function() {
-              $scope.connecting = false;
-              if ($location.path().startsWith(QDR.pluginRoot)) {
-                  var searchObject = $location.search();
-                  var goto = "overview";
-                  if (searchObject.org && searchObject.org !== "connect") {
-                    goto = searchObject.org;
+      var options = {address: $scope.formEntity.address, port: $scope.formEntity.port}
+      QDRService.management.connection.testConnect(options, function (e) {
+        if (e.error) {
+          failed()
+        } else {
+          QDR.log.info("test connect from connect page succeeded")
+          QDRService.management.connection.addConnectAction(function() {
+            QDR.log.info("real connect from connect page succeeded")
+            // get notified if at any time the connection fails
+            QDRService.management.connection.addDisconnectAction(QDRService.onDisconnect);
+            QDRService.management.getSchema(function () {
+              QDR.log.info("got schema after connection")
+              QDRService.management.topology.addUpdatedAction("initialized", function () {
+                QDRService.management.topology.delUpdatedAction("initialized")
+                QDR.log.info("got initial topology")
+                $timeout(function() {
+                  $scope.connecting = false;
+                  if ($location.path().startsWith(QDR.pluginRoot)) {
+                      var searchObject = $location.search();
+                      var goto = "overview";
+                      if (searchObject.org && searchObject.org !== "connect") {
+                        goto = searchObject.org;
+                      }
+                      $location.search('org', null)
+                      $location.path(QDR.pluginRoot + "/" + goto);
                   }
-                  $location.search('org', null)
-                  $location.path(QDR.pluginRoot + "/" + goto);
-              }
+                })
+              })
+              QDR.log.info("requesting a topology")
+              QDRService.management.topology.setUpdateEntities([])
+              QDRService.management.topology.get()
             })
-          })
-          QDR.log.info("requesting a topology")
-          QDRService.setUpdateEntities([])
-          QDRService.topology.get()
-        })
-      });
-      var options = {address: $scope.formEntity.address, port: $scope.formEntity.port}
-      // if we have already successfully connected (the test connections succeeded)
-      if (opts && opts.connection) {
-        options.connection = opts.connection
-        options.context = opts.context
-      }
-      QDRService.connect(options);
+          });
+          options.reconnect = true
+          QDRService.management.connection.connect(options)
+        }
+      })
     }
   }]);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[8/8] qpid-dispatch git commit: DISPATCH-801 3rd party libraries are now installed via npm

Posted by ea...@apache.org.
DISPATCH-801 3rd party libraries are now installed via npm


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/58461d73
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/58461d73
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/58461d73

Branch: refs/heads/master
Commit: 58461d73042b274e786f23ff28a06abd25b677b8
Parents: a93825a
Author: Ernest Allen <ea...@redhat.com>
Authored: Sat Nov 11 08:59:54 2017 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Sat Nov 11 08:59:54 2017 -0500

----------------------------------------------------------------------
 console/stand-alone/package.json | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/58461d73/console/stand-alone/package.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/package.json b/console/stand-alone/package.json
new file mode 100644
index 0000000..2e8d78e
--- /dev/null
+++ b/console/stand-alone/package.json
@@ -0,0 +1,44 @@
+{
+  "name": "dispatch-console-stand-alone",
+  "version": "1.1.0",
+  "description": "Qpid Dispatch Router stand-alone console",
+  "main": "index.html",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/apache/qpid-dispatch.git"
+  },
+  "keywords": [
+    "qpid",
+    "dispatch",
+    "console"
+  ],
+  "author": "RedHat",
+  "license": "Apache-2.0",
+  "bugs": {
+    "url": "https://github.com/apache/qpid-dispatch/issues"
+  },
+  "homepage": "https://github.com/apache/qpid-dispatch#readme",
+  "dependencies": {
+    "angular": "1.5.11",
+    "angular-animate": "1.5.11",
+    "angular-resource": "1.5.11",
+    "angular-route": "1.5.11",
+    "angular-sanitize": "1.5.11",
+    "angular-ui-bootstrap": "^2.5.6",
+    "angular-ui-grid": "^4.0.8",
+    "angular-ui-slider": "^0.4.0",
+    "d3": "^3.5.14",
+    "d3-queue": "^3.0.7",
+    "dispatch-management": "^0.1.0",
+    "html5shiv": "^3.7.3",
+    "jquery": "^3.2.1",
+    "jquery-ui-dist": "^1.12.1",
+    "jquery.fancytree": "^2.26.0",
+    "jquery.tipsy": "^1.0.3",
+    "notifyjs-browser": "^0.4.2",
+    "patternfly": "^3.30.0"
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[7/8] qpid-dispatch git commit: DISPATCH-801 Updated 3rd party UI components to latest available via npm

Posted by ea...@apache.org.
DISPATCH-801 Updated 3rd party UI components to latest available via npm


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/a93825ab
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/a93825ab
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/a93825ab

Branch: refs/heads/master
Commit: a93825abc87ac4648902145198424a06561bb260
Parents: fdb093e
Author: Ernest Allen <ea...@redhat.com>
Authored: Sat Nov 11 08:58:44 2017 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Sat Nov 11 08:58:44 2017 -0500

----------------------------------------------------------------------
 console/stand-alone/README.txt                  |    9 +-
 console/stand-alone/index.html                  |   83 +-
 console/stand-alone/plugin/css/dispatch.css     |   15 +-
 console/stand-alone/plugin/css/dispatchpf.css   |   98 +-
 console/stand-alone/plugin/css/plugin.css       |   96 +-
 console/stand-alone/plugin/css/site-base.css    | 4721 ------------------
 console/stand-alone/plugin/html/qdrConnect.html |    2 +-
 console/stand-alone/plugin/html/qdrLayout.html  |   35 -
 console/stand-alone/plugin/html/qdrList.html    |    4 +-
 .../stand-alone/plugin/html/qdrOverview.html    |   48 +-
 .../stand-alone/plugin/html/qdrTopology.html    |   19 +-
 .../stand-alone/plugin/html/tmplListTree.html   |    4 +-
 .../plugin/html/tmplOverviewTree.html           |    4 +-
 console/stand-alone/plugin/js/dispatchPlugin.js |  104 +-
 console/stand-alone/plugin/js/navbar.js         |   40 +-
 .../stand-alone/plugin/js/qdrChartService.js    |   26 +-
 console/stand-alone/plugin/js/qdrCharts.js      |   77 +-
 console/stand-alone/plugin/js/qdrList.js        |  462 +-
 console/stand-alone/plugin/js/qdrOverview.js    |  922 ++--
 .../plugin/js/qdrOverviewLogsController.js      |    7 +-
 console/stand-alone/plugin/js/qdrSchema.js      |   25 +-
 console/stand-alone/plugin/js/qdrService.js     | 1138 +----
 console/stand-alone/plugin/js/qdrSettings.js    |   81 +-
 console/stand-alone/plugin/js/qdrTopology.js    |  376 +-
 24 files changed, 1304 insertions(+), 7092 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/README.txt
----------------------------------------------------------------------
diff --git a/console/stand-alone/README.txt b/console/stand-alone/README.txt
index 45b36a0..e72f840 100644
--- a/console/stand-alone/README.txt
+++ b/console/stand-alone/README.txt
@@ -2,7 +2,12 @@
 The stand-alone qpid dispatch console is an html web site that monitors and controls a qpid dispatch router
 
 To install the console:
-- The console files are normally installed under /usr/share/qpid-dispatch/console/stand-alone
+- After a build, the console files are normally installed under /usr/share/qpid-dispatch/console/stand-alone
+- Install 3rd party libraries:
+    - cd /usr/share/qpid-dispatch/console/stand-alone
+    - npm install
+
+Note: An internet connection is required during the npm install to retrieve the 3rd party javascript / css files.
 
 To run the web console:
 - Ensure one of the routers in your network is configured with a normal listener with http: true
@@ -19,7 +24,5 @@ listener {
 The router will serve the console's html/js/css from the install directory.
 The cosole will automatically connect to the router at localhost:5673
 
-Note: An internet connection is required on the machine that is running the console in order to retrieve the 3rd party javascript / css files.
-
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/index.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/index.html b/console/stand-alone/index.html
index e99c54b..3cf2526 100644
--- a/console/stand-alone/index.html
+++ b/console/stand-alone/index.html
@@ -26,28 +26,25 @@ under the License.
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
     <title>Qpid Dispatch Console</title>
 
-    <link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
-    <link href='https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css' type="text/css">
-    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
-
-    <!-- PatternFly Styles -->
     <link rel="shortcut icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
 
-    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
-    <!-- Optional theme -->
-    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
+    <link rel="stylesheet" href="node_modules/jquery-ui-dist/jquery-ui.css">
+
+    <!-- PatternFly Styles -->
+    <link rel="stylesheet" href="node_modules/patternfly/dist/css/patternfly.min.css" >
+    <link rel="stylesheet" href="node_modules/patternfly/dist/css/patternfly-additions.min.css" >
 
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/patternfly/3.22.1/css/patternfly.min.css" >
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/patternfly/3.22.1/css/patternfly-additions.min.css" >
+    <!-- jquery Styles -->
+    <link rel="stylesheet" href="node_modules/jquery.tipsy/src/jquery.tipsy.css" type="text/css"/>
+    <link rel="stylesheet" href="node_modules/jquery.fancytree/dist/skin-bootstrap-n/ui.fancytree.css" type="text/css"/>
 
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.css" type="text/css"/>
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ng-grid/2.0.11/ng-grid.min.css" type="text/css"/>
-    <link rel="stylesheet" href="https://cdn.rawgit.com/mar10/dynatree/master/dist/skin/ui.dynatree.css" type="text/css">
+    <!-- angular Styles -->
+    <link rel="stylesheet" href="node_modules/angular-ui-grid/ui-grid.css" type="text/css"/>
 
+    <!-- local Styles -->
     <link rel="stylesheet" href="plugin/css/plugin.css" type="text/css"/>
     <link rel="stylesheet" href="plugin/css/dispatch.css" type="text/css"/>
     <link rel="stylesheet" href="plugin/css/dispatchpf.css" type="text/css"/>
-    <link rel="stylesheet" href="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.min.css" type="text/css"/>
 
 </head>
 <body ng-app="QDR" ng-controller="QDR.Core">
@@ -89,47 +86,42 @@ under the License.
 
 <div class="container-fluid">
     <div class="row">
-        <div class="col-md-12">
+        <div id="main_container" class="col-md-12">
             <div ng-view></div>
         </div>
     </div>
 </div>
 
 <!--[if lt IE 9]>
-<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+<script src="node_modules/html5shiv/dist/html5shiv.min.js"></script>
 <![endif]-->
 
 <!-- jQuery -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
-<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
-<script src="https://cdn.rawgit.com/mar10/dynatree/master/dist/jquery.dynatree.js"></script>
-
-<!-- PatternFly Custom Componets -  Sidebar, Popovers and Datatables Customizations -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/patternfly/3.22.1/js/patternfly.min.js"></script>
+<script src="node_modules/jquery/dist/jquery.js"></script>
+<script src="node_modules/jquery-ui-dist/jquery-ui.js"></script>
+<script src="node_modules/jquery.fancytree/dist/jquery.fancytree-all.js"></script>
 
 <!-- Angular -->
-<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.js"></script>
-<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular-route.min.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.2/angular-resource.min.js"></script>
-
-<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.14.3/ui-bootstrap.min.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.14.3/ui-bootstrap-tpls.min.js"></script>
-
-<!-- Angular-Sanitize -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-sanitize/1.5.11/angular-sanitize.min.js"></script>
-
-<script src='https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.14/d3.min.js'></script>
-<script src='https://cdnjs.cloudflare.com/ajax/libs/d3-queue/3.0.3/d3-queue.min.js'></script>
-
-<script src="https://d3js.org/topojson.v0.min.js"></script>
-
-<script src="https://cdn.rawgit.com/jaz303/tipsy/master/src/javascripts/jquery.tipsy.js"></script>
-<script src="https://cdn.rawgit.com/briancray/tooltipsy/master/tooltipsy.min.js"></script>
-<script src="https://cdn.rawgit.com/angular-ui/ui-slider/master/src/slider.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/ng-grid/2.0.11/ng-grid.min.js"></script>
-<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/notify/0.4.2/notify.min.js"></script>
-
+<script src="node_modules/angular/angular.js"></script>
+<script src="node_modules/angular-animate/angular-animate.min.js"></script>
+<script src="node_modules/angular-sanitize/angular-sanitize.min.js"></script>
+<script src="node_modules/angular-route/angular-route.min.js"></script>
+<script src="node_modules/angular-resource/angular-resource.min.js"></script>
+
+<!-- ui-bootstrap -->
+<script src="node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js"></script>
+<script src="node_modules/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js"></script>
+
+<!-- d3 -->
+<script src='node_modules/d3/d3.min.js'></script>
+<script src='node_modules/d3-queue/build/d3-queue.min.js'></script>
+
+<script src="node_modules/jquery.tipsy/src/jquery.tipsy.js"></script>
+<script src="node_modules/angular-ui-slider/src/slider.js"></script>
+<script src="node_modules/angular-ui-grid/ui-grid.js"></script>
+<script src="node_modules/notifyjs-browser/dist/notify.js"></script>
+
+<script type="text/javascript" src="node_modules/dispatch-management/dist/dispatch-management.js"></script>
 <script type="text/javascript" src="plugin/js/dispatchPlugin.js"></script>
 <script type="text/javascript" src="plugin/js/qdrOverview.js"></script>
 <script type="text/javascript" src="plugin/js/qdrOverviewLogsController.js"></script>
@@ -143,9 +135,6 @@ under the License.
 <script type="text/javascript" src="plugin/js/qdrTopology.js"></script>
 <script type="text/javascript" src="plugin/js/qdrSettings.js"></script>
 
-<script type="text/javascript" src="plugin/lib/rhea-min.js"></script>
-
-
 <script type="text/javascript">
         //angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
   </script>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/css/dispatch.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/dispatch.css b/console/stand-alone/plugin/css/dispatch.css
index 5c946bd..6af6b9d 100644
--- a/console/stand-alone/plugin/css/dispatch.css
+++ b/console/stand-alone/plugin/css/dispatch.css
@@ -616,8 +616,8 @@ div.filter-title h6 {
 button.btn-filter {
 	float: right;
 }
-span.dynatree-expanded button.btn-filter,
-a.dynatree-title:hover button.btn-filter {
+span.fancytree-expanded button.btn-filter,
+a.fancytree-title:hover button.btn-filter {
  	visibility: visible;
 }
 
@@ -672,9 +672,9 @@ div.topoGrid .ui-grid-viewport {
 }
 
 .pane-viewport {
-	top: 24px !important;
+  top: 26px !important;
 }
-.dynatree-node.loading {
+.fancytree-node.loading {
   position: initial;
 }
 
@@ -723,4 +723,9 @@ select.required, input.required {
   content: '(must be unique if supplied)'
 }
 
-.unique-indicator
\ No newline at end of file
+.unique-indicator
+
+.error {
+  color: red;
+  font-weight: bold;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/css/dispatchpf.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/dispatchpf.css b/console/stand-alone/plugin/css/dispatchpf.css
index 15dc0a6..fc6c2ac 100644
--- a/console/stand-alone/plugin/css/dispatchpf.css
+++ b/console/stand-alone/plugin/css/dispatchpf.css
@@ -25,52 +25,61 @@ span.logo {
 .navbar-pf .navbar-brand {
   padding: 2px 0 2px;
 }
-/* using dynatree instead of treeview */
-#overtree ul.dynatree-container,
-#entityTree ul.dynatree-container,
-#schema ul.dynatree-container {
+/* using fancytree instead of treeview */
+
+#overtree ul.fancytree-container,
+#entityTree ul.fancytree-container,
+#schema ul.fancytree-container {
     background-color: transparent;
     border: 0px;
 }
 
-span.dynatree-folder a {
+span.fancytree-folder a {
     font-weight: normal;
     font-size: 12px;
 }
 
-ul.dynatree-container li,
-span.dynatree-icon {
+ul.fancytree-container li,
+span.fancytree-icon {
   background-image: none;
 }
 
-.dynatree-exp-c span.fa-angle, .dynatree-exp-e span.fa-angle,
-.dynatree-exp-cl span.fa-angle, .dynatree-exp-el span.fa-angle {
+.fancytree-exp-c span.fa-angle, .fancytree-exp-e span.fa-angle,
+.fancytree-exp-cl span.fa-angle, .fancytree-exp-el span.fa-angle {
   margin-right: 5px;
 }
-.dynatree-exp-c span.fa-angle:before, .dynatree-exp-cl span.fa-angle:before {
+.fancytree-exp-c span.fa-angle:before, .fancytree-exp-cl span.fa-angle:before {
+  font-family: FontAwesome;
+  content: "\f105";
+}
+.fancytree-exp-e .fancytree-expander:before, .fancytree-exp-el .fancytree-expander:before {
+  font-family: FontAwesome;
+  content: "\f107";
+}
+.fancytree-exp-c .fancytree-expander:before, .fancytree-exp-cl .fancytree-expander:before {
   font-family: FontAwesome;
   content: "\f105";
 }
-.dynatree-exp-e span.fa-angle:before, .dynatree-exp-el span.fa-angle:before {
+.fancytree-exp-e span.fa-angle:before, .fancytree-exp-el span.fa-angle:before {
   font-family: FontAwesome;
   content: "\f107";
 }
 
-.dynatree-ico-ef span.dynatree-icon, .dynatree-ico-cf span.dynatree-icon {
+.fancytree-ico-ef span.fancytree-icon, .fancytree-ico-cf span.fancytree-icon {
   background-image: initial;
-  font-family: FontAwsome;
+  font-family: FontAwesome;
 }
 
-.dynatree-ico-cf span.dynatree-icon:before {
+.fancytree-ico-cf span.fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f07b";
 }
-.dynatree-ico-ef span.dynatree-icon:before {
+.fancytree-ico-ef span.fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f07c";
 }
 
-ul.dynatree-container a {
+ul.fancytree-container a {
     color: #363636;
 }
 
@@ -100,6 +109,8 @@ div#list-controller {
 
 .pane-viewport {
     position: relative;
+    /* height: calc(100vh - 20px); */
+    overflow: auto;
 }
 
 #list-controller .tree-header, #list-controller .tree-header select {
@@ -184,3 +195,58 @@ div.qdr-topology.pane.left {
   width: 400px;
   top: 0;
 }
+/*
+.treeview .list-group-item.node-selected {
+  color: #FFFFFF !important;
+  background-color: #428bca !important;
+}
+*/
+span.fancytree-expander {
+  display: none;
+}
+
+#overview-controller span.fancytree-expander {
+  display: inline-block;
+}
+
+.fancytree-active .fancytree-title,
+.fancytree-active .fancytree-icon,
+.fancytree-active .fancytree-expander {
+  color: white;
+}
+
+.ui-grid {
+  border: 0px;
+}
+
+.ui-grid-header {
+  border: 1px solid #d4d4d4;
+}
+
+#overview-controller .sidebar-pf-left, #list-controller .sidebar-pf-left {
+  padding-right: 0px;
+}
+
+#crosshtml {
+  position: absolute;
+  display: none;
+  padding: 1em;
+  border: 1px solid grey;
+  background-color: white;
+  border-radius: 4px;
+}
+
+.pane-bar {
+  float: right;
+  height: calc(100vh - 75px);
+  width: 6px;
+  background-color: white;
+  border: 1px solid #e0e0e0;
+  position: absolute;
+  top: 0;
+  right: -6px;
+  cursor: ew-resize;
+
+
+  display: none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a93825ab/console/stand-alone/plugin/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/plugin.css b/console/stand-alone/plugin/css/plugin.css
index 20fd0fb..f4ac42b 100644
--- a/console/stand-alone/plugin/css/plugin.css
+++ b/console/stand-alone/plugin/css/plugin.css
@@ -26,7 +26,7 @@ ul.qdrListNodes > li > span {
   display: block;
 }
 
-.qdrList .gridStyle {
+.qdrList .grid {
     width: 20em;
     margin-right: 0;
     float: left;
@@ -215,6 +215,7 @@ div.d3Chart .title {
 div.d3Chart {
     padding: 1em 0;
     border: 1px solid #C0C0C0;
+    margin-bottom: 2em;
 }
 div.d3Chart.hDash {
     border: 0px;
@@ -288,7 +289,7 @@ div.qdrList li.active, ul.qdrListNodes li.active {
     background-color: #e0e0ff;
 }
 
-div.qdr-attributes span.dynatree-selected a {
+div.qdr-attributes span.fancytree-selected a {
     background-color: #e0e0ff;
 }
 div.qdr-attributes.pane, div.qdr-topology.pane {
@@ -309,7 +310,7 @@ div#main.qdr div.qdrList div.selected {
 }
 
 #dialogChart, #dialogEditChart {
-    height: 200px;
+    height: 220px;
 }
 
 .chartOptions .modal-body {
@@ -483,6 +484,9 @@ ul.qdrTopoModes {
 	left: 10px;
 }
 
+.overview-tree, .qdr-attributes {
+  min-height: calc(100vh - 90px)
+}
 .treeContainer {
 	width: 100%;
 	float: left;
@@ -501,18 +505,14 @@ ul.qdrTopoModes {
 	margin-left: 260px;
 }
 
-.gridStyle:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
-	background-color: #e0e0ff;
+.grid:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
+  /*background-color: #e0e0ff; */
+  background-color: #e9f2f9
 }
-
 .ngCellText {
 	padding: 4px 0 0 4px;
 }
 
-.overview {
-	border-bottom: 1px solid #d4d4d4;
-}
-
 .ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
   background-color: #e0e0ff;
 }
@@ -700,132 +700,132 @@ ul.dispatch-view {
 	margin-bottom: 0 !important;
 }
 
-.qdr-overview.pane.left span:not(.dynatree-has-children) .dynatree-icon:before,
-.qdr-attributes.pane.left span:not(.dynatree-has-children) .dynatree-icon:before {
+.qdr-overview.pane.left span:not(.fancytree-has-children) .fancytree-icon:before,
+.qdr-attributes.pane.left span:not(.fancytree-has-children) .fancytree-icon:before {
     color: green;
 }
 
-span:not(.dynatree-has-children).address .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address .dynatree-icon:before {
+span:not(.fancytree-has-children).address .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.address .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f0ac";
 }
-span:not(.dynatree-has-children).address.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.mobile .dynatree-icon:before {
+span:not(.fancytree-has-children).address.mobile .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.address.mobile .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f109";
 }
-span:not(.dynatree-has-children).address.internal.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.internal.mobile .dynatree-icon:before {
+span:not(.fancytree-has-children).address.internal.mobile .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.address.internal.mobile .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f0ac";
 }
-span:not(.dynatree-has-children).address.router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.router .dynatree-icon:before {
+span:not(.fancytree-has-children).address.router .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.address.router .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f047";
 }
 
-span.address-link .dynatree-icon:before {
+span.address-link .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f0ac";
 }
 
-span:not(.dynatree-has-children).connection.external .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.external .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f109";
 }
-span:not(.dynatree-has-children).connection.normal .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.normal .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f08e";
 }
-span:not(.dynatree-has-children).connection.external.quiesced .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.external.quiesced .fancytree-icon:before {
   font-family: FontAwesome;
 	content: "\f14c";
 	color: red;
 }
-span:not(.dynatree-has-children).connection.inter-router .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.inter-router .fancytree-icon:before {
   font-family: FontAwesome;
    content: "\f07e";
 }
-span:not(.dynatree-has-children).connection.router-control .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.router-control .fancytree-icon:before {
   font-family: FontAwesome;
    content: "\f013";
 }
-span:not(.dynatree-has-children).no-data .dynatree-icon:before {
+span:not(.fancytree-has-children).no-data .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f05e";
   color: red !important;
 }
-span:not(.dynatree-has-children).loading .dynatree-icon:before {
+span:not(.fancytree-has-children).loading .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f254";
 }
-span:not(.dynatree-has-children).connector .dynatree-icon:before {
+span:not(.fancytree-has-children).connector .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f126";
 }
-span:not(.dynatree-has-children).container .dynatree-icon:before {
+span:not(.fancytree-has-children).container .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f16c";
 }
-span:not(.dynatree-has-children).log .dynatree-icon:before {
+span:not(.fancytree-has-children).log .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f0f6";
 }
-span:not(.dynatree-has-children).router\.node .dynatree-icon:before {
+span:not(.fancytree-has-children).router\.node .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f013";
 }
-span:not(.dynatree-has-children).link.inter-router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.inter-router .dynatree-icon:before{
+span:not(.fancytree-has-children).link.inter-router .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.link.inter-router .fancytree-icon:before{
   font-family: FontAwesome;
   content: "\f07e";
 }
-span:not(.dynatree-has-children).link.router-control .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.router-control .dynatree-icon:before{
+span:not(.fancytree-has-children).link.router-control .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.link.router-control .fancytree-icon:before{
   font-family: FontAwesome;
   content: "\f013";
 }
-span:not(.dynatree-has-children).link.endpoint .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.endpoint .dynatree-icon:before{
+span:not(.fancytree-has-children).link.endpoint .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.link.endpoint .fancytree-icon:before{
   font-family: FontAwesome;
   content: "\f109";
 }
-span:not(.dynatree-has-children).link.console .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.console .dynatree-icon:before {
+span:not(.fancytree-has-children).link.console .fancytree-icon:before,
+span:not(.fancytree-has-children).router\.link.console .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f108";
 }
-span:not(.dynatree-has-children).listener .dynatree-icon:before {
+span:not(.fancytree-has-children).listener .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f025";
 }
-span:not(.dynatree-has-children).connection .dynatree-icon:before {
+span:not(.fancytree-has-children).connection .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f07e";
 }
-span:not(.dynatree-has-children).connection.console .dynatree-icon:before {
+span:not(.fancytree-has-children).connection.console .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f108";
 }
-span:not(.dynatree-has-children).waypoint .dynatree-icon:before {
+span:not(.fancytree-has-children).waypoint .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f0ec";
 }
-span:not(.dynatree-has-children).router .dynatree-icon:before {
+span:not(.fancytree-has-children).router .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f047";
 }
-span:not(.dynatree-has-children).fixedAddress .dynatree-icon:before {
+span:not(.fancytree-has-children).fixedAddress .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f015";
 }
-span:not(.dynatree-has-children).linkRoutePattern .dynatree-icon:before {
+span:not(.fancytree-has-children).linkRoutePattern .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f039";
 }
-span:not(.dynatree-has-children).allocator .dynatree-icon:before {
+span:not(.fancytree-has-children).allocator .fancytree-icon:before {
   font-family: FontAwesome;
   content: "\f170";
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org