Repository: qpid-dispatch Updated Branches: refs/heads/master 4c12a62b9 -> 01882c5d9
DISPATCH-434 Save expanded nodes on the Entities page also Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/01882c5d Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/01882c5d Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/01882c5d Branch: refs/heads/master Commit: 01882c5d9c9e01192fbf96b2388c73cb95574c4e Parents: 4c12a62 Author: Ernest Allen <[email protected]> Authored: Mon Jul 25 17:56:00 2016 -0400 Committer: Ernest Allen <[email protected]> Committed: Mon Jul 25 17:56:00 2016 -0400 ---------------------------------------------------------------------- .../hawtio/src/main/webapp/plugin/js/qdrList.js | 191 +++++++++++-------- .../src/main/webapp/plugin/js/qdrOverview.js | 13 +- 2 files changed, 116 insertions(+), 88 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/01882c5d/console/hawtio/src/main/webapp/plugin/js/qdrList.js ---------------------------------------------------------------------- diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrList.js b/console/hawtio/src/main/webapp/plugin/js/qdrList.js index 092fbb8..7efb79f 100644 --- a/console/hawtio/src/main/webapp/plugin/js/qdrList.js +++ b/console/hawtio/src/main/webapp/plugin/js/qdrList.js @@ -31,6 +31,9 @@ var QDR = (function(QDR) { QDR.module.controller("QDR.ListController", ['$scope', '$location', '$dialog', '$filter', 'localStorage', 'QDRService', 'QDRChartService', function ($scope, $location, $dialog, $filter, localStorage, QDRService, QDRChartService) { + var updateIntervalHandle = undefined; + var updateInterval = 5000; + var ListExpandedKey = "QDRListExpanded"; $scope.details = {}; if (!QDRService.connected) { // we are not connected. we probably got here from a bookmark or manual page reload @@ -125,6 +128,11 @@ var QDR = (function(QDR) { } $scope.nodes = QDRService.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") + $location.search('org', "list"); + } if (!angular.isDefined($scope.selectedNode)) { //QDR.log.debug("selectedNode was " + $scope.selectedNode); if ($scope.nodes.length > 0) { @@ -144,9 +152,11 @@ var QDR = (function(QDR) { } setCurrentNode(); if ($scope.currentNode == undefined) { - $scope.selectedNode = $scope.nodes[0].name; - $scope.selectedNodeId = $scope.nodes[0].id; - $scope.currentNode = $scope.nodes[0]; + if ($scope.nodes.length > 0) { + $scope.selectedNode = $scope.nodes[0].name; + $scope.selectedNodeId = $scope.nodes[0].id; + $scope.currentNode = $scope.nodes[0]; + } } var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"]; @@ -167,6 +177,7 @@ var QDR = (function(QDR) { } var entityTreeChildren = []; + var expandedList = angular.fromJson(localStorage[ListExpandedKey]) || []; var sortedEntities = Object.keys(QDRService.schema.entityTypes).sort(); sortedEntities.forEach( function (entity) { if (excludedEntities.indexOf(entity) == -1) { @@ -174,10 +185,10 @@ var QDR = (function(QDR) { $scope.selectedEntity = entity; $scope.operations = lookupOperations() } - var current = entity === $scope.selectedEntity; var e = new Folder(entity) e.typeName = "entity" e.key = entity + e.expand = (expandedList.indexOf(entity) > -1) var placeHolder = new Folder("loading...") placeHolder.addClass = "loading" e.children = [placeHolder] @@ -192,8 +203,20 @@ var QDR = (function(QDR) { activeVisible: false, children: entityTreeChildren }) + restartUpdate(); // start getting the data now that the tree is created + updateExpandedEntities(); }; var onTreeNodeExpanded = function (expanded, node) { + // save the list of entities that are expanded + var tree = $("#entityTree").dynatree("getTree"); + var list = []; + tree.visit( function (tnode) { + if (tnode.isExpanded()) { + list.push(tnode.data.key) + } + }) + localStorage[ListExpandedKey] = JSON.stringify(list) + if (expanded) onTreeSelected(node); } @@ -214,7 +237,7 @@ var QDR = (function(QDR) { $scope.selectedEntity = selectedNode.parent.data.key; $scope.operations = lookupOperations() $scope.selectedRecordName = selectedNode.data.key; - updateDetails(selectedNode.data.details); + updateDetails(selectedNode.data.details); // update the table on the right $("#entityTree").dynatree("getRoot").visit(function(node){ node.select(false); }); @@ -249,9 +272,9 @@ var QDR = (function(QDR) { } // the data for the selected entity is available, populate the tree - var updateEntityChildren = function (tableRows, expand) { + var updateEntityChildren = function (entity, tableRows, expand) { var tree = $("#entityTree").dynatree("getTree"); - var node = tree.getNodeByKey($scope.selectedEntity) + var node = tree.getNodeByKey(entity) var updatedDetails = false; var scrollTreeDiv = $('.qdr-attributes.pane.left .pane-viewport') var scrollTop = scrollTreeDiv.scrollTop(); @@ -263,13 +286,15 @@ var QDR = (function(QDR) { title: "no data", key: node.data.key + ".1" }) - $scope.selectedRecordName = $scope.selectedEntity; - updateDetails(fromSchema($scope.selectedEntity)); + if (expand) { + updateDetails(fromSchema(entity)); + $scope.selectedRecordName = entity; + } } else { tableRows.forEach( function (row) { - var addClass = $scope.selectedEntity; - if (classOverrides[$scope.selectedEntity]) { - addClass += " " + classOverrides[$scope.selectedEntity](row); + var addClass = entity; + if (classOverrides[entity]) { + addClass += " " + classOverrides[entity](row); } var child = { typeName: "attribute", @@ -279,29 +304,27 @@ var QDR = (function(QDR) { details: row } if (row.name.value === $scope.selectedRecordName) { - updateDetails(row); + if (expand) + updateDetails(row); // update the table on the right child.select = true; updatedDetails = true; } node.addChild(child) }) } - if (expand) { - node.expand(true); - } // if the selectedRecordName was not found, select the 1st one - if (!updatedDetails && tableRows.length > 0) { + 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) + updateDetails(row) // update the table on the right } scrollTreeDiv.scrollTop(scrollTop) } var schemaProps = function (entityName, key, currentNode) { - var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean'}; + var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean', map: 'textarea'}; var entity = QDRService.schema.entityTypes[entityName] var value = entity.attributes[key] @@ -349,6 +372,8 @@ var QDR = (function(QDR) { value = "<assigned by system>" return value; } + + // update the table on the right var updateDetails = function (row) { var details = []; $scope.detailsObject = {}; @@ -391,11 +416,19 @@ var QDR = (function(QDR) { } var restartUpdate = function () { - if (stop) { - clearInterval(stop) + if (updateIntervalHandle) { + clearInterval(updateIntervalHandle) } updateTableData($scope.selectedEntity, true); - stop = setInterval(updateTableData, 5000, $scope.selectedEntity); + updateIntervalHandle = setInterval(updateExpandedEntities, updateInterval); + } + var updateExpandedEntities = function () { + var tree = $("#entityTree").dynatree("getTree"); + tree.visit( function (node) { + if (node.isExpanded()) { + updateTableData(node.data.key, node.data.key === $scope.selectedEntity) + } + }) } $scope.selectNode = function(node) { @@ -423,14 +456,11 @@ var QDR = (function(QDR) { } }) - $scope.tableRows = []; - var selectedRowIndex = 0; - /* 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("/dispatch_plugin/connect") + $location.path("/" + QDR.pluginName + "/connect") $location.search('org', "list"); return; } @@ -440,60 +470,60 @@ var QDR = (function(QDR) { } var gotNodeInfo = function (nodeName, dotentity, response) { - //QDR.log.debug("got results for " + nodeName); - //console.dump(response); + var tableRows = []; var records = response.results; var aggregates = response.aggregates; var attributeNames = response.attributeNames; - var nameIndex = attributeNames.indexOf("name"); - var identityIndex = attributeNames.indexOf("identity"); - var ent = QDRService.schema.entityTypes[entity]; - var tableRows = []; - for (var i=0; i<records.length; ++i) { - var record = records[i]; - var aggregate = aggregates ? aggregates[i] : undefined; - var row = {}; - var rowName; - if (nameIndex > -1) { - rowName = record[nameIndex]; - if (!rowName && identityIndex > -1) { - rowName = record[nameIndex] = (dotentity + '/' + record[identityIndex]) + // If !attributeNmes then there was an error getting the records for this entity + if (attributeNames) { + var nameIndex = attributeNames.indexOf("name"); + var identityIndex = attributeNames.indexOf("identity"); + var ent = QDRService.schema.entityTypes[entity]; + for (var i=0; i<records.length; ++i) { + var record = records[i]; + var aggregate = aggregates ? aggregates[i] : undefined; + var row = {}; + var rowName; + if (nameIndex > -1) { + rowName = record[nameIndex]; + if (!rowName && identityIndex > -1) { + rowName = record[nameIndex] = (dotentity + '/' + record[identityIndex]) + } } - } - if (!rowName) { - QDR.log.error("response attributeNames did not contain a name field"); - console.dump(response.attributeNames); - return; - } - if (rowName == $scope.selectedRecordName) - selectedRowIndex = i; - for (var j=0; j<attributeNames.length; ++j) { - var col = attributeNames[j]; - row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''}; - if (ent) { - var att = ent.attributes[col]; - if (att) { - row[col].type = att.type; - row[col].graph = att.graph; - row[col].title = att.description; - - if (aggregate) { - if (att.graph) { - row[col].aggregate = att.graph ? aggregate[j].sum : ''; - var tip = []; - aggregate[j].detail.forEach( function (line) { - tip.push(line); - }) - row[col].aggregateTip = angular.toJson(tip); + if (!rowName) { + QDR.log.error("response attributeNames did not contain a name field"); + console.dump(response.attributeNames); + return; + } + for (var j=0; j<attributeNames.length; ++j) { + var col = attributeNames[j]; + row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''}; + if (ent) { + var att = ent.attributes[col]; + if (att) { + row[col].type = att.type; + row[col].graph = att.graph; + row[col].title = att.description; + + if (aggregate) { + if (att.graph) { + row[col].aggregate = att.graph ? aggregate[j].sum : ''; + var tip = []; + aggregate[j].detail.forEach( function (line) { + tip.push(line); + }) + row[col].aggregateTip = angular.toJson(tip); + } } } } } + tableRows.push(row); } - tableRows.push(row); } + tableRows.sort( function (a, b) { return a.name.value.localeCompare(b.name.value) }) - setTimeout(selectRow, 0, {rows: tableRows, expand: expand}); + setTimeout(selectRow, 0, {entity: dotentity, rows: tableRows, expand: expand}); } // 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) { @@ -506,8 +536,7 @@ var QDR = (function(QDR) { // tableRows are the records that were returned, this populates the left hand table on the page var selectRow = function (info) { - $scope.tableRows = info.rows; - updateEntityChildren(info.rows, info.expand); + updateEntityChildren(info.entity, info.rows, info.expand); fixTooltips(); } @@ -543,8 +572,6 @@ var QDR = (function(QDR) { } }) } - //QDR.log.debug("using entity of " + $scope.selectedEntity); - var stop = undefined; $scope.detailFields = []; @@ -565,7 +592,7 @@ var QDR = (function(QDR) { name: $scope.selectedRecordName, attr: rowEntity.name, type: "rate", - rateWindow: 5000, + rateWindow: udateInterval, visibleDuration: 1, forceCreate: true, aggregate: true}); @@ -615,14 +642,11 @@ var QDR = (function(QDR) { return false; } }; - updateTableData($scope.selectedEntity, true); - stop = setInterval(updateTableData, 5000, $scope.selectedEntity); - $scope.$on("$destroy", function( event ) { //QDR.log.debug("scope destroyed for qdrList"); - if (angular.isDefined(stop)) { - clearInterval(stop); - stop = undefined; + if (angular.isDefined(updateIntervalHandle)) { + clearInterval(updateIntervalHandle); + updateIntervalHandle = undefined; }; }); @@ -630,10 +654,9 @@ var QDR = (function(QDR) { var statusCode = context.message.application_properties.statusCode; if (statusCode < 200 || statusCode >= 300) { Core.notification('error', context.message.application_properties.statusDescription); - QDR.log.debug(context.message.application_properties.statusDescription) + //QDR.log.debug(context.message.application_properties.statusDescription) } else { var note = entity + " " + $filter('Pascalcase')($scope.currentMode.op) + "d" - QDR.log.info(note) Core.notification('success', note); $scope.selectMode($scope.modes[0]); restartUpdate(); @@ -697,7 +720,7 @@ var QDR = (function(QDR) { $scope.showChartsPage = function () { cleanup(); dialog.close(true); - $location.path("/dispatch_plugin/charts"); + $location.path("/" + QDR.pluginName + "/charts"); }; $scope.addHChart = function () { @@ -707,7 +730,7 @@ var QDR = (function(QDR) { } $scope.addToDashboardLink = function () { - var href = "#/dispatch_plugin/charts"; + var href = "#/" + QDR.pluginName + "/charts"; var size = angular.toJson({ size_x: 2, size_y: 2 http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/01882c5d/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js ---------------------------------------------------------------------- diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js b/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js index be2fe64..3964715 100644 --- a/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js +++ b/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js @@ -46,14 +46,14 @@ var QDR = (function (QDR) { content: '<i class="icon-list"></i> Attributes', title: "View the attribute values on your selection", isValid: function (workspace) { return true; }, - href: function () { return "#/dispatch-plugin/attributes"; }, + href: function () { return "#/" + QDR.pluginName + "/attributes"; }, index: 0 }, { content: '<i class="icon-leaf"></i> Operations', title: "Execute operations on your selection", isValid: function (workspace) { return true; }, - href: function () { return "#/dispatch-plugin/operations"; }, + href: function () { return "#/" + QDR.pluginName + "/operations"; }, index: 1 }] $scope.activeTab = $scope.subLevelTabs[0]; @@ -294,7 +294,6 @@ var QDR = (function (QDR) { var selItem = data.entity; var nodeId = selItem.uid $("#overtree").dynatree("getTree").activateKey(nodeId); - } } }; @@ -686,7 +685,6 @@ $scope.linksGrid.ngGrid.rowFactory.aggCache[rowIndex].toggleExpand(); var nodeId = selItem.host // activate Routers->nodeId in the tree $("#overtree").dynatree("getTree").activateKey(nodeId); - } } }; @@ -1115,6 +1113,12 @@ $scope.linksGrid.ngGrid.rowFactory.aggCache[rowIndex].toggleExpand(); }); } + // expanded is called when a node is expanded + // here we save the expanded node so it can be restored when the page reloads + var expanded = function (flag, node) { + saveExpanded(); + } + // 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) { @@ -1372,6 +1376,7 @@ $scope.linksGrid.ngGrid.rowFactory.aggCache[rowIndex].toggleExpand(); }) $('#overtree').dynatree({ onActivate: activated, + onExpand: expanded, onClick: function (n, e) { if (e.target.className.indexOf('-filter') > -1) { //QDR.log.debug("overtree on click called") --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
