You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2018/10/04 19:53:33 UTC

[trafficcontrol] 06/14: Fixed UI issues, added auto refresh

This is an automated email from the ASF dual-hosted git repository.

mitchell852 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git

commit 042906de05109307f3294554e467e996ef45aff6
Author: cgillo000 <ch...@cable.comcast.com>
AuthorDate: Tue Sep 18 09:18:08 2018 -0600

    Fixed UI issues, added auto refresh
---
 traffic_portal/app/src/app.js                      | 882 +++++++++++----------
 .../WidgetDeliveryServicesController.js            |  92 ++-
 .../deliveryServices/_widget.deliveryServices.scss |  10 +-
 .../widget.deliveryServices.tpl.html               |  65 +-
 .../modules/private/dashboard/dashboard.tpl.html   |   2 +-
 .../app/src/traffic_portal_properties.json         |   3 +
 traffic_portal/package.json                        |   5 -
 7 files changed, 558 insertions(+), 501 deletions(-)

diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
index 0f8b94a..4a405a5 100644
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.js
@@ -20,480 +20,486 @@
 'use strict';
 require('app-templates');
 
-var App = function($urlRouterProvider) {
-    $urlRouterProvider.otherwise('/');
+var App = function ($urlRouterProvider) {
+	$urlRouterProvider.otherwise('/');
 };
 
 App.$inject = ['$urlRouterProvider'];
 
 var trafficPortal = angular.module('trafficPortal', [
-        'config',
-        'ngAnimate',
-        'ngResource',
-        'ngSanitize',
-        'ngRoute',
-        'ui.router',
-        'ui.bootstrap',
-        'restangular',
-        'app.templates',
-        'angular-jwt',
+		'config',
+		'ngAnimate',
+		'ngResource',
+		'ngSanitize',
+		'ngRoute',
+		'ui.router',
+		'ui.bootstrap',
+		'restangular',
+		'app.templates',
+		'angular-jwt',
 		'chart.js',
 		'tc.chartjs',
-        'angular-loading-bar',
+		'angular-loading-bar',
 
-        // public modules
-        require('./modules/public').name,
-        require('./modules/public/login').name,
+		// public modules
+		require('./modules/public').name,
+		require('./modules/public/login').name,
 
-        // private modules
-        require('./modules/private').name,
-        require('./modules/private/asns').name,
-        require('./modules/private/asns/edit').name,
-        require('./modules/private/asns/list').name,
-        require('./modules/private/asns/new').name,
-        require('./modules/private/cacheGroups').name,
-        require('./modules/private/cacheGroups/edit').name,
-        require('./modules/private/cacheGroups/list').name,
-        require('./modules/private/cacheGroups/new').name,
-        require('./modules/private/cacheGroups/asns').name,
-        require('./modules/private/cacheGroups/parameters').name,
-        require('./modules/private/cacheGroups/servers').name,
-        require('./modules/private/cacheGroups/staticDnsEntries').name,
-        require('./modules/private/cacheChecks').name,
-        require('./modules/private/cacheStats').name,
-        require('./modules/private/capabilities').name,
-        require('./modules/private/capabilities/new').name, // this must be defined before edit for the url matcher to work
-        require('./modules/private/capabilities/list').name,
-        require('./modules/private/capabilities/edit').name,
-        require('./modules/private/capabilities/endpoints').name,
-        require('./modules/private/capabilities/users').name,
-        require('./modules/private/cdns').name,
-        require('./modules/private/cdns/config').name,
-        require('./modules/private/cdns/deliveryServices').name,
-        require('./modules/private/cdns/dnssecKeys').name,
-        require('./modules/private/cdns/dnssecKeys/generate').name,
-        require('./modules/private/cdns/dnssecKeys/view').name,
-        require('./modules/private/cdns/edit').name,
-        require('./modules/private/cdns/federations').name,
-        require('./modules/private/cdns/federations/deliveryServices').name,
-        require('./modules/private/cdns/federations/edit').name,
-        require('./modules/private/cdns/federations/list').name,
-        require('./modules/private/cdns/federations/new').name,
-        require('./modules/private/cdns/federations/users').name,
-        require('./modules/private/cdns/list').name,
-        require('./modules/private/cdns/new').name,
-        require('./modules/private/cdns/profiles').name,
-        require('./modules/private/cdns/servers').name,
-        require('./modules/private/changeLogs').name,
-        require('./modules/private/changeLogs/list').name,
-        require('./modules/private/coordinates').name,
-        require('./modules/private/coordinates/edit').name,
-        require('./modules/private/coordinates/list').name,
-        require('./modules/private/coordinates/new').name,
-        require('./modules/private/dashboard').name,
-        require('./modules/private/dashboard/view').name,
-        require('./modules/private/deliveryServiceRequests').name,
-        require('./modules/private/deliveryServiceRequests/compare').name,
-        require('./modules/private/deliveryServiceRequests/comments').name,
-        require('./modules/private/deliveryServiceRequests/edit').name,
-        require('./modules/private/deliveryServiceRequests/list').name,
-        require('./modules/private/deliveryServices').name,
-        require('./modules/private/deliveryServices/clone').name,
-        require('./modules/private/deliveryServices/charts').name,
-        require('./modules/private/deliveryServices/charts/view').name,
-        require('./modules/private/deliveryServices/compare').name,
-        require('./modules/private/deliveryServices/edit').name,
-        require('./modules/private/deliveryServices/list').name,
-        require('./modules/private/deliveryServices/new').name,
-        require('./modules/private/deliveryServices/jobs').name,
-        require('./modules/private/deliveryServices/jobs/list').name,
-        require('./modules/private/deliveryServices/jobs/new').name,
-        require('./modules/private/deliveryServices/origins').name,
-        require('./modules/private/deliveryServices/regexes').name,
-        require('./modules/private/deliveryServices/regexes/edit').name,
-        require('./modules/private/deliveryServices/regexes/list').name,
-        require('./modules/private/deliveryServices/regexes/new').name,
-        require('./modules/private/deliveryServices/servers').name,
-        require('./modules/private/deliveryServices/staticDnsEntries').name,
-        require('./modules/private/deliveryServices/staticDnsEntries/edit').name,
-        require('./modules/private/deliveryServices/staticDnsEntries/list').name,
-        require('./modules/private/deliveryServices/staticDnsEntries/new').name,
-        require('./modules/private/deliveryServices/targets').name,
-        require('./modules/private/deliveryServices/targets/edit').name,
-        require('./modules/private/deliveryServices/targets/list').name,
-        require('./modules/private/deliveryServices/targets/new').name,
-        require('./modules/private/deliveryServices/users').name,
-        require('./modules/private/deliveryServices/urlSigKeys').name,
-        require('./modules/private/deliveryServices/uriSigningKeys').name,
-        require('./modules/private/deliveryServices/sslKeys').name,
-        require('./modules/private/deliveryServices/sslKeys/view').name,
-        require('./modules/private/deliveryServices/sslKeys/generate').name,
-        require('./modules/private/divisions').name,
-        require('./modules/private/divisions/edit').name,
-        require('./modules/private/divisions/list').name,
-        require('./modules/private/divisions/new').name,
-        require('./modules/private/divisions/regions').name,
-        require('./modules/private/endpoints').name,
-        require('./modules/private/endpoints/edit').name,
-        require('./modules/private/endpoints/list').name,
-        require('./modules/private/endpoints/new').name,
-        require('./modules/private/iso').name,
-        require('./modules/private/jobs').name,
-        require('./modules/private/jobs/list').name,
-        require('./modules/private/jobs/new').name,
-        require('./modules/private/origins').name,
-        require('./modules/private/origins/edit').name,
-        require('./modules/private/origins/list').name,
-        require('./modules/private/origins/new').name,
-        require('./modules/private/physLocations').name,
-        require('./modules/private/physLocations/edit').name,
-        require('./modules/private/physLocations/list').name,
-        require('./modules/private/physLocations/new').name,
-        require('./modules/private/physLocations/servers').name,
-        require('./modules/private/parameters').name,
-        require('./modules/private/parameters/cacheGroups').name,
-        require('./modules/private/parameters/edit').name,
-        require('./modules/private/parameters/list').name,
-        require('./modules/private/parameters/new').name,
-        require('./modules/private/parameters/profiles').name,
-        require('./modules/private/profiles').name,
-        require('./modules/private/profiles/compare').name,
-        require('./modules/private/profiles/deliveryServices').name,
-        require('./modules/private/profiles/edit').name,
-        require('./modules/private/profiles/list').name,
-        require('./modules/private/profiles/new').name,
-        require('./modules/private/profiles/parameters').name,
-        require('./modules/private/profiles/servers').name,
-        require('./modules/private/regions').name,
-        require('./modules/private/regions/edit').name,
-        require('./modules/private/regions/list').name,
-        require('./modules/private/regions/physLocations').name,
-        require('./modules/private/regions/new').name,
-        require('./modules/private/roles').name,
-        require('./modules/private/roles/capabilities').name,
-        require('./modules/private/roles/edit').name,
-        require('./modules/private/roles/list').name,
-        require('./modules/private/roles/new').name,
-        require('./modules/private/roles/users').name,
-        require('./modules/private/servers').name,
-        require('./modules/private/servers/configFiles').name,
-        require('./modules/private/servers/deliveryServices').name,
-        require('./modules/private/servers/edit').name,
-        require('./modules/private/servers/new').name,
-        require('./modules/private/servers/list').name,
-        require('./modules/private/statuses').name,
-        require('./modules/private/statuses/edit').name,
-        require('./modules/private/statuses/list').name,
-        require('./modules/private/statuses/new').name,
-        require('./modules/private/statuses/servers').name,
-        require('./modules/private/tenants').name,
-        require('./modules/private/tenants/deliveryServices').name,
-        require('./modules/private/tenants/edit').name,
-        require('./modules/private/tenants/list').name,
-        require('./modules/private/tenants/new').name,
-        require('./modules/private/tenants/users').name,
-        require('./modules/private/types').name,
-        require('./modules/private/types/edit').name,
-        require('./modules/private/types/list').name,
-        require('./modules/private/types/new').name,
-        require('./modules/private/types/servers').name,
-        require('./modules/private/types/cacheGroups').name,
-        require('./modules/private/types/deliveryServices').name,
-        require('./modules/private/types/staticDnsEntries').name,
-        require('./modules/private/users').name,
-        require('./modules/private/users/deliveryServices').name,
-        require('./modules/private/users/edit').name,
-        require('./modules/private/users/list').name,
-        require('./modules/private/users/new').name,
-        require('./modules/private/users/register').name,
+		// private modules
+		require('./modules/private').name,
+		require('./modules/private/asns').name,
+		require('./modules/private/asns/edit').name,
+		require('./modules/private/asns/list').name,
+		require('./modules/private/asns/new').name,
+		require('./modules/private/cacheGroups').name,
+		require('./modules/private/cacheGroups/edit').name,
+		require('./modules/private/cacheGroups/list').name,
+		require('./modules/private/cacheGroups/new').name,
+		require('./modules/private/cacheGroups/asns').name,
+		require('./modules/private/cacheGroups/parameters').name,
+		require('./modules/private/cacheGroups/servers').name,
+		require('./modules/private/cacheGroups/staticDnsEntries').name,
+		require('./modules/private/cacheChecks').name,
+		require('./modules/private/cacheStats').name,
+		require('./modules/private/capabilities').name,
+		require('./modules/private/capabilities/new').name, // this must be defined before edit for the url matcher to work
+		require('./modules/private/capabilities/list').name,
+		require('./modules/private/capabilities/edit').name,
+		require('./modules/private/capabilities/endpoints').name,
+		require('./modules/private/capabilities/users').name,
+		require('./modules/private/cdns').name,
+		require('./modules/private/cdns/config').name,
+		require('./modules/private/cdns/deliveryServices').name,
+		require('./modules/private/cdns/dnssecKeys').name,
+		require('./modules/private/cdns/dnssecKeys/generate').name,
+		require('./modules/private/cdns/dnssecKeys/view').name,
+		require('./modules/private/cdns/edit').name,
+		require('./modules/private/cdns/federations').name,
+		require('./modules/private/cdns/federations/deliveryServices').name,
+		require('./modules/private/cdns/federations/edit').name,
+		require('./modules/private/cdns/federations/list').name,
+		require('./modules/private/cdns/federations/new').name,
+		require('./modules/private/cdns/federations/users').name,
+		require('./modules/private/cdns/list').name,
+		require('./modules/private/cdns/new').name,
+		require('./modules/private/cdns/profiles').name,
+		require('./modules/private/cdns/servers').name,
+		require('./modules/private/changeLogs').name,
+		require('./modules/private/changeLogs/list').name,
+		require('./modules/private/coordinates').name,
+		require('./modules/private/coordinates/edit').name,
+		require('./modules/private/coordinates/list').name,
+		require('./modules/private/coordinates/new').name,
+		require('./modules/private/dashboard').name,
+		require('./modules/private/dashboard/view').name,
+		require('./modules/private/deliveryServiceRequests').name,
+		require('./modules/private/deliveryServiceRequests/compare').name,
+		require('./modules/private/deliveryServiceRequests/comments').name,
+		require('./modules/private/deliveryServiceRequests/edit').name,
+		require('./modules/private/deliveryServiceRequests/list').name,
+		require('./modules/private/deliveryServices').name,
+		require('./modules/private/deliveryServices/clone').name,
+		require('./modules/private/deliveryServices/charts').name,
+		require('./modules/private/deliveryServices/charts/view').name,
+		require('./modules/private/deliveryServices/compare').name,
+		require('./modules/private/deliveryServices/edit').name,
+		require('./modules/private/deliveryServices/list').name,
+		require('./modules/private/deliveryServices/new').name,
+		require('./modules/private/deliveryServices/jobs').name,
+		require('./modules/private/deliveryServices/jobs/list').name,
+		require('./modules/private/deliveryServices/jobs/new').name,
+		require('./modules/private/deliveryServices/origins').name,
+		require('./modules/private/deliveryServices/regexes').name,
+		require('./modules/private/deliveryServices/regexes/edit').name,
+		require('./modules/private/deliveryServices/regexes/list').name,
+		require('./modules/private/deliveryServices/regexes/new').name,
+		require('./modules/private/deliveryServices/servers').name,
+		require('./modules/private/deliveryServices/staticDnsEntries').name,
+		require('./modules/private/deliveryServices/staticDnsEntries/edit').name,
+		require('./modules/private/deliveryServices/staticDnsEntries/list').name,
+		require('./modules/private/deliveryServices/staticDnsEntries/new').name,
+		require('./modules/private/deliveryServices/targets').name,
+		require('./modules/private/deliveryServices/targets/edit').name,
+		require('./modules/private/deliveryServices/targets/list').name,
+		require('./modules/private/deliveryServices/targets/new').name,
+		require('./modules/private/deliveryServices/users').name,
+		require('./modules/private/deliveryServices/urlSigKeys').name,
+		require('./modules/private/deliveryServices/uriSigningKeys').name,
+		require('./modules/private/deliveryServices/sslKeys').name,
+		require('./modules/private/deliveryServices/sslKeys/view').name,
+		require('./modules/private/deliveryServices/sslKeys/generate').name,
+		require('./modules/private/divisions').name,
+		require('./modules/private/divisions/edit').name,
+		require('./modules/private/divisions/list').name,
+		require('./modules/private/divisions/new').name,
+		require('./modules/private/divisions/regions').name,
+		require('./modules/private/endpoints').name,
+		require('./modules/private/endpoints/edit').name,
+		require('./modules/private/endpoints/list').name,
+		require('./modules/private/endpoints/new').name,
+		require('./modules/private/iso').name,
+		require('./modules/private/jobs').name,
+		require('./modules/private/jobs/list').name,
+		require('./modules/private/jobs/new').name,
+		require('./modules/private/origins').name,
+		require('./modules/private/origins/edit').name,
+		require('./modules/private/origins/list').name,
+		require('./modules/private/origins/new').name,
+		require('./modules/private/physLocations').name,
+		require('./modules/private/physLocations/edit').name,
+		require('./modules/private/physLocations/list').name,
+		require('./modules/private/physLocations/new').name,
+		require('./modules/private/physLocations/servers').name,
+		require('./modules/private/parameters').name,
+		require('./modules/private/parameters/cacheGroups').name,
+		require('./modules/private/parameters/edit').name,
+		require('./modules/private/parameters/list').name,
+		require('./modules/private/parameters/new').name,
+		require('./modules/private/parameters/profiles').name,
+		require('./modules/private/profiles').name,
+		require('./modules/private/profiles/compare').name,
+		require('./modules/private/profiles/deliveryServices').name,
+		require('./modules/private/profiles/edit').name,
+		require('./modules/private/profiles/list').name,
+		require('./modules/private/profiles/new').name,
+		require('./modules/private/profiles/parameters').name,
+		require('./modules/private/profiles/servers').name,
+		require('./modules/private/regions').name,
+		require('./modules/private/regions/edit').name,
+		require('./modules/private/regions/list').name,
+		require('./modules/private/regions/physLocations').name,
+		require('./modules/private/regions/new').name,
+		require('./modules/private/roles').name,
+		require('./modules/private/roles/capabilities').name,
+		require('./modules/private/roles/edit').name,
+		require('./modules/private/roles/list').name,
+		require('./modules/private/roles/new').name,
+		require('./modules/private/roles/users').name,
+		require('./modules/private/servers').name,
+		require('./modules/private/servers/configFiles').name,
+		require('./modules/private/servers/deliveryServices').name,
+		require('./modules/private/servers/edit').name,
+		require('./modules/private/servers/new').name,
+		require('./modules/private/servers/list').name,
+		require('./modules/private/statuses').name,
+		require('./modules/private/statuses/edit').name,
+		require('./modules/private/statuses/list').name,
+		require('./modules/private/statuses/new').name,
+		require('./modules/private/statuses/servers').name,
+		require('./modules/private/tenants').name,
+		require('./modules/private/tenants/deliveryServices').name,
+		require('./modules/private/tenants/edit').name,
+		require('./modules/private/tenants/list').name,
+		require('./modules/private/tenants/new').name,
+		require('./modules/private/tenants/users').name,
+		require('./modules/private/types').name,
+		require('./modules/private/types/edit').name,
+		require('./modules/private/types/list').name,
+		require('./modules/private/types/new').name,
+		require('./modules/private/types/servers').name,
+		require('./modules/private/types/cacheGroups').name,
+		require('./modules/private/types/deliveryServices').name,
+		require('./modules/private/types/staticDnsEntries').name,
+		require('./modules/private/users').name,
+		require('./modules/private/users/deliveryServices').name,
+		require('./modules/private/users/edit').name,
+		require('./modules/private/users/list').name,
+		require('./modules/private/users/new').name,
+		require('./modules/private/users/register').name,
 
-        // current user
-        require('./modules/private/user').name,
-        require('./modules/private/user/edit').name,
+		// current user
+		require('./modules/private/user').name,
+		require('./modules/private/user/edit').name,
 
-        // custom
-        require('./modules/private/custom').name,
+		// custom
+		require('./modules/private/custom').name,
 
-        // common modules
-        require('./common/modules/chart/bps').name,
-        require('./common/modules/chart/httpStatus').name,
-        require('./common/modules/chart/tps').name,
-        require('./common/modules/compare').name,
-        require('./common/modules/dialog/compare').name,
-        require('./common/modules/dialog/confirm').name,
-        require('./common/modules/dialog/confirm/enter').name,
-        require('./common/modules/dialog/delete').name,
-        require('./common/modules/dialog/deliveryServiceRequest').name,
-        require('./common/modules/dialog/federationResolver').name,
-        require('./common/modules/dialog/import').name,
-        require('./common/modules/dialog/input').name,
-        require('./common/modules/dialog/reset').name,
-        require('./common/modules/dialog/select').name,
-        require('./common/modules/dialog/select/status').name,
-        require('./common/modules/dialog/text').name,
-        require('./common/modules/dialog/textarea').name,
-        require('./common/modules/header').name,
-        require('./common/modules/message').name,
-        require('./common/modules/navigation').name,
-        require('./common/modules/release').name,
+		// common modules
+		require('./common/modules/chart/bps').name,
+		require('./common/modules/chart/httpStatus').name,
+		require('./common/modules/chart/tps').name,
+		require('./common/modules/compare').name,
+		require('./common/modules/dialog/compare').name,
+		require('./common/modules/dialog/confirm').name,
+		require('./common/modules/dialog/confirm/enter').name,
+		require('./common/modules/dialog/delete').name,
+		require('./common/modules/dialog/deliveryServiceRequest').name,
+		require('./common/modules/dialog/federationResolver').name,
+		require('./common/modules/dialog/import').name,
+		require('./common/modules/dialog/input').name,
+		require('./common/modules/dialog/reset').name,
+		require('./common/modules/dialog/select').name,
+		require('./common/modules/dialog/select/status').name,
+		require('./common/modules/dialog/text').name,
+		require('./common/modules/dialog/textarea').name,
+		require('./common/modules/header').name,
+		require('./common/modules/message').name,
+		require('./common/modules/navigation').name,
+		require('./common/modules/release').name,
 
-        // forms
-        require('./common/modules/form/asn').name,
-        require('./common/modules/form/asn/edit').name,
-        require('./common/modules/form/asn/new').name,
-        require('./common/modules/form/cacheGroup').name,
-        require('./common/modules/form/cacheGroup/edit').name,
-        require('./common/modules/form/cacheGroup/new').name,
-        require('./common/modules/form/capability').name,
-        require('./common/modules/form/capability/edit').name,
-        require('./common/modules/form/capability/new').name,
-        require('./common/modules/form/cdn').name,
-        require('./common/modules/form/cdn/edit').name,
-        require('./common/modules/form/cdn/new').name,
-        require('./common/modules/form/cdnDnssecKeys').name,
-        require('./common/modules/form/cdnDnssecKeys/generate').name,
-        require('./common/modules/form/coordinate').name,
-        require('./common/modules/form/coordinate/edit').name,
-        require('./common/modules/form/coordinate/new').name,
-        require('./common/modules/form/deliveryService').name,
-        require('./common/modules/form/deliveryService/clone').name,
-        require('./common/modules/form/deliveryService/edit').name,
-        require('./common/modules/form/deliveryService/new').name,
-        require('./common/modules/form/deliveryServiceRegex').name,
-        require('./common/modules/form/deliveryServiceRegex/edit').name,
-        require('./common/modules/form/deliveryServiceRegex/new').name,
-        require('./common/modules/form/deliveryServiceSslKeys').name,
-        require('./common/modules/form/deliveryServiceSslKeys/generate').name,
-        require('./common/modules/form/deliveryServiceStaticDnsEntry').name,
-        require('./common/modules/form/deliveryServiceStaticDnsEntry/edit').name,
-        require('./common/modules/form/deliveryServiceStaticDnsEntry/new').name,
-        require('./common/modules/form/deliveryServiceTarget').name,
-        require('./common/modules/form/deliveryServiceTarget/edit').name,
-        require('./common/modules/form/deliveryServiceTarget/new').name,
-        require('./common/modules/form/deliveryServiceJob').name,
-        require('./common/modules/form/deliveryServiceJob/new').name,
-        require('./common/modules/form/division').name,
-        require('./common/modules/form/division/edit').name,
-        require('./common/modules/form/division/new').name,
-        require('./common/modules/form/endpoint').name,
-        require('./common/modules/form/endpoint/edit').name,
-        require('./common/modules/form/endpoint/new').name,
-        require('./common/modules/form/federation').name,
-        require('./common/modules/form/federation/edit').name,
-        require('./common/modules/form/federation/new').name,
-        require('./common/modules/form/iso').name,
-        require('./common/modules/form/job').name,
-        require('./common/modules/form/job/new').name,
-        require('./common/modules/form/origin').name,
-        require('./common/modules/form/origin/edit').name,
-        require('./common/modules/form/origin/new').name,
-        require('./common/modules/form/physLocation').name,
-        require('./common/modules/form/physLocation/edit').name,
-        require('./common/modules/form/physLocation/new').name,
-        require('./common/modules/form/parameter').name,
-        require('./common/modules/form/parameter/edit').name,
-        require('./common/modules/form/parameter/new').name,
-        require('./common/modules/form/profile').name,
-        require('./common/modules/form/profile/edit').name,
-        require('./common/modules/form/profile/new').name,
-        require('./common/modules/form/region').name,
-        require('./common/modules/form/region/edit').name,
-        require('./common/modules/form/region/new').name,
-        require('./common/modules/form/role').name,
-        require('./common/modules/form/role/edit').name,
-        require('./common/modules/form/role/new').name,
-        require('./common/modules/form/server').name,
-        require('./common/modules/form/server/edit').name,
-        require('./common/modules/form/server/new').name,
-        require('./common/modules/form/status').name,
-        require('./common/modules/form/status/edit').name,
-        require('./common/modules/form/status/new').name,
-        require('./common/modules/form/tenant').name,
-        require('./common/modules/form/tenant/edit').name,
-        require('./common/modules/form/tenant/new').name,
-        require('./common/modules/form/type').name,
-        require('./common/modules/form/type/edit').name,
-        require('./common/modules/form/type/new').name,
-        require('./common/modules/form/user').name,
-        require('./common/modules/form/user/edit').name,
-        require('./common/modules/form/user/new').name,
-        require('./common/modules/form/user/register').name,
+		// forms
+		require('./common/modules/form/asn').name,
+		require('./common/modules/form/asn/edit').name,
+		require('./common/modules/form/asn/new').name,
+		require('./common/modules/form/cacheGroup').name,
+		require('./common/modules/form/cacheGroup/edit').name,
+		require('./common/modules/form/cacheGroup/new').name,
+		require('./common/modules/form/capability').name,
+		require('./common/modules/form/capability/edit').name,
+		require('./common/modules/form/capability/new').name,
+		require('./common/modules/form/cdn').name,
+		require('./common/modules/form/cdn/edit').name,
+		require('./common/modules/form/cdn/new').name,
+		require('./common/modules/form/cdnDnssecKeys').name,
+		require('./common/modules/form/cdnDnssecKeys/generate').name,
+		require('./common/modules/form/coordinate').name,
+		require('./common/modules/form/coordinate/edit').name,
+		require('./common/modules/form/coordinate/new').name,
+		require('./common/modules/form/deliveryService').name,
+		require('./common/modules/form/deliveryService/clone').name,
+		require('./common/modules/form/deliveryService/edit').name,
+		require('./common/modules/form/deliveryService/new').name,
+		require('./common/modules/form/deliveryServiceRegex').name,
+		require('./common/modules/form/deliveryServiceRegex/edit').name,
+		require('./common/modules/form/deliveryServiceRegex/new').name,
+		require('./common/modules/form/deliveryServiceSslKeys').name,
+		require('./common/modules/form/deliveryServiceSslKeys/generate').name,
+		require('./common/modules/form/deliveryServiceStaticDnsEntry').name,
+		require('./common/modules/form/deliveryServiceStaticDnsEntry/edit').name,
+		require('./common/modules/form/deliveryServiceStaticDnsEntry/new').name,
+		require('./common/modules/form/deliveryServiceTarget').name,
+		require('./common/modules/form/deliveryServiceTarget/edit').name,
+		require('./common/modules/form/deliveryServiceTarget/new').name,
+		require('./common/modules/form/deliveryServiceJob').name,
+		require('./common/modules/form/deliveryServiceJob/new').name,
+		require('./common/modules/form/division').name,
+		require('./common/modules/form/division/edit').name,
+		require('./common/modules/form/division/new').name,
+		require('./common/modules/form/endpoint').name,
+		require('./common/modules/form/endpoint/edit').name,
+		require('./common/modules/form/endpoint/new').name,
+		require('./common/modules/form/federation').name,
+		require('./common/modules/form/federation/edit').name,
+		require('./common/modules/form/federation/new').name,
+		require('./common/modules/form/iso').name,
+		require('./common/modules/form/job').name,
+		require('./common/modules/form/job/new').name,
+		require('./common/modules/form/origin').name,
+		require('./common/modules/form/origin/edit').name,
+		require('./common/modules/form/origin/new').name,
+		require('./common/modules/form/physLocation').name,
+		require('./common/modules/form/physLocation/edit').name,
+		require('./common/modules/form/physLocation/new').name,
+		require('./common/modules/form/parameter').name,
+		require('./common/modules/form/parameter/edit').name,
+		require('./common/modules/form/parameter/new').name,
+		require('./common/modules/form/profile').name,
+		require('./common/modules/form/profile/edit').name,
+		require('./common/modules/form/profile/new').name,
+		require('./common/modules/form/region').name,
+		require('./common/modules/form/region/edit').name,
+		require('./common/modules/form/region/new').name,
+		require('./common/modules/form/role').name,
+		require('./common/modules/form/role/edit').name,
+		require('./common/modules/form/role/new').name,
+		require('./common/modules/form/server').name,
+		require('./common/modules/form/server/edit').name,
+		require('./common/modules/form/server/new').name,
+		require('./common/modules/form/status').name,
+		require('./common/modules/form/status/edit').name,
+		require('./common/modules/form/status/new').name,
+		require('./common/modules/form/tenant').name,
+		require('./common/modules/form/tenant/edit').name,
+		require('./common/modules/form/tenant/new').name,
+		require('./common/modules/form/type').name,
+		require('./common/modules/form/type/edit').name,
+		require('./common/modules/form/type/new').name,
+		require('./common/modules/form/user').name,
+		require('./common/modules/form/user/edit').name,
+		require('./common/modules/form/user/new').name,
+		require('./common/modules/form/user/register').name,
 
-        // tables
-        require('./common/modules/table/asns').name,
-        require('./common/modules/table/cacheGroups').name,
-        require('./common/modules/table/cacheGroupAsns').name,
-        require('./common/modules/table/cacheGroupParameters').name,
-        require('./common/modules/table/cacheGroupServers').name,
-        require('./common/modules/table/cacheGroupStaticDnsEntries').name,
-        require('./common/modules/table/capabilities').name,
-        require('./common/modules/table/capabilityEndpoints').name,
-        require('./common/modules/table/capabilityUsers').name,
-        require('./common/modules/table/changeLogs').name,
-        require('./common/modules/table/cdns').name,
-        require('./common/modules/table/cdnDeliveryServices').name,
-        require('./common/modules/table/cdnFederations').name,
-        require('./common/modules/table/cdnFederationDeliveryServices').name,
-        require('./common/modules/table/cdnFederationUsers').name,
-        require('./common/modules/table/cdnProfiles').name,
-        require('./common/modules/table/cdnServers').name,
-        require('./common/modules/table/coordinates').name,
-        require('./common/modules/table/deliveryServices').name,
-        require('./common/modules/table/deliveryServiceJobs').name,
-        require('./common/modules/table/deliveryServiceOrigins').name,
-        require('./common/modules/table/deliveryServiceRegexes').name,
-        require('./common/modules/table/deliveryServiceRequests').name,
-        require('./common/modules/table/deliveryServiceRequestComments').name,
-        require('./common/modules/table/deliveryServiceServers').name,
-        require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
-        require('./common/modules/table/deliveryServiceTargets').name,
-        require('./common/modules/table/deliveryServiceUsers').name,
-        require('./common/modules/table/divisions').name,
-        require('./common/modules/table/divisionRegions').name,
-        require('./common/modules/table/endpoints').name,
-        require('./common/modules/table/federationResolvers').name,
-        require('./common/modules/table/jobs').name,
-        require('./common/modules/table/origins').name,
-        require('./common/modules/table/physLocations').name,
-        require('./common/modules/table/physLocationServers').name,
-        require('./common/modules/table/parameters').name,
-        require('./common/modules/table/parameterCacheGroups').name,
-        require('./common/modules/table/parameterProfiles').name,
-        require('./common/modules/table/profileDeliveryServices').name,
-        require('./common/modules/table/profileParameters').name,
-        require('./common/modules/table/profileServers').name,
-        require('./common/modules/table/profiles').name,
-        require('./common/modules/table/regions').name,
-        require('./common/modules/table/regionPhysLocations').name,
-        require('./common/modules/table/roles').name,
-        require('./common/modules/table/roleCapabilities').name,
-        require('./common/modules/table/roleUsers').name,
-        require('./common/modules/table/servers').name,
-        require('./common/modules/table/serverConfigFiles').name,
-        require('./common/modules/table/serverDeliveryServices').name,
-        require('./common/modules/table/statuses').name,
-        require('./common/modules/table/statusServers').name,
-        require('./common/modules/table/tenants').name,
-        require('./common/modules/table/tenantDeliveryServices').name,
-        require('./common/modules/table/tenantUsers').name,
-        require('./common/modules/table/types').name,
-        require('./common/modules/table/typeCacheGroups').name,
-        require('./common/modules/table/typeDeliveryServices').name,
-        require('./common/modules/table/typeServers').name,
-        require('./common/modules/table/typeStaticDnsEntries').name,
-        require('./common/modules/table/users').name,
-        require('./common/modules/table/userDeliveryServices').name,
+		// tables
+		require('./common/modules/table/asns').name,
+		require('./common/modules/table/cacheGroups').name,
+		require('./common/modules/table/cacheGroupAsns').name,
+		require('./common/modules/table/cacheGroupParameters').name,
+		require('./common/modules/table/cacheGroupServers').name,
+		require('./common/modules/table/cacheGroupStaticDnsEntries').name,
+		require('./common/modules/table/capabilities').name,
+		require('./common/modules/table/capabilityEndpoints').name,
+		require('./common/modules/table/capabilityUsers').name,
+		require('./common/modules/table/changeLogs').name,
+		require('./common/modules/table/cdns').name,
+		require('./common/modules/table/cdnDeliveryServices').name,
+		require('./common/modules/table/cdnFederations').name,
+		require('./common/modules/table/cdnFederationDeliveryServices').name,
+		require('./common/modules/table/cdnFederationUsers').name,
+		require('./common/modules/table/cdnProfiles').name,
+		require('./common/modules/table/cdnServers').name,
+		require('./common/modules/table/coordinates').name,
+		require('./common/modules/table/deliveryServices').name,
+		require('./common/modules/table/deliveryServiceJobs').name,
+		require('./common/modules/table/deliveryServiceOrigins').name,
+		require('./common/modules/table/deliveryServiceRegexes').name,
+		require('./common/modules/table/deliveryServiceRequests').name,
+		require('./common/modules/table/deliveryServiceRequestComments').name,
+		require('./common/modules/table/deliveryServiceServers').name,
+		require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
+		require('./common/modules/table/deliveryServiceTargets').name,
+		require('./common/modules/table/deliveryServiceUsers').name,
+		require('./common/modules/table/divisions').name,
+		require('./common/modules/table/divisionRegions').name,
+		require('./common/modules/table/endpoints').name,
+		require('./common/modules/table/federationResolvers').name,
+		require('./common/modules/table/jobs').name,
+		require('./common/modules/table/origins').name,
+		require('./common/modules/table/physLocations').name,
+		require('./common/modules/table/physLocationServers').name,
+		require('./common/modules/table/parameters').name,
+		require('./common/modules/table/parameterCacheGroups').name,
+		require('./common/modules/table/parameterProfiles').name,
+		require('./common/modules/table/profileDeliveryServices').name,
+		require('./common/modules/table/profileParameters').name,
+		require('./common/modules/table/profileServers').name,
+		require('./common/modules/table/profiles').name,
+		require('./common/modules/table/regions').name,
+		require('./common/modules/table/regionPhysLocations').name,
+		require('./common/modules/table/roles').name,
+		require('./common/modules/table/roleCapabilities').name,
+		require('./common/modules/table/roleUsers').name,
+		require('./common/modules/table/servers').name,
+		require('./common/modules/table/serverConfigFiles').name,
+		require('./common/modules/table/serverDeliveryServices').name,
+		require('./common/modules/table/statuses').name,
+		require('./common/modules/table/statusServers').name,
+		require('./common/modules/table/tenants').name,
+		require('./common/modules/table/tenantDeliveryServices').name,
+		require('./common/modules/table/tenantUsers').name,
+		require('./common/modules/table/types').name,
+		require('./common/modules/table/typeCacheGroups').name,
+		require('./common/modules/table/typeDeliveryServices').name,
+		require('./common/modules/table/typeServers').name,
+		require('./common/modules/table/typeStaticDnsEntries').name,
+		require('./common/modules/table/users').name,
+		require('./common/modules/table/userDeliveryServices').name,
 
-        // widgets
-        require('./common/modules/widget/cacheGroups').name,
-        require('./common/modules/widget/capacity').name,
-        require('./common/modules/widget/cdnChart').name,
-        require('./common/modules/widget/changeLogs').name,
-        require('./common/modules/widget/dashboardStats').name,
+		// widgets
+		require('./common/modules/widget/cacheGroups').name,
+		require('./common/modules/widget/capacity').name,
+		require('./common/modules/widget/cdnChart').name,
+		require('./common/modules/widget/changeLogs').name,
+		require('./common/modules/widget/dashboardStats').name,
 		require('./common/modules/widget/deliveryServices').name,
-        require('./common/modules/widget/routing').name,
+		require('./common/modules/widget/routing').name,
 
-        // models
-        require('./common/models').name,
-        require('./common/api').name,
+		// models
+		require('./common/models').name,
+		require('./common/api').name,
 
-        // directives
-        require('./common/directives/match').name,
+		// directives
+		require('./common/directives/match').name,
 
-        // services
-        require('./common/service/application').name,
-        require('./common/service/utils').name,
+		// services
+		require('./common/service/application').name,
+		require('./common/service/utils').name,
 
-        // filters
-        require('./common/filters').name
+		// filters
+		require('./common/filters').name
 
-    ], App)
+	], App)
 
