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 2018/01/22 20:23:49 UTC
[1/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 785c99d1c -> 502538b4f
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index e67059f..0000000
--- a/console/stand-alone/plugin/js/qdrTopology.js
+++ /dev/null
@@ -1,2079 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- QDR.module.controller('QDR.TopologyFormController', function($scope, $rootScope, $timeout, QDRService) {
-
- $scope.attributes = []
- 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,
- multiSelect: false,
- jqueryUIDraggable: true,
- columnDefs: [{
- field: 'attributeName',
- displayName: 'Attribute',
- cellTemplate: nameTemplate
- }, {
- field: 'attributeValue',
- displayName: 'Value',
- cellTemplate: valueTemplate
- }]
- };
- $scope.form = 'router'
- $scope.$on('showEntityForm', function(event, args) {
-console.log("showEntityForm " + args.entity)
- var attributes = args.attributes;
- var entityTypes = QDRService.management.schema().entityTypes[args.entity].attributes;
- attributes.forEach(function(attr) {
- attr.cls = ''
- if (attr.attributeName === 'Listening on')
- attr.cls = 'listening-on'
- if (entityTypes[attr.attributeName] && entityTypes[attr.attributeName].description) {
- attr.description = entityTypes[attr.attributeName].description
- }
- //QDR.log.debug("attr.description " + attr.description)
- })
- $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', '$sce',
- function($scope, $rootScope, QDRService, $location, $timeout, $uibModal, $sce) {
-
- $scope.multiData = []
- $scope.quiesceState = {}
- var dontHide = false;
- $scope.crosshtml = $sce.trustAsHtml("")
-
- $scope.panelVisible = true // show/hide the panel on the left
- $scope.hideLeftPane = function () {
- d3.select(".qdr-topology.pane.left")
- .transition().duration(300).ease("sin-in")
- .style("left" , "-380px")
-
- d3.select(".panel-adjacent")
- .transition().duration(300).ease("sin-in")
- .style("margin-left", "30px")
- .each("end", function () {
- resize()
- $timeout(function () {$scope.panelVisible = false})
- })
- }
- $scope.showLeftPane = function () {
- d3.select(".qdr-topology.pane.left")
- .transition().duration(300).ease("sin-out")
- .style("left" , "0px")
-
- d3.select(".panel-adjacent")
- .transition().duration(300).ease("sin-out")
- .style("margin-left", "430px")
- .each("end", function () {
- resize()
- $timeout(function () {$scope.panelVisible = true})
- })
- }
-
- $scope.quiesceConnection = function(row) {
- var entity = row.entity;
- var state = $scope.quiesceState[entity.connectionId].state;
- if (state === 'enabled') {
- // start quiescing all links
- $scope.quiesceState[entity.connectionId].state = 'quiescing';
- } else if (state === 'quiesced') {
- // start reviving all links
- $scope.quiesceState[entity.connectionId].state = 'reviving';
- }
- $scope.multiDetails.updateState(entity);
- dontHide = true;
- $scope.multiDetails.selectRow(row.rowIndex, true);
- $scope.multiDetails.showLinksList(row)
- }
- $scope.quiesceDisabled = function(row) {
- return $scope.quiesceState[row.entity.connectionId].buttonDisabled;
- }
- $scope.quiesceText = function(row) {
- return $scope.quiesceState[row.entity.connectionId].buttonText;
- }
- $scope.quiesceClass = function(row) {
- var stateClassMap = {
- enabled: 'btn-primary',
- quiescing: 'btn-warning',
- reviving: 'btn-warning',
- quiesced: 'btn-danger'
- }
- 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',
- enableColumnResize: true,
- jqueryUIDraggable: true,
- 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) {
- $scope.linkData = obj.entity.linkData;
- $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"), 10)
- var offset = jQuery('#topology').offset();
- var detailsDiv = d3.select('#link_details')
- detailsDiv
- .style({
- display: 'block',
- opacity: 1,
- left: (left + 20) + "px",
- top: (mouseY - offset.top + 20 + $(document).scrollTop()) + "px",
- height: ((visibleLen + 1) * 30) + 40 + "px", // +1 for the header row
- 'overflow-y': obj.entity.linkData > 10 ? 'scroll' : 'hidden'
- })
- },
- updateState: function(entity) {
- var state = $scope.quiesceState[entity.connectionId].state
-
- // count enabled and disabled links for this connection
- var enabled = 0,
- disabled = 0;
- entity.linkData.forEach(function(link) {
- if (link.adminStatus === 'enabled')
- ++enabled;
- if (link.adminStatus === 'disabled')
- ++disabled;
- })
-
- var linkCount = entity.linkData.length;
- // if state is quiescing and any links are enabled, button should say 'Quiescing' and be disabled
- if (state === 'quiescing' && (enabled > 0)) {
- $scope.quiesceState[entity.connectionId].buttonText = 'Quiescing';
- $scope.quiesceState[entity.connectionId].buttonDisabled = true;
- } else
- // if state is enabled and all links are disabled, button should say Revive and be enabled. set state to quisced
- // if state is quiescing and all links are disabled, button should say 'Revive' and be enabled. set state to quiesced
- if ((state === 'quiescing' || state === 'enabled') && (disabled === linkCount)) {
- $scope.quiesceState[entity.connectionId].buttonText = 'Revive';
- $scope.quiesceState[entity.connectionId].buttonDisabled = false;
- $scope.quiesceState[entity.connectionId].state = 'quiesced'
- } else
- // if state is reviving and any links are disabled, button should say 'Reviving' and be disabled
- if (state === 'reviving' && (disabled > 0)) {
- $scope.quiesceState[entity.connectionId].buttonText = 'Reviving';
- $scope.quiesceState[entity.connectionId].buttonDisabled = true;
- } else
- // if state is reviving or quiesced and all links are enabled, button should say 'Quiesce' and be enabled. set state to enabled
- if ((state === 'reviving' || state === 'quiesced') && (enabled === linkCount)) {
- $scope.quiesceState[entity.connectionId].buttonText = 'Quiesce';
- $scope.quiesceState[entity.connectionId].buttonDisabled = false;
- $scope.quiesceState[entity.connectionId].state = 'enabled'
- }
- },
- columnDefs: [{
- field: 'host',
- cellTemplate: "titleCellTemplate.html",
- //headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'Connection host'
- }, {
- field: 'user',
- cellTemplate: "titleCellTemplate.html",
- //headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'User'
- }, {
- field: 'properties',
- cellTemplate: "titleCellTemplate.html",
- //headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'Properties'
- }
- /*,
- {
- cellClass: 'gridCellButton',
- cellTemplate: '<button title="{{quiesceText(row)}} the links" type="button" ng-class="quiesceClass(row)" class="btn" ng-click="$event.stopPropagation();quiesceConnection(row)" ng-disabled="quiesceDisabled(row)">{{quiesceText(row)}}</button>'
- }*/
- ]
- };
- $scope.quiesceLinkClass = function(row) {
- var stateClassMap = {
- enabled: 'btn-primary',
- disabled: 'btn-danger'
- }
- return stateClassMap[row.entity.adminStatus]
- }
- $scope.quiesceLink = function(row) {
- 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')
- }
- $scope.quiesceLinkText = function(row) {
- return row.entity.operStatus === 'down' ? "Revive" : "Quiesce";
- }
- $scope.linkData = [];
- $scope.linkDetails = {
- data: 'linkData',
- jqueryUIDraggable: true,
- columnDefs: [{
- field: 'adminStatus',
- cellTemplate: "titleCellTemplate.html",
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'Admin state'
- }, {
- field: 'operStatus',
- cellTemplate: "titleCellTemplate.html",
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'Oper state'
- }, {
- field: 'dir',
- cellTemplate: "titleCellTemplate.html",
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'dir'
- }, {
- field: 'owningAddr',
- cellTemplate: "titleCellTemplate.html",
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- displayName: 'Address'
- }, {
- field: 'deliveryCount',
- displayName: 'Delivered',
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- cellClass: 'grid-values'
-
- }, {
- field: 'uncounts',
- displayName: 'Outstanding',
- headerCellTemplate: 'titleHeaderCellTemplate.html',
- cellClass: 'grid-values'
- }
- /*,
- {
- cellClass: 'gridCellButton',
- cellTemplate: '<button title="{{quiesceLinkText(row)}} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row)" ng-disabled="quiesceLinkDisabled(row)">{{quiesceLinkText(row)}}</button>'
- }*/
- ]
- }
-
- var urlPrefix = $location.absUrl();
- urlPrefix = urlPrefix.split("#")[0]
- QDR.log.debug("started QDR.TopologyController with urlPrefix: " + urlPrefix);
-
- // mouse event vars
- var selected_node = null,
- selected_link = null,
- mousedown_link = null,
- mousedown_node = null,
- mouseover_node = null,
- mouseup_node = null,
- initial_mouse_down_position = null;
-
- $scope.schema = "Not connected";
-
- $scope.contextNode = null; // node that is associated with the current context menu
- $scope.isRight = function(mode) {
- return mode.right;
- }
-
- var setNodesFixed = function (name, b) {
- nodes.some(function (n) {
- if (n.name === name) {
- n.fixed = b;
- return true;
- }
- })
- }
- $scope.setFixed = function(b) {
- if ($scope.contextNode) {
- $scope.contextNode.fixed = b;
- setNodesFixed($scope.contextNode.name, b)
- savePositions()
- }
- restart();
- }
- $scope.isFixed = function() {
- if (!$scope.contextNode)
- return false;
- return ($scope.contextNode.fixed & 1);
- }
-
- var mouseX, mouseY;
- var relativeMouse = function () {
- var offset = $('#main_container').offset();
- return {left: (mouseX + $(document).scrollLeft()) - 1,
- top: (mouseY + $(document).scrollTop()) - 1,
- offset: offset
- }
- }
- // event handlers for popup context menu
- $(document).mousemove(function(e) {
- mouseX = e.clientX;
- mouseY = e.clientY;
- });
- $(document).mousemove();
- $(document).click(function(e) {
- $scope.contextNode = null;
- $(".contextMenu").fadeOut(200);
- });
-
- var radii = {
- 'inter-router': 25,
- 'normal': 15,
- 'on-demand': 15,
- 'route-container': 15,
- };
- var radius = 25;
- var radiusNormal = 15;
- var svg, lsvg;
- var force;
- var animate = false; // should the force graph organize itself when it is displayed
- var path, circle;
- var savedKeys = {};
- var dblckickPos = [0, 0];
- var width = 0;
- var height = 0;
-
- var getSizes = function() {
- var legendWidth = 143;
- var gap = 5;
- var width = $('#topology').width() - gap - legendWidth;
- var top = $('#topology').offset().top
- var tpformHeight = $('#topologyForm').height()
- var height = Math.max(window.innerHeight, tpformHeight + top) - top - gap;
- if (width < 10) {
- QDR.log.info("page width and height are abnormal w:" + width + " height:" + height)
- return [0, 0];
- }
- return [width, height]
- }
- var resize = function() {
- if (!svg)
- return;
- var sizes = getSizes();
- width = sizes[0]
- height = sizes[1]
- if (width > 0) {
- // set attrs and 'resume' force
- svg.attr('width', width);
- svg.attr('height', height);
- force.size(sizes).resume();
- }
- }
-
- $scope.$on('panel-resized', function () {
- resize()
- })
- window.addEventListener('resize', resize);
- var sizes = getSizes()
- width = sizes[0]
- height = sizes[1]
- if (width <= 0 || height <= 0)
- return
-
- // set up initial nodes and links
- // - nodes are known by 'id', not by index in array.
- // - selected edges are indicated on the node (as a bold red circle).
- // - links are always source < target; edge directions are set by 'left' and 'right'.
- var nodes = [];
- var links = [];
-
- var nodeExists = function (connectionContainer) {
- return nodes.findIndex( function (node) {
- return node.container === connectionContainer
- })
- }
- var normalExists = function (connectionContainer) {
- var normalInfo = {}
- for (var i=0; i<nodes.length; ++i) {
- if (nodes[i].normals) {
- if (nodes[i].normals.some(function (normal, j) {
- if (normal.container === connectionContainer && i !== j) {
- normalInfo = {nodesIndex: i, normalsIndex: j}
- return true
- }
- return false
- }))
- break;
- }
- }
- return normalInfo
- }
- var getLinkSource = function (nodesIndex) {
- for (var i=0; i<links.length; ++i) {
- if (links[i].target === nodesIndex)
- return i
- }
- return -1
- }
- var aNode = function(id, name, nodeType, nodeInfo, nodeIndex, x, y, connectionContainer, resultIndex, fixed, properties) {
- properties = properties || {};
- for (var i=0; i<nodes.length; ++i) {
- if (nodes[i].name === name || nodes[i].container === connectionContainer) {
- if (properties.product)
- nodes[i].properties = properties
- return nodes[i]
- }
- }
- var routerId = QDRService.management.topology.nameFromId(id)
- return {
- key: id,
- name: name,
- nodeType: nodeType,
- properties: properties,
- routerId: routerId,
- x: x,
- y: y,
- id: nodeIndex,
- resultIndex: resultIndex,
- fixed: !!+fixed,
- cls: '',
- container: connectionContainer
- };
- };
-
-
- var initForm = function(attributes, results, entityType, formFields) {
-
- while (formFields.length > 0) {
- // remove all existing attributes
- formFields.pop();
- }
-
- for (var i = 0; i < attributes.length; ++i) {
- var name = attributes[i];
- var val = results[i];
- var desc = "";
- if (entityType.attributes[name])
- if (entityType.attributes[name].description)
- desc = entityType.attributes[name].description;
-
- formFields.push({
- 'attributeName': name,
- 'attributeValue': val,
- 'description': desc
- });
- }
- }
-
- var getLinkDir = function (id, connection, onode) {
- var links = onode["router.link"]
- if (!links) {
- return "unknown"
- }
- var inCount = 0, outCount = 0
- links.results.forEach( function (linkResult) {
- var link = QDRService.utilities.flatten(links.attributeNames, linkResult)
- if (link.linkType === "endpoint" && link.connectionId === connection.identity)
- if (link.linkDir === "in")
- ++inCount
- else
- ++outCount
- })
- if (inCount > 0 && outCount > 0)
- return "both"
- if (inCount > 0)
- return "in"
- if (outCount > 0)
- return "out"
- return "unknown"
- }
-
- var savePositions = function () {
- nodes.forEach( function (d) {
- localStorage[d.name] = angular.toJson({
- x: Math.round(d.x),
- y: Math.round(d.y),
- fixed: (d.fixed & 1) ? 1 : 0,
- });
- })
- }
-
- var initializeNodes = function (nodeInfo) {
- var nodeCount = Object.keys(nodeInfo).length
- var yInit = 50;
- nodes = []
- for (var id in nodeInfo) {
- 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)) {
- animate = true;
- position = {
- x: Math.round(width / 4 + ((width / 2) / nodeCount) * nodes.length),
- y: Math.round(height / 2 + Math.sin(nodes.length / (Math.PI*2.0)) * height / 4),
- fixed: false,
- };
- //QDR.log.debug("new node pos (" + position.x + ", " + position.y + ")")
- }
- if (position.y > height) {
- position.y = 200 - yInit;
- yInit *= -1
- }
- nodes.push(aNode(id, name, "inter-router", nodeInfo, nodes.length, position.x, position.y, name, undefined, position.fixed));
- }
- }
-
- var initializeLinks = function (nodeInfo, unknowns) {
- links = [];
- var source = 0;
- var client = 1.0;
- for (var id in nodeInfo) {
- var onode = nodeInfo[id];
- if (!onode['connection'])
- continue
- 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.utilities.flatten(attrs, conns[j])
- var role = connection.role
- var properties = connection.properties || {};
- var dir = connection.dir
- if (role == "inter-router") {
- var connId = connection.container
- var target = getContainerIndex(connId, nodeInfo);
- if (target >= 0) {
- getLink(source, target, dir, "", source + "-" + target);
- }
- } /* else if (role == "normal" || role == "on-demand" || role === "route-container")*/ {
- // not an connection between routers, but an external connection
- 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]);
- if (!angular.isDefined(position)) {
- animate = true;
- position = {
- x: Math.round(nodes[source].x + 40 * Math.sin(client / (Math.PI * 2.0))),
- y: Math.round(nodes[source].y + 40 * Math.cos(client / (Math.PI * 2.0))),
- fixed: false
- };
- //QDR.log.debug("new client pos (" + position.x + ", " + position.y + ")")
- }// else QDR.log.debug("using previous location")
- if (position.y > height) {
- position.y = Math.round(nodes[source].y + 40 + Math.cos(client / (Math.PI * 2.0)))
- }
- 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.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
- getLink(source, existingNodeIndex, dir, "small", connection.name);
- } else if (normalInfo.nodesIndex) {
- // get node index of node that contained this connection in its normals array
- var normalSource = getLinkSource(normalInfo.nodesIndex)
- if (normalSource >= 0) {
- if (cdir === 'unknown')
- cdir = dir
- node.cdir = cdir
- nodes.push(node)
- // create link from original node to the new node
- getLink(links[normalSource].source, nodes.length-1, cdir, "small", connection.name)
- // create link from this router to the new node
- getLink(source, nodes.length-1, cdir, "small", connection.name)
- // remove the old node from the normals list
- nodes[normalInfo.nodesIndex].normals.splice(normalInfo.normalsIndex, 1)
- }
- } else if (role === 'normal') {
- // normal nodes can be collapsed into a single node if they are all the same dir
- if (cdir !== 'unknown') {
- node.user = connection.user
- node.isEncrypted = connection.isEncrypted
- node.host = connection.host
- node.connectionId = connection.identity
- node.cdir = cdir
- // determine arrow direction by using the link directions
- if (!normalsParent[nodeType+cdir]) {
- normalsParent[nodeType+cdir] = node;
- nodes.push(node);
- node.normals = [node];
- // now add a link
- getLink(source, nodes.length - 1, cdir, "small", connection.name);
- client++;
- } else {
- normalsParent[nodeType+cdir].normals.push(node)
- }
- } else {
- node.id = nodes.length - 1 + unknowns.length
- unknowns.push(node)
- }
- } else {
- nodes.push(node)
- // now add a link
- getLink(source, nodes.length - 1, dir, "small", connection.name);
- client++;
- }
- }
- }
- source++;
- }
- }
-
- // vary the following force graph attributes based on nodeCount
- // <= 6 routers returns min, >= 80 routers returns max, interpolate linearly
- var forceScale = function(nodeCount, min, max) {
- var count = nodeCount
- if (nodeCount < 6) count = 6
- if (nodeCount > 80) count = 80
- var x = d3.scale.linear()
- .domain([6,80])
- .range([min, max]);
-//QDR.log.debug("forceScale(" + nodeCount + ", " + min + ", " + max + " returns " + x(count) + " " + x(nodeCount))
- return x(count)
- }
- var linkDistance = function (d, nodeCount) {
- if (d.target.nodeType === 'inter-router')
- return forceScale(nodeCount, 150, 70)
- return forceScale(nodeCount, 75, 40)
- }
- var charge = function (d, nodeCount) {
- if (d.nodeType === 'inter-router')
- return forceScale(nodeCount, -1800, -900)
- return -900
- }
- var gravity = function (d, nodeCount) {
- return forceScale(nodeCount, 0.0001, 0.1)
- }
- // initialize the nodes and links array from the QDRService.topology._nodeInfo object
- var initForceGraph = function() {
- nodes = [];
- links = [];
- var nodeInfo = QDRService.management.topology.nodeInfo();
- var nodeCount = Object.keys(nodeInfo).length
-
- var oldSelectedNode = selected_node
- var oldMouseoverNode = mouseover_node
- mouseover_node = null;
- selected_node = null;
- selected_link = null;
-
- savePositions();
- d3.select("#SVG_ID").remove();
- svg = d3.select('#topology')
- .append('svg')
- .attr("id", "SVG_ID")
- .attr('width', width)
- .attr('height', height)
- .on('click', function(d) {
- removeCrosssection()
- });
-
- $(document).keyup(function(e) {
- if (e.keyCode === 27) {
- removeCrosssection()
- }
- });
-
- // the legend
- d3.select("#svg_legend svg").remove();
- lsvg = d3.select("#svg_legend")
- .append('svg')
- .attr('id', 'svglegend')
- lsvg = lsvg.append('svg:g')
- .attr('transform', 'translate(' + (radii['inter-router'] + 2) + ',' + (radii['inter-router'] + 2) + ')')
- .selectAll('g');
-
- // mouse event vars
- mousedown_link = null;
- mousedown_node = null;
- mouseup_node = null;
-
- // initialize the list of nodes
- initializeNodes(nodeInfo)
- savePositions()
-
- // initialize the list of links
- var unknowns = []
- initializeLinks(nodeInfo, unknowns)
- $scope.schema = QDRService.management.schema();
- // init D3 force layout
- force = d3.layout.force()
- .nodes(nodes)
- .links(links)
- .size([width, height])
- .linkDistance(function(d) { return linkDistance(d, nodeCount) })
- .charge(function(d) { return charge(d, nodeCount) })
- .friction(.10)
- .gravity(function(d) { return gravity(d, nodeCount) })
- .on('tick', tick)
- .on('end', function () {savePositions()})
- .start()
-
- svg.append("svg:defs").selectAll('marker')
- .data(["end-arrow", "end-arrow-selected", "end-arrow-small", "end-arrow-highlighted"]) // Different link/path types can be defined here
- .enter().append("svg:marker") // This section adds in the arrows
- .attr("id", String)
- .attr("viewBox", "0 -5 10 10")
- .attr("markerWidth", 4)
- .attr("markerHeight", 4)
- .attr("orient", "auto")
- .classed("small", function (d) {return d.indexOf('small') > -1})
- .append("svg:path")
- .attr('d', 'M 0 -5 L 10 0 L 0 5 z')
-
- svg.append("svg:defs").selectAll('marker')
- .data(["start-arrow", "start-arrow-selected", "start-arrow-small", "start-arrow-highlighted"]) // Different link/path types can be defined here
- .enter().append("svg:marker") // This section adds in the arrows
- .attr("id", String)
- .attr("viewBox", "0 -5 10 10")
- .attr("refX", 5)
- .attr("markerWidth", 4)
- .attr("markerHeight", 4)
- .attr("orient", "auto")
- .append("svg:path")
- .attr('d', 'M 10 -5 L 0 0 L 10 5 z');
-
- var grad = svg.append("svg:defs").append("linearGradient")
- .attr("id", "half-circle")
- .attr("x1", "0%")
- .attr("x2", "0%")
- .attr("y1", "100%")
- .attr("y2", "0%");
- grad.append("stop").attr("offset", "50%").style("stop-color", "#C0F0C0");
- grad.append("stop").attr("offset", "50%").style("stop-color", "#F0F000");
-
- // handles to link and node element groups
- path = svg.append('svg:g').selectAll('path'),
- circle = svg.append('svg:g').selectAll('g');
-
- // app starts here
- restart(false);
- force.start();
- if (oldSelectedNode) {
- d3.selectAll('circle.inter-router').classed("selected", function (d) {
- if (d.key === oldSelectedNode.key) {
- selected_node = d;
- return true
- }
- return false
- })
- }
- if (oldMouseoverNode && selected_node) {
- d3.selectAll('circle.inter-router').each(function (d) {
- if (d.key === oldMouseoverNode.key) {
- mouseover_node = d
- QDRService.management.topology.ensureAllEntities([{entity: "router.node", attrs: ["id","nextHop"]}], function () {
- nextHop(selected_node, d);
- restart();
- })
- }
- })
- }
- setTimeout(function () {
- 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
- if (unknowns.length > 0)
- setTimeout(resolveUnknowns, 10, nodeInfo, unknowns)
-
- var continueForce = function (extra) {
- if (extra > 0) {
- --extra
- force.start()
- setTimeout(continueForce, 100, extra)
- }
- }
- continueForce(forceScale(nodeCount, 0, 200)) // give graph time to settle down
- }
-
- var resolveUnknowns = function (nodeInfo, unknowns) {
- var unknownNodes = {}
- // collapse the unknown node.keys using an object
- for (var i=0; i<unknowns.length; ++i) {
- unknownNodes[unknowns[i].key] = 1
- }
- unknownNodes = Object.keys(unknownNodes)
- //QDR.log.info("-- resolveUnknowns: ensuring .connection and .router.link are present for each node")
- 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;
- force.nodes(nodes).links(links).start();
- restart(false);
- })
- }
-
- function updateForm(key, entity, resultIndex) {
- 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]
- 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],
- attributeValue: row
- }
- })
- // sort by attributeName
- attributes.sort(function(a, b) {
- return a.attributeName.localeCompare(b.attributeName)
- })
-
- // move the Name first
- var nameIndex = attributes.findIndex(function(attr) {
- return attr.attributeName === 'name'
- })
- if (nameIndex >= 0)
- attributes.splice(0, 0, attributes.splice(nameIndex, 1)[0]);
-
- // get the list of ports this router is listening on
- if (entity === 'router') {
- var listeners = onode['listener'].results;
- var listenerAttributes = onode['listener'].attributeNames;
- var normals = listeners.filter(function(listener) {
- return QDRService.utilities.valFor(listenerAttributes, listener, 'role') === 'normal';
- })
- var ports = []
- normals.forEach(function(normalListener) {
- ports.push(QDRService.utilities.valFor(listenerAttributes, normalListener, 'port'))
- })
- // add as 2nd row
- if (ports.length) {
- attributes.splice(1, 0, {
- attributeName: 'Listening on',
- attributeValue: ports,
- description: 'The port on which this router is listening for connections'
- });
- }
- }
- $rootScope.$broadcast('showEntityForm', {
- entity: entity,
- attributes: attributes
- })
- if (!$scope.$$phase) $scope.$apply()
- })
- }
- }
-
- function getContainerIndex(_id, nodeInfo) {
- var nodeIndex = 0;
- for (var id in nodeInfo) {
- if (QDRService.management.topology.nameFromId(id) === _id)
- return nodeIndex;
- ++nodeIndex;
- }
- return -1;
- }
-
- function getLink(_source, _target, dir, cls, uid) {
- for (var i = 0; i < links.length; i++) {
- var s = links[i].source,
- t = links[i].target;
- if (typeof links[i].source == "object") {
- s = s.id;
- t = t.id;
- }
- if (s == _source && t == _target) {
- return i;
- }
- // same link, just reversed
- if (s == _target && t == _source) {
- return -i;
- }
- }
- //QDR.log.debug("creating new link (" + (links.length) + ") between " + nodes[_source].name + " and " + nodes[_target].name);
- if (links.some( function (l) { return l.uid === uid}))
- uid = uid + '.' + links.length
- var link = {
- source: _source,
- target: _target,
- left: dir != "out",
- right: (dir == "out" || dir == "both"),
- cls: cls,
- uid: uid,
- };
- return links.push(link) - 1;
- }
-
-
- function resetMouseVars() {
- mousedown_node = null;
- mouseover_node = null;
- mouseup_node = null;
- mousedown_link = null;
- }
-
- // update force layout (called automatically each iteration)
- function tick() {
- circle.attr('transform', function(d) {
- var cradius;
- if (d.nodeType == "inter-router") {
- cradius = d.left ? radius + 8 : radius;
- } else {
- cradius = d.left ? radiusNormal + 18 : radiusNormal;
- }
- d.x = Math.max(d.x, radiusNormal * 2);
- d.y = Math.max(d.y, radiusNormal * 2);
- d.x = Math.max(0, Math.min(width - cradius, d.x))
- d.y = Math.max(0, Math.min(height - cradius, d.y))
- return 'translate(' + d.x + ',' + d.y + ')';
- });
-
- // draw directed edges with proper padding from node centers
- path.attr('d', function(d) {
- //QDR.log.debug("in tick for d");
- //console.dump(d);
- var sourcePadding, targetPadding, r;
-
- if (d.target.nodeType == "inter-router") {
- r = radius;
- // right arrow left line start
- sourcePadding = d.left ? radius + 8 : radius;
- // left arrow right line start
- targetPadding = d.right ? radius + 16 : radius;
- } else {
- r = radiusNormal - 18;
- sourcePadding = d.left ? radiusNormal + 18 : radiusNormal;
- targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
- }
- var dtx = Math.max(targetPadding, Math.min(width - r, d.target.x)),
- dty = Math.max(targetPadding, Math.min(height - r, d.target.y)),
- dsx = Math.max(sourcePadding, Math.min(width - r, d.source.x)),
- dsy = Math.max(sourcePadding, Math.min(height - r, d.source.y));
-
- var deltaX = dtx - dsx,
- deltaY = dty - dsy,
- dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
- if (dist == 0)
- dist = 0.001;
- var normX = deltaX / dist,
- normY = deltaY / dist;
- var sourceX = dsx + (sourcePadding * normX),
- sourceY = dsy + (sourcePadding * normY),
- targetX = dtx - (targetPadding * normX),
- targetY = dty - (targetPadding * normY);
- sourceX = Math.max(0, Math.min(width, sourceX))
- sourceY = Math.max(0, Math.min(width, sourceY))
- targetX = Math.max(0, Math.min(width, targetX))
- targetY = Math.max(0, Math.min(width, targetY))
-
- return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
- });
-
- if (!animate) {
- animate = true;
- force.stop();
- }
- }
-
- // highlight the paths between the selected node and the hovered node
- function findNextHopNode(from, d) {
- // d is the node that the mouse is over
- // from is the selected_node ....
- if (!from)
- return null;
-
- if (from == d)
- return selected_node;
-
- //QDR.log.debug("finding nextHop from: " + from.name + " to " + d.name);
- var sInfo = QDRService.management.topology.nodeInfo()[from.key];
-
- if (!sInfo) {
- QDR.log.warn("unable to find topology node info for " + from.key);
- return null;
- }
-
- // find the hovered name in the selected name's .router.node results
- if (!sInfo['router.node'])
- return null;
- var aAr = sInfo['router.node'].attributeNames;
- var vAr = sInfo['router.node'].results;
- for (var hIdx = 0; hIdx < vAr.length; ++hIdx) {
- var addrT = QDRService.utilities.valFor(aAr, vAr[hIdx], "id");
- if (addrT == d.name) {
- //QDR.log.debug("found " + d.name + " at " + hIdx);
- var nextHop = QDRService.utilities.valFor(aAr, vAr[hIdx], "nextHop");
- //QDR.log.debug("nextHop was " + nextHop);
- return (nextHop == null) ? nodeFor(addrT) : nodeFor(nextHop);
- }
- }
- return null;
- }
-
- function nodeFor(name) {
- for (var i = 0; i < nodes.length; ++i) {
- if (nodes[i].name == name)
- return nodes[i];
- }
- return null;
- }
-
- function linkFor(source, target) {
- for (var i = 0; i < links.length; ++i) {
- if ((links[i].source == source) && (links[i].target == target))
- return links[i];
- if ((links[i].source == target) && (links[i].target == source))
- return links[i];
- }
- // the selected node was a client/broker
- //QDR.log.debug("failed to find a link between ");
- //console.dump(source);
- //QDR.log.debug(" and ");
- //console.dump(target);
- return null;
- }
-
- function clearPopups() {
- d3.select("#crosssection").style("display", "none");
- $('.hastip').empty();
- d3.select("#multiple_details").style("display", "none")
- d3.select("#link_details").style("display", "none")
- d3.select('#node_context_menu').style('display', 'none');
-
- }
-
- function removeCrosssection() {
- d3.select("#crosssection svg g").transition()
- .duration(1000)
- .attr("transform", "scale(0)")
- .style("opacity", 0)
- .each("end", function (d) {
- d3.select("#crosssection svg").remove();
- d3.select("#crosssection").style("display","none");
- });
- d3.select("#multiple_details").transition()
- .duration(500)
- .style("opacity", 0)
- .each("end", function(d) {
- d3.select("#multiple_details").style("display", "none")
- stopUpdateConnectionsGrid();
- })
- hideLinkDetails();
- }
-
- function hideLinkDetails() {
- d3.select("#link_details").transition()
- .duration(500)
- .style("opacity", 0)
- .each("end", function(d) {
- d3.select("#link_details").style("display", "none")
- })
- }
-
- function clerAllHighlights() {
- for (var i = 0; i < links.length; ++i) {
- links[i]['highlighted'] = false;
- }
- for (var i=0; i<nodes.length; ++i) {
- nodes[i]['highlighted'] = false;
- }
- }
- // takes the nodes and links array of objects and adds svg elements for everything that hasn't already
- // been added
- function restart(start) {
- circle.call(force.drag);
-
- // path (link) group
- path = path.data(links, function(d) {return d.uid});
-
- // update existing links
- path.classed('selected', function(d) {
- return d === selected_link;
- })
- .classed('highlighted', function(d) {
- return d.highlighted;
- })
- .attr('marker-start', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- if (d.highlighted)
- sel = "-highlighted"
- return d.left ? 'url(' + urlPrefix + '#start-arrow' + sel + ')' : '';
- })
- .attr('marker-end', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- if (d.highlighted)
- sel = "-highlighted"
- return d.right ? 'url(' + urlPrefix + '#end-arrow' + sel + ')' : '';
- })
-
-
- // add new links. if links[] is longer than the existing paths, add a new path for each new element
- path.enter().append('svg:path')
- .attr('class', 'link')
- .attr('marker-start', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- return d.left ? 'url(' + urlPrefix + '#start-arrow' + sel + ')' : '';
- })
- .attr('marker-end', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- return d.right ? 'url(' + urlPrefix + '#end-arrow' + sel + ')' : '';
- })
- .classed('small', function(d) {
- return d.cls == 'small';
- })
- .on('mouseover', function(d) { // mouse over a path
- 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.management.topology.nodeInfo()[left.key];
- // loop through all the connections for left, and find the one for right
- 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];
- /// find the connection whose container is the right's name
- 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) {
- // use the non-interrouter node's connection info
- left = d.target;
- resultIndex = left.resultIndex;
- }
- updateForm(left.key, 'connection', resultIndex);
- }
-
- mousedown_link = d;
- selected_link = mousedown_link;
- restart();
- })
- .on('mouseout', function(d) { // mouse out of a path
- //QDR.log.debug("showing connections form");
- selected_link = null;
- restart();
- })
- // left click a path
- .on("click", function (d) {
- var clickPos = d3.mouse(this);
- d3.event.stopPropagation();
- clearPopups();
- var showCrossSection = function() {
- var diameter = 400;
- var format = d3.format(",d");
- var pack = d3.layout.pack()
- .size([diameter - 4, diameter - 4])
- .padding(-10)
- .value(function(d) { return d.size; });
-
- d3.select("#crosssection svg").remove();
- var svg = d3.select("#crosssection").append("svg")
- .attr("width", diameter)
- .attr("height", diameter)
-
- var rg = svg.append('svg:defs')
- .append('radialGradient')
- .attr("id", "cross-gradient")
- .attr("gradientTransform", "scale(2.0) translate(-0.5,-0.5)")
-
- rg
- .append('stop')
- .attr("offset", "0%")
- .attr("stop-color", "#feffff")
- rg
- .append('stop')
- .attr("offset", "40%")
- .attr("stop-color", "#cfe2f3")
-
- var svgg = svg.append("g")
- .attr("transform", "translate(2,2)");
-
- svgg
- .append("rect")
- .attr("x", 0)
- .attr("y", 0)
- .attr("width", 200)
- .attr("height", 200)
- .attr("class", "cross-rect")
- .attr("fill", "url("+urlPrefix+"#cross-gradient)")
-
- svgg
- .append("line")
- .attr("class", "cross-line")
- .attr({x1: 2, y1: 0, x2: 200, y2: 0})
- svgg
- .append("line")
- .attr("class", "cross-line")
- .attr({x1: 2, y1: 0, x2: 0, y2: 200})
-
-/*
- var simpleLine = d3.svg.line();
- svgg
- .append('path')
- .attr({
- d: simpleLine([[0,0],[0,200]]),
- stroke: '#000',
- 'stroke-width': '4px'
- });
- svgg
- .append('path')
- .attr({
- d: simpleLine([[0,0],[200,0]]),
- stroke: '#000',
- 'stroke-width': '4px'
- });
-*/
- var root = {
- name: " Links between " + d.source.name + " and " + d.target.name,
- children: []
- }
- 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) {
- root.attributeNames = connections.attributeNames;
- root.obj = connection;
- root.desc = "Connection";
- return true; // stop looping after 1 match
- }
- return false;
- })
-
- // find router.links where link.remoteContainer is d.source.name
- 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');
- var linkTypeIndex = links.attributeNames.indexOf('linkType');
- var nameIndex = links.attributeNames.indexOf('name');
- var linkDirIndex = links.attributeNames.indexOf('linkDir');
-
- if (roleIndex < 0 || identityIndex < 0 || connectionIdIndex < 0
- || linkTypeIndex < 0 || nameIndex < 0 || linkDirIndex < 0)
- return;
- links.results.forEach ( function (link) {
- if (root.obj && link[connectionIdIndex] == root.obj[identityIndex] && link[linkTypeIndex] == root.obj[roleIndex])
- root.children.push (
- { name: " " + link[linkDirIndex] + " ",
- size: 100,
- obj: link,
- desc: "Link",
- attributeNames: links.attributeNames
- })
- })
- if (root.children.length == 0)
- return;
- var node = svgg.datum(root).selectAll(".node")
- .data(pack.nodes)
- .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)" : ""); })
- node.append("circle")
- .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.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);
- });
- svgg.attr("transform", "translate(2,2) scale(0.01)")
-
- var bounds = $("#topology").position()
- d3.select("#crosssection")
- .style("display", "block")
- .style("left", (clickPos[0] + bounds.left) + "px")
- .style("top", (clickPos[1] + bounds.top) + "px")
-
- svgg.transition()
- .attr("transform", "translate(2,2) scale(1)")
- .each("end", function () {
- d3.selectAll("#crosssection g.leaf text").attr("dy", ".3em")
- })
- }
- QDRService.management.topology.ensureEntities(d.source.key, {entity: 'router.link', force: true}, showCrossSection)
- })
- // remove old links
- path.exit().remove();
-
-
- // circle (node) group
- // nodes are known by id
- circle = circle.data(nodes, function(d) {
- return d.name;
- });
-
- // update existing nodes visual states
- circle.selectAll('circle')
- .classed('highlighted', function(d) {
- return d.highlighted;
- })
- .classed('selected', function(d) {
- return (d === selected_node)
- })
- .classed('fixed', function(d) {
- return d.fixed & 1
- })
-
- // add new circle nodes. if nodes[] is longer than the existing paths, add a new path for each new element
- var g = circle.enter().append('svg:g')
- .classed('multiple', function(d) {
- return (d.normals && d.normals.length > 1)
- })
-
- var appendCircle = function(g) {
- // add new circles and set their attr/class/behavior
- return g.append('svg:circle')
- .attr('class', 'node')
- .attr('r', function(d) {
- return radii[d.nodeType]
- })
- .attr('fill', function (d) {
- if (d.cdir === 'both' && !QDRService.utilities.isConsole(d)) {
- return 'url(' + urlPrefix + '#half-circle)'
- }
- return null;
- })
- .classed('fixed', function(d) {
- return d.fixed & 1
- })
- .classed('normal', function(d) {
- return d.nodeType == 'normal' || QDRService.utilities.isConsole(d)
- })
- .classed('in', function(d) {
- return d.cdir == 'in'
- })
- .classed('out', function(d) {
- return d.cdir == 'out'
- })
- .classed('inout', function(d) {
- return d.cdir == 'both'
- })
- .classed('inter-router', function(d) {
- return d.nodeType == 'inter-router'
- })
- .classed('on-demand', function(d) {
- return d.nodeType == 'on-demand'
- })
- .classed('console', function(d) {
- return QDRService.utilities.isConsole(d)
- })
- .classed('artemis', function(d) {
- return QDRService.utilities.isArtemis(d)
- })
- .classed('qpid-cpp', function(d) {
- return QDRService.utilities.isQpid(d)
- })
- .classed('route-container', function (d) {
- 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
- })
- }
- appendCircle(g)
- .on('mouseover', function(d) { // mouseover a circle
- if (!selected_node && !mousedown_node) {
- if (d.nodeType === 'inter-router') {
- //QDR.log.debug("showing general form");
- updateForm(d.key, 'router', 0);
- } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand' || d.nodeType === 'route-container') {
- //QDR.log.debug("showing connections form");
- updateForm(d.key, 'connection', d.resultIndex);
- }
- }
-
- if (d === mousedown_node)
- return;
- //if (d === selected_node)
- // return;
- // enlarge target node
- d3.select(this).attr('transform', 'scale(1.1)');
- // highlight the next-hop route from the selected node to this node
- //mousedown_node = null;
-
- if (!selected_node) {
- return;
- }
- clerAllHighlights()
- // we need .router.node info to highlight hops
- 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();
- })
- })
- .on('mouseout', function(d) { // mouse out for a circle
- // unenlarge target node
- d3.select(this).attr('transform', '');
- clerAllHighlights()
- mouseover_node = null;
- restart();
- })
- .on('mousedown', function(d) { // mouse down for circle
- if (d3.event.button !== 0) { // ignore all but left button
- return;
- }
- mousedown_node = d;
- // mouse position relative to svg
- initial_mouse_down_position = d3.mouse(this.parentNode.parentNode.parentNode).slice();
- })
- .on('mouseup', function(d) { // mouse up for circle
- if (!mousedown_node)
- return;
-
- selected_link = null;
- // unenlarge target node
- d3.select(this).attr('transform', '');
-
- // check for drag
- mouseup_node = d;
-
- var mySvg = this.parentNode.parentNode.parentNode;
- // if we dragged the node, make it fixed
- var cur_mouse = d3.mouse(mySvg);
- if (cur_mouse[0] != initial_mouse_down_position[0] ||
- cur_mouse[1] != initial_mouse_down_position[1]) {
- d.fixed = true;
- setNodesFixed(d.name, true)
- resetMouseVars();
- restart();
- return;
- }
-
- // if this node was selected, unselect it
- if (mousedown_node === selected_node) {
- selected_node = null;
- } else {
- if (d.nodeType !== 'normal' && d.nodeType !== 'on-demand')
- selected_node = mousedown_node;
- }
- clerAllHighlights()
- mousedown_node = null;
- if (!$scope.$$phase) $scope.$apply()
- restart(false);
-
- })
- .on("dblclick", function(d) { // circle
- if (d.fixed) {
- d.fixed = false
- setNodesFixed(d.name, false)
- restart() // redraw the node without a dashed line
- force.start(); // let the nodes move to a new position
- }
- if (QDRService.management.topology.nameFromId(d.key) == '__internal__') {
- editNode();
- if (!$scope.$$phase) $scope.$apply()
- }
- })
- .on("contextmenu", function(d) { // circle
- $(document).click();
- d3.event.preventDefault();
- var rm = relativeMouse()
- d3.select('#node_context_menu')
- .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)
- return;
- // clicked on a circle
- clearPopups();
- if (!d.normals) {
- // circle was a router or a broker
- if (QDRService.utilities.isArtemis(d)) {
- var artemisPath = '/jmx/attributes?tab=artemis&con=Artemis'
- if (QDR.isStandalone)
- window.location = $location.protocol() + '://localhost:8161/hawtio' + artemisPath
- else
- $location.path(artemisPath)
- }
- return;
- }
- clickPos = d3.mouse(this);
- d3.event.stopPropagation();
- startUpdateConnectionsGrid(d);
- })
- //.attr("transform", function (d) {return "scale(" + (d.nodeType === 'normal' ? .5 : 1) + ")"})
- //.transition().duration(function (d) {return d.nodeType === 'normal' ? 3000 : 0}).ease("elastic").attr("transform", "scale(1)")
-
- var appendContent = function(g) {
- // show node IDs
- g.append('svg:text')
- .attr('x', 0)
- .attr('y', function(d) {
- var y = 7;
- if (QDRService.utilities.isArtemis(d))
- y = 8;
- else if (QDRService.utilities.isQpid(d))
- y = 9;
- else if (d.nodeType === 'inter-router')
- y = 4;
- else if (d.nodeType === 'route-container')
- y = 5;
- return y;
- })
- .attr('class', 'id')
- .classed('console', function(d) {
- return QDRService.utilities.isConsole(d)
- })
- .classed('normal', function(d) {
- return d.nodeType === 'normal'
- })
- .classed('on-demand', function(d) {
- return d.nodeType === 'on-demand'
- })
- .classed('artemis', function(d) {
- return QDRService.utilities.isArtemis(d)
- })
- .classed('qpid-cpp', function(d) {
- return QDRService.utilities.isQpid(d)
- })
- .text(function(d) {
- if (QDRService.utilities.isConsole(d)) {
- return '\uf108'; // icon-desktop for this console
- } else if (QDRService.utilities.isArtemis(d)) {
- return '\ue900'
- } else if (QDRService.utilities.isQpid(d)) {
- return '\ue901';
- } else if (d.nodeType === 'route-container') {
- return d.properties.product ? d.properties.product[0].toUpperCase() : 'S'
- } else if (d.nodeType === 'normal')
- return '\uf109'; // icon-laptop for clients
- return d.name.length > 7 ? d.name.substr(0, 6) + '...' : d.name;
- });
- }
-
- appendContent(g)
-
- var appendTitle = function(g) {
- g.append("svg:title").text(function(d) {
- var x = '';
- if (d.normals && d.normals.length > 1)
- x = " x " + d.normals.length;
- if (QDRService.utilities.isConsole(d)) {
- return 'Dispatch console' + x
- } else if (QDRService.utilities.isArtemis(d)) {
- return 'Broker - Artemis' + x
- } else if (d.properties.product == 'qpid-cpp') {
- return 'Broker - qpid-cpp' + x
- } else if (d.properties.product) {
- return d.properties.product
- } else if (d.cdir === 'in')
- return 'Sender' + x
- else if (d.cdir === 'out')
- return 'Receiver' + x
- else if (d.cdir === 'both')
- return 'Sender/Receiver' + x
- return d.nodeType == 'normal' ? 'client' + x : (d.nodeType == 'on-demand' ? 'broker' : 'Router ' + d.name)
- })
- }
- appendTitle(g);
-
- // remove old nodes
- circle.exit().remove();
-
- // add subcircles
- svg.selectAll('.subcircle').remove();
- var multiples = svg.selectAll('.multiple')
- multiples.each(function(d) {
- d.normals.forEach(function(n, i) {
- if (i < d.normals.length - 1 && i < 3) // only show a few shadow circles
- this.insert('svg:circle', ":first-child")
- .attr('class', 'subcircle node')
- .attr('r', 15 - i)
- .attr('transform', "translate(" + 4 * (i + 1) + ", 0)")
- }, d3.select(this))
- })
-
- // dynamically create the legend based on which node types are present
- // the legend
- d3.select("#svg_legend svg").remove();
- lsvg = d3.select("#svg_legend")
- .append('svg')
- .attr('id', 'svglegend')
- lsvg = lsvg.append('svg:g')
- .attr('transform', 'translate(' + (radii['inter-router'] + 2) + ',' + (radii['inter-router'] + 2) + ')')
- .selectAll('g');
- var legendNodes = [];
- legendNodes.push(aNode("Router", "", "inter-router", '', undefined, 0, 0, 0, 0, false, {}))
-
- if (!svg.selectAll('circle.console').empty()) {
- legendNodes.push(aNode("Console", "", "normal", '', undefined, 1, 0, 0, 0, false, {
- console_identifier: 'Dispatch console'
- }))
- }
- if (!svg.selectAll('circle.client.in').empty()) {
- var node = aNode("Sender", "", "normal", '', undefined, 2, 0, 0, 0, false, {})
- node.cdir = "in"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.client.out').empty()) {
- var node = aNode("Receiver", "", "normal", '', undefined, 3, 0, 0, 0, false, {})
- node.cdir = "out"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.client.inout').empty()) {
- var node = aNode("Sender/Receiver", "", "normal", '', undefined, 4, 0, 0, 0, false, {})
- node.cdir = "both"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.qpid-cpp').empty()) {
- legendNodes.push(aNode("Qpid broker", "", "route-container", '', undefined, 5, 0, 0, 0, false, {
- product: 'qpid-cpp'
- }))
- }
- if (!svg.selectAll('circle.artemis').empty()) {
- legendNodes.push(aNode("Artemis broker", "", "route-container", '', undefined, 6, 0, 0, 0, false,
- {product: 'apache-activemq-artemis'}))
- }
- if (!svg.selectAll('circle.route-container').empty()) {
- legendNodes.push(aNode("Service", "", "route-container", 'external-service', undefined, 7, 0, 0, 0, false,
- {product: ' External Service'}))
- }
- lsvg = lsvg.data(legendNodes, function(d) {
- return d.key;
- });
- var lg = lsvg.enter().append('svg:g')
- .attr('transform', function(d, i) {
- // 45px between lines and add 10px space after 1st line
- return "translate(0, " + (45 * i + (i > 0 ? 10 : 0)) + ")"
- })
-
- appendCircle(lg)
- appendContent(lg)
- appendTitle(lg)
- lg.append('svg:text')
- .attr('x', 35)
- .attr('y', 6)
- .attr('class', "label")
- .text(function(d) {
- return d.key
- })
- lsvg.exit().remove();
- var svgEl = document.getElementById('svglegend')
- if (svgEl) {
- var bb;
- // firefox can throw an exception on getBBox on an svg element
- try {
- bb = svgEl.getBBox();
- } catch (e) {
- bb = {
- y: 0,
- height: 200,
- x: 0,
- width: 200
- }
- }
- svgEl.style.height = (bb.y + bb.height) + 'px';
- svgEl.style.width = (bb.x + bb.width) + 'px';
- }
-
- if (!mousedown_node || !selected_node)
- return;
-
- if (!start)
- return;
- // set the graph in motion
- //QDR.log.debug("mousedown_node is " + mousedown_node);
- force.start();
-
- }
-
- var startUpdateConnectionsGrid = function(d) {
- // called after each topology update
- var extendConnections = function() {
- // force a fetch of the links for this node
- 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;
- // find updated normals for d
- d3.selectAll('.normal')
- .each(function(newd) {
- if (newd.id == d.id && newd.name == d.name) {
- normals = newd.normals;
- }
- });
- if (normals) {
- normals.forEach(function(n) {
- 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.utilities.flatten(links.attributeNames, link)
- l.owningAddr = ll.owningAddr
- l.dir = ll.linkDir
- if (l.owningAddr && l.owningAddr.length > 2)
- if (l.owningAddr[0] === 'M')
- l.owningAddr = l.owningAddr.substr(2)
- else
- l.owningAddr = l.owningAddr.substr(1)
-
- l.deliveryCount = ll.deliveryCount
- l.uncounts = QDRService.utilities.pretty(ll.undeliveredCount + ll.unsettledCount)
- l.adminStatus = ll.adminStatus;
- l.operStatus = ll.operStatus;
- l.identity = ll.identity
- l.connectionId = ll.connectionId
- l.nodeId = n.key
- l.type = ll.type
- l.name = ll.name
-
- // TODO: remove this fake quiescing/reviving logic when the routers do the work
- initConnState(n.connectionId)
- if ($scope.quiesceState[n.connectionId].linkStates[l.identity])
- l.adminStatus = $scope.quiesceState[n.connectionId].linkStates[l.identity];
- if ($scope.quiesceState[n.connectionId].state == 'quiescing') {
- if (l.adminStatus === 'enabled') {
- // 25% chance of switching
- var chance = Math.floor(Math.random() * 2);
- if (chance == 1) {
- l.adminStatus = 'disabled';
- $scope.quiesceState[n.connectionId].linkStates[l.identity] = 'disabled';
- }
- }
- }
- if ($scope.quiesceState[n.connectionId].state == 'reviving') {
- if (l.adminStatus === 'disabled') {
- // 25% chance of switching
- var chance = Math.floor(Math.random() * 2);
- if (chance == 1) {
- l.adminStatus = 'enabled';
- $scope.quiesceState[n.connectionId].linkStates[l.identity] = 'enabled';
- }
- }
- }
- QDR.log.debug("pushing link state for " + l.owningAddr + " status: " + l.adminStatus)
-
- n.linkData.push(l)
- }
- })
- $scope.multiData.push(n)
- if (n.connectionId == $scope.connectionId)
- $scope.linkData = n.linkData;
- initConnState(n.connectionId)
- $scope.multiDetails.updateState(n)
- })
- }
- $scope.$apply();
-
- d3.select('#multiple_details')
- .style({
- height: ((normals.length + 1) * 30) + 40 + "px",
- 'overflow-y': normals.length > 10 ? 'scroll' : 'hidden'
- })
- })
- }
- $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.management.topology.addUpdatedAction("normalsStats", extendConnections)
- // call the function that gets the links right now
- extendConnections();
- clearPopups();
- var display = 'block'
- var left = mouseX + $(document).scrollLeft()
- if (d.normals.length === 1) {
- display = 'none'
- left = left - 30;
- mouseY = mouseY - 20
- }
- var rm = relativeMouse()
- d3.select('#multiple_details')
- .style({
- display: display,
- opacity: 1,
- left: rm.left + "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.management.topology.ensureEntities(d.key, {entity: "router.link", force: true}, function () {
- $scope.multiDetails.showLinksList({
- entity: d
- })
- })
- }
- }
- var stopUpdateConnectionsGrid = function() {
- QDRService.management.topology.delUpdatedAction("normalsStats");
- }
-
- var initConnState = function(id) {
- if (!angular.isDefined($scope.quiesceState[id])) {
- $scope.quiesceState[id] = {
- state: 'enabled',
- buttonText: 'Quiesce',
- buttonDisabled: false,
- linkStates: {}
- }
- }
- }
-
- function nextHop(thisNode, d) {
- if ((thisNode) && (thisNode != d)) {
- var target = findNextHopNode(thisNode, d);
- //QDR.log.debug("highlight link from node ");
- //console.dump(nodeFor(selected_node.name));
- //console.dump(target);
- if (target) {
- var hnode = nodeFor(thisNode.name)
- var hlLink = linkFor(hnode, target);
- //QDR.log.debug("need to highlight");
- //console.dump(hlLink);
- if (hlLink) {
- hlLink['highlighted'] = true;
- hnode['highlighted'] = true
- }
- else
- target = null;
- }
- nextHop(target, d);
- }
- if (thisNode == d) {
- var hnode = nodeFor(thisNode.name)
- hnode['highlighted'] = true
- }
- }
-
-
- function mousedown() {
- // prevent I-bar on drag
- //d3.event.preventDefault();
-
- // because :active only works in WebKit?
- svg.classed('active', true);
- }
-
- 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.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 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'])
- return -1
- if (nodeInfo[key]['connection'].results.length != savedKeys[key]) {
- return -1;
- }
- }
- return 0;
- };
-
- function saveChanged() {
- savedKeys = {};
- 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;
- }
- };
- // we are about to leave the page, save the node positions
- $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
- //QDR.log.debug("locationChangeStart");
- savePositions()
- });
- // When the DOM element is removed from the page,
- // AngularJS will trigger the $destroy event on
- // the scope
- $scope.$on("$destroy", function(event) {
- //QDR.log.debug("scope on destroy");
- savePositions();
- 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);
- });
-
- function handleInitialUpdate() {
- // we only need to update connections during steady-state
- QDRService.management.topology.setUpdateEntities(["connection"])
- // we currently have all entities available on all routers
- saveChanged();
- initForceGraph();
- // after the graph is displayed fetch all .router.node info. This is done so highlighting between nodes
- // doesn't incur a delay
- QDRService.management.topology.addUpdateEntities({entity: "router.node", attrs: ["id","nextHop"]})
- // call this function every time a background update is done
- 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.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.management.topology.nodeInfo();
- initializeNodes(nodeInfo)
-
- var unknowns = []
- initializeLinks(nodeInfo, unknowns)
- if (unknowns.length > 0) {
- resolveUnknowns(nodeInfo, unknowns)
- }
- else {
- force.nodes(nodes).links(links).start();
- restart();
- }
-
- //initForceGraph();
- } else {
- //QDR.log.debug("topology didn't change")
- }
-
- })
- }
-
- function setupInitialUpdate() {
- // make sure all router nodes have .connection info. if not then fetch any missing info
- QDRService.management.topology.ensureAllEntities(
-// [{entity: ".connection"}, {entity: ".router.lin.router.link", attrs: ["linkType","connectionId","linkDir"]}],
- [{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.management.topology.startUpdating(false);
-
- }
- ]);
-
- return QDR;
-
-}(QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[4/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 3cd3430..0000000
--- a/console/stand-alone/plugin/js/qdrList.js
+++ /dev/null
@@ -1,901 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- /**
- * Controller for the main interface
- */
- QDR.module.controller("QDR.ListController", ['$scope', '$location', '$uibModal', '$filter', '$timeout', 'QDRService', 'QDRChartService', 'uiGridConstants', '$sce',
- function ($scope, $location, $uibModal, $filter, $timeout, QDRService, QDRChartService, uiGridConstants, $sce) {
-
- 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[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'];
- $scope.nodes = []
- $scope.currentNode = undefined;
- $scope.modes = [
- {
- content: '<a><i class="icon-list"></i> Attributes</a>',
- id: 'attributes',
- op: 'READ',
- title: "View router attributes",
- isValid: function () { return true; }
- },
- {
- content: '<a><i class="icon-edit"></i> Update</a>',
- id: 'operations',
- op: 'UPDATE',
- title: "Update this attribute",
- isValid: function () {
- return $scope.operations.indexOf(this.op) > -1
- }
- },
- {
- content: '<a><i class="icon-plus"></i> Create</a>',
- id: 'operations',
- op: 'CREATE',
- title: "Create a new attribute",
- isValid: function () { return $scope.operations.indexOf(this.op) > -1 }
- },
- {
- content: '<a><i class="icon-remove"></i> Delete</a>',
- id: 'delete',
- op: 'DELETE',
- title: "Delete",
- isValid: function () { return $scope.operations.indexOf(this.op) > -1 }
- },
- {
- content: '<a><i class="icon-eye-open"></i> Fetch</a>',
- id: 'log',
- op: 'GET-LOG',
- title: "Fetch recent log entries",
- isValid: function () { return ($scope.selectedEntity === 'log') }
- }
- ];
- $scope.operations = []
- $scope.currentMode = $scope.modes[0];
- $scope.isModeSelected = function (mode) {
- return mode === $scope.currentMode;
- }
- $scope.fetchingLog = false;
- $scope.selectMode = function (mode) {
- $scope.currentMode = mode;
- if (mode.id === 'log') {
- $scope.logResults = [];
- $scope.fetchingLog = true;
- var entity; // undefined since it is not supported in the GET-LOG call
- 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', response.context.message.statusDescription);
- QDR.log.error('Error ' + response.context.message.statusDescription)
- return;
- }
- $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.isValid = function (mode) {
- return mode.isValid()
- }
-
- $scope.expandAll = function () {
- $("#entityTree").fancytree("getTree").visit(function(node){
- node.setExpanded(true);
- });
- }
- $scope.contractAll = function () {
- $("#entityTree").fancytree("getTree").visit(function(node){
- node.setExpanded(false);
- });
- }
-
- if (!QDRService.management.connection.is_connected()) {
- // we are not connected. we probably got here from a bookmark or manual page reload
- QDR.redirectWhenConnected($location, "list")
- return;
- }
-
- $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.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.utilities.isConsole(QDRService.management.topology.getConnForLink(link))
- return isConsole ? "console" : row.linkType.value;
- },
- "router.address": function (row) {
- 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
- }
- }
-
- var lookupOperations = function () {
- 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 saveExpanded = function () {
- // save the list of entities that are expanded
- var tree = $("#entityTree").fancytree("getTree");
- var list = []
- tree.visit( function (tnode) {
- if (tnode.isExpanded()) {
- list.push(tnode.key)
- }
- })
- localStorage[ListExpandedKey] = JSON.stringify(list)
- }
-
- 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 onTreeNodeActivated = function (event, data) {
- $scope.ActivatedKey = data.node.key
- var selectedNode = data.node
- $scope.selectedTreeNode = data.node
- $timeout( function () {
- if ($scope.currentMode.id === 'operations')
- $scope.currentMode = $scope.modes[0];
- else if ($scope.currentMode.id === 'log')
- $scope.selectMode($scope.currentMode)
- else if ($scope.currentMode.id === 'delete') {
- // clicked on a tree node while on the delete screen -> switch to attribute screen
- $scope.currentMode = $scope.modes[0];
- }
- if (selectedNode.data.typeName === "entity") {
- $scope.selectedEntity = selectedNode.key;
- $scope.operations = lookupOperations()
- updateExpandedEntities()
- } else if (selectedNode.data.typeName === 'attribute') {
- $scope.selectedEntity = selectedNode.parent.key;
- $scope.operations = lookupOperations()
- $scope.selectedRecordName = selectedNode.key;
- updateDetails(selectedNode.data.details); // update the table on the right
- } else if (selectedNode.data.typeName === 'none') {
- $scope.selectedEntity = selectedNode.parent.key;
- $scope.selectedRecordName = $scope.selectedEntity
- updateDetails(fromSchema($scope.selectedEntity));
-
- }
- })
- }
- 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.management.schema().entityTypes[entityName]
- for (attr in schemaEntity.attributes) {
- var entity = schemaEntity.attributes[attr]
- var value = ""
- if (angular.isDefined(entity['default'])) {
- if (entity['type'] === 'integer')
- value = parseInt(entity['default']) // some default values that are marked as integer are passed as string
- else
- value = entity['default']
- }
- row[attr] = {
- value: value,
- type: entity.type,
- graph: false,
- title: entity.description,
- aggregate: false,
- aggregateTip: '',
- 'default': entity['default']
- }
- }
- return row;
- }
- $scope.hasCreate = function () {
- var schemaEntity = QDRService.management.schema().entityTypes[$scope.selectedEntity]
- return (schemaEntity.operations.indexOf("CREATE") > -1)
- }
-
- 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 on the left
- var updateTreeChildren = function (entity, tableRows, expand) {
- var tree = $("#entityTree").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 updatedDetails = false;
- if (tableRows.length == 0) {
- var newNode = {
- extraClasses: "no-data",
- typeName: "none",
- title: "no data",
- key: node.key + ".1"
- }
- node.addNode(newNode)
- if (expand) {
- updateDetails(fromSchema(entity));
- $scope.selectedRecordName = entity;
- }
- } else {
- var children = tableRows.map( function (row) {
- var addClass = entity;
- if (classOverrides[entity]) {
- addClass += " " + classOverrides[entity](row, $scope.currentNode.id);
- }
- var child = {
- typeName: "attribute",
- extraClasses: addClass,
- tooltip: addClass,
- key: row.name.value,
- title: row.name.value,
- details: row
- }
- return child
- })
- node.addNode(children)
- }
- // 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
- }
- }
- 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)
- // don't allow HTML in the tree titles
- $('.fancytree-title').each( function (idx) {
- var unsafe = $(this).html()
- $(this).html(unsafe.replace(/</g, "<").replace(/>/g, ">"))
- })
- }
- $(window).resize(resizer);
-
- var schemaProps = function (entityName, key, currentNode) {
- var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean', map: 'textarea'};
-
- var entity = QDRService.management.schema().entityTypes[entityName]
- var value = entity.attributes[key]
- // skip identity and depricated fields
- if (!value)
- return {input: 'input', type: 'disabled', required: false, selected: "", rawtype: 'string', disabled: true, 'default': ''}
- var description = value.description || ""
- var val = value['default'];
- var disabled = (key == 'identity' || description.startsWith('Deprecated'))
- // special cases
- if (entityName == 'log' && key == 'module') {
- return {input: 'input', type: 'disabled', required: false, selected: "", rawtype: 'string', disabled: true, 'default': ''}
- }
- if (entityName === 'linkRoutePattern' && key === 'connector') {
- // turn input into a select. the values will be populated later
- value.type = []
- // find all the connector names and populate the select
- 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]})
- return true;
- }
- })
- });
- }
- return { name: key,
- humanName: QDRService.utilities.humanify(key),
- description:value.description,
- type: disabled ? 'disabled' : typeMap[value.type],
- rawtype: value.type,
- input: typeof value.type == 'string' ? value.type == 'boolean' ? 'boolean' : 'input'
- : 'select',
- selected: val ? val : undefined,
- 'default': value['default'],
- value: val,
- required: value.required,
- unique: value.unique,
- disabled: disabled
- };
- }
- $scope.getAttributeValue = function (attribute) {
- var value = attribute.attributeValue;
- if ($scope.currentMode.op === "CREATE" && attribute.name === 'identity')
- value = "<assigned by system>"
- return value;
- }
-
- // update the table on the right
- var updateDetails = function (row) {
- var details = [];
- $scope.detailsObject = {};
- var attrs = Object.keys(row).sort();
- attrs.forEach( function (attr) {
- var changed = $scope.detailFields.filter(function (old) {
- return (old.name === attr) ? old.graph && old.rawValue != row[attr].value : false;
- })
- var schemaEntity = schemaProps($scope.selectedEntity, attr, $scope.currentNode)
- details.push( {
- 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,
- chartExists: (QDRChartService.isAttrCharted($scope.currentNode.id, $scope.selectedEntity, row.name.value, attr)),
- aggchartExists: (QDRChartService.isAttrCharted($scope.currentNode.id, $scope.selectedEntity, row.name.value, attr, true)),
- aggregateValue: QDRService.utilities.pretty(row[attr].aggregate),
- aggregateTip: row[attr].aggregateTip,
-
- input: schemaEntity.input,
- type: schemaEntity.type,
- required: schemaEntity.required,
- unique: schemaEntity.unique,
- selected: schemaEntity.selected,
- rawtype: schemaEntity.rawtype,
- disabled: schemaEntity.disabled,
- 'default': schemaEntity['default']
- })
- $scope.detailsObject[attr] = row[attr].value;
- })
- $scope.detailFields = details;
- aggregateColumn();
- }
-
- // called from html ng-style="getTableHeight()"
- $scope.getTableHeight = function () {
- return {
- height: ($scope.detailFields.length * 30 + 40) + 'px'
- }
- }
-
- var updateExpandedEntities = function () {
- 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)
-
- if (!tree.getActiveNode()) {
- if ($scope.ActivatedKey) {
- var node = tree.getNodeByKey($scope.ActivatedKey)
- if (node) {
- node.setActive(true, {noEvents: true})
- }
- }
- if (!tree.getActiveNode()) {
- var first = tree.getFirstChild()
- if (first) {
- var child = first.getFirstChild()
- if (child)
- first = child
- }
- first.setActive(true)
- }
- }
-
- d3.selectAll('.ui-effects-placeholder').style('height', '0px')
-
- // once all expanded tree nodes have been update, schedule another update
- updateIntervalHandle = setTimeout(updateExpandedEntities, updateInterval)
- })
- }
- }
-
- $scope.selectNode = function(node) {
- $scope.selectedNode = node.name;
- $scope.selectedNodeId = node.id;
- $timeout(setCurrentNode);
- };
- $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;
- $scope.operations = lookupOperations()
- }
- })
- $scope.$watch('selectedNode', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- localStorage['QDRSelectedNode'] = $scope.selectedNode;
- localStorage['QDRSelectedNodeId'] = $scope.selectedNodeId;
- }
- })
- $scope.$watch('selectedRecordName', function(newValue, oldValue) {
- if (newValue != oldValue) {
- localStorage['QDRSelectedRecordName'] = $scope.selectedRecordName;
- }
- })
-
- /* Called periodically to refresh the data on the page */
- 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;
- }
-
- var gotNodeInfo = function (nodeName, dotentity, response) {
- var tableRows = [];
- var records = response.results;
- var aggregates = response.aggregates;
- var attributeNames = response.attributeNames;
- // 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.management.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) {
- 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) {
- 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.sort( function (a, b) { return a.name.value.localeCompare(b.name.value) })
- selectRow({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 nodeIdList = QDRService.management.topology.nodeIdList();
- QDRService.management.topology.getMultipleNodeInfo(nodeIdList, entity, [], gotNodeInfo, $scope.selectedNodeId);
- } else {
- QDRService.management.topology.fetchEntity($scope.selectedNodeId, entity, [], gotNodeInfo);
- }
- };
-
- // tableRows are the records that were returned, this populates the left hand tree on the page
- var selectRow = function (info) {
- updateTreeChildren(info.entity, info.rows, info.expand);
- //fixTooltips();
- }
- $scope.detailFields = [];
-
- $scope.addToGraph = function(rowEntity) {
- var chart = QDRChartService.registerChart(
- {nodeId: $scope.selectedNodeId,
- entity: $scope.selectedEntity,
- name: $scope.selectedRecordName,
- attr: rowEntity.name,
- forceCreate: true});
-
- doDialog('tmplChartConfig.html', chart);
- }
-
- $scope.addAllToGraph = function(rowEntity) {
- var chart = QDRChartService.registerChart({
- nodeId: $scope.selectedNodeId,
- entity: $scope.selectedEntity,
- name: $scope.selectedRecordName,
- attr: rowEntity.name,
- type: "rate",
- rateWindow: updateInterval,
- visibleDuration: 0.25,
- forceCreate: true,
- aggregate: true});
- doDialog('tmplChartConfig.html', chart);
- }
-
- // The ui-popover dynamic html
- $scope.aggregateTip = ''
- // disable popover tips for non-integer cells
- $scope.aggregateTipEnabled = function (row) {
- var tip = row.entity.aggregateTip
- return (tip && tip.length) ? "true" : "false"
- }
- // convert the aggregate data into a table for the popover tip
- $scope.genAggregateTip = function (row) {
- var tip = row.entity.aggregateTip
- if (tip && tip.length) {
- var data = angular.fromJson(tip);
- var table = "<table class='tiptable'><tbody>";
- data.forEach (function (row) {
- table += "<tr>";
- table += "<td>" + row.node + "</td><td align='right'>" + QDRService.utilities.pretty(row.val) + "</td>";
- table += "</tr>"
- })
- table += "</tbody></table>"
- $scope.aggregateTip = $sce.trustAsHtml(table)
- }
- }
- var aggregateColumn = function () {
- if ((aggregateEntities.indexOf($scope.selectedEntity) > -1 && $scope.detailCols.length != 3) ||
- (aggregateEntities.indexOf($scope.selectedEntity) == -1 && $scope.detailCols.length != 2)) {
- // column defs have to be reassigned and not spliced, so no push/pop
- $scope.detailCols = [
- {
- field: 'attributeName',
- displayName: 'Attribute',
- cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS | pretty}}<button ng-if="row.entity.graph" title="Click to view/add a graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'btn-success\': row.entity.chartExists}" class="btn"><i ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></button></div>'
- },
- {
- field: 'attributeValue',
- displayName: 'Value',
- cellTemplate: '<div class="ui-grid-cell-contents" ng-class="{\'changed\': row.entity.changed == 1}">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>'
- }
- ]
- if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
- $scope.detailCols.push(
- {
- width: '10%',
- field: 'aggregateValue',
- displayName: 'Aggregate',
- cellTemplate: '<div popover-enable="{{grid.appScope.aggregateTipEnabled(row)}}" uib-popover-html="grid.appScope.aggregateTip" popover-append-to-body="true" ng-mouseover="grid.appScope.genAggregateTip(row)" popover-trigger="\'mouseenter\'" class="listAggrValue ui-grid-cell-contents" ng-class="{\'changed\': row.entity.changed == 1}">{{COL_FIELD CUSTOM_FILTERS}} <button title="Click to view/add a graph" ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'btn-success\': row.entity.aggchartExists}" class="btn"><i ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></button></div>',
- cellClass: 'aggregate'
- }
- )
- }
- }
- if ($scope.selectedRecordName === "")
- $scope.detailCols = [];
-
- $scope.details.columnDefs = $scope.detailCols
- if ($scope.gridApi)
- $scope.gridApi.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );
- }
-
- $scope.gridApi = undefined;
- // 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: [
- {
- field: 'attributeName',
- displayName: 'Attribute',
- cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS | pretty}}<button ng-if="row.entity.graph" title="Click to view/add a graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'btn-success\': row.entity.chartExists}" class="btn"><i ng-class="{\'icon-bar-chart\': row.entity.graph == true }"></i></button></div>'
- },
- {
- field: 'attributeValue',
- displayName: 'Value',
- cellTemplate: '<div class="ui-grid-cell-contents" ng-class="{\'changed\': row.entity.changed == 1}">{{COL_FIELD CUSTOM_FILTERS | pretty}}</div>'
- }
- ],
- enableColumnResize: true,
- multiSelect: false,
- jqueryUIDraggable: true,
- onRegisterApi: function(gridApi) {
- $scope.gridApi = gridApi;
- }
- };
-
- $scope.$on("$destroy", function( event ) {
- clearTimeout(updateIntervalHandle)
- $(window).off("resize", resizer);
- });
-
- function gotMethodResponse (entity, context) {
- var statusCode = context.message.application_properties.statusCode;
- if (statusCode < 200 || statusCode >= 300) {
- var note = "Failed to " + $filter('Pascalcase')($scope.currentMode.op) + " " + entity + ": " + context.message.application_properties.statusDescription
- Core.notification('error', note);
- QDR.log.error('Error ' + note)
- } else {
- var note = entity + " " + $filter('Pascalcase')($scope.currentMode.op) + "d"
- Core.notification('success', note);
- QDR.log.debug('Success ' + note)
- $scope.selectMode($scope.modes[0]);
- }
- }
- $scope.ok = function () {
- var attributes = {}
- $scope.detailFields.forEach( function (field) {
- var value = field.rawValue;
- if (field.input === 'input') {
- if (field.type === 'text' || field.type === 'disabled')
- value = field.attributeValue;
- } else if (field.input === 'select') {
- value = field.selected;
- } else if (field.input === 'boolean') {
- value = field.rawValue
- }
- if (value === "")
- value = undefined;
-
- if ((value && value != field['default']) || field.required || (field.name === 'role')) {
- if (field.name !== 'identity')
- attributes[field.name] = value
- }
- })
- 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 identity = $scope.selectedTreeNode.data.details.identity.value
- var attributes = {type: $scope.selectedEntity, identity: identity}
- QDRService.management.connection.sendMethod($scope.currentNode.id, $scope.selectedEntity, attributes, $scope.currentMode.op)
- .then(function (response) {gotMethodResponse($scope.selectedEntity, response.context)})
- }
-
- function doDialog(template, chart) {
-
- var d = $uibModal.open({
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- templateUrl: QDR.templatePath + template,
- controller: "QDR.ChartDialogController",
- resolve: {
- chart: function() {
- return chart;
- },
- updateTick: function () {
- return function () {};
- },
- dashboard: function () {
- return $scope;
- },
- adding: function () {
- return true
- }
- }
- }).result.then(function(result) {
- QDRChartService.unRegisterChart(chart)
- });
- };
- var setCurrentNode = function () {
- $scope.nodes.some( function (node, i) {
- if (node.name === $scope.selectedNode) {
- $scope.currentNode = $scope.nodes[i]
- return true;
- }
- })
- }
-
- var treeReady = false;
- var serviceReady = false;
- $scope.largeNetwork = QDRService.management.topology.isLargeNetwork()
- if ($scope.largeNetwork)
- aggregateEntities = [];
-
- // called after we know for sure the schema is fetched and the routers are all ready
- QDRService.management.topology.addUpdatedAction("initList", function () {
- QDRService.management.topology.stopUpdating();
- QDRService.management.topology.delUpdatedAction("initList")
-
- $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")
- $location.search('org', "list");
- }
- if (!angular.isDefined($scope.selectedNode)) {
- //QDR.log.debug("selectedNode was " + $scope.selectedNode);
- if ($scope.nodes.length > 0) {
- $scope.selectedNode = $scope.nodes[0].name;
- $scope.selectedNodeId = $scope.nodes[0].id;
- //QDR.log.debug("forcing selectedNode to " + $scope.selectedNode);
- }
- }
- setCurrentNode();
- if ($scope.currentNode == undefined) {
- if ($scope.nodes.length > 0) {
- $scope.selectedNode = $scope.nodes[0].name;
- $scope.selectedNodeId = $scope.nodes[0].id;
- $scope.currentNode = $scope.nodes[0];
- }
- }
- var sortedEntities = Object.keys(QDRService.management.schema().entityTypes).sort();
- sortedEntities.forEach( function (entity) {
- if (excludedEntities.indexOf(entity) == -1) {
- if (!angular.isDefined($scope.selectedEntity))
- $scope.selectedEntity = entity;
- $scope.operations = lookupOperations()
- var e = new Folder(entity)
- e.typeName = "entity"
- e.key = entity
- e.expanded = (expandedList.indexOf(entity) > -1)
- var placeHolder = new Leaf("loading...")
- placeHolder.addClass = "loading"
- e.children = [placeHolder]
- entityTreeChildren.push(e)
- }
- })
- 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) {
- updateExpandedEntities();
- }
-
- var initTree = function () {
- if (!treeReady || !serviceReady)
- return;
- $('#entityTree').fancytree({
- activate: onTreeNodeActivated,
- expand: onTreeNodeExpanded,
- beforeActivate: onTreeNodeBeforeActivate,
- init: onTreeInitialized,
- selectMode: 1,
- autoCollapse: $scope.largeNetwork,
- activeVisible: !$scope.largeNetwork,
- clickFolderMode: 3,
- debugLevel: 0,
- extraClasses: {
- expander: 'fa-angle',
- connector: 'fancytree-no-connector'
- },
- source: entityTreeChildren
- })
- };
- QDRService.management.topology.ensureAllEntities({entity: "connection"}, function () {
- QDRService.management.topology.setUpdateEntities(["connection"])
- QDRService.management.topology.startUpdating(true);
- })
- }]);
-
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/js/qdrListChart.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrListChart.js b/console/stand-alone/plugin/js/qdrListChart.js
deleted file mode 100644
index af281ad..0000000
--- a/console/stand-alone/plugin/js/qdrListChart.js
+++ /dev/null
@@ -1,143 +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.
-*/
-/**
- * @module QDR
- */
-
-var QDR = (function(QDR) {
-
- QDR.module.controller('QDR.ListChartController', function ($scope, $uibModalInstance, $uibModal, $location, QDRService, QDRChartService, chart, nodeName) {
-
- $scope.chart = chart;
- $scope.dialogSvgChart = null;
- var updateTimer = null;
- $scope.svgDivId = "dialogChart"; // the div id for the svg chart
-
- $scope.showChartsPage = function () {
- cleanup();
- $uibModalInstance.close(true);
- $location.path(QDR.pluginRoot + "/charts");
- };
-
- $scope.addHChart = function () {
- QDRChartService.addHDash($scope.chart);
- cleanup();
- $uibModalInstance.close(true);
- }
-
- $scope.addToDashboardLink = function () {
- var href = "#/" + QDR.pluginName + "/charts";
- var size = angular.toJson({
- size_x: 2,
- size_y: 2
- });
-
- var params = angular.toJson({chid: $scope.chart.id()});
- var title = "Dispatch - " + nodeName;
- return "/hawtio/#/dashboard/add?tab=dashboard" +
- "&href=" + encodeURIComponent(href) +
- "&routeParams=" + encodeURIComponent(params) +
- "&title=" + encodeURIComponent(title) +
- "&size=" + encodeURIComponent(size);
- };
-
-
- $scope.addChartsPage = function () {
- QDRChartService.addDashboard($scope.chart);
- };
-
- $scope.delChartsPage = function () {
- QDRChartService.delDashboard($scope.chart);
- };
-
- $scope.isOnChartsPage = function () {
- return $scope.chart.dashboard;
- }
-
- var showChart = function () {
- // we need a width and height before generating the chart
- var div = angular.element("#pfDialogChart");
- if (!div.width()) {
- setTimeout(showChart, 100);
- return;
- }
- $scope.pfDialogSvgChart = new QDRChartService.pfAreaChart($scope.chart, 'pfDialogChart')
- updateDialogChart();
- }
- showChart();
-
- var updateDialogChart = function () {
- if ($scope.pfDialogSvgChart) {
- $scope.pfDialogSvgChart.tick();
- }
- if (updateTimer)
- clearTimeout(updateTimer)
- updateTimer = setTimeout(updateDialogChart, 1000);
- }
-
- var cleanup = function () {
- if (updateTimer) {
- clearTimeout(updateTimer);
- updateTimer = null;
- }
- if (!$scope.chart.hdash && !$scope.chart.dashboard)
- QDRChartService.unRegisterChart($scope.chart); // remove the chart
-
- }
- $scope.ok = function () {
- cleanup();
- $uibModalInstance.close(true);
- };
-
- $scope.editChart = function () {
- doDialog('tmplChartConfig.html', chart)
- }
-
- function doDialog(template, chart) {
-
- var d = $uibModal.open({
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- templateUrl: QDR.templatePath + template,
- controller: "QDR.ChartDialogController",
- resolve: {
- chart: function() {
- return chart;
- },
- updateTick: function () {
- return function () {};
- },
- dashboard: function () {
- return $scope;
- },
- adding: function () {
- return true
- }
- }
- }).result.then(function(result) {
- $scope.ok()
- });
- };
-
- });
-
- return QDR;
-
-} (QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[5/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 64797fa..0000000
--- a/console/stand-alone/plugin/html/tmplListTree.html
+++ /dev/null
@@ -1,42 +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
--->
-
-<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="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>
- <div ng-hide="largeNetwork" class="expand-collapse">
- <i class="icon-chevron-down clickable" title="Expand all nodes" ng-click="expandAll()"></i>
- <i class="icon-chevron-up clickable" title="Unexpand all nodes" ng-click="contractAll()"></i>
- </div>
- </div>
- <div class="pane-viewport">
- <div class="pane-content">
- <div class="treeContainer">
- <div id="entityTree" onSelect="onTreeSelected" onRoot="onRootReady" hideRoot="true"></div>
- <div ng-init="treeReady()"></div>
- </div>
- </div>
- </div>
- <div class="pane-bar"></div>
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 8bc9a13..0000000
--- a/console/stand-alone/plugin/html/tmplOverviewTree.html
+++ /dev/null
@@ -1,42 +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
--->
-
-<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="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">
- <i class="icon-chevron-down clickable" title="Expand all nodes" ng-click="expandAll()"></i>
- <i class="icon-chevron-up clickable" title="Unexpand all nodes" ng-click="contractAll()"></i>
- </div>
- </div>
- <div class="pane-viewport">
- <div class="pane-content">
- <div class="treeContainer ng-scope">
- <div id="overtree"></div>
- </div>
- </div>
- </div>
- <div class="pane-bar" ng-mousedown="startMoving($event)" ng-click="toggle()"></div>
- </div>
-</div>
-<div ng-init="overviewLoaded()"></div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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 81d716c..12bf784 100644
--- a/console/stand-alone/plugin/js/dispatchPlugin.js
+++ b/console/stand-alone/plugin/js/dispatchPlugin.js
@@ -48,9 +48,8 @@ var QDR = (function(QDR) {
*
* The top level path to this plugin's partials
*/
- QDR.srcBase = "plugin/";
+ QDR.srcBase = "node_modules/dispatch-console-pages/dist/";
QDR.templatePath = QDR.srcBase + "html/";
- QDR.cssPath = QDR.srcBase + "css/";
/**
* @property SETTINGS_KEY
* @type {string}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/js/dlgChartController.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/dlgChartController.js b/console/stand-alone/plugin/js/dlgChartController.js
deleted file mode 100644
index 1613cb6..0000000
--- a/console/stand-alone/plugin/js/dlgChartController.js
+++ /dev/null
@@ -1,202 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- // controller for the edit/configure chart dialog
- QDR.module.controller("QDR.ChartDialogController", function($scope, QDRChartService, $location, $uibModalInstance, chart, updateTick, dashboard, adding) {
- var dialogSvgChart = null;
- $scope.svgDivId = "dialogEditChart"; // the div id for the svg chart
-
- var updateTimer = null;
- $scope.chart = chart; // the underlying chart object from the dashboard
- $scope.dialogChart = $scope.chart.copy(); // the chart object for this dialog
- $scope.userTitle = $scope.chart.title();
-
- $scope.$watch('userTitle', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- $scope.dialogChart.title(newValue);
- dialogSvgChart.tick($scope.svgDivId);
- }
- })
- $scope.$watch("dialogChart.areaColor", function (newValue, oldValue) {
- if (newValue !== oldValue) {
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- })
- $scope.$watch("dialogChart.lineColor", function (newValue, oldValue) {
- if (newValue !== oldValue) {
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- })
- $scope.$watch("dialogChart.type", function (newValue, oldValue) {
- if (newValue !== oldValue) {
- if (dialogSvgChart) {
- dialogSvgChart.chart.visibleDuration = newValue === 'rate' ? 0.25 : 1
- dialogSvgChart.tick($scope.svgDivId);
- }
- }
- })
-
- // the stored rateWindow is in milliseconds, but the slider is in seconds
- $scope.rateWindow = $scope.chart.rateWindow / 1000;
-
- $scope.addChartsPage = function () {
- QDRChartService.addDashboard(dialogSvgChart.chart);
- };
- $scope.delChartsPage = function () {
- QDRChartService.delDashboard($scope.chart);
- }
-
- $scope.showChartsPage = function () {
- cleanup();
- $uibModalInstance.close(true);
- $location.path(QDR.pluginRoot + "/charts");
- };
-
- var cleanup = function () {
- if (updateTimer) {
- clearTimeout(updateTimer);
- updateTimer = null;
- }
- if (!$scope.isOnChartsPage())
- QDRChartService.unRegisterChart($scope.dialogChart); // remove the chart
- }
- $scope.okClick = function () {
- cleanup();
- $uibModalInstance.close(true);
- };
-
- var initRateSlider = function () {
- if (document.getElementById('rateSlider')) {
- $( "#rateSlider" ).slider({
- value: $scope.rateWindow,
- min: 1,
- max: 10,
- step: 1,
- slide: function( event, ui ) {
- $scope.rateWindow = ui.value;
- $scope.dialogChart.rateWindow = ui.value * 1000;
- $scope.$apply();
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- });
- } else {
- setTimeout(initRateSlider, 100)
- }
- }
- //initRateSlider();
-
- var initDurationSlider = function () {
- if (document.getElementById('durationSlider')) {
- $( "#durationSlider" ).slider({
- value: $scope.dialogChart.visibleDuration,
- min: 0.25,
- max: 10,
- step: 0.25,
- slide: function( event, ui ) {
- $scope.visibleDuration = $scope.dialogChart.visibleDuration = ui.value;
- $scope.$apply();
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- });
- } else {
- setTimeout(initDurationSlider, 100)
- }
- }
- initDurationSlider();
-
- $scope.adding = function () {
- return adding
- }
-
- $scope.isOnChartsPage = function () {
- var chart = $scope.chart
- if (adding)
- return QDRChartService.isAttrCharted(chart.nodeId(), chart.entity(), chart.name(), chart.attr(), chart.aggregate())
- else
- return $scope.chart.dashboard
- }
-
- // handle the Apply button click
- // update the dashboard chart's properties
- $scope.apply = function () {
- $scope.chart.areaColor = $scope.dialogChart.areaColor;
- $scope.chart.lineColor = $scope.dialogChart.lineColor;
- $scope.chart.type = $scope.dialogChart.type;
- $scope.chart.rateWindow = $scope.rateWindow * 1000;
- $scope.chart.title($scope.dialogChart.title());
- $scope.chart.visibleDuration = $scope.dialogChart.visibleDuration;
- QDRChartService.saveCharts();
- if (typeof updateTick === "function")
- updateTick();
- }
-
- // add a new chart to the dashboard based on the current dialog settings
- $scope.copyToDashboard = function () {
- var chart = $scope.dialogChart.copy();
- // set the new chart's dashboard state
- QDRChartService.addDashboard(chart);
- // notify the chart controller that it needs to display a new chart
- dashboard.addChart(chart);
- }
-
- // update the chart on the popup dialog
- var updateDialogChart = function () {
- // draw the chart using the current data
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
-
- // draw the chart again in 1 second
- var updateRate = localStorage['updateRate'] ? localStorage['updateRate'] : 1000;
- if (updateTimer)
- clearTimeout(updateTimer);
- updateTimer = setTimeout(updateDialogChart, updateRate);
- }
-
- var showChart = function () {
- // ensure the div for our chart is loaded in the dom
- var div = angular.element("#" + $scope.svgDivId);
- if (!div.width()) {
- setTimeout(showChart, 100);
- return;
- }
- dialogSvgChart = new QDRChartService.pfAreaChart($scope.dialogChart, $scope.svgDivId)
-/*
- $('input[name=areaColor]').val($scope.dialogChart.areaColor);
- $('input[name=areaColor]').on('input', function (e) {
- $scope.dialogChart.areaColor = $(this).val();
- updateDialogChart()
- })
-*/
- if (updateTimer)
- clearTimeout(updateTimer);
- updateDialogChart();
- }
- showChart();
- });
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index a0f5343..0000000
--- a/console/stand-alone/plugin/js/qdrChartService.js
+++ /dev/null
@@ -1,855 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- // The QDR chart service handles periodic gathering data for charts and displaying the charts
- QDR.module.factory("QDRChartService", ['$rootScope', 'QDRService', '$http', '$resource', '$location',
- function($rootScope, QDRService, $http, $resource, $location) {
-
- var instance = 0; // counter for chart instances
- var bases = [];
- var findBase = function(name, attr, request) {
- for (var i = 0; i < bases.length; ++i) {
- var base = bases[i];
- if (base.equals(name, attr, request))
- return base;
- }
- return null;
- }
-
- function ChartBase(name, attr, request) {
- // the base chart attributes
- this.name = name; // the record's "name" field
- this.attr = attr; // the record's attr field to chart
- this.request = request; // the associated request that fetches the data
-
- // copy the savable properties to an object
- this.copyProps = function(o) {
- o.name = this.name;
- o.attr = this.attr;
- this.request.copyProps(o);
- }
-
- this.equals = function(name, attr, request) {
- return (this.name == name && this.attr == attr && this.request.equals(request));
- }
- };
-
- // Object that represents a visible chart
- // There can be multiple of these per ChartBase (eg. one rate and one value chart)
- function Chart(opts, request) { //name, attr, cinstance, request) {
-
- var base = findBase(opts.name, opts.attr, request);
- if (!base) {
- base = new ChartBase(opts.name, opts.attr, request);
- bases.push(base);
- }
- this.base = base;
- this.instance = angular.isDefined(opts.instance) ? opts.instance : ++instance;
- this.dashboard = false; // is this chart on the dashboard page
- this.hdash = false; // is this chart on the hawtio dashboard page
- this.hreq = false; // has this hdash chart been requested
- this.type = opts.type ? opts.type : "value"; // value or rate
- this.rateWindow = opts.rateWindow ? opts.rateWindow : 1000; // calculate the rate of change over this time interval. higher == smother graph
- this.areaColor = "#32b9f3"; // the chart's area color when not an empty string
- this.lineColor = "#058dc7"; // the chart's line color when not an empty string
- this.visibleDuration = opts.visibleDuration ? opts.visibleDuration : opts.type === 'rate' ? 0.25 : 1; // number of minutes of data to show (<= base.duration)
- this.userTitle = null; // user title overrides title()
- this.hideLabel = opts.hideLabel
- this.hideLegend = opts.hideLegend
-
- // generate a unique id for this chart
- this.id = function() {
- var name = this.name()
- var nameparts = name.split('/');
- if (nameparts.length == 2)
- name = nameparts[1];
- 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, '')
- }
- // copy the savable properties to an object
- this.copyProps = function(o) {
- o.type = this.type;
- o.rateWindow = this.rateWindow;
- o.areaColor = this.areaColor;
- o.lineColor = this.lineColor;
- o.visibleDuration = this.visibleDuration;
- o.userTitle = this.userTitle;
- o.dashboard = this.dashboard;
- o.hdash = this.hdash;
- o.instance = this.instance;
- this.base.copyProps(o);
- }
- this.name = function(_) {
- if (!arguments.length) return this.base.name;
- this.base.name = _;
- return this;
- }
- this.attr = function(_) {
- if (!arguments.length) return this.base.attr;
- this.base.attr = _;
- return this;
- }
- this.nodeId = function(_) {
- if (!arguments.length) return this.base.request.nodeId;
- this.base.request.nodeId = _;
- return this;
- }
- this.entity = function(_) {
- if (!arguments.length) return this.base.request.entity;
- this.base.request.entity = _;
- return this;
- }
- this.aggregate = function(_) {
- if (!arguments.length) return this.base.request.aggregate;
- this.base.request.aggregate = _;
- return this;
- }
- this.request = function(_) {
- if (!arguments.length) return this.base.request;
- this.base.request = _;
- return this;
- }
- this.data = function() {
- return this.base.request.data(this.base.name, this.base.attr); // refernce to chart's data array
- }
- this.interval = function(_) {
- if (!arguments.length) return this.base.request.interval;
- this.base.request.interval = _;
- return this;
- }
- this.duration = function(_) {
- if (!arguments.length) return this.base.request.duration;
- this.base.request.duration = _;
- return this;
- }
- this.router = function () {
- return QDRService.management.topology.nameFromId(this.nodeId())
- }
- this.title = function(_) {
- var name = this.request().aggregate ? 'Aggregate' : QDRService.management.topology.nameFromId(this.nodeId());
- var computed = name +
- " " + QDRService.utilities.humanify(this.attr()) +
- " - " + this.name()
- if (!arguments.length) return this.userTitle || computed;
-
- // don't store computed title in userTitle
- if (_ === computed)
- _ = null;
- this.userTitle = _;
- return this;
- }
- this.title_short = function(_) {
- if (!arguments.length) return this.userTitle || this.name();
- return this;
- }
- this.copy = function() {
- var chart = self.registerChart({
- nodeId: this.nodeId(),
- entity: this.entity(),
- name: this.name(),
- attr: this.attr(),
- interval: this.interval(),
- forceCreate: true,
- aggregate: this.aggregate(),
- hdash: this.hdash
- })
- chart.type = this.type;
- chart.areaColor = this.areaColor;
- chart.lineColor = this.lineColor;
- chart.rateWindow = this.rateWindow;
- chart.visibleDuration = this.visibleDuration;
- chart.userTitle = this.userTitle;
- return chart;
- }
- // compare to a chart
- this.equals = function(c) {
- return (c.instance == this.instance &&
- c.base.equals(this.base.name, this.base.attr, this.base.request) &&
- c.type == this.type &&
- c.rateWindow == this.rateWindow &&
- c.areaColor == this.areaColor &&
- c.lineColor == this.lineColor)
- }
- }
-
- // Object that represents the management request to fetch and store data for multiple charts
- function ChartRequest(opts) { //nodeId, entity, name, attr, interval, aggregate) {
- this.duration = opts.duration || 10; // number of minutes to keep the data
- this.nodeId = opts.nodeId; // eg amqp:/_topo/0/QDR.A/$management
- this.entity = opts.entity; // eg .router.address
- // sorted since the responses will always be sorted
- this.aggregate = opts.aggregate; // list of nodeIds for aggregate charts
- this.datum = {}; // object containing array of arrays for each attr
- // like {attr1: [[date,value],[date,value]...], attr2: [[date,value]...]}
-
- this.interval = opts.interval || 1000; // number of milliseconds between updates to data
- this.setTimeoutHandle = null; // used to cancel the next request
-
- // allow override of normal request's management call to get data
- this.override = opts.override; // call this instead of internal function to retreive data
- this.overrideAttrs = opts.overrideAttrs //
-
- this.data = function(name, attr) {
- if (this.datum[name] && this.datum[name][attr])
- return this.datum[name][attr]
- return null;
- }
- this.addAttrName = function(name, attr) {
- if (Object.keys(this.datum).indexOf(name) == -1) {
- this.datum[name] = {}
- }
- if (Object.keys(this.datum[name]).indexOf(attr) == -1) {
- this.datum[name][attr] = [];
- }
- }
- this.addAttrName(opts.name, opts.attr)
-
- this.copyProps = function(o) {
- o.nodeId = this.nodeId;
- o.entity = this.entity;
- o.interval = this.interval;
- o.aggregate = this.aggregate;
- o.duration = this.duration;
- }
-
- this.removeAttr = function(name, attr) {
- if (this.datum[name]) {
- if (this.datum[name][attr]) {
- delete this.datum[name][attr]
- }
- }
- return this.attrs().length;
- }
-
- this.equals = function(r, entity, aggregate) {
- if (arguments.length == 3) {
- var o = {
- nodeId: r,
- entity: entity,
- aggregate: aggregate
- }
- r = o;
- }
- return (this.nodeId === r.nodeId && this.entity === r.entity && this.aggregate == r.aggregate)
- }
- this.names = function() {
- return Object.keys(this.datum)
- }
- this.attrs = function() {
- var attrs = {}
- Object.keys(this.datum).forEach(function(name) {
- Object.keys(this.datum[name]).forEach(function(attr) {
- attrs[attr] = 1;
- })
- }, this)
- return Object.keys(attrs);
- }
- };
-
- // Below here are the properties and methods available on QDRChartService
- var self = {
- charts: [], // list of charts to gather data for
- chartRequests: [], // the management request info (multiple charts can be driven off of a single request
-
- init: function() {
- self.loadCharts();
- QDRService.management.connection.addDisconnectAction(function() {
- self.charts.forEach(function(chart) {
- self.unRegisterChart(chart, true)
- })
- QDRService.management.connection.addConnectAction(self.init);
- })
- },
-
- findChartRequest: function(nodeId, entity, aggregate) {
- var ret = null;
- self.chartRequests.some(function(request) {
- if (request.equals(nodeId, entity, aggregate)) {
- ret = request;
- return true;
- }
- })
- return ret;
- },
-
- findCharts: function(opts) { //name, attr, nodeId, entity, hdash) {
- if (!opts.hdash)
- opts.hdash = false; // rather than undefined
- return self.charts.filter(function(chart) {
- return (chart.name() == opts.name &&
- chart.attr() == opts.attr &&
- chart.nodeId() == opts.nodeId &&
- chart.entity() == opts.entity &&
- chart.hdash == opts.hdash)
- });
- },
-
- delChartRequest: function(request) {
- for (var i = 0; i < self.chartRequests.length; ++i) {
- var r = self.chartRequests[i];
- if (request.equals(r)) {
- QDR.log.debug("removed request: " + request.nodeId + " " + request.entity);
- self.chartRequests.splice(i, 1);
- self.stopCollecting(request);
- return;
- }
- }
- },
-
- delChart: function(chart, skipSave) {
- var foundBases = 0;
- for (var i = 0; i < self.charts.length; ++i) {
- var c = self.charts[i];
- if (c.base === chart.base)
- ++foundBases;
- if (c.equals(chart)) {
- self.charts.splice(i, 1);
- if (chart.dashboard && !skipSave)
- self.saveCharts();
- }
- }
- if (foundBases == 1) {
- var baseIndex = bases.indexOf(chart.base)
- bases.splice(baseIndex, 1);
- }
- },
-
- createChart: function (opts, request) {
- return new Chart(opts, request)
- },
- createChartRequest: function (opts) {
- var request = new ChartRequest(opts); //nodeId, entity, name, attr, interval, aggregate);
- request.creationTimestamp = opts.now
- self.chartRequests.push(request);
- self.startCollecting(request);
- self.sendChartRequest(request, true)
- return request;
- },
- destroyChartRequest: function (request) {
- self.stopCollecting(request);
- self.delChartRequest(request);
- },
-
- registerChart: function(opts) { //nodeId, entity, name, attr, interval, instance, forceCreate, aggregate, hdash) {
- var request = self.findChartRequest(opts.nodeId, opts.entity, opts.aggregate);
- if (request) {
- // add any new attr or name to the list
- request.addAttrName(opts.name, opts.attr)
- } else {
- // the nodeId/entity did not already exist, so add a new request and chart
- QDR.log.debug("added new request: " + opts.nodeId + " " + opts.entity);
- var request = self.createChartRequest(opts);
- }
- var charts = self.findCharts(opts); //name, attr, nodeId, entity, hdash);
- var chart;
- if (charts.length == 0 || opts.forceCreate) {
- if (!opts.use_instance && opts.instance)
- delete opts.instance;
- chart = new Chart(opts, request) //opts.name, opts.attr, opts.instance, request);
- self.charts.push(chart);
- } else {
- chart = charts[0];
- }
- return chart;
- },
-
- // remove the chart for name/attr
- // if all attrs are gone for this request, remove the request
- unRegisterChart: function(chart, skipSave) {
- // remove the chart
-
- // TODO: how do we remove charts that were added to the hawtio dashboard but then removed?
- // We don't get a notification that they were removed. Instead, we could just stop sending
- // the request in the background and only send the request when the chart's tick() event is triggered
- //if (chart.hdash) {
- // chart.dashboard = false;
- // self.saveCharts();
- // return;
- //}
-
- for (var i = 0; i < self.charts.length; ++i) {
- var c = self.charts[i];
- if (chart.equals(c)) {
- var request = chart.request();
- self.delChart(chart, skipSave);
- if (request) {
- // see if any other charts use this attr
- for (var i = 0; i < self.charts.length; ++i) {
- var c = self.charts[i];
- if (c.attr() == chart.attr() && c.request().equals(chart.request()))
- return;
- }
- // no other charts use this attr, so remove it
- if (request.removeAttr(chart.name(), chart.attr()) == 0) {
- self.destroyChartRequest(request)
- }
- }
- }
- }
- if (!skipSave)
- self.saveCharts();
- },
-
- stopCollecting: function(request) {
- if (request.setTimeoutHandle) {
- clearInterval(request.setTimeoutHandle);
- request.setTimeoutHandle = null;
- }
- },
-
- startCollecting: function(request) {
- request.setTimeoutHandle = setInterval(self.sendChartRequest, request.interval, request);
- },
- shouldRequest: function(request) {
- // see if any of the charts associated with this request have either dialog, dashboard, or hreq
- return self.charts.some(function(chart) {
- return (chart.dashboard || chart.hreq) || (!chart.dashboard && !chart.hdash);
- });
- },
- // send the request
- sendChartRequest: function(request, once) {
- //if (!once)
- // request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
- if (request.busy)
- return
- if (self.charts.length > 0 && !self.shouldRequest(request)) {
- return;
- }
- // ensure the response has the name field so we can associate the response values with the correct chart
- var attrs = request.attrs();
- if (attrs.indexOf("name") == -1)
- attrs.push("name");
-
- // this is called when the response is received
- var saveResponse = function(nodeId, entity, response) {
- request.busy = false
- if (!response || !response.attributeNames)
- return;
- //QDR.log.debug("got chart results for " + nodeId + " " + entity);
- // records is an array that has data for all names
- var records = response.results;
- if (!records)
- return;
-
- var now = new Date();
- var cutOff = new Date(now.getTime() - request.duration * 60 * 1000);
- // index of the "name" attr in the response
- var nameIndex = response.attributeNames.indexOf("name");
- if (nameIndex < 0)
- return;
-
- var names = request.names();
- // for each record returned, find the name/attr for this request and save the data with this timestamp
- for (var i = 0; i < records.length; ++i) {
- var name = records[i][nameIndex];
- // if we want to store the values for some attrs for this name
- if (names.indexOf(name) > -1) {
- attrs.forEach(function(attr) {
- var attrIndex = response.attributeNames.indexOf(attr)
- if (records[i][attrIndex] !== undefined) {
- var data = request.data(name, attr) // get a reference to the data array
- if (data) {
-
- if (request.aggregate) {
- data.push([now, response.aggregates[i][attrIndex].sum, response.aggregates[i][attrIndex].detail])
- } else {
- data.push([now, records[i][attrIndex]])
- }
- // expire the old data
- while (data[0][0] < cutOff) {
- data.shift();
- }
- }
- }
- })
- }
- }
- }
- request.busy = true
- // check for override of request
- if (request.override) {
- request.override(request, saveResponse)
- } else {
- // send the appropriate request
- if (request.aggregate) {
- var nodeList = QDRService.management.topology.nodeIdList()
- QDRService.management.topology.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
- } else {
- QDRService.management.topology.fetchEntity(request.nodeId, request.entity, attrs, saveResponse);
- }
- }
- },
-
- numCharts: function() {
- return self.charts.filter(function(chart) {
- return chart.dashboard
- }).length;
- //return self.charts.length;
- },
-
- isAttrCharted: function(nodeId, entity, name, attr, aggregate) {
- var charts = self.findCharts({
- name: name,
- attr: attr,
- nodeId: nodeId,
- entity: entity
- })
- // if any of the matching charts are on the dashboard page, return true
- return charts.some(function(chart) {
- return (chart.dashboard && (aggregate ? chart.aggregate() : !chart.aggregate()))
- });
- },
-
- addHDash: function(chart) {
- chart.hdash = true;
- self.saveCharts();
- },
- delHDash: function(chart) {
- chart.hdash = false;
- self.saveCharts();
- },
- addDashboard: function(chart) {
- chart.dashboard = true;
- self.saveCharts();
- },
- delDashboard: function(chart) {
- chart.dashboard = false;
- self.saveCharts();
- },
- // save the charts to local storage
- saveCharts: function() {
- var charts = [];
- var minCharts = [];
-
- self.charts.forEach(function(chart) {
- var minChart = {};
- // don't save chart unless it is on the dashboard
- if (chart.dashboard || chart.hdash) {
- chart.copyProps(minChart);
- minCharts.push(minChart);
- }
- })
- localStorage["QDRCharts"] = angular.toJson(minCharts);
- },
- loadCharts: function() {
- var charts = angular.fromJson(localStorage["QDRCharts"]);
- if (charts) {
- // get array of known ids
- var nodeList = QDRService.management.topology.nodeIdList()
- charts.forEach(function(chart) {
- // if this chart is not in the current list of nodes, skip
- if (nodeList.indexOf(chart.nodeId) >= 0) {
- if (!angular.isDefined(chart.instance)) {
- chart.instance = ++instance;
- }
- if (chart.instance >= instance)
- instance = chart.instance + 1;
- if (!chart.duration)
- chart.duration = 1;
- if (chart.nodeList)
- chart.aggregate = true;
- if (!chart.hdash)
- chart.hdash = false;
- if (!chart.dashboard)
- chart.dashboard = false;
- if (!chart.hdash && !chart.dashboard)
- chart.dashboard = true;
- if (chart.hdash && chart.dashboard)
- chart.dashboard = false;
- chart.forceCreate = true;
- chart.use_instance = true;
- var newChart = self.registerChart(chart); //chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
- newChart.dashboard = chart.dashboard;
- newChart.hdash = chart.hdash;
- newChart.hreq = false;
- newChart.type = chart.type;
- newChart.rateWindow = chart.rateWindow;
- newChart.areaColor = chart.areaColor ? chart.areaColor : "#32b9f3";
- newChart.lineColor = chart.lineColor ? chart.lineColor : "#058dc7";
- newChart.duration(chart.duration);
- newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : newChart.type === 'rate' ? 0.25 : 1;
- if (chart.userTitle)
- newChart.title(chart.userTitle);
- }
- })
- }
- },
-
- // constructor for a c3 area chart
- pfAreaChart: function (chart, chartId, defer) {
- if (!chart)
- return;
-
- // reference to underlying chart
- this.chart = chart;
-
- // if this is an aggregate chart, show it stacked
- this.stacked = chart.request().aggregate;
-
- // the id of the html element that is bound to the chart. The svg will be a child of this
- this.htmlId = chartId
-
- // an array of 20 colors
- this.colors = d3.scale.category10().range();
-
- if (!defer)
- this.generate()
- },
-
- // aggregate chart is based on pfAreaChart
- pfAggChart: function (chart, chartId, defer) {
- // inherit pfChart's properties, but force a defer
- self.pfAreaChart.call(this, chart, chartId, true)
-
- // the request is for aggregate data, but the chart is for the sum and not the detail
- // Explanation: When the chart.request is aggregate, each data point is composed of 3 parts:
- // 1. the datetime stamp
- // 2. the sum of the value for all routers
- // 3. an object with each router's name and value for this data point
- // Normally, an aggregate chart shows lines for each of the routers and ignores the sum
- // For this chart, we want to chart the sum (the 2nd value), so we set stacked to false
- this.stacked = false
-
- // let chart legends and tooltips show 'Total' instead of a router name
- this.aggregate = true
-
- if (!defer)
- this.generate()
- }
- }
- // allow pfAggChart to inherit prototyped methods
- self.pfAggChart.prototype = Object.create(self.pfAreaChart.prototype);
- // except for the constructor
- self.pfAggChart.prototype.constructor = self.pfAggChart;
-
- // create the svg and bind it to the given div.id
- self.pfAreaChart.prototype.generate = function () {
- var chart = this.chart // for access during chart callbacks
- var self = this
-
- // list of router names. used to get the color index
- var nameList = QDRService.management.topology.nodeNameList();
-
- var c3ChartDefaults = $().c3ChartDefaults();
- var singleAreaChartConfig = c3ChartDefaults.getDefaultSingleAreaConfig();
- singleAreaChartConfig.bindto = '#' + this.htmlId;
- singleAreaChartConfig.data = {
- x: 'x', // x-axis is named x
- columns: [[]],
- type: 'area-spline'
- }
- singleAreaChartConfig.axis = {
- x: {
- type: 'timeseries',
- tick: {
- format: (function (d) {
- var data = this.singleAreaChart.data.shown()
- var first = data[0]['values'][0].x
-
- if (d - first == 0) {
- return d3.timeFormat("%I:%M:%S")(d)
- }
- return d3.timeFormat("%M:%S")(d)
- }).bind(this),
- culling: {max: 4}
- }
- },
- y: {
- tick: {
- format: function (d) { return d<1 ? d3.format(".2f")(d) : d3.format(".2s")(d) },
- count: 5
- }
- }
- }
-
- if (!chart.hideLabel) {
- singleAreaChartConfig.axis.x.label = {
- text: chart.name(),
- position: 'outer-right'
- }
-
- }
- singleAreaChartConfig.transition = {
- duration: 0
- }
-
- singleAreaChartConfig.area = {
- zerobased: false
- }
-
- singleAreaChartConfig.tooltip = {
- contents: function (d, defaultTitleFormat, defaultValueFormat, color) {
- var d3f = ","
- if (chart.type === 'rate')
- d3f = ",.2f"
- var zPre = function (i) {
- if (i < 10) {
- i = "0" + i;
- }
- return i;
- }
- var h = zPre(d[0].x.getHours())
- var m = zPre(d[0].x.getMinutes())
- var s = zPre(d[0].x.getSeconds())
- var table = "<table class='dispatch-c3-tooltip'> <tr><th colspan='2' class='text-center'><strong>"+h+':'+m+':'+s+"</strong></th></tr> <tbody>"
- for (var i=0; i<d.length; i++) {
- var colorIndex = nameList.indexOf(d[i].id) % 10
- var span = "<span class='chart-tip-legend' style='background-color: "+self.colors[colorIndex]+";'> </span>" + d[i].id
- table += ("<tr><td>"+span+"<td>"+d3.format(d3f)(d[i].value)+"</td></tr>")
- }
- table += "</tbody></table>"
- return table
- }
- }
-
- singleAreaChartConfig.title = {
- text: QDRService.utilities.humanify(this.chart.attr())
- }
-
- singleAreaChartConfig.data.colors = {}
- nameList.forEach( (function (r, i) {
- singleAreaChartConfig.data.colors[r] = this.colors[i % 10]
- }).bind(this))
-
- singleAreaChartConfig.data.color = (function (color, d) {
- var i = nameList.indexOf(d)
- return i >= 0 ? this.colors[i % 10] : color
- }).bind(this)
-
- if (!chart.hideLegend) {
- singleAreaChartConfig.legend = {
- show: true,
- }
- }
-
- if (this.stacked) {
- // create a stacked area chart
- singleAreaChartConfig.data.groups = [QDRService.management.topology.nodeNameList()]
- singleAreaChartConfig.data.order = function (t1, t2) { return t1.id < t2.id }
- }
-
- this.singleAreaChart = c3.generate(singleAreaChartConfig);
- }
-
- // filter/modify the chart.data into data points for the svg
- /* the collected data looks like:
- [[date, val, [v1,v2,...]], [date, val, [v1,v2,...]],...]
- with date being the timestamp of the sample
- val being the total value
- and the [v1,v2,...] array being the component values for each router for stacked charts
-
- for stacked charts, the returned data looks like:
- [['x', date, date,...},
- ['R1', v1, v1,...},
- ['R2', v2, v2,...],
- ...]
-
- for non-stacked charts, the returned data looks like:
- ['x', date, date,...],
- ['R1', val, val,...]]
-
- for rate charts, all the values returned are the change per second between adjacent values
- */
- self.pfAreaChart.prototype.chartData = function() {
- var data = this.chart.data();
- var nodeList = QDRService.management.topology.nodeNameList();
-
- // oldest data point that should be visible
- var now = new Date();
- var visibleDate = new Date(now.getTime() - this.chart.visibleDuration * 60 * 1000);
-
- var accessorSingle = function (d, d1, elapsed) {
- return this.chart.type === 'rate' ? (d1[1] - d[1]) / elapsed : d[1]
- }
- var accessorStacked = function (d, d1, elapsed, i) {
- return this.chart.type === 'rate' ? (d1[2][i].val - d[2][i].val) / elapsed : d[2][i].val
- }
- var accessor = this.stacked ? accessorStacked : accessorSingle
-
- var dx = ['x']
- var dlines = []
- if (this.stacked) {
- // for stacked, there is a line per router
- nodeList.forEach( function (node) {
- dlines.push([node])
- })
- } else {
- // for non-stacked, there is only one line
- dlines.push([this.aggregate ? 'Total' : this.chart.router()])
- }
- for (var i=0; i<data.length; i++) {
- var d = data[i], elapsed = 1, d1
- if (d[0] >= visibleDate) {
- if (this.chart.type === 'rate' && i < data.length-1) {
- d1 = data[i+1]
- elapsed = Math.max((d1[0] - d[0]) / 1000, 0.001); // number of seconds that elapsed
- }
- // don't push the last data point for a rate chart
- if (this.chart.type !== 'rate' || i < data.length-1) {
- dx.push(d[0])
- if (this.stacked) {
- for (var nodeIndex=0; nodeIndex<nodeList.length; nodeIndex++) {
- dlines[nodeIndex].push(accessor.call(this, d, d1, elapsed, nodeIndex))
- }
- } else {
- dlines[0].push(accessor.call(this, d, d1, elapsed))
- }
- }
- }
- }
- var columns = [dx]
- dlines.forEach( function (line) {
- columns.push(line)
- })
- return columns
- }
-
- // get the data for the chart and update it
- self.pfAreaChart.prototype.tick = function() {
- // can't draw charts that don't have data yet
- if (this.chart.data().length == 0 || !this.singleAreaChart) {
- return;
- }
-
- // update the chart title
- // since there is no c3 api to get or set the chart title, we change the title directly using d3
- var rate = ''
- if (this.chart.type === 'rate')
- rate = ' per second'
- d3.select("#"+this.htmlId+" svg text.c3-title").text(QDRService.utilities.humanify(this.chart.attr()) + rate);
-
- var d = this.chartData()
- // load the new data
- // using the c3.flow api causes the x-axis labels to jump around
- this.singleAreaChart.load({
- columns: d
- })
- }
-
- return self;
- }
- ]);
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 5724a1d..0000000
--- a/console/stand-alone/plugin/js/qdrCharts.js
+++ /dev/null
@@ -1,156 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
- /**
- * @method ChartsController
- *
- * Controller that handles the QDR charts page
- */
- QDR.module.controller("QDR.ChartsController", function($scope, QDRService, QDRChartService, $uibModal, $location, $routeParams, $timeout) {
-
- 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($location, "charts");
- return;
- }
-
- $scope.svgCharts = [];
- // create an svg object for each chart
- QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
- var svgChart = new QDRChartService.pfAreaChart(chart, chart.id(), true)
- svgChart.zoomed = false;
- $scope.svgCharts.push(svgChart);
- })
-
-
- // redraw the chart every update period
- 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'] : 1000;
- if (updateTimer) {
- clearTimeout(updateTimer)
- }
- updateTimer = setTimeout(updateCharts, updateRate);
- }
-
- // called by ng-init in the html when the page is loaded
- $scope.chartsLoaded = function () {
- // ensure the div for our chart is loaded in the dom
- var div = angular.element(".chartContainer");
- if (!div.width()) {
- setTimeout($scope.chartsLoaded, 100);
- return;
- }
- // create an svg object for each chart
- $scope.svgCharts.forEach ( function (c) {
- c.generate()
- QDRChartService.sendChartRequest(c.chart.request(), true);
- })
- if (updateTimer)
- clearTimeout(updateTimer)
- setTimeout(updateCharts);
- }
-
- $scope.zoomChart = function (chart) {
- chart.zoomed = !chart.zoomed;
- chart.zoom(chart.chart.id(), chart.zoomed);
- }
- $scope.showListPage = function () {
- $location.path("/list");
- };
-
- $scope.hasCharts = function () {
- return QDRChartService.numCharts() > 0;
- };
-
- $scope.editChart = function (chart) {
- doDialog("tmplChartConfig.html", chart.chart);
- };
-
- $scope.delChart = function (chart) {
- QDRChartService.unRegisterChart(chart.chart);
- // remove from svgCharts
- $scope.svgCharts.forEach(function (svgChart, i) {
- if (svgChart === chart) {
- delete $scope.svgCharts.splice(i, 1);
- }
- })
- }
-
- // called from dialog when we want to clone the dialog chart
- // the chart argument here is a QDRChartService chart
- $scope.addChart = function (chart) {
- var nchart = new QDRChartService.pfAreaChart(chart, chart.id(), true)
- $scope.svgCharts.push(nchart);
- $timeout( function () {
- nchart.generate()
- QDRChartService.sendChartRequest(chart.request(), true);
- })
- };
-
- $scope.$on("$destroy", function( event ) {
- if (updateTimer) {
- clearTimeout(updateTimer);
- updateTimer = null;
- }
- for (var i=$scope.svgCharts.length-1; i>=0; --i) {
- delete $scope.svgCharts.splice(i, 1);
- }
- });
-
- function doDialog(template, chart) {
-
- $uibModal.open({
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- templateUrl: QDR.templatePath + template,
- controller: "QDR.ChartDialogController",
- resolve: {
- chart: function() {
- return chart;
- },
- updateTick: function () {
- return function () { return updateCharts };
- },
- dashboard: function () {
- return $scope;
- },
- adding: function () {
- return false
- }
- }
- })
- };
-
- });
-
-
- return QDR;
-
-}(QDR || {}));
-
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[2/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 2af529a..0000000
--- a/console/stand-alone/plugin/js/qdrSettings.js
+++ /dev/null
@@ -1,170 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- /**
- * @method SettingsController
- * @param $scope
- * @param QDRServer
- *
- * Controller that handles the QDR settings page
- */
-
- QDR.module.controller("QDR.SettingsController", ['$scope', 'QDRService', 'QDRChartService', '$timeout', '$location', function($scope, QDRService, QDRChartService, $timeout, $location) {
-
- $scope.connecting = false;
- $scope.connectionError = false;
- $scope.connectionErrorText = undefined;
- $scope.forms = {};
-
- $scope.formEntity = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {
- address: '',
- port: '',
- username: '',
- password: '',
- autostart: false
- };
-
- $scope.$watch('formEntity', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- localStorage[QDR.SETTINGS_KEY] = angular.toJson(newValue);
- }
- }, true);
-
- $scope.buttonText = function() {
- if (QDRService.management.connection.is_connected()) {
- return "Disconnect";
- } else {
- return "Connect";
- }
- };
-
- // connect/disconnect button clicked
- $scope.connect = function() {
- if (QDRService.management.connection.is_connected()) {
- $timeout( function () {
- QDRService.disconnect()
- })
- return;
- }
-
- if ($scope.settings.$valid) {
- $scope.connectionError = false;
- $scope.connecting = true;
- // timeout so connecting animation can display
- $timeout(function () {
- doConnect()
- })
- }
- }
-
- 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(e) {
- $timeout(function() {
- $scope.connecting = false;
- $scope.connectionErrorText = "Unable to connect to " + $scope.formEntity.address + ":" + $scope.formEntity.port
- $scope.connectionError = true
- })
- }
- var options = {address: $scope.formEntity.address, port: $scope.formEntity.port, reconnect: true}
- QDRService.connect(options)
- .then( function (r) {
- // register a callback for when the node list is available (needed for loading saved charts)
- QDRService.management.topology.addUpdatedAction("initChartService", function() {
- QDRService.management.topology.delUpdatedAction("initChartService")
- QDRChartService.init(); // initialize charting service after we are connected
- });
- // get the list of nodes
- QDRService.management.topology.startUpdating(false);
- // will have redirected to last known page or /overview
- }, function (e) {
- failed(e)
- })
- }
- }]);
-
-
- QDR.module.directive('posint', function() {
- return {
- require: 'ngModel',
-
- link: function(scope, elem, attr, ctrl) {
- // input type number allows + and - but we don't want them so filter them out
- elem.bind('keypress', function(event) {
- var nkey = !event.charCode ? event.which : event.charCode;
- var skey = String.fromCharCode(nkey);
- var nono = "-+.,"
- if (nono.indexOf(skey) >= 0) {
- event.preventDefault();
- return false;
- }
- // firefox doesn't filter out non-numeric input. it just sets the ctrl to invalid
- if (/[\!\@\#\$\%^&*\(\)]/.test(skey) && event.shiftKey || // prevent shift numbers
- !( // prevent all but the following
- nkey <= 0 || // arrows
- nkey == 8 || // delete|backspace
- nkey == 13 || // enter
- (nkey >= 37 && nkey <= 40) || // arrows
- event.ctrlKey || event.altKey || // ctrl-v, etc.
- /[0-9]/.test(skey)) // numbers
- ) {
- event.preventDefault();
- return false;
- }
- })
- // check the current value of input
- var _isPortInvalid = function(value) {
- var port = value + ''
- var isErrRange = false;
- // empty string is valid
- if (port.length !== 0) {
- var n = ~~Number(port);
- if (n < 1 || n > 65535) {
- isErrRange = true;
- }
- }
- ctrl.$setValidity('range', !isErrRange)
- return isErrRange;
- }
-
- //For DOM -> model validation
- ctrl.$parsers.unshift(function(value) {
- return _isPortInvalid(value) ? undefined : value;
- });
-
- //For model -> DOM validation
- ctrl.$formatters.unshift(function(value) {
- _isPortInvalid(value);
- return value;
- });
- }
- };
- });
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/js/qdrTopAddressesController.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrTopAddressesController.js b/console/stand-alone/plugin/js/qdrTopAddressesController.js
deleted file mode 100644
index d5325d7..0000000
--- a/console/stand-alone/plugin/js/qdrTopAddressesController.js
+++ /dev/null
@@ -1,234 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- QDR.module.controller('QDR.TopAddressesController', function ($scope, QDRService, $timeout) {
-
- var selectRow = function (gridApi) {
- if (!gridApi.selection)
- return
- gridApi.selection.on.rowSelectionChanged($scope,function(row){
- })
- }
- $scope.addressesData = []
- $scope.topAddressesGrid = {
- data: 'addressesData',
- columnDefs: [
- {
- field: 'address',
- displayName: 'address'
- },
- {
- field: 'class',
- displayName: 'class'
- },
-/*
- {
- field: 'phase',
- displayName: 'phase',
- cellClass: 'grid-align-value'
- },
- {
- field: 'inproc',
- displayName: 'in-proc'
- },
- {
- field: 'local',
- displayName: 'local',
- cellClass: 'grid-align-value'
- },
- {
- field: 'remote',
- displayName: 'remote',
- cellClass: 'grid-align-value'
- },
- */
- {
- field: 'in',
- displayName: 'in',
- cellClass: 'grid-align-value'
- },
- {
- field: 'out',
- displayName: 'out',
- cellClass: 'grid-align-value'
- }
- ],
- enableColumnResize: true,
- multiSelect: false,
- enableSelectAll: false,
- onRegisterApi: selectRow,
- enableSelectionBatchEvent: false,
- enableRowHeaderSelection: false,
- noUnselect: true
- };
-
- // get info for all addresses
- var allAddressInfo = function (address, callback) {
- var nodes = {}
- // gets called each node/entity response
- var gotNode = function (nodeName, entity, response) {
- if (!nodes[nodeName])
- nodes[nodeName] = {}
- nodes[nodeName][entity] = angular.copy(response);
- }
- var 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]
- }
- var addr_phase = function (addr) {
- if (!addr)
- return "-"
- if (addr[0] == 'M')
- return addr[1]
- return ''
- }
- var prettyVal = function (val) {
- return QDRService.utilities.pretty(val || "-")
- }
- var addressFields = []
- var addressObjs = {}
- var addNull = function (oldVal, newVal) {
- if (oldVal != null && newVal != null)
- return oldVal + newVal
- if (oldVal != null)
- return oldVal
- return newVal
- }
- // send the requests for all connection and router info for all routers
- QDRService.management.topology.fetchAllEntities({entity: "router.address"}, function () {
- for (var node in nodes) {
- var response = nodes[node]["router.address"]
- response.results.forEach( function (result) {
- var address = QDRService.utilities.flatten(response.attributeNames, result)
- var uid = address.identity
- var identity = QDRService.utilities.identity_clean(uid)
-
- var objname = QDRService.utilities.addr_text(identity)+QDRService.utilities.addr_class(identity)
- if (!addressObjs[objname]) {
- addressObjs[objname] = {
- address: QDRService.utilities.addr_text(identity),
- 'class': QDRService.utilities.addr_class(identity),
- phase: addr_phase(identity),
- inproc: address.inProcess,
- local: address.subscriberCount,
- remote: address.remoteCount,
- 'in': address.deliveriesIngress,
- out: address.deliveriesEgress,
- thru: address.deliveriesTransit,
- toproc: address.deliveriesToContainer,
- fromproc:address.deliveriesFromContainer,
- uid: uid
- }
- }
- else {
- var sumObj = addressObjs[objname]
- sumObj.inproc = addNull(sumObj.inproc, address.inProcess)
- sumObj.local = addNull(sumObj.local, address.subscriberCount)
- sumObj.remote = addNull(sumObj.remote, address.remoteCount)
- sumObj['in'] = addNull(sumObj['in'], address.deliveriesIngress)
- sumObj.out = addNull(sumObj.out, address.deliveriesEgress)
- sumObj.thru = addNull(sumObj.thru, address.deliveriesTransit)
- sumObj.toproc = addNull(sumObj.toproc, address.deliveriesToContainer)
- sumObj.fromproc = addNull(sumObj.fromproc, address.deliveriesFromContainer)
- }
- })
- }
- for (var obj in addressObjs) {
- addressObjs[obj].inproc = prettyVal(addressObjs[obj].inproc)
- addressObjs[obj].local = prettyVal(addressObjs[obj].local)
- addressObjs[obj].remote = prettyVal(addressObjs[obj].remote)
- addressObjs[obj]['in'] = prettyVal(addressObjs[obj]['in'])
- addressObjs[obj].rawout = addressObjs[obj].out
- addressObjs[obj].out = prettyVal(addressObjs[obj].out)
- addressObjs[obj].thru = prettyVal(addressObjs[obj].thru)
- addressObjs[obj].toproc = prettyVal(addressObjs[obj].toproc)
- addressObjs[obj].fromproc = prettyVal(addressObjs[obj].fromproc)
- addressFields.push(addressObjs[obj])
- }
- if (addressFields.length === 0)
- return;
- // update the grid's data
- addressFields.sort ( function (a,b) {
- return a.address + a['class'] < b.address + b['class'] ? -1 : a.address + a['class'] > b.address + b['class'] ? 1 : 0}
- )
- // callapse all records with same addres+class
- addressFields[0].title = addressFields[0].address
- for (var i=1; i<addressFields.length; ++i) {
- // if this address is the same as the previous address, add a class to the display titles
- if (addressFields[i].address === addressFields[i-1].address) {
- addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
- addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
- } else
- addressFields[i].title = addressFields[i].address
- }
- addressFields = addressFields.filter( function (address) {
- return address.rawout > 0 || address.rawin > 0
- })
- addressFields.sort ( function (a,b) {
- return a.rawout < b.rawout ? -1 : a.rawout > b.rawout ? 1 : 0}
- )
- // take top 5 records
- addressFields.splice(5)
-
- $scope.addressesData = addressFields
- callback(null)
- }, gotNode)
- }
- var timer;
- var updateGrid = function () {
- $timeout( function () {
- allAddressInfo(null, function () {console.log('done')})
- expandGridToContent($scope.addressesData.length)
- })
- }
- timer = setInterval(updateGrid, 5000)
- updateGrid()
-
- var expandGridToContent = function (rows) {
- var height = (rows+1) * 30 + 40 // header is 40px
- var gridDetails = $('#overview-controller .grid')
- gridDetails.css('height', height + "px")
- }
-
- $scope.anyAddresses = function () {
- return $scope.addressesData.length > 0
- }
-
- $scope.$on("$destroy", function( event ) {
- if (timer)
- clearInterval(timer)
- });
-
- });
- return QDR;
-
-} (QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[6/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Posted by ea...@apache.org.
DISPATCH-917 Get common html/js/css for console from npm module dispatch-console-pages
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/502538b4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/502538b4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/502538b4
Branch: refs/heads/master
Commit: 502538b4fc20997873a1434a95d469a5bb019d61
Parents: 785c99d
Author: Ernest Allen <ea...@redhat.com>
Authored: Mon Jan 22 15:23:26 2018 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Mon Jan 22 15:23:26 2018 -0500
----------------------------------------------------------------------
console/stand-alone/index.html | 47 +-
console/stand-alone/package-lock.json | 13 +
console/stand-alone/package.json | 1 +
console/stand-alone/plugin/css/brokers.ttf | Bin 2272 -> 0 bytes
console/stand-alone/plugin/css/dispatch.css | 739 -------
console/stand-alone/plugin/css/dispatchpf.css | 313 ---
console/stand-alone/plugin/css/plugin.css | 1038 ---------
console/stand-alone/plugin/html/qdrCharts.html | 35 -
console/stand-alone/plugin/html/qdrConnect.html | 83 -
console/stand-alone/plugin/html/qdrList.html | 95 -
.../stand-alone/plugin/html/qdrOverview.html | 224 --
console/stand-alone/plugin/html/qdrSchema.html | 21 -
.../stand-alone/plugin/html/qdrTopology.html | 66 -
.../plugin/html/tmplChartConfig.html | 87 -
.../stand-alone/plugin/html/tmplListChart.html | 40 -
.../stand-alone/plugin/html/tmplListTree.html | 42 -
.../plugin/html/tmplOverviewTree.html | 42 -
console/stand-alone/plugin/js/dispatchPlugin.js | 3 +-
.../stand-alone/plugin/js/dlgChartController.js | 202 --
.../stand-alone/plugin/js/qdrChartService.js | 855 -------
console/stand-alone/plugin/js/qdrCharts.js | 156 --
console/stand-alone/plugin/js/qdrList.js | 901 --------
console/stand-alone/plugin/js/qdrListChart.js | 143 --
console/stand-alone/plugin/js/qdrOverview.js | 1807 ---------------
.../plugin/js/qdrOverviewChartsController.js | 132 --
.../plugin/js/qdrOverviewLogsController.js | 69 -
console/stand-alone/plugin/js/qdrSchema.js | 82 -
console/stand-alone/plugin/js/qdrService.js | 223 --
console/stand-alone/plugin/js/qdrSettings.js | 170 --
.../plugin/js/qdrTopAddressesController.js | 234 --
console/stand-alone/plugin/js/qdrTopology.js | 2079 ------------------
31 files changed, 31 insertions(+), 9911 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/index.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/index.html b/console/stand-alone/index.html
index 8519920..698a058 100644
--- a/console/stand-alone/index.html
+++ b/console/stand-alone/index.html
@@ -44,9 +44,9 @@ under the License.
<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="node_modules/dispatch-console-pages/dist/css/plugin.css" type="text/css"/>
+ <link rel="stylesheet" href="node_modules/dispatch-console-pages/dist/css/dispatch.css" type="text/css"/>
+ <link rel="stylesheet" href="node_modules/dispatch-console-pages/dist/css/dispatchpf.css" type="text/css"/>
</head>
<body ng-app="QDR" ng-controller="QDR.Core">
@@ -65,21 +65,6 @@ under the License.
</a>
</div>
<div class="collapse navbar-collapse navbar-collapse-1">
-<!--
- <ul class="nav navbar-nav navbar-utility">
- <li class="dropdown">
- <a class="dropdown-toggle" data-toggle="dropdown">
- <span class="pficon pficon-user"></span>
- User <b class="caret"></b>
- </a>
- <ul class="dropdown-menu">
- <li>
- <a href="/#!/connect">Disconnect</a>
- </li>
- </ul>
- </li>
- </ul>
--->
<ul class="nav navbar-nav navbar-primary" 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.name"></a>
@@ -131,20 +116,20 @@ under the License.
<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>
-<script type="text/javascript" src="plugin/js/qdrOverviewChartsController.js"></script>
-<script type="text/javascript" src="plugin/js/qdrTopAddressesController.js"></script>
-<script type="text/javascript" src="plugin/js/dlgChartController.js"></script>
<script type="text/javascript" src="plugin/js/navbar.js"></script>
-<script type="text/javascript" src="plugin/js/qdrList.js"></script>
-<script type="text/javascript" src="plugin/js/qdrListChart.js"></script>
-<script type="text/javascript" src="plugin/js/qdrCharts.js"></script>
-<script type="text/javascript" src="plugin/js/qdrSchema.js"></script>
-<script type="text/javascript" src="plugin/js/qdrService.js"></script>
-<script type="text/javascript" src="plugin/js/qdrChartService.js"></script>
-<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="node_modules/dispatch-console-pages/dist/js/qdrOverview.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrOverviewLogsController.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrOverviewChartsController.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrTopAddressesController.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/dlgChartController.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrList.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrListChart.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrCharts.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrSchema.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrService.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrChartService.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrTopology.js"></script>
+<script type="text/javascript" src="node_modules/dispatch-console-pages/dist/js/qdrSettings.js"></script>
<script type="text/javascript">
//angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/package-lock.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/package-lock.json b/console/stand-alone/package-lock.json
new file mode 100644
index 0000000..f9c938f
--- /dev/null
+++ b/console/stand-alone/package-lock.json
@@ -0,0 +1,13 @@
+{
+ "name": "dispatch-console-stand-alone",
+ "version": "1.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "dispatch-console-pages": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dispatch-console-pages/-/dispatch-console-pages-0.1.0.tgz",
+ "integrity": "sha512-aucycnMcS8MzgNrnPt8KM9Y5MDcpxcRswG3pBNyz9daTVXew6oZP0wk9Lnh/GN4j0M6leo3K7SnE/cS4N66Org=="
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/package.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/package.json b/console/stand-alone/package.json
index 6b4df49..a8dcac8 100644
--- a/console/stand-alone/package.json
+++ b/console/stand-alone/package.json
@@ -35,6 +35,7 @@
"d3": "^3.5.14",
"d3-queue": "^3.0.7",
"d3-time-format": "^2.1.1",
+ "dispatch-console-pages": "^0.1.0",
"dispatch-management": "^0.1.0",
"html5shiv": "^3.7.3",
"jquery": "^3.2.1",
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/css/brokers.ttf
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/brokers.ttf b/console/stand-alone/plugin/css/brokers.ttf
deleted file mode 100644
index ae83968..0000000
Binary files a/console/stand-alone/plugin/css/brokers.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 670b158..0000000
--- a/console/stand-alone/plugin/css/dispatch.css
+++ /dev/null
@@ -1,739 +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.
-*/
-
-svg {
- background-color: transparent;
- cursor: default;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -o-user-select: none;
- user-select: none;
-}
-
-svg:not(.active):not(.ctrl) {
- cursor: crosshair;
-}
-#end-arrow-selected, #start-arrow-selected {
- stroke: #33F;
- fill: #33F;
-}
-path.link.selected {
- /* stroke-dasharray: 10,2; */
- stroke: #33F !important;
-}
-
-path.link {
- fill: #000;
- stroke: #000;
- stroke-width: 4px;
- cursor: default;
-}
-
-svg:not(.active):not(.ctrl) path.link {
- cursor: pointer;
-}
-
-path.link.small {
- stroke-width: 2.5;
- stroke: darkgray;
-}
-path.link.highlighted {
- stroke: #6F6 !important;
-}
-marker#start-arrow-highlighted,
-marker#end-arrow-highlighted {
- fill: #6F6;
-}
-marker#start-arrow-small,
-marker#end-arrow-small {
- fill: darkgray;
-}
-
-path.link.dragline {
- pointer-events: none;
-}
-
-path.link.hidden {
- stroke-width: 0;
-}
-
-circle.node {
- stroke-width: 1.5px;
- cursor: pointer;
- stroke: darkgray;
-}
-
-circle.node.reflexive {
- stroke: #F00 !important;
- stroke-width: 2.5px;
-}
-circle.node.selected {
- stroke: #6F6 !important;
- stroke-width: 2px;
- fill: #e0e0ff !important;
-}
-circle.node.highlighted {
- stroke: #6F6;
-}
-circle.node.inter-router {
- fill: #EAEAEA;
-}
-circle.node.normal.in {
- fill: #F0F000;
-}
-circle.node.normal.out {
- fill: #C0F0C0;
-}
-circle.node.on-demand {
- fill: #C0FFC0;
-}
-circle.node.on-demand.artemis {
- fill: #FCC;
- /*opacity: 0.2; */
-}
-
-circle.node.fixed {
- stroke-dasharray: 10,2;
-}
-text {
- font: 12px sans-serif;
- pointer-events: none;
- /*font-family: monospace;*/
-
-}
-
-.tooltipsy
-{
- padding: 10px;
-/* max-width: 320px;*/
- color: #303030;
- background-color: #fcfcfe;
- border: 1px solid #deca7e;
- border-radius: 5px;
-}
-
-.tiptable {
-
-}
-.tiptable tr {
- border-bottom: 1px solid #ccc;
-}
-
-.tiptable tr:last-child {
- border-bottom: 0px;
-}
-
-.tiptable tr:nth-child(even) {
- background: #fcfcfe;
-}
-.tiptable tr:nth-child(odd) {
- background: #FFF
-}
-
-text.id {
- text-anchor: middle;
- font-weight: bold;
-}
-
-text.label {
- text-anchor: start;
- font-weight: bold;
-}
-
-.row-fluid.tertiary {
- position: relative;
- left: 20px;
-}
-
-.row-fluid.tertiary.left {
- float: left;
-}
-
-.row-fluid.tertiary.panel {
- width: 410px;
- /*height: 100%; */
-}
-
-div#topologyForm .ngViewport, div#topologyForm .gridStyle {
- height: auto !important;
- min-height: initial !important;
- overflow: initial;
-}
-
-div#multiple_details, div#link_details {
- height: 300px;
- width: 700px;
- display: none;
- padding: 0.5em;
- border: 1px solid;
- position: absolute;
- background-color: white;
- max-height: 330px !important;
- overflow: hidden;
-}
-div#multiple_details div.ngRow.selected {
- background-color: #c9dde1 !important;
-}
-
-div.grid-values {
- text-align: right;
-}
-
-div.grid-values.ngCellText span {
- padding-right: 4px;
-}
-
-.panel-adjacent {
- margin-left: 430px;
-}
-
-#topologyForm.selected {
- border: 1px solid blue;
-}
-#topologyForm {
- border-right: 1px solid lightgray;
- border-bottom: 1px solid lightgray;
- /*border: 1px solid white;*/
- padding: 2px;
- /* position: relative; */
- /* top: -8px; */
-}
-div.qdr-topology.pane.left .ngViewport {
- /* border: 1px solid lightgray; */
-}
-
-#topologyForm > div {
- width:396px;
-}
-
-/* globe */
-.land {
- fill: #999;
- stroke-opacity: 1;
-}
-
-.graticule {
- fill: none;
- stroke: black;
- stroke-width:.5;
- opacity:.1;
-}
-
-.labels {
- font: 18px sans-serif;
- fill: black;
- opacity: .85;
- text-anchor: middle;
-}
-
-.noclicks { pointer-events:none; }
-
-.point { opacity:.6; }
-
-.arcs {
- opacity:.7;
- stroke: darkgreen;
- stroke-width: 3;
-}
-.flyers {
- stroke-width:1;
- opacity: 0;
- stroke: darkred;
-}
-.arc, .flyer {
- stroke-linejoin: round;
- fill:none;
-}
-.arc { }
-.arc:hover {
- stroke: darkred;
-}
-.flyer { }
-.flyer:hover {
- stroke: darkgreen;
-}
-.arc.inter-router {
- stroke: darkblue;
-}
-
-#addNodeForm {
- padding: 1em;
-}
-
-
-li.currentStep {
- font-weight: bold;
-}
-
-.qdrTopology div.panel {
- position: absolute;
-}
-/*
-.ui-dialog-titlebar {
- border: 0;
- background: transparent;
-}
-*/
-
-/*
-.ui-tabs.ui-tabs-vertical {
- padding: 0;
- width: 48em;
-}
-.ui-tabs.ui-tabs-vertical .ui-widget-header {
- border: none;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
- float: left;
- width: 10em;
- background: #CCC;
- border-radius: 4px 0 0 4px;
- border-right: 1px solid gray;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
- clear: left;
- width: 100%;
- margin: 0.1em 0;
- border: 1px solid gray;
- border-width: 1px 0 1px 1px;
- border-radius: 4px 0 0 4px;
- overflow: hidden;
- position: relative;
- right: -2px;
- z-index: 2;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
- display: block;
- width: 100%;
- padding: 0.1em 1em;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
- cursor: pointer;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: 0.2em;
- padding-bottom: 0;
- border-right: 1px solid white;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
- margin-bottom: 10px;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
- float: left;
- width: 34em;
- border-left: 1px solid gray;
- border-radius: 0;
- position: relative;
- left: -1px;
-}
-
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
- right: -3px !important;
-}
-
-.ui-tabs li i.ui-icon {
- display: inline-block;
-}
-*/
-.ui-tabs .ui-tabs-panel {
- /* padding-top: 0 !important; */
-}
-
-.ui-widget-content fieldset {
- float: left;
- padding: 0 1em 0 0;
-}
-
-.entity-description {
- color: #960;
- font-size: 90%;
-}
-
-.attr-description {
- padding-top: 1.5em;
- float: right;
- width: 17em;
-}
-.attr-annotations {
- padding-top: 2.5em;
- clear: both;
-}
-.attr-annotations > span {
- padding-top: 0.5em;
- border-top: 1px dashed darkgray;
- display: block;
-}
-
-.attr-type {
- color: #990;
- font-size: 85%;
-}
-.attr-required {
- color: red;
- font-size: 85%;
-}
-.attr-unique {
- color: green;
- font-size: 85%;
-}
-
-#tabs.nodeEntities {
- border: 0;
-}
-
-#tabs ul.nodeTabs {
- background: #fff;
-}
-
-#tabs #Container {
- border-left: 1px solid #aaa;
-}
-
-#tabs.ui-tabs .ui-tabs-nav li {
- border-bottom: 1px solid #aaa !important;
-}
-
-.entity-fields {
- /* height: 400px; */
- overflow-y: scroll;
- overflow-x: hidden;
-}
-
-div.boolean label:first-child {
- float: left;
- margin-right: 1em;
-}
-div.boolean {
- padding-bottom: 1em;
-}
-
-.entity-fields label {
- font-weight: 600;
- margin-top: 0.5em;
- display: inline;
-}
-
-.aggregate {
- text-align: right;
-}
-
-.aggregate i {
- float: right;
- /* margin: 3px 3px 3px 8px; */
-}
-
-.aggregate .hastip {
- padding: 5px;
-}
-
-.subTip .tipsy-inner {
- background-color: white;
- color: black;
- font-size: 1.3em;
- border: 1px solid black;
-}
-
-.subTip .tipsy-arrow-n { border-bottom-color: black; }
-.subTip .tipsy-arrow-s { border-top-color: black; }
-.subTip .tipsy-arrow-e { border-left-color: black; }
-.subTip .tipsy-arrow-w { border-right-color: black; }
-
-
-.contextMenu {
- display:none;
- position:absolute;
- left:30px;
- top:-30px;
- z-index:999;
- /* width:300px; */
-}
-.contextMenu ul {
- width:300px;
- margin:0;
- padding-left:0;
- list-style:none;
- background:#fff;
- color:#333;
- font-weight: 600;
- /* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
- -moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
- border: 1px solid #aaa;
-}
-.contextMenu ul li {
- padding:5px 10px;
- /* border-bottom: solid 1px #ccc; */
-}
-.contextMenu ul li:hover {
- background:#4a90d9; color:#fff;
-}
-.contextMenu ul li:last-child {
- border:none;
-}
-
-.na {
- display: none;
-}
-.contextMenu ul li.new {
- display: block;
-}
-.contextMenu ul li.adding, .contextMenu ul li.adding + li {
- display: block;
-}
-.contextMenu ul li.force-display {
- display: block;
-}
-.contextMenu ul li.context-separator {
- background-color: lightgray;
- height: 1px;
- padding: 0;
-}
-
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
- margin-top: 1em;
-}
-
-#crosssection {
- display: none;
- position: absolute;
- top: 200px;
- left: 600px;
-}
-
-.cross-rect {
- /* fill: #cfe2f3; */
-}
-.cross-line {
- stroke: black;
- stroke-width: 4px;
-}
-
-.node circle {
-/* fill: rgb(31, 119, 180);
- fill-opacity: .25; */
- fill: #cfe2f3;
- fill-opacity: .98;
- stroke: black;
- stroke-width: 3px;
-}
-
-circle.subcircle {
- stroke-width: 1px;
- /* stroke-dasharray: 2; */
- fill-opacity: 0;
- stroke: darkgray;
-}
-
-.leaf circle {
- fill: #6fa8dc;
- fill-opacity: 0.95;
- stroke-width: 3px;
-}
-
-.leaf circle[title] {
- font-family: monospace;
-
-}
-
-#svg_legend {
- position: absolute;
- top: 110px;
- right: 0;
- border: 1px solid #ccc;
- border-radius: 5px;
- background-color: #fcfcfc;
- margin-right: 1.3em;
- padding: 1em;
-}
-
-#svg_legend svg {
- height: 235px;
- width: 180px;
-}
-
-#multiple_details div.gridStyle {
-/* height: 50em; */
- min-height: 70px !important;
- height: auto !important;
-}
-
-#multiple_details .ngViewport {
- height: auto !important;
-}
-
-#multiple_details .gridCellButton button, #link_details .gridCellButton button {
- margin: .25em .4em;
- font-size: 12px;
- height: 2em;
- padding-top: .1em;
-}
-
-#linkFilter {
- display: none;
- padding: 0.5em;
- border: 1px solid grey;
- background-color: #F0F0F0;
- position: absolute;
- z-index: 100;
- right: 1em;
-}
-div.formLine label, div.formLine input {
- display: inline-block;
- padding: 0 8px;
-}
-
-span.filter-icon {
- padding-left: 1em;
-}
-
-button.filter-close {
- width: 15px;
- height: 20px;
- padding: 0;
- position: absolute;
- right: 4px;
- top: 4px;
-}
-
-div.filter-title h6 {
- margin: 0 0 0.5em 0;
-}
-
-.links button.btn-filter {
- padding: 0 1em 0 0;
- margin-left: 1em;
- font-size: 1em;
-}
-
-button.btn-filter {
- float: right;
-}
-span.fancytree-expanded button.btn-filter,
-a.fancytree-title:hover button.btn-filter {
- visibility: visible;
-}
-
-div.hdash-button a {
- color: white;
-}
-
-.linkDirIn {
- color: red;
- background-color: #f3f3f3;
-}
-
-.linkDirOut {
- color: blue;
- background-color: white;
-}
-
-div.topoGrid .ui-grid-viewport {
- overflow: hidden !important;
-}
-
-@-moz-document url-prefix() {
- .btn {padding: 2px 12px 8px !important;}
- #overview-controller .btn {padding: 4px 12px !important;}
- #overview-controller .btn.filter-close {padding: 0 !important;}
-}
-
-.ui-fancytree.fancytree-container {
- font-size: 14px;
-}
-
-.grid-title {
- background-color: #FAFAFA;
- background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
- background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F2F2F2', GradientType=0);
- border-bottom: 1px solid #d4d4d4;
- text-shadow: 0 1px 0 #FFFFFF;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
- margin: 0 0 10px 0;
- padding-bottom: 4px;
-}
-
-.expand-collapse {
- float: right;
- margin-right: 0.5em;
-}
-
-.pane-viewport {
- top: 26px !important;
-}
-.fancytree-node.loading {
- position: initial;
-}
-
-.hideLeft {
- position: absolute;
- right: 0.5em;
- top: 1em;
- border: 0;
-}
-
-.showLeft {
- position: absolute;
- top: 1em;
- left: 0.5em;
- border: 0;
-}
-
-.newChart {
- float: right;
-}
-
-select.unique, input.unique {
- border: 2px solid blue;
-}
-select.required, input.required {
- border: 2px solid black;
-}
-
-.required-indicator {
- padding-left: 0.5em;
- font-size: 0.85em;
- vertical-align: super;
-}
-
-.required-indicator::before {
- content: '(required)'
-}
-
-.unique-indicator {
- padding-left: 0.5em;
- font-size: 0.85em;
- vertical-align: super;
-}
-
-.unique-indicator::before {
- content: '(must be unique if supplied)'
-}
-
-.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/502538b4/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
deleted file mode 100644
index c469d19..0000000
--- a/console/stand-alone/plugin/css/dispatchpf.css
+++ /dev/null
@@ -1,313 +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
-*/
-
-/* The following are for matching Patternfly styles */
-span.logo {
- letter-spacing: 4px;
-}
-
-.navbar-pf .navbar-brand {
- padding: 2px 0 2px;
-}
-/* using fancytree instead of treeview */
-
-#overtree ul.fancytree-container,
-#entityTree ul.fancytree-container,
-#schema ul.fancytree-container {
- background-color: transparent;
- border: 0px;
-}
-
-span.fancytree-folder a {
- font-weight: normal;
- font-size: 12px;
-}
-
-ul.fancytree-container li,
-span.fancytree-icon {
- background-image: none;
-}
-
-.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;
-}
-.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";
-}
-.fancytree-exp-e span.fa-angle:before, .fancytree-exp-el span.fa-angle:before {
- font-family: FontAwesome;
- content: "\f107";
-}
-
-.fancytree-ico-ef span.fancytree-icon, .fancytree-ico-cf span.fancytree-icon {
- background-image: initial;
- font-family: FontAwesome;
-}
-
-/* closed folder */
-.fancytree-ico-cf span.fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f07b";
-}
-/* expanded folder */
-.fancytree-ico-ef span.fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f07c";
-}
-/* chart */
-.fancytree-ico-cf.charts span.fancytree-icon:before, .fancytree-ico-ef.charts span.fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f080";
-}
-
-
-ul.fancytree-container a {
- color: #363636;
-}
-
-/* override left and right pane styles */
-#overview-controller .col-sm-3,
-#list-controller .col-sm-3,
-#schema .col-sm-3,
-.qdr-topology-form.col-sm-3 {
- padding-left: 0px;
-}
-
-.qdr-topology-form.col-sm-3 {
- padding-right: 0px;
-}
-
-#overview-controller .ngViewport {
- height: auto !important;
-}
-
-.pane-wrapper {
- padding-top: 0.5em;
-}
-
-div#list-controller {
- padding-left: 0px;
-}
-
-.pane-viewport {
- position: relative;
- /* height: calc(100vh - 20px); */
- overflow: auto;
-}
-
-#list-controller .tree-header, #list-controller .tree-header select {
- width: 100%;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline;
- width: auto;
- height: auto;
- line-height: normal;
- vertical-align: baseline;
- background-image: none;
- background-position: 0% 0%;
- background-repeat: repeat;
- margin-top: 0;
-}
-[class^="icon-"],
-[class*=" icon-"] {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- text-decoration: inherit;
- -webkit-font-smoothing: antialiased;
- *margin-right: .3em;
-}
-
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
- text-decoration: inherit;
- display: inline-block;
- speak: none;
-}
-
-.icon-bar-chart:before {
- font-family: FontAwesome;
- content: "\f080";
-}
-
-.icon-step-forward:before {
- font-family: FontAwesome;
- content: "\f051";
-}
-.icon-step-backward:before {
- font-family: FontAwesome;
- content: "\f048";
-}
-
-[class^="icon-"]:before, [class*=" icon-"]:before {
- text-decoration: inherit;
- display: inline-block;
- speak: none;
-}
-
-#svg_legend {
- top: 10px;
-}
-
-#topologyForm > div {
- width: auto;
-}
-
-div.chartContainer {
- width: auto;
- margin-top: 1em;
-}
-
-#dispatch-login-container {
- width: 90em;
-}
-
-#dispatch-login-container .alert {
- padding-right: 47px;
-}
-
-.fa-edit:before, .fa-trash-o:before {
- font-family: FontAwesome;
-}
-
-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;
-}
-
-.dispatch-c3-tooltip {
- border-collapse: collapse;
- border-spacing: 0;
- background-color: #fff;
- empty-cells: show;
- -webkit-box-shadow: 7px 7px 12px -9px #777777;
- -moz-box-shadow: 7px 7px 12px -9px #777777;
- box-shadow: 7px 7px 12px -9px #777777;
- opacity: 0.9;
-
-}
-
-.dispatch-c3-tooltip tr {
- border: 1px solid #CCC;
-}
-
-.dispatch-c3-tooltip th {
- background-color: #aaa;
- font-size: 13px;
- padding: 2px 5px;
- text-align: left;
- color: #FFF;
- font-weight: normal;
-}
-
-.dispatch-c3-tooltip td {
- font-size: 13px;
- padding: 3px 6px;
- background-color: #fff;
- border-left: 1px dotted #999;
-}
-
-.chart-tip-legend {
- width: 10px;
- height: 10px;
- display: inline-block;
- margin-right: 4px;
-}
-
-th.text-center {
- text-align: center;
-}
-
-.clearfix:after {
- content: "";
- display: table;
- clear: both;
-}
-
-#topAddresses.grid {
- min-height: 190px;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index fc0fa60..0000000
--- a/console/stand-alone/plugin/css/plugin.css
+++ /dev/null
@@ -1,1038 +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.
-*/
-main-display > .span8 {
- height: 100%;
- position: relative;
-}
-
-ul.qdrListNodes > li > span {
- padding: 6px 20px; 6px; 6px;
- display: block;
-}
-
-.qdrList .grid {
- width: 20em;
- margin-right: 0;
- float: left;
-}
-
-
-.qdrList div.gridDetails {
- width: auto;
-}
-
-div.gridDetails {
- margin-left: 1em;
-}
-
-.selectedItems {
- /* margin-left: 21em; */
-}
-
-.qdrListPane {
- top: 110px;
-}
-
-.qdrListActions {
- width: auto;
- margin-left: 1em;
-}
-
-div.listAttrName {
- padding-top: 5px;
-}
-
-div.listAttrName button {
- float: right;
- margin: 3px 5px;
-}
-
-div.listAggrValue button {
- margin: 3px 5px;
-}
-
-@-moz-document url-prefix() {
- div.listAttrName button {
- top: -24px;
- position: relative;
- margin: 3px 0px;
- padding: 0 5px !important;
- }
-}
-
-div.listAttrName i.icon-bar-chart.active, div.hastip i.icon-bar-chart.active, li.haschart i {
- /*background-color: #AAFFAA; */
-}
-
-div#main div ul.nav li a:not(.btn) {
- background: initial !important;
-}
-
-div#main div ul.nav li.active a {
- background-color: #f0f0ff !important;
-}
-
-div#main.qdr {
- margin-top: 56px !important;
-}
-
-div.charts-header {
- font-size: 1.2em;
- color: #666666;
- margin: 1em 0;
-}
-
-.selectedNode, .selectedAction, .selectedEntity {
- font-weight: 600;
- color: #606066;
-}
-
-.okButton {
- text-align: center;
- margin: 1em;
-}
-
-span.showChartsLink {
- border: 1px solid blue;
- padding: 1px 2px;
-}
-
-div.listGraphs p {
- margin: 1em 0 2em 2em;
- text-align: center;
-}
-
-div.centered {
- text-align: center;
- margin: 4em;
-}
-
-.modal-body.centered {
- margin: 0;
-}
-
-/* dialog */
-div.aChart {
- height: 200px;
- width: 400px;
- margin: 1em;
-}
-
-/* dashboard */
-div.aChart.hDash {
- /* width: 21em; */
- /* height: 17em; */
- width: 100%;
- height: 87%;
- margin: 0;
- padding: 0;
-
-}
-div.chartContainer {
- float: left;
- width: 100%;
- height: 100%;
- overflow: hidden;
-}
-
-/* the x and y axis lines */
-.d3Chart g.axis path.domain {
- stroke-width: 1;
- stroke: black;
-}
-
-/* the line surrounding the area chart */
-div.d3Chart path {
-/* stroke: black; */
-/* stroke-width: 0; */
-/* opacity: 0.5; */
-}
-
-/* the line above the area chart */
-/* the color gets overridden */
-div.d3Chart path.line {
- stroke: steelblue;
- stroke-width: 1.5;
- fill: none;
- opacity: 1;
-}
-
-.mo-rect {
- fill: #ffffdd;
- stroke: #f0f0f0;
- stroke-width: 1;
-}
-
-.mo-guide {
- fill: none;
- stroke: #d0d0d0;
- stroke-width: 2;
- stroke-dasharray: 3,3;
-}
-
-div.d3Chart .title {
- text-decoration: underline;
-}
-
-
-.axis line, .axis path {
- fill: none;
- shape-rendering: crispEdges;
- stroke-width: 1;
- stroke: #000000;
-}
-
-.axis line {
- stroke: #C0C0C0;
- stroke-dasharray: 1,1;
- opacity: 0.5;
-}
-
-.y.axis text, .x.axis text, .focus text, div.d3Chart .title {
- font-size: 12px;
-}
-
-.y.axis path {
- stroke: #000;
- }
-
-.overlay {
- fill: none;
- pointer-events: all;
- }
-
-.focus circle {
- fill: none;
- stroke: steelblue;
- }
-.focus .fo-table {
- /* box-shadow: 2px 2px 3px #EEE; */
-}
-
-div.d3Chart {
- /* padding: 1em 0; */
- /* border: 1px solid #C0C0C0; */
- margin-bottom: 2em;
-}
-div.d3Chart.hDash {
- border: 0px;
-}
-
-div.d3Chart .axis path {
- display: inherit;
-}
-
-.c3-circle {
- /* display: none; */
-}
-
-.fo-table {
- border: 1px solid darkgray;
- background-color: white;
- font-size: .85em;
-}
-
-.fo-table td {
- padding: 4px;
- border-left: 1px solid darkgray;
-}
-.fo-table tr.detail td {
- padding: 1px 4px;
-}
-.fo-title {
- color: white;
- background-color: darkgray;
-}
-
-.fo-table-legend {
- width: 8px;
- height: 8px;
- border: 1px solid black;
- margin: 0 4px;
- display: inline-block;
-}
-
-svg .legend {
- dominant-baseline: central;
-}
-
-div.chartContainer div.aChart {
- margin-top: 0.5em;
-}
-
-#list-controller .tree-header {
- position: absolute;
- height: auto;
-}
-
-#list-controller select {
- height: 25px;
- float: left;
- padding: 0;
-}
-
-
-div#main.qdr div ul.nav li.active a {
- background-color: #e0e0ff !important;
- color: #000000;
-}
-
-div#main.qdr .selected, .box.selected {
- color: #000000;
- text-shadow: none;
-}
-
-/* the selected node on the list page */
-div.qdrList li.active, ul.qdrListNodes li.active {
- background-color: #e0e0ff;
-}
-
-div.qdr-attributes span.fancytree-selected a {
- background-color: #e0e0ff;
-}
-div.qdr-attributes.pane, div.qdr-topology.pane {
- position: absolute;
- margin-left: 10px;
-}
-div.qdr-overview.pane {
- position: absolute;
-}
-div.qdr-topology.pane.left {
- width: auto;
- /*border-right: 1px solid lightgray; */
-}
-
-/* the selected row in the name table */
-div#main.qdr div.qdrList div.selected {
- background-color: #e0e0ff !important;
-}
-
-#dialogChart, #dialogEditChart {
- height: 220px;
-}
-
-.chartOptions .modal-body {
- overflow-y: initial;
-}
-
-div.qdrCharts p.chartLabels button {
- float: right;
-}
-
-div.qdrCharts p.chartLabels {
- padding-right: 1em;;
- }
-
-p.dialogHeader {
- text-align: center;
-}
-
-p.dialogHeader input {
- margin-top: 10px;
- width: 480px;
-}
-
-.ui-slider-tick {
- position: absolute;
- background-color: #666;
- width: 2px;
- height: 8px;
- top: 12px;
- z-index: -1;
-}
-
-label.rateGroup {
- float: left;
-}
-
-div.chartOptions div.dlg-slider {
- float: left;
- width: 28em;
- font-size: 14px;
-}
-
-div.chartOptions div.duration {
- width: 35em !important;
-}
-
-div.chartOptions .slider {
- margin-top: 1em;
- margin-bottom: 1em;
-}
-
-input[type="radio"] {
- margin-top: 0 !important;
-}
-
-div.chartOptions legend {
- font-size: 1.2em;
- font-weight: bold;
- margin-bottom: 10px;
-}
-
-div.chartOptions tab > div {
- margin-left: 1em;
-}
-
-div.chartOptions span.minicolors-swatch {
- width: 14px;
- height: 14px;
-}
-
-.minicolors-input {
- width: 4em;
- padding: 0 0 0 24px !important;
-}
-
-div.colorPicker div.colorText {
- display: inline-block;
- width: 10em;
-}
-div.colorPicker div:nth-of-type(1), /* first span under div.colorPicker */
- div.minicolors{
- float:left;
- margin-right: 0.5em;
-}
-
-div.chartOptions p.sep {
- height: 1em;
-}
-
-ul.nav-tabs {
- border-bottom: 1px solid #ddd !important;
-}
-
-.chartOptions ul.nav-tabs {
- margin-bottom: 0px !important;
-}
-
-div.tabbable div.tab-content {
- overflow: visible;
-}
-
-div.tabbable ul.nav-tabs > .active > a {
- background-color: #f8f8f8;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-
-div.tabbable .tab-pane {
- background-color: #f8f8f8;
- padding: 12px;
- border-right: 1px solid #ddd;
- border-left: 1px solid #ddd;
- border-bottom: 1px solid #ddd;
-}
-div.dlg-large div.tabbable .tab-pane {
- margin-left: 11em;
-}
-
-div.tabbable ul.nav-tabs {
- margin-bottom: 0;
-}
-
-ul.qdrTopoModes {
- position: relative;
- top: -10px;
-}
-.overview.section {
- /* width: 35em; */
-}
-.overview.section .ngGrid {
- height: 12em !important;
- min-height: 12em !important;
-}
-
-.overview.routers.section .ngGrid {
- height: 16em !important;
- min-height: 16em !important;
-}
-.overview.routers.section {
- /*width: 15em; */
- }
-
-.grid-align-value {
- text-align: right;
-}
-
-.grid-align-value .ngCellText {
- padding-right: 10px;
-}
-
-.overview .ngRow:hover {
- background:#e0e0ff;
-}
-
-.overview-cell .ngCell:hover {
- background:#e0e0ff;
-}
-.overview-cell .ngCell.col0:hover, .overview-cell .ngCell.col1:hover {
- background: initial;
-}
-
-
-.qdr-overview.pane.left, .qdr-attributes.pane.left {
- top: 104px;
-}
-.qdr-topology.pane.left {
- top: 104px;
-}
-.qdr-overview.pane.left, .qdr-attributes.pane.left, .qdr-topology.pane.left {
- left: 10px;
-}
-
-.overview-tree, .qdr-attributes {
- min-height: calc(100vh - 90px)
-}
-.treeContainer {
- width: 100%;
- float: left;
-}
-
-.pane-content {
- overflow: auto;
-}
-
-#entityNames {
- width: 20em;
- float: left;
-}
-
-.treeDetails {
- margin-left: 260px;
-}
-
-.grid:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
- /*background-color: #e0e0ff; */
- background-color: #e9f2f9
-}
-.ngCellText {
- padding: 4px 0 0 4px;
-}
-
-.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
- background-color: #e0e0ff;
-}
-
-.tab-content .tab-pane {
- background-color: #f8f8f8;
- padding: 12px;
- border-right: 1px solid #ddd;
- border-left: 1px solid #ddd;
- border-bottom: 1px solid #ddd;
-}
-
-div.chartOptions ul.nav-tabs > .active > a {
- background-color: #f8f8f8;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-div.chartOptions label:nth-of-type(2) {
- margin-left: 1em;
-}
-div.chartOptions label {
- font-weight: normal;
- display: inline-block;
-}
-
-/*
-.form-horizontal .control-label {
- float: left;
- width: 160px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- margin-left: 180px;
-}
-
-.form-horizontal input, {
- display: inline-block;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
- transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
- display: inline-block;
- width: 200px;
- padding: 4px 6px;
- margin-bottom: 10px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- vertical-align: middle;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.login input[type="checkbox"] {
- margin-top: 0.75em;
-}
-*/
-
-#dispatch-login-container {
- /* width: 18.5em; */
- margin-top: 2em;
-}
-/*
-div.login.container {
- width: 550px;
-}
-*/
-
-
-#overtree .fancytree-container {
- border: 0px;
-}
-
-#overtree span.fancytree-alert-icon.ui-icon-refresh {
- background-position: -64px -80px;
-}
-#overtree span.fancytree-alert-icon.ui-icon-transfer-e-w {
- background-position: -112px -80px;
-}
-
-#alerts {
- position: fixed;
- right: 0;
- top: 0;
- z-index: 100;
-}
-
-.alert-enter,
-.alert-leave,
-.alert-move {
- -webkit-transition: 1s linear all;
- -moz-transition: 1s linear all;
- -o-transition: 1s linear all;
- transition: 1s linear all;
- position:relative;
-}
-
-.alert-enter {
- left:-10px;
- opacity:0;
-}
-.alert-enter.alert-enter-active {
- left:0;
- opacity:1;
-}
-
-.alert-leave {
- left:0;
- opacity:1;
-}
-.alert-leave.alert-leave-active {
- left:-10px;
- opacity:0;
-}
-
-.alert-move {
- opacity:0.5;
-}
-.alert-move.alert-move-active {
- opacity:1;
-}
-
-.overview .table-striped tr:hover td {
- background-color: #e0e0ff !important;
-}
-
-#entityNames div.ngViewport {
- overflow-x: hidden;
-}
-
-.connect-column.connect-form {
- width: 20em;
-}
-
-.chartLabels button a {
- text-decoration: none;
-}
-
-.fancytree-ico-c.router .fancytree-icon {
-
-}
-
-.tabs-left .nav-tabs {
- float: left;
-}
-.tabs-left .nav-tabs > li {
-/* float: initial; */
-}
-
-div.modal.dlg-large {
- width: 53em;
-}
-
-button.hdash-button a {
- text-decoration: none;
- color: #fff;
-}
-
-div.widget-body > div {
- height: 100%;
-}
-
-div.qdrCharts {
- height: 100%;
-}
-
-ul.dispatch-view {
- margin-bottom: 0 !important;
-}
-
-.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(.fancytree-has-children).address .fancytree-icon:before,
-span:not(.fancytree-has-children).router\.address .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0ac";
-}
-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(.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(.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 .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0ac";
-}
-
-span:not(.fancytree-has-children).connection.external .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f109";
-}
-span:not(.fancytree-has-children).connection.normal .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f08e";
-}
-span:not(.fancytree-has-children).connection.external.quiesced .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f14c";
- color: red;
-}
-span:not(.fancytree-has-children).connection.inter-router .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f07e";
-}
-span:not(.fancytree-has-children).connection.router-control .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f013";
-}
-span:not(.fancytree-has-children).no-data .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f05e";
- color: red !important;
-}
-span:not(.fancytree-has-children).loading .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f254";
-}
-span:not(.fancytree-has-children).connector .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f126";
-}
-span:not(.fancytree-has-children).container .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f16c";
-}
-span:not(.fancytree-has-children).log .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0f6";
-}
-span:not(.fancytree-has-children).router\.node .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f013";
-}
-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(.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(.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(.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(.fancytree-has-children).listener .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f025";
-}
-span:not(.fancytree-has-children).connection .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f07e";
-}
-span:not(.fancytree-has-children).connection.console .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f108";
-}
-span:not(.fancytree-has-children).waypoint .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0ec";
-}
-span:not(.fancytree-has-children).router .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f047";
-}
-span:not(.fancytree-has-children).fixedAddress .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f015";
-}
-span:not(.fancytree-has-children).linkRoutePattern .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f039";
-}
-span:not(.fancytree-has-children).allocator .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f170";
-}
-span:not(.fancytree-has-children).policy .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f256";
-}
-span:not(.fancytree-has-children).logStats .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f080";
-}
-span:not(.fancytree-has-children).autoLink .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0c1";
-}
-span:not(.fancytree-has-children).authServicePlugin .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f0c1";
-}
-span:not(.fancytree-has-children).sslProfile .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f023";
-}
-span:not(.fancytree-has-children).vhost .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f108";
-}
-span:not(.fancytree-has-children).vhostStats .fancytree-icon:before {
- font-family: FontAwesome;
- content: "\f080";
-}
-
-
-.ngCellText {
-/* color: #333333; */
-}
-
-.changed {
- color: #339933;
-}
-
-div.dispatch-router div.help {
- width: auto;
- padding: 1em;
- background-color: lavender;
- border-radius: 6px;
- margin-top: 1em;
- text-align: center;
-}
-
-div.operations tr:nth-child(even) {
- background: #f3f3f3;
-}
-div.operations tr:nth-child(odd), div.operations tr:last-child {
- background: #fff;
-}
-
-div.operations tr input {
- margin: 0;
- padding: 3px 6px;
-}
-div.operations table {
- width: 100%;
-}
-div.operations th {
- width: 50%;
- border-bottom: 1px solid #cccccc;
- text-align: left;
-}
-div.operations td:nth-child(odd), div.operations th:nth-child(odd) {
- border-right: 1px solid #cccccc;
-}
-div.operations td:nth-child(odd) {
- padding-left: 0;
-}
-div.operations td:nth-child(even), div.operations th:nth-child(even) {
- padding-left: 5px;
-}
-div.operations th {
- padding: 5px;
-}
-div.operations .tab-pane.active {
- padding: 12px 12px 12px 0;
-}
-div.operations label {
- padding-top: 4px;
- margin-bottom: 4px;
-}
-.qdrListActions .ngGrid {
- /*min-height: 40em;
- height: 100%; */
-}
-div.qdrListActions .ngViewport {
- height: initial !important;
-}
-
-div.operations .boolean {
- padding-bottom: 0;
-}
-
-table.log-entry {
- margin-bottom: 1em;
- border-top: 1px solid black;
-}
-
-table.log-entry pre {
- background-color: #f5f5f5;
- color: inherit;
- margin: 0;
- white-space: pre-wrap;
-}
-
-circle.node.normal.console {
- fill: lightcyan;
-}
-circle.node.artemis {
- fill: lightgreen;
-}
-circle.node.route-container {
- fill: orange;
-}
-
-text.console, text.on-demand, text.normal {
- font-family: FontAwesome;
- font-weight: normal;
- font-size: 16px;
-}
-
-@font-face {
- font-family:"Brokers";
- src: url("brokers.ttf") /* TTF file for CSS3 browsers */
-}
-
-text.artemis {
- font-family: Brokers;
- font-size: 20px;
- font-weight: bold;
-}
-
-text.qpid-cpp {
- font-family: Brokers;
- font-size: 18px;
- font-weight: bold;
-}
-
-i.red {
- color: red;
-}
-
-.qdrListActions div.delete {
- width: 20em;
- margin: auto;
- border: 1px solid #eaeaea;
- height: 5em;
- padding: 4em;
- background-color: #fcfcfc;
-}
-
-.btn:focus {
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {
- outline:3px solid rgba(82, 168, 236, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-btn.disabled, .btn[disabled] {
- opacity: 0.35;
-}
-
-#dispatch-login-container .ng-invalid-range {
- border-color: #e9322d !important;
-}
-
-div#durationSlider, div#rateSlider {
- margin-top: 1em;
-}
-
-.list-grid {
- padding-left: 10px;
-}
-
-.ngViewport.ng-scope {
- height: auto !important;
-}
-
-div#list-controller {
- padding-left: 300px;
-}
-
-.listening-on {
- background-color: #CCFFCC;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/html/qdrCharts.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrCharts.html b/console/stand-alone/plugin/html/qdrCharts.html
deleted file mode 100644
index d2bd38c..0000000
--- a/console/stand-alone/plugin/html/qdrCharts.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.
--->
-<div class="main-display row-fluid qdrCharts" ng-controller="QDR.ChartsController">
- <div ng-show="hasCharts()">
- <div ng-repeat="chart in svgCharts" class="chartContainer">
- <p class="chartLabels">
- <button ng-click="delChart(chart)" title="Delete"><span class="fa-trash-o"></span></button>
- <button ng-click="editChart(chart)" title="Configure"><span class="fa-edit"></span></button>
-<!-- <button ng-click="zoomChart(chart)" title="Zoom {{chart.zoomed ? 'in' : 'out'}}" ng-if="!chart.chart.request().nodeList"><i ng-class="chart.zoomed ? 'fa-zoom-in' : 'icon-zoom-out'"></i></button> -->
- </p><div style="clear:both"></div>
- <div id="{{chart.chart.id()}}" class="line-chart-pf aChart d3Chart"></div>
- </div>
- <div ng-init="chartsLoaded()"></div>
- </div>
- <div ng-hide="hasCharts()" class="centered">
- There are no charts. To add charts to this page, click on a <i class="icon-bar-chart"></i> icon on the <button ng-click="showListPage()"><i class="icon-list "></i> Entities</button> page.
- </div>
-</div>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 26c4d60..0000000
--- a/console/stand-alone/plugin/html/qdrConnect.html
+++ /dev/null
@@ -1,83 +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.
--->
-
-<div class="row-fluid" ng-controller="QDR.SettingsController">
- <div class="login container" ng-hide="connecting">
- <div class="row" id="dispatch-login-container">
- <div class="connect-column">
- <div class="col-md-2 control-label"></div>
- <div class="col-md-6 alert alert-success">
- <p>
- Enter the address and a HTML-enabled port of a <strong><a href="http://qpid.apache.org/components/dispatch-router/" target="_blank">Qpid Dispatch Router</a></strong> to connect..
- </p>
- <!--
- <p>
- If Autostart is checked, you will be automatically logged in to the router the next time you start the console.
- </p> -->
-
- </div>
- </div>
- <p style="clear:left;"></p>
- <div class="connect-form">
- <form class="form-horizontal no-bottom-margin" novalidate ng-submit="connect()" name="settings">
- <div class="form-group">
- <label class="col-md-2 control-label" for="address">Address: </label>
- <div class="col-md-6">
- <input tabindex="1" id="address" type="text" ng-model="formEntity.address" placeholder="localhost" name="address" autofocus="autofocus" class="ng-pristine ng-valid ng-valid-required"></div>
- </div>
- <div class="form-group">
- <label tabindex="-1" class="col-md-2 control-label" title="Ports to connect to, by default 5673" for="port">Port: </label>
- <div class="col-md-6">
- <input tabindex="2" id="port" posint type="number" placeholder="5673" tooltip="Ports to connect to, by default 5673" ng-model="formEntity.port" name="port" title="Ports to connect to, by default 5673">
- <span ng-show="settings.port.$error.range">Must be 1 through 65535</span>
- </div>
- </div>
-<!--
- <div class="form-group">
- <label tabindex="-1" class="col-md-2 control-label" title="Whether or not the connection should be started as soon as you log in" for="autostart">Autostart: </label>
- <div class="col-md-6">
- <input tabindex="3" id="autostart" type="checkbox" tooltip="Whether or not the connection should be started as soon as you log into hawtio" ng-model="formEntity.autostart" name="autostart" title="Whether or not the connection should be started as soon as you log into hawtio"
- class="ng-scope ng-pristine ng-valid"></div>
- </div>
--->
- <input tabindex="-1" type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
- <p></p>
- <div class="form-group">
- <label tabindex="-1" class="col-md-2 control-label" title="button"></label>
- <div class="col-md-6">
- <button type="submit" tabindex="4" class="btn btn-primary pull-left" ng-disabled="settings.$invalid">{{buttonText()}}</button>
- </div>
- </div>
- </form>
-
-
- </div>
- </div>
- </div>
-
- <div class="centered" ng-show="connecting">
- <i class="icon-spin icon-spinner icon-4x"></i>
- <p>Please wait, connecting now...</p>
- </div>
- <div class="centered error" ng-show="connectionError">
- <p>There was a connection error: {{connectionErrorText}}</p>
- </div>
-
-</div>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index d32a27a..0000000
--- a/console/stand-alone/plugin/html/qdrList.html
+++ /dev/null
@@ -1,95 +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.
--->
-
-<div id="list-controller" ng-controller="QDR.ListController" ng-include="tmplListTree"></div>
-
-<script type="text/ng-template" id="listGrid.html">
- <div class="row-fluid qdrListActions">
- <ul class="nav nav-tabs">
- <li ng-repeat="mode in modes" ng-show="isValid(mode)" ng-click="selectMode(mode)" ng-class="{active : isModeSelected(mode)}" title="{{mode.title}}" ng-bind-html="mode.content"> </li>
- </ul>
- <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" 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">
- <button class="btn btn-primary" ng-click="remove()">Delete</button> {{selectedRecordName}}
- </div>
- <div ng-hide="selectedRecordName !== selectedEntity">
- There are no {{selectedEntity | safePlural}}
- </div>
- </div>
- <div class="operations" ng-show="currentMode.id === 'operations'">
- <fieldset ng-show="operation != ''">
- <table>
- <tr>
- <th>Attribute</th>
- <th>Value</th>
- </tr>
- <tr title="{{attribute.title}}" ng-repeat="attribute in detailFields">
- <td><label for="{{attribute.name}}">{{attribute.name | humanify}}</label></td>
- <!-- we can't do <input type="{angular expression}"> because... jquery throws an exception because... -->
- <td>
- <div ng-if="attribute.input == 'input'">
- <!-- ng-pattern="testPattern(attribute)" -->
- <div ng-if="attribute.type == 'number'"><input type="number" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.rawValue" ng-required="attribute.required" ng-class="{required: attribute.required, unique: attribute.unique}" class="ui-widget-content ui-corner-all"/><span ng-if="attribute.required" title="required" class="required-indicator"></span><span ng-if="attribute.unique" title="unique" class="unique-indicator"></span></div>
- <div ng-if="attribute.type == 'text'"><input type="text" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.attributeValue" ng-required="attribute.required" ng-class="{required: attribute.required, unique: attribute.unique}" class="ui-widget-content ui-corner-all"/><span ng-if="attribute.required" title="required" class="required-indicator"></span><span ng-if="attribute.unique" title="unique" class="unique-indicator"></span></div>
- <div ng-if="attribute.type == 'textarea'"><textarea name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.attributeValue" ng-required="attribute.required" ng-class="{required: attribute.required, unique: attribute.unique}" class="ui-widget-content ui-corner-all"></textarea><span ng-if="attribute.required" title="required" class="required-indicator"></span><span ng-if="attribute.unique" title="unique" class="unique-indicator"></span></div>
- <span ng-if="attribute.type == 'disabled'" >{{getAttributeValue(attribute)}}</span>
- </div>
- <div ng-if="attribute.input == 'select'">
- <select id="{{attribute.name}}" ng-model="attribute.selected" ng-required="attribute.required" ng-class="{required: attribute.required, unique: attribute.unique}" ng-options="item for item in attribute.rawtype track by item"></select>
- <span ng-if="attribute.required" title="required" class="required-indicator"></span><span ng-if="attribute.unique" title="unique" class="unique-indicator"></span>
- </div>
- <div ng-if="attribute.input == 'boolean'" class="boolean">
- <label><input type="radio" ng-model="attribute.rawValue" ng-value="true"> True</label>
- <label><input type="radio" ng-model="attribute.rawValue" ng-value="false"> False</label>
- </div>
- </td>
- </tr>
- <tr><td></td><td><button class="btn btn-primary" type="button" ng-click="ok()">{{operation | Pascalcase}}</button></td></tr>
- </table>
- </fieldset>
- </div>
- <div ng-show="currentMode.id === 'log'">
- <div ng-if="logResults.length > 0">
- <table class="log-entry" ng-repeat="entry in logResults track by $index">
- <tr>
- <td align="left" colspan="2">{{entry.time}}</td>
- </tr>
- <tr>
- <td>Type</td><td>{{entry.type}}</td>
- </tr>
- <tr>
- <td>Source</td><td>{{entry.source}}:{{entry.line}}</td>
- </tr>
- <tr>
- <td valign="middle">Message</td><td valign="middle"><pre>{{entry.message}}</pre></td>
- </tr>
- </table>
- </div>
- <div ng-if="logResults.length == 0 && !fetchingLog">No log entries for {{selectedRecordName}}</div>
- <div ng-if="fetchingLog">Fetching logs for {{selectedRecordName}}</div>
- </div>
- </div>
-</script>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index b593c4a..0000000
--- a/console/stand-alone/plugin/html/qdrOverview.html
+++ /dev/null
@@ -1,224 +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.
--->
-<div id="overview-controller" ng-controller="QDR.OverviewController" ng-include="tmplOverviewTree"></div>
-<script type="text/ng-template" id="overviewGrid.html">
- <div class="gridDetails" ng-include="template.url"></div>
-</script>
-
-<script type="text/ng-template" id="overviewCharts.html">
- <div ng-controller="QDR.OverviewChartsController" class="clearfix">
- <div ng-repeat="chart in overviewCharts" class="chartContainer" >
- <p class="chartLabels">
- </p><div style="clear:both"></div>
- <div id="{{chart.chart.id()}}" class="line-chart-pf aChart d3Chart"></div>
- </div>
- </div>
- <div ng-controller="QDR.TopAddressesController">
- <h1>Most active addresses</h1>
- <div ng-if="anyAddresses()" id="topAddresses" class="grid" ui-grid="topAddressesGrid" ui-grid-selection ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
- <div ng-if="!anyAddresses()">There are no addresses to which messages are being delivered.</div>
- </div>
-</script>
-
-<!-- the following scripts are content that gets loaded into the above div that has the temple.url -->
-<script type="text/ng-template" id="routers.html">
- <div class="row-fluid">
- <h3>Routers</h3>
- <div class="overview">
- <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.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>
-
-<script type="text/ng-template" id="addresses.html">
- <div class="row-fluid">
- <h3>Addresses</h3>
- <div class="overview">
- <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>
-<script type="text/ng-template" id="address.html">
- <div class="row-fluid">
- <ul class="nav nav-tabs">
- <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.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.title}}</h3>
- <div class="grid" ui-grid="linksGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
- </div>
- </div>
-</script>
-
-<script type="text/ng-template" id="links.html">
- <div class="row-fluid">
- <h3>Links <button type='button' ng-click="filterToggle()" class='btn btn-secondary btn-filter'>Filter</button></h3>
- <div id="linkFilter">
- <div class="filter-title">
- <h6>Filter links</h6>
- <button ng-click="filterToggle()" type="button" class="btn btn-primary filter-close">x</button>
- </div>
- <div class="formLine"><label for="hideConsoles">Hide console links</label><input name="hideConsoles" id="hideConsoles" type="checkbox" ng-model="filter.hideConsoles"/></div>
- <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="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.title}}</h3>
- <div class="grid noHighlight" ui-grid="linkGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
- </div>
-</script>
-
-<script type="text/ng-template" id="connections.html">
- <div class="row-fluid">
- <h3>Connections</h3>
- <div class="overview">
- <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>
-<script type="text/ng-template" id="connection.html">
- <div class="row-fluid">
- <ul class="nav nav-tabs">
- <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.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.title}}</h3>
- <div class="grid" ui-grid="linksGrid" ui-grid-auto-resize ui-grid-resize-columns ui-grid-save-state></div>
- </div>
- </div>
-</script>
-
-<script type="text/ng-template" id="titleHeaderCellTemplate.html">
- <div title="{{col.displayName}}" class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{'cursor': col.cursor}" ng-class="{ 'ngSorted': !noSortVisible }">
- <div ng-click="col.sort($event)" ng-class="'colt' + col.index" class="ngHeaderText">{{col.displayName}}</div>
- <div class="ngSortButtonDown" ng-show="col.showSortButtonDown()"></div>
- <div class="ngSortButtonUp" ng-show="col.showSortButtonUp()"></div>
- <div class="ngSortPriority">{{col.sortPriority}}</div>
- </div>
-</script>
-<script type="text/ng-template" id="titleCellTemplate.html">
- <div title="{{row.entity[col.field]}}" class="ngCellText">{{row.entity[col.field]}}</div>
-</script>
-<script type="text/ng-template" id="logs.html">
- <div class="row-fluid">
- <h3>Recent log events</h3>
- <div class="overview">
- <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>
-<script type="text/ng-template" id="logModule.html">
- <div class="row-fluid">
- <h3>{{logModule.module}} events</h3>
- <div class="overview-cell">
- <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.title}}</h3>
- <div ng-if="logFields.length > 0">
- <table class="log-entry" ng-repeat="entry in logFields track by $index">
- <tr>
- <td>Router</td><td>{{entry.nodeId}}</td>
- </tr>
- <tr>
- <td align="left" colspan="2">{{entry.time}}</td>
- </tr>
- <tr>
- <td>Source</td><td>{{entry.source}}:{{entry.line}}</td>
- </tr>
- <tr>
- <td valign="middle">Message</td><td valign="middle"><pre>{{entry.message}}</pre></td>
- </tr>
- </table>
- </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.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>
-
-<script type="text/ng-template" id="linkAggTemplate.html">
- <div ng-click='row.toggleExpand(); saveGroupState()' ng-style='rowStyle(row)' class='ngAggregate ng-scope' style='top: 0px; height: 48px; left: 0px;'>
- <span class='ngAggregateText ng-binding'>
- {{row.label CUSTOM_FILTERS}} ({{row.totalChildren()}} {{AggItemsLabel}})
- </span>
- <div ng-class="{true: 'ngAggArrowCollapsed', false: 'ngAggArrowExpanded'}[row.collapsed]"></div>
- </div>
-</script>
-
-<script type="text/ng-template" id="viewLogs.html">
- <div class="modal-header">
- <h3 class="modal-title">Logs for {{nodeName}} {{module}}:{{level | humanify}}</h3>
- </div>
- <div class="modal-body">
- <div ng-if="loading == false">
- <div class="log-details" ng-if="logFields.length > 0">
- <table class="log-entry" ng-repeat="entry in logFields track by $index">
- <tr>
- <td>Router</td><td>{{entry.nodeId}}</td>
- </tr>
- <tr>
- <td align="left" colspan="2">{{entry.time}}</td>
- </tr>
- <tr>
- <td>Source</td><td>{{entry.source}}:{{entry.line}}</td>
- </tr>
- <tr>
- <td valign="middle">Message</td><td valign="middle"><pre>{{entry.message}}</pre></td>
- </tr>
- </table>
- </div>
- <div ng-if="logFields.length == 0">No log entries</div>
- </div>
- <div ng-if="loading == true">
- Loading...
- </div>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
- </div>
-</script>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/html/qdrSchema.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrSchema.html b/console/stand-alone/plugin/html/qdrSchema.html
deleted file mode 100644
index 33f6951..0000000
--- a/console/stand-alone/plugin/html/qdrSchema.html
+++ /dev/null
@@ -1,21 +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.
--->
-<div class="main-display row-fluid" ng-controller="QDR.SchemaController">
- <div id="schema"></div>
-</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 90caf5a..0000000
--- a/console/stand-alone/plugin/html/qdrTopology.html
+++ /dev/null
@@ -1,66 +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.
--->
-<div class="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
- <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="grid" ui-grid="topoGridOptions" ui-grid-auto-resize ng-style="infoStyle()"></div>
- </div>
- <div ng-if="form == 'connection'">
- <h4>Connection Info</h4>
- <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>
- <button ng-if="!panelVisible" ng-click="showLeftPane()" class="hideLeft" title="Show"><i class="icon-step-forward"></i></button>
- </div>
- <div class="panel-adjacent">
- <div id="topology"><!-- d3 toplogy 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>
- <li class="na" ng-class="{'force-display': isFixed()}" ng-click="setFixed(false)">Unfreeze</li>
- </ul>
- </div>
- <div id="svg_legend"></div>
- <div id="multiple_details">
- <h4 class="grid-title">Connections</h4>
- <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="grid" ui-grid="linkDetails" ui-grid-auto-resize ng-style="linksStyle()"></div>
- </div>
- </div>
-</div>
-
-<script type="text/ng-template" id="titleHeaderCellTemplate.html">
- <div title="{{col.displayName}}" class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{'cursor': col.cursor}" ng-class="{ 'ngSorted': !noSortVisible }">
- <div ng-click="col.sort($event)" ng-class="'colt' + col.index" class="ngHeaderText">{{col.displayName}}</div>
- <div class="ngSortButtonDown" ng-show="col.showSortButtonDown()"></div>
- <div class="ngSortButtonUp" ng-show="col.showSortButtonUp()"></div>
- <div class="ngSortPriority">{{col.sortPriority}}</div>
- </div>
-</script>
-<script type="text/ng-template" id="titleCellTemplate.html">
- <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/502538b4/console/stand-alone/plugin/html/tmplChartConfig.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/tmplChartConfig.html b/console/stand-alone/plugin/html/tmplChartConfig.html
deleted file mode 100644
index 2e2cb8c..0000000
--- a/console/stand-alone/plugin/html/tmplChartConfig.html
+++ /dev/null
@@ -1,87 +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
--->
-
-<!--
- This is the template for the graph dialog that is displayed. It uses the
- dialogCtrl controller in qdrCharts.js.
--->
-<div class="chartOptions">
- <div class="modal-header">
- <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
- </div>
- <div class="modal-body">
- <div id="{{svgDivId}}" class="line-chart-pf"></div>
-
- <uib-tabset>
- <uib-tab heading="Type">
- <legend>Chart type</legend>
- <div>
- <label><input type="radio" ng-model="dialogChart.type" value="value" /> Value Chart</label>
- <label><input type="radio" ng-model="dialogChart.type" value="rate" /> Rate Chart</label>
-<!--
- <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
- <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
- <div id="rateSlider"></div>
- </div>
--->
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
-<!--
- <uib-tab ng-hide="$parent.chart.aggregate()" heading="Colors">
- <legend>Chart colors</legend>
- <div>
- <div class="colorPicker">
- <label>Area: <input id="areaColor" name="areaColor" type="color" /></label>
- </div>
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
--->
- <uib-tab heading="Duration">
- <legend>Chart duration</legend>
- <div>
- <div class="dlg-slider duration">
- <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span>
- <div id="durationSlider"></div>
- </div>
- </div>
- <div style="clear:both;"> </div>
-
- </uib-tab>
- </uib-tabset>
- </div>
- <div class="modal-footer">
- <div ng-hide="adding()">
- <button class="btn btn-success" type="button" ng-click="apply()">Apply to existing chart</button>
- <button class="btn btn-info" type="button" ng-click="copyToDashboard()">Create new chart</button>
- <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
- </div>
- <div ng-show="adding()">
- <span ng-hide="isOnChartsPage()">
- <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
- </span>
- <span ng-show="isOnChartsPage()">
- View the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
- </span>
- <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
- </div>
- </div>
-</div>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/html/tmplListChart.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/tmplListChart.html b/console/stand-alone/plugin/html/tmplListChart.html
deleted file mode 100644
index 3214187..0000000
--- a/console/stand-alone/plugin/html/tmplListChart.html
+++ /dev/null
@@ -1,40 +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
--->
-
-<!--
- This is the template for the graph dialog that is displayed.
--->
-<div class="modal-header">
- <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
-</div>
-<div class="modal-body">
- <p class="newChart">
- <button ng-click="editChart()" title="Configure"><span class="fa-edit"></span></button>
- </p><div style="clear:both"></div>
- <div id="pfDialogChart" class="line-chart-pf"></div>
-</div>
-<div class="modal-footer">
- <span ng-hide="isOnChartsPage()">
- <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
- </span>
- <span ng-show="isOnChartsPage()">
- <button class="btn btn-danger" type="button" ng-click="delChartsPage()">Remove</button> this chart from the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
- </span>
- <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
-</div>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[3/6] qpid-dispatch git commit: DISPATCH-917 Get common html/js/css
for console from npm module dispatch-console-pages
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 7f2a71c..0000000
--- a/console/stand-alone/plugin/js/qdrOverview.js
+++ /dev/null
@@ -1,1807 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
- /**
- *
- * Controller that handles the QDR overview page
- */
- 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;
-
- var COLUMNSTATEKEY = 'QDRColumnKey.';
- var OVERVIEWEXPANDEDKEY = "QDROverviewExpanded"
- var OVERVIEWACTIVATEDKEY = "QDROverviewActivated"
- var FILTERKEY = "QDROverviewFilters"
- var OVERVIEWMODEIDS = "QDROverviewModeIds"
- 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 = [{
- content: '<i class="icon-list"></i> Attributes',
- title: "View the attribute values on your selection",
- isValid: function (workspace) { return true; },
- 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 "#/" + QDR.pluginName + "/operations"; },
- index: 1
- }]
- $scope.activeTab = $scope.subLevelTabs[0];
- $scope.setActive = function (nav) {
- $scope.activeTab = nav;
- }
- $scope.isValid = function (nav) {
- return nav.isValid()
- }
- $scope.isActive = function (nav) {
- return nav == $scope.activeTab;
- }
- $scope.linkFields = []
- $scope.link = null;
- var refreshInterval = 5000
- $scope.modes = [
- {title: 'Overview', name: 'Overview', right: false}
- ];
-
- $scope.tmplOverviewTree = QDR.templatePath + 'tmplOverviewTree.html';
- $scope.templates = [
- { name: 'Charts', url: 'overviewCharts.html'},
- { name: 'Routers', url: 'routers.html'},
- { name: 'Router', url: 'router.html'},
- { name: 'Addresses', url: 'addresses.html'},
- { name: 'Address', url: 'address.html'},
- { name: 'Links', url: 'links.html'},
- { name: 'Link', url: 'link.html'},
- { name: 'Connections', url: 'connections.html'},
- { name: 'Connection', url: 'connection.html'},
- { name: 'Logs', url: 'logs.html'},
- { name: 'Log', url: 'logModule.html'}
- ];
- var topLevelChildren = [];
-
- function afterSelectionChange(rowItem, checkAll) {
- var nodeId = rowItem.entity.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,
- currentPage: 1
- };
- var getPagedData = function (pageSize, page) {
- $scope.totalRouters = $scope.allRouterFields.length
- $scope.allRouters.showFooter = $scope.totalRouters > 50
- $scope.pagedRouterFields = $scope.allRouterFields.slice((page - 1) * pageSize, page * pageSize);
- }
- $scope.$watch('pagingOptions', function (newVal, oldVal) {
- if (newVal !== oldVal && newVal.currentPage !== oldVal.currentPage) {
- getPagedData($scope.routerPagingOptions.pageSize, $scope.routerPagingOptions.currentPage);
- }
- }, true);
-
- $scope.totalRouters = 0;
- $scope.allRouterFields = [];
- $scope.pagedRouterFields = [];
- $scope.allRouters = {
- saveKey: 'allRouters',
- treeKey: 'nodeId',
- data: 'pagedRouterFields',
- columnDefs: [
- {
- field: 'id',
- saveKey: 'allRouters',
- displayName: 'Router'
- },
- {
- field: 'area',
- displayName: 'Area'
- },
- {
- field: 'mode',
- displayName: 'Mode'
- },
- {
- field: 'connections',
- displayName: 'External connections'
- },
- {
- field: 'addrCount',
- displayName: 'Address count'
- },
- {
- field: 'linkCount',
- displayName: 'Link count'
- }
- ],
- enableColumnResize: true,
- jqueryUIDraggable: true,
- enablePaging: true,
- showFooter: $scope.totalRouters > 50,
- totalServerItems: 'totalRouters',
- pagingOptions: $scope.routerPagingOptions,
- multiSelect: false,
- 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 (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] = response;
- }
- // send the requests for all connection and router info for all routers
- 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
- }
- 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]
- })
- 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)
- }
-
- $scope.routerFields = []
- $scope.routerGrid = {
- saveKey: 'routerGrid',
- data: 'routerFields',
- columnDefs: [
- {
- field: 'attribute',
- displayName: 'Attribute',
- saveKey: 'routerGrid',
- },
- {
- field: 'value',
- displayName: 'Value',
- }
- ],
- jqueryUIDraggable: true,
- enableColumnResize: true,
- minRowsToShow: 25,
- multiSelect: false
- }
-
- $scope.router = null;
- // get info for a single router
- var routerInfo = function (node, callback) {
- $scope.router = node
-
- var routerFields = [];
- $scope.allRouterFields.some( function (field) {
- if (field.id === node.title) {
- Object.keys(field).forEach ( function (key) {
- var attr = (key === 'connections') ? 'External connections' : key
- routerFields.push({attribute: attr, value: field[key]})
- })
- return true
- }
- })
- $scope.routerFields = routerFields
- expandGridToContent("Router", $scope.routerFields.length)
- loadColState($scope.routerGrid);
- callback(null)
- }
-
- $scope.addressPagingOptions = {
- pageSizes: [50, 100, 500],
- pageSize: 50,
- currentPage: 1
- };
- var getAddressPagedData = function (pageSize, page) {
- $scope.totalAddresses = $scope.addressesData.length
- $scope.addressesGrid.showFooter = $scope.totalAddresses > 50
- $scope.pagedAddressesData = $scope.addressesData.slice((page - 1) * pageSize, page * pageSize);
- }
- $scope.$watch('addressPagingOptions', function (newVal, oldVal) {
- if (newVal !== oldVal && newVal.currentPage !== oldVal.currentPage) {
- getAddressPagedData($scope.addressPagingOptions.pageSize, $scope.addressPagingOptions.currentPage);
- }
- }, true);
-
- $scope.totalAddresses = 0;
- $scope.pagedAddressesData = []
- $scope.addressesData = []
- $scope.selectedAddresses = []
- $scope.addressesGrid = {
- saveKey: 'addressesGrid',
- treeKey: 'uid',
- data: 'pagedAddressesData',
- columnDefs: [
- {
- field: 'address',
- saveKey: 'addressesGrid',
- displayName: 'address'
- },
- {
- field: 'class',
- displayName: 'class'
- },
- {
- field: 'phase',
- displayName: 'phase',
- cellClass: 'grid-align-value'
- },
- {
- field: 'inproc',
- displayName: 'in-proc'
- },
- {
- field: 'local',
- displayName: 'local',
- cellClass: 'grid-align-value'
- },
- {
- field: 'remote',
- displayName: 'remote',
- cellClass: 'grid-align-value'
- },
- {
- field: 'in',
- displayName: 'in',
- cellClass: 'grid-align-value'
- },
- {
- field: 'out',
- displayName: 'out',
- cellClass: 'grid-align-value'
- }
- ],
- enablePaging: true,
- showFooter: $scope.totalAddresses > 50,
- totalServerItems: 'totalAddresses',
- pagingOptions: $scope.addressPagingOptions,
- enableColumnResize: true,
- multiSelect: false,
- enableSelectAll: false,
- onRegisterApi: selectRow,
- enableSelectionBatchEvent: false,
- enableRowHeaderSelection: false,
- noUnselect: true
- };
-
- // get info for all addresses
- var allAddressInfo = function (address, callback) {
- var nodes = {}
- // gets called each node/entity response
- var gotNode = function (nodeName, entity, response) {
- if (!nodes[nodeName])
- nodes[nodeName] = {}
- nodes[nodeName][entity] = angular.copy(response);
- }
- var 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]
- }
- var addr_phase = function (addr) {
- if (!addr)
- return "-"
- if (addr[0] == 'M')
- return addr[1]
- return ''
- }
- var prettyVal = function (val) {
- return QDRService.utilities.pretty(val || "-")
- }
- var addressFields = []
- var addressObjs = {}
- // send the requests for all connection and router info for all routers
- QDRService.management.topology.fetchAllEntities({entity: "router.address"}, function () {
- for (var node in nodes) {
- var response = nodes[node]["router.address"]
- response.results.forEach( function (result) {
- var address = QDRService.utilities.flatten(response.attributeNames, result)
-
- var addNull = function (oldVal, newVal) {
- if (oldVal != null && newVal != null)
- return oldVal + newVal
- if (oldVal != null)
- return oldVal
- return newVal
- }
-
- var uid = address.identity
- var identity = QDRService.utilities.identity_clean(uid)
-
- 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,
- remote: address.remoteCount,
- 'in': address.deliveriesIngress,
- out: address.deliveriesEgress,
- thru: address.deliveriesTransit,
- toproc: address.deliveriesToContainer,
- fromproc:address.deliveriesFromContainer,
- uid: uid
- }
- else {
- var sumObj = addressObjs[QDRService.utilities.addr_text(identity)+QDRService.utilities.addr_class(identity)]
- sumObj.inproc = addNull(sumObj.inproc, address.inProcess)
- sumObj.local = addNull(sumObj.local, address.subscriberCount)
- sumObj.remote = addNull(sumObj.remote, address.remoteCount)
- sumObj['in'] = addNull(sumObj['in'], address.deliveriesIngress)
- sumObj.out = addNull(sumObj.out, address.deliveriesEgress)
- sumObj.thru = addNull(sumObj.thru, address.deliveriesTransit)
- sumObj.toproc = addNull(sumObj.toproc, address.deliveriesToContainer)
- sumObj.fromproc = addNull(sumObj.fromproc, address.deliveriesFromContainer)
- }
- })
- }
- for (var obj in addressObjs) {
- addressObjs[obj].inproc = prettyVal(addressObjs[obj].inproc)
- addressObjs[obj].local = prettyVal(addressObjs[obj].local)
- addressObjs[obj].remote = prettyVal(addressObjs[obj].remote)
- addressObjs[obj]['in'] = prettyVal(addressObjs[obj]['in'])
- addressObjs[obj].out = prettyVal(addressObjs[obj].out)
- addressObjs[obj].thru = prettyVal(addressObjs[obj].thru)
- addressObjs[obj].toproc = prettyVal(addressObjs[obj].toproc)
- addressObjs[obj].fromproc = prettyVal(addressObjs[obj].fromproc)
- addressFields.push(addressObjs[obj])
- }
- if (addressFields.length === 0)
- return;
- // update the grid's data
- addressFields.sort ( function (a,b) {
- return a.address + a['class'] < b.address + b['class'] ? -1 : a.address + a['class'] > b.address + b['class'] ? 1 : 0}
- )
- // callapse all records with same addres+class
- for (var i=1; i<addressFields.length; ++i) {
-
- }
- addressFields[0].title = addressFields[0].address
- for (var i=1; i<addressFields.length; ++i) {
- // if this address is the same as the previous address, add a class to the display titles
- if (addressFields[i].address === addressFields[i-1].address) {
- addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
- addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
- } else
- addressFields[i].title = addressFields[i].address
- }
- $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)
- }
-
- var updateLinkGrid = function ( linkFields ) {
- // apply the filter
- var filteredLinks = linkFields.filter( function (link) {
- var include = true;
- if ($scope.filter.endpointsOnly === "true") {
- if (link.linkType !== 'endpoint')
- include = false;
- }
- if ($scope.filter.hideConsoles) {
- if (QDRService.utilities.isConsole(QDRService.management.topology.getConnForLink(link)))
- include = false;
- }
- return include;
- })
- QDR.log.info("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) {
- // find the selected link in the array of all links
- var links = $scope.linkFields.filter(function (link) {
- return link.name === $scope.link.data.fields.name;
- })
- if (links.length > 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 (){})})
- }
- }
- }
-
- // get info for a all links
- $scope.linkPagingOptions = {
- pageSizes: [50, 100, 500],
- pageSize: 50,
- currentPage: 1
- };
- var getLinkPagedData = function (pageSize, page) {
- $scope.totalLinks = $scope.linkFields.length
- $scope.linksGrid.showFooter = $scope.totalLinks > 50
- $scope.pagedLinkData = $scope.linkFields.slice((page - 1) * pageSize, page * pageSize);
- }
- $scope.$watch('linkPagingOptions', function (newVal, oldVal) {
- if (newVal !== oldVal && newVal.currentPage !== oldVal.currentPage) {
- getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
- }
- }, true);
-
- $scope.totalLinks = 0;
- $scope.pagedLinkData = []
- $scope.selectedLinks = []
-
- $scope.linksGrid = {
- saveKey: 'linksGrid',
- treeKey: 'uid',
- data: 'pagedLinkData',
- columnDefs: [
- {
- field: 'link',
- displayName: 'Link',
- groupable: false,
- saveKey: 'linksGrid',
- width: '11%'
- },
- {
- field: 'linkType',
- displayName: 'Link type',
- groupable: false,
- width: '9%'
- },
- {
- field: 'linkDir',
- displayName: 'Link dir',
- groupable: false,
- width: '8%'
- },
- {
- field: 'adminStatus',
- displayName: 'Admin status',
- groupable: false,
- width: '9%'
- },
- {
- field: 'operStatus',
- displayName: 'Oper status',
- groupable: false,
- width: '9%'
- },
- {
- field: 'deliveryCount',
- displayName: 'Delivery Count',
- groupable: false,
- cellClass: 'grid-align-value',
- width: '11%'
- },
- {
- field: 'rate',
- displayName: 'Rate',
- groupable: false,
- cellClass: 'grid-align-value',
- width: '8%'
- },
- {
- field: 'uncounts',
- displayName: 'Outstanding',
- groupable: false,
- cellClass: 'grid-align-value',
- width: '9%'
- },
- {
- field: 'owningAddr',
- displayName: 'Address',
- groupable: false,
- width: '15%'
- }/*,
- {
- displayName: 'Quiesce',
- cellClass: 'gridCellButton',
- cellTemplate: '<button title="{{quiesceLinkText(row)}} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row, $event)" ng-disabled="quiesceLinkDisabled(row)">{{quiesceLinkText(row)}}</button>',
- width: '10%'
- }*/
- ],
- enablePaging: true,
- showFooter: $scope.totalLinks > 50,
- totalServerItems: 'totalLinks',
- pagingOptions: $scope.linkPagingOptions,
- enableColumnResize: true,
- enableColumnReordering: true,
- showColumnMenu: true,
- rowTemplate: 'linkRowTemplate.html',
- minRowsToShow: 15,
- multiSelect: false,
- 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]
- })
- var saveKey = columns[0].colDef.saveKey
- if (saveKey)
- localStorage.setItem(COLUMNSTATEKEY+saveKey, JSON.stringify(saveInfo));
- })
-
- var loadColState = function (grid) {
-return;
- if (!grid)
- return;
- var columns = localStorage.getItem(COLUMNSTATEKEY+grid.saveKey);
- if (columns) {
- var cols = JSON.parse(columns);
- cols.forEach( function (col, index) {
- if (grid.columnDefs[index]) {
- grid.columnDefs[index].width = col[0];
- grid.columnDefs[index].visible = col[1]
- }
- })
- }
- }
- var allLinkInfo = function (node, callback) {
- var gridCallback = function (linkFields) {
- 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])
- loadColState($scope.linksGrid);
- }
-
- var getAllLinkFields = function (completionCallbacks, selectionCallback) {
- if (!$scope.linkFields) {
- QDR.log.debug("$scope.linkFields was not defined!")
- return;
- }
- var nodeIds = QDRService.management.topology.nodeIdList()
- var linkFields = []
- var now = Date.now()
- var rate = function (linkName, response, result) {
- if (!$scope.linkFields)
- return 0;
- var oldname = $scope.linkFields.filter(function (link) {
- return link.link === linkName
- })
- if (oldname.length === 1) {
- var elapsed = (now - oldname[0].timestamp) / 1000;
- if (elapsed < 0)
- return 0
- 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 {
- //QDR.log.debug("unable to find old linkName")
- return 0
- }
- }
- 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) {
- var fieldIndex = response.attributeNames.indexOf(field)
- if (fieldIndex < 0) {
- return "-"
- }
- var val = result[fieldIndex]
- return QDRService.utilities.pretty(val)
- }
- var uncounts = function () {
- 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.management.topology.nameFromId(nodeName)
- return namestr + ':' + QDRService.utilities.valFor(response.attributeNames, result, "identity")
- }
- var fixAddress = function () {
- var addresses = []
- var owningAddr = QDRService.utilities.valFor(response.attributeNames, result, "owningAddr") || ""
- var rawAddress = owningAddr
- /*
- - "L*" => "* (local)"
- - "M0*" => "* (direct)"
- - "M1*" => "* (dequeue)"
- - "MX*" => "* (phase X)"
- */
- var address = undefined;
- var starts = {'L': '(local)', 'M0': '(direct)', 'M1': '(dequeue)'}
- for (var start in starts) {
- if (owningAddr.startsWith(start)) {
- var ends = owningAddr.substr(start.length)
- address = ends + " " + starts[start]
- rawAddress = ends
- break;
- }
- }
- if (!address) {
- // check for MX*
- if (owningAddr.length > 3) {
- if (owningAddr[0] === 'M') {
- var phase = parseInt(owningAddress.substr(1))
- if (phase && !isNaN(phase)) {
- var phaseStr = phase + "";
- var star = owningAddress.substr(2 + phaseStr.length)
- address = star + " " + "(phase " + phaseStr + ")"
- }
- }
- }
- }
- addresses[0] = address || owningAddr
- addresses[1] = rawAddress
- return addresses
- }
- if (!selectionCallback || selectionCallback(response, result)) {
- var adminStatus = QDRService.utilities.valFor(response.attributeNames, result, "adminStatus")
- var operStatus = QDRService.utilities.valFor(response.attributeNames, result, "operStatus")
- var linkName = linkName()
- var linkType = QDRService.utilities.valFor(response.attributeNames, result, "linkType")
- var addresses = fixAddress();
- var link = QDRService.utilities.flatten(response.attributeNames, result)
- linkFields.push({
- link: linkName,
- title: linkName,
- uncounts: uncounts(),
- operStatus: operStatus,
- adminStatus:adminStatus,
- owningAddr: addresses[0],
-
- acceptedCount: prettyVal("acceptedCount"),
- modifiedCount: prettyVal("modifiedCount"),
- presettledCount: prettyVal("presettledCount"),
- rejectedCount: prettyVal("rejectedCount"),
- releasedCount: prettyVal("releasedCount"),
- deliveryCount:prettyVal("deliveryCount") + " ",
-
- rate: QDRService.utilities.pretty(rate(linkName, response, result)),
- capacity: link.capacity,
- undeliveredCount: link.undeliveredCount,
- unsettledCount: link.unsettledCount,
-
- rawAddress: addresses[1],
- rawDeliveryCount: link.deliveryCount,
- name: link.name,
- linkName: link.linkName,
- connectionId: link.connectionId,
- linkDir: link.linkDir,
- linkType: linkType,
- peer: link.peer,
- type: link.type,
-
- uid: linkName,
- timestamp: now,
- nodeId: nodeName,
- identity: link.identity,
- })
- }
- })
- if (expected === ++received) {
- linkFields.sort ( function (a,b) { return a.link < b.link ? -1 : a.link > b.link ? 1 : 0})
- completionCallbacks.forEach( function (cb) {
- cb(linkFields)
- })
- }
- }
- nodeIds.forEach( function (nodeId) {
- QDRService.management.topology.fetchEntity(nodeId, "router.link", [], gotLinkInfo);
- })
- }
-
- $scope.connectionPagingOptions = {
- pageSizes: [50, 100, 500],
- pageSize: 50,
- currentPage: 1
- };
- var getConnectionPagedData = function (pageSize, page) {
- $scope.totalConnections = $scope.allConnectionFields.length
- $scope.allConnectionGrid.showFooter = $scope.totalConnections > 50
- $scope.pagedConnectionsData = $scope.allConnectionFields.slice((page - 1) * pageSize, page * pageSize);
- }
- $scope.$watch('connectionPagingOptions', function (newVal, oldVal) {
- if (newVal !== oldVal && newVal.currentPage !== oldVal.currentPage) {
- getConnectionPagedData($scope.connectionPagingOptions.pageSize, $scope.connectionPagingOptions.currentPage);
- }
- }, true);
-
- $scope.totalConnections = 0;
- $scope.pagedConnectionsData = []
- $scope.allConnectionFields = []
- $scope.allConnectionSelections = [];
- $scope.allConnectionGrid = {
- saveKey: 'allConnGrid',
- treeKey: 'uid',
- data: 'pagedConnectionsData',
- columnDefs: [
- {
- field: 'host',
- saveKey: 'allConnGrid',
- displayName: 'host'
- },
- {
- field: 'container',
- displayName: 'container'
- },
- {
- field: 'role',
- displayName: 'role'
- },
- {
- field: 'dir',
- displayName: 'dir'
- },
- {
- field: 'security',
- displayName: 'security'
- },
- {
- field: 'authentication',
- displayName: 'authentication'
- },
- ],
- enablePaging: true,
- showFooter: $scope.totalConnections > 50,
- totalServerItems: 'totalConnections',
- pagingOptions: $scope.connectionPagingOptions,
- enableColumnResize: true,
- multiSelect: false,
- enableSelectAll: false,
- onRegisterApi: selectRow,
- enableSelectionBatchEvent: false,
- enableRowHeaderSelection: false,
- noUnselect: true
- };
- // get info for a all connections
- 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);
- }
-
- // get the connection data for all nodes
- // called periodically
- // creates a connectionFields array and calls the callbacks (updateTree and updateGrid)
- var getAllConnectionFields = function (callbacks) {
- var nodeIds = QDRService.management.topology.nodeIdList()
- var connectionFields = [];
- var expected = nodeIds.length;
- var received = 0;
- var gotConnectionInfo = function (nodeName, entity, response) {
- response.results.forEach( function (result) {
-
- var auth = "no_auth"
- var connection = QDRService.utilities.flatten(response.attributeNames, result)
- var sasl = connection.sasl
- if (connection.isAuthenticated) {
- auth = sasl
- if (sasl === "ANONYMOUS")
- auth = "anonymous-user"
- else {
- if (sasl === "GSSAPI")
- sasl = "Kerberos"
- if (sasl === "EXTERNAL")
- sasl = "x.509"
- auth = connection.user + "(" + connection.sslCipher + ")"
- }
- }
-
- var sec = "no-security"
- if (connection.isEncrypted) {
- if (sasl === "GSSAPI")
- sec = "Kerberos"
- else
- sec = connection.sslProto + "(" + connection.sslCipher + ")"
- }
-
- var host = connection.host
- var connField = {
- host: host,
- security: sec,
- authentication: auth,
- routerId: nodeName,
- uid: host + connection.container + connection.identity
- }
- response.attributeNames.forEach( function (attribute, i) {
- connField[attribute] = result[i]
- })
- connectionFields.push(connField)
- })
- if (expected === ++received) {
- connectionFields.sort ( function (a,b) { return a.host+a.container+a.identity < b.host+b.container+b.identity ?
- -1 : a.host+a.container+a.identity > b.host+b.container+b.identity ? 1 : 0})
- callbacks.forEach( function (cb) {
- cb(connectionFields)
- })
- }
- }
- nodeIds.forEach( function (nodeId) {
- QDRService.management.topology.fetchEntity(nodeId, "connection", [], gotConnectionInfo)
- })
- }
-
- $scope.addressFields = []
- $scope.addressGrid = {
- saveKey: 'addGrid',
- data: 'addressFields',
- columnDefs: [
- {
- field: 'attribute',
- displayName: 'Attribute',
- saveKey: 'addGrid',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ],
- enableColumnResize: true,
- minRowsToShow: 11,
- jqueryUIDraggable: true,
- multiSelect: false
- }
-
- // get info for a single 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()
- callback(null)
- return;
- }
-
- $scope.addressFields = [];
- var fields = Object.keys(address.data.fields)
- fields.forEach( function (field) {
- if (field != "title" && field != "uid")
- $scope.addressFields.push({attribute: field, value: address.data.fields[field]})
- })
- expandGridToContent("Address", $scope.addressFields.length)
- callback(null)
- loadColState($scope.addressGrid);
- }
-
- $scope.singleLinkFields = []
- $scope.linkGrid = {
- saveKey: 'linkGrid',
- data: 'singleLinkFields',
- columnDefs: [
- {
- field: 'attribute',
- displayName: 'Attribute',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ],
- enableColumnResize: true,
- minRowsToShow: 24,
- jqueryUIDraggable: true,
- multiSelect: false
- }
-
- // display the grid detail info for a single link
- var linkInfo = function (link, callback) {
- if (!link) {
- callback(null)
- return;
- }
- $scope.link = link
-
- $scope.singleLinkFields = [];
- var fields = Object.keys(link.data.fields)
- var excludeFields = ["title", "uid", "uncounts", "rawDeliveryCount", "timestamp", "rawAddress"]
- fields.forEach( function (field) {
- if (excludeFields.indexOf(field) == -1)
- $scope.singleLinkFields.push({attribute: field, value: link.data.fields[field]})
- })
- expandGridToContent("Link", $scope.singleLinkFields.length)
- callback(null)
- loadColState($scope.linkGrid);
- }
-
- // get info for a single connection
- $scope.gridModes = [{
- content: '<a><i class="icon-list"></i> Attributes</a>',
- id: 'attributes',
- title: "View attributes"
- },
- {
- content: '<a><i class="icon-link"></i> Links</a>',
- id: 'links',
- title: "Show links"
- }
- ];
- var saveModeIds = function () {
- var modeIds = {Address: entityModes.Address.currentModeId, Connection: entityModes.Connection.currentModeId}
- localStorage[OVERVIEWMODEIDS] = JSON.stringify(modeIds)
- }
- var loadModeIds = function () {
- return angular.fromJson(localStorage[OVERVIEWMODEIDS]) ||
- {Address: 'attributes', Connection: 'attributes'}
- }
- var savedModeIds = loadModeIds()
- 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.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') {
- $scope.linkFields = [];
- getLinkPagedData($scope.linkPagingOptions.pageSize, $scope.linkPagingOptions.currentPage);
- updateModeLinks();
- }
- updateExpanded()
- }
- $scope.isModeSelected = function (mode, entity) {
- return mode.id === entityModes[entity].currentModeId
- }
- $scope.isModeVisible = function (entity, id) {
- return entityModes[entity].currentModeId === id
- }
-
- var updateEntityLinkGrid = function (linkFields) {
- $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;
- getAllLinkFields([updateEntityLinkGrid], entityModes[currentEntity].filter)
- }
- var getCurrentLinksEntity = function () {
- var currentEntity;
- var active = $("#overtree").fancytree("getActiveNode");
- if (active) {
- currentEntity = active.type ? active.type : active.data.fields.type
- }
- return currentEntity;
- }
-
- $scope.quiesceLinkClass = function (row) {
- var stateClassMap = {
- enabled: 'btn-primary',
- disabled: 'btn-danger'
- }
- return stateClassMap[row.entity.adminStatus]
- }
-
- $scope.quiesceLink = function (row, $event) {
- $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) {
- return (row.entity.operStatus !== 'up' && row.entity.operStatus !== 'down')
- }
- $scope.quiesceLinkText = function (row) {
- return row.entity.adminStatus === 'disabled' ? "Revive" : "Quiesce";
- }
-
- $scope.expandAll = function () {
- $("#overtree").fancytree("getRoot").visit(function(node){
- node.expand(true);
- });
- }
- $scope.contractAll = function () {
- $("#overtree").fancytree("getRoot").visit(function(node){
- node.expand(false);
- })
- }
- $scope.connectionFields = []
- $scope.connectionGrid = {
- saveKey: 'connGrid',
- data: 'connectionFields',
- columnDefs: [
- {
- field: 'attribute',
- displayName: 'Attribute',
- saveKey: 'connGrid',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ],
- enableColumnResize: true,
- minRowsToShow: 21,
- jqueryUIDraggable: true,
- multiSelect: false
- }
-
- 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()
- callback(null)
- return;
- }
-
- $scope.connectionFields = [];
- for (var field in connection.data.fields) {
- if (field != "title" && field != "uid")
- $scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
- }
- expandGridToContent("Connection", $scope.connectionFields.length)
- loadColState($scope.connectionGrid);
- callback(null)
- }
-
-
- //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 = []
- $scope.logModuleGrid = {
- data: 'logModuleData',
- columnDefs: [
- {
- field: 'nodeName',
- displayName: 'Router',
- },
- {
- field: 'enable',
- displayName: 'Enable level',
- },
- {
- field: 'noticeCount',
- displayName: 'Notice',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'infoCount',
- displayName: 'Info',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'traceCount',
- displayName: 'Trace',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'debugCount',
- displayName: 'Debug',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'warningCount',
- displayName: 'Warning',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'errorCount',
- displayName: 'Error',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'criticalCount',
- displayName: 'Critical',
- cellTemplate: logModuleCellTemplate,
- cellClass: 'grid-align-value',
- },
- ],
- enableColumnResize: true,
- jqueryUIDraggable: true,
- multiSelect: false,
- enableSelectAll: false,
- onRegisterApi: selectRow,
- enableSelectionBatchEvent: false,
- enableRowHeaderSelection: false,
- minRowsToShow: Math.min(QDRService.management.topology.nodeIdList().length, 50),
- noUnselect: true
- }
-
- $scope.logInfoFor = function (row, col) {
- logDialog(row, col)
- }
-
- function logDialog(row, col) {
- var d = $uibModal.open({
- animation: true,
- templateUrl: 'viewLogs.html',
- controller: 'QDR.OverviewLogsController',
- resolve: {
- nodeName: function () {
- return row.entity.nodeName
- },
- module: function () {
- return row.entity.name
- },
- level: function () {
- return col.displayName
- },
- nodeId: function () {
- return row.entity.nodeId
- },
- }
- });
- d.result.then(function (result) {
- QDR.log.debug("d.open().then");
- }, function () {
- QDR.log.debug('Modal dismissed at: ' + new Date());
- });
- };
-
- var numberTemplate = '<div class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{COL_FIELD | pretty}}</span></div>'
- $scope.allLogFields = []
- $scope.allLogSelections = [];
- $scope.allLogGrid = {
- saveKey: 'allLogGrid',
- treeKey: 'name',
- data: 'allLogFields',
- columnDefs: [
- {
- field: 'name',
- saveKey: 'allLogGrid',
- displayName: 'Module'
- },
- {
- field: 'noticeCount',
- displayName: 'Notice',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'infoCount',
- displayName: 'Info',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'traceCount',
- displayName: 'Trace',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'debugCount',
- displayName: 'Debug',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'warningCount',
- displayName: 'Warning',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'errorCount',
- displayName: 'Error',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- {
- field: 'criticalCount',
- displayName: 'Critical',
- cellTemplate: numberTemplate,
- cellClass: 'grid-align-value',
- },
- ],
- //enableCellSelection: true,
- enableColumnResize: true,
- minRowsToShow: 17,
- multiSelect: false,
- enableSelectAll: false,
- onRegisterApi: selectRow,
- enableSelectionBatchEvent: false,
- enableRowHeaderSelection: false,
- noUnselect: true
- };
-
- var allLogEntries = {}
- var allLogInfo = function (log, callback) {
- // update the count of entries for each module
- $scope.allLogFields = []
- var logResults = {}
- var logDetails = {}
-
- var gotLogStats = function (node, entity, response) {
- logDetails[node] = []
- response.results.forEach( function (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)) {
- logResults[oresult.name] = oresult
- }
- else {
- response.attributeNames.forEach( function (attr, i) {
- if (attr.substr(attr.length-5) === 'Count') {
- logResults[oresult.name][attr] += result[i]
- }
- })
- }
- })
- }
- var gotAllLogStats = function () {
- var sortedModules = Object.keys(logResults)
- sortedModules.sort(function (a,b) {return a<b?-1:a>b?1:0})
- $scope.allLogFields = []
- sortedModules.forEach( function (module) {
- $scope.allLogFields.push(logResults[module])
- })
- expandGridToContent("Logs", $scope.allLogFields.length)
- allLogEntries = logDetails
- updateLogTree($scope.allLogFields)
- callback(null)
- }
- QDRService.management.topology.fetchAllEntities({entity: 'logStats'}, gotAllLogStats, gotLogStats)
- }
-
- var expandGridToContent = function (type, rows) {
- var tree = $("#overtree").fancytree("getTree")
- var node = null
- if (tree && tree.getActiveNode)
- 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")
- }
- }
- }
-
- $scope.logFields = []
- // get info for a single log
- var logInfo = function (node, callback) {
-
- var gotLogInfo = function (responses) {
- $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)
- }
- QDRService.management.topology.fetchAllEntities({entity: 'log', attrs: ['module', 'enable']}, gotLogInfo)
- }
-
- var getExpandedList = function () {
- if (!treeRoot)
- return;
- var list = [];
- if (treeRoot.visit) {
- treeRoot.visit(function(node){
- if (node.isExpanded()) {
- list.push(node.data.parentKey)
- }
- });
- }
- return list;
- }
-
- // loads the tree node name that was last selected
- var loadActivatedNode = function () {
- return localStorage[OVERVIEWACTIVATEDKEY] || 'Routers'
- }
- // saved the tree node name that is currently selected
- var saveActivated = function (key) {
- localStorage[OVERVIEWACTIVATEDKEY] = key;
- lastKey = key;
- }
- // loads list that was saved
- var loadExpandedNodeList = function () {
- return angular.fromJson(localStorage[OVERVIEWEXPANDEDKEY]) || [];
- }
- // called when a node is expanded
- // here we save the expanded node so it can be restored when the page reloads
- var saveExpanded = function () {
- var list = getExpandedList();
- localStorage[OVERVIEWEXPANDEDKEY] = JSON.stringify(list)
- expandedNodeList = list
- }
-
- var setTemplate = function (node) {
- var type = node.type;
- var template = $scope.templates.filter( function (tpl) {
- return tpl.name == type;
- })
- $timeout( function () {
- $scope.template = template[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 onTreeNodeActivated = function (event, data) {
- saveExpanded()
- saveActivated(data.node.key)
- $scope.ActivatedKey = data.node.key
- setTemplate(data.node)
- updateExpanded()
- }
-
- var onTreeNodeExpanded = function (event, data) {
- saveExpanded()
- updateExpanded()
- }
-
- if (!QDRService.management.connection.is_connected()) {
- QDR.redirectWhenConnected($location, "overview")
- return;
- }
- $scope.template = $scope.templates[0]
-
- /* --------------------------------------------------
- *
- * 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, entity, worker) {
- var tree = $("#overtree").fancytree("getTree"), node;
- if (tree && tree.getNodeByKey) {
- 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) {
- children.push(worker(leaf))
- })
- 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)
-
- // don't allow HTML in the tree titles
- $('.fancytree-title').each( function (idx) {
- var unsafe = $(this).html()
- $(this).html(unsafe.replace(/</g, "<").replace(/>/g, ">"))
- })
-
- // 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
- $scope.ActivatedKey = loadActivatedNode();
- var expandedNodeList = loadExpandedNodeList();
- var firstTime = true;
-
- var showCharts = function () {
-
- }
- var charts = new Folder("Charts")
- charts.info = {fn: showCharts}
- charts.type = "Charts" // for the charts template
- charts.key = 'Charts'
- charts.extraClasses = "charts"
- topLevelChildren.push(charts)
-
- // create a routers tree branch
- var routers = new Folder("Routers")
- routers.type = "Routers"
- routers.info = {fn: allRouterInfo}
- routers.expanded = (expandedNodeList.indexOf("Routers") > -1)
- routers.key = "Routers"
- 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.management.topology.nameFromId(node)
- var router = new Leaf(name)
- router.type = "Router"
- router.info = {fn: routerInfo}
- router.nodeId = node
- router.key = node
- router.extraClasses = "router"
- router.parentKey = "Routers"
- return router;
- }
- updateLeaves(nodes, "Routers", worker)
- }
-
- // create an addresses tree branch
- var addresses = new Folder("Addresses")
- addresses.type = "Addresses"
- addresses.info = {fn: allAddressInfo}
- addresses.expanded = (expandedNodeList.indexOf("Addresses") > -1)
- addresses.key = "Addresses"
- addresses.parentKey = "Addresses"
- addresses.extraClasses = "addresses"
- topLevelChildren.push(addresses)
- var updateAddressTree = function (addressFields) {
- var worker = function (address) {
- 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.extraClasses = a.tooltip
- a.parentKey = "Addresses"
- return a;
- }
- updateLeaves(addressFields, "Addresses", worker)
- }
-
- $scope.$watch("filter", function (newValue, oldValue) {
- if (newValue !== oldValue) {
- allLinkInfo(null, function () {$timeout(function (){})})
- localStorage[FILTERKEY] = JSON.stringify($scope.filter)
- }
- }, true)
-
- $scope.filterToggle = function () {
- var filter = $('#linkFilter')
- filter.toggle();
- }
-
- $scope.filter = angular.fromJson(localStorage[FILTERKEY]) || {endpointsOnly: "true", hideConsoles: true};
- var links = new Folder("Links")
- links.type = "Links"
- links.info = {fn: allLinkInfo}
- links.expanded = (expandedNodeList.indexOf("Links") > -1)
- links.key = "Links"
- 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 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.parentKey = "Links"
- if (isConsole)
- l.tooltip = "console link"
- else
- l.tooltip = link.linkType + " link"
- l.extraClasses = l.tooltip
- return l;
- }
- updateLeaves(linkFields, "Links", worker)
- }
-
- var connections = new Folder("Connections")
- connections.type = "Connections"
- connections.info = {fn: allConnectionInfo}
- connections.expanded = (expandedNodeList.indexOf("Connections") > -1)
- connections.key = "Connections"
- connections.parentKey = "Connections"
- connections.extraClasses = "connections"
- topLevelChildren.push(connections)
-
- updateConnectionTree = function (connectionFields) {
- var worker = function (connection) {
- var host = connection.host
- if (connection.name === 'connection/' && connection.role === 'inter-router' && connection.host === '')
- host = connection.container + ':' + connection.identity
-
- var c = new Leaf(host)
- var isConsole = QDRService.utilities.isAConsole (connection.properties, connection.identity, connection.role, connection.routerId)
- c.type = "Connection"
- 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.extraClasses = c.tooltip
- c.parentKey = "Connections"
- return c
- }
- updateLeaves(connectionFields, "Connections", worker)
- }
-
- var updateLogTree = function (logFields) {
- var worker = function (log) {
- var l = new Leaf(log.name)
- l.type = "Log"
- l.info = {fn: logInfo}
- l.key = log.name
- l.parentKey = "Logs"
- l.extraClasses = "log"
- return l
- }
- updateLeaves(logFields, "Logs", worker)
- }
-
- var htmlReady = false;
- var dataReady = false;
- $scope.largeNetwork = QDRService.management.topology.isLargeNetwork()
- var logs = new Folder("Logs")
- logs.type = "Logs"
- logs.info = {fn: allLogInfo}
- logs.expanded = (expandedNodeList.indexOf("Logs") > -1)
- logs.key = "Logs"
- 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;
- var div = angular.element("#overtree");
- if (!div.width()) {
- setTimeout(initTreeAndGrid, 100);
- return;
- }
- $('#overtree').fancytree({
- activate: onTreeNodeActivated,
- expand: onTreeNodeExpanded,
- init: onTreeInitialized,
- autoCollapse: $scope.largeNetwork,
- activeVisible:! $scope.largeNetwork,
- clickFolderMode: 1,
- source: topLevelChildren
- })
- }
-
- $scope.overviewLoaded = function () {
- htmlReady = true;
- initTreeAndGrid();
- }
-
- 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 Leaf("loading...")
- placeHolder.extraClasses = "loading"
- parent.children = [placeHolder]
- })
-
- var updateExpanded = function () {
- 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()) {
- 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)
- })
- })
- }
- }
-
- dataReady = true;
- initTreeAndGrid();
- $scope.$on("$destroy", function( event ) {
- clearTimeout(updateIntervalHandle)
- $(window).off("resize", resizer);
- });
- }]);
-
- return QDR;
-
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/console/stand-alone/plugin/js/qdrOverviewChartsController.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrOverviewChartsController.js b/console/stand-alone/plugin/js/qdrOverviewChartsController.js
deleted file mode 100644
index 335bcb9..0000000
--- a/console/stand-alone/plugin/js/qdrOverviewChartsController.js
+++ /dev/null
@@ -1,132 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- QDR.module.controller('QDR.OverviewChartsController', function ($scope, QDRService, QDRChartService, $timeout) {
-
- $scope.overviewCharts = []
- var updateTimer;
-
- // called when it is time to update the chart's data
- var sum = function (request, saveResponse) {
- var attrs = angular.copy(request.overrideAttrs)
- var totalAttr = attrs.shift() // remove totals attr
- var attrEntities = [{entity: request.entity, attrs: attrs}]
- QDRService.management.topology.fetchAllEntities(attrEntities, function (responses) {
- var total = 0
- var response = {attributeNames: [totalAttr, 'name'], results: [[]]}
- // for each router
- for (var router in responses) {
- var record = responses[router][request.entity]
- var accessor = charts.find( function (chart) { return chart.nodeId === request.nodeId}).accessor
- // for each attribute-value (ie each address or each link)
- for (var i=0; i<record.results.length; i++) {
- total += accessor(record.attributeNames, record.results[i])
- }
- }
- response.results[0][0] = total
- response.results[0][1] = request.names()[0]
- saveResponse(request.nodeId, request.entity, response)
- })
- }
- var charts = [
-
- {
- nodeId: '///Throughput/',
- entity: 'router.address',
- name: 'throughput',
- overrideAttrs: ['throughput', 'deliveriesEgress'],
- attr: 'throughput',
- type: "rate",
- hideLabel: true,
- hideLegend: true,
- rateWindow: 5000, // update data once every 5 seconds
- visibleDuration: 1, // show data for the last 1 minute
- forceCreate: true,
- accessor: function (attributes, results) {
- return results[attributes.indexOf('deliveriesEgress')]
- },
- override: sum // called to fetch the chart data
- },
- {
- nodeId: '///Outstanding-Deliveries/',
- entity: 'router.link',
- name: 'outstandingDeliveries',
- overrideAttrs:['outstandingDeliveries', 'undeliveredCount', 'unsettledCount', 'linkType'],
- attr: 'outstandingDeliveries',
- hideLabel: true,
- hideLegend: true,
- visibleDuration: 1, // show data for the last 1 minute
- forceCreate: true,
- accessor: function (attributes, results) {
- return results[attributes.indexOf('linkType')] === 'endpoint'
- ? results[attributes.indexOf('unsettledCount')] + results[attributes.indexOf('undeliveredCount')]
- : 0
- },
- now: new Date(),
- override: sum // called to fetch the chart data
- }
- ]
- $scope.overviewCharts = charts.map( function (chart) {
- var c = QDRChartService.registerChart(chart)
- return new QDRChartService.pfAreaChart(c, c.id(), true)
- })
-
-
- // redraw the chart every update period
- var updateCharts = function () {
- $scope.overviewCharts.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'] : 1000;
- }
-
- var createCharts = function () {
- // ensure the div for our chart is loaded in the dom
- var div = angular.element(".chartContainer");
- if (!div.width()) {
- setTimeout(createCharts, 100);
- return;
- }
- // create an svg object for each chart
- $scope.overviewCharts.forEach ( function (c) {
- // tell c3 to create the svg
- c.generate()
- })
- // redraw the charts once every second
- updateTimer = setInterval(updateCharts, 1000);
- }
- $timeout( function () {
- createCharts()
- })
-
- $scope.$on("$destroy", function(event) {
- if (updateTimer)
- clearInterval(updateTimer)
- $scope.overviewCharts.forEach( function (svg) {
- QDRChartService.unRegisterChart(svg.chart)
- })
- })
- });
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 103e39e..0000000
--- a/console/stand-alone/plugin/js/qdrOverviewLogsController.js
+++ /dev/null
@@ -1,69 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- QDR.module.controller('QDR.OverviewLogsController', function ($scope, $uibModalInstance, QDRService, $timeout, nodeName, nodeId, module, level) {
-
- var gotLogInfo = function (nodeId, 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)
- } else {
- var levelLogs = response.filter( function (result) {
- if (result[1] == null)
- result[1] = "error"
- return result[1].toUpperCase() === level.toUpperCase() && result[0] === module
- })
- var logFields = levelLogs.map( function (result) {
- return {
- nodeId: QDRService.management.topology.nameFromId(nodeId),
- name: result[0],
- type: result[1],
- message: result[2],
- source: result[3],
- line: result[4],
- time: Date(result[5]).toString()
- }
- })
- $timeout(function () {
- $scope.loading = false
- $scope.logFields = logFields
- })
- }
- }
- 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
- $scope.level = level
- $scope.nodeName = nodeName
- $scope.logFields = []
- $scope.ok = function () {
- $uibModalInstance.close(true);
- };
-
- });
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index 89c5e9d..0000000
--- a/console/stand-alone/plugin/js/qdrSchema.js
+++ /dev/null
@@ -1,82 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
- QDR.module.controller("QDR.SchemaController", ['$scope', '$location', '$timeout', 'QDRService', function($scope, $location, $timeout, QDRService) {
- if (!QDRService.management.connection.is_connected()) {
- QDR.redirectWhenConnected($location, "schema")
- return;
- }
- var onDisconnect = function () {
- $timeout( function () {QDR.redirectWhenConnected("schema")})
- }
- // we are currently connected. setup a handler to get notified if we are ever disconnected
- QDRService.management.connection.addDisconnectAction( onDisconnect )
-
- var keys2kids = function (tree, obj) {
- if (obj === Object(obj)) {
- tree.children = []
- var keys = Object.keys(obj).sort()
- for (var i=0; i<keys.length; ++i) {
- var key = keys[i];
- var kid = {title: key}
- if (obj[key] === Object(obj[key])) {
- kid.folder = true
- keys2kids(kid, obj[key])
- } else {
- kid.title += (': ' + JSON.stringify(obj[key],null,2))
- }
- tree.children.push(kid)
- }
- }
- }
-
- var tree = []
- for (var key in QDRService.management.schema()) {
- var kid = {title: key}
- kid.folder = true
- var val = QDRService.management.schema()[key]
- if (val === Object(val))
- keys2kids(kid, val)
- else
- kid.title += (': ' + JSON.stringify(val,null,2))
-
- tree.push(kid);
- }
- $('#schema').fancytree({
- minExpandLevel: 2,
- clickFolderMode: 3,
- classNames: {
- expander: 'fa-angle',
- connector: 'fancytree-no-connector'
- },
- source: tree
- })
-
- $scope.$on("$destroy", function(event) {
- QDRService.management.connection.delDisconnectAction( onDisconnect )
- });
-
- }]);
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/502538b4/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
deleted file mode 100644
index f5acb89..0000000
--- a/console/stand-alone/plugin/js/qdrService.js
+++ /dev/null
@@ -1,223 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- // 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 = {
- management: new dm.Management($location.protocol()),
- utilities: dm.Utilities,
-
- onReconnect: function () {
- self.management.connection.on('disconnected', self.onDisconnect)
- var org = localStorage[QDR.LAST_LOCATION] || "/overview"
- $timeout ( function () {
- $location.path(org)
- $location.search('org', null)
- $location.replace()
- })
- },
- onDisconnect: function () {
- self.management.connection.on('connected', self.onReconnect)
- $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 {
- $location.search('org', null)
- }
- $location.replace()
- })
- },
-
- connect: function (connectOptions) {
- return new Promise ( function (resolve, reject) {
- self.management.connection.connect(connectOptions)
- .then( function (r) {
- // if we are ever disconnected, show the connect page and wait for a reconnect
- self.management.connection.on('disconnected', self.onDisconnect)
-
- self.management.getSchema()
- .then( function (schema) {
- QDR.log.info("got schema after connection")
- self.management.topology.setUpdateEntities([])
- QDR.log.info("requesting a topology")
- self.management.topology.get() // gets the list of routers
- .then( function () {
- QDR.log.info("got initial topology")
- var curPath = $location.path()
- var org = curPath.substr(1)
- if (org === '' || org === 'connect') {
- org = localStorage[QDR.LAST_LOCATION] || "/overview"
- } else {
- if (org && $location.path() !== '/connect') {
- org = $location.path().substr(1)
- }
- }
- $timeout ( function () {
- $location.path(org)
- $location.search('org', null)
- $location.replace()
- })
- })
- })
- resolve(r)
- }, function (e) {
- reject(e)
- })
- })
- },
- disconnect: function () {
- self.management.connection.disconnect();
- delete self.management
- self.management = new dm.Management($location.protocol())
- }
-
-
- }
-
- return self;
- }]);
-
- return QDR;
-
-}(QDR || {}));
-
-(function() {
- console.dump = function(o) {
- if (window.JSON && window.JSON.stringify)
- QDR.log.info(JSON.stringify(o, undefined, 2));
- else
- console.log(o);
- };
-})();
-
-if (!String.prototype.startsWith) {
- String.prototype.startsWith = function (searchString, position) {
- return this.substr(position || 0, searchString.length) === searchString
- }
-}
-
-if (!String.prototype.endsWith) {
- String.prototype.endsWith = function(searchString, position) {
- var subjectString = this.toString();
- if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
- position = subjectString.length;
- }
- position -= searchString.length;
- var lastIndex = subjectString.lastIndexOf(searchString, position);
- return lastIndex !== -1 && lastIndex === position;
- };
-}
-
-// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
-if (!Array.prototype.findIndex) {
- Object.defineProperty(Array.prototype, 'findIndex', {
- value: function(predicate) {
- // 1. Let O be ? ToObject(this value).
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
-
- var o = Object(this);
-
- // 2. Let len be ? ToLength(? Get(O, "length")).
- var len = o.length >>> 0;
-
- // 3. If IsCallable(predicate) is false, throw a TypeError exception.
- if (typeof predicate !== 'function') {
- throw new TypeError('predicate must be a function');
- }
-
- // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
- var thisArg = arguments[1];
-
- // 5. Let k be 0.
- var k = 0;
-
- // 6. Repeat, while k < len
- while (k < len) {
- // a. Let Pk be ! ToString(k).
- // b. Let kValue be ? Get(O, Pk).
- // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
- // d. If testResult is true, return k.
- var kValue = o[k];
- if (predicate.call(thisArg, kValue, k, o)) {
- return k;
- }
- // e. Increase k by 1.
- k++;
- }
-
- // 7. Return -1.
- return -1;
- }
- });
-}
-
-// https://tc39.github.io/ecma262/#sec-array.prototype.find
-if (!Array.prototype.find) {
- Object.defineProperty(Array.prototype, 'find', {
- value: function(predicate) {
- // 1. Let O be ? ToObject(this value).
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
-
- var o = Object(this);
-
- // 2. Let len be ? ToLength(? Get(O, "length")).
- var len = o.length >>> 0;
-
- // 3. If IsCallable(predicate) is false, throw a TypeError exception.
- if (typeof predicate !== 'function') {
- throw new TypeError('predicate must be a function');
- }
-
- // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
- var thisArg = arguments[1];
-
- // 5. Let k be 0.
- var k = 0;
-
- // 6. Repeat, while k < len
- while (k < len) {
- // a. Let Pk be ! ToString(k).
- // b. Let kValue be ? Get(O, Pk).
- // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
- // d. If testResult is true, return kValue.
- var kValue = o[k];
- if (predicate.call(thisArg, kValue, k, o)) {
- return kValue;
- }
- // e. Increase k by 1.
- k++;
- }
-
- // 7. Return undefined.
- return undefined;
- }
- });
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org