You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by da...@apache.org on 2017/06/30 22:41:35 UTC

[05/52] [partial] incubator-trafficcontrol git commit: promotes TO experimental UI to the new Traffic Portal

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/overview/deliveryService.view.overview.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/overview/deliveryService.view.overview.tpl.html b/traffic_portal/app/src/modules/private/deliveryService/view/overview/deliveryService.view.overview.tpl.html
deleted file mode 100644
index fbc3ea3..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/overview/deliveryService.view.overview.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--->
-
-<div id="dsOverviewContainer" ng-show="deliveryService">
-    <div class="ds-header">
-        <ol class="breadcrumb">
-            <li class="active"><span class="ds-name" title="{{deliveryService.displayName}} ({{deliveryService.id}} | {{deliveryService.xmlId}})">{{deliveryService.displayName}}</span> <a class="link" title="View Delivery Service Config" ng-click="viewConfig(deliveryService)"><i class="fa fa-cog fa-fw"></i></a></li>
-        </ol>
-        <div ng-if="properties.deliveryService.invalidateContent.show && user.localUser" class="invalidate-content-btn btn-group" uib-dropdown is-open="invalidate.isopen">
-            <button id="invalidate-button" type="button" class="action-btn-dropdown btn" uib-dropdown-toggle>
-                Invalidate Content <i class="fa fa-angle-down fa-lg"></i>
-            </button>
-            <ul class="action-btn-dialog uib-dropdown-menu scrollable-purge-container scrollable dropdown-menu-right" role="menu" aria-labelledby="invalidate-button">
-                <li>
-                    <div class="panel-body">
-                        <div ui-view="purgeContent"></div>
-                    </div>
-                </li>
-            </ul>
-        </div>
-        <div class="more-charts-btn btn-group" uib-dropdown is-open="moreCharts.isopen">
-            <button id="moreCharts-button" type="button" class="action-btn-dropdown btn" uib-dropdown-toggle>
-                Delivery Service Charts <i class="fa fa-angle-down fa-lg"></i>
-            </button>
-            <ul class="action-btn-menu uib-dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="moreCharts-button">
-                <li ng-if="properties.charts.bandwidthPerSecond.show"><a ng-click="navigateToChart(deliveryService.id, 'bandwidth-per-second')">{{properties.charts.bandwidthPerSecond.name}}</a></li>
-                <li ng-if="properties.charts.transactionsPerSecond.show"><a ng-click="navigateToChart(deliveryService.id, 'transactions-per-second')">{{properties.charts.transactionsPerSecond.name}}</a></li>
-                <li ng-if="properties.charts.httpStatus.show"><a ng-click="navigateToChart(deliveryService.id, 'http-status-by-class')">{{properties.charts.httpStatus.name}}</a></li>
-            </ul>
-        </div>
-    </div>
-    <div class="alert alert-danger" role="alert" ng-show="failover.configured && failover.enabled">Failover Status: ON <span ng-show="failover.destination.location"> - destination: {{failover.destination.location}} ({{failover.destination.type}})</span></div>
-    <div ng-if="properties.charts.bandwidthPerSecond.show">
-        <div ui-view="chartDatesContent"></div>
-        <div ui-view="bandwidthContent" class="bandwidth-content"></div>
-    </div>
-    <hr>
-    <div class="capacity-and-routing row" ng-show="deliveryService.active">
-        <div class="col-sm-6 col-md-6" ui-view="capacityContent"></div>
-        <div class="col-sm-6 col-md-6" ui-view="routingContent"></div>
-    </div>
-    <hr>
-    <div ng-show="deliveryService.active" ui-view="cacheGroupsContent" class="ds-cachegroups"></div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/overview/detail/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/overview/detail/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/overview/detail/index.js
deleted file mode 100644
index 508dd00..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/overview/detail/index.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
-module.exports = angular.module('trafficPortal.deliveryService.view.overview.detail', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.overview.detail', {
-                url: '',
-                views: {
-                    chartDatesContent: {
-                        templateUrl: 'common/modules/chart/dates/chart.dates.tpl.html',
-                        controller: 'ChartDatesController',
-                        resolve: {
-                            customLabel: function() {
-                                return 'Delivery Service Bandwidth';
-                            },
-                            showAutoRefreshBtn: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    bandwidthContent: {
-                        templateUrl: 'common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond.tpl.html',
-                        controller: 'ChartBandwidthPerSecondController',
-                        resolve: {
-                            entity: function(user, $stateParams, deliveryServicesModel) {
-                                return deliveryServicesModel.getDeliveryService($stateParams.deliveryServiceId);
-                            },
-                            showSummary: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    purgeContent: {
-                        templateUrl: 'common/modules/tools/purge/tools.purge.tpl.html',
-                        controller: 'ToolsPurgeController'
-                    },
-                    capacityContent: {
-                        templateUrl: 'common/modules/chart/capacity/chart.capacity.tpl.html',
-                        controller: 'ChartCapacityController',
-                        resolve: {
-                            entityId: function($stateParams) {
-                                return $stateParams.deliveryServiceId;
-                            },
-                            service: function(deliveryServiceService) {
-                                return deliveryServiceService;
-                            }
-                        }
-                    },
-                    cacheGroupsContent: {
-                        templateUrl: 'common/modules/cacheGroups/cacheGroups.tpl.html',
-                        controller: 'CacheGroupsController',
-                        resolve: {
-                            entityId: function($stateParams) {
-                                return $stateParams.deliveryServiceId;
-                            },
-                            service: function(deliveryServiceService) {
-                                return deliveryServiceService;
-                            },
-                            showDownload: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    routingContent: {
-                        templateUrl: 'common/modules/chart/routing/chart.routing.tpl.html',
-                        controller: 'ChartRoutingController',
-                        resolve: {
-                            entityId: function($stateParams) {
-                                return $stateParams.deliveryServiceId;
-                            },
-                            service: function(deliveryServiceService) {
-                                return deliveryServiceService;
-                            }
-                        }
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/overview/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/overview/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/overview/index.js
deleted file mode 100644
index 452f37b..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/overview/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
-module.exports = angular.module('trafficPortal.deliveryService.view.overview', [])
-    .controller('DeliveryServiceViewOverviewController', require('./DeliveryServiceViewOverviewController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.overview', {
-                url: '',
-                abstract: true,
-                views: {
-                    deliveryServiceViewContent: {
-                        templateUrl: 'modules/private/deliveryService/view/overview/deliveryService.view.overview.tpl.html',
-                        controller: 'DeliveryServiceViewOverviewController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/index.js b/traffic_portal/app/src/modules/private/index.js
index 9a71075..7ba33c3 100644
--- a/traffic_portal/app/src/modules/private/index.js
+++ b/traffic_portal/app/src/modules/private/index.js
@@ -1,18 +1,20 @@
 /*
-
-
- Licensed 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.
-
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 module.exports = angular.module('trafficPortal.private', [])
@@ -22,6 +24,10 @@ module.exports = angular.module('trafficPortal.private', [])
                 url: '',
                 abstract: true,
                 views: {
+                    navigation: {
+                        templateUrl: 'common/modules/navigation/navigation.tpl.html',
+                        controller: 'NavigationController'
+                    },
                     header: {
                         templateUrl: 'common/modules/header/header.tpl.html',
                         controller: 'HeaderController'
@@ -32,23 +38,14 @@ module.exports = angular.module('trafficPortal.private', [])
                     },
                     content: {
                         templateUrl: 'modules/private/private.tpl.html'
-                    },
-                    footer: {
-                        templateUrl: 'common/modules/footer/footer.tpl.html',
-                        controller: 'FooterController'
                     }
                 },
                 resolve: {
-                    user: function($state, userService, deliveryServiceService, userModel, deliveryServicesModel) {
-                        if (userModel.user.loaded) {
+                    currentUser: function($state, userService, userModel) {
+                        if (userModel.loaded) {
                             return userModel.user;
                         } else {
-                            return userService.getCurrentUser()
-                                .then(function() {
-                                    if (!deliveryServicesModel.loaded) {
-                                        return deliveryServiceService.getDeliveryServices();
-                                    }
-                                });
+                            return userService.getCurrentUser();
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/MonitorController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/MonitorController.js b/traffic_portal/app/src/modules/private/monitor/MonitorController.js
new file mode 100644
index 0000000..695fdbb
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/MonitorController.js
@@ -0,0 +1,23 @@
+/*
+ * 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 MonitorController = function() {};
+
+MonitorController.$inject = [];
+module.exports = MonitorController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/_monitor.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/_monitor.scss b/traffic_portal/app/src/modules/private/monitor/_monitor.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/_monitor.scss
@@ -0,0 +1,16 @@
+/*
+
+
+ Licensed 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.
+
+*/

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/dashboard/DashboardController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/dashboard/DashboardController.js b/traffic_portal/app/src/modules/private/monitor/dashboard/DashboardController.js
new file mode 100644
index 0000000..c08a4e6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/dashboard/DashboardController.js
@@ -0,0 +1,36 @@
+/*
+ * 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 DashboardController = function(cacheGroupHealth, cdns, currentStats, serverCount, $scope) {
+
+	$scope.cacheGroupHealth = cacheGroupHealth;
+
+	$scope.cdns = cdns;
+
+	$scope.totalStats = _.find(currentStats.currentStats, function(item) {
+		// total stats are buried in a hash where cdn = total
+		return item.cdn == 'total';
+	});
+
+	$scope.serverCount = serverCount;
+
+};
+
+DashboardController.$inject = ['cacheGroupHealth', 'cdns', 'currentStats', 'serverCount', '$scope'];
+module.exports = DashboardController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/dashboard/_dashboard.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/dashboard/_dashboard.scss b/traffic_portal/app/src/modules/private/monitor/dashboard/_dashboard.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/dashboard/_dashboard.scss
@@ -0,0 +1,16 @@
+/*
+
+
+ Licensed 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.
+
+*/

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/dashboard/dashboard.tpl.html b/traffic_portal/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
new file mode 100644
index 0000000..3b09283
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
@@ -0,0 +1,85 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div role="main">
+    <div class="row tile_count">
+        <div class="col-md-4 col-sm-6 col-xs-12">
+            <div class="col-md-6 col-sm-12 col-xs-12 tile_stats_count current">
+                <span class="count_top">Current Bandwidth</span>
+                <div class="count">{{totalStats.bandwidth | number:2}} Gbps</div>
+            </div>
+            <div class="col-md-6 col-sm-12 col-xs-12 tile_stats_count current">
+                <span class="count_top">Current Connections</span>
+                <div class="count">{{totalStats.connections | number:0}}</div>
+            </div>
+        </div>
+        <div class="col-md-8 col-sm-6 col-xs-12">
+            <div class="col-md-4 col-sm-12 col-xs-12 tile_stats_count">
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Healthy Caches</span>
+                    <div class="count green">{{cacheGroupHealth.totalOnline | number:0}}</div>
+                </div>
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Unhealthy Caches</span>
+                    <div class="count red">{{cacheGroupHealth.totalOffline | number:0}}</div>
+                </div>
+            </div>
+            <div class="col-md-4 col-sm-12 col-xs-12 tile_stats_count">
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Online Caches</span>
+                    <div class="count">{{serverCount.ONLINE | number:0}}</div>
+                </div>
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Reported Caches</span>
+                    <div class="count">{{serverCount.REPORTED | number:0}}</div>
+                </div>
+            </div>
+            <div class="col-md-4 col-sm-12 col-xs-12 tile_stats_count">
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Offline Caches</span>
+                    <div class="count">{{serverCount.OFFLINE | number:0}}</div>
+                </div>
+                <div class="col-md-6 col-sm-6 col-xs-6">
+                    <span class="count_top">Admin Down Caches</span>
+                    <div class="count">{{serverCount.ADMIN_DOWN | number:0}}</div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div ng-repeat="cdn in ::cdns">
+        <div class="row">
+            <div class="col-md-12 col-sm-12 col-xs-12 chartContainer" data-cdnid="{{::cdn.id}}" ui-view="cdnChartContent"></div>
+        </div>
+        <br>
+    </div>
+    <div class="row">
+        <div class="col-md-4 col-sm-4 col-xs-12">
+            <div class="x_panel tile fixed_height_320" ui-view="capacityContent"></div>
+            <div class="x_panel tile" ui-view="routingContent"></div>
+        </div>
+        <div class="col-md-8 col-sm-8 col-xs-12">
+            <div class="row">
+                <div class="col-md-12 col-sm-12 col-xs-12">
+                    <div class="x_panel" ui-view="cacheGroupsContent"></div>
+                    <div class="x_panel" ui-view="changeLogsContent"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/dashboard/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/dashboard/index.js b/traffic_portal/app/src/modules/private/monitor/dashboard/index.js
new file mode 100644
index 0000000..6848d17
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/dashboard/index.js
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.monitor.dashboard', [])
+    .controller('DashboardController', require('./DashboardController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.monitor.dashboard', {
+                url: '/dashboard',
+                abstract: true,
+                views: {
+                    monitorContent: {
+                        templateUrl: 'modules/private/monitor/dashboard/dashboard.tpl.html',
+                        controller: 'DashboardController',
+                        resolve: {
+                            cacheGroupHealth: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroupHealth();
+                            },
+                            cdns: function(cdnService) {
+                                return cdnService.getCDNs();
+                            },
+                            currentStats: function(cdnService) {
+                                return cdnService.getCurrentStats();
+                            },
+                            serverCount: function(serverService) {
+                                return serverService.getStatusCount();
+                            }
+                        }
+
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/dashboard/view/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/dashboard/view/index.js b/traffic_portal/app/src/modules/private/monitor/dashboard/view/index.js
new file mode 100644
index 0000000..52479aa
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/dashboard/view/index.js
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.monitor.dashboard.view', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.monitor.dashboard.view', {
+				url: '',
+				views: {
+					cacheGroupsContent: {
+						templateUrl: 'common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html',
+						controller: 'WidgetCacheGroupsController',
+						resolve: {
+							cacheGroupHealth: function() {
+								// this is already defined in a parent template that shares the $scope
+								return null;
+							}
+						}
+					},
+					capacityContent: {
+						templateUrl: 'common/modules/widget/capacity/widget.capacity.tpl.html',
+						controller: 'WidgetCapacityController'
+					},
+					cdnChartContent: {
+						templateUrl: 'common/modules/widget/cdnChart/widget.cdnChart.tpl.html',
+						controller: 'WidgetCDNChartController',
+						resolve: {
+							cdn: function() {
+								// the controller will take care of fetching the cdn
+								return null;
+							}
+						}
+					},
+					changeLogsContent: {
+						templateUrl: 'common/modules/widget/changeLogs/widget.changeLogs.tpl.html',
+						controller: 'WidgetChangeLogsController',
+						resolve: {
+							changeLogs: function(changeLogService) {
+								return changeLogService.getChangeLogs({ limit: 5 });
+							}
+						}
+					},
+					routingContent: {
+						templateUrl: 'common/modules/widget/routing/widget.routing.tpl.html',
+						controller: 'WidgetRoutingController',
+						resolve: {
+							routing: function() {
+								return [];
+							}
+						}
+					},
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/index.js b/traffic_portal/app/src/modules/private/monitor/index.js
new file mode 100644
index 0000000..c76b0a4
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/index.js
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.monitor', [])
+    .controller('MonitorController', require('./MonitorController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.monitor', {
+                url: 'monitor',
+                abstract: true,
+                views: {
+                    privateContent: {
+                        templateUrl: 'modules/private/monitor/monitor.tpl.html',
+                        controller: 'MonitorController'
+                    }
+                }
+            });
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/map/MapController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/map/MapController.js b/traffic_portal/app/src/modules/private/monitor/map/MapController.js
new file mode 100644
index 0000000..8258d83
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/map/MapController.js
@@ -0,0 +1,101 @@
+/*
+ * 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 MapController = function(cacheGroups, cacheGroupHealth, $scope, locationUtils, NgMap) {
+
+	$scope.map = NgMap.getMap('cgMap');
+
+	$scope.cacheGroups = [];
+
+	$scope.cacheGroupTypes = [];
+
+	$scope.cgTitle = function(cg) {
+		return cg.name + ' (' + cg.type + ')';
+	};
+
+	$scope.parentCg = function(cg) {
+		return cg.parent ? cg.parent : 'None'
+	};
+
+	$scope.secondaryParentCg = function(cg) {
+		return cg.secondaryParent ? cg.secondaryParent : 'None'
+	};
+
+	$scope.icon = function(cg) {
+		var properties = {
+			path: 'M8 2.1c1.1 0 2.2 0.5 3 1.3 0.8 0.9 1.3 1.9 1.3 3.1s-0.5 2.5-1.3 3.3l-3 3.1-3-3.1c-0.8-0.8-1.3-2-1.3-3.3 0-1.2 0.4-2.2 1.3-3.1 0.8-0.8 1.9-1.3 3-1.3z',
+			fillOpacity: 0.8,
+			scale: 3,
+			strokeColor: 'white',
+			strokeWeight: 2
+		}
+		// color map markers by type UNLESS there are offline caches, then make red and bigger
+		if (parseInt(cg.offline) > 0) {
+			properties['fillColor'] = 'red';
+			properties['scale'] = 5;
+		} else {
+			properties['fillColor'] = colors[_.indexOf($scope.cacheGroupTypes, cg.type)];
+		}
+		return properties;
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	var massageCacheGroups = function() {
+		var cgHealthCacheGroups = cacheGroupHealth.cachegroups,
+			cgHealth;
+		var cgTypes = [];
+		_.each(cacheGroups, function(cg) {
+			cgTypes.push(cg.typeName);
+			cgHealth = _.find(cgHealthCacheGroups, function(cghcg){ return cghcg.name == cg.name });
+			$scope.cacheGroups.push(
+				{
+					id: cg.id,
+					name: cg.name,
+					parent: cg.parentCachegroupName,
+					secondaryParent: cg.secondaryParentCachegroupName,
+					pos: [ cg.latitude, cg.longitude ],
+					type: cg.typeName,
+					offline: cgHealth ? cgHealth.offline : '-',
+					online: cgHealth ? cgHealth.online : '-'
+				}
+			);
+		});
+		$scope.cacheGroupTypes = _.uniq(cgTypes);
+	};
+
+	var colors = [
+		'#3F51B5', // blue
+		'#00AAA0', // turquoise
+		'#FF7A5A', // orangish
+		'#FFB85F', // yellowish
+		'#462066', // purple
+		'#FCF4D9' // whitish
+	];
+
+	var init = function() {
+		massageCacheGroups();
+	};
+	init();
+
+
+};
+
+MapController.$inject = ['cacheGroups', 'cacheGroupHealth', '$scope', 'locationUtils', 'NgMap'];
+module.exports = MapController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/map/_map.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/map/_map.scss b/traffic_portal/app/src/modules/private/monitor/map/_map.scss
new file mode 100644
index 0000000..72d3f1b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/map/_map.scss
@@ -0,0 +1,21 @@
+/*
+
+
+ Licensed 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.
+
+*/
+ng-map {
+  position: absolute;
+  width:100%;
+  height:100%;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/map/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/map/index.js b/traffic_portal/app/src/modules/private/monitor/map/index.js
new file mode 100644
index 0000000..c4c736d
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/map/index.js
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.monitor.map', [])
+    .controller('MapController', require('./MapController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.monitor.map', {
+                url: '/map',
+                views: {
+                    monitorContent: {
+                        templateUrl: 'modules/private/monitor/map/map.tpl.html',
+                        controller: 'MapController',
+                        resolve: {
+                            cacheGroups: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroups();
+                            },
+                            cacheGroupHealth: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroupHealth();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/map/map.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/map/map.tpl.html b/traffic_portal/app/src/modules/private/monitor/map/map.tpl.html
new file mode 100644
index 0000000..6d16c9c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/map/map.tpl.html
@@ -0,0 +1,38 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div class="angular-google-map-container" map-lazy-load="https://maps.google.com/maps/api/js">
+    <ng-map id="cgMap" zoom="5" center="[37,-91]">
+        <marker ng-repeat="cg in ::cacheGroups"
+                position="{{::cg.pos}}"
+                on-click="map.showInfoWindow(event, cg.name)"
+                icon="{{::icon(cg)}}"></marker>
+        <info-window id="{{::cg.name}}" ng-repeat="cg in ::cacheGroups">
+            <div>
+                <h3><a ng-click="navigateToPath('/configure/cache-groups/' + cg.id)">{{::cgTitle(cg)}}</a></h3>
+                <hr>
+                <h5>Coordinates: {{::cg.pos}}</h5>
+                <h5>1st Parent: {{::parentCg(cg)}}</h5>
+                <h5>2nd Parent: {{::secondaryParentCg(cg)}}</h5>
+                <h5>Online Caches: {{::cg.online}}</h5>
+                <h5>Offline Caches: {{::cg.offline}}</h5>
+            </div>
+        </info-window>
+    </ng-map>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/monitor/monitor.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/monitor/monitor.tpl.html b/traffic_portal/app/src/modules/private/monitor/monitor.tpl.html
new file mode 100644
index 0000000..6b509ab
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/monitor/monitor.tpl.html
@@ -0,0 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div id="monitorContainer">
+    <div ui-view="monitorContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/private.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/private.tpl.html b/traffic_portal/app/src/modules/private/private.tpl.html
index 95afc8f..fe3c966 100644
--- a/traffic_portal/app/src/modules/private/private.tpl.html
+++ b/traffic_portal/app/src/modules/private/private.tpl.html
@@ -1,18 +1,20 @@
 <!--
+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
 
-Licensed 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.
-
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
 -->
 
 <div id="privateContainer">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/UserController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/UserController.js b/traffic_portal/app/src/modules/private/user/UserController.js
index 34ca4e5..01439f9 100644
--- a/traffic_portal/app/src/modules/private/user/UserController.js
+++ b/traffic_portal/app/src/modules/private/user/UserController.js
@@ -1,25 +1,26 @@
 /*
-
-
- Licensed 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.
-
+ * 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 UserController = function($scope, $state, $uibModal, $timeout, formUtils, deliveryServicesModel, userService, authService, userModel) {
+var UserController = function($scope, $state, $location, $uibModal, formUtils, locationUtils, userService, authService, roleService, tenantService, userModel) {
 
     var updateUser = function(user, options) {
-        user.token = null; // this will null out any token the user may have had
-        userService.updateCurrentUser(user)
+        userService.updateUser(user)
             .then(function() {
                 if (options.signout) {
                     authService.logout();
@@ -27,13 +28,25 @@ var UserController = function($scope, $state, $uibModal, $timeout, formUtils, de
             });
     };
 
-    $scope.deliveryServices = deliveryServicesModel.deliveryServices;
+    var getRoles = function() {
+        roleService.getRoles()
+            .then(function(result) {
+                $scope.roles = result;
+            });
+    };
 
-    $scope.showDS = function(dsId) {
-        $state.go('trafficPortal.private.deliveryService.view.overview.detail', { deliveryServiceId: dsId } );
+    var getTenants = function() {
+        tenantService.getTenants()
+            .then(function(result) {
+                $scope.tenants = result;
+            });
     };
 
-    $scope.confirmUpdate = function(user, usernameField) {
+    $scope.userName = angular.copy(userModel.user.username);
+
+    $scope.user = userModel.user;
+
+    $scope.confirmSave = function(user, usernameField) {
         if (usernameField.$dirty) {
             var params = {
                 title: 'Reauthentication Required',
@@ -52,28 +65,30 @@ var UserController = function($scope, $state, $uibModal, $timeout, formUtils, de
             modalInstance.result.then(function() {
                 updateUser(user, { signout : true });
             }, function () {
+                // do nothing
             });
         } else {
             updateUser(user, { signout : false });
         }
     };
 
+    $scope.viewDeliveryServices = function() {
+        $location.path('/admin/users/' + $scope.user.id + '/delivery-services');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
     $scope.hasError = formUtils.hasError;
 
     $scope.hasPropertyError = formUtils.hasPropertyError;
 
-    $scope.resetUser = function() {
-        $timeout(function() {
-            $scope.userData = angular.copy(userModel.user);
-        });
+    var init = function () {
+        getRoles();
+        getTenants();
     };
-    $scope.resetUser();
-
-    $scope.$on('userModel::userUpdated', function() {
-        $scope.resetUser();
-    });
+    init();
 
 };
 
-UserController.$inject = ['$scope', '$state', '$uibModal', '$timeout', 'formUtils', 'deliveryServicesModel', 'userService', 'authService', 'userModel'];
+UserController.$inject = ['$scope', '$state', '$location', '$uibModal', 'formUtils', 'locationUtils', 'userService', 'authService', 'roleService', 'tenantService', 'userModel'];
 module.exports = UserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/_user.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/_user.scss b/traffic_portal/app/src/modules/private/user/_user.scss
index ccc785b..279883d 100644
--- a/traffic_portal/app/src/modules/private/user/_user.scss
+++ b/traffic_portal/app/src/modules/private/user/_user.scss
@@ -14,14 +14,19 @@
  limitations under the License.
 
 */
+/*
+
+
+ Licensed 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
 
-.ds-status {
-  font-size: 11px;
-  color: #999;
-}
+ 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.
 
-.user-ds-list-group {
-  height: auto;
-  max-height: 830px;
-  overflow-y: auto;
-}
\ No newline at end of file
+*/

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/edit/UserEditController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/edit/UserEditController.js b/traffic_portal/app/src/modules/private/user/edit/UserEditController.js
index 4eb5cb8..b52613e 100644
--- a/traffic_portal/app/src/modules/private/user/edit/UserEditController.js
+++ b/traffic_portal/app/src/modules/private/user/edit/UserEditController.js
@@ -1,23 +1,28 @@
 /*
-
-
- Licensed 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.
-
+ * 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 UserEditController = function($scope) {
 
-    $scope.title = 'Edit User Profile';
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
 
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/edit/_user.edit.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/edit/_user.edit.scss b/traffic_portal/app/src/modules/private/user/edit/_user.edit.scss
deleted file mode 100644
index 0d2d003..0000000
--- a/traffic_portal/app/src/modules/private/user/edit/_user.edit.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-
-
- Licensed 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.
-
-*/
-
-.edit-user-btn {
-  float: right;
-  margin-left: 5px;
-  margin-top: 20px;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/edit/index.js b/traffic_portal/app/src/modules/private/user/edit/index.js
index 9015f48..9f16577 100644
--- a/traffic_portal/app/src/modules/private/user/edit/index.js
+++ b/traffic_portal/app/src/modules/private/user/edit/index.js
@@ -1,21 +1,23 @@
 /*
-
-
- Licensed 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.
-
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
-module.exports = angular.module('trafficPortal.user.edit', [])
+module.exports = angular.module('trafficPortal.private.user.edit', [])
     .controller('UserEditController', require('./UserEditController'))
     .config(function($stateProvider, $urlRouterProvider) {
         $stateProvider
@@ -23,7 +25,7 @@ module.exports = angular.module('trafficPortal.user.edit', [])
                 url: '',
                 views: {
                     userContent: {
-                        templateUrl: 'modules/private/user/edit/user.edit.tpl.html',
+                        templateUrl: 'common/modules/form/user/form.user.tpl.html',
                         controller: 'UserEditController'
                     }
                 }
@@ -31,3 +33,4 @@ module.exports = angular.module('trafficPortal.user.edit', [])
         ;
         $urlRouterProvider.otherwise('/');
     });
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/edit/user.edit.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/edit/user.edit.tpl.html b/traffic_portal/app/src/modules/private/user/edit/user.edit.tpl.html
deleted file mode 100644
index 1687963..0000000
--- a/traffic_portal/app/src/modules/private/user/edit/user.edit.tpl.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!--
-
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--->
-
-<div class="row">
-    <div class="col-sm-8 col-md-8">
-        <h3>{{title}}</h3>
-    </div>
-    <div class="col-sm-4 col-md-4">
-        <button type="button" class="edit-user-btn btn action-btn" ng-disabled="userForm.$pristine || userForm.$invalid" ng-click="confirmUpdate(userData, userForm.username)">Update</button>
-        <button type="button" class="edit-user-btn btn btn-link"  ng-click="resetUser()">Reset</button>
-    </div>
-</div>
-
-<hr>
-
-<form class="register-form col-sm-8 col-md-8" name="userForm" role="form" novalidate>
-
-    <fieldset>
-
-        <legend>User Details</legend>
-
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.fullName), 'has-feedback': hasError(userForm.fullName)}">
-                    <label class="control-label" for="fullName">Full Name
-                        <small ng-show="hasPropertyError(userForm.fullName, 'required')">[ Required ]</small>
-                        <small ng-show="hasPropertyError(userForm.fullName, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="fullName" name="fullName" type="text" class="form-control" ng-model="userData.fullName" ng-maxlength="256" autofocus required>
-                    <span ng-show="hasError(userForm.fullName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.company), 'has-feedback': hasError(userForm.company)}">
-                    <label class="control-label" for="company">Company (optional)
-                        <small ng-show="hasPropertyError(userForm.company, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="company" name="company" type="text" class="form-control" ng-model="userData.company" ng-maxlength="256">
-                    <span ng-show="hasError(userForm.company)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.email), 'has-feedback': hasError(userForm.email)}">
-                    <label class="control-label" for="email">Email
-                        <small ng-show="hasPropertyError(userForm.email, 'required')">[ Required ]</small>
-                        <small ng-show="hasPropertyError(userForm.email, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="email" name="email" type="email" class="form-control" ng-model="userData.email" ng-maxlength="128" required>
-                    <span ng-show="hasError(userForm.email)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.username), 'has-feedback': hasError(userForm.username)}">
-                    <label class="control-label" for="userName">Username
-                        <small ng-show="hasPropertyError(userForm.username, 'required')">[ Required ]</small>
-                        <small ng-show="hasPropertyError(userForm.username, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="username" name="username" type="text" class="form-control" ng-model="userData.username" ng-maxlength="128" required>
-                    <span ng-show="hasError(userForm.username)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.password), 'has-feedback': hasError(userForm.password)}">
-                    <label class="control-label" for="password">New Password <span ng-show="!registration && !reset">(optional)</span>
-                        <small ng-show="hasPropertyError(userForm.password, 'minlength')">[ Too Short ]</small>
-                    </label>
-                    <input id="password" name="password" type="password" class="form-control" ng-model="userData.localPasswd" ng-required="registration || reset" ng-minlength="6">
-                    <span ng-show="hasError(userForm.password)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.confirmPassword), 'has-feedback': hasError(userForm.confirmPassword)}">
-                    <label class="control-label" for="confirmPassword">Confirm New Password <span ng-show="!registration && !reset && !userData.localPasswd">(optional)</span>
-                        <small ng-show="hasPropertyError(userForm.confirmPassword, 'match')">[ Doesn't Match ]</small>
-                    </label>
-                    <input id="confirmPassword" name="confirmPassword" type="password" class="form-control" ng-model="userData.confirmLocalPasswd" match="userData.localPasswd">
-                    <span ng-show="hasError(userForm.confirmPassword)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.addressLine1), 'has-feedback': hasError(userForm.addressLine1)}">
-                    <label class="control-label" for="addressLine1">Address Line 1 (optional)
-                        <small ng-show="hasPropertyError(userForm.addressLine1, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="addressLine1" name="addressLine1" type="text" class="form-control" ng-model="userData.addressLine1" ng-maxlength="256">
-                    <span ng-show="hasError(userForm.addressLine1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.addressLine2), 'has-feedback': hasError(userForm.addressLine2)}">
-                    <label class="control-label" for="addressLine2">Address Line 2 (optional)
-                        <small ng-show="hasPropertyError(userForm.addressLine2, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="addressLine2" name="addressLine2" type="text" class="form-control" ng-model="userData.addressLine2" ng-maxlength="256">
-                    <span ng-show="hasError(userForm.addressLine2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.city), 'has-feedback': hasError(userForm.city)}">
-                    <label class="control-label" for="city">City (optional)
-                        <small ng-show="hasPropertyError(userForm.city, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="city" name="city" type="text" class="form-control" ng-model="userData.city" ng-maxlength="128">
-                    <span ng-show="hasError(userForm.city)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.stateOrProvince), 'has-feedback': hasError(userForm.stateOrProvince)}">
-                    <label class="control-label" for="stateOrProvince">State or Province (optional)
-                        <small ng-show="hasPropertyError(userForm.stateOrProvince, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="stateOrProvince" name="stateOrProvince" type="text" class="form-control" ng-model="userData.stateOrProvince" ng-maxlength="128">
-                    <span ng-show="hasError(userForm.stateOrProvince)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.postalCode), 'has-feedback': hasError(userForm.postalCode)}">
-                    <label class="control-label" for="postalCode">Postal Code (optional)
-                        <small ng-show="hasPropertyError(userForm.postalCode, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="postalCode" name="postalCode" type="text" class="form-control" ng-model="userData.postalCode" ng-maxlength="11">
-                    <span ng-show="hasError(userForm.postalCode)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.country), 'has-feedback': hasError(userForm.country)}">
-                    <label class="control-label" for="country">Country (optional)
-                        <small ng-show="hasPropertyError(userForm.country, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="country" name="country" type="text" class="form-control" ng-model="userData.country" ng-maxlength="256">
-                    <span ng-show="hasError(userForm.country)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group" ng-class="{'has-error': hasError(userForm.phoneNumber), 'has-feedback': hasError(userForm.phoneNumber)}">
-                    <label class="control-label" for="phoneNumber">Primary Phone (optional)
-                        <small ng-show="hasPropertyError(userForm.phoneNumber, 'maxlength')">[ Too Long ]</small>
-                    </label>
-                    <input id="phoneNumber" name="phoneNumber" type="text" class="form-control" ng-model="userData.phoneNumber" ng-maxlength="25">
-                    <span ng-show="hasError(userForm.phoneNumber)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-
-    </fieldset>
-
-</form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/index.js b/traffic_portal/app/src/modules/private/user/index.js
index 934212e..15840cc 100644
--- a/traffic_portal/app/src/modules/private/user/index.js
+++ b/traffic_portal/app/src/modules/private/user/index.js
@@ -1,21 +1,23 @@
 /*
-
-
- Licensed 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.
-
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
-module.exports = angular.module('trafficPortal.user', [])
+module.exports = angular.module('trafficPortal.private.user', [])
     .controller('UserController', require('./UserController'))
     .config(function($stateProvider, $urlRouterProvider) {
         $stateProvider

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/register/UserRegisterController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/register/UserRegisterController.js b/traffic_portal/app/src/modules/private/user/register/UserRegisterController.js
deleted file mode 100644
index b9e4aa5..0000000
--- a/traffic_portal/app/src/modules/private/user/register/UserRegisterController.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-
-
- Licensed 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 UserRegisterController = function($scope) {
-
-    $scope.title = 'Complete User Registration';
-
-    $scope.registration = true;
-
-};
-
-UserRegisterController.$inject = ['$scope'];
-module.exports = UserRegisterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/register/_user.register.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/register/_user.register.scss b/traffic_portal/app/src/modules/private/user/register/_user.register.scss
deleted file mode 100644
index fff23b4..0000000
--- a/traffic_portal/app/src/modules/private/user/register/_user.register.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
-
-
- Licensed 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.
-
-*/
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/register/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/register/index.js b/traffic_portal/app/src/modules/private/user/register/index.js
deleted file mode 100644
index 933a7ad..0000000
--- a/traffic_portal/app/src/modules/private/user/register/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
-module.exports = angular.module('trafficPortal.user.register', [])
-    .controller('UserRegisterController', require('./UserRegisterController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.user.register', {
-                url: '/register',
-                views: {
-                    userContent: {
-                        templateUrl: 'modules/private/user/edit/user.edit.tpl.html',
-                        controller: 'UserRegisterController'
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/reset/UserResetController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/reset/UserResetController.js b/traffic_portal/app/src/modules/private/user/reset/UserResetController.js
deleted file mode 100644
index 24f5e12..0000000
--- a/traffic_portal/app/src/modules/private/user/reset/UserResetController.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-
-
- Licensed 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 UserResetController = function($scope, $timeout, userModel) {
-
-    $scope.title = 'Reset User Password';
-
-    $scope.reset = true;
-
-    $scope.resetUser = function() {
-        $timeout(function() {
-            $scope.userData = angular.copy(userModel.user);
-        });
-    };
-    $scope.resetUser();
-
-    $scope.$on('userModel::userUpdated', function() {
-        $scope.resetUser();
-    });
-
-};
-
-UserResetController.$inject = ['$scope', '$timeout', 'userModel'];
-module.exports = UserResetController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/reset/_user.reset.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/reset/_user.reset.scss b/traffic_portal/app/src/modules/private/user/reset/_user.reset.scss
deleted file mode 100644
index fff23b4..0000000
--- a/traffic_portal/app/src/modules/private/user/reset/_user.reset.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
-
-
- Licensed 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.
-
-*/
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/reset/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/reset/index.js b/traffic_portal/app/src/modules/private/user/reset/index.js
deleted file mode 100644
index 3d4af61..0000000
--- a/traffic_portal/app/src/modules/private/user/reset/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
-module.exports = angular.module('trafficPortal.user.reset', [])
-    .controller('UserResetController', require('./UserResetController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.user.reset', {
-                url: '/reset',
-                views: {
-                    userContent: {
-                        templateUrl: 'modules/private/user/edit/user.edit.tpl.html',
-                        controller: 'UserResetController'
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/user/user.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/user/user.tpl.html b/traffic_portal/app/src/modules/private/user/user.tpl.html
index 5fe0c27..57c0cde 100644
--- a/traffic_portal/app/src/modules/private/user/user.tpl.html
+++ b/traffic_portal/app/src/modules/private/user/user.tpl.html
@@ -1,32 +1,22 @@
 <!--
+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
 
-Licensed 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.
-
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
 -->
 
 <div id="userContainer">
-    <div class="alert alert-warning" ng-show="userData.loaded && !userData.localUser">LDAP user profiles cannot be modified.</div>
     <div ui-view="userContent"></div>
-    <div class="ds-panel col-sm-4 col-md-4">
-        <fieldset>
-            <legend>Assigned Delivery Services ({{deliveryServices.length}})</legend>
-            <div class="list-group user-ds-list-group scrollable">
-                <a title="{{ds.displayName}} ({{ds.id}} | {{ds.xmlId}})" ng-repeat="ds in deliveryServices | orderBy:'displayName'" class="list-group-item" ng-click="showDS(ds.id)">{{ds.displayName}}</a>
-            </div>
-            <div class="alert alert-info" ng-show="deliveryServices.length == 0">
-                No delivery services assigned
-            </div>
-        </fieldset>
-    </div>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/about/AboutController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/about/AboutController.js b/traffic_portal/app/src/modules/public/about/AboutController.js
deleted file mode 100644
index 9fcddb1..0000000
--- a/traffic_portal/app/src/modules/public/about/AboutController.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-
-
- Licensed 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 AboutController = function($scope, $sce, $timeout, propertiesModel) {
-
-    var pinIframe = function() {
-        var headerHeight = $('#header').css("height"),
-            footerHeight = $('#footer').css("height");
-
-        $('#aboutFrameWrapper').css("top", headerHeight);
-        $('#aboutFrameWrapper').css("bottom", footerHeight);
-    };
-
-    $scope.properties = propertiesModel.properties;
-
-    $scope.trustSrc = function(src) {
-        return $sce.trustAsResourceUrl(src);
-    };
-
-    var init = function () {
-        $timeout(function () {
-            pinIframe();
-        }, 200);
-    };
-    init();
-
-};
-
-AboutController.$inject = ['$scope', '$sce', '$timeout', 'propertiesModel'];
-module.exports = AboutController;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/about/_about.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/about/_about.scss b/traffic_portal/app/src/modules/public/about/_about.scss
deleted file mode 100644
index c372d2f..0000000
--- a/traffic_portal/app/src/modules/public/about/_about.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-
-
- Licensed 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.
-
-*/
-
-#aboutFrameWrapper {
-  position:absolute;
-  // header and footer height are dynamic. see AboutController.js
-  left:0;
-  right:0;
-}
-
-#aboutFrame {
-  height:100%;
-  width:100%;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/about/about.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/about/about.tpl.html b/traffic_portal/app/src/modules/public/about/about.tpl.html
deleted file mode 100644
index 16d02b7..0000000
--- a/traffic_portal/app/src/modules/public/about/about.tpl.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--->
-
-<div id="aboutFrameWrapper">
-    <iframe id="aboutFrame" ng-src="{{trustSrc(properties.about.url)}}" frameborder="0"/>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/about/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/about/index.js b/traffic_portal/app/src/modules/public/about/index.js
deleted file mode 100644
index 3ce1f0d..0000000
--- a/traffic_portal/app/src/modules/public/about/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
-module.exports = angular.module('trafficPortal.public.about', [])
-    .controller('AboutController', require('./AboutController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.public.about', {
-                url: 'about',
-                views: {
-                    publicContent: {
-                        templateUrl: 'modules/public/about/about.tpl.html',
-                        controller: 'AboutController'
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });
\ No newline at end of file