-        .config(function($stateProvider, $logProvider, $controllerProvider, RestangularProvider, ENV) {
+		.config(function ($stateProvider, $logProvider, $controllerProvider, RestangularProvider, ENV) {
 
-            RestangularProvider.setBaseUrl(ENV.api['root']);
+			RestangularProvider.setBaseUrl(ENV.api['root']);
 
-            RestangularProvider.setResponseInterceptor(function(data, operation, what) {
+			RestangularProvider.setResponseInterceptor(function (data, operation, what) {
 
-                if (angular.isDefined(data.response)) { // todo: this should not be needed. need better solution.
-                    if (operation == 'getList') {
-                        return data.response;
-                    }
-                    return data.response[0];
-                } else {
-                    return data;
-                }
-            });
+				if (angular.isDefined(data.response)) { // todo: this should not be needed. need better solution.
+					if (operation == 'getList') {
+						return data.response;
+					}
+					return data.response[0];
+				} else {
+					return data;
+				}
+			});
 
-            $controllerProvider.allowGlobals();
-            $logProvider.debugEnabled(true);
-            $stateProvider
-                .state('trafficPortal', {
-                    url: '/',
-                    abstract: true,
-                    templateUrl: 'common/templates/master.tpl.html',
-                        resolve: {
-                                properties: function(trafficPortalService, propertiesModel) {
-                                        return trafficPortalService.getProperties()
-                                            .then(function(result) {
-                                                    propertiesModel.setProperties(result);
-                                            });
-                                }
-                        }
+			$controllerProvider.allowGlobals();
+			$logProvider.debugEnabled(true);
+			$stateProvider
+				.state('trafficPortal', {
+					url: '/',
+					abstract: true,
+					templateUrl: 'common/templates/master.tpl.html',
+					resolve: {
+						properties: function (trafficPortalService, propertiesModel) {
+							return trafficPortalService.getProperties()
+								.then(function (result) {
+									propertiesModel.setProperties(result);
+								});
+						}
+					}
 
-                });
-        })
+				});
+		})
 
