From e3789281190f6d8534be06ddc454999efd37e963 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 8 Jun 2020 13:21:38 -0600 Subject: [PATCH 01/27] Added ag-grid tables to TP --- traffic_portal/app/src/app.js | 7 +- .../table/servers/TableServersController.js | 72 +++++++++++++++++++ .../table/servers/table.servers.tpl.html | 5 +- traffic_portal/grunt/browserify2.js | 17 ++++- traffic_portal/grunt/globalConfig.js | 5 +- traffic_portal/package-lock.json | 10 +++ traffic_portal/package.json | 4 ++ 7 files changed, 111 insertions(+), 9 deletions(-) diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js index ddf01c5093..5be0c353d9 100644 --- a/traffic_portal/app/src/app.js +++ b/traffic_portal/app/src/app.js @@ -20,12 +20,16 @@ 'use strict'; require('app-templates'); +var AgGrid = require("ag-grid-community"); + var App = function($urlRouterProvider) { $urlRouterProvider.otherwise('/'); }; App.$inject = ['$urlRouterProvider']; +AgGrid.initialiseAgGridWithAngular1(angular); + var trafficPortal = angular.module('trafficPortal', [ 'config', 'ngAnimate', @@ -42,6 +46,7 @@ var trafficPortal = angular.module('trafficPortal', [ 'angular-loading-bar', 'moment-picker', 'jsonFormatter', + 'agGrid', // public modules require('./modules/public').name, @@ -509,5 +514,3 @@ trafficPortal.factory('authInterceptor', function ($rootScope, $q, $window, $loc trafficPortal.config(function ($httpProvider) { $httpProvider.interceptors.push('authInterceptor'); }); - - diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 4073abeaf8..1fda7fbc47 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -165,6 +165,78 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo { "name": "Update Pending", "visible": true, "searchable": true } ]; + $scope.gridOptions = { + // columnDefs: [ + // { headerName: "Cache Group", field: "cachegroup"}, + // { headerName: "CDN", field: "cdnName"}, + // { headerName: "Domain", field: "domainName"}, + // { headerName: "Host", field: "hostName"}, + // { headerName: "HTTPS Port", field: "httpsPort"}, + // { headerName: "ID", field: "id"}, + // { headerName: "ILO IP Address", field: "iloIpAddress"}, + // { headerName: "ILO IP Gateway", field: "iloIpGateway"}, + // { headerName: "ILO IP Netmask", field: "iloIpNetmask"}, + // { headerName: "ILO Username", field: "iloUsername"}, + // { headerName: "Interface Name", field: "interfaceName"}, + // { headerName: "IPv6 Address", field: "ipv6Address"}, + // { headerName: "IPv6 Gateway", field: "ipv6Gateway"}, + // { headerName: "Last Updated", field: "lastUpdated"}, + // { headerName: "Mgmt IP Address", field: "mgmtIPAddress"}, + // { headerName: "Mgmt IP Gateway", field: "mgmtIPGateway"}, + // { headerName: "Mgmt IP Netmask", field: "mgmtIPNetmask"}, + // { headerName: "Network Gateway", field: "ipGateway"}, + // { headerName: "Network IP", field: "idAddress"}, + // { headerName: "Network MTU", field: "interfaceMtu"}, + // { headerName: "Network Subnet", field: "ipNetmask"}, + // { headerName: "Offline Reason", field: "offlineReason"}, + // { headerName: "Phys Location", field: "physLocation"}, + // { headerName: "Profile", field: "profile"}, + // { headerName: "Rack", field: "rack"}, + // { headerName: "Reval Pending", field: "revalPending"}, + // { headerName: "Router Hostname", field: "routerHostName"}, + // { headerName: "Router Port Name", field: "routerPortName"}, + // { headerName: "Status", field: "status"}, + // { headerName: "TCP Port", field: "tcpPort"}, + // { headerName: "Type", field: "type"}, + // { headerName: "Update Pending", field: "updPending" } + // ], + // rowData: servers.map(function(x) { + // return { + // cachegroup: x.cachegroup, + // cdnName: x.cdnName, + // domain: x.domainName, + // hostName: x.hostName, + // httpsPort: x.httpsPort, + // id: x.id, + // physLocation: x.physLocation, + // profile: x.profile, + // rack: "", + // revalPending: x.revalPending, + // routerHostName: "", + // routerPortName: "", + // status: x.status, + // tcpPort: x.tcpPort, + // type: x.type, + // updPending: x.updPending + // }; + // }), + columnDefs: [ + {headerName: "Make", field: "make"}, + {headerName: "Model", field: "model"}, + {headerName: "Price", field: "price"} + ], + rowData: [ + {make: "Toyota", model: "Celica", price: 35000}, + {make: "Ford", model: "Mondeo", price: 32000}, + {make: "Porsche", model: "Boxter", price: 72000} + ], + onGridReady: function(params) { + params.api.sizeColumnsToFit(); + } + }; + + console.log(servers); + $scope.contextMenuItems = [ { text: 'Open in New Tab', diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 9c3dce476f..51823656dc 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -138,7 +138,4 @@ - - - - +
diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js index 9f77bb84fe..96ff7b7a50 100644 --- a/traffic_portal/grunt/browserify2.js +++ b/traffic_portal/grunt/browserify2.js @@ -24,6 +24,11 @@ module.exports = { options: { expose: { files: [ + { + cwd: "<%= globalConfig.importdir %>", + src: ["ag-grid-community/dist/ag-grid-community.min.js"], + rename: function () { return "ag-grid-community-min.js"; } + }, { cwd: '<%= globalConfig.app %>/bower_components/', src: @@ -85,11 +90,16 @@ module.exports = { options: { expose: { files: [ + { + cwd: "<%= globalConfig.importdir %>", + src: ["ag-grid-community/dist/ag-grid-community.min.js"], + rename: function () { return "ag-grid-community.js"; } + }, { cwd: '<%= globalConfig.app %>/bower_components/', src: [ - 'angular/angular.js', + // 'angular/angular.js', 'angular-animate/angular-animate.js', 'angular-bootstrap-contextmenu/contextMenu.js', 'angular-bootstrap/ui-bootstrap.js', @@ -106,6 +116,11 @@ module.exports = { 'json3/lib/json3.js' ] }, + { + cwd: "<%= globalConfig.importdir %>", + src: ["angular/angular.min.js"], + rename: function() {return "angular/angular.js";} + }, { cwd: '<%= globalConfig.app %>/bower_components/', src: [ 'flot/jquery.flot.js' ], diff --git a/traffic_portal/grunt/globalConfig.js b/traffic_portal/grunt/globalConfig.js index 71ab1b4605..95b34f281f 100644 --- a/traffic_portal/grunt/globalConfig.js +++ b/traffic_portal/grunt/globalConfig.js @@ -6,9 +6,9 @@ * 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 @@ -21,6 +21,7 @@ module.exports = function() { var globalConfig = { app: 'app', resourcesdir: 'app/dist/public/resources', + importdir: "node_modules", distdir: 'app/dist', srcserverdir: './server', srcdir: 'app/src', diff --git a/traffic_portal/package-lock.json b/traffic_portal/package-lock.json index 2ad7393b3a..048636d9dd 100644 --- a/traffic_portal/package-lock.json +++ b/traffic_portal/package-lock.json @@ -83,6 +83,11 @@ } } }, + "ag-grid-community": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-23.2.0.tgz", + "integrity": "sha512-aG7Ghfu79HeqOCd50GhFSeZUX1Tw9BVUX1VKMuglkAcwYPTQjuYvYT7QVQB5FGzfFjcVq4a1QFfcgdoAcZYJIA==" + }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -113,6 +118,11 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "angular": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.0.tgz", + "integrity": "sha512-VdaMx+Qk0Skla7B5gw77a8hzlcOakwF8mjlW13DpIWIDlfqwAbSSLfd8N/qZnzEmQF4jC4iofInd3gE7vL8ZZg==" + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", diff --git a/traffic_portal/package.json b/traffic_portal/package.json index 4462040527..711c793f11 100644 --- a/traffic_portal/package.json +++ b/traffic_portal/package.json @@ -30,5 +30,9 @@ "requirejs": "2.3.6", "ssl-root-cas": "1.3.1", "time-grunt": "1.3.0" + }, + "dependencies": { + "ag-grid-community": "^23.2.0", + "angular": "^1.8.0" } } From d48190436523442ca2e621ae3035ddda073d241d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 8 Jun 2020 19:42:39 -0600 Subject: [PATCH 02/27] Fixed build issues --- traffic_portal/app/src/app.js | 5 ++--- traffic_portal/app/src/index.html | 1 + traffic_portal/grunt/browserify2.js | 5 ----- traffic_portal/grunt/copy.js | 18 ++++++++++++++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js index 5be0c353d9..7575d3c2cf 100644 --- a/traffic_portal/app/src/app.js +++ b/traffic_portal/app/src/app.js @@ -20,15 +20,14 @@ 'use strict'; require('app-templates'); -var AgGrid = require("ag-grid-community"); - var App = function($urlRouterProvider) { $urlRouterProvider.otherwise('/'); }; + App.$inject = ['$urlRouterProvider']; -AgGrid.initialiseAgGridWithAngular1(angular); +agGrid.initialiseAgGridWithAngular1(angular); var trafficPortal = angular.module('trafficPortal', [ 'config', diff --git a/traffic_portal/app/src/index.html b/traffic_portal/app/src/index.html index 0593391095..cba678e581 100644 --- a/traffic_portal/app/src/index.html +++ b/traffic_portal/app/src/index.html @@ -49,6 +49,7 @@
+ diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js index 96ff7b7a50..8ba0118c10 100644 --- a/traffic_portal/grunt/browserify2.js +++ b/traffic_portal/grunt/browserify2.js @@ -90,11 +90,6 @@ module.exports = { options: { expose: { files: [ - { - cwd: "<%= globalConfig.importdir %>", - src: ["ag-grid-community/dist/ag-grid-community.min.js"], - rename: function () { return "ag-grid-community.js"; } - }, { cwd: '<%= globalConfig.app %>/bower_components/', src: diff --git a/traffic_portal/grunt/copy.js b/traffic_portal/grunt/copy.js index f774d3995f..785062e5dc 100644 --- a/traffic_portal/grunt/copy.js +++ b/traffic_portal/grunt/copy.js @@ -6,9 +6,9 @@ * 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 @@ -42,6 +42,13 @@ module.exports = { 'traffic_portal_release.json', 'traffic_portal_properties.json' ] + }, + { + expand: true, + dot: true, + cwd: "<%= globalConfig.importdir %>", + dest: "<%= globalConfig.resourcesdir %>/assets/js/", + src: ["ag-grid-community/dist/ag-grid-community.min.js"] } ] }, @@ -78,6 +85,13 @@ module.exports = { 'traffic_portal_release.json', 'traffic_portal_properties.json' ] + }, + { + expand: true, + dot: true, + cwd: "<%= globalConfig.importdir %>", + dest: "<%= globalConfig.resourcesdir %>/assets/js/", + src: ["ag-grid-community/dist/ag-grid-community.min.js"] } ] } From 6285be1799a2d76d4788174fc362222bc2facad9 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 8 Jun 2020 19:43:14 -0600 Subject: [PATCH 03/27] Replaced servers table with agGrid --- .../table/servers/TableServersController.js | 430 +++++++++++++----- .../table/servers/table.servers.tpl.html | 90 +--- 2 files changed, 312 insertions(+), 208 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 1fda7fbc47..4e0ceb14ea 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -17,10 +17,273 @@ * under the License. */ -var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel) { + +var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel) { + + // browserify can't handle classes... + function SSHCellRenderer() {} + SSHCellRenderer.prototype.init = function(params) { + this.eGui = document.createElement("A"); + this.eGui.href = "ssh://" + userModel.user.username + "@" + params.value; + this.eGui.setAttribute("target", "_blank"); + this.eGui.textContent = params.value; + }; + SSHCellRenderer.prototype.getGui = function() {return this.eGui;}; + + function UpdateCellRenderer() {} + UpdateCellRenderer.prototype.init = function(params) { + this.eGui = document.createElement("I"); + this.eGui.setAttribute("aria-hidden", "true"); + this.eGui.setAttribute("title", String(params.value)); + this.eGui.classList.add("fa", "fa-lg"); + if (params.value) { + this.eGui.classList.add("fa-check"); + } else { + this.eGui.classList.add("fa-clock-o"); + } + } + UpdateCellRenderer.prototype.getGui = function() {return this.eGui;}; + + function offlineReasonTooltip(params) { + if (!params.value || !serverUtils.isOffline(params.value)) { + return; + } + return params.data.offlineReason; + } + + function dateCellFormatter(params) { + return dateUtils.getRelativeTime(params.value); + } let serversTable; + function editServer(params) { + $scope.editServer(params.data.id); + // Event is outside the digest cycle, so we need this to trigger one. + $scope.$apply(); + } + + const agColumns = [ + { + headerName: "Cache Group", + field: "cachegroup", + hide: false, + searchable: true + }, + { + headerName: "CDN", + field: "cdn", + hide: false, + searchable: true + }, + { + headerName: "Domain", + field: "domainName", + hide: false, + searchable: true + }, + { + headerName: "Host", + field: "hostName", + hide: false, + searchable: true + }, + { + headerName: "HTTPS Port", + field: "httpsPort", + hide: true, + searchable: false, + filter: "agNumberColumnFilter" + }, + { + headerName: "ID", + field: "id", + hide: true, + searchable: true, + filter: "agNumberColumnFilter" + }, + { + headerName: "ILO IP Address", + field: "iloIpAddress", + hide: true, + searchable: true, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "ILO IP Gateway", + field: "iloIpGateway", + hide: true, + searchable: false, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "ILO IP Netmask", + field: "iloIpNetmask", + hide: true, + searchable: false + }, + { + headerName: "ILO Username", + field: "iloUsername", + hide: true, + searchable: false + }, + { + headerName: "Interface Name", + field: "interfaceName", + hide: true, + searchable: false + }, + { + headerName: "IPv6 Address", + field: "ipv6Address", + hide: false, + searchable: true + }, + { + headerName: "IPv6 Gateway", + field: "ipv6Gateway", + hide: true, + searchable: false + }, + { + headerName: "Last Updated", + field: "lastUpdated", + hide: true, + searchable: false, + filter: "agDateColumnFilter", + valueFormatter: dateCellFormatter + }, + { + headerName: "Mgmt IP Address", + field: "mgmtIpAddress", + hide: true, + searchable: false + }, + { + headerName: "Mgmt IP Gateway", + field: "mgmtIpGateway", + hide: true, + searchable: false, + filter: true, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "Mgmt IP Netmask", + field: "mgmtIpNetmask", + hide: true, + searchable: false, + filter: true, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "Network Gateway", + field: "ipGateway", + hide: true, + searchable: true, + filter: true, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "Network IP", + field: "ipAddress", + hide: false, + searchable: true, + filter: true, + cellRenderer: "sshCellRenderer", + onCellClicked: null + }, + { + headerName: "Network MTU", + field: "interfaceMtu", + hide: true, + searchable: false, + filter: "agNumberColumnFilter" + }, + { + headerName: "Network Subnet", + field: "ipNetmask", + hide: true, + searchable: false + }, + { + headerName: "Offline Reason", + field: "offlineReason", + hide: true, + searchable: false + }, + { + headerName: "Phys Location", + field: "physLocation", + hide: true, + searchable: true + }, + { + headerName: "Profile", + field: "profile", + hide: false, + searchable: true + }, + { + headerName: "Rack", + field: "rack", + hide: true, + searchable: false + }, + { + headerName: "Reval Pending", + field: "revalPending", + hide: true, + searchable: false, + filter: true, + cellRenderer: "updateCellRenderer" + }, + { + headerName: "Router Hostname", + field: "routerHostName", + hide: true, + searchable: false + }, + { + headerName: "Router Port Name", + field: "routerPortName", + hide: true, + searchable: false + }, + { + headerName: "Status", + field: "status", + hide: false, + searchable: true, + tooltip: offlineReasonTooltip + }, + { + headerName: "TCP Port", + field: "tcpPort", + hide: true, + searchable: false + }, + { + headerName: "Type", + field: "type", + hide: false, + searchable: true + }, + { + headerName: "Update Pending", + field: "updPending", + hide: false, + searchable: true, + filter: true, + cellRenderer: "updateCellRenderer" + } + ]; + var getStatuses = function() { statusService.getStatuses() .then(function(result) { @@ -128,115 +391,34 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - $scope.servers = servers; - - $scope.columns = [ - { "name": "Cache Group", "visible": true, "searchable": true }, - { "name": "CDN", "visible": true, "searchable": true }, - { "name": "Domain", "visible": true, "searchable": true }, - { "name": "Host", "visible": true, "searchable": true }, - { "name": "HTTPS Port", "visible": false, "searchable": false }, - { "name": "ID", "visible": false, "searchable": false }, - { "name": "ILO IP Address", "visible": true, "searchable": true }, - { "name": "ILO IP Gateway", "visible": false, "searchable": false }, - { "name": "ILO IP Netmask", "visible": false, "searchable": false }, - { "name": "ILO Username", "visible": false, "searchable": false }, - { "name": "Interface Name", "visible": false, "searchable": false }, - { "name": "IPv6 Address", "visible": true, "searchable": true }, - { "name": "IPv6 Gateway", "visible": false, "searchable": false }, - { "name": "Last Updated", "visible": false, "searchable": false }, - { "name": "Mgmt IP Address", "visible": false, "searchable": false }, - { "name": "Mgmt IP Gateway", "visible": false, "searchable": false }, - { "name": "Mgmt IP Netmask", "visible": false, "searchable": false }, - { "name": "Network Gateway", "visible": false, "searchable": false }, - { "name": "Network IP", "visible": true, "searchable": true }, - { "name": "Network MTU", "visible": false, "searchable": false }, - { "name": "Network Subnet", "visible": false, "searchable": false }, - { "name": "Offline Reason", "visible": false, "searchable": false }, - { "name": "Phys Location", "visible": true, "searchable": true }, - { "name": "Profile", "visible": true, "searchable": true }, - { "name": "Rack", "visible": false, "searchable": false }, - { "name": "Reval Pending", "visible": false, "searchable": false }, - { "name": "Router Hostname", "visible": false, "searchable": false }, - { "name": "Router Port Name", "visible": false, "searchable": false }, - { "name": "Status", "visible": true, "searchable": true }, - { "name": "TCP Port", "visible": false, "searchable": false }, - { "name": "Type", "visible": true, "searchable": true }, - { "name": "Update Pending", "visible": true, "searchable": true } - ]; + console.time("server map"); + $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); + console.timeEnd("server map"); + + $scope.columns = []; $scope.gridOptions = { - // columnDefs: [ - // { headerName: "Cache Group", field: "cachegroup"}, - // { headerName: "CDN", field: "cdnName"}, - // { headerName: "Domain", field: "domainName"}, - // { headerName: "Host", field: "hostName"}, - // { headerName: "HTTPS Port", field: "httpsPort"}, - // { headerName: "ID", field: "id"}, - // { headerName: "ILO IP Address", field: "iloIpAddress"}, - // { headerName: "ILO IP Gateway", field: "iloIpGateway"}, - // { headerName: "ILO IP Netmask", field: "iloIpNetmask"}, - // { headerName: "ILO Username", field: "iloUsername"}, - // { headerName: "Interface Name", field: "interfaceName"}, - // { headerName: "IPv6 Address", field: "ipv6Address"}, - // { headerName: "IPv6 Gateway", field: "ipv6Gateway"}, - // { headerName: "Last Updated", field: "lastUpdated"}, - // { headerName: "Mgmt IP Address", field: "mgmtIPAddress"}, - // { headerName: "Mgmt IP Gateway", field: "mgmtIPGateway"}, - // { headerName: "Mgmt IP Netmask", field: "mgmtIPNetmask"}, - // { headerName: "Network Gateway", field: "ipGateway"}, - // { headerName: "Network IP", field: "idAddress"}, - // { headerName: "Network MTU", field: "interfaceMtu"}, - // { headerName: "Network Subnet", field: "ipNetmask"}, - // { headerName: "Offline Reason", field: "offlineReason"}, - // { headerName: "Phys Location", field: "physLocation"}, - // { headerName: "Profile", field: "profile"}, - // { headerName: "Rack", field: "rack"}, - // { headerName: "Reval Pending", field: "revalPending"}, - // { headerName: "Router Hostname", field: "routerHostName"}, - // { headerName: "Router Port Name", field: "routerPortName"}, - // { headerName: "Status", field: "status"}, - // { headerName: "TCP Port", field: "tcpPort"}, - // { headerName: "Type", field: "type"}, - // { headerName: "Update Pending", field: "updPending" } - // ], - // rowData: servers.map(function(x) { - // return { - // cachegroup: x.cachegroup, - // cdnName: x.cdnName, - // domain: x.domainName, - // hostName: x.hostName, - // httpsPort: x.httpsPort, - // id: x.id, - // physLocation: x.physLocation, - // profile: x.profile, - // rack: "", - // revalPending: x.revalPending, - // routerHostName: "", - // routerPortName: "", - // status: x.status, - // tcpPort: x.tcpPort, - // type: x.type, - // updPending: x.updPending - // }; - // }), - columnDefs: [ - {headerName: "Make", field: "make"}, - {headerName: "Model", field: "model"}, - {headerName: "Price", field: "price"} - ], - rowData: [ - {make: "Toyota", model: "Celica", price: 35000}, - {make: "Ford", model: "Mondeo", price: 32000}, - {make: "Porsche", model: "Boxter", price: 72000} - ], + components: { + sshCellRenderer: SSHCellRenderer, + updateCellRenderer: UpdateCellRenderer + }, + columnDefs: agColumns, + defaultColDef: { + filter: true, + onCellClicked: editServer, + sortable: true, + resizable: true + }, + rowData: servers, + pagination: true, + rowBuffer: 0, onGridReady: function(params) { params.api.sizeColumnsToFit(); - } + }, + menuTabs: 'columnsMenuTab', + tooltipShowDelay: 500 }; - console.log(servers); - $scope.contextMenuItems = [ { text: 'Open in New Tab', @@ -449,10 +631,16 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $state.reload(); // reloads all the resolves for the view }; - $scope.toggleVisibility = function(colName) { - const col = serversTable.column(colName + ':name'); - col.visible(!col.visible()); - serversTable.rows().invalidate().draw(); + $scope.toggleVisibility = function(col) { + const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); + $scope.gridOptions.columnApi.setColumnVisible(col, !visible); + try { + colsVisible = $scope.gridOptions.columnApi.getAllColumns().map(function(x){return [x.colId, x.isVisible()]}); + localStorage.setItem("servers_table_columns", JSON.stringify(colsVisible)); + } catch (e) { + console.error("Failed to store column defs to local storage:", e); + } + $scope.gridOptions.api.sizeColumnsToFit(); }; $scope.ssh = serverUtils.ssh; @@ -471,23 +659,23 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo init(); angular.element(document).ready(function () { - serversTable = $('#serversTable').DataTable({ - "lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]], - "iDisplayLength": 25, - "aaSorting": [], - "columns": $scope.columns, - "initComplete": function(settings, json) { - try { - // need to create the show/hide column checkboxes and bind to the current visibility - $scope.columns = JSON.parse(localStorage.getItem('DataTables_serversTable_/')).columns; - } catch (e) { - console.error("Failure to retrieve required column info from localStorage (key=DataTables_serversTable_/):", e); + try { + // need to create the show/hide column checkboxes and bind to the current visibility + // TODO: figure out how to do this with getColumnState and setColumnState. + const colstates = JSON.parse(localStorage.getItem("servers_table_columns")); + if (colstates) { + for (let i = 0; i -
  • +
  • - +
  • @@ -52,90 +52,6 @@
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Cache GroupCDNDomainHostHTTPS PortIDILO IP AddressILO IP GatewayILO IP NetmaskILO UsernameInterface NameIPv6 AddressIPv6 GatewayLast UpdatedMgmt IP AddressMgmt IP GatewayMgmt IP NetmaskNetwork GatewayNetwork IPNetwork MTUNetwork SubnetOffline ReasonPhys LocationProfileRackReval PendingRouter HostnameRouter Port NameStatusTCP PortTypeUpdate Pending
    {{::s.cachegroup}}{{::s.cdnName}}{{::s.domainName}}{{::s.hostName}}{{::s.httpsPort}}{{::s.id}}{{::s.iloIpAddress}}{{::s.iloIpGateway}}{{::s.iloIpNetmask}}{{::s.iloUsername}}{{::s.interfaceName}}{{::s.ip6Address}}{{::s.ip6Gateway}}{{::getRelativeTime(s.lastUpdated)}}{{::s.mgmtIpAddress}}{{::s.mgmtIpGateway}}{{::s.mgmtIpNetmask}}{{::s.ipGateway}}{{::s.ipAddress}}{{::s.interfaceMtu}}{{::s.ipNetmask}}{{::s.offlineReason}}{{::s.physLocation}}{{::s.profile}}{{::s.rack}} - - - {{::s.routerHostName}}{{::s.routerPortName}} - {{::s.status}} - {{::s.status}} - {{::s.tcpPort}}{{::s.type}} - - -
    +
    -
    From 321a4797c060c33141922394c49ed815765ce65d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 08:35:46 -0600 Subject: [PATCH 04/27] Switch to tabs --- .../table/servers/TableServersController.js | 1281 ++++++++--------- 1 file changed, 627 insertions(+), 654 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 4e0ceb14ea..c5b60b48e0 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -20,660 +20,633 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel) { - // browserify can't handle classes... - function SSHCellRenderer() {} - SSHCellRenderer.prototype.init = function(params) { - this.eGui = document.createElement("A"); - this.eGui.href = "ssh://" + userModel.user.username + "@" + params.value; - this.eGui.setAttribute("target", "_blank"); - this.eGui.textContent = params.value; - }; - SSHCellRenderer.prototype.getGui = function() {return this.eGui;}; - - function UpdateCellRenderer() {} - UpdateCellRenderer.prototype.init = function(params) { - this.eGui = document.createElement("I"); - this.eGui.setAttribute("aria-hidden", "true"); - this.eGui.setAttribute("title", String(params.value)); - this.eGui.classList.add("fa", "fa-lg"); - if (params.value) { - this.eGui.classList.add("fa-check"); - } else { - this.eGui.classList.add("fa-clock-o"); - } - } - UpdateCellRenderer.prototype.getGui = function() {return this.eGui;}; - - function offlineReasonTooltip(params) { - if (!params.value || !serverUtils.isOffline(params.value)) { - return; - } - return params.data.offlineReason; - } - - function dateCellFormatter(params) { - return dateUtils.getRelativeTime(params.value); - } - - let serversTable; - - function editServer(params) { - $scope.editServer(params.data.id); - // Event is outside the digest cycle, so we need this to trigger one. - $scope.$apply(); - } - - const agColumns = [ - { - headerName: "Cache Group", - field: "cachegroup", - hide: false, - searchable: true - }, - { - headerName: "CDN", - field: "cdn", - hide: false, - searchable: true - }, - { - headerName: "Domain", - field: "domainName", - hide: false, - searchable: true - }, - { - headerName: "Host", - field: "hostName", - hide: false, - searchable: true - }, - { - headerName: "HTTPS Port", - field: "httpsPort", - hide: true, - searchable: false, - filter: "agNumberColumnFilter" - }, - { - headerName: "ID", - field: "id", - hide: true, - searchable: true, - filter: "agNumberColumnFilter" - }, - { - headerName: "ILO IP Address", - field: "iloIpAddress", - hide: true, - searchable: true, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "ILO IP Gateway", - field: "iloIpGateway", - hide: true, - searchable: false, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "ILO IP Netmask", - field: "iloIpNetmask", - hide: true, - searchable: false - }, - { - headerName: "ILO Username", - field: "iloUsername", - hide: true, - searchable: false - }, - { - headerName: "Interface Name", - field: "interfaceName", - hide: true, - searchable: false - }, - { - headerName: "IPv6 Address", - field: "ipv6Address", - hide: false, - searchable: true - }, - { - headerName: "IPv6 Gateway", - field: "ipv6Gateway", - hide: true, - searchable: false - }, - { - headerName: "Last Updated", - field: "lastUpdated", - hide: true, - searchable: false, - filter: "agDateColumnFilter", - valueFormatter: dateCellFormatter - }, - { - headerName: "Mgmt IP Address", - field: "mgmtIpAddress", - hide: true, - searchable: false - }, - { - headerName: "Mgmt IP Gateway", - field: "mgmtIpGateway", - hide: true, - searchable: false, - filter: true, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "Mgmt IP Netmask", - field: "mgmtIpNetmask", - hide: true, - searchable: false, - filter: true, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "Network Gateway", - field: "ipGateway", - hide: true, - searchable: true, - filter: true, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "Network IP", - field: "ipAddress", - hide: false, - searchable: true, - filter: true, - cellRenderer: "sshCellRenderer", - onCellClicked: null - }, - { - headerName: "Network MTU", - field: "interfaceMtu", - hide: true, - searchable: false, - filter: "agNumberColumnFilter" - }, - { - headerName: "Network Subnet", - field: "ipNetmask", - hide: true, - searchable: false - }, - { - headerName: "Offline Reason", - field: "offlineReason", - hide: true, - searchable: false - }, - { - headerName: "Phys Location", - field: "physLocation", - hide: true, - searchable: true - }, - { - headerName: "Profile", - field: "profile", - hide: false, - searchable: true - }, - { - headerName: "Rack", - field: "rack", - hide: true, - searchable: false - }, - { - headerName: "Reval Pending", - field: "revalPending", - hide: true, - searchable: false, - filter: true, - cellRenderer: "updateCellRenderer" - }, - { - headerName: "Router Hostname", - field: "routerHostName", - hide: true, - searchable: false - }, - { - headerName: "Router Port Name", - field: "routerPortName", - hide: true, - searchable: false - }, - { - headerName: "Status", - field: "status", - hide: false, - searchable: true, - tooltip: offlineReasonTooltip - }, - { - headerName: "TCP Port", - field: "tcpPort", - hide: true, - searchable: false - }, - { - headerName: "Type", - field: "type", - hide: false, - searchable: true - }, - { - headerName: "Update Pending", - field: "updPending", - hide: false, - searchable: true, - filter: true, - cellRenderer: "updateCellRenderer" - } - ]; - - var getStatuses = function() { - statusService.getStatuses() - .then(function(result) { - $scope.statuses = result; - }); - }; - - var queueServerUpdates = function(server) { - serverService.queueServerUpdates(server.id) - .then( - function() { - $scope.refresh(); - } - ); - }; - - var clearServerUpdates = function(server) { - serverService.clearServerUpdates(server.id) - .then( - function() { - $scope.refresh(); - } - ); - }; - - var queueCDNServerUpdates = function(cdnId) { - cdnService.queueServerUpdates(cdnId) - .then( - function() { - $scope.refresh(); - } - ); - }; - - var clearCDNServerUpdates = function(cdnId) { - cdnService.clearServerUpdates(cdnId) - .then( - function() { - $scope.refresh(); - } - ); - }; - - var confirmDelete = function(server) { - var params = { - title: 'Delete Server: ' + server.hostName, - key: server.hostName - }; - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html', - controller: 'DialogDeleteController', - size: 'md', - resolve: { - params: function () { - return params; - } - } - }); - modalInstance.result.then(function() { - deleteServer(server); - }, function () { - // do nothing - }); - }; - - var deleteServer = function(server) { - serverService.deleteServer(server.id) - .then(function(result) { - messageModel.setMessages(result.alerts, false); - $scope.refresh(); - }); - }; - - var confirmStatusUpdate = function(server) { - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html', - controller: 'DialogSelectStatusController', - size: 'md', - resolve: { - server: function() { - return server; - }, - statuses: function() { - return $scope.statuses; - } - } - }); - modalInstance.result.then(function(status) { - updateStatus(status, server); - }, function () { - // do nothing - }); - }; - - var updateStatus = function(status, server) { - serverService.updateStatus(server.id, { status: status.id, offlineReason: status.offlineReason }) - .then( - function(result) { - messageModel.setMessages(result.data.alerts, false); - $scope.refresh(); - }, - function(fault) { - messageModel.setMessages(fault.data.alerts, false); - } - ); - }; - - console.time("server map"); - $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); - console.timeEnd("server map"); - - $scope.columns = []; - - $scope.gridOptions = { - components: { - sshCellRenderer: SSHCellRenderer, - updateCellRenderer: UpdateCellRenderer - }, - columnDefs: agColumns, - defaultColDef: { - filter: true, - onCellClicked: editServer, - sortable: true, - resizable: true - }, - rowData: servers, - pagination: true, - rowBuffer: 0, - onGridReady: function(params) { - params.api.sizeColumnsToFit(); - }, - menuTabs: 'columnsMenuTab', - tooltipShowDelay: 500 - }; - - $scope.contextMenuItems = [ - { - text: 'Open in New Tab', - click: function ($itemScope) { - $window.open('/#!/servers/' + $itemScope.s.id, '_blank'); - } - }, - null, // Divider - { - text: 'Navigate to Server FQDN', - click: function ($itemScope) { - $window.open('http://' + $itemScope.s.hostName + '.' + $itemScope.s.domainName, '_blank'); - } - }, - null, // Divider - { - text: 'Edit', - click: function ($itemScope) { - $scope.editServer($itemScope.s.id); - } - }, - { - text: 'Delete', - click: function ($itemScope) { - confirmDelete($itemScope.s); - } - }, - null, // Divider - { - text: 'Update Status', - click: function ($itemScope) { - confirmStatusUpdate($itemScope.s); - } - }, - { - text: 'Queue Server Updates', - displayed: function ($itemScope) { - return serverUtils.isCache($itemScope.s) && !$itemScope.s.updPending; - }, - click: function ($itemScope) { - queueServerUpdates($itemScope.s); - } - }, - { - text: 'Clear Server Updates', - displayed: function ($itemScope) { - return serverUtils.isCache($itemScope.s) && $itemScope.s.updPending; - }, - click: function ($itemScope) { - clearServerUpdates($itemScope.s); - } - }, - { - text: 'Show Charts', - displayed: function () { - return propertiesModel.properties.servers.charts.show; - }, - hasBottomDivider: function () { - return true; - }, - hasTopDivider: function () { - return true; - }, - click: function ($itemScope) { - $window.open(propertiesModel.properties.servers.charts.baseUrl + $itemScope.s.hostName, '_blank'); - } - }, - { - text: 'Manage Capabilities', - displayed: function ($itemScope) { - return serverUtils.isCache($itemScope.s); - }, - hasTopDivider: function () { - return true; - }, - click: function ($itemScope) { - locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/capabilities'); - } - }, - { - text: 'Manage Delivery Services', - displayed: function ($itemScope) { - return serverUtils.isEdge($itemScope.s) || serverUtils.isOrigin($itemScope.s); - }, - hasTopDivider: function ($itemScope) { - return !serverUtils.isCache($itemScope.s); - }, - click: function ($itemScope) { - locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/delivery-services'); - } - }, - { - text: 'View Config Files', - displayed: function ($itemScope) { - return serverUtils.isCache($itemScope.s); - }, - click: function ($itemScope) { - locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/config-files'); - } - } - ]; - - $scope.editServer = function(id) { - locationUtils.navigateToPath('/servers/' + id); - }; - - $scope.createServer = function() { - locationUtils.navigateToPath('/servers/new'); - }; - - $scope.confirmCDNQueueServerUpdates = function(cdn) { - var params; - if (cdn) { - params = { - title: 'Queue Server Updates: ' + cdn.name, - message: 'Are you sure you want to queue server updates for all ' + cdn.name + ' servers?' - }; - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', - controller: 'DialogConfirmController', - size: 'md', - resolve: { - params: function () { - return params; - } - } - }); - modalInstance.result.then(function() { - queueCDNServerUpdates(cdn.id); - }, function () { - // do nothing - }); - } else { - params = { - title: 'Queue Server Updates', - message: "Please select a CDN" - }; - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', - controller: 'DialogSelectController', - size: 'md', - resolve: { - params: function () { - return params; - }, - collection: function(cdnService) { - return cdnService.getCDNs(); - } - } - }); - modalInstance.result.then(function(cdn) { - queueCDNServerUpdates(cdn.id); - }, function () { - // do nothing - }); - } - }; - - $scope.confirmCDNClearServerUpdates = function(cdn) { - var params; - if (cdn) { - params = { - title: 'Clear Server Updates: ' + cdn.name, - message: 'Are you sure you want to clear server updates for all ' + cdn.name + ' servers?' - }; - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', - controller: 'DialogConfirmController', - size: 'md', - resolve: { - params: function () { - return params; - } - } - }); - modalInstance.result.then(function() { - clearCDNServerUpdates(cdn.id); - }, function () { - // do nothing - }); - - - } else { - params = { - title: 'Clear Server Updates', - message: "Please select a CDN" - }; - var modalInstance = $uibModal.open({ - templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', - controller: 'DialogSelectController', - size: 'md', - resolve: { - params: function () { - return params; - }, - collection: function(cdnService) { - return cdnService.getCDNs(); - } - } - }); - modalInstance.result.then(function(cdn) { - clearCDNServerUpdates(cdn.id); - }, function () { - // do nothing - }); - } - }; - - $scope.refresh = function() { - $state.reload(); // reloads all the resolves for the view - }; - - $scope.toggleVisibility = function(col) { - const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); - $scope.gridOptions.columnApi.setColumnVisible(col, !visible); - try { - colsVisible = $scope.gridOptions.columnApi.getAllColumns().map(function(x){return [x.colId, x.isVisible()]}); - localStorage.setItem("servers_table_columns", JSON.stringify(colsVisible)); - } catch (e) { - console.error("Failed to store column defs to local storage:", e); - } - $scope.gridOptions.api.sizeColumnsToFit(); - }; - - $scope.ssh = serverUtils.ssh; - - $scope.isOffline = serverUtils.isOffline; - - $scope.offlineReason = serverUtils.offlineReason; - - $scope.getRelativeTime = dateUtils.getRelativeTime; - - $scope.navigateToPath = locationUtils.navigateToPath; - - var init = function () { - getStatuses(); - }; - init(); - - angular.element(document).ready(function () { - try { - // need to create the show/hide column checkboxes and bind to the current visibility - // TODO: figure out how to do this with getColumnState and setColumnState. - const colstates = JSON.parse(localStorage.getItem("servers_table_columns")); - if (colstates) { - for (let i = 0; i Date: Tue, 9 Jun 2020 11:04:57 -0600 Subject: [PATCH 05/27] Started setting up context menu support --- .../table/servers/TableServersController.js | 21 ++++++++++++++----- .../table/servers/table.servers.tpl.html | 5 +++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index c5b60b48e0..d833306162 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -17,7 +17,6 @@ * under the License. */ - var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel) { // browserify can't handle classes... @@ -391,13 +390,11 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - console.time("server map"); $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); - console.timeEnd("server map"); $scope.columns = []; - let menu = false; + $scope.serverlink = "/#!/servers/"; $scope.gridOptions = { components: { @@ -421,7 +418,14 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo tooltipShowDelay: 500, getContextMenuItems: getContextMenu, allowContextMenuWithControlKey: true, - preventDefaultContextMenu: true + preventDefaultOnContextMenu: true, + onCellContextMenu: function(params) { + params.event.preventDefault(); + console.log(params); + $scope.showMenu = true; + $scope.serverlink = "/#!/servers/" + String(params.data.id); + $scope.$apply(); + } }; function getContextMenu(params) { @@ -502,6 +506,13 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ]; } + $scope.menuStyle = { + left: 0, + top: 0, + }; + + $scope.showMenu = false; + $scope.createServer = function() { locationUtils.navigateToPath('/servers/new'); }; diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 9333a1b672..6e39c06bfd 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -53,5 +53,10 @@
    + + +
    From e7b993ba8486bb5d03394de57335da3bc5715396 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 12:16:46 -0600 Subject: [PATCH 06/27] Added some context menu functionality, fixed some styling --- .../table/servers/TableServersController.js | 18 ++++++++++++++++-- .../table/servers/table.servers.tpl.html | 18 ++++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index d833306162..bf57ebc002 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -17,7 +17,7 @@ * under the License. */ -var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel) { +var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel, $document) { // browserify can't handle classes... function SSHCellRenderer() {} @@ -395,6 +395,9 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.columns = []; $scope.serverlink = "/#!/servers/"; + $scope.hostname = ""; + $scope.domain = ""; + $scope.serverID = -1; $scope.gridOptions = { components: { @@ -423,7 +426,12 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo params.event.preventDefault(); console.log(params); $scope.showMenu = true; + $scope.menuStyle.left = String(params.event.pageX) + "px"; + $scope.menuStyle.top = String(params.event.pageY) + "px"; $scope.serverlink = "/#!/servers/" + String(params.data.id); + $scope.hostname = params.data.hostName; + $scope.domain = params.data.domainName; + $scope.serverID = params.data.id; $scope.$apply(); } }; @@ -659,7 +667,13 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } }); + $document.bind("click", function(e) { + $scope.showMenu = false; + e.stopPropagation(); + $scope.$apply(); + }); + }; -TableServersController.$inject = ['servers', '$scope', '$state', '$uibModal', '$window', 'dateUtils', 'locationUtils', 'serverUtils', 'cdnService', 'serverService', 'statusService', 'propertiesModel', 'messageModel', "userModel"]; +TableServersController.$inject = ['servers', '$scope', '$state', '$uibModal', '$window', 'dateUtils', 'locationUtils', 'serverUtils', 'cdnService', 'serverService', 'statusService', 'propertiesModel', 'messageModel', "userModel", "$document"]; module.exports = TableServersController; diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 6e39c06bfd..d1ccf3991b 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -16,6 +16,12 @@ specific language governing permissions and limitations under the License. --> +
    @@ -52,10 +58,14 @@
    From 73934aa8855d0b0259d02b94caee884e47bf20e4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 14:07:11 -0600 Subject: [PATCH 07/27] Put styling in the stylesheet; added server delete to context menu --- .../app/src/common/modules/table/_table.scss | 49 +++++++++++++++++++ .../table/servers/TableServersController.js | 44 +++++++++-------- .../table/servers/table.servers.tpl.html | 29 ++++++----- 3 files changed, 88 insertions(+), 34 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss index 1c39b488a3..4cbd72ab2d 100644 --- a/traffic_portal/app/src/common/modules/table/_table.scss +++ b/traffic_portal/app/src/common/modules/table/_table.scss @@ -107,3 +107,52 @@ th.center, td.center { .dt-button.btn-link { text-decoration: underline; } + +/* Table context menus */ +menu[type="contextmenu"] { + display: block; + position: fixed; + background-color: white; + padding: 0; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + border-radius: 3px; + + ul { + display: block; + clear: both; + font-weight: normal; + line-height: 1.428571429; + white-space: nowrap; + padding: 0; + margin: 0; + + li { + display: block; + clear: both; + + &:hover { + color: #262626; + background-color: #f5f5f5; + } + + a, button { + color: #333333; + text-decoration: none; + padding: 7px 20px; + display: block; + clear: both; + } + + button { + background: transparent; + border: none; + width: 100%; + text-align: left; + } + } + + hr.divider { + margin: 0; + } + } +} diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index bf57ebc002..a7c30f9f3e 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -326,12 +326,14 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - var confirmDelete = function(server) { - var params = { - title: 'Delete Server: ' + server.hostName, - key: server.hostName + $scope.confirmDelete = function(event) { + event.stopPropagation(); + + const params = { + title: 'Delete Server: ' + $scope.server.hostName, + key: $scope.server.hostName }; - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html', controller: 'DialogDeleteController', size: 'md', @@ -341,19 +343,20 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } } }); - modalInstance.result.then(function() { - deleteServer(server); - }, function () { - // do nothing - }); - }; - - var deleteServer = function(server) { - serverService.deleteServer(server.id) - .then(function(result) { - messageModel.setMessages(result.alerts, false); - $scope.refresh(); - }); + modalInstance.result.then( + function() { + serverService.deleteServer($scope.server.id).then( + function(result) { + messageModel.setMessages(result.alerts, false); + $scope.refresh(); + } + ); + }, + function (err) { + // TODO: use template strings once the build can handle them. + console.error("Error deleting server", $scope.hostname + "." + $scope.domain, "(#" + String($scope.serverID) + "):", err); + } + ); }; var confirmStatusUpdate = function(server) { @@ -395,6 +398,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.columns = []; $scope.serverlink = "/#!/servers/"; + $scope.server = null; $scope.hostname = ""; $scope.domain = ""; $scope.serverID = -1; @@ -429,9 +433,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.menuStyle.left = String(params.event.pageX) + "px"; $scope.menuStyle.top = String(params.event.pageY) + "px"; $scope.serverlink = "/#!/servers/" + String(params.data.id); - $scope.hostname = params.data.hostName; - $scope.domain = params.data.domainName; - $scope.serverID = params.data.id; + $scope.server = params.data; $scope.$apply(); } }; diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index d1ccf3991b..e5052abfa0 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -16,12 +16,6 @@ specific language governing permissions and limitations under the License. --> -
    @@ -59,13 +53,22 @@
    From 666cb54792af79d294f89a7973c3bbea1bcc59d8 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 14:08:33 -0600 Subject: [PATCH 08/27] Moved menu outside of panel --- .../table/servers/table.servers.tpl.html | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index e5052abfa0..71da4e0bcc 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -53,23 +53,24 @@
    - - -
    + + + + From 93c980528a75fcaa481dd769f79f66d0c826bfec Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 14:31:14 -0600 Subject: [PATCH 09/27] Added server status update to context menu --- .../table/servers/TableServersController.js | 84 +++++++++++-------- .../table/servers/table.servers.tpl.html | 9 +- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index a7c30f9f3e..aa21fda219 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -18,6 +18,7 @@ */ var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel, $document) { + let statuses = []; // browserify can't handle classes... function SSHCellRenderer() {} @@ -54,8 +55,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo return dateUtils.getRelativeTime(params.value); } - let serversTable; - function editServer(params) { locationUtils.navigateToPath('/servers/' + params.data.id); // Event is outside the digest cycle, so we need this to trigger one. @@ -284,10 +283,11 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ]; var getStatuses = function() { - statusService.getStatuses() - .then(function(result) { - $scope.statuses = result; - }); + statusService.getStatuses().then( + function(result) { + statuses = result; + } + ); }; var queueServerUpdates = function(server) { @@ -326,12 +326,12 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - $scope.confirmDelete = function(event) { + $scope.confirmDelete = function(server, event) { event.stopPropagation(); const params = { - title: 'Delete Server: ' + $scope.server.hostName, - key: $scope.server.hostName + title: 'Delete Server: ' + server.hostName, + key: server.hostName }; const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html', @@ -345,21 +345,49 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo }); modalInstance.result.then( function() { - serverService.deleteServer($scope.server.id).then( + serverService.deleteServer(server.id).then( function(result) { messageModel.setMessages(result.alerts, false); $scope.refresh(); + }, + function(err) { + // TODO: use template strings once the build can handle them. + console.error("Error deleting server", server.hostName + "." + server.domainName, "(#" + String(server.id) + "):", err); } ); }, - function (err) { - // TODO: use template strings once the build can handle them. - console.error("Error deleting server", $scope.hostname + "." + $scope.domain, "(#" + String($scope.serverID) + "):", err); + function() { + // This is just a cancel event from closing the dialog, do nothing. + } + ); + }; + + /** + * updateStatus sets the status of the given server to the given status value. + * + * @param {{id: number, offlineReason?: string}} status The numeric ID of the status to set along with a reason why it was set offline, if applicable. + * @param {{id: number}} server The server (or at least its numeric ID) which will have its status set. + */ + function updateStatus(status, server) { + const params = { + status: status.id, + offlineReason: status.offlineReason + }; + + serverService.updateStatus(server.id, params).then( + function(result) { + messageModel.setMessages(result.data.alerts, false); + $scope.refresh(); + }, + function(fault) { + messageModel.setMessages(fault.data.alerts, false); } ); }; - var confirmStatusUpdate = function(server) { + $scope.confirmStatusUpdate = function(server, event) { + event.stopPropagation(); + var modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html', controller: 'DialogSelectStatusController', @@ -369,28 +397,18 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo return server; }, statuses: function() { - return $scope.statuses; + return statuses; } } }); - modalInstance.result.then(function(status) { - updateStatus(status, server); - }, function () { - // do nothing - }); - }; - - var updateStatus = function(status, server) { - serverService.updateStatus(server.id, { status: status.id, offlineReason: status.offlineReason }) - .then( - function(result) { - messageModel.setMessages(result.data.alerts, false); - $scope.refresh(); - }, - function(fault) { - messageModel.setMessages(fault.data.alerts, false); - } - ); + modalInstance.result.then( + function(status) { + updateStatus(status, server); + }, + function () { + // this is just a cancel event from closing the dialog, do nothing + } + ); }; $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 71da4e0bcc..7bc6aa0ac0 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -69,8 +69,13 @@
  • Edit
  • -
  • - +
  • +
  • +
    +
  • + +
  • + From ba6127bbee23601a9f021b244f94d43bd4fa7af5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 14:42:55 -0600 Subject: [PATCH 10/27] Added queue updates to context menu --- .../table/servers/TableServersController.js | 14 +++++++------- .../table/servers/table.servers.tpl.html | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index aa21fda219..ab36c3fe16 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -290,13 +290,9 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - var queueServerUpdates = function(server) { - serverService.queueServerUpdates(server.id) - .then( - function() { - $scope.refresh(); - } - ); + $scope.queueServerUpdates = function(server, event) { + event.stopPropagation(); + serverService.queueServerUpdates(server.id).then($scope.refresh); }; var clearServerUpdates = function(server) { @@ -534,6 +530,10 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ]; } + $scope.isCache = serverUtils.isCache; + $scope.isEdge = serverUtils.isEdge; + $scope.isOrigin = serverUtils.isOrigin; + $scope.menuStyle = { left: 0, top: 0, diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 7bc6aa0ac0..3aa0fd7b5c 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -76,6 +76,22 @@
  • - +
  • + +
  • +
  • + +
  • +
    +
  • + Show Charts +
  • +
    +
  • + Manage Capabilities +
  • +
  • + Manage Delivery Services +
  • From 7d17b6857d5b2938b2b031c0823b0b254905ec1b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 14:49:26 -0600 Subject: [PATCH 11/27] Added clear updates to context menu; added disabled menuitem styling --- .../app/src/common/modules/table/_table.scss | 5 +++++ .../modules/table/servers/TableServersController.js | 10 +++------- .../modules/table/servers/table.servers.tpl.html | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss index 4cbd72ab2d..18fad54b19 100644 --- a/traffic_portal/app/src/common/modules/table/_table.scss +++ b/traffic_portal/app/src/common/modules/table/_table.scss @@ -148,6 +148,11 @@ menu[type="contextmenu"] { border: none; width: 100%; text-align: left; + + &[disabled] { + color: gray; + background-color: #f5f5f5; + } } } diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index ab36c3fe16..2729baf4c1 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -295,13 +295,9 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo serverService.queueServerUpdates(server.id).then($scope.refresh); }; - var clearServerUpdates = function(server) { - serverService.clearServerUpdates(server.id) - .then( - function() { - $scope.refresh(); - } - ); + $scope.clearServerUpdates = function(server, event) { + event.stopPropagation(); + serverService.clearServerUpdates(server.id).then($scope.refresh); }; var queueCDNServerUpdates = function(cdnId) { diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 3aa0fd7b5c..97cf1ff90f 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -80,7 +80,7 @@
  • - +

  • From 5eafc48a71fff4c88962acecd7cf44020b899bca Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 15:03:33 -0600 Subject: [PATCH 12/27] Fixed a type error, finished context menu --- .../table/servers/TableServersController.js | 14 ++++++++------ .../modules/table/servers/table.servers.tpl.html | 14 +++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 2729baf4c1..527cc9492f 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -407,11 +407,12 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.columns = []; - $scope.serverlink = "/#!/servers/"; - $scope.server = null; - $scope.hostname = ""; - $scope.domain = ""; - $scope.serverID = -1; + $scope.chartsBase = propertiesModel.properties.servers.charts.baseUrl; + $scope.server = { + hostName: "", + domainName: "", + id: -1 + }; $scope.gridOptions = { components: { @@ -442,8 +443,8 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.showMenu = true; $scope.menuStyle.left = String(params.event.pageX) + "px"; $scope.menuStyle.top = String(params.event.pageY) + "px"; - $scope.serverlink = "/#!/servers/" + String(params.data.id); $scope.server = params.data; + $scope.chartslink = propertiesModel.properties.servers.charts.baseUrl + params.data.hostName; $scope.$apply(); } }; @@ -529,6 +530,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.isCache = serverUtils.isCache; $scope.isEdge = serverUtils.isEdge; $scope.isOrigin = serverUtils.isOrigin; + $scope.showCharts = propertiesModel.properties.servers.charts.show; $scope.menuStyle = { left: 0, diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 97cf1ff90f..30178dace5 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -59,7 +59,7 @@ From 4d80a941325f47c6197550934334d5ae356be986 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 16:26:25 -0600 Subject: [PATCH 13/27] Removed unused things, general clean-up and re-organization --- .../table/servers/TableServersController.js | 343 +++++++----------- .../table/servers/table.servers.tpl.html | 8 +- 2 files changed, 133 insertions(+), 218 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 527cc9492f..94758f728b 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -18,7 +18,7 @@ */ var TableServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel, userModel, $document) { - let statuses = []; + /**** Table cell formatters/renderers ****/ // browserify can't handle classes... function SSHCellRenderer() {} @@ -44,6 +44,10 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } UpdateCellRenderer.prototype.getGui = function() {return this.eGui;}; + /** + * Gets text with which to file a status tooltip. + * @returns {string | undefined} The offline reason if the server is offline, otherwise nothing. + */ function offlineReasonTooltip(params) { if (!params.value || !serverUtils.isOffline(params.value)) { return; @@ -51,17 +55,18 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo return params.data.offlineReason; } + /** + * Formats the contents of a 'lastUpdated' column cell as "relative to now". + */ function dateCellFormatter(params) { return dateUtils.getRelativeTime(params.value); } - function editServer(params) { - locationUtils.navigateToPath('/servers/' + params.data.id); - // Event is outside the digest cycle, so we need this to trigger one. - $scope.$apply(); - } - const agColumns = [ + /**** Constants, scope data, etc. ****/ + + /** The columns of the ag-grid table */ + const columns = [ { headerName: "Cache Group", field: "cachegroup", @@ -282,14 +287,101 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } ]; - var getStatuses = function() { - statusService.getStatuses().then( - function(result) { - statuses = result; - } - ); + /** All of the statuses (populated on init). */ + let statuses = []; + + /** All of the servers - lastUpdated fields converted to actual Dates. */ + $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); + + /** The base URL to use for constructing links to server charts. */ + $scope.chartsBase = propertiesModel.properties.servers.charts.baseUrl; + + /** The currently selected server - at the moment only used by the context menu */ + $scope.server = { + hostName: "", + domainName: "", + id: -1 + }; + + /** Options, configuration, data and callbacks for the ag-grid table. */ + $scope.gridOptions = { + components: { + sshCellRenderer: SSHCellRenderer, + updateCellRenderer: UpdateCellRenderer + }, + columnDefs: columns, + defaultColDef: { + filter: true, + onCellClicked: function(params) { + locationUtils.navigateToPath('/servers/' + params.data.id); + // Event is outside the digest cycle, so we need to trigger one. + $scope.$apply(); + }, + sortable: true, + resizable: true + }, + rowData: servers, + pagination: true, + rowBuffer: 0, + onGridReady: function(params) { + params.api.sizeColumnsToFit(); + }, + menuTabs: 'columnsMenuTab', + tooltipShowDelay: 500, + allowContextMenuWithControlKey: true, + preventDefaultOnContextMenu: true, + onCellContextMenu: function(params) { + params.event.preventDefault(); + console.log(params); + $scope.showMenu = true; + $scope.menuStyle.left = String(params.event.pageX) + "px"; + $scope.menuStyle.top = String(params.event.pageY) + "px"; + $scope.server = params.data; + $scope.$apply(); + } + }; + + /** These three functions are used by the context menu to determine what functionality to provide for a server. */ + $scope.isCache = serverUtils.isCache; + $scope.isEdge = serverUtils.isEdge; + $scope.isOrigin = serverUtils.isOrigin; + + /** Used by the context menu to determine whether or not to include links to server charts. */ + $scope.showCharts = propertiesModel.properties.servers.charts.show; + + /** This is used to position the context menu under the cursor. */ + $scope.menuStyle = { + left: 0, + top: 0, + }; + + /** Controls whether or not the context menu is visible. */ + $scope.showMenu = false; + + + /**** Miscellaneous scope functions ****/ + + /** Reloads all 'resolve'd data for the view. */ + $scope.refresh = function() { + $state.reload(); + }; + + /** Toggles the visibility of a column that has the ID provided as 'col'. */ + $scope.toggleVisibility = function(col) { + const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); + $scope.gridOptions.columnApi.setColumnVisible(col, !visible); + try { + colsVisible = $scope.gridOptions.columnApi.getAllColumns().map(function(x){return [x.colId, x.isVisible()]}); + localStorage.setItem("servers_table_columns", JSON.stringify(colsVisible)); + } catch (e) { + console.error("Failed to store column defs to local storage:", e); + } + $scope.gridOptions.api.sizeColumnsToFit(); }; + + /**** Context menu functions ****/ + $scope.queueServerUpdates = function(server, event) { event.stopPropagation(); serverService.queueServerUpdates(server.id).then($scope.refresh); @@ -300,24 +392,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo serverService.clearServerUpdates(server.id).then($scope.refresh); }; - var queueCDNServerUpdates = function(cdnId) { - cdnService.queueServerUpdates(cdnId) - .then( - function() { - $scope.refresh(); - } - ); - }; - - var clearCDNServerUpdates = function(cdnId) { - cdnService.clearServerUpdates(cdnId) - .then( - function() { - $scope.refresh(); - } - ); - }; - $scope.confirmDelete = function(server, event) { event.stopPropagation(); @@ -403,154 +477,14 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo ); }; - $scope.servers = servers.map(function(x){x.lastUpdated = x.lastUpdated ? new Date(x.lastUpdated.replace("+00", "Z")) : x.lastUpdated;}); - - $scope.columns = []; - - $scope.chartsBase = propertiesModel.properties.servers.charts.baseUrl; - $scope.server = { - hostName: "", - domainName: "", - id: -1 - }; - - $scope.gridOptions = { - components: { - sshCellRenderer: SSHCellRenderer, - updateCellRenderer: UpdateCellRenderer - }, - columnDefs: agColumns, - defaultColDef: { - filter: true, - onCellClicked: editServer, - sortable: true, - resizable: true - }, - rowData: servers, - pagination: true, - rowBuffer: 0, - onGridReady: function(params) { - params.api.sizeColumnsToFit(); - }, - menuTabs: 'columnsMenuTab', - tooltipShowDelay: 500, - getContextMenuItems: getContextMenu, - allowContextMenuWithControlKey: true, - preventDefaultOnContextMenu: true, - onCellContextMenu: function(params) { - params.event.preventDefault(); - console.log(params); - $scope.showMenu = true; - $scope.menuStyle.left = String(params.event.pageX) + "px"; - $scope.menuStyle.top = String(params.event.pageY) + "px"; - $scope.server = params.data; - $scope.chartslink = propertiesModel.properties.servers.charts.baseUrl + params.data.hostName; - $scope.$apply(); - } - }; - - function getContextMenu(params) { - const serverID = params.node.data.id; - const hostname = params.node.data.hostName; - const domainName = params.node.data.domainName; - return [ - { - name: "Open in New Tab", - action: function () { - $window.open("/#!/servers/" + String(serverID), "_blank"); - } - }, - "separator", - { - name: "Navigate to Server FQDN", - action: function () { - $window.open("http://" + hostname + "." + $itemScope.s.domainName, "_blank"); - } - }, - "separator", - { - name: "Edit", - action: function () { - editServer(params.node); - } - }, - { - name: "Delete", - action: function () { - confirmDelete(params.node.data); - } - }, - "separator", - { - name: "Update Status", - action: function () { - confirmStatusUpdate(params.node.data); - } - }, - { - name: "Queue Server Updates", - disabled: !serverUtils.isCache(params.node.data) || node.data.updPending, - action: function () { - queueServerUpdates(params.node.data); - } - }, - { - name: "Clear Server Updates", - disabled: !serverUtils.isCache(params.node.data) || !node.data.updPending, - action: function () { - clearServerUpdates(params.node.data); - } - }, - "separator", - { - name: "Show Charts", - disabled: !propertiesModel.properties.servers.charts.show, - action: function () { - $window.open(propertiesModel.properties.servers.charts.baseUrl + hostname, "_blank"); - } - }, - "separator", - { - name: "Manage Capabilities", - disabled: !serverUtils.isCache($itemScope.s), - action: function () { - locationUtils.navigateToPath("/servers/" + String(serverID) + "/capabilities"); - } - }, - { - name: "Manage Delivery Services", - disabled: !serverUtils.isEdge(params.node.data) && serverUtils.isOrigin(params.node.data), - action: function () { - locationUtils.navigateToPath("/servers/" + String(serverID) + "/delivery-services"); - } - } - ]; - } - - $scope.isCache = serverUtils.isCache; - $scope.isEdge = serverUtils.isEdge; - $scope.isOrigin = serverUtils.isOrigin; - $scope.showCharts = propertiesModel.properties.servers.charts.show; - - $scope.menuStyle = { - left: 0, - top: 0, - }; - - $scope.showMenu = false; - - $scope.createServer = function() { - locationUtils.navigateToPath('/servers/new'); - }; - $scope.confirmCDNQueueServerUpdates = function(cdn) { - var params; + let params; if (cdn) { params = { title: 'Queue Server Updates: ' + cdn.name, message: 'Are you sure you want to queue server updates for all ' + cdn.name + ' servers?' }; - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', controller: 'DialogConfirmController', size: 'md', @@ -561,16 +495,16 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } }); modalInstance.result.then(function() { - queueCDNServerUpdates(cdn.id); + cdnService.queueServerUpdates(cdn.id).then($scope.refresh); }, function () { - // do nothing + // this is just a cancel event from closing the dialog, do nothing }); } else { params = { title: 'Queue Server Updates', message: "Please select a CDN" }; - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', controller: 'DialogSelectController', size: 'md', @@ -584,7 +518,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } }); modalInstance.result.then(function(cdn) { - queueCDNServerUpdates(cdn.id); + cdnService.queueServerUpdates(cdn.id).then($scope.refresh); }, function () { // do nothing }); @@ -592,13 +526,13 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo }; $scope.confirmCDNClearServerUpdates = function(cdn) { - var params; + let params; if (cdn) { params = { title: 'Clear Server Updates: ' + cdn.name, message: 'Are you sure you want to clear server updates for all ' + cdn.name + ' servers?' }; - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', controller: 'DialogConfirmController', size: 'md', @@ -609,7 +543,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } }); modalInstance.result.then(function() { - clearCDNServerUpdates(cdn.id); + cdnService.clearServerUpdates(cdn.id).then($scope.refresh); }, function () { // do nothing }); @@ -620,7 +554,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo title: 'Clear Server Updates', message: "Please select a CDN" }; - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', controller: 'DialogSelectController', size: 'md', @@ -634,40 +568,15 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } }); modalInstance.result.then(function(cdn) { - clearCDNServerUpdates(cdn.id); + cdnService.clearServerUpdates(cdn.id).then($scope.refresh); }, function () { // do nothing }); } }; - $scope.refresh = function() { - $state.reload(); // reloads all the resolves for the view - }; - - $scope.toggleVisibility = function(col) { - const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); - $scope.gridOptions.columnApi.setColumnVisible(col, !visible); - try { - colsVisible = $scope.gridOptions.columnApi.getAllColumns().map(function(x){return [x.colId, x.isVisible()]}); - localStorage.setItem("servers_table_columns", JSON.stringify(colsVisible)); - } catch (e) { - console.error("Failed to store column defs to local storage:", e); - } - $scope.gridOptions.api.sizeColumnsToFit(); - }; - - $scope.isOffline = serverUtils.isOffline; - - $scope.offlineReason = serverUtils.offlineReason; - - $scope.getRelativeTime = dateUtils.getRelativeTime; - - var init = function () { - getStatuses(); - }; - init(); + /**** Initialization code, including loading user columns from localstorage ****/ angular.element(document).ready(function () { try { // need to create the show/hide column checkboxes and bind to the current visibility @@ -683,14 +592,20 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo } catch (e) { console.error("Failure to retrieve required column info from localStorage (key=servers_table_columns):", e); } - }); - $document.bind("click", function(e) { - $scope.showMenu = false; - e.stopPropagation(); - $scope.$apply(); - }); + // clicks outside the context menu will hide it + $document.bind("click", function(e) { + $scope.showMenu = false; + e.stopPropagation(); + $scope.$apply(); + }); + statusService.getStatuses().then( + function(result) { + statuses = result; + } + ); + }); }; TableServersController.$inject = ['servers', '$scope', '$state', '$uibModal', '$window', 'dateUtils', 'locationUtils', 'serverUtils', 'cdnService', 'serverService', 'statusService', 'propertiesModel', 'messageModel', "userModel", "$document"]; diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 30178dace5..13c1969e7f 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -23,7 +23,7 @@
  • Servers
  • - +
    @@ -88,7 +88,7 @@
  • - Manage Capabilities + Manage Capabilities
  • Manage Delivery Services From a6aaaac47e875e46eeae5560100a9f7fdb7af95a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 16:55:09 -0600 Subject: [PATCH 14/27] added CSV export --- .../app/src/common/modules/table/_table.scss | 17 +++++++++++++++++ .../table/servers/TableServersController.js | 11 +++++++++++ .../table/servers/table.servers.tpl.html | 1 + 3 files changed, 29 insertions(+) diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss index 18fad54b19..299798e5b4 100644 --- a/traffic_portal/app/src/common/modules/table/_table.scss +++ b/traffic_portal/app/src/common/modules/table/_table.scss @@ -161,3 +161,20 @@ menu[type="contextmenu"] { } } } + +button.menu-item-button { + color: #333333; + width: 100%; + background: transparent; + border: none; + text-align: inherit; + display: block; + clear: both; + padding: 3px 20px; + margin: 0; + + &:hover { + color: #262626; + background-color: #f5f5f5; + } +} diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 94758f728b..de0a8c4727 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -379,6 +379,17 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.gridOptions.api.sizeColumnsToFit(); }; + /** Downloads the table as a CSV */ + $scope.exportCSV = function() { + // TODO: figure out how to reconcile clicking on a server taking you to it + // with row selection exports. + const params = { + allColumns: true, + fileName: "servers.csv", + }; + $scope.gridOptions.api.exportDataAsCsv(params); + } + /**** Context menu functions ****/ diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 13c1969e7f..97a8d31d35 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -46,6 +46,7 @@
  • From 936d5e9312116cb877e4cd39ef203c53e2e42f44 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 17:56:23 -0600 Subject: [PATCH 15/27] Rolled back changes to source of AngularJS --- traffic_portal/grunt/browserify2.js | 7 +------ traffic_portal/package-lock.json | 5 ----- traffic_portal/package.json | 3 +-- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js index 8ba0118c10..00fa7a816a 100644 --- a/traffic_portal/grunt/browserify2.js +++ b/traffic_portal/grunt/browserify2.js @@ -94,7 +94,7 @@ module.exports = { cwd: '<%= globalConfig.app %>/bower_components/', src: [ - // 'angular/angular.js', + 'angular/angular.js', 'angular-animate/angular-animate.js', 'angular-bootstrap-contextmenu/contextMenu.js', 'angular-bootstrap/ui-bootstrap.js', @@ -111,11 +111,6 @@ module.exports = { 'json3/lib/json3.js' ] }, - { - cwd: "<%= globalConfig.importdir %>", - src: ["angular/angular.min.js"], - rename: function() {return "angular/angular.js";} - }, { cwd: '<%= globalConfig.app %>/bower_components/', src: [ 'flot/jquery.flot.js' ], diff --git a/traffic_portal/package-lock.json b/traffic_portal/package-lock.json index 048636d9dd..982bfbe466 100644 --- a/traffic_portal/package-lock.json +++ b/traffic_portal/package-lock.json @@ -118,11 +118,6 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "angular": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.0.tgz", - "integrity": "sha512-VdaMx+Qk0Skla7B5gw77a8hzlcOakwF8mjlW13DpIWIDlfqwAbSSLfd8N/qZnzEmQF4jC4iofInd3gE7vL8ZZg==" - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", diff --git a/traffic_portal/package.json b/traffic_portal/package.json index 711c793f11..30d68768ca 100644 --- a/traffic_portal/package.json +++ b/traffic_portal/package.json @@ -32,7 +32,6 @@ "time-grunt": "1.3.0" }, "dependencies": { - "ag-grid-community": "^23.2.0", - "angular": "^1.8.0" + "ag-grid-community": "^23.2.0" } } From 6893f851f35c19f445915610050ecd9f3d35cda3 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 18:23:39 -0600 Subject: [PATCH 16/27] Fixed menuitem button styling --- traffic_portal/app/src/common/modules/table/_table.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss index 299798e5b4..e6a28683e8 100644 --- a/traffic_portal/app/src/common/modules/table/_table.scss +++ b/traffic_portal/app/src/common/modules/table/_table.scss @@ -162,7 +162,7 @@ menu[type="contextmenu"] { } } -button.menu-item-button { +div.dropdown button.menu-item-button { color: #333333; width: 100%; background: transparent; From 8982d00990c525524895a4357a51e28b4f17eefb Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 9 Jun 2020 19:22:46 -0600 Subject: [PATCH 17/27] table now saves sort, filter, and column state --- .../table/servers/TableServersController.js | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index de0a8c4727..e7b46674d5 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -331,14 +331,13 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo allowContextMenuWithControlKey: true, preventDefaultOnContextMenu: true, onCellContextMenu: function(params) { - params.event.preventDefault(); - console.log(params); $scope.showMenu = true; $scope.menuStyle.left = String(params.event.pageX) + "px"; $scope.menuStyle.top = String(params.event.pageY) + "px"; $scope.server = params.data; $scope.$apply(); - } + }, + colResizeDefault: "shift" }; /** These three functions are used by the context menu to determine what functionality to provide for a server. */ @@ -371,8 +370,8 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); $scope.gridOptions.columnApi.setColumnVisible(col, !visible); try { - colsVisible = $scope.gridOptions.columnApi.getAllColumns().map(function(x){return [x.colId, x.isVisible()]}); - localStorage.setItem("servers_table_columns", JSON.stringify(colsVisible)); + colStates = $scope.gridOptions.columnApi.getColumnState(); + localStorage.setItem("servers_table_columns", JSON.stringify(colStates)); } catch (e) { console.error("Failed to store column defs to local storage:", e); } @@ -591,19 +590,44 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo angular.element(document).ready(function () { try { // need to create the show/hide column checkboxes and bind to the current visibility - // TODO: figure out how to do this with getColumnState and setColumnState. const colstates = JSON.parse(localStorage.getItem("servers_table_columns")); - if (colstates) { - for (let i = 0; i Date: Tue, 9 Jun 2020 19:50:54 -0600 Subject: [PATCH 18/27] table now saves column sizes --- .../table/servers/TableServersController.js | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index e7b46674d5..d6febb1ab0 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -323,8 +323,8 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo rowData: servers, pagination: true, rowBuffer: 0, - onGridReady: function(params) { - params.api.sizeColumnsToFit(); + onColumnResized: function(params) { + localStorage.setItem("servers_table_columns", JSON.stringify($scope.gridOptions.columnApi.getColumnState())); }, menuTabs: 'columnsMenuTab', tooltipShowDelay: 500, @@ -369,13 +369,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.toggleVisibility = function(col) { const visible = $scope.gridOptions.columnApi.getColumn(col).isVisible(); $scope.gridOptions.columnApi.setColumnVisible(col, !visible); - try { - colStates = $scope.gridOptions.columnApi.getColumnState(); - localStorage.setItem("servers_table_columns", JSON.stringify(colStates)); - } catch (e) { - console.error("Failed to store column defs to local storage:", e); - } - $scope.gridOptions.api.sizeColumnsToFit(); }; /** Downloads the table as a CSV */ @@ -591,8 +584,12 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo try { // need to create the show/hide column checkboxes and bind to the current visibility const colstates = JSON.parse(localStorage.getItem("servers_table_columns")); - if (!$scope.gridOptions.columnApi.setColumnState(colstates)) { - console.error("Failed to load stored column state: one or more columns not found"); + if (colstates) { + if (!$scope.gridOptions.columnApi.setColumnState(colstates)) { + console.error("Failed to load stored column state: one or more columns not found"); + } + } else { + $scope.gridOptions.api.sizeColumnsToFit(); } } catch (e) { console.error("Failure to retrieve required column info from localStorage (key=servers_table_columns):", e); @@ -620,12 +617,18 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo localStorage.setItem("servers_table_sort", JSON.stringify($scope.gridOptions.api.getSortModel())); }); - $scope.gridOptions.api.addEventListener("columnResized", function() { + $scope.gridOptions.api.addEventListener("columnMoved", function() { localStorage.setItem("servers_table_columns", JSON.stringify($scope.gridOptions.columnApi.getColumnState())); }); - $scope.gridOptions.api.addEventListener("columnMoved", function() { - localStorage.setItem("servers_table_columns", JSON.stringify($scope.gridOptions.columnApi.getColumnState())); + $scope.gridOptions.api.addEventListener("columnVisible", function() { + $scope.gridOptions.api.sizeColumnsToFit(); + try { + colStates = $scope.gridOptions.columnApi.getColumnState(); + localStorage.setItem("servers_table_columns", JSON.stringify(colStates)); + } catch (e) { + console.error("Failed to store column defs to local storage:", e); + } }); // clicks outside the context menu will hide it From e3df429cd65144df9bc9be35c6f08051596d57cb Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 10 Jun 2020 16:56:48 -0600 Subject: [PATCH 19/27] Rolled back inneffectual browserify changes --- traffic_portal/grunt/browserify2.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js index 00fa7a816a..9f77bb84fe 100644 --- a/traffic_portal/grunt/browserify2.js +++ b/traffic_portal/grunt/browserify2.js @@ -24,11 +24,6 @@ module.exports = { options: { expose: { files: [ - { - cwd: "<%= globalConfig.importdir %>", - src: ["ag-grid-community/dist/ag-grid-community.min.js"], - rename: function () { return "ag-grid-community-min.js"; } - }, { cwd: '<%= globalConfig.app %>/bower_components/', src: From 54bb16ed0080a6ac24fe1576521fd8582b3562bc Mon Sep 17 00:00:00 2001 From: Jeremy Mitchell Date: Tue, 16 Jun 2020 12:32:38 -0600 Subject: [PATCH 20/27] fixes server TP tests to work with ag-grid --- .../test/end_to_end/servers/servers-spec.js | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/traffic_portal/test/end_to_end/servers/servers-spec.js b/traffic_portal/test/end_to_end/servers/servers-spec.js index fb3220b78f..1f5d240783 100644 --- a/traffic_portal/test/end_to_end/servers/servers-spec.js +++ b/traffic_portal/test/end_to_end/servers/servers-spec.js @@ -41,11 +41,6 @@ describe('Traffic Portal Servers Test Suite', function() { expect(browser.getCurrentUrl().then(commonFunctions.urlPath)).toEqual(commonFunctions.urlPath(browser.baseUrl)+"#!/servers"); }); - it('should verify CSV link exists ', function() { - console.log("Verify CSV button exists"); - expect(element(by.css('.dt-button.buttons-csv')).isPresent()).toBe(true); - }); - it('should open new Servers form page', function() { console.log('Clicking on Create new server ' + mockVals.hostName); browser.driver.findElement(by.name('createServersButton')).click(); @@ -81,20 +76,14 @@ describe('Traffic Portal Servers Test Suite', function() { expect(first.isSelected()).toBe(true); first.click(); expect(first.isSelected()).toBe(false); - let tableColumns = element.all(by.css('#serversTable tr:first-child td')); - expect(tableColumns.count()).toBe(11); + let tableColumns = element.all(by.css('.ag-header-cell')); + expect(tableColumns.count()).toBe(9); }); it('should verify the new Server and then update Server', function() { console.log('Verifying new server added and updating ' + mockVals.hostName); browser.sleep(1000); - pageData.searchFilter.sendKeys(mockVals.hostName); - browser.sleep(250); - element.all(by.repeater('s in ::servers')).filter(function(row){ - return row.element(by.name('hostName')).getText().then(function(val){ - return val === mockVals.hostName; - }); - }).get(0).click(); + element(by.cssContainingText('.ag-cell', mockVals.hostName)).click() browser.sleep(1000); pageData.domainName.clear(); pageData.domainName.sendKeys('testupdated.com'); From 7cf8e98d2f69c2192aae9ff79cf2b689304352ec Mon Sep 17 00:00:00 2001 From: Jeremy Mitchell Date: Tue, 16 Jun 2020 12:59:57 -0600 Subject: [PATCH 21/27] fixes broken TP ds test --- .../test/end_to_end/deliveryServices/delivery-services-spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/traffic_portal/test/end_to_end/deliveryServices/delivery-services-spec.js b/traffic_portal/test/end_to_end/deliveryServices/delivery-services-spec.js index c6b99c3f5a..94a7021aa9 100644 --- a/traffic_portal/test/end_to_end/deliveryServices/delivery-services-spec.js +++ b/traffic_portal/test/end_to_end/deliveryServices/delivery-services-spec.js @@ -114,7 +114,7 @@ describe('Traffic Portal Delivery Services Suite', function() { first.click(); expect(first.isSelected()).toBe(false); let tableColumns = element.all(by.css('#deliveryServicesTable tr:first-child td')); - expect(tableColumns.count()).toBe(10); + expect(tableColumns.count()).toBe(11); }); it('should update the ANY_MAP delivery service', function() { From c011cdec0f274fa6a8dee76b5ea643131461b76d Mon Sep 17 00:00:00 2001 From: Jeremy Mitchell Date: Tue, 16 Jun 2020 14:32:46 -0600 Subject: [PATCH 22/27] adds a new super controller for the *servers tables --- .../TableCacheGroupServersController.js | 4 +- .../cdnServers/TableCDNServersController.js | 4 +- .../TableDeliveryServiceServersController.js | 4 +- .../TablePhysLocationServersController.js | 4 +- .../TableProfileServersController.js | 4 +- .../TableServerCapabilityServersController.js | 4 +- .../servers/TableParentServersController.js | 421 ++++++++++++++++++ .../src/common/modules/table/servers/index.js | 3 +- .../TableStatusServersController.js | 4 +- .../typeServers/TableTypeServersController.js | 4 +- 10 files changed, 439 insertions(+), 17 deletions(-) create mode 100644 traffic_portal/app/src/common/modules/table/servers/TableParentServersController.js diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js b/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js index 7ce6742fde..8ea50a2f08 100644 --- a/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js +++ b/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js @@ -19,8 +19,8 @@ var TableCacheGroupsServersController = function(cacheGroup, servers, $controller, $scope, $state, $uibModal, cacheGroupService) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let cacheGroupServersTable; diff --git a/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js b/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js index f0b8df7cc3..b6a4dca883 100644 --- a/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js +++ b/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js @@ -19,8 +19,8 @@ var TableCDNServersController = function(cdn, servers, $controller, $scope) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let cdnServersTable; diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js index b343657792..5d0c0944fb 100644 --- a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js +++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js @@ -19,8 +19,8 @@ var TableDeliveryServiceServersController = function(deliveryService, servers, $controller, $scope, $uibModal, deliveryServiceService, serverUtils) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let dsServersTable; diff --git a/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js b/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js index 497eb6c7b3..f329796c57 100644 --- a/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js +++ b/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js @@ -19,8 +19,8 @@ var TablePhysLocationServersController = function(physLocation, servers, $controller, $scope) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let physLocServersTable; diff --git a/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js b/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js index dbc2cf72e7..eff77f2189 100644 --- a/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js +++ b/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js @@ -19,8 +19,8 @@ var TableProfileServersController = function(profile, servers, $controller, $scope) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let profileServersTable; diff --git a/traffic_portal/app/src/common/modules/table/serverCapabilityServers/TableServerCapabilityServersController.js b/traffic_portal/app/src/common/modules/table/serverCapabilityServers/TableServerCapabilityServersController.js index a6dad82617..1afca893e7 100644 --- a/traffic_portal/app/src/common/modules/table/serverCapabilityServers/TableServerCapabilityServersController.js +++ b/traffic_portal/app/src/common/modules/table/serverCapabilityServers/TableServerCapabilityServersController.js @@ -19,8 +19,8 @@ var TableServerCapabilityServersController = function(serverCapability, servers, $scope, $state, $controller, $uibModal, $window, locationUtils, serverService, messageModel) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); var removeCapability = function(serverId) { serverService.removeServerCapability(serverId, serverCapability.name) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableParentServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableParentServersController.js new file mode 100644 index 0000000000..5fb0adc192 --- /dev/null +++ b/traffic_portal/app/src/common/modules/table/servers/TableParentServersController.js @@ -0,0 +1,421 @@ +/* + * 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. + */ + +var TableParentServersController = function(servers, $scope, $state, $uibModal, $window, dateUtils, locationUtils, serverUtils, cdnService, serverService, statusService, propertiesModel, messageModel) { + + let serversTable; + + var getStatuses = function() { + statusService.getStatuses() + .then(function(result) { + $scope.statuses = result; + }); + }; + + var queueServerUpdates = function(server) { + serverService.queueServerUpdates(server.id) + .then( + function() { + $scope.refresh(); + } + ); + }; + + var clearServerUpdates = function(server) { + serverService.clearServerUpdates(server.id) + .then( + function() { + $scope.refresh(); + } + ); + }; + + var queueCDNServerUpdates = function(cdnId) { + cdnService.queueServerUpdates(cdnId) + .then( + function() { + $scope.refresh(); + } + ); + }; + + var clearCDNServerUpdates = function(cdnId) { + cdnService.clearServerUpdates(cdnId) + .then( + function() { + $scope.refresh(); + } + ); + }; + + var confirmDelete = function(server) { + var params = { + title: 'Delete Server: ' + server.hostName, + key: server.hostName + }; + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html', + controller: 'DialogDeleteController', + size: 'md', + resolve: { + params: function () { + return params; + } + } + }); + modalInstance.result.then(function() { + deleteServer(server); + }, function () { + // do nothing + }); + }; + + var deleteServer = function(server) { + serverService.deleteServer(server.id) + .then(function(result) { + messageModel.setMessages(result.alerts, false); + $scope.refresh(); + }); + }; + + var confirmStatusUpdate = function(server) { + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html', + controller: 'DialogSelectStatusController', + size: 'md', + resolve: { + server: function() { + return server; + }, + statuses: function() { + return $scope.statuses; + } + } + }); + modalInstance.result.then(function(status) { + updateStatus(status, server); + }, function () { + // do nothing + }); + }; + + var updateStatus = function(status, server) { + serverService.updateStatus(server.id, { status: status.id, offlineReason: status.offlineReason }) + .then( + function(result) { + messageModel.setMessages(result.data.alerts, false); + $scope.refresh(); + }, + function(fault) { + messageModel.setMessages(fault.data.alerts, false); + } + ); + }; + + $scope.servers = servers; + + $scope.columns = [ + { "name": "Cache Group", "visible": true, "searchable": true }, + { "name": "CDN", "visible": true, "searchable": true }, + { "name": "Domain", "visible": true, "searchable": true }, + { "name": "Host", "visible": true, "searchable": true }, + { "name": "HTTPS Port", "visible": false, "searchable": false }, + { "name": "ID", "visible": false, "searchable": false }, + { "name": "ILO IP Address", "visible": true, "searchable": true }, + { "name": "ILO IP Gateway", "visible": false, "searchable": false }, + { "name": "ILO IP Netmask", "visible": false, "searchable": false }, + { "name": "ILO Username", "visible": false, "searchable": false }, + { "name": "Interface Name", "visible": false, "searchable": false }, + { "name": "IPv6 Address", "visible": true, "searchable": true }, + { "name": "IPv6 Gateway", "visible": false, "searchable": false }, + { "name": "Last Updated", "visible": false, "searchable": false }, + { "name": "Mgmt IP Address", "visible": false, "searchable": false }, + { "name": "Mgmt IP Gateway", "visible": false, "searchable": false }, + { "name": "Mgmt IP Netmask", "visible": false, "searchable": false }, + { "name": "Network Gateway", "visible": false, "searchable": false }, + { "name": "Network IP", "visible": true, "searchable": true }, + { "name": "Network MTU", "visible": false, "searchable": false }, + { "name": "Network Subnet", "visible": false, "searchable": false }, + { "name": "Offline Reason", "visible": false, "searchable": false }, + { "name": "Phys Location", "visible": true, "searchable": true }, + { "name": "Profile", "visible": true, "searchable": true }, + { "name": "Rack", "visible": false, "searchable": false }, + { "name": "Reval Pending", "visible": false, "searchable": false }, + { "name": "Router Hostname", "visible": false, "searchable": false }, + { "name": "Router Port Name", "visible": false, "searchable": false }, + { "name": "Status", "visible": true, "searchable": true }, + { "name": "TCP Port", "visible": false, "searchable": false }, + { "name": "Type", "visible": true, "searchable": true }, + { "name": "Update Pending", "visible": true, "searchable": true } + ]; + + $scope.contextMenuItems = [ + { + text: 'Open in New Tab', + click: function ($itemScope) { + $window.open('/#!/servers/' + $itemScope.s.id, '_blank'); + } + }, + null, // Divider + { + text: 'Navigate to Server FQDN', + click: function ($itemScope) { + $window.open('http://' + $itemScope.s.hostName + '.' + $itemScope.s.domainName, '_blank'); + } + }, + null, // Divider + { + text: 'Edit', + click: function ($itemScope) { + $scope.editServer($itemScope.s.id); + } + }, + { + text: 'Delete', + click: function ($itemScope) { + confirmDelete($itemScope.s); + } + }, + null, // Divider + { + text: 'Update Status', + click: function ($itemScope) { + confirmStatusUpdate($itemScope.s); + } + }, + { + text: 'Queue Server Updates', + displayed: function ($itemScope) { + return serverUtils.isCache($itemScope.s) && !$itemScope.s.updPending; + }, + click: function ($itemScope) { + queueServerUpdates($itemScope.s); + } + }, + { + text: 'Clear Server Updates', + displayed: function ($itemScope) { + return serverUtils.isCache($itemScope.s) && $itemScope.s.updPending; + }, + click: function ($itemScope) { + clearServerUpdates($itemScope.s); + } + }, + { + text: 'Show Charts', + displayed: function () { + return propertiesModel.properties.servers.charts.show; + }, + hasBottomDivider: function () { + return true; + }, + hasTopDivider: function () { + return true; + }, + click: function ($itemScope) { + $window.open(propertiesModel.properties.servers.charts.baseUrl + $itemScope.s.hostName, '_blank'); + } + }, + { + text: 'Manage Capabilities', + displayed: function ($itemScope) { + return serverUtils.isCache($itemScope.s); + }, + hasTopDivider: function () { + return true; + }, + click: function ($itemScope) { + locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/capabilities'); + } + }, + { + text: 'Manage Delivery Services', + displayed: function ($itemScope) { + return serverUtils.isEdge($itemScope.s) || serverUtils.isOrigin($itemScope.s); + }, + hasTopDivider: function ($itemScope) { + return !serverUtils.isCache($itemScope.s); + }, + click: function ($itemScope) { + locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/delivery-services'); + } + }, + { + text: 'View Config Files', + displayed: function ($itemScope) { + return serverUtils.isCache($itemScope.s); + }, + click: function ($itemScope) { + locationUtils.navigateToPath('/servers/' + $itemScope.s.id + '/config-files'); + } + } + ]; + + $scope.editServer = function(id) { + locationUtils.navigateToPath('/servers/' + id); + }; + + $scope.createServer = function() { + locationUtils.navigateToPath('/servers/new'); + }; + + $scope.confirmCDNQueueServerUpdates = function(cdn) { + var params; + if (cdn) { + params = { + title: 'Queue Server Updates: ' + cdn.name, + message: 'Are you sure you want to queue server updates for all ' + cdn.name + ' servers?' + }; + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', + controller: 'DialogConfirmController', + size: 'md', + resolve: { + params: function () { + return params; + } + } + }); + modalInstance.result.then(function() { + queueCDNServerUpdates(cdn.id); + }, function () { + // do nothing + }); + } else { + params = { + title: 'Queue Server Updates', + message: "Please select a CDN" + }; + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', + controller: 'DialogSelectController', + size: 'md', + resolve: { + params: function () { + return params; + }, + collection: function(cdnService) { + return cdnService.getCDNs(); + } + } + }); + modalInstance.result.then(function(cdn) { + queueCDNServerUpdates(cdn.id); + }, function () { + // do nothing + }); + } + }; + + $scope.confirmCDNClearServerUpdates = function(cdn) { + var params; + if (cdn) { + params = { + title: 'Clear Server Updates: ' + cdn.name, + message: 'Are you sure you want to clear server updates for all ' + cdn.name + ' servers?' + }; + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html', + controller: 'DialogConfirmController', + size: 'md', + resolve: { + params: function () { + return params; + } + } + }); + modalInstance.result.then(function() { + clearCDNServerUpdates(cdn.id); + }, function () { + // do nothing + }); + + + } else { + params = { + title: 'Clear Server Updates', + message: "Please select a CDN" + }; + var modalInstance = $uibModal.open({ + templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html', + controller: 'DialogSelectController', + size: 'md', + resolve: { + params: function () { + return params; + }, + collection: function(cdnService) { + return cdnService.getCDNs(); + } + } + }); + modalInstance.result.then(function(cdn) { + clearCDNServerUpdates(cdn.id); + }, function () { + // do nothing + }); + } + }; + + $scope.refresh = function() { + $state.reload(); // reloads all the resolves for the view + }; + + $scope.toggleVisibility = function(colName) { + const col = serversTable.column(colName + ':name'); + col.visible(!col.visible()); + serversTable.rows().invalidate().draw(); + }; + + $scope.ssh = serverUtils.ssh; + + $scope.isOffline = serverUtils.isOffline; + + $scope.offlineReason = serverUtils.offlineReason; + + $scope.getRelativeTime = dateUtils.getRelativeTime; + + $scope.navigateToPath = locationUtils.navigateToPath; + + var init = function () { + getStatuses(); + }; + init(); + + angular.element(document).ready(function () { + serversTable = $('#serversTable').DataTable({ + "lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]], + "iDisplayLength": 25, + "aaSorting": [], + "columns": $scope.columns, + "initComplete": function(settings, json) { + try { + // need to create the show/hide column checkboxes and bind to the current visibility + $scope.columns = JSON.parse(localStorage.getItem('DataTables_serversTable_/')).columns; + } catch (e) { + console.error("Failure to retrieve required column info from localStorage (key=DataTables_serversTable_/):", e); + } + } + }); + }); + +}; + +TableParentServersController.$inject = ['servers', '$scope', '$state', '$uibModal', '$window', 'dateUtils', 'locationUtils', 'serverUtils', 'cdnService', 'serverService', 'statusService', 'propertiesModel', 'messageModel']; +module.exports = TableParentServersController; diff --git a/traffic_portal/app/src/common/modules/table/servers/index.js b/traffic_portal/app/src/common/modules/table/servers/index.js index e955714d6e..2b5d9b5900 100644 --- a/traffic_portal/app/src/common/modules/table/servers/index.js +++ b/traffic_portal/app/src/common/modules/table/servers/index.js @@ -18,4 +18,5 @@ */ module.exports = angular.module('trafficPortal.table.servers', []) - .controller('TableServersController', require('./TableServersController')); + .controller('TableServersController', require('./TableServersController')) + .controller('TableParentServersController', require('./TableParentServersController')); diff --git a/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js b/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js index b35e637772..b0697059c1 100644 --- a/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js +++ b/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js @@ -19,8 +19,8 @@ var TableStatusServersController = function(status, servers, $controller, $scope) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let statusServersTable; diff --git a/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js b/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js index 3b03e50089..2930c9d014 100644 --- a/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js +++ b/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js @@ -19,8 +19,8 @@ var TableTypeServersController = function(type, servers, $controller, $scope) { - // extends the TableServersController to inherit common methods - angular.extend(this, $controller('TableServersController', { servers: servers, $scope: $scope })); + // extends the TableParentServersController to inherit common methods + angular.extend(this, $controller('TableParentServersController', { servers: servers, $scope: $scope })); let typeServersTable; From 6c22fdd98db60006609f1454f8a573bb56ac1130 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 16 Jun 2020 14:49:51 -0600 Subject: [PATCH 23/27] Fixed blank CDNs column --- .../src/common/modules/table/servers/TableServersController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index d6febb1ab0..a6aff9c39a 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -75,7 +75,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo }, { headerName: "CDN", - field: "cdn", + field: "cdnName", hide: false, searchable: true }, From 9be0f626381d29c6dff4ab658698d36a2566e7be Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 16 Jun 2020 15:05:19 -0600 Subject: [PATCH 24/27] Fixed incorrect update pending label icon --- .../common/modules/table/servers/TableServersController.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index a6aff9c39a..e9606c8030 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -37,9 +37,9 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo this.eGui.setAttribute("title", String(params.value)); this.eGui.classList.add("fa", "fa-lg"); if (params.value) { - this.eGui.classList.add("fa-check"); - } else { this.eGui.classList.add("fa-clock-o"); + } else { + this.eGui.classList.add("fa-check"); } } UpdateCellRenderer.prototype.getGui = function() {return this.eGui;}; @@ -382,7 +382,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.gridOptions.api.exportDataAsCsv(params); } - /**** Context menu functions ****/ $scope.queueServerUpdates = function(server, event) { From 74eaf9a0ddd825554a44793045a922309d786389 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 16 Jun 2020 15:15:20 -0600 Subject: [PATCH 25/27] Removed unused coldef properties, removed unused gridOptions property --- .../table/servers/TableServersController.js | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index e9606c8030..81a55fc5e7 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -71,45 +71,38 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Cache Group", field: "cachegroup", hide: false, - searchable: true }, { headerName: "CDN", field: "cdnName", hide: false, - searchable: true }, { headerName: "Domain", field: "domainName", hide: false, - searchable: true }, { headerName: "Host", field: "hostName", hide: false, - searchable: true }, { headerName: "HTTPS Port", field: "httpsPort", hide: true, - searchable: false, filter: "agNumberColumnFilter" }, { headerName: "ID", field: "id", hide: true, - searchable: true, filter: "agNumberColumnFilter" }, { headerName: "ILO IP Address", field: "iloIpAddress", hide: true, - searchable: true, cellRenderer: "sshCellRenderer", onCellClicked: null }, @@ -117,7 +110,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "ILO IP Gateway", field: "iloIpGateway", hide: true, - searchable: false, cellRenderer: "sshCellRenderer", onCellClicked: null }, @@ -125,37 +117,31 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "ILO IP Netmask", field: "iloIpNetmask", hide: true, - searchable: false }, { headerName: "ILO Username", field: "iloUsername", hide: true, - searchable: false }, { headerName: "Interface Name", field: "interfaceName", hide: true, - searchable: false }, { headerName: "IPv6 Address", field: "ipv6Address", hide: false, - searchable: true }, { headerName: "IPv6 Gateway", field: "ipv6Gateway", hide: true, - searchable: false }, { headerName: "Last Updated", field: "lastUpdated", hide: true, - searchable: false, filter: "agDateColumnFilter", valueFormatter: dateCellFormatter }, @@ -163,13 +149,11 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Mgmt IP Address", field: "mgmtIpAddress", hide: true, - searchable: false }, { headerName: "Mgmt IP Gateway", field: "mgmtIpGateway", hide: true, - searchable: false, filter: true, cellRenderer: "sshCellRenderer", onCellClicked: null @@ -178,7 +162,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Mgmt IP Netmask", field: "mgmtIpNetmask", hide: true, - searchable: false, filter: true, cellRenderer: "sshCellRenderer", onCellClicked: null @@ -187,7 +170,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Network Gateway", field: "ipGateway", hide: true, - searchable: true, filter: true, cellRenderer: "sshCellRenderer", onCellClicked: null @@ -196,7 +178,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Network IP", field: "ipAddress", hide: false, - searchable: true, filter: true, cellRenderer: "sshCellRenderer", onCellClicked: null @@ -205,44 +186,37 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Network MTU", field: "interfaceMtu", hide: true, - searchable: false, filter: "agNumberColumnFilter" }, { headerName: "Network Subnet", field: "ipNetmask", hide: true, - searchable: false }, { headerName: "Offline Reason", field: "offlineReason", hide: true, - searchable: false }, { headerName: "Phys Location", field: "physLocation", hide: true, - searchable: true }, { headerName: "Profile", field: "profile", hide: false, - searchable: true }, { headerName: "Rack", field: "rack", hide: true, - searchable: false }, { headerName: "Reval Pending", field: "revalPending", hide: true, - searchable: false, filter: true, cellRenderer: "updateCellRenderer" }, @@ -250,38 +224,32 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo headerName: "Router Hostname", field: "routerHostName", hide: true, - searchable: false }, { headerName: "Router Port Name", field: "routerPortName", hide: true, - searchable: false }, { headerName: "Status", field: "status", hide: false, - searchable: true, tooltip: offlineReasonTooltip }, { headerName: "TCP Port", field: "tcpPort", hide: true, - searchable: false }, { headerName: "Type", field: "type", hide: false, - searchable: true }, { headerName: "Update Pending", field: "updPending", hide: false, - searchable: true, filter: true, cellRenderer: "updateCellRenderer" } @@ -326,7 +294,6 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo onColumnResized: function(params) { localStorage.setItem("servers_table_columns", JSON.stringify($scope.gridOptions.columnApi.getColumnState())); }, - menuTabs: 'columnsMenuTab', tooltipShowDelay: 500, allowContextMenuWithControlKey: true, preventDefaultOnContextMenu: true, From bc70950979c59cbcd6fb7b2af046d90d3fc5ffad Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 16 Jun 2020 15:24:19 -0600 Subject: [PATCH 26/27] Fixed broken 'show charts' button in servers table context menu --- .../app/src/common/modules/table/servers/table.servers.tpl.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index 97a8d31d35..c5478943e4 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -85,7 +85,7 @@
  • - Show Charts + Show Charts

  • From 3418938d06373cf07a0eabd9a9bb017929037c18 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 16 Jun 2020 16:32:01 -0600 Subject: [PATCH 27/27] Fixed context menu not closing when certain actions were selected --- .../common/modules/table/servers/TableServersController.js | 2 +- .../src/common/modules/table/servers/table.servers.tpl.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js index 81a55fc5e7..10ad816f42 100644 --- a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js +++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js @@ -423,7 +423,7 @@ var TableServersController = function(servers, $scope, $state, $uibModal, $windo $scope.confirmStatusUpdate = function(server, event) { event.stopPropagation(); - var modalInstance = $uibModal.open({ + const modalInstance = $uibModal.open({ templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html', controller: 'DialogSelectStatusController', size: 'md', diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html index c5478943e4..4d36373aa8 100644 --- a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html +++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html @@ -57,7 +57,7 @@ - +