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:21 UTC

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

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