-        .run(function($log, applicationService) {
-            $log.debug("Application run...");
-            applicationService.startup();
-        })
-    ;
+		.run(function ($log, applicationService) {
+			$log.debug("Application run...");
+			applicationService.startup();
+		})
+;
 
 trafficPortal.factory('authInterceptor', function ($rootScope, $q, $window, $location, $timeout, messageModel, userModel) {
-    return {
-        responseError: function (rejection) {
-            var url = $location.url(),
-                alerts = [];
+	return {
+		responseError: function (rejection) {
+			var url = $location.url(),
+				alerts = [];
 
-            try { alerts = rejection.data.alerts; }
-            catch(e) {}
+			try {
+				alerts = rejection.data.alerts;
+			}
+			catch (e) {
+			}
 
-            // 401, 403, 404 and 5xx errors handled globally; all others handled in fault handler
-            if (rejection.status === 401) {
-                $rootScope.$broadcast('trafficPortal::exit');
-                userModel.resetUser();
-                if (url == '/login' || $location.search().redirect) {
-                    messageModel.setMessages(alerts, false);
-                } else {
-                    $timeout(function () {
-                        messageModel.setMessages(alerts, true);
-                        // forward the to the login page with ?redirect=page/they/were/trying/to/reach
-                        $location.url('/login').search({ redirect: encodeURIComponent(url) });
-                    }, 200);
-                }
-            } else if (rejection.status === 403 || rejection.status === 404) {
-                $timeout(function () {
-                    messageModel.setMessages(alerts, false);
-                }, 200);
-            } else if (rejection.status.toString().match(/^5\d[01356789]$/)) {
-                // matches 5xx EXCEPT for 502's and 504's which indicate a timeout and will be handled by each service call accordingly
-                $timeout(function () {
-                    if (alerts && alerts.length > 0) {
-                            messageModel.setMessages(alerts, false);
-                    } else {
-                            messageModel.setMessages([ { level: 'error', text: rejection.status.toString() + ': ' + rejection.statusText } ], false);
-                    }
-                }, 200);
-            }
+			// 401, 403, 404 and 5xx errors handled globally; all others handled in fault handler
+			if (rejection.status === 401) {
+				$rootScope.$broadcast('trafficPortal::exit');
+				userModel.resetUser();
+				if (url == '/login' || $location.search().redirect) {
+					messageModel.setMessages(alerts, false);
+				} else {
+					$timeout(function () {
+						messageModel.setMessages(alerts, true);
+						// forward the to the login page with ?redirect=page/they/were/trying/to/reach
+						$location.url('/login').search({redirect: encodeURIComponent(url)});
+					}, 200);
+				}
+			} else if (rejection.status === 403 || rejection.status === 404) {
+				$timeout(function () {
+					messageModel.setMessages(alerts, false);
+				}, 200);
+			} else if (rejection.status.toString().match(/^5\d[01356789]$/)) {
+				// matches 5xx EXCEPT for 502's and 504's which indicate a timeout and will be handled by each service call accordingly
+				$timeout(function () {
+					if (alerts && alerts.length > 0) {
+						messageModel.setMessages(alerts, false);
+					} else {
+						messageModel.setMessages([{
+							level: 'error',
+							text: rejection.status.toString() + ': ' + rejection.statusText
+						}], false);
+					}
+				}, 200);
+			}
 
-            return $q.reject(rejection);
-        }
-    };
+			return $q.reject(rejection);
+		}
+	};
 });
 
 trafficPortal.config(function ($httpProvider) {
-    $httpProvider.interceptors.push('authInterceptor');
+	$httpProvider.interceptors.push('authInterceptor');
 });
 
 
diff --git a/traffic_portal/app/src/common/modules/widget/deliveryServices/WidgetDeliveryServicesController.js b/traffic_portal/app/src/common/modules/widget/deliveryServices/WidgetDeliveryServicesController.js
index 85a3f3b..bf518e3 100644
--- a/traffic_portal/app/src/common/modules/widget/deliveryServices/WidgetDeliveryServicesController.js
+++ b/traffic_portal/app/src/common/modules/widget/deliveryServices/WidgetDeliveryServicesController.js
@@ -17,31 +17,44 @@
  * under the License.
  */
 
-var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q, $interval, deliveryServiceService, deliveryServiceStatsService, locationUtils, dateUtils, numberUtils) {
+var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q, $interval, deliveryServiceService, deliveryServiceStatsService, locationUtils, dateUtils, numberUtils, propertiesModel) {
+
+	var interval,
+		autoRefresh = propertiesModel.properties.dashboard.autoRefresh;
 
 	$scope.unitSize = 'Gb';
-	$scope.hasChart = false;
 	$scope.isRequested = false;
 	$scope.isLoading = false;
 	$scope.selectedIndex = 0;
 
-	$scope.getChartData = function (ds, idx, start, end) {
-		$scope.selectedIndex = idx;
-		$scope.isRequested = true;
-		$scope.isLoading = true;
-		$scope.resetChart();
-		if (start == undefined) {
-			start = moment().subtract(1, 'days');
+	var createInterval = function() {
+		killInterval();
+		interval = $interval(function() { $scope.getChartData($scope.selectedDeliveryService); }, propertiesModel.properties.dashboard.deliveryServiceGbps.refreshRateInMS );
+	};
+
+	var killInterval = function() {
+		if (angular.isDefined(interval)) {
+			$interval.cancel(interval);
+			interval = undefined;
 		}
-		if (end == undefined) {
-			end = moment().subtract(10, 'seconds');
+	};
+
+	$scope.getChartData = function (ds, idx) {
+		if (ds.xmlId != $scope.selectedDeliveryService.xmlId) {
+			$scope.selectedIndex = idx;
+			$scope.isRequested = true;
+			$scope.isLoading = true;
+			$scope.resetChart();
+			if (autoRefresh) {
+				createInterval();
+			}
 		}
+
+		var start = moment().subtract(1, 'days');
+		var end = moment().subtract(10, 'seconds');
 		$scope.selectedDeliveryService = ds;
 		$scope.dateRangeText = dateUtils.dateFormat(start.toDate(), "UTC: ddd mmm d yyyy H:MM:ss tt (Z)") + ' to ' + dateUtils.dateFormat(end.toDate(), "UTC: ddd mmm d yyyy H:MM:ss tt (Z)");
-		$scope.finalData = {
-			chart: [],
-			labels: []
-		};
+
 		var promises = [];
 		promises.push(deliveryServiceStatsService.getBPS(ds.xmlId, start, end));
 
@@ -49,8 +62,11 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 			.then(
 				function (responses) {
 					if (responses[0].series) {
-						$scope.hasChart = true;
 						$scope.chartData = (responses[0].series) ? $scope.buildBandwidthChartData(responses[0].series, start) : $scope.chartData;
+						$scope.finalData = {
+							chart: [],
+							labels: []
+						};
 						for (var i = 0; i < $scope.chartData.length; i++) {
 							$scope.finalData.chart.push($scope.chartData[i][1]);
 							$scope.finalData.labels.push($scope.chartData[i][0]);
@@ -59,8 +75,13 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 							$scope.buildChart();
 						}, 100);
 					} else {
-						$scope.hasChart = false;
 						$scope.isLoading = false;
+						$scope.finalData.chart = [0,0];
+						var d = new Date();
+						var c = new Date();
+						c.setDate(c.getDate()-1);
+						$scope.finalData.labels = [moment( c ).valueOf(), moment( d ).valueOf()];
+						$scope.buildChart();
 					}
 				},
 				function (fault) {
@@ -80,16 +101,17 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 		return normalizedChartData;
 	};
 
-	$scope.navigateToCharts = function () {
-		locationUtils.navigateToPath('/delivery-services/' + $scope.selectedDeliveryService.id + '/charts?type=' + $scope.selectedDeliveryService.type);
-	};
-
 	$scope.buildChart = function () {
 		$scope.isLoading = false;
 		$scope.dsChart.labels = $scope.finalData.labels;
 		$scope.dsChart.series = ['Bandwidth'];
 		$scope.dsChart.data = $scope.finalData.chart;
 		$scope.dsChart.options = {
+			responsive: true,
+			maintainAspectRatio: false,
+			animation: {
+				duration: 0
+			},
 			elements: {
 				point: {
 					radius: 0
@@ -98,7 +120,7 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 					fill: false,
 					tension: 0,
 					borderColor: '#3498DB',
-					borderWidth: 1
+					borderWidth: 2
 				},
 				rectangle: {
 					borderWidth: 2
@@ -122,7 +144,10 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 				xAxes: [{
 					type: 'time',
 					time: {
-						parser: 'MM/DD/YYYY HH:mm',
+						displayFormats: {
+							minute: 'h:mm'
+						},
+						parser: 'h:mm',
 						tooltipFormat: 'll HH:mm'
 					}
 				}, {
@@ -171,29 +196,46 @@ var WidgetDeliveryServicesController = function ($scope, $timeout, $filter, $q,
 			options: null
 		};
 		$scope.chartData = [];
-		$scope.selectedDeliveryService = null;
+		$scope.selectedDeliveryService = {
+			xmlId: ''
+		};
 	};
 
 	var getDeliveryServices = function () {
 		deliveryServiceService.getDeliveryServices()
 			.then(function (result) {
 				$scope.deliveryServices = result;
+				$scope.dsCount = $scope.deliveryServices.length;
+				for (var i = 0; i < $scope.deliveryServices.length; i++) {
+					$scope.deliveryServices[i].idx = i;
+				}
 				$scope.getChartData($scope.deliveryServices[0], 0);
 			});
 	};
 
+	$scope.navigateToCharts = function () {
+		locationUtils.navigateToPath('/delivery-services/' + $scope.selectedDeliveryService.id + '/charts?type=' + $scope.selectedDeliveryService.type);
+	};
+
 	// pagination
 	$scope.currentDeliveryServicesPage = 1;
 	$scope.deliveryServicesPerPage = 10;
 
 	$scope.navigateToPath = locationUtils.navigateToPath;
 
+	$scope.$on("$destroy", function() {
+		killInterval();
+	});
+
 	var init = function () {
 		$scope.resetChart();
 		getDeliveryServices();
+		if (autoRefresh) {
+			createInterval();
+		}
 	};
 	init();
 };
 
-WidgetDeliveryServicesController.$inject = ['$scope', '$timeout', '$filter', '$q', '$interval', 'deliveryServiceService', 'deliveryServiceStatsService', 'locationUtils', 'dateUtils', 'numberUtils'];
+WidgetDeliveryServicesController.$inject = ['$scope', '$timeout', '$filter', '$q', '$interval', 'deliveryServiceService', 'deliveryServiceStatsService', 'locationUtils', 'dateUtils', 'numberUtils', 'propertiesModel'];
 module.exports = WidgetDeliveryServicesController;
diff --git a/traffic_portal/app/src/common/modules/widget/deliveryServices/_widget.deliveryServices.scss b/traffic_portal/app/src/common/modules/widget/deliveryServices/_widget.deliveryServices.scss
index d80ab0e..55b5f40 100644
--- a/traffic_portal/app/src/common/modules/widget/deliveryServices/_widget.deliveryServices.scss
+++ b/traffic_portal/app/src/common/modules/widget/deliveryServices/_widget.deliveryServices.scss
@@ -17,7 +17,7 @@
 
 #delivery-services-outer-container {
     #deliveryServicesContainer {
-        max-height: 452px;
+        max-height: 552px;
         margin-bottom: 0;
         .list-group-item {
             background-color: transparent;
@@ -31,13 +31,16 @@
         .widgetTable {
             width: 100%;
             max-width: 100%;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
             margin-bottom: 5px;
             .thead {
                 vertical-align: bottom;
             }
         }
         .delivery-services-health {
-            height: 45px;
+            height: 52px;
             .delivery-services-table {
                 margin-top: -10px;
                 border-style: none;
@@ -67,6 +70,9 @@
 .dsWidgetButtonAlignFix {
     margin-right: 16px;
 }
+.dsWidgetGray {
+    color: #efefef;
+}
 
 #deliveryServicesLoadingContainer {
     height: 555px;
diff --git a/traffic_portal/app/src/common/modules/widget/deliveryServices/widget.deliveryServices.tpl.html b/traffic_portal/app/src/common/modules/widget/deliveryServices/widget.deliveryServices.tpl.html
index 842735f..79ee73d 100644
--- a/traffic_portal/app/src/common/modules/widget/deliveryServices/widget.deliveryServices.tpl.html
+++ b/traffic_portal/app/src/common/modules/widget/deliveryServices/widget.deliveryServices.tpl.html
@@ -18,37 +18,33 @@ under the License.
 -->
 
 <div class="x_title">
-    <h2>Delivery Services</h2>
+    <h2>Delivery Services ({{dsCount}})</h2>
     <div class="clearfix"></div>
 </div>
 <div class="x_content">
     <div class="row">
-        <div class="col-md-6 col-sm-6 col-xs-12">
-            <div id="delivery-services-outer-container" class="f">
+        <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12">
+            <div id="delivery-services-outer-container">
                 <div id="deliveryServicesContainer">
                     <div class="alert alert-info" ng-show="(deliveryServices | filter:search:strict).length == 0">
                         No matching delivery services
                     </div>
                     <div class="list-group">
-                        <table class="delivery-services-table widgetTable">
-                            <thead>
-                                <tr class="headings">
-                                    <th class="col-lg-6 col-md-6 col-sm-2">Delivery Service</th>
-                                    <th class="col-lg-2 col-md-2 col-sm-2">Type</th>
-                                    <th class="col-lg-3 col-md-3 col-sm-2">Tenant</th>
-                                    <th class="col-lg-1 col-md-1 col-sm-2"></th>
-                                </tr>
-                            </thead>
-                        </table>
-                        <a class="delivery-services-health list-group-item" ng-repeat="ds in deliveryServices | filter:search:strict | offsetFilter:(currentDeliveryServicesPage-1)*deliveryServicesPerPage | limitTo:deliveryServicesPerPage track by $index" ng-click="getChartData(ds, $index)">
+                        <a class="delivery-services-health list-group-item"
+                           ng-repeat="ds in deliveryServices | filter:search:strict | offsetFilter:(currentDeliveryServicesPage-1)*deliveryServicesPerPage | limitTo:deliveryServicesPerPage track by $index"
+                           ng-click="getChartData(ds, ds.idx)">
                             <div class="row">
                                 <table class="delivery-services-table widgetTable">
                                     <tbody>
                                     <tr>
-                                        <td class="col-lg-6 col-md-6 col-sm-2">{{ds.displayName}} <small>({{ds.xmlId}})</small></td>
-                                        <td class="col-lg-2 col-md-2 col-sm-2">{{ds.type}}</td>
-                                        <td class="col-lg-3 col-md-3 col-sm-2">{{ds.tenant}}</td>
-                                        <td class="col-lg-1 col-md-1 col-sm-2"><i class="fa fa-check" ng-show="$index == selectedIndex"></i></td>
+                                        <td class="col-lg-9 col-md-9 col-sm-12" style="width:70%;">{{ds.displayName}}
+                                            <small>({{ds.xmlId}})<br>{{ds.tenant}}</small>
+                                        </td>
+                                        <td class="col-lg-2 col-md-2 col-sm-12" style="width:30%;">{{ds.type}}</td>
+                                        <td class="col-lg-1 col-md-1 col-sm-12" style="width:10%;"><i
+                                                class="fa fa-check" ng-show="ds.idx == selectedIndex"></i><i
+                                                class="fa fa-square dsWidgetGray" ng-show="ds.idx != selectedIndex"></i>
+                                        </td>
                                     </tr>
                                     </tbody>
                                 </table>
@@ -58,10 +54,15 @@ under the License.
                 </div>
                 <div>
                     <div ng-show="(deliveryServices | filter:search:strict).length > 0">
-                        <uib-pagination class="delivery-services-pagination pagination-md" boundary-links="true" max-size="2" total-items="(deliveryServices | filter:search:strict).length" items-per-page="deliveryServicesPerPage" ng-model="currentDeliveryServicesPage" previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;" last-text="&raquo;"></uib-pagination>
+                        <uib-pagination class="delivery-services-pagination pagination-md" boundary-links="true"
+                                        max-size="2" total-items="(deliveryServices | filter:search:strict).length"
+                                        items-per-page="deliveryServicesPerPage" ng-model="currentDeliveryServicesPage"
+                                        previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;"
+                                        last-text="&raquo;"></uib-pagination>
                     </div>
                     <div class="input-group delivery-services-search-form">
-                        <input type="text" class="filter-input form-control" placeholder="Filter delivery services..." ng-model="search.displayName">
+                        <input type="text" class="filter-input form-control" placeholder="Filter delivery services..."
+                               ng-model="search.displayName">
                         <span class="filter-input-group-btn input-group-btn">
                                 <button class="btn btn-default" type="button"><i class="fa fa-search"></i></button>
                             </span>
@@ -69,20 +70,24 @@ under the License.
                 </div>
             </div>
         </div>
-        <div class="col-md-6 col-sm-6 col-xs-12">
+        <div class="col-lg-8 col-md-6 col-sm-6 col-xs-12">
             <div ng-show="!isRequested">Select a Delivery Service to view bandwidth chart.</div>
-            <div class="alert alert-info" ng-show="isLoading">Loading data for {{selectedDeliveryService.displayName}}</div>
-            <div class="alert alert-danger" ng-show="!hasChart && isRequested && !isLoading">No bandwidth data for {{selectedDeliveryService.displayName}}</div>
-            <div ng-show="hasChart && !isLoading" class="dsWidgetMessages">
-                <div class="pull-left">{{selectedDeliveryService.displayName}} - Bandwidth Per Second <br><small>{{dateRangeText}}</small></div>
+            <div class="alert alert-info" ng-show="isLoading">Loading data
+                for {{selectedDeliveryService.displayName}}</div>
+            <div ng-show="!isLoading" class="dsWidgetMessages">
+                <div class="pull-left">{{selectedDeliveryService.displayName}} - Bandwidth Per Second <br>
+                    <small>{{dateRangeText}}</small>
+                </div>
                 <div class="pull-right dsWidgetButtonAlignFix" role="group">
-                    <button class="btn btn-primary" title="View Expanded Charts" ng-click="navigateToCharts()"><i class="fa fa-bar-chart"></i></button>
+                    <button class="btn btn-primary" title="View Expanded Charts" ng-click="navigateToCharts()"><i
+                            class="fa fa-bar-chart"></i></button>
                 </div>
             </div>
-            <canvas id="line" class="chart chart-line" chart-data="dsChart.data"
-                    chart-labels="dsChart.labels" chart-series="dsChart.series" chart-options="dsChart.options"
-                    chart-dataset-override="dsChart.datasetOverride" chart-click="onClick">
-            </canvas>
+            <div style="position: relative; height: 50vh">
+                <canvas id="line" class="chart chart-line" chart-data="dsChart.data"
+                        chart-labels="dsChart.labels" chart-series="dsChart.series" chart-options="dsChart.options">
+                </canvas>
+            </div>
         </div>
     </div>
 </div>
diff --git a/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html b/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
index 11b0c5c..f13aa41 100644
--- a/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
+++ b/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
@@ -23,7 +23,7 @@ under the License.
     </div>
     <div class="row">
         <div class="col-md-12 col-sm-12 col-xs-12">
-            <div ng-if="hasCapability('delivery-services')" class="x_panel" ui-view="deliveryServicesContent"></div>
+            <div ng-if="hasCapability('delivery-services-read')" class="x_panel" ui-view="deliveryServicesContent"></div>
         </div>
     </div>
     <div ng-if="hasCapability('cdns-read')" ng-repeat="cdn in ::cdns">
diff --git a/traffic_portal/app/src/traffic_portal_properties.json b/traffic_portal/app/src/traffic_portal_properties.json
index cc3734e..69f01e9 100644
--- a/traffic_portal/app/src/traffic_portal_properties.json
+++ b/traffic_portal/app/src/traffic_portal_properties.json
@@ -13,6 +13,9 @@
       "currentStats": {
         "refreshRateInMS": 30000
       },
+      "deliveryServiceGbps": {
+        "refreshRateInMS": 30000
+      },
       "healthyCacheCount": {
         "refreshRateInMS": 60000
       },
diff --git a/traffic_portal/package.json b/traffic_portal/package.json
index 295cebe..6f51e0e 100755
--- a/traffic_portal/package.json
+++ b/traffic_portal/package.json
@@ -33,10 +33,5 @@
   },
   "engines": {
     "node": "0.11.14"
-  },
-  "dependencies": {
-    "angular-chart.js": "^1.1.1",
-    "chartjs": "^0.3.24",
-    "tc-angular-chartjs": "^2.1.4"
   }
 }